|  | @@ -54,11 +54,28 @@ except ImportError:
 | 
	
		
			
				|  |  |      import slownacl_curve25519
 | 
	
		
			
				|  |  |      curve25519mod = slownacl_curve25519
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import hashlib
 | 
	
		
			
				|  |  |  try:
 | 
	
		
			
				|  |  |      import sha3
 | 
	
		
			
				|  |  |  except ImportError:
 | 
	
		
			
				|  |  | -    # error code 77 tells automake to skip this test
 | 
	
		
			
				|  |  | -    sys.exit(77)
 | 
	
		
			
				|  |  | +    # In python 3.6, the sha3 functions are in hashlib whether we
 | 
	
		
			
				|  |  | +    # import sha3 or not.
 | 
	
		
			
				|  |  | +    pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +try:
 | 
	
		
			
				|  |  | +    # Pull the sha3 functions in.
 | 
	
		
			
				|  |  | +    from hashlib import sha3_256, shake_256
 | 
	
		
			
				|  |  | +    shake_squeeze = shake_256.digest
 | 
	
		
			
				|  |  | +except ImportError:
 | 
	
		
			
				|  |  | +    if hasattr(sha3, "SHA3256"):
 | 
	
		
			
				|  |  | +        # If this happens, then we have the old "sha3" module which
 | 
	
		
			
				|  |  | +        # hashlib and pysha3 superseded.
 | 
	
		
			
				|  |  | +        sha3_256 = sha3.SHA3256
 | 
	
		
			
				|  |  | +        shake_256 = sha3.SHAKE256
 | 
	
		
			
				|  |  | +        shake_squeeze = shake_256.squeeze
 | 
	
		
			
				|  |  | +    else:
 | 
	
		
			
				|  |  | +        # error code 77 tells automake to skip this test
 | 
	
		
			
				|  |  | +        sys.exit(77)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # Import Nick's ntor reference implementation in Python
 | 
	
		
			
				|  |  |  # We are gonna use a few of its utilities.
 | 
	
	
		
			
				|  | @@ -81,7 +98,7 @@ def mac(k,m):
 | 
	
		
			
				|  |  |      def htonll(num):
 | 
	
		
			
				|  |  |          return struct.pack('!q', num)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    s = sha3.SHA3256()
 | 
	
		
			
				|  |  | +    s = sha3_256()
 | 
	
		
			
				|  |  |      s.update(htonll(len(k)))
 | 
	
		
			
				|  |  |      s.update(k)
 | 
	
		
			
				|  |  |      s.update(m)
 | 
	
	
		
			
				|  | @@ -107,9 +124,9 @@ def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey,
 | 
	
		
			
				|  |  |      assert(len(secret) == INTRO_SECRET_LEN)
 | 
	
		
			
				|  |  |      info = M_HSEXPAND + subcredential
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    kdf = sha3.SHAKE256()
 | 
	
		
			
				|  |  | +    kdf = shake_256()
 | 
	
		
			
				|  |  |      kdf.update(secret + T_HSENC + info)
 | 
	
		
			
				|  |  | -    key_material = kdf.squeeze(64*8)
 | 
	
		
			
				|  |  | +    key_material = shake_squeeze(kdf, 64*8)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      enc_key = key_material[0:32]
 | 
	
		
			
				|  |  |      mac_key = key_material[32:64]
 | 
	
	
		
			
				|  | @@ -139,9 +156,9 @@ def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_pr
 | 
	
		
			
				|  |  |      assert(len(secret) == INTRO_SECRET_LEN)
 | 
	
		
			
				|  |  |      info = M_HSEXPAND + subcredential
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    kdf = sha3.SHAKE256()
 | 
	
		
			
				|  |  | +    kdf = shake_256()
 | 
	
		
			
				|  |  |      kdf.update(secret + T_HSENC + info)
 | 
	
		
			
				|  |  | -    key_material = kdf.squeeze(64*8)
 | 
	
		
			
				|  |  | +    key_material = shake_squeeze(kdf, 64*8)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      enc_key = key_material[0:32]
 | 
	
		
			
				|  |  |      mac_key = key_material[32:64]
 |