Skip to content

Commit 5969fd5

Browse files
committed
refactored Saider and Serder to use new Diger and Diger._digest class method so code is
much more DRY
1 parent 1f3efa1 commit 5969fd5

File tree

3 files changed

+12
-62
lines changed

3 files changed

+12
-62
lines changed

Diff for: src/keri/core/coring.py

+6-27
Original file line numberDiff line numberDiff line change
@@ -3140,18 +3140,18 @@ def __init__(self, raw=None, ser=None, code=DigDex.Blake3_256, **kwa):
31403140
if self.code not in DigDex:
31413141
raise InvalidCodeError(f"Unsupported Digest {code=}.")
31423142

3143-
3144-
def _digest(self, ser, code=DigDex.Blake3_256):
3143+
@classmethod
3144+
def _digest(cls, ser, code=DigDex.Blake3_256):
31453145
"""Returns raw digest of ser using digest algorithm given by code
31463146
31473147
Parameters:
31483148
ser (bytes): serialization from which raw digest is computed
31493149
code (str): derivation code used to lookup digest algorithm
31503150
"""
3151-
if code not in self.Digests:
3151+
if code not in cls.Digests:
31523152
raise InvalidCodeError(f"Unsupported Digest {code=}.")
31533153

3154-
klas, size, length = self.Digests[code] # digest algo size & length
3154+
klas, size, length = cls.Digests[code] # digest algo size & length
31553155
ikwa = dict(digest_size=size) if size else dict() # opt digest size
31563156
dkwa = dict(length=length) if length else dict() # opt digest length
31573157
raw = klas(ser, **ikwa).digest(**dkwa)
@@ -3277,19 +3277,6 @@ class Saider(Matter):
32773277
32783278
"""
32793279
Dummy = "#" # dummy spaceholder char for said. Must not be a valid Base64 char
3280-
# should be same set of codes as in coring.DigestCodex coring.DigDex so
3281-
# .digestive property works. Unit test ensures code sets match
3282-
Digests = {
3283-
MtrDex.Blake3_256: Digestage(klas=blake3.blake3, size=None, length=None),
3284-
MtrDex.Blake2b_256: Digestage(klas=hashlib.blake2b, size=32, length=None),
3285-
MtrDex.Blake2s_256: Digestage(klas=hashlib.blake2s, size=None, length=None),
3286-
MtrDex.SHA3_256: Digestage(klas=hashlib.sha3_256, size=None, length=None),
3287-
MtrDex.SHA2_256: Digestage(klas=hashlib.sha256, size=None, length=None),
3288-
MtrDex.Blake3_512: Digestage(klas=blake3.blake3, size=None, length=64),
3289-
MtrDex.Blake2b_512: Digestage(klas=hashlib.blake2b, size=None, length=None),
3290-
MtrDex.SHA3_512: Digestage(klas=hashlib.sha3_512, size=None, length=None),
3291-
MtrDex.SHA2_512: Digestage(klas=hashlib.sha512, size=None, length=None),
3292-
}
32933280

32943281
def __init__(self, raw=None, *, code=None, sad=None,
32953282
kind=None, label=Saids.d, ignore=None, **kwa):
@@ -3434,18 +3421,10 @@ def _derive(clas, sad: dict, *,
34343421
for f in ignore:
34353422
del ser[f]
34363423

3437-
# string now has
3438-
# correct size
3439-
klas, size, length = clas.Digests[code]
3424+
# string now has correct size
34403425
# sad as 'v' verision string then use its kind otherwise passed in kind
34413426
cpa = [clas._serialize(ser, kind=kind)] # raw pos arg class
3442-
ckwa = dict() # class keyword args
3443-
if size:
3444-
ckwa.update(digest_size=size) # optional digest_size
3445-
dkwa = dict() # digest keyword args
3446-
if length:
3447-
dkwa.update(length=length)
3448-
return klas(*cpa, **ckwa).digest(**dkwa), sad # raw digest and sad
3427+
return (Diger._digest(ser=cpa[0], code=code), sad) # raw digest and sad
34493428

34503429

34513430
def derive(self, sad, code=None, **kwa):

Diff for: src/keri/core/serdering.py

+2-33
Original file line numberDiff line numberDiff line change
@@ -348,22 +348,6 @@ class Serder:
348348
# Spans dict keyed by version (Versionage instance) of version string span (size)
349349
Spans = {Vrsn_1_0: VER1FULLSPAN, Vrsn_2_0: VER2FULLSPAN}
350350

351-
# Maps digest codes to Digestages of algorithms for computing digest.
352-
# Should be based on the same set of codes as in coring.DigestCodex
353-
# coring.DigDex so .digestive property works.
354-
# Use unit tests to ensure codex elements sets match
355-
Digests = {
356-
DigDex.Blake3_256: Digestage(klas=blake3.blake3, size=None, length=None),
357-
DigDex.Blake2b_256: Digestage(klas=hashlib.blake2b, size=32, length=None),
358-
DigDex.Blake2s_256: Digestage(klas=hashlib.blake2s, size=None, length=None),
359-
DigDex.SHA3_256: Digestage(klas=hashlib.sha3_256, size=None, length=None),
360-
DigDex.SHA2_256: Digestage(klas=hashlib.sha256, size=None, length=None),
361-
DigDex.Blake3_512: Digestage(klas=blake3.blake3, size=None, length=64),
362-
DigDex.Blake2b_512: Digestage(klas=hashlib.blake2b, size=None, length=None),
363-
DigDex.SHA3_512: Digestage(klas=hashlib.sha3_512, size=None, length=None),
364-
DigDex.SHA2_512: Digestage(klas=hashlib.sha512, size=None, length=None),
365-
}
366-
367351
# map seal clan names to seal counter code for grouping seals in anchor list
368352
ClanCodes = dict()
369353
ClanCodes[SClanDom.SealDigest.__name__] = SealDex_2_0.DigestSealSingles
@@ -777,14 +761,7 @@ def _verify(self):
777761
raw = self.dumps(sad, kind=self.kind) # serialize dummied sad copy
778762
for label, code in saids.items():
779763
if code in DigDex: # subclass override if non digestive allowed
780-
klas, size, length = self.Digests[code] # digest algo size & length
781-
ikwa = dict() # digest algo class initi keyword args
782-
if size:
783-
ikwa.update(digest_size=size) # optional digest_size
784-
dkwa = dict() # digest method keyword args
785-
if length:
786-
dkwa.update(length=length)
787-
dig = Matter(raw=klas(raw, **ikwa).digest(**dkwa), code=code).qb64
764+
dig = Diger(ser=raw, code=code).qb64
788765
if dig != self._sad[label]: # compare to original
789766
raise ValidationError(f"Invalid said field '{label}' in sad"
790767
f" = {self._sad}, should be {dig}.")
@@ -1005,15 +982,7 @@ def makify(self, sad, *, proto=None, vrsn=None, kind=None,
1005982
raw = self.dumps(sad, kind=kind, proto=proto, vrsn=vrsn) # serialize sized dummied sad
1006983
for label, code in _saids.items():
1007984
if code in DigDex: # subclass override if non digestive allowed
1008-
klas, dsize, dlen = self.Digests[code] # digest algo size & length
1009-
ikwa = dict() # digest algo class initi keyword args
1010-
if dsize:
1011-
ikwa.update(digest_size=dsize) # optional digest_size
1012-
dkwa = dict() # digest method keyword args
1013-
if dlen:
1014-
dkwa.update(length=dlen)
1015-
dig = Matter(raw=klas(raw, **ikwa).digest(**dkwa), code=code).qb64
1016-
sad[label] = dig
985+
sad[label] = Diger(ser=raw, code=code).qb64
1017986

1018987
raw = self.dumps(sad, kind=kind, proto=proto, vrsn=vrsn) # compute final raw
1019988
if kind == Kinds.cesr:# cesr kind version string does not set size

Diff for: tests/core/test_coring.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -4432,6 +4432,10 @@ def test_diger():
44324432
"""
44334433
Test the support functionality for Diger subclass of CryMat
44344434
"""
4435+
# Ensure keyspace of Diger.Digests is same as codes in DigDex
4436+
assert set(coring.DigDex) == set(Diger.Digests.keys())
4437+
4438+
44354439
with pytest.raises(EmptyMaterialError):
44364440
diger = Diger()
44374441

@@ -4612,8 +4616,6 @@ def test_saider():
46124616
"""
46134617
Test Saider object
46144618
"""
4615-
# Test class attribute Digest matches DigDex (i.e.DigestCodex)
4616-
assert set(Saider.Digests.keys()) == set(code for code in DigDex)
46174619

46184620
code = MtrDex.Blake3_256
46194621
kind = Kinds.json

0 commit comments

Comments
 (0)