Sto scrivendo il codice per un server SSH e non riesco a superare la parte della connessione di scambio chiave Elliptic Curve Diffie-Hellman. Il client chiude anche la connessione e dice "Chiave host non corrisponde alla firma fornita".
Sto usando stucco come client e un microcontroller PIC sta eseguendo il codice del server.
Da RFC 5656 [SSH ECC Algorithm Integration]:
"L'hash H è formato applicando l'algoritmo HASH su a concatenazione di quanto segue:
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
"
l'algoritmo della chiave host e l'algoritmo di scambio delle chiavi sono rispettivamente ecdsa-sha2-nistp256 e ecdh-sha2-nistp256.
riferito a RFC 4251 per le rappresentazioni del tipo di dati, così come il codice sorgente in openSHH (openBSD) questo è ciò che ho concatenato.
- 4 byte per la lunghezza di V_C seguita da V_C
- 4 byte per la lunghezza di V_S seguita da V_S
- 4 byte per la lunghezza di I_C seguita da I_C (il carico utile proviene dal codice messaggio all'inizio del riempimento casuale)
- 4 byte per la lunghezza di I_S seguita da I_S (il carico utile proviene dal codice messaggio all'inizio del riempimento casuale)
- 4 byte per la lunghezza di K_S seguita da K_S (per K_S ho usato lo stesso gruppo di byte che viene utilizzato per calcolare l'impronta digitale)
- 4 byte per la lunghezza di Q_C seguita da Q_C (ho usato la stringa non compressa che ha la lunghezza di 65 - 04 || Coordinata X || Coordinata Y)
- 4 byte per la lunghezza di Q_S seguita da Q_S
- 4 byte per la lunghezza di K seguita da K (la lunghezza è 32 o 33 a seconda che il bit iniziale sia impostato o meno. Se è impostato allora K è preceduto da un byte 00)
Una volta concatenato, lo faccio con SHA256 perché sto usando NISTP256. SHA256 emette 32 byte che è la dimensione della curva, quindi prendo l'intero output SHA256 ed eseguo l'algoritmo della firma su di esso.
Non riesco mai a ottenere la firma corretta dalla concatenazione del mio messaggio.
So che il mio algoritmo di firma è corretto perché dato l'output di hash del messaggio, posso ottenere la firma corretta. So che il mio segreto condiviso è corretto perché ottengo lo stesso risultato dei calcolatori segreti condivisi online. So che lo SHA256 è corretto perché ottengo lo stesso risultato usando le calcolatrici online.
Questo mi porta ad assumere che l'errore sia nella concatenazione dell'hash di scambio.
Qualsiasi aiuto è molto apprezzato, grazie.