Puncte:1

Cum se utilizează vectorii de testare ECDSA?

drapel gs

Aș dori să-mi verific sistemul rulând vectori de testare ECDSA NIST, dar nu primesc rezultatul așteptat. Sunt capabil să calculez semnătura, dar nu este corect sau cel puțin componentele "r" și "s" conțin valori diferite decât în ​​vectorii nist. Ce fac eu gresit?

Vectori de testare: NIST: FIPS 186-4 ECDSA - 186-3ecdsasiggencomponenttestvectors.zip

#include <mbedtls/ecdsa.h>
#include <mbedtls/ecp.h>
#include <mbedtls/bignum.h>
#include <mbedtls/entropy.h>
#include <mbedtls/ctr_drbg.h>

//Toate verificările de eroare au fost eliminate

//Primul dintre [P-256,SHA-256]-vectori
uint8_t ecc_d_p256[] = "\x51\x9b\x42...";
uint8_t ecc_hash_p256[] = „\x44\xac\xf6...”:

const char *pers = "test";
mbedtls_mpi r, s, d;
mbedtls_ecp_group grp;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context mbedtls_entropy;

//Init
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
mbedtls_mpi_init(&d);
mbedtls_ecp_group_init(&grp);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_init(&mbedtls_entropy);

//Setarea valorilor
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &mbedtls_entropy, pers, 4);
mbedtls_mpi_read_binary(&d, ecc_d_p256, (sizeof(ecc_d_p256)-1));
mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1); 

//Semn
mbedtls_ecdsa_sign_det_ext(&grp, &r, &s, &d,
                           ecc_hash_p256, sizeof(ecc_hash_p256)-1,
                           MBEDTLS_MD_SHA256,
                           mbedtls_ctr_drbg_random,
                           &ot_mbedtls_ctr_drbg);

//Ieșire
//"r" și "s" conține ieșiri de 32 de octeți, dar nu cele "corecte".
Maarten Bodewes avatar
drapel in
Dacă testați implementarea internă, atunci fără îndoială ați putea să o testați furnizând valorile randomizate ca intrare. Dacă nu puteți face asta din API, atunci aș spune că nu îl puteți testa cu adevărat direct împotriva vectorilor de testare, din păcate.
kelalaka avatar
drapel in
Gilles are dreptate, utilizați ECDSA determinist, există vectori de testare în [RFC 6979 appendix-A.2](https://datatracker.ietf.org/doc/html/rfc6979#appendix-A.2)
Kris Kwiatkowski avatar
drapel fr
Vectorii de testare de la FIPS CAVP nu acceptă modul determinist ECDSA. ECDSA deterministă este acum susținută de vectorii de testare furnizați de ACVP NIST. Standardizarea modului determinist este în curs de elaborare în FIPS 186-5 (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5-draft.pdf, vezi 6.3.2). Ar trebui să vă conectați implementarea la serverul ACVP pentru a o testa. Descrierea detaliată a structurii vectorului de testare poate fi găsită aici: https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html
Kris Kwiatkowski avatar
drapel fr
O modalitate de a obține acești vectori de la ACVP este să utilizați acvproxy https://github.com/smuellerDD/acvproxy
Puncte:2
drapel cn

Există două variante de ECDSA: randomizat sau determinist. Calculul unei semnături implică un număr $k$ care nu trebuie repetat niciodată pentru mesaje distincte cu aceeași cheie. Există două moduri de a implementa asta: generarea $k$ aleatoriu, sau generatoare $k$ într-un mod determinist din cheie şi mesaj. (Omit detalii aici, concentrându-mă doar pe ceea ce este relevant pentru această întrebare.) Cele două variante produc semnături compatibile: este imposibil de spus care variantă a fost folosită pentru a produce o semnătură dată. (Desigur, vă puteți da seama solicitând unei implementări să semneze același mesaj de două ori și comparând rezultatele.)

Definiția originală a ECDSA a luat în considerare doar varianta randomizată, iar aceasta este singura pe care NIST o permite, începând cu FIPS 186-4 (vezi §6.3 şi §6.4). RFC 6979 este o specificație pentru varianta deterministă.

Vectorii de testare NIST au fost generați utilizând ECDSA randomizat. O consecință a utilizării unui algoritm randomizat este că nu puteți avea teste cu răspunsuri cunoscute pentru acesta. De fiecare dată când executați un calcul de semnătură, obțineți un rezultat diferit. Tot ce puteți face pentru testare este să testați dacă rezultatul calculului semnăturii este o semnătură validă, nu că este o anumită secvență de octeți.

mbedtls_ecdsa_sign_det_ext implementează ECDSA deterministă. Puteți utiliza teste cu răspuns cunoscut pentru ECDSA determinist. Dar NIST nu oferă vectori de testare pentru acesta, deoarece NIST nu standardizează ECDSA deterministă.

Dacă întindeți puțin acest lucru, ați putea spune că este posibil să aveți teste cu răspuns cunoscut dacă specificați complet modul în care algoritmul consumă rezultatul generatorului aleator. Dar apoi, ca problemă teoretică, acum testați un algoritm determinist care preia o anumită intrare care, în lumea reală, se presupune că provine de la un generator aleatoriu. Și ca aspect practic, într-o implementare reală, nu este întotdeauna posibil să schimbați generatorul aleatoriu pentru testare. Și, în orice caz, FIPS 184-4 permite o anumită variație în modul în care este consumată ieșirea generatorului aleator la generare $k$ pentru o semnătură ECDSA.

kelalaka avatar
drapel in
Bună captură despre det. Vreau să adaug că NIST oferă valori $k$, astfel încât să se poată înlocui $k$ aleatorii cu $k$ date, astfel încât să vadă că algoritmul lor funcționează, apoi înlocuiți acest cod cu $k$ generați aleatoriu. De asemenea, în RFC 6979, Thomas Pornin oferă și vectori de testare.
KaljaTolkki avatar
drapel gs
Vă mulțumesc pentru un răspuns grozav @Gilles „Așa că nu mai fiți rău”! De asemenea, aș dori să le mulțumesc tuturor celorlalți din acest thread pentru ajutor! Nu implementez algoritmul și nici nu știu dacă aș putea oferi valoarea „k” fără modificări de implementare. Pentru mine sunt suficienți vectorii de testare RFC 6979. Mi-am putut verifica conducta!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.