From 441db3ebc4685fa52e3b5fd03a5b5d67355338b1 Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Mon, 15 Apr 2024 15:13:43 -0600 Subject: [PATCH 1/4] Added .name property to Matter, Indexer, and Counter which provides the code name. This is to support annotation with the code name. --- src/keri/core/coring.py | 20 +++++- src/keri/core/counting.py | 39 +++++++++-- src/keri/core/indexing.py | 17 ++++- tests/core/test_coring.py | 125 +++++++++++++++++++++++++++++++++++- tests/core/test_counting.py | 77 ++++++++++++++++++++-- tests/core/test_indexing.py | 41 ++++++++++-- 6 files changed, 301 insertions(+), 18 deletions(-) diff --git a/src/keri/core/coring.py b/src/keri/core/coring.py index a02d29fbb..7c755abd7 100644 --- a/src/keri/core/coring.py +++ b/src/keri/core/coring.py @@ -8,7 +8,7 @@ from typing import Union from collections import namedtuple, deque from collections.abc import Sequence, Mapping -from dataclasses import dataclass, astuple +from dataclasses import dataclass, astuple, asdict from base64 import urlsafe_b64encode as encodeB64 from base64 import urlsafe_b64decode as decodeB64 from fractions import Fraction @@ -906,6 +906,9 @@ class Matter: '9AAE': Sizage(hs=4, ss=4, fs=None, ls=2), } + Codes = asdict(MtrDex) # map code name to code + Names = {val : key for key, val in Codes.items()} # invert map code to code name + def __init__(self, raw=None, code=MtrDex.Ed25519N, soft='', rize=None, @@ -1116,6 +1119,17 @@ def code(self): return self._code + @property + def name(self): + """ + Returns: + name (str): code name for self.code. Used for annotation for + primitives like Matter + + """ + return self.Names[self.code] + + @property def hard(self): """ @@ -1700,6 +1714,10 @@ class Number(Matter): Methods: """ + Codes = asdict(NumDex) # map code name to code + Names = {val : key for key, val in Codes.items()} # invert map code to code name + + def __init__(self, raw=None, qb64b=None, qb64=None, qb2=None, code=None, num=None, numh=None, **kwa): diff --git a/src/keri/core/counting.py b/src/keri/core/counting.py index 590a5ed16..9dee9fe14 100644 --- a/src/keri/core/counting.py +++ b/src/keri/core/counting.py @@ -419,10 +419,10 @@ def __init__(self, tag=None, *, code = None, count=None, countB64=None, Parameters: tag (str | None): label of stable (hard) part of derivation code to lookup in codex so it can depend on version. - takes precedence over tag + takes precedence over code. code (str | None): stable (hard) part of derivation code if tag provided lookup code from tag - else if tag is None and code provided use code + else if tag is None and code provided use code. count (int | None): count of framed material in quadlets/triplets for composition. Count does not include code. When both count and countB64 are None then count @@ -517,6 +517,9 @@ def __init__(self, tag=None, *, code = None, count=None, countB64=None, "(code and count) or qb64b or " "qb64 or qb2.") + codenames = { val: key for key, val in asdict(self.codes).items()} # map codes to code names + self._tag = codenames[self.code] + @property def version(self): """ @@ -525,6 +528,14 @@ def version(self): """ return self._version + @property + def gvrsn(self): + """ + Returns .version alias for .version + + """ + return self.version + @property def codes(self): """ @@ -536,10 +547,10 @@ def codes(self): @property def tags(self): """ - Returns ._tags + Returns tags for current .version Makes .tags read only """ - return self._tags + return self.Tags[self.version] # use own version @property def sizes(self): @@ -560,6 +571,26 @@ def code(self): """ return self._code + @property + def tag(self): + """ + Returns: + tag (str): code name for self.code + + Getter for ._tag. Makes .tag read only + """ + return self._tag + + @property + def name(self): + """ + Returns: + name (str): code name for self.code alias of .tag. Match interface + for annotation for primitives like Matter + + """ + return self.tag + @property def hard(self): diff --git a/src/keri/core/indexing.py b/src/keri/core/indexing.py index 6cb192a35..7022fbc1a 100644 --- a/src/keri/core/indexing.py +++ b/src/keri/core/indexing.py @@ -192,7 +192,6 @@ class Indexer: ._bexfil is method to extract .code and .raw from fully qualified Base2 """ - Codex = IdrDex # Hards table maps from bytes Base64 first code char to int of hard size, hs, # (stable) of code. The soft size, ss, (unstable) is always > 0 for Indexer. Hards = ({chr(c): 1 for c in range(65, 65 + 26)}) @@ -228,6 +227,11 @@ class Indexer: # converted from first code char. Used for ._bexfil. Bards = ({codeB64ToB2(c): hs for c, hs in Hards.items()}) + Codes = asdict(IdrDex) # map code name to code + Names = {val : key for key, val in Codes.items()} # invert map code to code name + + + def __init__(self, raw=None, code=IdrDex.Ed25519_Sig, index=0, ondex=None, qb64b=None, qb64=None, qb2=None, strip=False): """ @@ -341,6 +345,17 @@ def code(self): """ return self._code + + @property + def name(self): + """ + Returns: + name (str): code name for self.code. Used for annotation for + primitives like Matter + + """ + return self.Names[self.code] + @property def raw(self): """ diff --git a/tests/core/test_coring.py b/tests/core/test_coring.py index 28548a043..0933c0e89 100644 --- a/tests/core/test_coring.py +++ b/tests/core/test_coring.py @@ -205,7 +205,7 @@ def test_matter_class(): Test Matter class attributes """ - assert asdict(MtrDex) == \ + assert Matter.Codes == \ { 'Ed25519_Seed': 'A', 'Ed25519N': 'B', @@ -300,6 +300,101 @@ def test_matter_class(): 'X25519_Cipher_QB2_Big_L2': '9AAE' } + assert Matter.Names == \ + { + 'A': 'Ed25519_Seed', + 'B': 'Ed25519N', + 'C': 'X25519', + 'D': 'Ed25519', + 'E': 'Blake3_256', + 'F': 'Blake2b_256', + 'G': 'Blake2s_256', + 'H': 'SHA3_256', + 'I': 'SHA2_256', + 'J': 'ECDSA_256k1_Seed', + 'K': 'Ed448_Seed', + 'L': 'X448', + 'M': 'Short', + 'N': 'Big', + 'O': 'X25519_Private', + 'P': 'X25519_Cipher_Seed', + 'Q': 'ECDSA_256r1_Seed', + 'R': 'Tall', + 'S': 'Large', + 'T': 'Great', + 'U': 'Vast', + 'V': 'Label1', + 'W': 'Label2', + 'X': 'Tag3', + 'Y': 'Tag7', + 'Z': 'Blind', + '0A': 'Salt_128', + '0B': 'Ed25519_Sig', + '0C': 'ECDSA_256k1_Sig', + '0D': 'Blake3_512', + '0E': 'Blake2b_512', + '0F': 'SHA3_512', + '0G': 'SHA2_512', + '0H': 'Long', + '0I': 'ECDSA_256r1_Sig', + '0J': 'Tag1', + '0K': 'Tag2', + '0L': 'Tag5', + '0M': 'Tag6', + '0N': 'Tag9', + '0O': 'Tag10', + '1AAA': 'ECDSA_256k1N', + '1AAB': 'ECDSA_256k1', + '1AAC': 'Ed448N', + '1AAD': 'Ed448', + '1AAE': 'Ed448_Sig', + '1AAF': 'Tag4', + '1AAG': 'DateTime', + '1AAH': 'X25519_Cipher_Salt', + '1AAI': 'ECDSA_256r1N', + '1AAJ': 'ECDSA_256r1', + '1AAK': 'Null', + '1AAL': 'No', + '1AAM': 'Yes', + '1AAN': 'Tag8', + '1__-': 'TBD0S', + '1___': 'TBD0', + '2__-': 'TBD1S', + '2___': 'TBD1', + '3__-': 'TBD2S', + '3___': 'TBD2', + '4A': 'StrB64_L0', + '5A': 'StrB64_L1', + '6A': 'StrB64_L2', + '7AAA': 'StrB64_Big_L0', + '8AAA': 'StrB64_Big_L1', + '9AAA': 'StrB64_Big_L2', + '4B': 'Bytes_L0', + '5B': 'Bytes_L1', + '6B': 'Bytes_L2', + '7AAB': 'Bytes_Big_L0', + '8AAB': 'Bytes_Big_L1', + '9AAB': 'Bytes_Big_L2', + '4C': 'X25519_Cipher_L0', + '5C': 'X25519_Cipher_L1', + '6C': 'X25519_Cipher_L2', + '7AAC': 'X25519_Cipher_Big_L0', + '8AAC': 'X25519_Cipher_Big_L1', + '9AAC': 'X25519_Cipher_Big_L2', + '4D': 'X25519_Cipher_QB64_L0', + '5D': 'X25519_Cipher_QB64_L1', + '6D': 'X25519_Cipher_QB64_L2', + '7AAD': 'X25519_Cipher_QB64_Big_L0', + '8AAD': 'X25519_Cipher_QB64_Big_L1', + '9AAD': 'X25519_Cipher_QB64_Big_L2', + '4E': 'X25519_Cipher_QB2_L0', + '5E': 'X25519_Cipher_QB2_L1', + '6E': 'X25519_Cipher_QB2_L2', + '7AAE': 'X25519_Cipher_QB2_Big_L0', + '8AAE': 'X25519_Cipher_QB2_Big_L1', + '9AAE': 'X25519_Cipher_QB2_Big_L2' + } + # first character of code with hard size of code assert Matter.Hards == { @@ -536,6 +631,7 @@ def test_matter(): matter = Matter(raw=verkey) # default code is MtrDex.Ed25519N assert matter.raw == verkey assert matter.code == MtrDex.Ed25519N == matter.hard + assert matter.name == 'Ed25519N' assert matter.soft == "" assert matter.both == MtrDex.Ed25519N assert matter.size == None @@ -850,6 +946,7 @@ def test_matter(): matter = Matter(raw=raw, code=code) assert matter.raw == raw assert matter.code == code + assert matter.name == 'TBD1' assert matter.both == code assert matter.size == None assert matter.fullSize == 8 @@ -2615,6 +2712,32 @@ def test_number(): 'Vast': 'U' } + assert Number.Codes == \ + { + 'Short': 'M', + 'Long': '0H', + 'Tall': 'R', + 'Big': 'N', + 'Large': 'S', + 'Great': 'T', + 'Huge': '0A', + 'Vast': 'U' + } + + + assert Number.Names == \ + { + 'M': 'Short', + '0H': 'Long', + 'R': 'Tall', + 'N': 'Big', + 'S': 'Large', + 'T': 'Great', + '0A': 'Huge', + 'U': 'Vast' + } + + with pytest.raises(EmptyMaterialError): number = Number(raw=b'') # missing code diff --git a/tests/core/test_counting.py b/tests/core/test_counting.py index 39534f68d..bec518824 100644 --- a/tests/core/test_counting.py +++ b/tests/core/test_counting.py @@ -436,8 +436,7 @@ def test_counter_class(): for key, val in vminor.items(): # size table items assert Counter.Hards[key[:2]] == val.hs - ## verify all Codes have hs >= 2 and ss > 0 and fs = hs + ss and not fs % 4 - ## if hs < 2 or ss <= 0 or fs != cs or cs % 4 cs = hs + ss + # verify all Codes have hs >= 2 and ss > 0 and fs = hs + ss and not fs % 4 for vmajor in Counter.Sizes.values(): for vminor in vmajor.values(): for val in vminor.values(): # size table values @@ -507,10 +506,6 @@ def test_counter_class(): Counter.verToB64(minor=-1) - - - - """ Done Test """ def test_counter_v1(): @@ -533,6 +528,7 @@ def test_counter_v1(): counter = Counter(tag="ControllerIdxSigs", count=count, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.ControllerIdxSigs == counter.hard + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -541,9 +537,13 @@ def test_counter_v1(): assert counter.fullSize == 4 assert counter.soft =='AB' assert counter.both == qsc == counter.hard + counter.soft == counter.qb64 + assert counter.codes == counting.CtrDex_1_0 + assert counter.tags == counting.Tags_1_0 + assert counter.sizes == Counter.Sizes[1][0] counter = Counter(tag=AllTags.ControllerIdxSigs, count=count, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -556,6 +556,7 @@ def test_counter_v1(): count=count, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -564,6 +565,7 @@ def test_counter_v1(): counter = Counter(code=CtrDex.ControllerIdxSigs, gvrsn=Vrsn_1_0) # default count = 1 assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -572,6 +574,7 @@ def test_counter_v1(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_1_0) # test with bytes not str assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -580,6 +583,7 @@ def test_counter_v1(): counter = Counter(qb64=qsc, gvrsn=Vrsn_1_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -588,6 +592,7 @@ def test_counter_v1(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_1_0) # test with qb2 assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -624,6 +629,7 @@ def test_counter_v1(): counter = Counter(code=CtrDex.ControllerIdxSigs, count=count, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -632,6 +638,7 @@ def test_counter_v1(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_1_0) # test with bytes not str assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -640,6 +647,7 @@ def test_counter_v1(): counter = Counter(qb64=qsc, gvrsn=Vrsn_1_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -648,6 +656,7 @@ def test_counter_v1(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_1_0) # test with qb2 assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -663,6 +672,7 @@ def test_counter_v1(): counter = Counter(code=CtrDex.BigAttachmentGroup, count=count, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -671,6 +681,7 @@ def test_counter_v1(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_1_0) # test with bytes not str assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -679,6 +690,7 @@ def test_counter_v1(): counter = Counter(qb64=qsc, gvrsn=Vrsn_1_0) # test with str not bytes assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -687,6 +699,7 @@ def test_counter_v1(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_1_0) # test with qb2 assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -700,6 +713,7 @@ def test_counter_v1(): qb2 = counter.qb2 counter._bexfil(qb2) assert counter.code == code + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64 == qsc assert counter.qb2 == qb2 @@ -720,6 +734,7 @@ def test_counter_v1(): # strip ignored if qb64 counter = Counter(qb64=qsc, strip=True, gvrsn=Vrsn_1_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -730,6 +745,7 @@ def test_counter_v1(): counter = Counter(qb64b=ims, strip=True, gvrsn=Vrsn_1_0) # strip assert not ims # deleted assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -740,6 +756,7 @@ def test_counter_v1(): counter = Counter(qb2=ims, strip=True, gvrsn=Vrsn_1_0) assert not ims # deleted assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -782,6 +799,7 @@ def test_counter_v1(): ims = bytearray(qscb) counter = Counter(qb64b=ims, strip=True, gvrsn=Vrsn_1_0) # test with bytes not str assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -793,6 +811,7 @@ def test_counter_v1(): ims = bytearray(qscb2) counter = Counter(qb2=ims, strip=True, gvrsn=Vrsn_1_0) # test with qb2 assert counter.code == CtrDex.BigAttachmentGroup + assert counter.tag == AllTags.BigAttachmentGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -816,6 +835,7 @@ def test_counter_v1(): count=genverint, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.KERIACDCGenusVersion + assert counter.tag == AllTags.KERIACDCGenusVersion assert counter.count == genverint assert counter.countToB64(l=3) == genver assert counter.countToB64() == genver # default length @@ -823,11 +843,16 @@ def test_counter_v1(): assert counter.qb64 == qsc assert counter.qb2 == qscb2 assert counter.version == Vrsn_1_0 + assert counter.codes == counting.CtrDex_1_0 + assert counter.tags == counting.Tags_1_0 + assert counter.sizes == Counter.Sizes[1][0] + counter = Counter(code=CtrDex.KERIACDCGenusVersion, countB64=genver, gvrsn=Vrsn_1_0) assert counter.code == CtrDex.KERIACDCGenusVersion + assert counter.tag == AllTags.KERIACDCGenusVersion assert counter.count == genverint assert counter.countToB64(l=3) == genver assert counter.countToB64() == genver # default length @@ -859,6 +884,7 @@ def test_counter_v2(): # default version and default count = 1 counter = Counter(code=CtrDex.ControllerIdxSigs) assert counter.code == CtrDex.ControllerIdxSigs == counter.hard + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -867,10 +893,16 @@ def test_counter_v2(): assert counter.fullSize == 4 assert counter.soft =='AB' assert counter.both == qsc == counter.hard + counter.soft == counter.qb64 + assert counter.codes == counting.CtrDex_2_0 + assert counter.tags == counting.Tags_2_0 + assert counter.sizes == Counter.Sizes[2][0] + + # default count = 1 counter = Counter(code=CtrDex.ControllerIdxSigs, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -879,6 +911,7 @@ def test_counter_v2(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -887,6 +920,7 @@ def test_counter_v2(): counter = Counter(qb64=qsc, gvrsn=Vrsn_2_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -895,6 +929,7 @@ def test_counter_v2(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -931,6 +966,7 @@ def test_counter_v2(): counter = Counter(tag="ControllerIdxSigs", count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -941,6 +977,7 @@ def test_counter_v2(): count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -953,6 +990,7 @@ def test_counter_v2(): count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -961,6 +999,7 @@ def test_counter_v2(): counter = Counter(code=CtrDex.ControllerIdxSigs, count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -969,6 +1008,7 @@ def test_counter_v2(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -977,6 +1017,7 @@ def test_counter_v2(): counter = Counter(qb64=qsc, gvrsn=Vrsn_2_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -985,6 +1026,7 @@ def test_counter_v2(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -998,6 +1040,7 @@ def test_counter_v2(): qb2 = counter.qb2 counter._bexfil(qb2) assert counter.code == code + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64 == qsc assert counter.qb2 == qb2 @@ -1018,6 +1061,7 @@ def test_counter_v2(): # strip ignored if qb64 counter = Counter(qb64=qsc, strip=True, gvrsn=Vrsn_2_0) # test with str not bytes assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1028,6 +1072,7 @@ def test_counter_v2(): counter = Counter(qb64b=ims, strip=True, gvrsn=Vrsn_2_0) # strip assert not ims # deleted assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1038,6 +1083,7 @@ def test_counter_v2(): counter = Counter(qb2=ims, strip=True, gvrsn=Vrsn_2_0) assert not ims # deleted assert counter.code == CtrDex.ControllerIdxSigs + assert counter.tag == AllTags.ControllerIdxSigs assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1079,6 +1125,7 @@ def test_counter_v2(): counter = Counter(code=CtrDex.BigGenericGroup, count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1087,6 +1134,7 @@ def test_counter_v2(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1095,6 +1143,7 @@ def test_counter_v2(): counter = Counter(qb64=qsc, gvrsn=Vrsn_2_0) # test with str not bytes assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1103,6 +1152,7 @@ def test_counter_v2(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1119,6 +1169,7 @@ def test_counter_v2(): ims = bytearray(qscb) counter = Counter(qb64b=ims, strip=True, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1129,6 +1180,7 @@ def test_counter_v2(): ims = bytearray(qscb2) counter = Counter(qb2=ims, strip=True, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1145,6 +1197,7 @@ def test_counter_v2(): counter = Counter(code=CtrDex.BigGenericGroup, count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.BigGenericGroup == counter.hard + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1156,6 +1209,7 @@ def test_counter_v2(): counter = Counter(qb64b=qscb, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1164,6 +1218,7 @@ def test_counter_v2(): counter = Counter(qb64=qsc, gvrsn=Vrsn_2_0) # test with str not bytes assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1172,6 +1227,7 @@ def test_counter_v2(): counter = Counter(qb2=qscb2, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1188,6 +1244,7 @@ def test_counter_v2(): ims = bytearray(qscb) counter = Counter(qb64b=ims, strip=True, gvrsn=Vrsn_2_0) # test with bytes not str assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1199,6 +1256,7 @@ def test_counter_v2(): ims = bytearray(qscb2) counter = Counter(qb2=ims, strip=True, gvrsn=Vrsn_2_0) # test with qb2 assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1215,6 +1273,7 @@ def test_counter_v2(): counter = Counter(code=CtrDex.GenericGroup, count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.BigGenericGroup == counter.hard + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1225,6 +1284,7 @@ def test_counter_v2(): counter = Counter(tag=AllTags.GenericGroup, count=count, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.BigGenericGroup + assert counter.tag == AllTags.BigGenericGroup assert counter.count == count assert counter.qb64b == qscb assert counter.qb64 == qsc @@ -1245,6 +1305,7 @@ def test_counter_v2(): count=genverint, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.KERIACDCGenusVersion + assert counter.tag == AllTags.KERIACDCGenusVersion assert counter.count == genverint assert counter.countToB64(l=3) == genver assert counter.countToB64() == genver # default length @@ -1253,11 +1314,15 @@ def test_counter_v2(): assert counter.qb2 == qscb2 assert counter.version == Vrsn_2_0 assert counter.fullSize == 8 + assert counter.codes == counting.CtrDex_2_0 + assert counter.tags == counting.Tags_2_0 + assert counter.sizes == Counter.Sizes[2][0] counter = Counter(code=CtrDex.KERIACDCGenusVersion, countB64=genver, gvrsn=Vrsn_2_0) assert counter.code == CtrDex.KERIACDCGenusVersion + assert counter.tag == AllTags.KERIACDCGenusVersion assert counter.count == genverint assert counter.countToB64(l=3) == genver assert counter.countToB64() == genver # default length diff --git a/tests/core/test_indexing.py b/tests/core/test_indexing.py index 705e7743c..453dab432 100644 --- a/tests/core/test_indexing.py +++ b/tests/core/test_indexing.py @@ -27,15 +27,12 @@ from keri.core.coring import (Verfer,) - - -def test_indexer(): +def test_indexer_class(): """ Test Indexer class """ - assert Indexer.Codex == IdrDex - assert asdict(IdrDex) == { + assert Indexer.Codes == { 'Ed25519_Sig': 'A', 'Ed25519_Crt_Sig': 'B', 'ECDSA_256k1_Sig': 'C', @@ -57,6 +54,30 @@ def test_indexer(): 'TBD4': '4z', } + assert Indexer.Names == \ + { + 'A': 'Ed25519_Sig', + 'B': 'Ed25519_Crt_Sig', + 'C': 'ECDSA_256k1_Sig', + 'D': 'ECDSA_256k1_Crt_Sig', + 'E': 'ECDSA_256r1_Sig', + 'F': 'ECDSA_256r1_Crt_Sig', + '0A': 'Ed448_Sig', + '0B': 'Ed448_Crt_Sig', + '2A': 'Ed25519_Big_Sig', + '2B': 'Ed25519_Big_Crt_Sig', + '2C': 'ECDSA_256k1_Big_Sig', + '2D': 'ECDSA_256k1_Big_Crt_Sig', + '2E': 'ECDSA_256r1_Big_Sig', + '2F': 'ECDSA_256r1_Big_Crt_Sig', + '3A': 'Ed448_Big_Sig', + '3B': 'Ed448_Big_Crt_Sig', + '0z': 'TBD0', + '1z': 'TBD1', + '4z': 'TBD4' + } + + assert IdrDex.Ed25519_Sig == 'A' assert IdrDex.Ed25519_Crt_Sig == 'B' assert IdrDex.ECDSA_256k1_Sig == 'C' @@ -217,6 +238,15 @@ def test_indexer(): ckey = codeB64ToB2(skey) assert Indexer.Bards[ckey] == sval + """End Test""" + + +def test_indexer(): + """ + Test Indexer instance + """ + + with pytest.raises(EmptyMaterialError): indexer = Indexer() @@ -776,6 +806,7 @@ def test_siger(): if __name__ == "__main__": + test_indexer_class() test_indexer() test_siger() From 26c3ba475e27e91fa4e962ce02a2bbccce15b8e0 Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Tue, 16 Apr 2024 21:53:17 -0700 Subject: [PATCH 2/4] added demo tests for annot --- src/keri/core/streaming.py | 169 ++++++++++++++++++++++++++++++++++- src/keri/core/structing.py | 1 + src/keri/kering.py | 4 +- tests/core/test_streaming.py | 43 ++++++++- 4 files changed, 208 insertions(+), 9 deletions(-) diff --git a/src/keri/core/streaming.py b/src/keri/core/streaming.py index b154572d8..8461d3b9a 100644 --- a/src/keri/core/streaming.py +++ b/src/keri/core/streaming.py @@ -10,20 +10,181 @@ from collections import namedtuple from .. import kering +from ..kering import sniff, Colds, Ilks + +from ..help.helping import intToB64 -from .. import help +from .. import help + from . import coring +from .coring import (Matter, Verser, Ilker, Diger, Prefixer, Number, Tholder, + Verfer, Traitor) + +from . import counting +from .counting import Counter + +from . import structing +from .structing import Sealer + +from . import serdering +from .serdering import Serder -def annot(): - """Annotate CESR stream""" +def annot(ims): + """Annotate CESR stream + Returns: + annotation (str): annotation of input CESR stream + Parameters: + ims (str | bytes | bytearray | memoryview): CESR incoming message stream + as qb64 (maybe qb2) + + """ + oms = bytearray() + indent = 0 + + + if not isinstance(ims, bytearray): # going to strip + ims = bytearray(ims) # so make bytearray copy + + while ims: # right now just for KERI event messages + cold = sniff(ims) # check for spurious counters at front of stream + + if cold in Colds.txt: + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # Key Event Counter " + f"{val.name} count={val.count} quadlets\n".encode()) + indent += 1 + # version + val = Verser(qb64b=ims, strip=True) + versage = val.versage + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'v' version Verser {val.name} " + f"proto={versage.proto} vrsn={versage.vrsn.major}." + f"{versage.vrsn.minor:02}\n".encode()) + # ilk + val = Ilker(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 't' message type Ilker " + f"{val.name} Ilk={val.ilk}\n".encode()) + if val.ilk == Ilks.icp: # inception + # icp v='', t='', d='', i='', s='0', kt='0',k=[], nt='0', n=[], bt='0', b=[], c=[], a=[] + # said + val = Diger(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'd' SAID Diger " + f"{val.name} \n".encode()) + # aid pre + val = Prefixer(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'i' AID Prefixer " + f"{val.name} \n".encode()) + # sn + val = Number(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 's' Number " + f"{val.name} sn={val.sn}\n".encode()) + # Signing key threshold + val = Tholder(limen=ims, strip=True) # add qb64 and qb2 to tholder as aliases for limen and limen.decode() + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'kt' " + f"Tholder signing threshold={val.sith}\n".encode()) + # Signing key list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'k' Signing Key " + f"List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Verfer(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # key Verfer " + f"{val.name}\n".encode()) + indent -= 1 + # Rotation key threshold + val = Tholder(limen=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'nt' " + f"Tholder rotation threshold={val.sith}\n".encode()) + # Next key digest list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'n' Rotation Key " + f"Digest List Counter {val.name} count={val.count} " + f"quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Diger(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # key digest Diger" + f" {val.name}\n".encode()) + indent -= 1 + # Witness Backer threshold + val = Tholder(limen=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'bt' " + f"Tholder Backer (witness) threshold={val.sith}\n".encode()) + # Witness Backer list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'b' Backer (witness)" + f"List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Prefixer(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # AID Prefixer " + f"{val.name}\n".encode()) + indent -= 1 + # Config Trait List + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'c' Config Trait " + f"List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Traitor(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # trait Traitor " + f"{val.name} trait={val.trait}\n".encode()) + indent -= 1 + # Seal (anchor) List + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'a' Seal List Counter" + f" {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Counter(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # Seal Counter " + f"{val.name} count={val.count} quadlets\n".encode()) + indent += 1 + subframe = frame[:val.count*4] + del frame[:val.count*4] # strip subframe + clan = Sealer.Clans[Serder.CodeClans[val.code]] + while subframe: + val = Sealer(clan=clan, qb64=subframe, strip=True) # need to add qb64 parameter to structor + oms.extend(f"{' ' * indent * 2}{val.qb64}# seal Sealer {val.name}\n".encode()) + indent += 1 + for i, t in enumerate(val.crew._asdict().items()): + oms.extend(f"{' ' * indent * 2}# '{t[0]}' = " + f"{t[1]}\n".encode()) + indent -= 1 + indent -= 1 + indent -= 1 + + + elif cold in Colds.bny: + pass + + else: + raise kering.ColdStartError("Expecting stream tritet={}" + "".format(cold)) + + return oms.decode() # return unicode string def denot(): - """De-annotate CESR stream""" + """De-annotate CESR stream + + + + """ diff --git a/src/keri/core/structing.py b/src/keri/core/structing.py index b40b30f65..a9ef531f4 100644 --- a/src/keri/core/structing.py +++ b/src/keri/core/structing.py @@ -20,6 +20,7 @@ from .coring import (MapDom, Matter, Diger, Prefixer, Number) + # ToDo Change seal namedtuple definitions to NamedTuple subclasses so can # use typehints on field values which type hints are the primitive types. Use # union | on type hints to allow qb64, qb2, primitive instance, primitive class diff --git a/src/keri/kering.py b/src/keri/kering.py index aee3481a7..7f0b771ad 100644 --- a/src/keri/kering.py +++ b/src/keri/kering.py @@ -250,7 +250,7 @@ def __iter__(self): ColdDex = ColdCodex() # Make instance Coldage = namedtuple("Coldage", 'msg txt bny') # stream cold start status -Colds = Coldage(msg='msg', txt='txt', bny='bny') +Colds = Coldage(msg='msg', txt='txt', bny='bny') # add 'ant' for annotated def sniff(ims): @@ -290,6 +290,8 @@ def sniff(ims): return Colds.txt if tritet in (ColdDex.CtOpB2,): return Colds.bny + #if tritet in (ColdDex.AnB64, ): + raise ColdStartError("Unexpected tritet={} at stream start.".format(tritet)) diff --git a/tests/core/test_streaming.py b/tests/core/test_streaming.py index b32c43344..641553bbf 100644 --- a/tests/core/test_streaming.py +++ b/tests/core/test_streaming.py @@ -19,19 +19,54 @@ from keri.core.streaming import (annot, denot, Streamer) +def test_streamer(): + """Test streamer instance""" + pass + + """End Test""" + + def test_annot(): """Test annot function Annotate""" + ims = bytearray( + b'-FAtYKERICAAXicpEO6lMLcTbUhdpbQVXCh78MShuT_69th6tiZhEbAfPCj4DG9X' + b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-LALDG9XhvcVryHj' + b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-LAAMAAA-LAA-LAA-LAA') + + print(f"incoming = \n{ims}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") + + ims = bytearray( + b'-FDCYKERICAAXicpEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6EMEv' + b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAAAMAAC-LAhDG9XhvcVryHj' + b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQDK58m521o6nwgcluK8Mu2ULvScXM9kB1' + b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-LAh' + b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_EMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUGEEbufBpvagqe9kijKISOoQPYFEOpy22CZJGJqQZp' + b'ZEyPMAAD-LAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' + b'o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnBMOmBoddcrRHShSajb4d60S6RK34' + b'gXZ2WYbr3AiPY1M0-LABXDND-LA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'4fBJre3NGwTQMAAAEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' + b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAABEMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' + b'ZJGJqQZpZEyP') + + print(f"incoming = \n{ims}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") - """End Test""" -def test_streamer(): - """Test streamer instance""" """End Test""" + + if __name__ == "__main__": - test_annot() test_streamer() + test_annot() From 79159fedf8a58cb18f5b036b6df752e268e5ab6c Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Wed, 17 Apr 2024 07:07:06 -0700 Subject: [PATCH 3/4] annotation working for basic KERI key events started on deannotation --- src/keri/core/streaming.py | 145 +++++++++++++++++++++++++++++++++-- src/keri/kering.py | 7 ++ tests/core/test_streaming.py | 78 ++++++++++++++++++- 3 files changed, 221 insertions(+), 9 deletions(-) diff --git a/src/keri/core/streaming.py b/src/keri/core/streaming.py index 8461d3b9a..878a76ecc 100644 --- a/src/keri/core/streaming.py +++ b/src/keri/core/streaming.py @@ -58,6 +58,10 @@ def annot(ims): oms.extend(f"{' ' * indent * 2}{val.qb64} # Key Event Counter " f"{val.name} count={val.count} quadlets\n".encode()) indent += 1 + + # should grab fill message frame here so can verify its consumed + # when done annotating + # version val = Verser(qb64b=ims, strip=True) versage = val.versage @@ -65,23 +69,32 @@ def annot(ims): f"proto={versage.proto} vrsn={versage.vrsn.major}." f"{versage.vrsn.minor:02}\n".encode()) # ilk - val = Ilker(qb64b=ims, strip=True) - oms.extend(f"{' ' * indent * 2}{val.qb64} # 't' message type Ilker " - f"{val.name} Ilk={val.ilk}\n".encode()) - if val.ilk == Ilks.icp: # inception - # icp v='', t='', d='', i='', s='0', kt='0',k=[], nt='0', n=[], bt='0', b=[], c=[], a=[] + ilker = Ilker(qb64b=ims, strip=True) + ilk = ilker.ilk + oms.extend(f"{' ' * indent * 2}{ilker.qb64} # 't' message type Ilker " + f"{ilker.name} Ilk={ilker.ilk}\n".encode()) + + + + if ilk in (Ilks.icp, Ilks.ixn, Ilks.rot, Ilks.dip, Ilks.drt): # said val = Diger(qb64b=ims, strip=True) oms.extend(f"{' ' * indent * 2}{val.qb64} # 'd' SAID Diger " f"{val.name} \n".encode()) + # aid pre val = Prefixer(qb64b=ims, strip=True) oms.extend(f"{' ' * indent * 2}{val.qb64} # 'i' AID Prefixer " f"{val.name} \n".encode()) + # sn val = Number(qb64b=ims, strip=True) oms.extend(f"{' ' * indent * 2}{val.qb64} # 's' Number " f"{val.name} sn={val.sn}\n".encode()) + + if ilk in (Ilks.icp, Ilks.dip): # inception + # v='', t='', d='', i='', s='0', kt='0',k=[], nt='0', n=[], bt='0', b=[], c=[], a=[] + # Signing key threshold val = Tholder(limen=ims, strip=True) # add qb64 and qb2 to tholder as aliases for limen and limen.decode() oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'kt' " @@ -143,6 +156,106 @@ def annot(ims): oms.extend(f"{' ' * indent * 2}{val.qb64} # trait Traitor " f"{val.name} trait={val.trait}\n".encode()) indent -= 1 + + + elif ilk == Ilks.ixn: # Interaction + # v='', t='',d='', i='', s='0', p='', a=[] + # Prior said + val = Diger(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'p' prior SAID Diger " + f"{val.name} \n".encode()) + + + + elif ilk in (Ilks.rot, Ilks.drt): # Rotation + # v='', t='',d='', i='', s='0', p='', kt='0',k=[], nt='0', n=[], bt='0', br=[], ba=[], c=[], a=[] + # Prior said + val = Diger(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'p' prior SAID Diger " + f"{val.name} \n".encode()) + + # Signing key threshold + val = Tholder(limen=ims, strip=True) # add qb64 and qb2 to tholder as aliases for limen and limen.decode() + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'kt' " + f"Tholder signing threshold={val.sith}\n".encode()) + # Signing key list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'k' Signing Key " + f"List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Verfer(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # key Verfer " + f"{val.name}\n".encode()) + indent -= 1 + # Rotation key threshold + val = Tholder(limen=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'nt' " + f"Tholder rotation threshold={val.sith}\n".encode()) + # Next key digest list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'n' Rotation Key " + f"Digest List Counter {val.name} count={val.count} " + f"quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Diger(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # key digest Diger" + f" {val.name}\n".encode()) + indent -= 1 + # Witness Backer threshold + val = Tholder(limen=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.limen.decode()} # 'bt' " + f"Tholder Backer (witness) threshold={val.sith}\n".encode()) + + # Witness Backer Cut list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'b' Backer (witness)" + f"Cut List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Prefixer(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # AID Prefixer " + f"{val.name}\n".encode()) + indent -= 1 + + # Witness Backer Add list + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'b' Backer (witness)" + f"Add List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Prefixer(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # AID Prefixer " + f"{val.name}\n".encode()) + indent -= 1 + + # Config Trait List + val = Counter(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'c' Config Trait " + f"List Counter {val.name} count={val.count} quadlets\n".encode()) + indent += 1 + frame = ims[:val.count*4] # extract frame from ims + del ims[:val.count*4] # strip frame + while frame: + val = Traitor(qb64b=frame, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # trait Traitor " + f"{val.name} trait={val.trait}\n".encode()) + indent -= 1 + + + else: + raise kering.IlkError(f"Unexpected message type={ilk}") + + if ilk in (Ilks.icp, Ilks.ixn, Ilks.rot, Ilks.dip, Ilks.drt): # Seal (anchor) List val = Counter(qb64b=ims, strip=True) oms.extend(f"{' ' * indent * 2}{val.qb64} # 'a' Seal List Counter" @@ -169,6 +282,14 @@ def annot(ims): indent -= 1 indent -= 1 + if ilk == Ilks.dip: + # delegator aid delpre + val = Prefixer(qb64b=ims, strip=True) + oms.extend(f"{' ' * indent * 2}{val.qb64} # 'di' Delegator AID Prefixer " + f"{val.name} \n".encode()) + + if ims: + raise kering.ExtractionError(f"Unexpected remaining bytes in stream.") elif cold in Colds.bny: pass @@ -179,13 +300,23 @@ def annot(ims): return oms.decode() # return unicode string -def denot(): +def denot(ams): """De-annotate CESR stream + Returns: + deannotation (bytes): deannotation of input annotated CESR stream - + Parameters: + ams (str): CESR annotated message stream text """ + oms = bytearray() + + + + + return bytes(oms) + class Streamer: diff --git a/src/keri/kering.py b/src/keri/kering.py index 7f0b771ad..2f277ffd8 100644 --- a/src/keri/kering.py +++ b/src/keri/kering.py @@ -833,6 +833,13 @@ class KindError(ExtractionError): raise KindError("error message") """ +class IlkError(ExtractionError): + """ + Bad or Unsupported Message Type (Ilk) + + Usage: + raise IlkError("error message") + """ class ConversionError(ExtractionError): """ diff --git a/tests/core/test_streaming.py b/tests/core/test_streaming.py index 641553bbf..21e7d12aa 100644 --- a/tests/core/test_streaming.py +++ b/tests/core/test_streaming.py @@ -28,16 +28,19 @@ def test_streamer(): def test_annot(): """Test annot function Annotate""" + + # simple Inception ims = bytearray( b'-FAtYKERICAAXicpEO6lMLcTbUhdpbQVXCh78MShuT_69th6tiZhEbAfPCj4DG9X' b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-LALDG9XhvcVryHj' b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-LAAMAAA-LAA-LAA-LAA') - print(f"incoming = \n{ims}\n") + print(f"incoming = \n{bytes(ims)}\n") ams = annot(ims) # annotated message dream assert not ims print(f"annotated = \n{ams}\n") + # complex inception ims = bytearray( b'-FDCYKERICAAXicpEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6EMEv' b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAAAMAAC-LAhDG9XhvcVryHj' @@ -53,7 +56,78 @@ def test_annot(): b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' b'ZJGJqQZpZEyP') - print(f"incoming = \n{ims}\n") + print(f"incoming = \n{bytes(ims)}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") + + + # interaction + ims = bytearray( + b'-FB6YKERICAAXixnEHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKePEMEv' + b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAABEMEvSn0o6Iv2-3gInTDM' + b'MDTV0qQEfooM-yTzkj6Kynn6-LBU-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'4fBJre3NGwTQMAACEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' + b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAAiEMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMABDEEbufBpvagqe9kijKISOoQPYFEOpy22C' + b'ZJGJqQZpZEyP-RAXDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MACA' + b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_') + + print(f"incoming = \n{bytes(ims)}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") + + + # Rotation + ims = bytearray( + b'-FCGYKERICAAXrotEDtBwgOB0uGrSMBJhOmnkRoCupjg-4sJApvOx04ujhKsEMEv' + b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAACEHeLJVa4LLNRRYVkLQsX' + b'HIDvllcmhDaahe5a_oMvXKePMAAC-LAhDH7p14xo09rob5cEupmo8jSDi35ZOGt1' + b'k4t2nm1C1A68DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQDKhYdMBe' + b'P6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMERMAAC-LAhEBvDSpcj3y0y9W2-1GzY' + b'J85KEkDIPxu4y_TxAK49k7ciEEb97lh2oOd_yM3meBaRX5xSs8mIeBoPdhOTgVkd' + b'31jbECQTrhKHgrOXJS4kdvifvOqoJ7RjfJSsN3nshclYStgaMAAD-LALBG9XhvcV' + b'ryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ-LALBH7p14xo09rob5cEupmo8jSD' + b'i35ZOGt1k4t2nm1C1A68-LAA-LAA') + + print(f"incoming = \n{bytes(ims)}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") + + # Delegated Inception + ims = bytearray( + b'-FDeYKERICAAXdipECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TECQs' + b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAAA4AADA1s2c1s2c1s2-LAh' + b'DIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uVDN7WiKyjLLBTK92xayCu' + b'ddZsBuwPmD2BKrl83h1xEUtiDOE5jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl' + b'5nfY4AADA1s2c1s2c1s2-LAhEKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ' + b'44DSEC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZEHgewy_ymPxtSFwu' + b'X2KaI_mPmoIUkxClviX3f-M38kCDMAAD-LAhBIR8GACw4z2GC5_XoReU4DMKbqi6' + b'-EdbgDZUAobRb8uVBN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiBOE5' + b'jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl5nfY-LAA-LBI-RAuDIR8GACw4z2G' + b'C5_XoReU4DMKbqi6-EdbgDZUAobRb8uVMAADEKFoJ9Conb37zSn8zHLKP3YwHbeQ' + b'iD1D9Qx0MagJ44DSDN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiMAAE' + b'EC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZ-QAYMAAVEHgewy_ymPxt' + b'SFwuX2KaI_mPmoIUkxClviX3f-M38kCDMD4SEKFoJ9Conb37zSn8zHLKP3YwHbeQ' + b'iD1D9Qx0MagJ44DSEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6') + + print(f"incoming = \n{bytes(ims)}\n") + ams = annot(ims) # annotated message dream + assert not ims + print(f"annotated = \n{ams}\n") + + # Delegated Rotatation + ims = bytearray( + b'-FBaYKERICAAXdrtEKwDKG0L9pAMbzV2e31-I5ObiEfkptfs8VqXYiHGCL1vECQs' + b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAABECQs0t3_GL7-B3q4kMU-' + b'qLeRCugTFjrxR15mxUwYWp8TMAAB-LALDJ0pLe3f2zGus0Va1dqWAnukWdZHGNWl' + b'K9NciJop9N4fMAAB-LALENX_LTL97uOSOkA1PEzam9vtmCLPprnbcpi71wXpmhFF' + b'MAAD-LALBIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uV-LALBJ0pLe3f' + b'2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f-LAA-LAA') + + print(f"incoming = \n{bytes(ims)}\n") ams = annot(ims) # annotated message dream assert not ims print(f"annotated = \n{ams}\n") From 61f333734249a141ccf9bc3607e39149ffd6d92c Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Wed, 1 May 2024 07:43:19 -0600 Subject: [PATCH 4/4] fixed typo in new count code table and fixed related code and tests. wrong code for list. --- src/keri/core/counting.py | 4 +- src/keri/core/streaming.py | 20 ++-- tests/core/test_counting.py | 4 +- tests/core/test_serdering.py | 121 ++++++++++--------- tests/core/test_streaming.py | 224 ++++++++++++++++++++++------------- 5 files changed, 217 insertions(+), 156 deletions(-) diff --git a/src/keri/core/counting.py b/src/keri/core/counting.py index 9dee9fe14..cd14e01cd 100644 --- a/src/keri/core/counting.py +++ b/src/keri/core/counting.py @@ -102,8 +102,8 @@ class CounterCodex_2_0(MapDom): BigMapMessageBodyGroup: str = '-0G' # Big Field Map Message Body Group (Universal). GenericMapGroup: str = '-H' # Generic Field Map Group (Universal). BigGenericMapGroup: str = '-0H' # Big Generic Field Map Group (Universal). - GenericListGroup: str = '-L' # Generic List Group (Universal). - BigGenericListGroup: str = '-0L' # Big Generic List Group (Universal). + GenericListGroup: str = '-I' # Generic List Group (Universal). + BigGenericListGroup: str = '-0I' # Big Generic List Group (Universal). ControllerIdxSigs: str = '-J' # Controller Indexed Signature(s) of qb64. BigControllerIdxSigs: str = '-0J' # Big Controller Indexed Signature(s) of qb64. WitnessIdxSigs: str = '-K' # Witness Indexed Signature(s) of qb64. diff --git a/src/keri/core/streaming.py b/src/keri/core/streaming.py index 878a76ecc..617a74d21 100644 --- a/src/keri/core/streaming.py +++ b/src/keri/core/streaming.py @@ -304,19 +304,21 @@ def denot(ams): """De-annotate CESR stream Returns: - deannotation (bytes): deannotation of input annotated CESR stream + dms (bytes): deannotation of input annotated CESR message stream Parameters: ams (str): CESR annotated message stream text """ - - oms = bytearray() - - - - - return bytes(oms) - + dms = bytearray() # deannotated message stream + lines = ams.splitlines() + for line in lines: + line = line.strip() + front, sep, back = line.partition('#') # finde comment if any + front = front.strip() # non-commented portion strip white space + if front: + dms.extend(front.encode()) + + return bytes(dms) class Streamer: diff --git a/tests/core/test_counting.py b/tests/core/test_counting.py index bec518824..7887a610f 100644 --- a/tests/core/test_counting.py +++ b/tests/core/test_counting.py @@ -98,8 +98,8 @@ def test_codexes_tags(): 'BigMapMessageBodyGroup': '-0G', 'GenericMapGroup': '-H', 'BigGenericMapGroup': '-0H', - 'GenericListGroup': '-L', - 'BigGenericListGroup': '-0L', + 'GenericListGroup': '-I', + 'BigGenericListGroup': '-0I', 'ControllerIdxSigs': '-J', 'BigControllerIdxSigs': '-0J', 'WitnessIdxSigs': '-K', diff --git a/tests/core/test_serdering.py b/tests/core/test_serdering.py index 6cdddfc31..5ca21c30c 100644 --- a/tests/core/test_serdering.py +++ b/tests/core/test_serdering.py @@ -2698,7 +2698,7 @@ def test_cesr_native_dumps(): { 'v': 'KERICAACESRAAAA.', 't': 'icp', - 'd': 'EO6lMLcTbUhdpbQVXCh78MShuT_69th6tiZhEbAfPCj4', + 'd': 'EEx4oxGYbNrd6nZsdGu2KdN4MSDGD5IWS7hXjST7r8ew', 'i': 'DG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ', 's': '0', 'kt': '1', @@ -2711,9 +2711,10 @@ def test_cesr_native_dumps(): 'a': [] } - assert serder.raw == (b'-FAtYKERICAAXicpEO6lMLcTbUhdpbQVXCh78MShuT_69th6tiZhEbAfPCj4DG9X' - b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-LALDG9XhvcVryHj' - b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-LAAMAAA-LAA-LAA-LAA') + + assert serder.raw == (b'-FAtYKERICAAXicpEEx4oxGYbNrd6nZsdGu2KdN4MSDGD5IWS7hXjST7r8ewDG9X' + b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-IALDG9XhvcVryHj' + b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-IAAMAAA-IAA-IAA-IAA') assert len(serder.raw) == serder.size == 184 sizeh = serder.raw[2:4] assert sizeh == b"At" @@ -2779,7 +2780,7 @@ def test_cesr_native_dumps(): kind=kering.Serials.cesr) pre = serder.pre - assert pre == 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6' + assert pre == 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi' said = serder.said assert said == pre @@ -2787,8 +2788,8 @@ def test_cesr_native_dumps(): { 'v': 'KERICAACESRAAAA.', 't': 'icp', - 'd': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6', - 'i': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6', + 'd': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi', + 'i': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi', 's': '0', 'kt': '2', 'k': @@ -2831,15 +2832,15 @@ def test_cesr_native_dumps(): ] } - assert serder.raw == (b'-FDCYKERICAAXicpEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6EMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAAAMAAC-LAhDG9XhvcVryHj' + assert serder.raw == (b'-FDCYKERICAAXicpEKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiEKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAAAMAAC-IAhDG9XhvcVryHj' b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQDK58m521o6nwgcluK8Mu2ULvScXM9kB1' - b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-LAh' + b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-IAh' b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_EMrowWRk6u1imR32ZNHn' b'TPUtc7uSAvrchIPN3I8S6vUGEEbufBpvagqe9kijKISOoQPYFEOpy22CZJGJqQZp' - b'ZEyPMAAD-LAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' + b'ZEyPMAAD-IAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' b'o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnBMOmBoddcrRHShSajb4d60S6RK34' - b'gXZ2WYbr3AiPY1M0-LABXDND-LA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'gXZ2WYbr3AiPY1M0-IABXDND-IA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' b'4fBJre3NGwTQMAAAEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAABEMrowWRk6u1imR32ZNHn' b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' @@ -2852,21 +2853,22 @@ def test_cesr_native_dumps(): rawqb64 = serder._dumps() # default is it dumps self.sad assert rawqb64 == serder.raw - assert rawqb64 == (b'-FDCYKERICAAXicpEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6EMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAAAMAAC-LAhDG9XhvcVryHj' + assert rawqb64 == (b'-FDCYKERICAAXicpEKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiEKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAAAMAAC-IAhDG9XhvcVryHj' b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQDK58m521o6nwgcluK8Mu2ULvScXM9kB1' - b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-LAh' + b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-IAh' b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_EMrowWRk6u1imR32ZNHn' b'TPUtc7uSAvrchIPN3I8S6vUGEEbufBpvagqe9kijKISOoQPYFEOpy22CZJGJqQZp' - b'ZEyPMAAD-LAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' + b'ZEyPMAAD-IAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' b'o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnBMOmBoddcrRHShSajb4d60S6RK34' - b'gXZ2WYbr3AiPY1M0-LABXDND-LA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'gXZ2WYbr3AiPY1M0-IABXDND-IA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' b'4fBJre3NGwTQMAAAEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAABEMrowWRk6u1imR32ZNHn' b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' b'ZJGJqQZpZEyP') + assert len(rawqb64) == 780 rawqb2 = decodeB64(rawqb64) @@ -2931,16 +2933,16 @@ def test_cesr_native_dumps(): kind=kering.Serials.cesr) said = serder.said - assert said == 'EHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKeP' + assert said == 'EHXLwMJsZLyG643VW8Do1cqqiMxD_E65Mc3Z1we6vTaR' assert serder.sad == \ { 'v': 'KERICAACESRAAAA.', 't': 'ixn', - 'd': 'EHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKeP', - 'i': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6', + 'd': 'EHXLwMJsZLyG643VW8Do1cqqiMxD_E65Mc3Z1we6vTaR', + 'i': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi', 's': '1', - 'p': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6', + 'p': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi', 'a': [ { @@ -2965,9 +2967,9 @@ def test_cesr_native_dumps(): ] } - assert serder.raw == (b'-FB6YKERICAAXixnEHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKePEMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAABEMEvSn0o6Iv2-3gInTDM' - b'MDTV0qQEfooM-yTzkj6Kynn6-LBU-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + assert serder.raw == (b'-FB6YKERICAAXixnEHXLwMJsZLyG643VW8Do1cqqiMxD_E65Mc3Z1we6vTaREKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAABEKIuA20I5q6IrgAHrX-g' + b'kAt4Og17Ebu5CDBrRvh8RToi-IBU-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' b'4fBJre3NGwTQMAACEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAAiEMrowWRk6u1imR32ZNHn' b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMABDEEbufBpvagqe9kijKISOoQPYFEOpy22C' @@ -3025,20 +3027,23 @@ def test_cesr_native_dumps(): kind=kering.Serials.cesr) said = serder.said - assert said == 'EDtBwgOB0uGrSMBJhOmnkRoCupjg-4sJApvOx04ujhKs' + assert said == 'EDHlTlOcSXZInbTE4iXzb1iFjZcxJZn3C3UXhckb3uQm' assert serder.sad == \ { 'v': 'KERICAACESRAAAA.', 't': 'rot', - 'd': 'EDtBwgOB0uGrSMBJhOmnkRoCupjg-4sJApvOx04ujhKs', - 'i': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6', + 'd': 'EDHlTlOcSXZInbTE4iXzb1iFjZcxJZn3C3UXhckb3uQm', + 'i': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi', 's': '2', - 'p': 'EHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKeP', + 'p': 'EHXLwMJsZLyG643VW8Do1cqqiMxD_E65Mc3Z1we6vTaR', 'kt': '2', - 'k': ['DH7p14xo09rob5cEupmo8jSDi35ZOGt1k4t2nm1C1A68', - 'DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQ', - 'DKhYdMBeP6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMER'], + 'k': + [ + 'DH7p14xo09rob5cEupmo8jSDi35ZOGt1k4t2nm1C1A68', + 'DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQ', + 'DKhYdMBeP6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMER' + ], 'nt': '2', 'n': [ @@ -3054,15 +3059,15 @@ def test_cesr_native_dumps(): } - assert serder.raw == (b'-FCGYKERICAAXrotEDtBwgOB0uGrSMBJhOmnkRoCupjg-4sJApvOx04ujhKsEMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAACEHeLJVa4LLNRRYVkLQsX' - b'HIDvllcmhDaahe5a_oMvXKePMAAC-LAhDH7p14xo09rob5cEupmo8jSDi35ZOGt1' + assert serder.raw == (b'-FCGYKERICAAXrotEDHlTlOcSXZInbTE4iXzb1iFjZcxJZn3C3UXhckb3uQmEKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAACEHXLwMJsZLyG643VW8Do' + b'1cqqiMxD_E65Mc3Z1we6vTaRMAAC-IAhDH7p14xo09rob5cEupmo8jSDi35ZOGt1' b'k4t2nm1C1A68DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQDKhYdMBe' - b'P6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMERMAAC-LAhEBvDSpcj3y0y9W2-1GzY' + b'P6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMERMAAC-IAhEBvDSpcj3y0y9W2-1GzY' b'J85KEkDIPxu4y_TxAK49k7ciEEb97lh2oOd_yM3meBaRX5xSs8mIeBoPdhOTgVkd' - b'31jbECQTrhKHgrOXJS4kdvifvOqoJ7RjfJSsN3nshclYStgaMAAD-LALBG9XhvcV' - b'ryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ-LALBH7p14xo09rob5cEupmo8jSD' - b'i35ZOGt1k4t2nm1C1A68-LAA-LAA') + b'31jbECQTrhKHgrOXJS4kdvifvOqoJ7RjfJSsN3nshclYStgaMAAD-IALBG9XhvcV' + b'ryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ-IALBH7p14xo09rob5cEupmo8jSD' + b'i35ZOGt1k4t2nm1C1A68-IAA-IAA') assert len(serder.raw) == serder.size == 540 sizeh = serder.raw[2:4] @@ -3138,7 +3143,7 @@ def test_cesr_native_dumps(): kind=kering.Serials.cesr) pre = serder.pre - assert pre == 'ECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8T' + assert pre == 'EKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjC' said = serder.said assert said == pre @@ -3146,8 +3151,8 @@ def test_cesr_native_dumps(): { 'v': 'KERICAACESRAAAA.', 't': 'dip', - 'd': 'ECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8T', - 'i': 'ECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8T', + 'd': 'EKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjC', + 'i': 'EKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjC', 's': '0', 'kt': ['1/2', '1/2', '1/2'], 'k': @@ -3192,24 +3197,24 @@ def test_cesr_native_dumps(): 'd': 'EKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ44DS' } ], - 'di': 'EMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6' + 'di': 'EKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi' } - assert serder.raw == (b'-FDeYKERICAAXdipECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TECQs' - b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAAA4AADA1s2c1s2c1s2-LAh' + assert serder.raw == (b'-FDeYKERICAAXdipEKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCEKCF' + b'Mk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCMAAA4AADA1s2c1s2c1s2-IAh' b'DIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uVDN7WiKyjLLBTK92xayCu' b'ddZsBuwPmD2BKrl83h1xEUtiDOE5jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl' - b'5nfY4AADA1s2c1s2c1s2-LAhEKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ' + b'5nfY4AADA1s2c1s2c1s2-IAhEKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ' b'44DSEC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZEHgewy_ymPxtSFwu' - b'X2KaI_mPmoIUkxClviX3f-M38kCDMAAD-LAhBIR8GACw4z2GC5_XoReU4DMKbqi6' + b'X2KaI_mPmoIUkxClviX3f-M38kCDMAAD-IAhBIR8GACw4z2GC5_XoReU4DMKbqi6' b'-EdbgDZUAobRb8uVBN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiBOE5' - b'jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl5nfY-LAA-LBI-RAuDIR8GACw4z2G' + b'jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl5nfY-IAA-IBI-RAuDIR8GACw4z2G' b'C5_XoReU4DMKbqi6-EdbgDZUAobRb8uVMAADEKFoJ9Conb37zSn8zHLKP3YwHbeQ' b'iD1D9Qx0MagJ44DSDN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiMAAE' b'EC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZ-QAYMAAVEHgewy_ymPxt' b'SFwuX2KaI_mPmoIUkxClviX3f-M38kCDMD4SEKFoJ9Conb37zSn8zHLKP3YwHbeQ' - b'iD1D9Qx0MagJ44DSEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6') + b'iD1D9Qx0MagJ44DSEKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi') assert len(serder.raw) == serder.size == 892 sizeh = serder.raw[2:4] @@ -3264,16 +3269,16 @@ def test_cesr_native_dumps(): kind=kering.Serials.cesr) said = serder.said - assert said == 'EKwDKG0L9pAMbzV2e31-I5ObiEfkptfs8VqXYiHGCL1v' + assert said == 'EKfRY6YrpqUU0HyKWMGvNtzuZCaeMcIBrdKzHAqpmtTA' assert serder.sad == \ { 'v': 'KERICAACESRAAAA.', 't': 'drt', - 'd': 'EKwDKG0L9pAMbzV2e31-I5ObiEfkptfs8VqXYiHGCL1v', - 'i': 'ECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8T', + 'd': 'EKfRY6YrpqUU0HyKWMGvNtzuZCaeMcIBrdKzHAqpmtTA', + 'i': 'EKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjC', 's': '1', - 'p': 'ECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8T', + 'p': 'EKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjC', 'kt': '1', 'k': ['DJ0pLe3f2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f'], 'nt': '1', @@ -3285,13 +3290,13 @@ def test_cesr_native_dumps(): 'a': {} } + assert serder.raw == (b'-FBaYKERICAAXdrtEKfRY6YrpqUU0HyKWMGvNtzuZCaeMcIBrdKzHAqpmtTAEKCF' + b'Mk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCMAABEKCFMk4nmn3t8jdC1pB_' + b'-Qmp7w8EROvdYaxgru7vHOjCMAAB-IALDJ0pLe3f2zGus0Va1dqWAnukWdZHGNWl' + b'K9NciJop9N4fMAAB-IALENX_LTL97uOSOkA1PEzam9vtmCLPprnbcpi71wXpmhFF' + b'MAAD-IALBIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uV-IALBJ0pLe3f' + b'2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f-IAA-IAA') - assert serder.raw == (b'-FBaYKERICAAXdrtEKwDKG0L9pAMbzV2e31-I5ObiEfkptfs8VqXYiHGCL1vECQs' - b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAABECQs0t3_GL7-B3q4kMU-' - b'qLeRCugTFjrxR15mxUwYWp8TMAAB-LALDJ0pLe3f2zGus0Va1dqWAnukWdZHGNWl' - b'K9NciJop9N4fMAAB-LALENX_LTL97uOSOkA1PEzam9vtmCLPprnbcpi71wXpmhFF' - b'MAAD-LALBIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uV-LALBJ0pLe3f' - b'2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f-LAA-LAA') assert len(serder.raw) == serder.size == 364 sizeh = serder.raw[2:4] diff --git a/tests/core/test_streaming.py b/tests/core/test_streaming.py index 21e7d12aa..60b3ecc47 100644 --- a/tests/core/test_streaming.py +++ b/tests/core/test_streaming.py @@ -3,7 +3,7 @@ tests.core.test_streaming module """ - +from binascii import unhexlify import pytest @@ -12,7 +12,8 @@ from keri.help import helping -from keri.core import (Matter, ) +from keri.core import (Matter,) +from keri.core.coring import dumps from keri.core import streaming @@ -30,107 +31,160 @@ def test_annot(): """Test annot function Annotate""" # simple Inception - ims = bytearray( - b'-FAtYKERICAAXicpEO6lMLcTbUhdpbQVXCh78MShuT_69th6tiZhEbAfPCj4DG9X' - b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-LALDG9XhvcVryHj' - b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-LAAMAAA-LAA-LAA-LAA') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FAtYKERICAAXicpEEx4oxGYbNrd6nZsdGu2KdN4MSDGD5IWS7hXjST7r8ewDG9X' + b'hvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAAMAAB-IALDG9XhvcVryHj' + b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQMAAA-IAAMAAA-IAA-IAA-IAA') + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims # complex inception - ims = bytearray( - b'-FDCYKERICAAXicpEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6EMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAAAMAAC-LAhDG9XhvcVryHj' - b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQDK58m521o6nwgcluK8Mu2ULvScXM9kB1' - b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-LAh' - b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_EMrowWRk6u1imR32ZNHn' - b'TPUtc7uSAvrchIPN3I8S6vUGEEbufBpvagqe9kijKISOoQPYFEOpy22CZJGJqQZp' - b'ZEyPMAAD-LAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' - b'o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnBMOmBoddcrRHShSajb4d60S6RK34' - b'gXZ2WYbr3AiPY1M0-LABXDND-LA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' - b'4fBJre3NGwTQMAAAEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' - b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAABEMrowWRk6u1imR32ZNHn' - b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' - b'ZJGJqQZpZEyP') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FDCYKERICAAXicpEKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiEKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAAAMAAC-IAhDG9XhvcVryHj' + b'oIGcj5nK4sAE3oslQHWi4fBJre3NGwTQDK58m521o6nwgcluK8Mu2ULvScXM9kB1' + b'bSORrxNSS9cnDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MAAC-IAh' + b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_EMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUGEEbufBpvagqe9kijKISOoQPYFEOpy22CZJGJqQZp' + b'ZEyPMAAD-IAhBG9XhvcVryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQBK58m521' + b'o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnBMOmBoddcrRHShSajb4d60S6RK34' + b'gXZ2WYbr3AiPY1M0-IABXDND-IA8-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'4fBJre3NGwTQMAAAEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' + b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAABEMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMAAPEEbufBpvagqe9kijKISOoQPYFEOpy22C' + b'ZJGJqQZpZEyP') + + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims # interaction - ims = bytearray( - b'-FB6YKERICAAXixnEHeLJVa4LLNRRYVkLQsXHIDvllcmhDaahe5a_oMvXKePEMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAABEMEvSn0o6Iv2-3gInTDM' - b'MDTV0qQEfooM-yTzkj6Kynn6-LBU-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' - b'4fBJre3NGwTQMAACEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' - b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAAiEMrowWRk6u1imR32ZNHn' - b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMABDEEbufBpvagqe9kijKISOoQPYFEOpy22C' - b'ZJGJqQZpZEyP-RAXDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MACA' - b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FB6YKERICAAXixnEHXLwMJsZLyG643VW8Do1cqqiMxD_E65Mc3Z1we6vTaREKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAABEKIuA20I5q6IrgAHrX-g' + b'kAt4Og17Ebu5CDBrRvh8RToi-IBU-RAuDG9XhvcVryHjoIGcj5nK4sAE3oslQHWi' + b'4fBJre3NGwTQMAACEB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_DK58' + b'm521o6nwgcluK8Mu2ULvScXM9kB1bSORrxNSS9cnMAAiEMrowWRk6u1imR32ZNHn' + b'TPUtc7uSAvrchIPN3I8S6vUG-QAMMABDEEbufBpvagqe9kijKISOoQPYFEOpy22C' + b'ZJGJqQZpZEyP-RAXDMOmBoddcrRHShSajb4d60S6RK34gXZ2WYbr3AiPY1M0MACA' + b'EB9O4V-zUteZJJFubu1h0xMtzt0wuGpLMVj1sKVsElA_') + + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims # Rotation - ims = bytearray( - b'-FCGYKERICAAXrotEDtBwgOB0uGrSMBJhOmnkRoCupjg-4sJApvOx04ujhKsEMEv' - b'Sn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6MAACEHeLJVa4LLNRRYVkLQsX' - b'HIDvllcmhDaahe5a_oMvXKePMAAC-LAhDH7p14xo09rob5cEupmo8jSDi35ZOGt1' - b'k4t2nm1C1A68DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQDKhYdMBe' - b'P6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMERMAAC-LAhEBvDSpcj3y0y9W2-1GzY' - b'J85KEkDIPxu4y_TxAK49k7ciEEb97lh2oOd_yM3meBaRX5xSs8mIeBoPdhOTgVkd' - b'31jbECQTrhKHgrOXJS4kdvifvOqoJ7RjfJSsN3nshclYStgaMAAD-LALBG9XhvcV' - b'ryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ-LALBH7p14xo09rob5cEupmo8jSD' - b'i35ZOGt1k4t2nm1C1A68-LAA-LAA') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FCGYKERICAAXrotEDHlTlOcSXZInbTE4iXzb1iFjZcxJZn3C3UXhckb3uQmEKIu' + b'A20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToiMAACEHXLwMJsZLyG643VW8Do' + b'1cqqiMxD_E65Mc3Z1we6vTaRMAAC-IAhDH7p14xo09rob5cEupmo8jSDi35ZOGt1' + b'k4t2nm1C1A68DIAdqJzLWEwQbhXEMOFjvFVZ7oMCJP4XXDP_ILaTEBAQDKhYdMBe' + b'P6FoH3ajGJTf_4fH229rm_lTZXfYkfwGTMERMAAC-IAhEBvDSpcj3y0y9W2-1GzY' + b'J85KEkDIPxu4y_TxAK49k7ciEEb97lh2oOd_yM3meBaRX5xSs8mIeBoPdhOTgVkd' + b'31jbECQTrhKHgrOXJS4kdvifvOqoJ7RjfJSsN3nshclYStgaMAAD-IALBG9XhvcV' + b'ryHjoIGcj5nK4sAE3oslQHWi4fBJre3NGwTQ-IALBH7p14xo09rob5cEupmo8jSD' + b'i35ZOGt1k4t2nm1C1A68-IAA-IAA') + + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims + # Delegated Inception - ims = bytearray( - b'-FDeYKERICAAXdipECQs0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TECQs' - b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAAA4AADA1s2c1s2c1s2-LAh' - b'DIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uVDN7WiKyjLLBTK92xayCu' - b'ddZsBuwPmD2BKrl83h1xEUtiDOE5jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl' - b'5nfY4AADA1s2c1s2c1s2-LAhEKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ' - b'44DSEC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZEHgewy_ymPxtSFwu' - b'X2KaI_mPmoIUkxClviX3f-M38kCDMAAD-LAhBIR8GACw4z2GC5_XoReU4DMKbqi6' - b'-EdbgDZUAobRb8uVBN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiBOE5' - b'jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl5nfY-LAA-LBI-RAuDIR8GACw4z2G' - b'C5_XoReU4DMKbqi6-EdbgDZUAobRb8uVMAADEKFoJ9Conb37zSn8zHLKP3YwHbeQ' - b'iD1D9Qx0MagJ44DSDN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiMAAE' - b'EC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZ-QAYMAAVEHgewy_ymPxt' - b'SFwuX2KaI_mPmoIUkxClviX3f-M38kCDMD4SEKFoJ9Conb37zSn8zHLKP3YwHbeQ' - b'iD1D9Qx0MagJ44DSEMEvSn0o6Iv2-3gInTDMMDTV0qQEfooM-yTzkj6Kynn6') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FDeYKERICAAXdipEKCFMk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCEKCF' + b'Mk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCMAAA4AADA1s2c1s2c1s2-IAh' + b'DIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uVDN7WiKyjLLBTK92xayCu' + b'ddZsBuwPmD2BKrl83h1xEUtiDOE5jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl' + b'5nfY4AADA1s2c1s2c1s2-IAhEKFoJ9Conb37zSn8zHLKP3YwHbeQiD1D9Qx0MagJ' + b'44DSEC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZEHgewy_ymPxtSFwu' + b'X2KaI_mPmoIUkxClviX3f-M38kCDMAAD-IAhBIR8GACw4z2GC5_XoReU4DMKbqi6' + b'-EdbgDZUAobRb8uVBN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiBOE5' + b'jmI9ktNSAddEke1rH2cGMDq4uYmyagDkAzHl5nfY-IAA-IBI-RAuDIR8GACw4z2G' + b'C5_XoReU4DMKbqi6-EdbgDZUAobRb8uVMAADEKFoJ9Conb37zSn8zHLKP3YwHbeQ' + b'iD1D9Qx0MagJ44DSDN7WiKyjLLBTK92xayCuddZsBuwPmD2BKrl83h1xEUtiMAAE' + b'EC7sCVf_rYJ_khIj7UdlzrtemP31TuHTPUsGjvWni8GZ-QAYMAAVEHgewy_ymPxt' + b'SFwuX2KaI_mPmoIUkxClviX3f-M38kCDMD4SEKFoJ9Conb37zSn8zHLKP3YwHbeQ' + b'iD1D9Qx0MagJ44DSEKIuA20I5q6IrgAHrX-gkAt4Og17Ebu5CDBrRvh8RToi') + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims + # Delegated Rotatation - ims = bytearray( - b'-FBaYKERICAAXdrtEKwDKG0L9pAMbzV2e31-I5ObiEfkptfs8VqXYiHGCL1vECQs' - b'0t3_GL7-B3q4kMU-qLeRCugTFjrxR15mxUwYWp8TMAABECQs0t3_GL7-B3q4kMU-' - b'qLeRCugTFjrxR15mxUwYWp8TMAAB-LALDJ0pLe3f2zGus0Va1dqWAnukWdZHGNWl' - b'K9NciJop9N4fMAAB-LALENX_LTL97uOSOkA1PEzam9vtmCLPprnbcpi71wXpmhFF' - b'MAAD-LALBIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uV-LALBJ0pLe3f' - b'2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f-LAA-LAA') - - print(f"incoming = \n{bytes(ims)}\n") - ams = annot(ims) # annotated message dream - assert not ims + ims = (b'-FBaYKERICAAXdrtEKfRY6YrpqUU0HyKWMGvNtzuZCaeMcIBrdKzHAqpmtTAEKCF' + b'Mk4nmn3t8jdC1pB_-Qmp7w8EROvdYaxgru7vHOjCMAABEKCFMk4nmn3t8jdC1pB_' + b'-Qmp7w8EROvdYaxgru7vHOjCMAAB-IALDJ0pLe3f2zGus0Va1dqWAnukWdZHGNWl' + b'K9NciJop9N4fMAAB-IALENX_LTL97uOSOkA1PEzam9vtmCLPprnbcpi71wXpmhFF' + b'MAAD-IALBIR8GACw4z2GC5_XoReU4DMKbqi6-EdbgDZUAobRb8uV-IALBJ0pLe3f' + b'2zGus0Va1dqWAnukWdZHGNWlK9NciJop9N4f-IAA-IAA') + + + bms = bytearray(ims) # make copy + print(f"incoming = \n{ims}\n") + ams = annot(bms) # annotated message dream + assert not bms print(f"annotated = \n{ams}\n") + dms = denot(ams) + assert dms == ims + + # JWK https://connect2id.com/products/nimbus-jose-jwt/examples/jwk-generation#okp + # ED25519 EDDSA + djwk = { + "kty" : "OKP", + "crv" : "Ed25519", + "x" : "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "d" : "nWGxne_9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A", + "use" : "sig", + "kid" : "FdFYFzERwC2uCBB46pZQi4GG85LujR8obt-KWRBICVQ" + } + + jwk = dumps(djwk, kering.Serials.json) + assert jwk == (b'{"kty":"OKP","crv":"Ed25519","x":"11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHUR' + b'o","d":"nWGxne_9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A","use":"sig","kid":"FdFY' + b'FzERwC2uCBB46pZQi4GG85LujR8obt-KWRBICVQ"}') + + assert len(jwk) == 193 + assert 193 - 44 == 149 + + # ECDSA Example + # https://pycose.readthedocs.io/en/latest/pycose/keys/ec2.html + + ckat = { + 'KTY': 'EC2', + 'CURVE': 'P_256', + 'ALG': 'ES256', + 'D': unhexlify(b'57c92077664146e876760c9520d054aa93c3afb04e306705db6090308507b4d3') + } + + + ck = (b'\xa6\x01\x02\x03&\x01!X\xba\xc5\xb1\x1c\xad\x8f\x99\xf9\xc7+\x05\xcfK\x9e&\xd2D\xdc\x18\x9ftR(%Z!\x9a\x86\xd6\xa0\x9e\xffX\x13\x8b\xf8-\xc1\xb6\xd5b\xbe\x0f\xa5J\xb7\x80J:d\xb6\xd7,\xcf\xedko\xb6\xed(\xbb\xfc\x11~#XW\xc9 wfAF\xe8vv\x0c\x95\xd0T\xaa\x93\xc3\xaf\xb0N0g\x05\xdb`\x900\x85\x07\xb4\xd3') + assert len(ck) == 105 + assert 105 - 36 == 69 +