La firma ECDSA está codificada como una estructura ASN.1 , que es un SEQUENCE
de dos INTEGER
valores. Cuando esté codificado, el primer byte será 0x30
(que significa SEQUENCE
), seguido de la longitud, codificada sobre uno o dos bytes: si la longitud es n bytes, entonces se codificará como un solo byte de valor n si n ≤ 127, o dos bytes de valor 0x81
entonces n , si 128 ≤ n ≤ 255 (este último caso puede ocurrir en caso de que utilice una curva "grande" como la P-521). Estos bytes n son la concatenación de los dos valores de INTEGER
, cada uno con su propia etiqueta (un byte de valor 0x02
), luego su longitud (la misma codificación; en la práctica, sobre un solo byte , ya que tomaría una curva de 1000 bits o más para necesitar más de uno), entonces el valor INTEGER
. El valor de INTEGER
usa big-endian firmado (por lo que puede tener un byte inicial de valor 0x00
).
Codificar y decodificar adecuadamente las estructuras ASN.1 es una técnica difícil. No sé si OpenSSL tiene una función pública para eso. , de otra biblioteca SSL , convierte de ASN.1 a firmas ECDSA "sin procesar" ("raw" significa: los dos valores enteros son simplemente codificado en big-endian y concatenado, ambos ajustados para tener la misma longitud de codificación).