Estoy escribiendo el código para un servidor SSH y no puedo pasar la parte de la Respuesta de intercambio de clave de Diffie-Hellman de Curva elíptica de Elliptic. El cliente también cierra la conexión y dice "La clave del host no coincide con la firma suministrada".
Estoy usando masilla como cliente y un microcontrolador PIC está ejecutando el código del servidor.
De RFC 5656 [Integración del algoritmo SSH ECC]:
"El hash H se forma al aplicar el algoritmo HASH en un concatenación de lo siguiente:
string V_C, client's identification string (CR and LF excluded)
string V_S, server's identification string (CR and LF excluded)
string I_C, payload of the client's SSH_MSG_KEXINIT
string I_S, payload of the server's SSH_MSG_KEXINIT
string K_S, server's public host key
string Q_C, client's ephemeral public key octet string
string Q_S, server's ephemeral public key octet string
mpint K, shared secret
"
el algoritmo de clave de host y el algoritmo de intercambio de claves son ecdsa-sha2-nistp256 y ecdh-sha2-nistp256 respectivamente.
refiriéndose a RFC 4251 para las representaciones de tipos de datos, así como al código fuente en openSHH (openBSD), esto es lo que he concatenado.
- 4 bytes para la longitud de V_C seguida de V_C
- 4 bytes para la longitud de V_S seguida de V_S
- 4 bytes para la longitud de I_C seguido de I_C (la carga útil es desde el código del mensaje hasta el inicio del relleno aleatorio)
- 4 bytes para la longitud de I_S seguido de I_S (la carga útil es desde el código del mensaje hasta el inicio del relleno aleatorio)
- 4 bytes para la longitud de K_S seguido de K_S (para K_S usé el mismo grupo de bytes que se usa para calcular la huella digital)
- 4 bytes para la longitud de Q_C seguida de Q_C (utilicé la cadena sin comprimir que tiene una longitud de 65 - 04 || Coordenada X || Coordenada Y)
- 4 bytes para la longitud de Q_S seguido de Q_S
- 4 bytes para la longitud de K seguido de K (la longitud es de 32 o 33, dependiendo de si el bit inicial está establecido o no. Si se establece, K está precedido por un 00 byte)
Una vez concatenado lo hago con SHA256 porque estoy usando NISTP256. SHA256 genera 32 bytes, que es el tamaño de la curva, así que tomo toda la salida de SHA256 y realizo el algoritmo de firma en ella.
Nunca puedo obtener la firma correcta de mi concatenación de mensajes.
Sé que mi algoritmo de firma es correcto porque dado el mensaje de hash del mensaje, puedo obtener la firma correcta. Sé que mi secreto compartido es correcto porque obtengo el mismo resultado que las calculadoras de secreto compartido en línea. Sé que el SHA256 es correcto porque obtengo el mismo resultado con las calculadoras en línea.
Esto me lleva a suponer que el error está en la concatenación del hash de intercambio.
Cualquier ayuda es muy apreciada, gracias.