@@ -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