From bba84f2f3b5fbc860f51cf76f2f504cb2aa8d899 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 13 Apr 2020 11:33:05 +0300 Subject: [PATCH] Check if tag's long form used in expected way --- doc/news.rst | 2 ++ pyderasn.py | 2 ++ tests/test_pyderasn.py | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/doc/news.rst b/doc/news.rst index 7d523e8..6190d51 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -7,6 +7,8 @@ News --- * 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 df0eb8f..505f3ba 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -1558,6 +1558,8 @@ def tag_strip(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 fcf8781..8225fc0 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -283,6 +283,12 @@ class TestTagCoder(TestCase): 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) -- 2.44.0