doc/news.rst | 2 ++ pyderasn.py | 2 ++ tests/test_pyderasn.py | 6 ++++++ diff --git a/doc/news.rst b/doc/news.rst index 2c42c2e4ebc7cd556a03f0eb82f684e3987b4167850fb25ce2e444a292256979..d8d9dc32b875d3ce15352117fb0da6c14c272ae08988cccfd27b78a46b5926d1 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -7,6 +7,8 @@ 7.7 --- * Strictly check that tag's long encoded form does not contain leading zero (X.690 8.1.2.4.2 (c)) +* Strictly check that tag's long form is used in expected way for small values + (X.690 8.1.2.2) .. _release7.6: diff --git a/pyderasn.py b/pyderasn.py index b4770043c5e918b1fc83f82e48b9bd255ee8d31e402414a351c0fdfa8d1bc96d..c402727b0f3fcd5855eff16419fb671524d4aa1811adfa35a9ea8beed767b6a2 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -1558,6 +1558,8 @@ if i == len(data): raise DecodeError("unfinished tag") if indexbytes(data, i) & 0x80 == 0: break + if i == 1 and indexbytes(data, 1) < 0x1F: + raise DecodeError("unexpected long form") if i > 1 and indexbytes(data, 1) & 0x7F == 0: raise DecodeError("leading zero byte in tag value") i += 1 diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 387bd6758f4a935786cbaa5ad3b6d10f45a1222d0570ab1efb1c7fc3ff598be8..dcccc7a2a7e1a54298f146474a658ce0726e6e279e971ca06c01736075f5e6c0 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -283,6 +283,12 @@ raw = b"".join((raw[:1], b"\x80", raw[1:])) with assertRaisesRegex(self, DecodeError, "leading zero byte"): tag_strip(raw) + @given(tag_classes, tag_forms, integers(max_value=30, min_value=0)) + def test_unexpected_long_form(self, klass, form, num): + raw = int2byte(klass | form | 31) + int2byte(num) + with assertRaisesRegex(self, DecodeError, "unexpected long form"): + tag_strip(raw) + class TestLenCoder(TestCase): @settings(max_examples=LONG_TEST_MAX_EXAMPLES)