This repository has been archived on 2023-04-04. You can view files and clone it, but cannot push or open issues or pull requests.
webcrypto/src/mechs/pbkdf/pbkdf2.ts

42 lines
1.5 KiB
TypeScript
Raw Normal View History

2019-01-25 10:43:13 +00:00
import crypto from "crypto";
import * as core from "webcrypto-core";
2020-03-13 15:20:02 +00:00
import { setCryptoKey, getCryptoKey } from "../storage";
2019-01-25 10:43:13 +00:00
import { PbkdfCryptoKey } from "./key";
export class Pbkdf2Provider extends core.Pbkdf2Provider {
public async onDeriveBits(algorithm: Pbkdf2Params, baseKey: PbkdfCryptoKey, length: number): Promise<ArrayBuffer> {
return new Promise<ArrayBuffer>((resolve, reject) => {
2019-02-14 11:01:58 +00:00
const salt = core.BufferSourceConverter.toArrayBuffer(algorithm.salt);
2019-01-25 10:43:13 +00:00
const hash = (algorithm.hash as Algorithm).name.replace("-", "");
2020-03-13 15:20:02 +00:00
crypto.pbkdf2(getCryptoKey(baseKey).data, Buffer.from(salt), algorithm.iterations, length >> 3, hash, (err, derivedBits) => {
2019-01-25 10:43:13 +00:00
if (err) {
reject(err);
} else {
resolve(new Uint8Array(derivedBits).buffer);
}
});
});
}
2019-03-02 06:25:06 +00:00
public async onImportKey(format: KeyFormat, keyData: JsonWebKey | ArrayBuffer, algorithm: Algorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey> {
2019-01-25 10:43:13 +00:00
if (format === "raw") {
const key = new PbkdfCryptoKey();
key.data = Buffer.from(keyData as ArrayBuffer);
key.algorithm = { name: this.name };
key.extractable = false;
key.usages = keyUsages;
2020-03-13 15:20:02 +00:00
return setCryptoKey(key);
2019-01-25 10:43:13 +00:00
}
throw new core.OperationError("format: Must be 'raw'");
}
2022-03-02 18:35:31 +00:00
public override checkCryptoKey(key: CryptoKey, keyUsage?: KeyUsage) {
2019-01-25 10:43:13 +00:00
super.checkCryptoKey(key, keyUsage);
2020-03-13 15:20:02 +00:00
if (!(getCryptoKey(key) instanceof PbkdfCryptoKey)) {
2019-01-25 10:43:13 +00:00
throw new TypeError("key: Is not PBKDF CryptoKey");
}
}
}