Skip to content

Commit 65ddf3c

Browse files
committed
Fix non-Universal cases
1 parent 02bdb01 commit 65ddf3c

1 file changed

Lines changed: 30 additions & 20 deletions

File tree

src/asn1.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@ def write(self, value, nr=None, typ=None, cls=None): # type: (object, int, int,
155155
"""
156156
if self.m_stack is None:
157157
raise Error('Encoder not initialized. Call start() first.')
158+
159+
if typ is None:
160+
typ = Types.Primitive
161+
if cls is None:
162+
cls = Classes.Universal
163+
164+
if cls != Classes.Universal and nr is None:
165+
raise Error('Please specify a tag number (nr) when using classes Application, Context or Private')
166+
158167
if nr is None:
159168
if isinstance(value, bool):
160169
nr = Numbers.Boolean
@@ -166,11 +175,8 @@ def write(self, value, nr=None, typ=None, cls=None): # type: (object, int, int,
166175
nr = Numbers.OctetString
167176
elif value is None:
168177
nr = Numbers.Null
169-
if typ is None:
170-
typ = Types.Primitive
171-
if cls is None:
172-
cls = Classes.Universal
173-
value = self._encode_value(nr, value)
178+
179+
value = self._encode_value(cls, nr, value)
174180
self._emit_tag(nr, typ, cls)
175181
self._emit_length(len(value))
176182
self._emit(value)
@@ -255,20 +261,22 @@ def _emit(self, s): # type: (bytes) -> None
255261
assert isinstance(s, bytes)
256262
self.m_stack[-1].append(s)
257263

258-
def _encode_value(self, nr, value): # type: (int, any) -> bytes
264+
def _encode_value(self, cls, nr, value): # type: (int, int, any) -> bytes
259265
"""Encode a value."""
266+
if cls != Classes.Universal:
267+
return value
260268
if nr in (Numbers.Integer, Numbers.Enumerated):
261-
value = self._encode_integer(value)
262-
elif nr in (Numbers.OctetString, Numbers.PrintableString):
263-
value = self._encode_octet_string(value)
264-
elif nr == Numbers.BitString:
265-
value = self._encode_bit_string(value)
266-
elif nr == Numbers.Boolean:
267-
value = self._encode_boolean(value)
268-
elif nr == Numbers.Null:
269-
value = self._encode_null()
270-
elif nr == Numbers.ObjectIdentifier:
271-
value = self._encode_object_identifier(value)
269+
return self._encode_integer(value)
270+
if nr in (Numbers.OctetString, Numbers.PrintableString):
271+
return self._encode_octet_string(value)
272+
if nr == Numbers.BitString:
273+
return self._encode_bit_string(value)
274+
if nr == Numbers.Boolean:
275+
return self._encode_boolean(value)
276+
if nr == Numbers.Null:
277+
return self._encode_null()
278+
if nr == Numbers.ObjectIdentifier:
279+
return self._encode_object_identifier(value)
272280
return value
273281

274282
@staticmethod
@@ -434,7 +442,7 @@ def read(self, tagnr=None): # type: (Number) -> (Tag, any)
434442
length = self._read_length()
435443
if tagnr is None:
436444
tagnr = tag.nr
437-
value = self._read_value(tagnr, length)
445+
value = self._read_value(tag.cls, tagnr, length)
438446
self.m_tag = None
439447
return tag, value
440448

@@ -519,10 +527,12 @@ def _read_length(self): # type: () -> int
519527
length = byte
520528
return length
521529

522-
def _read_value(self, nr, length): # type: (int, int) -> any
530+
def _read_value(self, cls, nr, length): # type: (int, int, int) -> any
523531
"""Read a value from the input."""
524532
bytes_data = self._read_bytes(length)
525-
if nr == Numbers.Boolean:
533+
if cls != Classes.Universal:
534+
value = bytes_data
535+
elif nr == Numbers.Boolean:
526536
value = self._decode_boolean(bytes_data)
527537
elif nr in (Numbers.Integer, Numbers.Enumerated):
528538
value = self._decode_integer(bytes_data)

0 commit comments

Comments
 (0)