VERSION | 2 +- doc/news.rst | 6 ++++++ pyderasn.py | 13 +++++++++++-- tests/test_pyderasn.py | 24 ++++++++++++------------ diff --git a/VERSION b/VERSION index 3b7677e103fc46d2868b01e7299d0134ae6411f16cdf5fe37bd4557f179b4ce4..65c7b35a29855a225e3fea4944db9bbcbd5db46b824ad2888a44b6112d8c57c1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.14 +3.15 diff --git a/doc/news.rst b/doc/news.rst index 01c6e13286186ed1b48f2aaa521f983d58930298fd266c01d8c7d117a0261206..c6bc37d0218b226db2ccff55cf7e10da45d070e211af8f2cef2140c2d821b8a4 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,12 @@ News ==== +.. _release3.15: + +3.15 +---- +* DEFAULT-encoded value is checked also for Set-s, not for Sequences only + .. _release3.14: 3.14 diff --git a/pyderasn.py b/pyderasn.py index 05f5d411ca44d035e73e2ad46b0aa96e40efd4201d0bb38e22c391e721993d86..54c9983489d64c4f2fe68292d2f5ed0a5d9c9e150d4779053ab475fc0e268d05 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -4803,9 +4803,18 @@ value_len = value.fulllen sub_offset += value_len vlen += value_len v = v_tail - if spec.default is None or value != spec.default: # pragma: no cover - # SeqMixing.test_encoded_default_accepted covers that place + if spec.default is None: values[name] = value + else: + if value != spec.default: + values[name] = value + if ctx.get("strict_default_existence", False): + raise DecodeError( + "DEFAULT value met", + klass=self.__class__, + decode_path=sub_decode_path, + offset=sub_offset, + ) obj = self.__class__( schema=self.specs, impl=self.tag, diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index da98e5fb560dd4a2b312e8e379b10e879430818fed6a5f0a6781744e29b4d354..f125e3bf94160c79fa44e84bad3bc9f20057d353bae027d741bc4c079efc3f5a 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -5871,18 +5871,18 @@ _schema = [ ("int%d" % i, Integer(expl=tag_ctxc(i + 1))) for i in range(count) ] - - class Seq(Sequence): - schema = _schema - seq = Seq() - for i in range(count): - seq["int%d" % i] = Integer(123) - raw = seq.encode() - chosen = "int%d" % chosen - seq.specs[chosen] = seq.specs[chosen](default=123) - seq.decode(raw) - with assertRaisesRegex(self, DecodeError, "DEFAULT value met"): - seq.decode(raw, ctx={"strict_default_existence": True}) + for klass in (Sequence, Set): + class Seq(klass): + schema = _schema + seq = Seq() + for i in range(count): + seq["int%d" % i] = Integer(123) + raw = seq.encode() + chosen_choice = "int%d" % chosen + seq.specs[chosen_choice] = seq.specs[chosen_choice](default=123) + seq.decode(raw) + with assertRaisesRegex(self, DecodeError, "DEFAULT value met"): + seq.decode(raw, ctx={"strict_default_existence": True}) class TestX690PrefixedType(TestCase):