From f01cd578666ddfd4ec775406156c4bdeb79ea67a Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Thu, 30 Nov 2023 13:45:58 -0700 Subject: [PATCH 1/2] rebased from Phil --- src/keri/core/coring.py | 17 ++++++++++------- tests/core/test_coring.py | 16 +++++++++------- tests/core/test_serdering.py | 33 ++++++++++++++++++++------------- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/keri/core/coring.py b/src/keri/core/coring.py index e8d0c0ad1..0da19bca5 100644 --- a/src/keri/core/coring.py +++ b/src/keri/core/coring.py @@ -423,13 +423,14 @@ class MatterCodex: X25519_Private: str = 'O' # X25519 private decryption key converted from Ed25519 X25519_Cipher_Seed: str = 'P' # X25519 sealed box 124 char b64 Cipher of 44 char qb64 Seed ECDSA_256r1_Seed: str = "Q" # ECDSA secp256r1 256 bit random Seed for private key - Trait3: str = 'R' # Trait as 3 char B64 encoded like 'DND' + Bext3: str = 'R' # Bext3 3 B64 encoded chars for Packet Type, SemVer, Trait like 'DND' Large: str = 'S' # Large 5 byte b2 number Tall: str = 'T' # Tall 11 byte b2 number Great: str = 'U' # Great 14 byte b2 number Vast: str = 'V' # Vast 17 byte b2 number - Tag1: str = 'W' # Tag as one char (bytes) field map label - Tag2: str = 'X' # Tag as two char (bytes) field map label + Tag1: str = 'W' # Tag1 as one char (bytes) field map label lead size 1 + Tag2: str = 'X' # Tag2 as two char (bytes) field map label lead size 0 + Bext7: str = 'Y' # Bext7 7 B64 encoded chars for packet kind and version KERIVVV Salt_128: str = '0A' # 128 bit random salt or 128 bit number (see Huge) Ed25519_Sig: str = '0B' # Ed25519 signature. ECDSA_256k1_Sig: str = '0C' # ECDSA secp256k1 signature. @@ -439,8 +440,8 @@ class MatterCodex: SHA2_512: str = '0G' # SHA2 512 bit digest self-addressing derivation. Long: str = '0H' # Long 4 byte b2 number ECDSA_256r1_Sig: str = '0I' # ECDSA secp256r1 signature. - Version: str = '0J' # Base64 encoded CESR native msg protocol version 0JKERIBB KERI1.1 - Trait2: str = '0K' # Trait as 2 char B64 encoded like 'EO' + Bext2: str = '0J' # Bext2 2 B64 encoded chars for trait like 'EO' CESR native msg protocol version + Bext6: str = '0K' # Bext6 6 B64 encoded chars for protocol kind version like KERIVV (KERI 1.1) or KKKVVV (KERI 1.1.0) ECDSA_256k1N: str = '1AAA' # ECDSA secp256k1 verification key non-transferable, basic derivation. ECDSA_256k1: str = '1AAB' # ECDSA public verification or encryption key, basic derivation Ed448N: str = '1AAC' # Ed448 non-transferable prefix public signing verification key. Basic derivation. @@ -786,6 +787,7 @@ class Matter: 'V': Sizage(hs=1, ss=0, fs=24, ls=0), 'W': Sizage(hs=1, ss=0, fs=4, ls=1), 'X': Sizage(hs=1, ss=0, fs=4, ls=0), + 'Y': Sizage(hs=1, ss=0, fs=8, ls=0), '0A': Sizage(hs=2, ss=0, fs=24, ls=0), '0B': Sizage(hs=2, ss=0, fs=88, ls=0), '0C': Sizage(hs=2, ss=0, fs=88, ls=0), @@ -795,8 +797,8 @@ class Matter: '0G': Sizage(hs=2, ss=0, fs=88, ls=0), '0H': Sizage(hs=2, ss=0, fs=8, ls=0), '0I': Sizage(hs=2, ss=0, fs=88, ls=0), - '0J': Sizage(hs=2, ss=0, fs=8, ls=0), - '0K': Sizage(hs=2, ss=0, fs=4, ls=0), + '0J': Sizage(hs=2, ss=0, fs=4, ls=0), + '0K': Sizage(hs=2, ss=0, fs=8, ls=0), '1AAA': Sizage(hs=4, ss=0, fs=48, ls=0), '1AAB': Sizage(hs=4, ss=0, fs=48, ls=0), '1AAC': Sizage(hs=4, ss=0, fs=80, ls=0), @@ -830,6 +832,7 @@ class Matter: '9AAC': Sizage(hs=4, ss=4, fs=None, ls=2), } + # Bards table maps first code char. converted to binary sextext of hard size, # hs. Used for ._bexfil. Bards = ({codeB64ToB2(c): hs for c, hs in Hards.items()}) diff --git a/tests/core/test_coring.py b/tests/core/test_coring.py index 53390a46f..fec5bb7ee 100644 --- a/tests/core/test_coring.py +++ b/tests/core/test_coring.py @@ -365,13 +365,14 @@ def test_matter(): 'X25519_Private': 'O', 'X25519_Cipher_Seed': 'P', 'ECDSA_256r1_Seed': 'Q', - 'Trait3': 'R', + 'Bext3': 'R', 'Large': 'S', 'Tall': 'T', 'Great': 'U', 'Vast': 'V', 'Tag1': 'W', 'Tag2': 'X', + 'Bext7': 'Y', 'Salt_128': '0A', 'Ed25519_Sig': '0B', 'ECDSA_256k1_Sig': '0C', @@ -381,8 +382,8 @@ def test_matter(): 'SHA2_512': '0G', 'Long': '0H', 'ECDSA_256r1_Sig': '0I', - 'Version': '0J', - 'Trait2': '0K', + 'Bext2': '0J', + 'Bext6': '0K', 'ECDSA_256k1N': '1AAA', 'ECDSA_256k1': '1AAB', 'Ed448N': '1AAC', @@ -413,9 +414,10 @@ def test_matter(): 'X25519_Cipher_L2': '6C', 'X25519_Cipher_Big_L0': '7AAC', 'X25519_Cipher_Big_L1': '8AAC', - 'X25519_Cipher_Big_L2': '9AAC', + 'X25519_Cipher_Big_L2': '9AAC' } + assert Matter.Codex == MtrDex # first character of code with hard size of code @@ -456,6 +458,7 @@ def test_matter(): 'V': Sizage(hs=1, ss=0, fs=24, ls=0), 'W': Sizage(hs=1, ss=0, fs=4, ls=1), 'X': Sizage(hs=1, ss=0, fs=4, ls=0), + 'Y': Sizage(hs=1, ss=0, fs=8, ls=0), '0A': Sizage(hs=2, ss=0, fs=24, ls=0), '0B': Sizage(hs=2, ss=0, fs=88, ls=0), '0C': Sizage(hs=2, ss=0, fs=88, ls=0), @@ -465,8 +468,8 @@ def test_matter(): '0G': Sizage(hs=2, ss=0, fs=88, ls=0), '0H': Sizage(hs=2, ss=0, fs=8, ls=0), '0I': Sizage(hs=2, ss=0, fs=88, ls=0), - '0J': Sizage(hs=2, ss=0, fs=8, ls=0), - '0K': Sizage(hs=2, ss=0, fs=4, ls=0), + '0J': Sizage(hs=2, ss=0, fs=4, ls=0), + '0K': Sizage(hs=2, ss=0, fs=8, ls=0), '1AAA': Sizage(hs=4, ss=0, fs=48, ls=0), '1AAB': Sizage(hs=4, ss=0, fs=48, ls=0), '1AAC': Sizage(hs=4, ss=0, fs=80, ls=0), @@ -500,7 +503,6 @@ def test_matter(): '9AAC': Sizage(hs=4, ss=4, fs=None, ls=2) } - assert Matter.Sizes['A'].hs == 1 # hard size assert Matter.Sizes['A'].ss == 0 # soft size assert Matter.Sizes['A'].fs == 44 # full size diff --git a/tests/core/test_serdering.py b/tests/core/test_serdering.py index ca342ead4..01d1b8d52 100644 --- a/tests/core/test_serdering.py +++ b/tests/core/test_serdering.py @@ -39,7 +39,7 @@ def test_serder(): 'rpy': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'dt': '', 'r': '', 'a': []}), 'pro': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'dt': '', 'r': '', 'rr': '', 'q': {}}), 'bar': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'dt': '', 'r': '', 'a': []}), - 'exn': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'dt': '', 'r': '', 'q': {}, 'a': [], 'e': {}}), + 'exn': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'p': '', 'dt': '', 'r': '', 'q': {}, 'a': [], 'e': {}}), 'vcp': Fieldage(saids={'d': 'E', 'i': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'ii': '', 's': '0', 'c': [], 'bt': '0', 'b': [], 'n': ''}), 'vrt': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'p': '', 's': '0', 'bt': '0', 'br': [], 'ba': []}), 'iss': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 's': '0', 'ri': '', 'dt': ''}), @@ -56,7 +56,7 @@ def test_serder(): 'rpy': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'dt': '', 'r': '', 'a': []}), 'pro': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'dt': '', 'r': '', 'rr': '', 'q': {}}), 'bar': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'dt': '', 'r': '', 'a': []}), - 'exn': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'dt': '', 'r': '', 'q': {}, 'a': [], 'e': {}})}}, + 'exn': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'p': '', 'dt': '', 'r': '', 'q': {}, 'a': [], 'e': {}})}}, 'CREL': {Versionage(major=1, minor=1): {'vcp': Fieldage(saids={'d': 'E', 'i': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'ii': '', 's': '0', 'c': [], 'bt': '0', 'b': [], 'u': ''}), 'vrt': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 'p': '', 's': '0', 'bt': '0', 'br': [], 'ba': []}), 'iss': Fieldage(saids={'d': 'E'}, alls={'v': '', 't': '', 'd': '', 'i': '', 's': '0', 'ri': '', 'dt': ''}), @@ -996,7 +996,7 @@ def test_serderkeri_rot(): assert [diger.qb64 for diger in serder.ndigers] == [] assert serder.bner.num == 0 assert serder.bn == 0 - assert [verfer.qb64 for verfer in serder.berfers] == [] + assert serder.berfers == None assert serder.delpre == None assert serder.delpreb == None #assert serder.fner == None @@ -2076,24 +2076,27 @@ def test_serderkeri_exn(): # Test KERI JSON with makify defaults for self bootstrap with ilk ixn serder = SerderKERI(makify=True, ilk=kering.Ilks.exn) # make with defaults - assert serder.sad == {'v': 'KERI10JSON00007a_', + assert serder.sad == {'v': 'KERI10JSON000088_', 't': 'exn', - 'd': 'EMn4053UPRz5Dn6wQ1QvN_vtTjmShfd0eJsVGjNyLAcb', + 'd': 'EMuAoRSE4zREKKYyvuNeYCDM9_MwPQIh1WL0cFC4e-bU', + 'i': '', + 'p': '', 'dt': '', 'r': '', 'q': {}, 'a': [], 'e': {}} - assert serder.raw == (b'{"v":"KERI10JSON00007a_","t":"exn",' - b'"d":"EMn4053UPRz5Dn6wQ1QvN_vtTjmShfd0eJsV' - b'GjNyLAcb","dt":"","r":"","q":{},"a":[],"e":{}}') + assert serder.raw == (b'{"v":"KERI10JSON000088_","t":"exn",' + b'"d":"EMuAoRSE4zREKKYyvuNeYCDM9_MwPQIh1WL0' + b'cFC4e-bU","i":"","p":"","dt":"","r":"","q":{},"a":[],"e":{}}') assert serder.verify() # because pre is empty assert serder.ilk == kering.Ilks.exn - assert serder.pre == None + assert serder.pre == '' + assert serder.prior == '' #sad = serder.sad ## test makify with preloaded non-digestive 'i' value in sad @@ -2126,8 +2129,10 @@ def test_serderkeri_exn(): assert not serder.estive assert serder.ked == serder.sad - assert serder.pre == None - assert serder.preb == None + assert serder.pre == '' + assert serder.preb == b'' + assert serder.prior == '' + assert serder.priorb == b'' assert serder.sner == None assert serder.sn == None assert serder.seals == [] @@ -2157,8 +2162,10 @@ def test_serderkeri_exn(): assert not serder.estive assert serder.ked == serder.sad - assert serder.pre == None # serder.sad['i'] == pre - assert serder.preb == None # serder.pre.encode("utf-8") + assert serder.pre == '' # serder.sad['i'] == pre + assert serder.preb == b'' # serder.pre.encode("utf-8") + assert serder.prior == '' + assert serder.priorb == b'' assert serder.sner == None assert serder.sn == None assert serder.seals == [] From 34c0865e9ab48bc6b2b5eddeaf37fb720873c2f5 Mon Sep 17 00:00:00 2001 From: Samuel M Smith Date: Thu, 30 Nov 2023 16:05:11 -0700 Subject: [PATCH 2/2] fixed test_kever --- tests/core/test_eventing.py | 535 +++++++++++++++++------------------- 1 file changed, 256 insertions(+), 279 deletions(-) diff --git a/tests/core/test_eventing.py b/tests/core/test_eventing.py index 651d26691..bd70d772f 100644 --- a/tests/core/test_eventing.py +++ b/tests/core/test_eventing.py @@ -9,11 +9,11 @@ import pysodium import pytest - +from keri import kering from keri.app import habbing, keeping from keri.app.keeping import openKS, Manager from keri.core import coring, eventing, parsing, serdering -from keri.core.coring import (Ilks, Diger, MtrDex, Matter, IdrDex, Indexer, +from keri.core.coring import (Diger, MtrDex, Matter, IdrDex, Indexer, CtrDex, Counter, Salter, Serder, Siger, Cigar, Seqner, Verfer, Signer, Prefixer, generateSigners, IdxSigDex, DigDex) @@ -32,7 +32,7 @@ from keri.db import dbing, basing from keri.db.basing import openDB from keri.db.dbing import dgKey, snKey -from keri.kering import (ValidationError, DerivationError) +from keri.kering import (ValidationError, DerivationError, Ilks) from keri import help from keri.help import helping @@ -2066,14 +2066,15 @@ def test_kever(mockHelpingNowUTC): # create current key sith = 1 # one signer # original signing keypair transferable default - skp0 = salter.signer(path="A", temp=True) + skp0 = salter.signer(path="A", temp=True, transferable=True) assert skp0.code == MtrDex.Ed25519_Seed assert skp0.verfer.code == MtrDex.Ed25519 + assert skp0.verfer.qb64 == 'DAUDqkmn-hqlQKD8W-FAEa5JUvJC2I9yarEem-AAEg3e' keys = [skp0.verfer.qb64] # create next key # next signing keypair transferable is default - skp1 = salter.signer(path="N", temp=True) + skp1 = salter.signer(path="N", temp=True, transferable=True) assert skp1.code == MtrDex.Ed25519_Seed assert skp1.verfer.code == MtrDex.Ed25519 # compute nxt digest @@ -2086,34 +2087,27 @@ def test_kever(mockHelpingNowUTC): toad = 0 # no witnesses nsigs = 1 # one attached signature unspecified index - ked0 = dict(v=versify(kind=Serials.json, size=0), - t=Ilks.icp, - d="", - i="", # qual base 64 prefix - s="{:x}".format(sn), # hex string no leading zeros lowercase - kt="{:x}".format(sith), # hex string no leading zeros lowercase - k=keys, # list of signing keys each qual Base64 - nt=1, - n=nxt, # hash qual Base64 - bt="{:x}".format(toad), # hex string no leading zeros lowercase - b=[], # list of qual Base64 may be empty - c=[], # list of config ordered mappings may be empty - a=[], # list of seals - ) + # make with defaults with non-digestive prefix + serder = serdering.SerderKERI(makify=True, + ilk=kering.Ilks.icp, + saids = {'i': coring.PreDex.Ed25519}) - # Derive AID from ked - aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519) - assert aid0.code == MtrDex.Ed25519 - assert aid0.qb64 == skp0.verfer.qb64 == 'DAUDqkmn-hqlQKD8W-FAEa5JUvJC2I9yarEem-AAEg3e' - # update ked with pre - ked0["i"] = aid0.qb64 - # since not digestive compute SAID - _, ked0 = coring.Saider.saidify(sad=ked0) - assert ked0['d'] == 'EBTCANzIfUThxmM1z1SFxQuwooGdF4QwtotRS01vZGqi' - #'EOf7EL5i19TNSE-n9jgceVXUQKXUa7F5EZcndLHPWUmM' + sad = serder.sad + sad['i'] = skp0.verfer.qb64 # non-digestive aid + sad['s'] = "{:x}".format(sn) # hex string + sad['kt'] = "{:x}".format(sith) # hex string + sad['k'] = keys + sad['nt'] = 1 + sad['n'] = nxt + sad['bt'] = "{:x}".format(toad) - # Serialize ked0 - tser0 = serdering.SerderKERI(sad=ked0) + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EBTCANzIfUThxmM1z1SFxQuwooGdF4QwtotRS01vZGqi' + assert serder.pre == 'DAUDqkmn-hqlQKD8W-FAEa5JUvJC2I9yarEem-AAEg3e' + aid0 = serder.pre + + # Assign first serialization + tser0 = serder # sign serialization tsig0 = skp0.sign(tser0.raw, index=0) @@ -2124,7 +2118,7 @@ def test_kever(mockHelpingNowUTC): kever = Kever(serder=tser0, sigers=[tsig0], db=db) # no error assert kever.db == db assert kever.cues == None - assert kever.prefixer.qb64 == aid0.qb64 + assert kever.prefixer.qb64 == aid0 assert kever.sner.num == 0 assert kever.sn == kever.sner.num # sn property assert [verfer.qb64 for verfer in kever.verfers] == [skp0.verfer.qb64] @@ -2210,253 +2204,236 @@ def test_kever(mockHelpingNowUTC): ondices = kever.exposeds(sigers=sigers) assert ondices ==[1] - # TODO: Fix or remove test... SerderKERI is now failing before the other checks - # with openDB() as db: # Non-Transferable case - # # Setup inception key event dict - # # create current key - # sith = 1 # one signer - # skp0 = Signer(transferable=False) # original signing keypair non-transferable - # assert skp0.code == MtrDex.Ed25519_Seed - # assert skp0.verfer.code == MtrDex.Ed25519N - # keys = [skp0.verfer.qb64] - # - # # create next key Error case - # skp1 = Signer() # next signing keypair transferable is default - # assert skp1.code == MtrDex.Ed25519_Seed - # assert skp1.verfer.code == MtrDex.Ed25519 - # nxtkeys = [skp1.verfer.qb64] - # # compute nxt digest - # nxt = [Diger(ser=skp1.verfer.qb64b).qb64] # nxt is not empty so error - # - # sn = 0 # inception event so 0 - # toad = 0 # no witnesses - # nsigs = 1 # one attached signature unspecified index - # - # ked0 = dict(v=versify(kind=Serials.json, size=0), - # t=Ilks.icp, - # d="", - # i="", # qual base 64 prefix - # s="{:x}".format(sn), # hex string no leading zeros lowercase - # kt="{:x}".format(sith), # hex string no leading zeros lowercase - # k=keys, # list of signing keys each qual Base64 - # nt=1, - # n=nxt, # hash qual Base64 - # bt="{:x}".format(toad), # hex string no leading zeros lowercase - # b=[], # list of qual Base64 may be empty - # c=[], # list of config ordered mappings may be empty - # a={}, # list of seals - # ) - # - # # Derive AID from ked - # with pytest.raises(DerivationError): - # aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519N) - # - # - # # assert aid0.code == MtrDex.Ed25519N - # # assert aid0.qb64 == skp0.verfer.qb64 - # - # # update ked with pre - # ked0["i"] = skp0.verfer.qb64 - # - # _, ked0 = coring.Saider.saidify(sad=ked0) - # - # # Serialize ked0 - # tser0 = serdering.SerderKERI(sad=ked0) - # - # # sign serialization - # tsig0 = skp0.sign(tser0.raw, index=0) - # - # # verify signature - # assert skp0.verfer.verify(tsig0.raw, tser0.raw) - # - # with pytest.raises(ValidationError): - # kever = Kever(serder=tser0, sigers=[tsig0], db=db) - # - # # retry with valid empty nxt - # nxt = "" # nxt is empty so no error - # sn = 0 # inception event so 0 - # toad = 0 # no witnesses - # nsigs = 1 # one attached signature unspecified index - # - # ked0 = dict(v=versify(kind=Serials.json, size=0), - # t=Ilks.icp, - # d="", - # i="", # qual base 64 prefix - # s="{:x}".format(sn), # hex string no leading zeros lowercase - # kt="{:x}".format(sith), # hex string no leading zeros lowercase - # k=keys, # list of signing keys each qual Base64 - # nt=0, - # n=nxt, # hash qual Base64 - # bt="{:x}".format(toad), # hex string no leading zeros lowercase - # b=[], # list of qual Base64 may be empty - # c=[], # list of config ordered mappings may be empty - # a=[], # list of seals - # ) - # - # # Derive AID from ked - # aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519N) - # - # assert aid0.code == MtrDex.Ed25519N - # assert aid0.qb64 == skp0.verfer.qb64 - # - # # update ked with pre - # ked0["i"] = aid0.qb64 - # _, ked0 = coring.Saider.saidify(sad=ked0) - # - # # Serialize ked0 - # tser0 = serdering.SerderKERI(sad=ked0) - # - # # sign serialization - # tsig0 = skp0.sign(tser0.raw, index=0) - # - # # verify signature - # assert skp0.verfer.verify(tsig0.raw, tser0.raw) - # - # kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error - - # with openDB() as db: # Non-Transferable case - # # Setup inception key event dict - # # create current key - # sith = 1 # one signer - # skp0 = Signer(transferable=False) # original signing keypair non-transferable - # assert skp0.code == MtrDex.Ed25519_Seed - # assert skp0.verfer.code == MtrDex.Ed25519N - # keys = [skp0.verfer.qb64] - # - # # create next key Error case - # skp1 = Signer() # next signing keypair transferable is default - # assert skp1.code == MtrDex.Ed25519_Seed - # assert skp1.verfer.code == MtrDex.Ed25519 - # nxtkeys = [skp1.verfer.qb64] - # # compute nxt digest - # nxt = "" - # - # sn = 0 # inception event so 0 - # toad = 0 # no witnesses - # nsigs = 1 # one attached signature unspecified index - # - # baks = ["BAyRFMideczFZoapylLIyCjSdhtqVb31wZkRKvPfNqkw"] - # - # ked0 = dict(v=versify(kind=Serials.json, size=0), - # t=Ilks.icp, - # d="", - # i="", # qual base 64 prefix - # s="{:x}".format(sn), # hex string no leading zeros lowercase - # kt="{:x}".format(sith), # hex string no leading zeros lowercase - # k=keys, # list of signing keys each qual Base64 - # nt=0, - # n=nxt, # hash qual Base64 - # bt="{:x}".format(toad), # hex string no leading zeros lowercase - # b=baks, # list of qual Base64 may be empty - # c=[], # list of config ordered mappings may be empty - # a={}, # list of seals - # ) - # - # # Derive AID from ked - # with pytest.raises(DerivationError): - # aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519N) - # - # # update ked with pre - # ked0["i"] = skp0.verfer.qb64 - # _, ked0 = coring.Saider.saidify(sad=ked0) - # - # # Serialize ked0 - # tser0 = serdering.SerderKERI(sad=ked0) - # - # # sign serialization - # tsig0 = skp0.sign(tser0.raw, index=0) - # - # # verify signature - # assert skp0.verfer.verify(tsig0.raw, tser0.raw) - # - # with pytest.raises(ValidationError): - # kever = Kever(serder=tser0, sigers=[tsig0], db=db) - # - # # retry with valid empty baks - # baks = [] - # # use some data, also invalid - # a = [dict(i="EAz8Wqqom6eeIFsng3cGQiUJ1uiNelCrR9VgFlk_8QAM")] - # sn = 0 # inception event so 0 - # toad = 0 # no witnesses - # nsigs = 1 # one attached signature unspecified index - # - # ked0 = dict(v=versify(kind=Serials.json, size=0), - # t=Ilks.icp, - # d="", - # i="", # qual base 64 prefix - # s="{:x}".format(sn), # hex string no leading zeros lowercase - # kt="{:x}".format(sith), # hex string no leading zeros lowercase - # k=keys, # list of signing keys each qual Base64 - # nt=0, - # n=nxt, # hash qual Base64 - # bt="{:x}".format(toad), # hex string no leading zeros lowercase - # b=baks, # list of qual Base64 may be empty - # c=[], # list of config ordered mappings may be empty - # a=a, # list of seals - # ) - # - # # Derive AID from ked - # with pytest.raises(DerivationError): - # aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519N) - # - # # update ked with pre - # ked0["i"] = aid0.qb64 - # _, ked0 = coring.Saider.saidify(sad=ked0) - # - # # Serialize ked0 - # tser0 = serdering.SerderKERI(sad=ked0) - # - # # sign serialization - # tsig0 = skp0.sign(tser0.raw, index=0) - # - # # verify signature - # assert skp0.verfer.verify(tsig0.raw, tser0.raw) - # - # with pytest.raises(ValidationError): - # kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error - # - # # retry with valid empty baks and empty a - # baks = [] - # a = [] - # sn = 0 # inception event so 0 - # toad = 0 # no witnesses - # nsigs = 1 # one attached signature unspecified index - # - # ked0 = dict(v=versify(kind=Serials.json, size=0), - # t=Ilks.icp, - # d="", - # i="", # qual base 64 prefix - # s="{:x}".format(sn), # hex string no leading zeros lowercase - # kt="{:x}".format(sith), # hex string no leading zeros lowercase - # k=keys, # list of signing keys each qual Base64 - # nt=0, - # n=nxt, # hash qual Base64 - # bt="{:x}".format(toad), # hex string no leading zeros lowercase - # b=baks, # list of qual Base64 may be empty - # c=[], # list of config ordered mappings may be empty - # a=a, # list of seals - # ) - # - # # Derive AID from ked - # aid0 = Prefixer(ked=ked0, code=MtrDex.Ed25519N) - # - # assert aid0.code == MtrDex.Ed25519N - # assert aid0.qb64 == skp0.verfer.qb64 - # - # # update ked with pre - # ked0["i"] = aid0.qb64 - # _, ked0 = coring.Saider.saidify(sad=ked0) - # - # # Serialize ked0 - # tser0 = serdering.SerderKERI(sad=ked0) - # - # # sign serialization - # tsig0 = skp0.sign(tser0.raw, index=0) - # - # # verify signature - # assert skp0.verfer.verify(tsig0.raw, tser0.raw) - # - # kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error + + with openDB() as db: # Non-Transferable case Error nxt not empty + # test Error case Transferable incept event but with nontrans aid + # Setup inception key event dict + # create current key + sith = 1 # one signer + # original signing keypair non-transferable + skp0 = salter.signer(path="A", temp=True, transferable=False) + assert skp0.code == MtrDex.Ed25519_Seed + assert skp0.verfer.code == MtrDex.Ed25519N + assert skp0.verfer.qb64 == 'BAUDqkmn-hqlQKD8W-FAEa5JUvJC2I9yarEem-AAEg3e' + keys = [skp0.verfer.qb64] + + # create next key + # next signing keypair transferable is default + skp1 = salter.signer(path="N", temp=True, transferable=True) + assert skp1.code == MtrDex.Ed25519_Seed + assert skp1.verfer.code == MtrDex.Ed25519 + nxtkeys = [skp1.verfer.qb64] + # compute nxt digest + nxt = [Diger(ser=skp1.verfer.qb64b).qb64] # nxt is not empty so will error + + sn = 0 # inception event so 0 + toad = 0 # no witnesses + nsigs = 1 # one attached signature unspecified index + + # make with defaults with non-transferable prefix + serder = serdering.SerderKERI(makify=True, + ilk=kering.Ilks.icp, + saids = {'i': coring.PreDex.Ed25519N}) + + sad = serder.sad + sad['i'] = skp0.verfer.qb64 # non-digestive aid + sad['s'] = "{:x}".format(sn) # hex string + sad['kt'] = "{:x}".format(sith) # hex string + sad['k'] = keys + sad['nt'] = 1 + sad['n'] = nxt + sad['bt'] = "{:x}".format(toad) + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EFsuiA86Q5gGuVOO3tou8KSU6LORSExIUxzWNrlnW7WP' + assert serder.pre == skp0.verfer.qb64 + aid0 = serder.pre + + # assign serialization + tser0 = serder + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + with pytest.raises(ValidationError): + kever = Kever(serder=tser0, sigers=[tsig0], db=db) + + # retry with valid empty nxt + nxt = "" # nxt is empty so no error + sn = 0 # inception event so 0 + toad = 0 # no witnesses + + + # make with defaults with non-transferable prefix + serder = serdering.SerderKERI(makify=True, + ilk=kering.Ilks.icp, + saids = {'i': coring.PreDex.Ed25519N}) + + sad = serder.sad + sad['i'] = skp0.verfer.qb64 # non-digestive aid + sad['s'] = "{:x}".format(sn) # hex string + sad['kt'] = "{:x}".format(sith) # hex string + sad['k'] = keys + sad['nt'] = 0 + sad['n'] = nxt + sad['bt'] = "{:x}".format(toad) + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EHXNdcXZzJnRIdaNk30W5h4yD5sZ2Y_n3u_ReE65X9w-' + assert serder.pre == skp0.verfer.qb64 + aid0 = serder.pre + + # assign serialization + tser0 = serder + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error + + with openDB() as db: # Non-Transferable case baks not empty + # Setup inception key event dict + # create current key + + # original signing keypair non-transferable + skp0 = salter.signer(path="B", temp=True, transferable=False) + assert skp0.code == MtrDex.Ed25519_Seed + assert skp0.verfer.code == MtrDex.Ed25519N + assert skp0.verfer.qb64 == 'BEe36N1fb59sXaHIUBOlfSCf4J_H5xajMuMr5u_isjs4' + sith = 1 # one signer + keys = [skp0.verfer.qb64] + + # create next key + # next signing keypair transferable is default + skp1 = salter.signer(path="O", temp=True, transferable=True) + assert skp1.code == MtrDex.Ed25519_Seed + assert skp1.verfer.code == MtrDex.Ed25519 + nxtkeys = [skp1.verfer.qb64] + # compute nxt digest must be empty + nxt = "" + + sn = 0 # inception event so 0 + toad = 0 # no witnesses + + # error case if baks not empty + baks = ["BAyRFMideczFZoapylLIyCjSdhtqVb31wZkRKvPfNqkw"] + + # make with defaults with non-transferable prefix + serder = serdering.SerderKERI(makify=True, + ilk=kering.Ilks.icp, + saids = {'i': coring.PreDex.Ed25519N}) + + sad = serder.sad + sad['i'] = skp0.verfer.qb64 # non-digestive aid + sad['s'] = "{:x}".format(sn) # hex string + sad['kt'] = "{:x}".format(sith) # hex string + sad['k'] = keys + sad['nt'] = 0 + sad['n'] = nxt + sad['bt'] = "{:x}".format(toad) + sad['b'] = baks + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EKcREpfNupJ8oOqdnqDIyJVr1-GgIMBrVOtBUR9Gm6lO' + assert serder.pre == skp0.verfer.qb64 + + + # assign serialization + tser0 = serder + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + with pytest.raises(ValidationError): + kever = Kever(serder=tser0, sigers=[tsig0], db=db) + + + # retry with toad =1 and baks not empty + toad = 1 + sad =serder.sad # makes copy + sad['bt'] = "{:x}".format(toad) + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EBKhptvqccp0KNBaS45bNPdTE4m19U1IvweHJW2PIEDI' + assert serder.pre == skp0.verfer.qb64 + + # assign serialization + tser0 = serder + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + with pytest.raises(ValidationError): + kever = Kever(serder=tser0, sigers=[tsig0], db=db) + + + # retry with valid empty baks + baks = [] + # use some data, also invalid + a = [dict(i="EAz8Wqqom6eeIFsng3cGQiUJ1uiNelCrR9VgFlk_8QAM")] + sn = 0 # inception event so 0 + toad = 0 # no witnesses + + sad =serder.sad # makes copy + sad['bt'] = "{:x}".format(toad) + sad['b'] = baks + sad['a'] = a + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EEu-cdj_9b_66XRJ5UuhgEvJxAPpn4RjyaHvRgDU3iyA' + assert serder.pre == skp0.verfer.qb64 + + # assign serialization + tser0 = serder + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + with pytest.raises(ValidationError): + kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error + + # retry with valid empty baks and empty a + + a = [] + toad = 0 # no witnesses + baks = [] + + sad =serder.sad # makes copy + sad['bt'] = "{:x}".format(toad) + sad['b'] = baks + sad['a'] = a + + + serder = serdering.SerderKERI(makify=True, verify=True, sad=sad) + assert serder.said == 'EOyd2ZALXBm5k9lEpmvakO6RYPDgX1zWSFNd3MfOXL-e' + assert serder.pre == skp0.verfer.qb64 + + # assign serialization + tser0 = serder + + + # sign serialization + tsig0 = skp0.sign(tser0.raw, index=0) + + # verify signature + assert skp0.verfer.verify(tsig0.raw, tser0.raw) + + kever = Kever(serder=tser0, sigers=[tsig0], db=db) # valid so no error