mirror of
https://github.com/morgan9e/noiseprotocol
synced 2026-04-14 00:14:05 +09:00
Enabling Blake2b/s support via hashlib
noise/functions.py * Turning off Cryptography's primitives for hmac and hash functions, using ones from python's hashlib instead. tests/test_vectors.py * Enabled blake2b/s tests
This commit is contained in:
@@ -1,14 +1,17 @@
|
||||
import abc
|
||||
from functools import partial
|
||||
|
||||
from cryptography.hazmat.primitives.hmac import HMAC
|
||||
import hashlib
|
||||
import hmac
|
||||
|
||||
from .crypto import ed448
|
||||
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
from cryptography.hazmat.primitives import hashes
|
||||
from cryptography.hazmat.primitives.ciphers.aead import AESGCM, ChaCha20Poly1305
|
||||
# from cryptography.hazmat.primitives import hashes # Turn back on when Cryptography gets fixed
|
||||
from cryptography.hazmat.primitives.asymmetric import x25519
|
||||
from cryptography.hazmat.primitives.ciphers.aead import AESGCM, ChaCha20Poly1305
|
||||
# from cryptography.hazmat.primitives.hmac import HMAC # Turn back on when Cryptography gets fixed
|
||||
|
||||
backend = default_backend()
|
||||
|
||||
|
||||
class DH(object):
|
||||
@@ -77,44 +80,60 @@ class Hash(object):
|
||||
self.hashlen = 32
|
||||
self.blocklen = 64
|
||||
self.hash = self._hash_sha256
|
||||
self.fn = hashes.SHA256
|
||||
# self.fn = hashes.SHA256 # Turn back on when Cryptography gets fixed
|
||||
self.fn = 'SHA256'
|
||||
elif method == 'SHA512':
|
||||
self.hashlen = 64
|
||||
self.blocklen = 128
|
||||
self.hash = self._hash_sha512
|
||||
self.fn = hashes.SHA512
|
||||
# self.fn = hashes.SHA512 # Turn back on when Cryptography gets fixed
|
||||
self.fn = 'SHA512'
|
||||
elif method == 'BLAKE2s':
|
||||
self.hashlen = 32
|
||||
self.blocklen = 64
|
||||
self.hash = self._hash_blake2s
|
||||
self.fn = partial(hashes.BLAKE2s, digest_size=self.hashlen)
|
||||
# self.fn = partial(hashes.BLAKE2s, digest_size=self.hashlen) # Turn back on when Cryptography gets fixed
|
||||
self.fn = 'blake2s'
|
||||
elif method == 'BLAKE2b':
|
||||
self.hashlen = 64
|
||||
self.blocklen = 128
|
||||
self.hash = self._hash_blake2b
|
||||
self.fn = partial(hashes.BLAKE2b, digest_size=self.hashlen)
|
||||
# self.fn = partial(hashes.BLAKE2b, digest_size=self.hashlen) # Turn back on when Cryptography gets fixed
|
||||
self.fn = 'blake2b'
|
||||
else:
|
||||
raise NotImplementedError('Hash method: {}'.format(method))
|
||||
|
||||
def _hash_sha256(self, data):
|
||||
digest = hashes.Hash(hashes.SHA256(), default_backend())
|
||||
digest.update(data)
|
||||
return digest.finalize()
|
||||
return hashlib.sha256(data).digest()
|
||||
|
||||
def _hash_sha512(self, data):
|
||||
digest = hashes.Hash(hashes.SHA512(), default_backend())
|
||||
digest.update(data)
|
||||
return digest.finalize()
|
||||
return hashlib.sha512(data).digest()
|
||||
|
||||
def _hash_blake2s(self, data):
|
||||
digest = hashes.Hash(hashes.BLAKE2s(digest_size=self.hashlen), default_backend())
|
||||
digest.update(data)
|
||||
return digest.finalize()
|
||||
return hashlib.blake2s(data).digest()
|
||||
|
||||
def _hash_blake2b(self, data):
|
||||
digest = hashes.Hash(hashes.BLAKE2b(digest_size=self.hashlen), default_backend())
|
||||
digest.update(data)
|
||||
return digest.finalize()
|
||||
return hashlib.blake2b(data).digest()
|
||||
|
||||
# def _hash_sha256(self, data): # Turn back on when Cryptography gets fixed
|
||||
# digest = hashes.Hash(hashes.SHA256(), backend)
|
||||
# digest.update(data)
|
||||
# return digest.finalize()
|
||||
#
|
||||
# def _hash_sha512(self, data): # Turn back on when Cryptography gets fixed
|
||||
# digest = hashes.Hash(hashes.SHA512(), backend)
|
||||
# digest.update(data)
|
||||
# return digest.finalize()
|
||||
#
|
||||
# def _hash_blake2s(self, data): # Turn back on when Cryptography gets fixed
|
||||
# digest = hashes.Hash(hashes.BLAKE2s(digest_size=self.hashlen), backend)
|
||||
# digest.update(data)
|
||||
# return digest.finalize()
|
||||
#
|
||||
# def _hash_blake2b(self, data): # Turn back on when Cryptography gets fixed
|
||||
# digest = hashes.Hash(hashes.BLAKE2b(digest_size=self.hashlen), backend)
|
||||
# digest.update(data)
|
||||
# return digest.finalize()
|
||||
|
||||
|
||||
class _KeyPair(object):
|
||||
@@ -176,11 +195,15 @@ keypair_map = {
|
||||
}
|
||||
|
||||
|
||||
# def hmac_hash(key, data, algorithm): # Turn back on when Cryptography gets fixed
|
||||
# # Applies HMAC using the HASH() function.
|
||||
# hmac = HMAC(key=key, algorithm=algorithm(), backend=backend)
|
||||
# hmac.update(data=data)
|
||||
# return hmac.finalize()
|
||||
|
||||
def hmac_hash(key, data, algorithm):
|
||||
# Applies HMAC using the HASH() function.
|
||||
hmac = HMAC(key=key, algorithm=algorithm(), backend=default_backend())
|
||||
hmac.update(data=data)
|
||||
return hmac.finalize()
|
||||
return hmac.new(key, data, algorithm).digest()
|
||||
|
||||
|
||||
def hkdf(chaining_key, input_key_material, num_outputs, hmac_hash_fn):
|
||||
|
||||
@@ -35,7 +35,7 @@ def _prepare_test_vectors():
|
||||
for vector in vectors_list:
|
||||
if 'name' in vector and not 'protocol_name' in vector: # noise-c-* workaround
|
||||
vector['protocol_name'] = vector['name']
|
||||
if '_448_' in vector['protocol_name'] or 'psk' in vector['protocol_name'] or 'BLAKE' in vector['protocol_name'] or 'PSK' in vector['protocol_name']:
|
||||
if '_448_' in vector['protocol_name'] or 'psk' in vector['protocol_name'] or 'PSK' in vector['protocol_name']:
|
||||
continue # TODO REMOVE WHEN ed448/psk/blake SUPPORT IS IMPLEMENTED/FIXED
|
||||
for key, value in vector.copy().items():
|
||||
if key in byte_fields:
|
||||
|
||||
Reference in New Issue
Block a user