|
@@ -54,11 +54,28 @@ except ImportError:
|
|
|
import slownacl_curve25519
|
|
|
curve25519mod = slownacl_curve25519
|
|
|
|
|
|
+import hashlib
|
|
|
try:
|
|
|
import sha3
|
|
|
except ImportError:
|
|
|
-
|
|
|
- sys.exit(77)
|
|
|
+
|
|
|
+
|
|
|
+ pass
|
|
|
+
|
|
|
+try:
|
|
|
+
|
|
|
+ from hashlib import sha3_256, shake_256
|
|
|
+ shake_squeeze = shake_256.digest
|
|
|
+except ImportError:
|
|
|
+ if hasattr(sha3, "SHA3256"):
|
|
|
+
|
|
|
+
|
|
|
+ sha3_256 = sha3.SHA3256
|
|
|
+ shake_256 = sha3.SHAKE256
|
|
|
+ shake_squeeze = shake_256.squeeze
|
|
|
+ else:
|
|
|
+
|
|
|
+ sys.exit(77)
|
|
|
|
|
|
|
|
|
|
|
@@ -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]
|