|
| 1 | + |
| 2 | +# compatibility with Python 2.6, for that we need unittest2 package, |
| 3 | +# which is not available on 3.3 or 3.4 |
| 4 | +try: |
| 5 | + import unittest2 as unittest |
| 6 | +except ImportError: |
| 7 | + import unittest |
| 8 | +from .der import remove_integer, UnexpectedDER, read_length |
| 9 | +from six import b |
| 10 | + |
| 11 | +class TestRemoveInteger(unittest.TestCase): |
| 12 | + # DER requires the integers to be 0-padded only if they would be |
| 13 | + # interpreted as negative, check if those errors are detected |
| 14 | + def test_non_minimal_encoding(self): |
| 15 | + with self.assertRaises(UnexpectedDER): |
| 16 | + remove_integer(b('\x02\x02\x00\x01')) |
| 17 | + |
| 18 | + def test_negative_with_high_bit_set(self): |
| 19 | + with self.assertRaises(UnexpectedDER): |
| 20 | + remove_integer(b('\x02\x01\x80')) |
| 21 | + |
| 22 | + def test_two_zero_bytes_with_high_bit_set(self): |
| 23 | + with self.assertRaises(UnexpectedDER): |
| 24 | + remove_integer(b('\x02\x03\x00\x00\xff')) |
| 25 | + |
| 26 | + def test_zero_length_integer(self): |
| 27 | + with self.assertRaises(UnexpectedDER): |
| 28 | + remove_integer(b('\x02\x00')) |
| 29 | + |
| 30 | + def test_empty_string(self): |
| 31 | + with self.assertRaises(UnexpectedDER): |
| 32 | + remove_integer(b('')) |
| 33 | + |
| 34 | + def test_encoding_of_zero(self): |
| 35 | + val, rem = remove_integer(b('\x02\x01\x00')) |
| 36 | + |
| 37 | + self.assertEqual(val, 0) |
| 38 | + self.assertFalse(rem) |
| 39 | + |
| 40 | + def test_encoding_of_127(self): |
| 41 | + val, rem = remove_integer(b('\x02\x01\x7f')) |
| 42 | + |
| 43 | + self.assertEqual(val, 127) |
| 44 | + self.assertFalse(rem) |
| 45 | + |
| 46 | + def test_encoding_of_128(self): |
| 47 | + val, rem = remove_integer(b('\x02\x02\x00\x80')) |
| 48 | + |
| 49 | + self.assertEqual(val, 128) |
| 50 | + self.assertFalse(rem) |
| 51 | + |
| 52 | + |
| 53 | +class TestReadLength(unittest.TestCase): |
| 54 | + # DER requires the lengths between 0 and 127 to be encoded using the short |
| 55 | + # form and lengths above that encoded with minimal number of bytes |
| 56 | + # necessary |
| 57 | + def test_zero_length(self): |
| 58 | + self.assertEqual((0, 1), read_length(b('\x00'))) |
| 59 | + |
| 60 | + def test_two_byte_zero_length(self): |
| 61 | + with self.assertRaises(UnexpectedDER): |
| 62 | + read_length(b('\x81\x00')) |
| 63 | + |
| 64 | + def test_two_byte_small_length(self): |
| 65 | + with self.assertRaises(UnexpectedDER): |
| 66 | + read_length(b('\x81\x7f')) |
| 67 | + |
| 68 | + def test_long_form_with_zero_length(self): |
| 69 | + with self.assertRaises(UnexpectedDER): |
| 70 | + read_length(b('\x80')) |
| 71 | + |
| 72 | + def test_smallest_two_byte_length(self): |
| 73 | + self.assertEqual((128, 2), read_length(b('\x81\x80'))) |
| 74 | + |
| 75 | + def test_zero_padded_length(self): |
| 76 | + with self.assertRaises(UnexpectedDER): |
| 77 | + read_length(b('\x82\x00\x80')) |
| 78 | + |
| 79 | + def test_two_three_byte_length(self): |
| 80 | + self.assertEqual((256, 3), read_length(b'\x82\x01\x00')) |
| 81 | + |
| 82 | + def test_empty_string(self): |
| 83 | + with self.assertRaises(UnexpectedDER): |
| 84 | + read_length(b('')) |
| 85 | + |
| 86 | + def test_length_overflow(self): |
| 87 | + with self.assertRaises(UnexpectedDER): |
| 88 | + read_length(b('\x83\x01\x00')) |
0 commit comments