Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
crypto.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 # Copyright (c) 2015-2022 Clearmatics Technologies Ltd
4 #
5 # SPDX-License-Identifier: LGPL-3.0+
6 
7 from __future__ import annotations
8 import ecdsa # type: ignore
9 from Crypto.Hash import SHA512 # pylint: disable=no-name-in-module, import-error
10 
11 
12 HASH = SHA512
13 HASH_BYTE_LENGTH = 64
14 CURVE = ecdsa.NIST521p
15 VerificationKey = ecdsa.VerifyingKey
16 SigningKey = ecdsa.SigningKey
17 Signature = bytes
18 
19 HASH_FILE_BLOCK_SIZE = 4096
20 
21 
22 def _compute_key_validation_digest() -> bytes:
23  h = HASH.new()
24  h.update(KEY_VALIDATION_CHECK_STRING.encode())
25  return h.digest()
26 
27 
28 KEY_VALIDATION_CHECK_STRING: str = "Zeth MPC"
29 KEY_VALIDATION_CHECK_DIGEST: bytes = _compute_key_validation_digest()
30 
31 
32 def export_digest(digest: bytes) -> str:
33  """
34  Digest to string
35  """
36  assert len(digest) == HASH_BYTE_LENGTH
37  return digest.hex()
38 
39 
40 def import_digest(digest_s: str) -> bytes:
41  """
42  Digest from string
43  """
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)
48 
49 
50 def generate_signing_key() -> ecdsa.SigningKey:
51  return ecdsa.SigningKey.generate(curve=CURVE)
52 
53 
54 def export_signing_key(sk: ecdsa.SigningKey) -> bytes:
55  return sk.to_der()
56 
57 
58 def import_signing_key(sk_b: bytes) -> ecdsa.SigningKey:
59  return ecdsa.SigningKey.from_der(sk_b)
60 
61 
62 def get_verification_key(sk: ecdsa.SigningKey) -> ecdsa.VerifyingKey:
63  return sk.get_verifying_key()
64 
65 
66 def export_verification_key(vk: ecdsa.VerifyingKey) -> str:
67  return vk.to_der().hex()
68 
69 
70 def import_verification_key(vk_s: str) -> ecdsa.VerifyingKey:
71  return ecdsa.VerifyingKey.from_der(bytes.fromhex(vk_s))
72 
73 
74 def export_signature(sig: bytes) -> str:
75  return sig.hex()
76 
77 
78 def import_signature(sig_s: str) -> bytes:
79  return bytes.fromhex(sig_s)
80 
81 
82 def compute_file_digest(file_name: str) -> bytes:
83  h = HASH.new()
84  with open(file_name, "rb") as file_f:
85  while True:
86  block = file_f.read(HASH_FILE_BLOCK_SIZE)
87  if not block:
88  return h.digest()
89  h.update(block)
90 
91 
92 def sign(sk: ecdsa.SigningKey, digest: bytes) -> bytes:
93  return sk.sign_digest(digest)
94 
95 
96 def verify(sig: bytes, vk: ecdsa.VerifyingKey, digest: bytes) -> bool:
97  try:
98  return vk.verify_digest(sig, digest)
99  except Exception:
100  return False
101 
102 
103 def create_key_evidence(key: ecdsa.SigningKey) -> Signature:
104  return sign(key, KEY_VALIDATION_CHECK_DIGEST)
105 
106 
108  verification_key: ecdsa.VerificationKey, # pylint: disable=no-member
109  key_evidence: Signature) -> bool:
110  return verify(key_evidence, verification_key, KEY_VALIDATION_CHECK_DIGEST)
coordinator.crypto.import_signing_key
ecdsa.SigningKey import_signing_key(bytes sk_b)
Definition: crypto.py:58
coordinator.crypto.export_signature
str export_signature(bytes sig)
Definition: crypto.py:74
coordinator.crypto.export_verification_key
str export_verification_key(ecdsa.VerifyingKey vk)
Definition: crypto.py:66
coordinator.crypto.compute_file_digest
bytes compute_file_digest(str file_name)
Definition: crypto.py:82
coordinator.crypto.sign
bytes sign(ecdsa.SigningKey sk, bytes digest)
Definition: crypto.py:92
coordinator.crypto.import_digest
bytes import_digest(str digest_s)
Definition: crypto.py:40
coordinator.crypto.import_verification_key
ecdsa.VerifyingKey import_verification_key(str vk_s)
Definition: crypto.py:70
coordinator.crypto.check_key_evidence
bool check_key_evidence(ecdsa.VerificationKey verification_key, Signature key_evidence)
Definition: crypto.py:107
coordinator.crypto.get_verification_key
ecdsa.VerifyingKey get_verification_key(ecdsa.SigningKey sk)
Definition: crypto.py:62
coordinator.crypto.generate_signing_key
ecdsa.SigningKey generate_signing_key()
Definition: crypto.py:50
coordinator.crypto.export_digest
str export_digest(bytes digest)
Definition: crypto.py:32
coordinator.crypto.import_signature
bytes import_signature(str sig_s)
Definition: crypto.py:78
coordinator.crypto.verify
bool verify(bytes sig, ecdsa.VerifyingKey vk, bytes digest)
Definition: crypto.py:96
coordinator.crypto.export_signing_key
bytes export_signing_key(ecdsa.SigningKey sk)
Definition: crypto.py:54
coordinator.crypto.create_key_evidence
Signature create_key_evidence(ecdsa.SigningKey key)
Definition: crypto.py:103