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).
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
Non capisco lo scopo del contesto specifico ... Quindi qual è il significato di [0]? – Cocoanetics