È nel codice sorgente di openssh come descritto nella RFC e possiamo semplicemente rintracciare la sua fonte da lì:
/* K1 = HASH(K || H || "A" || session_id) */
if ((hashctx = ssh_digest_start(kex->hash_alg)) == NULL ||
ssh_digest_update_buffer(hashctx, shared_secret) != 0 ||
ssh_digest_update(hashctx, hash, hashlen) != 0 ||
ssh_digest_update(hashctx, &c, 1) != 0 ||
ssh_digest_update(hashctx, kex->session_id,
kex->session_id_len) != 0 ||
ssh_digest_final(hashctx, digest, mdsz) != 0) {
[...]
Da RFC:
The exchange hash H from the first key exchange is additionally used as the session identifier, which is a unique identifier for this connection.
Ciò significa che session_id
è uguale a hash
( H
) per il primo scambio di chiavi. Se c'è un altro scambio di chiavi in seguito, è sempre l'hash dal primo scambio di chiavi.
Verifica anche codice di DH :
/* calc and verify H */
hashlen = sizeof(hash);
if ((r = kex_dh_hash(
[...]
if (kex->session_id == NULL) {
[...]
memcpy(kex->session_id, hash, kex->session_id_len);
}
if ((r = kex_derive_keys_bn(ssh, hash, hashlen, shared_secret)) == 0)
[...]
conferma questa idea. Per prima cosa calcoliamo H
, quindi aggiorniamo session_id
(se non è già impostato) e quindi ricaviamo le chiavi (codice sopra).