Ottieni r e s da ECDSA Signature come due numeri interi concatenati (OpenSSL) [closed]

0

EVP_DigestSignFinal () mi dà una firma codificata DER.

Alcuni esempi:

ECDSA-SHA-256

30 44 02 20 [..r..] 02 20 [..s..]
30 46 02 21 [..r..] 02 21 [..s..]
30 45 02 20 [..r..] 02 21 [..s..]

ECDSA-SHA-224

30 3d 02 1c [..r..] 02 1d [..s..]
30 3c 02 1c [..r..] 02 1c [..s..]

Le dimensioni possono variare e voglio concatenarle. Qual è un buon modo per sapere quanti byte la firma sarà lunga? O esiste una funzione in OpenSSL che è già implementata forse?

    
posta tzippy 11.07.2017 - 14:04
fonte

1 risposta

1

La firma ECDSA è codificata come una ASN.1 struttura, che è un SEQUENCE di due INTEGER valori. Quando codificato, il primo byte sarà di 0x30 (che significa SEQUENCE ), seguito dalla lunghezza, codificato su uno o due byte: se la lunghezza è n byte, sarà codificata come un singolo byte di valore n se n ≤ 127, o due byte di valore 0x81 poi n , se 128 ≤ n ≤ 255 (quest'ultimo caso può verificarsi nel caso in cui si utilizzi una curva "grande" come P-521). Questi n byte sono la concatenazione dei due valori INTEGER , ognuno con il proprio tag (un byte di valore 0x02 ), quindi la sua lunghezza (stessa codifica, in pratica, su un singolo byte , dal momento che richiederebbe più di una curva a 1000 bit per avere più di una), quindi il valore INTEGER . Il valore di un INTEGER usa il big-end firmato (quindi potresti avere un byte di valore iniziale 0x00 ).

La corretta codifica e decodifica delle strutture ASN.1 è un'arte difficile. Non so se OpenSSL abbia una funzione pubblica per questo. Questa funzione , da un'altra libreria SSL , converte da ASN.1 a firme ECDSA "raw" ("raw" significa: i due valori interi sono semplicemente codificato in big-endian e concatenato, entrambi regolati per avere la stessa lunghezza di codifica).

    
risposta data 11.07.2017 - 16:45
fonte

Leggi altre domande sui tag