|
55 | 55 | ECDSA_256r1_SEEDBYTES = 32
|
56 | 56 | ECDSA_256k1_SEEDBYTES = 32
|
57 | 57 |
|
| 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") |
58 | 61 |
|
59 | 62 | # SAID field labels
|
60 | 63 | Saidage = namedtuple("Saidage", "dollar at id_ i d")
|
@@ -269,6 +272,8 @@ def __delitem__(self, name):
|
269 | 272 |
|
270 | 273 |
|
271 | 274 |
|
| 275 | + |
| 276 | + |
272 | 277 | @dataclass(frozen=True)
|
273 | 278 | class MatterCodex:
|
274 | 279 | """
|
@@ -3094,68 +3099,77 @@ class Diger(Matter):
|
3094 | 3099 |
|
3095 | 3100 | """
|
3096 | 3101 |
|
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 |
3100 | 3106 |
|
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 |
3102 | 3121 |
|
3103 | 3122 | 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 |
3110 | 3124 |
|
3111 | 3125 | 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 |
3113 | 3127 |
|
3114 | 3128 | """
|
3115 |
| - # Should implement all digests in DigCodex instance DigDex |
| 3129 | + |
3116 | 3130 | try:
|
3117 | 3131 | super(Diger, self).__init__(raw=raw, code=code, **kwa)
|
3118 | 3132 | except EmptyMaterialError as ex:
|
3119 | 3133 | if not ser:
|
3120 | 3134 | 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 | + |
3148 | 3160 |
|
3149 | 3161 | def verify(self, ser):
|
3150 | 3162 | """
|
3151 | 3163 | 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 |
3153 | 3165 | by .code
|
3154 | 3166 |
|
3155 | 3167 | Parameters:
|
3156 |
| - ser (bytes): serialization to be digested and compared to .ser |
| 3168 | + ser (bytes): serialization to be digested and compared to .raw |
| 3169 | +
|
3157 | 3170 | """
|
3158 |
| - return (self._verify(ser=ser, raw=self.raw)) |
| 3171 | + return (self._digest(ser=ser, code=self.code) == self.raw) |
| 3172 | + |
3159 | 3173 |
|
3160 | 3174 | def compare(self, ser, dig=None, diger=None):
|
3161 | 3175 | """
|
@@ -3202,65 +3216,6 @@ def compare(self, ser, dig=None, diger=None):
|
3202 | 3216 |
|
3203 | 3217 | return (False)
|
3204 | 3218 |
|
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) |
3264 | 3219 |
|
3265 | 3220 |
|
3266 | 3221 | class Prefixer(Matter):
|
@@ -3291,9 +3246,6 @@ def __init__(self, **kwa):
|
3291 | 3246 |
|
3292 | 3247 |
|
3293 | 3248 |
|
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") |
3297 | 3249 |
|
3298 | 3250 |
|
3299 | 3251 | class Saider(Matter):
|
|
0 commit comments