Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if self.number_of_bits is None:
number_of_bytes = decoder.read_length_determinant()
number_of_unused_bits = decoder.read_byte()
number_of_bytes -= 1
number_of_bits = (8 * number_of_bytes - number_of_unused_bits)
else:
number_of_bytes = (self.number_of_bits + 7) // 8
number_of_bits = self.number_of_bits
return (decoder.read_bytes(number_of_bytes), number_of_bits)
def __repr__(self):
return 'BitString({})'.format(self.name)
class OctetString(Type):
def __init__(self, name, minimum, maximum, has_extension_marker):
super(OctetString, self).__init__(name,
'OCTET STRING',
Tag.OCTET_STRING)
self.number_of_bytes = None
self.set_size_range(minimum, maximum, has_extension_marker)
def set_size_range(self, minimum, maximum, has_extension_marker):
if minimum is not None or maximum is not None:
if not has_extension_marker:
if minimum == maximum:
self.number_of_bytes = minimum
def encode(self, data, encoder):
if self.number_of_bytes is None:
encoder.append_bytes(encoded)
def decode(self, decoder):
if self.number_of_bytes is None:
number_of_bytes = decoder.read_length_determinant()
else:
number_of_bytes = self.number_of_bytes
return decoder.read_bytes(number_of_bytes).decode(self.ENCODING)
def __repr__(self):
return '{}({})'.format(self.__class__.__name__,
self.name)
class MembersType(Type):
def __init__(self, name, type_name, tag, root_members, additions):
super(MembersType, self).__init__(name,
type_name,
tag)
self.root_members = root_members
self.additions = additions
self.optionals = [
member
for member in root_members
if member.optional or member.default is not None
]
def encode(self, data, encoder):
if self.additions is not None:
offset = encoder.number_of_bits
else:
encoder.append_bytes(data)
def decode(self, decoder):
if self.number_of_bytes is None:
number_of_bytes = decoder.read_length_determinant()
else:
number_of_bytes = self.number_of_bytes
return decoder.read_bytes(number_of_bytes)
def __repr__(self):
return 'OctetString({})'.format(self.name)
class ObjectIdentifier(Type):
def __init__(self, name):
super(ObjectIdentifier, self).__init__(name,
'OBJECT IDENTIFIER',
Tag.OBJECT_IDENTIFIER)
def encode(self, data, encoder):
encoded_subidentifiers = encode_object_identifier(data)
encoder.append_length_determinant(len(encoded_subidentifiers))
encoder.append_bytes(bytearray(encoded_subidentifiers))
def decode(self, decoder):
length = decoder.read_length_determinant()
data = decoder.read_bytes(length)
return decode_object_identifier(bytearray(data), 0, len(data))
None,
None)
self.type_member = type_member
self.choices = choices
def encode(self, data, encoder):
raise NotImplementedError('ANY DEFINED BY is not yet implemented.')
def decode(self, decoder):
raise NotImplementedError('ANY DEFINED BY is not yet implemented.')
def __repr__(self):
return 'AnyDefinedBy({})'.format(self.name)
class Recursive(Type, compiler.Recursive):
def __init__(self, name, type_name, module_name):
super(Recursive, self).__init__(name, 'RECURSIVE', None)
self.type_name = type_name
self.module_name = module_name
self.tag_number = None
self.tag_flags = None
self.inner = None
def set_inner_type(self, inner):
self.inner = copy(inner)
if self.tag_number is not None:
self.inner.set_tag(self.tag_number, self.tag_flags)
def encode(self, data, encoder):
class Any(Type):
def __init__(self, name):
super(Any, self).__init__(name, 'ANY', None)
def encode(self, data, encoder):
raise NotImplementedError('ANY is not yet implemented.')
def decode(self, decoder):
raise NotImplementedError('ANY is not yet implemented.')
def __repr__(self):
return 'Any({})'.format(self.name)
class AnyDefinedBy(Type):
def __init__(self, name, type_member, choices):
super(AnyDefinedBy, self).__init__(name,
'ANY DEFINED BY',
None,
None)
self.type_member = type_member
self.choices = choices
def encode(self, data, encoder):
raise NotImplementedError('ANY DEFINED BY is not yet implemented.')
def decode(self, decoder):
raise NotImplementedError('ANY DEFINED BY is not yet implemented.')
def __repr__(self):
def __init__(self, name):
super(Boolean, self).__init__(name,
'BOOLEAN',
Tag.BOOLEAN)
def encode(self, data, encoder):
encoder.append_non_negative_binary_integer(0xff * data, 8)
def decode(self, decoder):
return bool(decoder.read_byte())
def __repr__(self):
return 'Boolean({})'.format(self.name)
class Integer(Type):
def __init__(self, name):
super(Integer, self).__init__(name,
'INTEGER',
Tag.INTEGER)
self.has_extension_marker = False
self.length = None
self.fmt = None
self.signed = True
def set_restricted_to_range(self, minimum, maximum, has_extension_marker):
self.has_extension_marker = has_extension_marker
if minimum != 'MIN':
self.signed = (minimum < 0)
except DecodeError as e:
e.location.append(addition.name)
raise
else:
decoder.skip_bits(8 * member_length)
return decoded
def __repr__(self):
return '{}({}, [{}])'.format(
self.__class__.__name__,
self.name,
', '.join([repr(member) for member in self.root_members]))
class ArrayType(Type):
def __init__(self, name, type_name, tag, element_type):
super(ArrayType, self).__init__(name,
type_name,
tag)
self.element_type = element_type
def encode(self, data, encoder):
encoder.append_unsigned_integer(len(data))
for entry in data:
self.element_type.encode(entry, encoder)
def decode(self, decoder):
length = decoder.read_unsigned_integer()
decoded = []
def encode(self, data, encoder):
encoded_subidentifiers = encode_object_identifier(data)
encoder.append_length_determinant(len(encoded_subidentifiers))
encoder.append_bytes(bytearray(encoded_subidentifiers))
def decode(self, decoder):
length = decoder.read_length_determinant()
data = decoder.read_bytes(length)
return decode_object_identifier(bytearray(data), 0, len(data))
def __repr__(self):
return 'ObjectIdentifier({})'.format(self.name)
class Enumerated(Type):
def __init__(self, name, values, numeric):
super(Enumerated, self).__init__(name,
'ENUMERATED',
Tag.ENUMERATED)
if numeric:
self.value_to_data = {k: k for k in enum_values_as_dict(values)}
self.data_to_value = self.value_to_data
else:
self.value_to_data = enum_values_as_dict(values)
self.data_to_value = {v: k for k, v in self.value_to_data.items()}
self.has_extension_marker = (EXTENSION_MARKER in values)
def format_names(self):
class GeneralizedTime(VisibleString):
TAG = Tag.GENERALIZED_TIME
def encode(self, data, encoder):
encoded = generalized_time_from_datetime(data)
return super(GeneralizedTime, self).encode(encoded, encoder)
def decode(self, decoder):
decoded = super(GeneralizedTime, self).decode(decoder)
return generalized_time_to_datetime(decoded)
class Date(Type):
def __init__(self, name):
super(Date, self).__init__(name, 'DATE', None)
year = Integer('year')
month = Integer('month')
day = Integer('day')
month.set_restricted_to_range(1, 12, False)
day.set_restricted_to_range(1, 31, False)
self._inner = Sequence('DATE-ENCODING',
[year, month, day],
None)
def encode(self, data, encoder):
data = {
'year': data.year,
'month': data.month,
'got {}.'.format(8 * self.length,
data))
def decode(self, decoder):
if self.fmt is None:
length = decoder.read_length_determinant()
return der.decode_real(bytearray(decoder.read_bytes(length)))
else:
return struct.unpack(self.fmt, decoder.read_bytes(self.length))[0]
def __repr__(self):
return 'Real({})'.format(self.name)
class Null(Type):
def __init__(self, name):
super(Null, self).__init__(name, 'NULL', Tag.NULL)
def encode(self, _data, _encoder):
return
def decode(self, _decoder):
return
def __repr__(self):
return 'Null({})'.format(self.name)
class BitString(Type):