From b30d8ddf17d02cc72acee7a9d6eff9b1ea9e0477 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 23 Jan 2018 12:04:17 +0300 Subject: [PATCH] Fix invalid DEFINED BY offset calculation for EXPL tagged objects --- VERSION | 2 +- doc/news.rst | 7 +++++++ pyderasn.py | 10 ++++++++-- tests/test_pyderasn.py | 3 +++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index cd5ac03..879b416 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0 +2.1 diff --git a/doc/news.rst b/doc/news.rst index 692f5cc..e935e0e 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,13 @@ News ==== +.. _release2.1: + +2.1 +--- +* Fixed invalid offset calculation when dealing with DEFINED BY objects + having explicit tags + .. _release2.0: 2.0 diff --git a/pyderasn.py b/pyderasn.py index e6c7fef..cd96a33 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3875,7 +3875,10 @@ class Sequence(Obj): ) defined_value, defined_tail = defined_spec.decode( memoryview(bytes(_value)), - sub_offset + value.tlen + value.llen, + sub_offset + ( + (value.tlen + value.llen + value.expl_tlen + value.expl_llen) + if value.expled else (value.tlen + value.llen) + ), leavemm=True, decode_path=sub_sub_decode_path, ctx=ctx, @@ -3891,7 +3894,10 @@ class Sequence(Obj): else: defined_value, defined_tail = defined_spec.decode( memoryview(bytes(value)), - sub_offset + value.tlen + value.llen, + sub_offset + ( + (value.tlen + value.llen + value.expl_tlen + value.expl_llen) + if value.expled else (value.tlen + value.llen) + ), leavemm=True, decode_path=sub_decode_path + (decode_path_defby(defined_by),), ctx=ctx, diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 317ed91..13322d7 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -5003,6 +5003,9 @@ class TestDefinesByPath(TestCase): self.assertIsNotNone(seq_integered["value"].defined) self.assertEqual(seq_integered["value"].defined[0], type_integered) self.assertEqual(seq_integered["value"].defined[1], Integer(123)) + self.assertTrue(seq_integered_raw[ + seq_integered["value"].defined[1].offset: + ].startswith(Integer(123).encode())) seq_sequenced, _ = Seq().decode( seq_sequenced_raw, -- 2.44.0