| 
					
				 | 
			
			
				@@ -253,7 +253,13 @@ cdef class AES256_CTR_HMAC_SHA256: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cdef unsigned char iv[16] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cdef long long blocks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @staticmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def requirements_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if OPENSSL_VERSION_NUMBER < 0x10000000: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            raise ValueError('AES CTR requires OpenSSL >= 1.0.0. Detected: OpenSSL %08x' % OPENSSL_VERSION_NUMBER) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.requirements_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert isinstance(mac_key, bytes) and len(mac_key) == 32 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert isinstance(enc_key, bytes) and len(enc_key) == 32 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.cipher_blk_len = 16 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -428,6 +434,11 @@ cdef class _AEAD_BASE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cdef unsigned char iv[12] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cdef long long blocks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @staticmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def requirements_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """check whether library requirements for this ciphersuite are satisfied""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise NotImplemented  # override / implement in child class 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert mac_key is None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert isinstance(enc_key, bytes) and len(enc_key) == 32 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -606,25 +617,37 @@ cdef class _CHACHA_BASE(_AEAD_BASE): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cdef class AES256_GCM(_AES_BASE): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @staticmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def requirements_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if OPENSSL_VERSION_NUMBER < 0x10001040: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise ValueError('AES GCM requires OpenSSL >= 1.0.1d. Detected: OpenSSL %08x' % OPENSSL_VERSION_NUMBER) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.requirements_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.cipher = EVP_aes_256_gcm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         super().__init__(mac_key, enc_key, iv=iv, header_len=header_len, aad_offset=aad_offset) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cdef class AES256_OCB(_AES_BASE): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @staticmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def requirements_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if OPENSSL_VERSION_NUMBER < 0x10100000: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise ValueError('AES OCB requires OpenSSL >= 1.1.0. Detected: OpenSSL %08x' % OPENSSL_VERSION_NUMBER) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.requirements_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.cipher = EVP_aes_256_ocb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         super().__init__(mac_key, enc_key, iv=iv, header_len=header_len, aad_offset=aad_offset) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cdef class CHACHA20_POLY1305(_CHACHA_BASE): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @staticmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def requirements_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if OPENSSL_VERSION_NUMBER < 0x10100000: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise ValueError('CHACHA20-POLY1305 requires OpenSSL >= 1.1.0. Detected: OpenSSL %08x' % OPENSSL_VERSION_NUMBER) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, mac_key, enc_key, iv=None, header_len=1, aad_offset=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.requirements_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.cipher = EVP_chacha20_poly1305 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         super().__init__(mac_key, enc_key, iv=iv, header_len=header_len, aad_offset=aad_offset) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |