codifica di NULL facoltativo in DER

4

In PKCS1 c'è DigestInfo:

  DigestInfo ::= SEQUENCE {
      digestAlgorithm AlgorithmIdentifier,
      digest OCTET STRING
  }

AlgorithmIdentifier è definito in RFC5280 :

   AlgorithmIdentifier  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER,
        parameters              ANY DEFINED BY algorithm OPTIONAL  }

PKCS1 fornisce codifiche DER di DigestInfo per vari algoritmi di hashing su pagina 43 :

   1. For the six hash functions mentioned in Appendix B.1, the DER
      encoding T of the DigestInfo value is equal to the following:

      MD2:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04
                   10 || H.
      MD5:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04
                   10 || H.
      SHA-1:   (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H.
      SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00
                   04 20 || H.
      SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00
                   04 30 || H.
      SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00
                      04 40 || H.

Se creo fare asn1parse su una di quelle codifiche DER (sha512) ottengo il seguente:

    0:d=0  hl=2 l=  81 cons: SEQUENCE
    2:d=1  hl=2 l=  13 cons:  SEQUENCE
    4:d=2  hl=2 l=   9 prim:   OBJECT            :sha512
   15:d=2  hl=2 l=   0 prim:   NULL
   17:d=1  hl=2 l=  64 prim:  OCTET STRING

l'algoritmo è indicato da OBJECT ei parametri sono indicati da NULL. La mia domanda è ...

Se i parametri sono opzionali, perché NULL è presente? Perché le stringhe fornite in PKCS1 corrispondono alla codifica DER precedente invece di, diciamo, questa (senza il NULL)?:

    0:d=0  hl=2 l=  79 cons: SEQUENCE
    2:d=1  hl=2 l=  11 cons:  SEQUENCE
    4:d=2  hl=2 l=   9 prim:   OBJECT            :sha512
   15:d=1  hl=2 l=  64 prim:  OCTET STRING
    
posta neubert 12.01.2016 - 05:32
fonte

1 risposta

2

Le informazioni nelle due RFC citate sembrano leggermente contraddittorie riguardo all'algoritmo NULL dopo.

La definizione generale della struttura afferma che l'attributo dei parametri è facoltativo, tuttavia nell'appendice relativa all'algoritmo rsaEncryption in particolare c'è questo:

-- When rsaEncryption is used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.

E algoritmi di hashing altrettanto specifici:

-- When the following OIDs are used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.
--
md2WithRSAEncryption       OBJECT IDENTIFIER ::= { pkcs-1 2 }
md5WithRSAEncryption       OBJECT IDENTIFIER ::= { pkcs-1 4 }
sha1WithRSAEncryption      OBJECT IDENTIFIER ::= { pkcs-1 5 }
sha256WithRSAEncryption    OBJECT IDENTIFIER ::= { pkcs-1 11 }
sha384WithRSAEncryption    OBJECT IDENTIFIER ::= { pkcs-1 12 }
sha512WithRSAEncryption    OBJECT IDENTIFIER ::= { pkcs-1 13 }

Sembra un po 'sciocco definire un campo come facoltativo, ma in seguito imporre la sua presenza e il suo valore. Forse ci sono altri algoritmi in cui il campo può essere omesso, ma questi algoritmi lo richiedono specificamente?

Lo standard sembra confondersi nella sezione EMSA-PKCS1-v1_5 dove parla di parametri opzionali con alcuni algoritmi:

-- When id-md2 and id-md5 are used in an AlgorithmIdentifier the
-- parameters MUST be present and MUST be NULL.

-- When id-sha1, id-sha256, id-sha384 and id-sha512 are used in an
-- AlgorithmIdentifier the parameters (which are optional) SHOULD
-- be omitted. However, an implementation MUST also accept
-- AlgorithmIdentifier values where the parameters are NULL.

Ma l'esempio che segue immediatamente questo testo include il null:

sha1    HashAlgorithm ::= {
    algorithm   id-sha1,
    parameters  SHA1Parameters : NULL  -- included for compatibility
                                       -- with existing implementations
}

Tutti gli esempi ASN.1 che ho visto nella documentazione sembrano includere il null opzionale obbligatorio. Basato sul comportamento di openssl (creazione) e Mozilla PKIX (convalida: link ) il null dopo -algoritmo sembra essere l'interpretazione generalmente accettata della documentazione, anche se la sua presenza richiesta potrebbe essere argomentata in base alla definizione della struttura originale e il valore null non sembra aggiungere valore.

Aggiornamento: mi sono imbattuto in un post sulla mailing list OpenSSL link che in realtà discute di questo stesso problema, e la logica di interpretazione sembra riassumersi (con un po 'di storia) come segue:

... declaring that in this particular case (optional parameters of
AlgorithmIdentifier) NULL is equivalent to (the same as) absent. In fact,
RFC 5754 (page 4) states that the correct encoding is omitting the empty
list altogether, but some uses defined their encoding as NULL, and it’s OK. 
It reveals some history of this duality:

The two alternatives arise from the loss of the OPTIONAL associated with the
algorithm identifier parameters when the 1988 syntax for
AlgorithmIdentifier was translated into the 1997 syntax.  Later, the
OPTIONAL was recovered via a defect report, but by then many people
thought that algorithm parameters were mandatory.  Because of this
history, some implementations encode parameters as a NULL element
while others omit them entirely.
    
risposta data 12.01.2016 - 21:10
fonte

Leggi altre domande sui tag