| 
						
						
							
								
							
						
						
					 | 
					@ -45,9 +45,29 @@ def load_openssl(): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if libcrypto_path: | 
					 | 
					 | 
					        if libcrypto_path: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            break | 
					 | 
					 | 
					            break | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    else: | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        # We may get here when find_library fails because, for example, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        # the user does not have sufficient privileges to access those | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        # tools underlying find_library on linux. | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        import glob | 
					 | 
					 | 
					        import glob | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        for libcrypto_path in glob.glob('/usr/lib/libcrypto.*'): | 
					 | 
					 | 
					        import sys | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            pass | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        patterns = ['/usr/lib/libcrypto.*'] | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        # Some linux distros may store so in alternative locations | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if sys.maxsize > 2 ** 32: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            # Python is 64-bit | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            patterns.extend(['/usr/lib64/libcrypto.*']) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        else: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            # Python is 32-bit | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            patterns.extend(['/usr/lib32/libcrypto.*']) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        for pat in patterns: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            files = glob.glob(pat) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            if files: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                libcrypto_path = files[0] | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                break | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if libcrypto_path is None: | 
					 | 
					 | 
					    if libcrypto_path is None: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        raise Exception('libcrypto(OpenSSL) not found') | 
					 | 
					 | 
					        raise Exception('libcrypto(OpenSSL) not found') | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    logging.info('loading libcrypto from %s', libcrypto_path) | 
					 | 
					 | 
					    logging.info('loading libcrypto from %s', libcrypto_path) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -83,9 +103,9 @@ def load_cipher(cipher_name): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					class CtypesCrypto(object): | 
					 | 
					 | 
					class CtypesCrypto(object): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    def __init__(self, cipher_name, key, iv, op): | 
					 | 
					 | 
					    def __init__(self, cipher_name, key, iv, op): | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        self._ctx = None | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if not loaded: | 
					 | 
					 | 
					        if not loaded: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            load_openssl() | 
					 | 
					 | 
					            load_openssl() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        self._ctx = None | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        cipher = libcrypto.EVP_get_cipherbyname(cipher_name) | 
					 | 
					 | 
					        cipher = libcrypto.EVP_get_cipherbyname(cipher_name) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        if not cipher: | 
					 | 
					 | 
					        if not cipher: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            cipher = load_cipher(cipher_name) | 
					 | 
					 | 
					            cipher = load_cipher(cipher_name) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |