Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 3x 3x | import { utf8ToBytes } from 'micro-stacks/common';
import { Pbkdf2, Pbkdf2Digests } from './types';
export class WebCryptoPbkdf2 implements Pbkdf2 {
webCrypto: Crypto;
constructor(webCrypto: Crypto) {
this.webCrypto = webCrypto;
}
async derive(
password: string,
salt: Uint8Array,
iterations: number,
keyLength: number,
digest: Pbkdf2Digests
): Promise<Uint8Array> {
let algo: string;
if (digest === 'sha256') {
algo = 'SHA-256';
} else if (digest === 'sha512') {
algo = 'SHA-512';
} else {
throw new Error(`Unsupported Pbkdf2 digest algorithm "${digest}"`);
}
const key = await this.webCrypto.subtle.importKey(
'raw',
utf8ToBytes(password),
'PBKDF2',
false,
['deriveBits']
);
const result: ArrayBuffer = await this.webCrypto.subtle.deriveBits(
{
name: 'PBKDF2',
salt,
iterations,
hash: { name: algo },
},
key,
keyLength * 8
);
return new Uint8Array(result);
}
}
|