ut_dep.py 3.8 KB

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