Skip to content

Commit 1f3efa1

Browse files
committed
refactor Diger to simplify
1 parent 3ae0d48 commit 1f3efa1

File tree

2 files changed

+58
-107
lines changed

2 files changed

+58
-107
lines changed

src/keri/core/coring.py

Lines changed: 56 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
ECDSA_256r1_SEEDBYTES = 32
5656
ECDSA_256k1_SEEDBYTES = 32
5757

58+
# digest algorithm klas, digest size (not default), digest length
59+
# size and length are needed for some digest types as function parameters
60+
Digestage = namedtuple("Digestage", "klas size length")
5861

5962
# SAID field labels
6063
Saidage = namedtuple("Saidage", "dollar at id_ i d")
@@ -269,6 +272,8 @@ def __delitem__(self, name):
269272

270273

271274

275+
276+
272277
@dataclass(frozen=True)
273278
class MatterCodex:
274279
"""
@@ -3094,68 +3099,77 @@ class Diger(Matter):
30943099
30953100
"""
30963101

3097-
def __init__(self, raw=None, ser=None, code=MtrDex.Blake3_256, **kwa):
3098-
"""
3099-
Assign digest verification function to ._verify
3102+
# Maps digest codes to Digestages of algorithms for computing digest.
3103+
# Should be based on the same set of codes as in DigestCodex
3104+
# so Matter.digestive property works.
3105+
# Use unit tests to ensure codex elements sets match
31003106

3101-
See Matter for inherited parameters
3107+
Digests = {
3108+
DigDex.Blake3_256: Digestage(klas=blake3.blake3, size=None, length=None),
3109+
DigDex.Blake2b_256: Digestage(klas=hashlib.blake2b, size=32, length=None),
3110+
DigDex.Blake2s_256: Digestage(klas=hashlib.blake2s, size=None, length=None),
3111+
DigDex.SHA3_256: Digestage(klas=hashlib.sha3_256, size=None, length=None),
3112+
DigDex.SHA2_256: Digestage(klas=hashlib.sha256, size=None, length=None),
3113+
DigDex.Blake3_512: Digestage(klas=blake3.blake3, size=None, length=64),
3114+
DigDex.Blake2b_512: Digestage(klas=hashlib.blake2b, size=None, length=None),
3115+
DigDex.SHA3_512: Digestage(klas=hashlib.sha3_512, size=None, length=None),
3116+
DigDex.SHA2_512: Digestage(klas=hashlib.sha512, size=None, length=None),
3117+
}
3118+
3119+
def __init__(self, raw=None, ser=None, code=DigDex.Blake3_256, **kwa):
3120+
"""Initialize attributes
31023121
31033122
Inherited Parameters:
3104-
raw is bytes of unqualified crypto material usable for crypto operations
3105-
qb64b is bytes of fully qualified crypto material
3106-
qb64 is str or bytes of fully qualified crypto material
3107-
qb2 is bytes of fully qualified crypto material
3108-
code is str of derivation code
3109-
index is int of count of attached receipts for CryCntDex codes
3123+
See Matter
31103124
31113125
Parameters:
3112-
ser is bytes serialization from which raw is computed if not raw
3126+
ser (bytes): serialization from which raw is computed if not raw
31133127
31143128
"""
3115-
# Should implement all digests in DigCodex instance DigDex
3129+
31163130
try:
31173131
super(Diger, self).__init__(raw=raw, code=code, **kwa)
31183132
except EmptyMaterialError as ex:
31193133
if not ser:
31203134
raise ex
3121-
if code == MtrDex.Blake3_256:
3122-
dig = blake3.blake3(ser).digest()
3123-
elif code == MtrDex.Blake2b_256:
3124-
dig = hashlib.blake2b(ser, digest_size=32).digest()
3125-
elif code == MtrDex.Blake2s_256:
3126-
dig = hashlib.blake2s(ser, digest_size=32).digest()
3127-
elif code == MtrDex.SHA3_256:
3128-
dig = hashlib.sha3_256(ser).digest()
3129-
elif code == MtrDex.SHA2_256:
3130-
dig = hashlib.sha256(ser).digest()
3131-
else:
3132-
raise InvalidValueError("Unsupported code={code} for diger.")
3133-
3134-
super(Diger, self).__init__(raw=dig, code=code, **kwa)
3135-
3136-
if self.code == MtrDex.Blake3_256:
3137-
self._verify = self._blake3_256
3138-
elif self.code == MtrDex.Blake2b_256:
3139-
self._verify = self._blake2b_256
3140-
elif self.code == MtrDex.Blake2s_256:
3141-
self._verify = self._blake2s_256
3142-
elif self.code == MtrDex.SHA3_256:
3143-
self._verify = self._sha3_256
3144-
elif self.code == MtrDex.SHA2_256:
3145-
self._verify = self._sha2_256
3146-
else:
3147-
raise InvalidValueError("Unsupported code={self.code} for diger.")
3135+
3136+
raw = self._digest(ser, code=code)
3137+
3138+
super(Diger, self).__init__(raw=raw, code=code, **kwa)
3139+
3140+
if self.code not in DigDex:
3141+
raise InvalidCodeError(f"Unsupported Digest {code=}.")
3142+
3143+
3144+
def _digest(self, ser, code=DigDex.Blake3_256):
3145+
"""Returns raw digest of ser using digest algorithm given by code
3146+
3147+
Parameters:
3148+
ser (bytes): serialization from which raw digest is computed
3149+
code (str): derivation code used to lookup digest algorithm
3150+
"""
3151+
if code not in self.Digests:
3152+
raise InvalidCodeError(f"Unsupported Digest {code=}.")
3153+
3154+
klas, size, length = self.Digests[code] # digest algo size & length
3155+
ikwa = dict(digest_size=size) if size else dict() # opt digest size
3156+
dkwa = dict(length=length) if length else dict() # opt digest length
3157+
raw = klas(ser, **ikwa).digest(**dkwa)
3158+
return (raw)
3159+
31483160

31493161
def verify(self, ser):
31503162
"""
31513163
Returns True if raw digest of ser bytes (serialization) matches .raw
3152-
using .raw as reference digest for ._verify digest algorithm determined
3164+
using .raw as reference digest for digest algorithm determined
31533165
by .code
31543166
31553167
Parameters:
3156-
ser (bytes): serialization to be digested and compared to .ser
3168+
ser (bytes): serialization to be digested and compared to .raw
3169+
31573170
"""
3158-
return (self._verify(ser=ser, raw=self.raw))
3171+
return (self._digest(ser=ser, code=self.code) == self.raw)
3172+
31593173

31603174
def compare(self, ser, dig=None, diger=None):
31613175
"""
@@ -3202,65 +3216,6 @@ def compare(self, ser, dig=None, diger=None):
32023216

32033217
return (False)
32043218

3205-
@staticmethod
3206-
def _blake3_256(ser, raw):
3207-
"""
3208-
Returns True if verified False otherwise
3209-
Verifiy blake3_256 digest of ser matches raw
3210-
3211-
Parameters:
3212-
ser is bytes serialization
3213-
dig is bytes reference digest
3214-
"""
3215-
return (blake3.blake3(ser).digest() == raw)
3216-
3217-
@staticmethod
3218-
def _blake2b_256(ser, raw):
3219-
"""
3220-
Returns True if verified False otherwise
3221-
Verifiy blake2b_256 digest of ser matches raw
3222-
3223-
Parameters:
3224-
ser is bytes serialization
3225-
dig is bytes reference digest
3226-
"""
3227-
return (hashlib.blake2b(ser, digest_size=32).digest() == raw)
3228-
3229-
@staticmethod
3230-
def _blake2s_256(ser, raw):
3231-
"""
3232-
Returns True if verified False otherwise
3233-
Verifiy blake2s_256 digest of ser matches raw
3234-
3235-
Parameters:
3236-
ser is bytes serialization
3237-
dig is bytes reference digest
3238-
"""
3239-
return (hashlib.blake2s(ser, digest_size=32).digest() == raw)
3240-
3241-
@staticmethod
3242-
def _sha3_256(ser, raw):
3243-
"""
3244-
Returns True if verified False otherwise
3245-
Verifiy blake2s_256 digest of ser matches raw
3246-
3247-
Parameters:
3248-
ser is bytes serialization
3249-
dig is bytes reference digest
3250-
"""
3251-
return (hashlib.sha3_256(ser).digest() == raw)
3252-
3253-
@staticmethod
3254-
def _sha2_256(ser, raw):
3255-
"""
3256-
Returns True if verified False otherwise
3257-
Verifiy blake2s_256 digest of ser matches raw
3258-
3259-
Parameters:
3260-
ser is bytes serialization
3261-
dig is bytes reference digest
3262-
"""
3263-
return (hashlib.sha256(ser).digest() == raw)
32643219

32653220

32663221
class Prefixer(Matter):
@@ -3291,9 +3246,6 @@ def __init__(self, **kwa):
32913246

32923247

32933248

3294-
# digest algorithm klas, digest size (not default), digest length
3295-
# size and length are needed for some digest types as function parameters
3296-
Digestage = namedtuple("Digestage", "klas size length")
32973249

32983250

32993251
class Saider(Matter):

tests/core/test_coring.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4439,11 +4439,9 @@ def test_diger():
44394439
ser = b'abcdefghijklmnopqrstuvwxyz0123456789'
44404440

44414441
dig = blake3.blake3(ser).digest()
4442-
with pytest.raises(coring.InvalidValueError):
4442+
with pytest.raises(kering.InvalidCodeError):
44434443
diger = Diger(raw=dig, code=MtrDex.Ed25519)
44444444

4445-
with pytest.raises(coring.InvalidValueError):
4446-
diger = Diger(ser=ser, code=MtrDex.Ed25519)
44474445

44484446
diger = Diger(raw=dig) # defaults provide Blake3_256 digester
44494447
assert diger.code == MtrDex.Blake3_256
@@ -5389,6 +5387,7 @@ def test_tholder():
53895387
test_ilker()
53905388
test_traitor()
53915389
test_verser()
5390+
test_diger()
53925391
#test_texter()
53935392
#test_prodex()
53945393
#test_indexer()

0 commit comments

Comments
 (0)