Added internal python-only HKDF

This commit is contained in:
Mark Qvist 2022-06-07 15:26:45 +02:00
parent f1dcda82ac
commit 5bb510b589
1 changed files with 35 additions and 0 deletions

35
RNS/Cryptography/HKDF.py Normal file
View File

@ -0,0 +1,35 @@
import hashlib
from math import ceil
from RNS.Cryptography import HMAC
def hkdf(length=None, derive_from=None, salt=None, context=None):
hash_len = 32
def hmac_sha256(key, data):
return HMAC.new(key, data, hashlib.sha256).digest()
if length == None or length < 1:
raise ValueError("Invalid output key length")
if derive_from == "None" or derive_from == "":
raise ValueError("Cannot derive key from empty input material")
if salt == None or len(salt) == 0:
salt = bytes([0] * hash_len)
if salt == None:
salt = b""
if context == None:
context = b""
pseudorandom_key = hmac_sha256(salt, derive_from)
block = b""
derived = b""
for i in range(ceil(length / hash_len)):
block = hmac_sha256(pseudorandom_key, block + context + bytes([i + 1]))
derived += block
return derived[:length]