1import { modPow, bigIntToU8Array, u8ArrayToBigInt } from "./bigint.js";
17export class DHCipher {
23 this._privateKey = null;
27 return { name: "DH" };
30 static generateKey(algorithm, _extractable) {
31 const cipher = new DHCipher;
32 cipher._generateKey(algorithm);
33 return { privateKey: cipher, publicKey: new DHPublicKey(cipher._publicKey) };
36 _generateKey(algorithm) {
37 const g = algorithm.g;
38 const p = algorithm.p;
39 this._keyBytes = p.length;
40 this._gBigInt = u8ArrayToBigInt(g);
41 this._pBigInt = u8ArrayToBigInt(p);
42 this._privateKey = window.crypto.getRandomValues(new Uint8Array(this._keyBytes));
43 this._privateKeyBigInt = u8ArrayToBigInt(this._privateKey);
44 this._publicKey = bigIntToU8Array(modPow(
45 this._gBigInt, this._privateKeyBigInt, this._pBigInt), this._keyBytes);
48 deriveBits(algorithm, length) {
49 const bytes = Math.ceil(length / 8);
50 const pkey = new Uint8Array(algorithm.public);
51 const len = bytes > this._keyBytes ? bytes : this._keyBytes;
52 const secret = modPow(u8ArrayToBigInt(pkey), this._privateKeyBigInt, this._pBigInt);
53 return bigIntToU8Array(secret, len).slice(0, len);