digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__ssh_public_key {
label="SshPublicKey";
graph[style=dotted];
ssh_public_key__seq [label=<
pos | size | type | id |
0 | ... | Cstring | key_name |
... | ... | switch (key_name.value) | body |
>];
ssh_public_key__seq_body_switch [label=<
case | type |
"ssh-rsa" | KeyRsa |
"ecdsa-sha2-nistp256" | KeyEcdsa |
"ssh-ed25519" | KeyEd25519 |
"ssh-dss" | KeyDsa |
>];
subgraph cluster__key_rsa {
label="SshPublicKey::KeyRsa";
graph[style=dotted];
key_rsa__seq [label=<
pos | size | type | id |
0 | ... | Bignum2 | rsa_e |
... | ... | Bignum2 | rsa_n |
>];
key_rsa__inst__key_length [label=<
id | value |
key_length | rsa_n.length_in_bits |
>];
}
subgraph cluster__key_ed25519 {
label="SshPublicKey::KeyEd25519";
graph[style=dotted];
key_ed25519__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len_pk |
4 | len_pk | | pk |
>];
}
subgraph cluster__key_ecdsa {
label="SshPublicKey::KeyEcdsa";
graph[style=dotted];
key_ecdsa__seq [label=<
pos | size | type | id |
0 | ... | Cstring | curve_name |
... | ... | EllipticCurve | ec |
>];
}
subgraph cluster__cstring {
label="SshPublicKey::Cstring";
graph[style=dotted];
cstring__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len |
4 | len | str(ASCII) | value |
>];
}
subgraph cluster__key_dsa {
label="SshPublicKey::KeyDsa";
graph[style=dotted];
key_dsa__seq [label=<
pos | size | type | id |
0 | ... | Bignum2 | dsa_p |
... | ... | Bignum2 | dsa_q |
... | ... | Bignum2 | dsa_g |
... | ... | Bignum2 | dsa_pub_key |
>];
}
subgraph cluster__elliptic_curve {
label="SshPublicKey::EllipticCurve";
graph[style=dotted];
elliptic_curve__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len |
4 | len | | body |
>];
}
subgraph cluster__bignum2 {
label="SshPublicKey::Bignum2";
graph[style=dotted];
bignum2__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len |
4 | len | | body |
>];
bignum2__inst__length_in_bits [label=<
id | value |
length_in_bits | ((len - 1) * 8) |
>];
}
}
ssh_public_key__seq:key_name_type -> cstring__seq [style=bold];
ssh_public_key__seq:body_type -> ssh_public_key__seq_body_switch [style=bold];
ssh_public_key__seq_body_switch:case0 -> key_rsa__seq [style=bold];
ssh_public_key__seq_body_switch:case1 -> key_ecdsa__seq [style=bold];
ssh_public_key__seq_body_switch:case2 -> key_ed25519__seq [style=bold];
ssh_public_key__seq_body_switch:case3 -> key_dsa__seq [style=bold];
cstring__seq:value_type -> ssh_public_key__seq:body_type [color="#404040"];
key_rsa__seq:rsa_e_type -> bignum2__seq [style=bold];
key_rsa__seq:rsa_n_type -> bignum2__seq [style=bold];
bignum2__inst__length_in_bits:length_in_bits_type -> key_rsa__inst__key_length [color="#404040"];
key_ed25519__seq:len_pk_type -> key_ed25519__seq:pk_size [color="#404040"];
key_ecdsa__seq:curve_name_type -> cstring__seq [style=bold];
key_ecdsa__seq:ec_type -> elliptic_curve__seq [style=bold];
cstring__seq:len_type -> cstring__seq:value_size [color="#404040"];
key_dsa__seq:dsa_p_type -> bignum2__seq [style=bold];
key_dsa__seq:dsa_q_type -> bignum2__seq [style=bold];
key_dsa__seq:dsa_g_type -> bignum2__seq [style=bold];
key_dsa__seq:dsa_pub_key_type -> bignum2__seq [style=bold];
elliptic_curve__seq:len_type -> elliptic_curve__seq:body_size [color="#404040"];
bignum2__seq:len_type -> bignum2__seq:body_size [color="#404040"];
bignum2__seq:len_type -> bignum2__inst__length_in_bits [color="#404040"];
}