hkdf.mx raw

   1  package hkdf
   2  
   3  import "smesh.lol/web/common/crypto/hmac"
   4  
   5  // Extract computes HKDF-Extract: PRK = HMAC-SHA256(salt, ikm).
   6  func Extract(salt, ikm []byte) [32]byte {
   7  	if len(salt) == 0 {
   8  		salt = []byte{:32}
   9  	}
  10  	return hmac.Sum(salt, ikm)
  11  }
  12  
  13  // Expand computes HKDF-Expand using HMAC-SHA256.
  14  // Returns length bytes of output keying material.
  15  func Expand(prk, info []byte, length int) []byte {
  16  	out := []byte{:0:length}
  17  	var prev []byte
  18  	counter := byte(1)
  19  	for len(out) < length {
  20  		// T(i) = HMAC(PRK, T(i-1) || info || counter)
  21  		input := []byte{:len(prev)+len(info)+1}
  22  		copy(input, prev)
  23  		copy(input[len(prev):], info)
  24  		input[len(input)-1] = counter
  25  		t := hmac.Sum(prk[:], input)
  26  		prev = t[:]
  27  		out = append(out, t[:]...)
  28  		counter++
  29  	}
  30  	return out[:length]
  31  }
  32