¿El valor de la firma ECDSA (de una respuesta OCSP) necesita estar codificado en DER

2

En las respuestas OCSP de un cierto eIDAS PKI I de vez en cuando, obtengo valores de firma que, cuando se descomprimen de su BIT STRING, contienen una firma ECDSA cuyos componentes INTEGER tienen un byte inicial de 00 bytes innecesario y, por lo tanto, no están codificados DER , por ejemplo,

 376   10: . . . . . SEQUENCE {
 378    8: . . . . . . OBJECT IDENTIFIER ecdsaWithSHA256 (1 2 840 10045 4 3 2)
         : . . . . . . . (ANSI X9.62 ECDSA algorithm with SHA256)
         : . . . . . . }
 388   71: . . . . . BIT STRING, encapsulates {
 391   68: . . . . . . SEQUENCE {
 393   32: . . . . . . . INTEGER    
         : . . . . . . . . 6D 7F 95 D5 8E 9B E1 18    m.......
         : . . . . . . . . 60 DC A6 D6 91 37 0D B4    '....7..
         : . . . . . . . . AF D5 C9 A0 E8 21 40 4A    .....!@J
         : . . . . . . . . 94 8B 9F AA 6C DC F2 8C                            
 427   32: . . . . . . . INTEGER    
         : . . . . . . . . 00 1B FD 92 CB 1E E2 A8    ........
         : . . . . . . . . 2B 18 FC 37 ED 42 D0 66    +..7.B.f
         : . . . . . . . . E6 52 63 88 47 88 EE 00    .Rc.G...
         : . . . . . . . . FF 37 CF 20 8F F8 3C C1                            
         : . . . . . . . . Error: Integer has non-DER encoding.
         : . . . . . . . }
         : . . . . . . }

Aquí, la utilidad de volcado ASN.1 afirma que esta codificación no DER es un error, y también lo hace la versión actual de BouncyCastle (se ha introducido una comprobación de codificación DER en octubre de 2016, desafortunadamente sin ningún problema ni norma) Referencia en el comentario).

Me gustaría saber si BouncyCastle es demasiado estricto o si el respondedor de OCSP realmente crea respuestas no válidas. Desafortunadamente, todavía no he encontrado ninguna norma (relevante para las PKI de eIDAS) que indique claramente qué codificación se puede usar allí.

RFC 6960 en OCSP dice

  

El valor para la respuesta DEBE ser la codificación DER de   BasicOCSPResponse.

BasicOCSPResponse       ::= SEQUENCE {
   tbsResponseData      ResponseData,
   signatureAlgorithm   AlgorithmIdentifier,
   signature            BIT STRING,
   certs            [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }

pero esto solo requiere que BIT STRING signature esté codificado en DER, no todos los datos encapsulados en él.

TR-03111 (Guía técnica sobre criptografía de curva elíptica de la Oficina Federal Alemana para la Seguridad de la Información) dice

  

En el formato X9.62, la firma ECDSA (r; s) se codifica como estructura ASN.1 con lo siguiente   sintaxis:

ECDSA-Sig-Value ::= SEQUENCE {
  r INTEGER,
  s INTEGER
}
     

Para incrustar la firma en una BIT STRING el DER codificado ECDSA-Sig-Value DEBE ser el   valor de la cadena de bits (incluida la etiqueta y el campo de longitud).

pero un requisito de la Oficina Federal Alemana para la Seguridad de la Información difícilmente es normativo para las PKI de eIDAS en general.

En X9.62 solo encuentro

  

Si bien es probable que estos   Las definiciones de ASN.1 se codificarán utilizando las Reglas de codificación distinguida ( DER ), otras reglas de codificación también pueden   ser utilizado.

    
pregunta mkl 16.02.2018 - 11:52
fuente

1 respuesta

1

De acuerdo con ISO / IEC 8825-1: 2003, los enteros codificados BER / DER deben ser:

  

8.3.2 Si los octetos de contenido de una codificación de valor entero consisten en más de un octeto, entonces los bits del primer octeto y el bit 8 de   segundo octeto: a) no todos serán unos; y b) no serán todos cero.   NOTA - Estas reglas aseguran que un valor entero siempre esté codificado en   el menor número posible de octetos.

aparentemente, dumpasn1 comprueba exactamente esto:

    if( i == 0 )
        {
        if( ( value == 0x00 ) && ( ( ch & 0x80 ) == 0x00 ) )
            warnNonDER = TRUE;
        if( ( value == 0xFF ) && ( ( ch & 0x80 ) == 0x80 ) )
            warnNonDER = TRUE;
        if( warnNonDER )
            {
            intBuffer[ 0 ] = ( int ) value;
            intBuffer[ 1 ] = ch;
            }
        }

Consulte: enlace

Entonces, como la codificación dice que es BER / DER codificado INTEGER, debería ser.

    
respondido por el apf7188 16.02.2018 - 14:04
fuente

Lea otras preguntas en las etiquetas