ut_dep.py 3.9 KB

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