ut_dep.py 4.2 KB

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