You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
# coding: utf-8
|
|
from __future__ import unicode_literals, division, absolute_import, print_function
|
|
|
|
import unittest
|
|
|
|
from asn1crypto import parser
|
|
|
|
from ._unittest_compat import patch
|
|
|
|
patch()
|
|
|
|
|
|
class ParserTests(unittest.TestCase):
|
|
|
|
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_peek(self):
|
|
self.assertEqual(3, parser.peek(b'\x02\x01\x00\x00'))
|
|
|
|
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_strict(self):
|
|
with self.assertRaises(ValueError):
|
|
parser.parse(b'\x02\x01\x00\x00', strict=True)
|
|
|
|
def test_emit(self):
|
|
self.assertEqual(b'\x02\x01\x00', parser.emit(0, 0, 2, b'\x00'))
|
|
|
|
def test_emit_type_errors(self):
|
|
with self.assertRaises(TypeError):
|
|
parser.emit('0', 0, 2, b'\x00')
|
|
|
|
with self.assertRaises(ValueError):
|
|
parser.emit(-1, 0, 2, b'\x00')
|
|
|
|
with self.assertRaises(TypeError):
|
|
parser.emit(0, '0', 2, b'\x00')
|
|
|
|
with self.assertRaises(ValueError):
|
|
parser.emit(0, 5, 2, b'\x00')
|
|
|
|
with self.assertRaises(TypeError):
|
|
parser.emit(0, 0, '2', b'\x00')
|
|
|
|
with self.assertRaises(ValueError):
|
|
parser.emit(0, 0, -1, b'\x00')
|
|
|
|
with self.assertRaises(TypeError):
|
|
parser.emit(0, 0, 2, '\x00')
|
|
|
|
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])
|