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