7 from __future__
import annotations
9 from Crypto.Hash
import SHA512
14 CURVE = ecdsa.NIST521p
15 VerificationKey = ecdsa.VerifyingKey
16 SigningKey = ecdsa.SigningKey
19 HASH_FILE_BLOCK_SIZE = 4096
22 def _compute_key_validation_digest() -> bytes:
24 h.update(KEY_VALIDATION_CHECK_STRING.encode())
28 KEY_VALIDATION_CHECK_STRING: str =
"Zeth MPC"
29 KEY_VALIDATION_CHECK_DIGEST: bytes = _compute_key_validation_digest()
36 assert len(digest) == HASH_BYTE_LENGTH
44 if len(digest_s) != 2 * HASH_BYTE_LENGTH:
45 raise Exception(f
"unexpected digest string length: {len(digest_s)}")
46 assert len(digest_s) == 2 * HASH_BYTE_LENGTH
47 return bytes.fromhex(digest_s)
51 return ecdsa.SigningKey.generate(curve=CURVE)
59 return ecdsa.SigningKey.from_der(sk_b)
63 return sk.get_verifying_key()
67 return vk.to_der().hex()
71 return ecdsa.VerifyingKey.from_der(bytes.fromhex(vk_s))
79 return bytes.fromhex(sig_s)
84 with open(file_name,
"rb")
as file_f:
86 block = file_f.read(HASH_FILE_BLOCK_SIZE)
92 def sign(sk: ecdsa.SigningKey, digest: bytes) -> bytes:
93 return sk.sign_digest(digest)
96 def verify(sig: bytes, vk: ecdsa.VerifyingKey, digest: bytes) -> bool:
98 return vk.verify_digest(sig, digest)
104 return sign(key, KEY_VALIDATION_CHECK_DIGEST)
108 verification_key: ecdsa.VerificationKey,
109 key_evidence: Signature) -> bool:
110 return verify(key_evidence, verification_key, KEY_VALIDATION_CHECK_DIGEST)