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).