calcolo dell'hash di scambio per ecdsa-sha2-nistp256

2

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.

  1. 4 byte per la lunghezza di V_C seguita da V_C
  2. 4 byte per la lunghezza di V_S seguita da V_S
  3. 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. 4 byte per la lunghezza di I_S seguita da I_S (il carico utile proviene dal codice messaggio all'inizio del riempimento casuale)
  5. 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)
  6. 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)
  7. 4 byte per la lunghezza di Q_S seguita da Q_S
  8. 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.

    
posta Networker25 16.04.2018 - 21:55
fonte

0 risposte

Leggi altre domande sui tag