keygen.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
  5. # Licensed under the GNU General Public License, Version 3:
  6. # https://www.gnu.org/licenses
  7. # Public project repositories:
  8. # https://github.com/mmgen/mmgen-wallet
  9. # https://gitlab.com/mmgen/mmgen-wallet
  10. """
  11. proto.zec.keygen: Zcash-Z public key generation backend for the MMGen suite
  12. """
  13. from ...key import PubKey
  14. from ...keygen import keygen_base
  15. class backend:
  16. class nacl(keygen_base):
  17. production_safe = True
  18. def __init__(self,cfg):
  19. super().__init__(cfg)
  20. from nacl.bindings import crypto_scalarmult_base
  21. self.crypto_scalarmult_base = crypto_scalarmult_base
  22. from ...sha2 import Sha256
  23. self.Sha256 = Sha256
  24. def zhash256(self,s,t):
  25. s = bytearray(s + bytes(32))
  26. s[0] |= 0xc0
  27. s[32] = t
  28. return self.Sha256(s,preprocess=False).digest()
  29. def to_pubkey(self,privkey):
  30. return PubKey(
  31. self.zhash256(privkey,0)
  32. + self.crypto_scalarmult_base(self.zhash256(privkey,1)),
  33. compressed = privkey.compressed
  34. )
  35. def to_viewkey(self,privkey):
  36. vk = bytearray( self.zhash256(privkey,0) + self.zhash256(privkey,1) )
  37. vk[32] &= 0xf8
  38. vk[63] &= 0x7f
  39. vk[63] |= 0x40
  40. return vk