ASN.1: ENUMERATED vs INTEGER

7

De las especificaciones X.509:

   CRLReason ::= ENUMERATED {
        unspecified             (0),
        keyCompromise           (1),
        cACompromise            (2),
        affiliationChanged      (3),
        superseded              (4),
        cessationOfOperation    (5),
        certificateHold         (6),
             -- value 7 is not used
        removeFromCRL           (8),
        privilegeWithdrawn      (9),
        aACompromise           (10) }

... y ...

Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

¿Por qué la versión no es un tipo ENUMERADO? Y de manera similar, ¿por qué no es CRLReason un INTEGER?

    
pregunta ansur 14.10.2012 - 16:25
fuente

2 respuestas

5

ENUMERATED y INTEGER son casi idénticos (solo usan etiquetas distintas). La idea genérica es que ENUMERATED es para una opción dentro de un conjunto limitado de valores posibles, mientras que INTEGER es para valores que podrían, al menos en teoría, aumentar indefinidamente.

Aquí, el uso de ENUMERATED para CRLReasons es una pista que dice que "no habrá otra razón en el futuro", mientras que puede haber otras versiones de protocolo (posiblemente muchos otros).

Ahora, eso es solo una declaración de intenciones, que no se aplicará de ninguna manera. Recuerde que la justificación de la mayor parte de ASN.1 es: "parecía una buena idea en ese momento". No trates de leer demasiado en él. Después de todo, ASN.1 logró definir, hasta bien entrado el decenio de 1980, un formato para fechas que tiene solo dos dígitos para el año: un deslumbrante Tema Y2K , que no impidió que el comité de estandarización ... así que solo acepte la dualidad ENUMERATED / INTEGER como una de las numerosas peculiaridades de ASN.1 (no es lo peor).

    
respondido por el Thomas Pornin 14.10.2012 - 17:48
fuente
5

ENUMERATED e INTEGER sirven para diferentes propósitos. ENUMERATED es para crear una lista de elementos con nombre, mientras que INTEGER es para llevar números. El hecho de que la notación de tipo parezca algo similar no los hace idénticos. Para ENUMERATED, los únicos valores permitidos son aquellos nombrados en la lista. Para INTEGER, la lista nombrada es solo un conjunto de etiquetas útiles para números específicos, y no limita los valores permitidos para el tipo INTEGER.

Solo puedo asumir que CRLReason se ENUMERÓ porque hay un conjunto cerrado de valores mientras que la Versión se convirtió en un INTEGER para dejar abierto el número de futuras versiones.

No dude en probar algunas de estas especificaciones en enlace , que es un compilador y codificador / decodificador ASN.1 en línea que admite no solo BER y DER, sino también PER, XER y CER. Podrá ver que las diferencias entre ENUMERATED e INTEGER parecen más significativas para otras reglas de codificación (como PER y XER) que para BER y DER.

    
respondido por el Paul Thorpe 17.10.2012 - 20:11
fuente

Lea otras preguntas en las etiquetas