ASN.1: ENUMERATED vs INTEGER

8

Dalle specifiche 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) }

... e ...

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

Perché la versione non è un tipo ENUMERATED? E allo stesso modo, perché CRLReason non è un INTEGER?

    
posta ansur 14.10.2012 - 16:25
fonte

2 risposte

5

ENUMERATED e INTEGER sono quasi identici (usano solo tag distinti). L'idea generica è che ENUMERATED sia per una scelta all'interno di un insieme limitato di valori possibili, mentre INTEGER è per valori che potrebbero, almeno teoricamente, aumentare indefinitamente.

Qui, l'uso di ENUMERATED per CRLReasons è un suggerimento che dice che "non ci saranno altre ragioni in futuro", mentre potrebbero esserci altre versioni di protocollo (possibilmente molti altri).

Questa è solo una dichiarazione di intenti, che non verrà applicata in alcun modo. Ricorda che la giustificazione della maggior parte di ASN.1 è: "sembrava una buona idea in quel momento". Non cercare di leggere troppo in esso. Dopotutto, ASN.1 è riuscito a definire, anche negli anni '80, un formato per date che ha solo due cifre per l'anno - un abbagliante Problema Y2K , che non ha scoraggiato il comitato di standardizzazione ... quindi accetta la dualità ENUMERATED / INTEGER come una delle numerose stranezze di ASN.1 (non è il peggiore).

    
risposta data 14.10.2012 - 17:48
fonte
5

ENUMERATED e INTEGER servono a scopi diversi. ENUMERATED serve per creare un elenco di voci nominate mentre INTEGER è per il trasporto di numeri. Il fatto che la notazione del tipo sembri piuttosto simile non li rende identici. Per ENUMERATED, gli unici valori consentiti sono quelli nominati nella lista. Per INTEGER, la lista nominata è solo un insieme di etichette utili per numeri specifici e non limita quali valori sono consentiti per il tipo INTEGER.

Posso solo supporre che CRLReason sia stato creato ENUMERATED perché esiste un insieme di valori chiusi mentre Version è stato reso un INTEGER per lasciare il numero di versioni future aperte.

Sentiti libero di provare alcune di queste specifiche al link , che è un compilatore ASN.1 online e un codificatore / decodificatore che supporta non solo BER e DER, ma anche PER, XER e CER. Sarai in grado di vedere che le differenze tra ENUMERATED e INTEGER sembrano più significative per altre regole di codifica (come PER e XER) di quelle che sembrano per BER e DER.

    
risposta data 17.10.2012 - 20:11
fonte

Leggi altre domande sui tag