2013-02-23 12 views
7

Sto decodificando ASN1 (come utilizzato in X.509 per i certificati HTTPS). Sto facendo abbastanza bene, ma c'è una cosa che non riesco a trovare e documentazione comprensibile per.Come funziona [0] e [3] in ASN1?

In un parser JS ASN1 (ad esempio http://lapo.it/asn1js/) si vede un [0] e un [3] sotto un elemento SEQUENCE, il primo simile ai dati: A0 03 02 01 02. Voglio sapere cosa significa e come decodificarlo.

Un altro esempio è http://www.jensign.com/JavaScience/GetTBSCert/index.html, c'è un [0] subito dopo i primi due elementi di SEQUENCE.

Quello che non capisco è il modo in cui A0 si adatta allo schema in cui i primi 2 bit del byte del tag sono una classe, il successivo un bit primitivo/costruito e il restante 5 dovrebbero essere il tipo di tag. A0 è 10100000, il che significa che il valore del tipo di tag sarebbe zero.

+0

La [0] e [3] sono rappresentazioni dei tag (classe CONTEXT-SPECIFIC, valori 0 e 3). Sembri capire come A0 codifica un tag. I valori di tag pari a 0 non sono rari. Non sono sicuro di cosa stai chiedendo. – Kevin

+0

Non capisco lo scopo del contesto specifico ... Quindi qual è il significato di [0]? – Cocoanetics

risposta

10

ASN.1 BER e DER utilizzano ASN.1 TAG per identificare senza ambiguità determinati componenti in un flusso codificato. Esistono 4 classi di tag ASN.1: UNIVERSAL, APPICATION, PRIVATE e context-specific. Il [0] è un tag specifico del contesto poiché non c'è alcun tag class keword di fronte ad esso. UNIVERSAL è riservato ai tipi predefiniti in ASN.1. Molto spesso si vedono tag specifici del contesto per eliminare potenziali ambiguità in una SEQUENZA che contiene elementi OPZIONALI. Se sai che stai ricevendo due articoli che non sono opzionali, uno dopo l'altro, sai qual è quello che anche se i loro tag sono gli stessi. Tuttavia, se il primo è facoltativo, i due devono avere tag diversi, oppure non si è in grado di dire quale dei due è stato ricevuto se nella codifica era presente solo uno.

Più spesso oggi, le specifiche ASN.1 utilizzano "TAG AUTOMATICI" in modo che non ci si debba preoccupare di questo tipo di disambiguazione nei messaggi poiché i componenti di SEQUENCE, SET e CHOICE otterranno automaticamente tag specifici del contesto che iniziano con [ 0], [1], [2], ecc. Per ciascun componente.

È possibile trovare ulteriori informazioni sui tag ASN.1 allo http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html dove sono disponibili due libri scaricabili gratuitamente.

Un'altra risorsa eccellente è http://asn1-playground.oss.com in cui è possibile provare le varianti delle specifiche ASN.1 con tag diversi in un compilatore online e codificatore/decodificatore. Qui puoi vedere gli effetti delle modifiche ai tag sulle codifiche.

+0

quindi se ci sono tag di contesto espliciti come [0] e [3] incontrati in un certificato codificato, vuol dire che le sezioni 1 e 2 sono saltate? – Cocoanetics

+0

Sì, se ci sono campi di una SEQUENZA contrassegnati OPZIONALE tra i campi con [0] e [3], la ricezione di [3] significa che i campi OPZIONALI non erano presenti nel messaggio. –

11

Sembra che sia necessaria un'introduzione al tag ASN.1. Ci sono due angoli per avvicinarsi a questo da. X.690 definisce le regole di codifica BER/CER/DER. Come tale, risponde alla domanda su come i tag sono codificati. X.680 definisce ASN.1 stesso. In quanto tale, definisce la sintassi e le regole per il tagging. Entrambe le specifiche sono disponibili sul sito Web ITU-T. Ti darò una rapida panoramica.

I tag sono utilizzati in BER/DER/CER per identificare i tipi. Sono particolarmente utili per distinguere i componenti di una SEQUENZA e le alternative di una SCELTA.

Un tag combina una classe di tag e un numero di tag. Le classi di tag sono UNIVERSAL, APPLICATION, PRIVATE e SPECIFICHE CONTEXT. La classe UNIVERSAL è fondamentalmente usata per i tipi built-in. L'APPLICAZIONE viene in genere utilizzata per i tipi definiti dall'utente. IL CONTENUTO SPECIFICO è tipicamente utilizzato per i componenti all'interno di tipi costruiti (SEQUENZA, SCELTA, SEQUENZA DI). Sintatticamente, quando i tag sono specificati in un modulo ASN.1, sono scritti all'interno di parentesi: [tag_class tag_number]; per CONTEXT-SPECIFIC, la tag_class è omessa. Pertanto, [APPLICAZIONE 10] o [0].

Mentre ogni tipo ASN.1 ha un tag associato, sintatticamente, esiste anche il "TaggedType", che viene utilizzato da un autore ASN.1 per specificare il tag con cui codificare un tipo. Fondamentalmente, un TaggedType mette un prefisso di tag davanti a un tipo.Ad esempio:

MyType ::= SEQUENCE { 
    field_with_tagged_type [0] UTF8String 
} 

Il tag in un TaggedType è esplicito o implicito. Se esplicito, ciò significa che voglio che il tag originale sia codificato esplicitamente. Se implicito, questo significa che sono felice di avere solo il tag che ho specificato essere codificato. Nel caso esplicito, la codifica BER genera un TLV nidificato (tag-length-value): il tag esterno ([0] nell'esempio sopra), la lunghezza e quindi un altro TLV come valore. Nell'esempio, questo TLV interno avrà un tag di [UNIVERSAL 12] per UTF8String.

Se il tag è esplicito o implicito dipende da come si scrive il tag e l'ambiente di tagging. Per esempio:

MyType2 ::= SEQUENCE { 
    field_with_explicit_tag [0] EXPLICIT UTF8String OPTIONAL, 
    field_with_implicit_tag [1] IMPLICIT UTF8String OPTIONAL, 
    field_with_tag [2] UTF8String OPTIONAL 
} 

Se si specifica né IMPLICIT né ESPLICITA, ci sono alcune regole che definiscono se il tag è esplicita o implicita (vedi X.680 31). Queste regole prendono in considerazione l'ambiente di tagging definito per il modulo ASN.1. Il modulo ASN.1 può specificare l'ambiente di tagging come TAG IMPLICIT, TAG ESPLICIT o TAG AUTOMATICI. In parole povere, se non si specifica IMPLICIT o EXPLICIT per un tag, il tag sarà esplicito se l'ambiente di codifica è ESPLICITO e implicito se l'ambiente di codifica è IMPLICIT o AUTOMATIC. Un ambiente di tagging automatico è fondamentalmente uguale a un ambiente di tagging IMPLICIT, con la differenza che i tag unici vengono assegnati automaticamente ai membri dei tipi SEQUENCE e SCOICE.

Si noti che nell'esempio precedente, i tre componenti di MyType2 sono tutti facoltativi. In BER/CER/DER, un decodificatore saprà quale componente è presente in base al tag codificato (che ovviamente è meglio essere univoco).

+0

Grazie per la lunga spiegazione! – Cocoanetics

+0

Puoi commentare la mia domanda http://stackoverflow.com/questions/15624838/what-is-the-effective-tagging-environment-in-case-of-an-imported-type –

1

[0] è un tipo con tag specifici del contesto, ovvero per determinare quale significato attribuisce ai campi (se è impostato il flag "Constructed") o il valore dei dati (se non è impostato il flag "Constructed") si avvolge; devi sapere in quale contesto appare.

Inoltre, devi anche sapere che tipo di oggetto il mittente e il destinatario si scambiano nel flusso DER, vale a dire. il "modulo ASN.1".

Diciamo che stanno scambiando un Certificate Signing Request, e [0] appare come il 4 ° campo all'interno di una sequenza all'interno della SEQUENZA radice:

SEQUENCE 
    SEQUENCE 
     INTEGER 0 
     SEQUENCE { ... } 
     SEQUENCE { ... } 
     [0] { ... } 
    } 
} 

Poi in base al RFC2968, che definisce i contenuti Der per Certificate Signing Request, Appendice A, che definisce il modulo ASN.1, il significato di quel particolare campo è subdolamente definito come "attributi" e "Dovrebbe avere il flag costruito":

attributes [0] Attributes{{ CRIAttributes }} 

Si può anche andare alla altro modo e vedere che "attributi" mu s essere il 4 ° campo all'interno della prima sequenza all'interno della sequenza radice e tagge come [0] osservando la definizione della sequenza radice (sezione 4: "il tipo di livello più alto CertificationRequest"), trovando il posizionamento di CertificationRequestInfo al suo interno e trovando dove l'elemento "attributes" si trova all'interno di CertificationRequestInfo e, infine, viene visualizzato come viene taggato.

ASN.1 è così semplice, non capisco come sempre più persone non capisco .. "E 'solo un formato TLV .." ;-)

+1

Grazie per la risposta. Una bella aggiunta sarebbe includere un link ai documenti a cui ti riferisci. – SherylHohman