Está en el código fuente de openssh como se describe en la RFC y simplemente podemos rastrear su fuente desde allí:
/* 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) {
[...]
Desde el RFC:
El hash de intercambio H del primer intercambio de claves se usa adicionalmente como identificador de sesión, que es un identificador único para esta conexión.
Esto significa que el session_id
es igual a hash
( H
) para el primer intercambio de claves. Si hay otro intercambio de claves más adelante, siempre será el hash del primer intercambio de claves.
Verificación también del código de 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)
[...]
confirma esta idea. Primero calculamos H
, luego actualizamos session_id
(si no está configurado) y luego obtenemos las claves (código de arriba).