Domanda

Ho una specifica per una sintassi ASN.1 che desidero di modificare con l'aggiunta di alcuni campi. Se creo una stringa codificata usando BER con i nuovi campi e quindi tentare di decodificare stringa mediante un decoder che non sa su questi campi aggiuntivi, quale dovrebbe essere il risultato essere? Sarà la decodifica falliscono perché ci sono campi che il decoder non riconosce? Sarà il decoder decodificare solo i campi che può riconoscere e ignorare completamente quelli che non lo fa? E 'questo un tema completamente decoder attuazione quindi o risultato è possibile, a seconda di come viene implementato il decoder?

In questo momento, sto usando una fonte ASN.1 compilatore / decoder aperto e sembra essere mancata del tutto, ma non sono sicuro se questo è a causa della realizzazione o perché le regole ASN.1 dettare quel tipo di risultato?

Nessuna soluzione corretta

Altri suggerimenti

E 'certamente non dipende attuazione. Cioè, se le diverse implementazioni gestiscono in modo diverso, uno di loro sta facendo in modo errato. Se si va a decodificare i campi sconosciuti utilizzando un decoder che non si aspetta campi sconosciuti, la decodifica dovesse fallire. Non salterà campi sconosciuti.

V'è, tuttavia, un modo per fornire per ulteriori campi ancor prima che vengano conosciuti. E 'di impiegare il marcatore estensione ( "..."). Diciamo che sviluppiamo diverse versioni di una specifica ASN.1. Chiamiamoli V1, V2, V3, ecc V1 è la specifica originale, ma si capisce al momento progettiamo V1 che è probabile che dovremo modificarlo a un certo punto. Per permettere questo, invece di qualcosa come

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1
}

ci dichiariamo Z per essere estensibile come questo

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1,
                 ...
}

L'indicatore estensione dice che, a seguito di c, ci potrebbero essere più campi che sono ancora sconosciute. Il decoder dovrebbe trattare i messaggi che contengono tali campi, a patto che essi seguono c, come valido. Il decoder non sarebbe in grado di decodificare loro dal momento che non sa quello che dovrebbe essere, ma si sa che sono ammissibili.

Diciamo che aggiorniamo V1 a V2 inserendo due nuovi campi un po 'come questo

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN          ]] -- V2
}

In questo caso, la versione V1 può interagire con la versione V2. L'encoder V1 non includerebbe doe, mentre il codificatore V2 li comprendono. Dal punto di vista del decodificatore, il decoder V1 avrebbe accettato (ma non decodifica) d ed e, mentre il decodificatore V2 sarebbe decodificare d ed e se si trovano. Quindi un decoder V1 accetterebbe sia V1 e V2 codifiche, ignorando d ed e ogni volta che si trovano; un decodificatore V2 inoltre accettare sia V1 e V2 codifiche, rilevando che codifica V1 non includerebbe doe, ma resta valida.

Possiamo continuare questo attraverso ulteriori versioni, per esempio,

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN         ]], -- V2
             [[  f PrintableString,    -- V3
                 g ExtensionMessage]]  -- V3
}

dove V1, V2, V3 e possono tutti interoperare.

Si noti, tuttavia, che da quando abbiamo a che fare con una sequenza, l'ordine deve essere preservata. Non si potrebbe avere e senza d, nè g senza d, e ed f.

La conclusione è quindi che se la tua definizione di tipo include i marcatori di estensione, è possibile aggiungere nuovi campi, ma se così non fosse, non si può.

Questa tutto dipenderà dalle specifiche e l'implementazione. In breve - non c'è modo di dire. ed è fino alla realizzazione. Alcune specifiche per ogni protocollo / formato utilizzando ASN.1 prevedono espressamente che gli elementi sconosciuti devono essere ignorato, nel qual caso la decodifica non deve fallire.

Più comune, però, decoder rifiuterà qualsiasi ingresso che non strettamente conforme alla sintassi ASN.1 che si suppone che sia la decodifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top