def test_parser_large_tag(self): # One extra byte result = parser.parse(b'\x7f\x49\x00') self.assertEqual(1, result[0]) self.assertEqual(1, result[1]) self.assertEqual(73, result[2]) self.assertEqual(b'\x7f\x49\x00', result[3]) self.assertEqual(b'', result[4]) self.assertEqual(b'', result[5]) # Two extra bytes result = parser.parse(b'\x7f\x81\x49\x00') self.assertEqual(1, result[0]) self.assertEqual(1, result[1]) self.assertEqual(201, result[2]) self.assertEqual(b'\x7f\x81\x49\x00', result[3]) self.assertEqual(b'', result[4]) self.assertEqual(b'', result[5]) # Three extra bytes result = parser.parse(b'\x7f\x81\x80\x00\x00') self.assertEqual(1, result[0]) self.assertEqual(1, result[1]) self.assertEqual(16384, result[2]) self.assertEqual(b'\x7f\x81\x80\x00\x00', result[3]) self.assertEqual(b'', result[4]) self.assertEqual(b'', result[5])
def test_parse_indef_nested(self): data = b'\x24\x80\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00\x00\x00' result = parser.parse(data) self.assertEqual(b'\x24\x80', result[3]) self.assertEqual(b'\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00', result[4]) self.assertEqual(b'\x00\x00', result[5])
def test_parser(self): result = parser.parse(b'\x02\x01\x00') self.assertIsInstance(result, tuple) self.assertEqual(0, result[0]) self.assertEqual(0, result[1]) self.assertEqual(2, result[2]) self.assertEqual(b'\x02\x01', result[3]) self.assertEqual(b'\x00', result[4]) self.assertEqual(b'', result[5])
def test_parser(self): result = parser.parse(b'\x02\x01\x00') self.assertIsInstance(result, tuple) self.assertEqual(0, result[0]) self.assertEqual(0, result[1]) self.assertEqual(2, result[2]) self.assertEqual(b'\x02\x01', result[3]) self.assertEqual(b'\x00', result[4]) self.assertEqual(b'', result[5])
def load(cls, encoded_data: bytes, strict=False): ''' Loads a BER/DER-encoded byte string using the current class as the spec :param encoded_data: A byte string of BER or DER encoded data :param strict: A boolean indicating if trailing data should be forbidden - if so, a ValueError will be raised when trailing data exists :return: A instance of the current class ''' class_, method, tag, header, contents, trailer = asn1Parser.parse( encoded_data, strict=strict) value = cls(class_=class_, tag=tag, method=method, contents=contents) if cls.class_ is not None and value.class_ != cls.class_: raise ElementaryFileError( "Invalid elementary file class, expected class '{}' got '{}'". format( asn1.CLASS_NUM_TO_NAME_MAP.get(cls.class_, cls.class_), asn1.CLASS_NUM_TO_NAME_MAP.get(value.class_, value.class_))) if cls.method is not None and value.method != cls.method: raise ElementaryFileError( "Invalid elementary file method , expected method '{}' got '{}'" .format( asn1.METHOD_NUM_TO_NAME_MAP.get(cls.method, cls.method), asn1.METHOD_NUM_TO_NAME_MAP.get(value.method, value.method))) if cls.tag is not None and value.tag != cls.tag: raise ElementaryFileError( "Invalid elementary file tag, expected tag '{}' got '{}'". format(cls.tag, value.tag)) return value
def test_parser_strict(self): with self.assertRaises(ValueError): parser.parse(b'\x02\x01\x00\x00', strict=True)
def test_parser_strict(self): with self.assertRaises(ValueError): parser.parse(b'\x02\x01\x00\x00', strict=True)
def test_parse_indef_nested(self): data = b'\x24\x80\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00\x00\x00' result = parser.parse(data) self.assertEqual(b'\x24\x80', result[3]) self.assertEqual(b'\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00', result[4]) self.assertEqual(b'\x00\x00', result[5])