[Python-de] BER-TLV

"Martin v. Löwis" martin at v.loewis.de
Sa Jan 5 15:06:44 UTC 2008


> Zwei Fragen habe ich doch noch:
> 1.:
> 
> def private_i(N,base):
>     return base.tagImplicitly(tag.Tag(tag.tagClassPrivate,
>                                       base[-1][1],
>                                       N))
> 
> Hier habe ich die Bedeutung von base[-1][1]  noch nicht verstanden.

Das ist wohl etwas gehackt (andererseits - ich finde pyasn1 auch nicht
ganz elegant). Jedenfalls hat "IMPLICIT" tagging den Effekt, dass
das nächste Tag weggelassen wird: bei

  [PRIVATE 3] INTEGER

kommt erst das private-3-tag+länge, und dann das
universal-integer-tag+länge, dann der Wert. Bei

  [PRIVATE 3] IMPLICIT INTEGER

kommt private-3+länge und *gleich* der Wert. Die Frage ist nun: sollte
das private-3-Tag als "constructed" markiert werden.

Falls das weggelassene Tag "primitive" war, übernimmt dann das neue
Tag die primitive-Funktion; ansonsten ist das neue Tag "constructed".

D.h. bei Implicit Tagging hat das neue Tag den gleichen Wert
des "constructed"-Flags wie das weggelassene Tag. Da das weggelassene
Flags base[-1] ist, ist sein "constructed"-Flags base[-1][1].

M.E. könnte pyasn1 das wissen, und bei tagImplicitly auf die Angabe
des constructed-Flags verzichten (genauso bei tagExplicitly - ein
explizites tag ist *immer* constructed).

> Kann ich univ.Integer durch univ.OctectString ersetzen?

Ich denke schon. Potentiell gibt es bei OCTET STRING die Möglichkeit,
"constructed" encoding zu verwenden, wo der string in mehrere
Teilstrings zerlegt wird. Ob das protokollkonform ist, weiß ich nicht,
weil ich ja die ASN.1-Spezifikation nicht kenne. pyasn1 generiert
constructed encoding, falls maxChunkSize angegeben wurde und der String
länger als maxChunkSize ist - darauf sollte man sicherheitshalber
verzichten.

Ciao,
Martin