mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/usr/bin/env python3
 | |
| # -*-coding:UTF-8 -*
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import redis
 | |
| 
 | |
| from hashlib import sha256
 | |
| 
 | |
| sys.path.append(os.path.join(os.environ['AIL_BIN'], 'packages'))
 | |
| import Correlation
 | |
| 
 | |
| sys.path.append(os.path.join(os.environ['AIL_BIN'], 'lib/'))
 | |
| import ConfigLoader
 | |
| 
 | |
| config_loader = ConfigLoader.ConfigLoader()
 | |
| r_serv_metadata = config_loader.get_redis_conn("ARDB_Metadata")
 | |
| config_loader = None
 | |
| 
 | |
| digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
 | |
| 
 | |
| cryptocurrency = Correlation.Correlation('cryptocurrency', ['bitcoin', 'ethereum', 'bitcoin-cash', 'litecoin', 'monero', 'zcash', 'dash'])
 | |
| 
 | |
| # http://rosettacode.org/wiki/Bitcoin/address_validation#Python
 | |
| def decode_base58(bc, length):
 | |
|     n = 0
 | |
|     for char in bc:
 | |
|         n = n * 58 + digits58.index(char)
 | |
|     return n.to_bytes(length, 'big')
 | |
| 
 | |
| # http://rosettacode.org/wiki/Bitcoin/address_validation#Python
 | |
| def check_base58_address(bc):
 | |
|     try:
 | |
|         bcbytes = decode_base58(bc, 25)
 | |
|         return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4]
 | |
|     except Exception:
 | |
|         return False
 | |
| 
 | |
| def verify_cryptocurrency_address(cryptocurrency_type, cryptocurrency_address):
 | |
|     if cryptocurrency_type in ('bitcoin', 'litecoin', 'dash'):
 | |
|         return check_base58_address(cryptocurrency_address)
 | |
|     else:
 | |
|         return True
 | |
| 
 | |
| 
 | |
| def get_cryptocurrency(request_dict, cryptocurrency_type):
 | |
|     # basic verification
 | |
|     res = cryptocurrency.verify_correlation_field_request(request_dict, cryptocurrency_type)
 | |
|     if res:
 | |
|         return res
 | |
|     # cerify address
 | |
|     field_name = request_dict.get(cryptocurrency_type)
 | |
|     if not verify_cryptocurrency_address(cryptocurrency_type, field_name):
 | |
|         return ( {'status': 'error', 'reason': 'Invalid Cryptocurrency address'}, 400 )
 | |
| 
 | |
|     return cryptocurrency.get_correlation(request_dict, cryptocurrency_type, field_name)
 | |
| 
 | |
| 
 | |
| def get_cryptocurrency_symbol(crypto_type):
 | |
|     if crypto_type=='bitcoin':
 | |
|         return 'BTC'
 | |
|     elif crypto_type=='ethereum':
 | |
|         return 'ETH'
 | |
|     elif crypto_type=='bitcoin-cash':
 | |
|         return 'BCH'
 | |
|     elif crypto_type=='litecoin':
 | |
|         return 'LTC'
 | |
|     elif crypto_type=='monero':
 | |
|         return 'XMR'
 | |
|     elif crypto_type=='zcash':
 | |
|         return 'ZEC'
 | |
|     elif crypto_type=='dash':
 | |
|         return 'DASH'
 | |
|     return None
 | |
| 
 | |
| def get_cryptocurrency_type(crypto_symbol):
 | |
|     if crypto_symbol=='BTC':
 | |
|         return 'bitcoin'
 | |
|     elif crypto_symbol=='ETH':
 | |
|         return 'ethereum'
 | |
|     elif crypto_symbol=='BCH':
 | |
|         return 'bitcoin-cash'
 | |
|     elif crypto_symbol=='LTC':
 | |
|         return 'litecoin'
 | |
|     elif crypto_symbol=='XMR':
 | |
|         return 'monero'
 | |
|     elif crypto_symbol=='ZEC':
 | |
|         return 'zcash'
 | |
|     elif crypto_symbol=='DASH':
 | |
|         return 'dash'
 | |
|     return None
 |