hkdf.py
 1  #!/usr/bin/env python3
 2  # Copyright (c) 2023-present The Bitcoin Core developers
 3  # Distributed under the MIT software license, see the accompanying
 4  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
 5  
 6  """Test-only HKDF-SHA256 implementation
 7  
 8  It is designed for ease of understanding, not performance.
 9  
10  WARNING: This code is slow and trivially vulnerable to side channel attacks. Do not use for
11  anything but tests.
12  """
13  
14  import hashlib
15  import hmac
16  
17  
18  def hmac_sha256(key, data):
19      """Compute HMAC-SHA256 from specified byte arrays key and data."""
20      return hmac.new(key, data, hashlib.sha256).digest()
21  
22  
23  def hkdf_sha256(length, ikm, salt, info):
24      """Derive a key using HKDF-SHA256."""
25      if len(salt) == 0:
26          salt = bytes([0] * 32)
27      prk = hmac_sha256(salt, ikm)
28      t = b""
29      okm = b""
30      for i in range((length + 32 - 1) // 32):
31          t = hmac_sha256(prk, t + info + bytes([i + 1]))
32          okm += t
33      return okm[:length]