keygen.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2023 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
  9. # https://gitlab.com/mmgen/mmgen
  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. def __init__(self):
  18. from nacl.bindings import crypto_scalarmult_base
  19. self.crypto_scalarmult_base = crypto_scalarmult_base
  20. from ...sha2 import Sha256
  21. self.Sha256 = Sha256
  22. def zhash256(self,s,t):
  23. s = bytearray(s + bytes(32))
  24. s[0] |= 0xc0
  25. s[32] = t
  26. return self.Sha256(s,preprocess=False).digest()
  27. def to_pubkey(self,privkey):
  28. return PubKey(
  29. self.zhash256(privkey,0)
  30. + self.crypto_scalarmult_base(self.zhash256(privkey,1)),
  31. compressed = privkey.compressed
  32. )
  33. def to_viewkey(self,privkey):
  34. vk = bytearray( self.zhash256(privkey,0) + self.zhash256(privkey,1) )
  35. vk[32] &= 0xf8
  36. vk[63] &= 0x7f
  37. vk[63] |= 0x40
  38. return vk