Obtener r y s de ECDSA Signature como dos enteros concatenados (OpenSSL) [cerrado]

0

EVP_DigestSignFinal () me da una firma codificada en DER.

Algunos ejemplos:

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

El tamaño puede variar y quiero concatenarlos. ¿Cuál es una buena manera de saber cuántos bytes será larga la firma? ¿O hay una función en OpenSSL que ya está implementada tal vez?

    
pregunta tzippy 11.07.2017 - 14:04
fuente

1 respuesta

1

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

    
respondido por el Thomas Pornin 11.07.2017 - 16:45
fuente

Lea otras preguntas en las etiquetas