| 11 | |
| 12 | // HKDF-expand: OKM = T(1) || T(2) || ... where T(n) = HMAC-SHA256(PRK, T(n-1) || info || n) |
| 13 | function hkdfExpand(prk: Buffer, info: Buffer, length: number): Buffer { |
| 14 | const hashLen = 32 |
| 15 | const n = Math.ceil(length / hashLen) |
| 16 | const okm = Buffer.alloc(n * hashLen) |
| 17 | let prev = Buffer.alloc(0) |
| 18 | |
| 19 | for (let i = 1; i <= n; i++) { |
| 20 | const hmac = createHmac('sha256', prk) |
| 21 | hmac.update(prev) |
| 22 | hmac.update(info) |
| 23 | hmac.update(Buffer.from([i])) |
| 24 | prev = hmac.digest() |
| 25 | prev.copy(okm, (i - 1) * hashLen) |
| 26 | } |
| 27 | |
| 28 | return okm.subarray(0, length) |
| 29 | } |
| 30 | |
| 31 | /** |
| 32 | * Derive a conversation key from a sender private key and recipient public key. |