ut_dep.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #!/usr/bin/env python3
  2. """
  3. test.modtest_d.ut_dep: dependency unit tests for the MMGen suite
  4. Test whether dependencies are installed and functional.
  5. No data verification is performed.
  6. """
  7. import time
  8. from subprocess import run, PIPE
  9. from mmgen.util import msg, rmsg, ymsg, gmsg
  10. from mmgen.exception import NoLEDSupport
  11. from ..include.common import cfg, vmsg, check_solc_ver
  12. class unit_tests:
  13. altcoin_deps = ('py_ecc', 'solc', 'keccak', 'pysocks')
  14. win_skip = ('led',)
  15. def led(self, name, ut):
  16. from mmgen.led import LEDControl
  17. try:
  18. LEDControl(enabled=True)
  19. except NoLEDSupport:
  20. ymsg('Warning: no LED support on this platform')
  21. else:
  22. gmsg('LED support found!')
  23. return True
  24. def keccak(self, name, ut): # used by ETH, XMR
  25. from mmgen.util2 import get_keccak
  26. try:
  27. keccak_256 = get_keccak()
  28. keccak_256(b'abc')
  29. except Exception as e:
  30. rmsg(str(e))
  31. return False
  32. else:
  33. return True
  34. def py_ecc(self, name, ut): # ETH
  35. from py_ecc.secp256k1 import privtopub
  36. return True
  37. def pysocks(self, name, ut):
  38. import requests, urllib3
  39. urllib3.disable_warnings()
  40. session = requests.Session()
  41. session.trust_env = False
  42. session.proxies.update({'https':'socks5h://127.243.172.8:20677'})
  43. try:
  44. session.get('https://127.188.29.17', timeout=1)
  45. except Exception as e:
  46. if type(e).__name__ in ('ConnectionError', 'ConnectTimeout'):
  47. return True
  48. else:
  49. ymsg('{}: {}'.format(type(e).__name__, e))
  50. msg('Is the ‘pysocks’ package installed?')
  51. return False
  52. def secp256k1(self, name, ut):
  53. cp = run(['python3', './setup.py', 'build_ext', '--inplace'], stdout=PIPE, stderr=PIPE)
  54. if cp.stderr:
  55. vmsg(cp.stderr.decode())
  56. time.sleep(0.5)
  57. from mmgen.proto.secp256k1.secp256k1 import pubkey_gen
  58. pubkey_gen(bytes.fromhex('deadbeef'*8), 1)
  59. return True
  60. def cryptography(self, name, ut):
  61. from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
  62. from cryptography.hazmat.backends import default_backend
  63. c = Cipher(algorithms.AES(b'deadbeef'*4), modes.CTR(b'deadbeef'*2), backend=default_backend())
  64. encryptor = c.encryptor()
  65. encryptor.update(b'foo') + encryptor.finalize()
  66. return True
  67. def ecdsa(self, name, ut):
  68. import ecdsa
  69. pko = ecdsa.SigningKey.from_secret_exponent(12345678901234, curve=ecdsa.SECP256k1)
  70. pko.get_verifying_key().to_string().hex()
  71. return True
  72. def ripemd160(self, name, ut):
  73. import hashlib
  74. if hashlib.new.__name__ == 'hashlib_new_wrapper':
  75. ymsg('Warning: RIPEMD160 missing in hashlib, falling back on pure-Python implementation')
  76. hashlib.new('ripemd160')
  77. return True
  78. def gmpy(self, name, ut):
  79. from gmpy2 import context, set_context, sqrt, cbrt
  80. # context() parameters are platform-dependent!
  81. set_context(context(precision=75, round=1)) # OK for gmp 6.1.2 / gmpy 2.1.0
  82. return True
  83. def aiohttp(self, name, ut):
  84. import asyncio, aiohttp
  85. async def do():
  86. async with aiohttp.ClientSession(
  87. headers = {'Content-Type': 'application/json'},
  88. connector = aiohttp.TCPConnector(),
  89. ):
  90. pass
  91. asyncio.run(do())
  92. return True
  93. def pexpect(self, name, ut):
  94. import pexpect
  95. from pexpect.popen_spawn import PopenSpawn
  96. return True
  97. def scrypt(self, name, ut):
  98. passwd, salt = b'foo', b'bar'
  99. N, r, p = 4, 8, 16
  100. buflen = 64
  101. vmsg('Testing builtin scrypt module (hashlib)')
  102. from hashlib import scrypt # max N == 14!!
  103. scrypt(password=passwd, salt=salt, n=2**N, r=r, p=p, maxmem=0, dklen=buflen)
  104. vmsg('Testing standalone scrypt module')
  105. import scrypt
  106. scrypt.hash(passwd, salt, N=2**N, r=r, p=p, buflen=buflen)
  107. return True
  108. def solc(self, name, ut):
  109. from mmgen.protocol import init_proto
  110. solc_ok = check_solc_ver()
  111. if solc_ok:
  112. cmd = [
  113. 'python3',
  114. 'scripts/create-token.py',
  115. '--coin=ETH',
  116. '--name=My Fake Token',
  117. '--symbol=FAKE',
  118. '--supply=100000000000000000000000000',
  119. '--decimals=18',
  120. '--stdout',
  121. init_proto(cfg, 'eth').checksummed_addr('deadbeef'*5),
  122. ]
  123. cp = run(cmd, stdout=PIPE, stderr=PIPE)
  124. vmsg(cp.stderr.decode())
  125. if cp.returncode:
  126. msg(cp.stderr.decode())
  127. return False
  128. return True