diff options
author | wbond <will@wbond.net> | 2019-09-27 19:56:20 -0400 |
---|---|---|
committer | wbond <will@wbond.net> | 2019-09-27 19:58:12 -0400 |
commit | 3b330ff4d0fc59bacccc69972f3828286c18c97c (patch) | |
tree | f36c922a7973b27ff87659e2c30eff5994e53af7 | |
parent | a8f3eef200e269eba0a0f2ea79ddbddd05a65d11 (diff) | |
download | asn1crypto-3b330ff4d0fc59bacccc69972f3828286c18c97c.tar.gz |
Restrict core.IntegerBitString() and core.IntegerOctetString() to positive integers
-rw-r--r-- | asn1crypto/core.py | 22 | ||||
-rw-r--r-- | tests/test_core.py | 13 |
2 files changed, 33 insertions, 2 deletions
diff --git a/asn1crypto/core.py b/asn1crypto/core.py index 8389461..881620e 100644 --- a/asn1crypto/core.py +++ b/asn1crypto/core.py @@ -2480,12 +2480,21 @@ class IntegerBitString(_IntegerBitString, Constructable, Castable, Primitive): if not isinstance(value, int_types): raise TypeError(unwrap( ''' - %s value must be an integer, not %s + %s value must be a positive integer, not %s ''', type_name(self), type_name(value) )) + if value < 0: + raise ValueError(unwrap( + ''' + %s value must be a positive integer, not %d + ''', + type_name(self), + value + )) + self._native = value # Set the unused bits to 0 self.contents = b'\x00' + int_to_bytes(value, signed=True) @@ -2620,12 +2629,21 @@ class IntegerOctetString(Constructable, Castable, Primitive): if not isinstance(value, int_types): raise TypeError(unwrap( ''' - %s value must be an integer, not %s + %s value must be a positive integer, not %s ''', type_name(self), type_name(value) )) + if value < 0: + raise ValueError(unwrap( + ''' + %s value must be a positive integer, not %d + ''', + type_name(self), + value + )) + self._native = value self.contents = int_to_bytes(value, signed=False, width=self._encoded_width) self._header = None diff --git a/tests/test_core.py b/tests/test_core.py index a22186a..5be2438 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -961,6 +961,9 @@ class CoreTests(unittest.TestCase): with self.assertRaises(TypeError): a.set('badtype') + with self.assertRaises(ValueError): + core.IntegerBitString(-1) + def test_indefinite_length_integer_bit_string(self): data = b'#\x80\x03\x02\x00\x01\x03\x02\x00\x04\x00\x00' a = core.IntegerBitString.load(data) @@ -1036,6 +1039,16 @@ class CoreTests(unittest.TestCase): # parsable octet bit string with unused bits core.ParsableOctetBitString.load(b'\x23\x80\x03\x03\x04\x02\x00\x03\x03\x04\x12\xa0\x00\x00').native + def test_integer_octet_string(self): + v = core.IntegerOctetString(10) + self.assertEqual(10, v.native) + + with self.assertRaises(TypeError): + core.IntegerOctetString('0') + + with self.assertRaises(ValueError): + core.IntegerOctetString(-1) + def test_explicit_application_tag(self): data = b'\x6a\x81\x03\x02\x01\x00' ati = ApplicationTaggedInteger.load(data) |