gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 870 B
JavaScript
/*! Copyright 2023-2024 the gnablib contributors MPL-1.1 */
import{Hmac as t}from"../mac/Hmac.js";import{sNum as e}from"../../safe/safe.js";export function extract(e,n,r){const s=new t(e,null!=r?r:new Uint8Array(e.blockSize));return s.write(n),s.sum()}export function expand(n,r,s,a){e("lenBytes",s).unsigned().atMost(255*n.size).throwNot(),a=null!=a?a:new Uint8Array(0);const o=Math.floor(s/n.size),i=new Uint8Array(s),l=new Uint8Array(n.size+1+a.length);let u=new Uint8Array(0),c=1,w=0,f=0;const h=new t(n,r);for(;c<=o;)l.set(u,0),l.set(a,u.length),f=u.length+a.length,l[f]=c,f+=1,h.write(l.subarray(0,f)),u=h.sum(),h.reset(),i.set(u,w),c++,w+=n.size;const m=s-w;return m>0&&(l.set(u,0),l.set(a,u.length),f=u.length+a.length,l[f]=c,f+=1,h.write(l.subarray(0,f)),u=h.sum(),i.set(u.subarray(0,m),w)),i}export function hkdf(t,e,n,r,s){return expand(t,extract(t,e,r),n,s)}