mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2025-01-15 08:44:59 -05:00
1139a37338
Signed-off-by: si458 <simonsmith5521@gmail.com>
56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
import { modPow, bigIntToU8Array, u8ArrayToBigInt } from "./bigint.js";
|
|
|
|
class DHPublicKey {
|
|
constructor(key) {
|
|
this._key = key;
|
|
}
|
|
|
|
get algorithm() {
|
|
return { name: "DH" };
|
|
}
|
|
|
|
exportKey() {
|
|
return this._key;
|
|
}
|
|
}
|
|
|
|
export class DHCipher {
|
|
constructor() {
|
|
this._g = null;
|
|
this._p = null;
|
|
this._gBigInt = null;
|
|
this._pBigInt = null;
|
|
this._privateKey = null;
|
|
}
|
|
|
|
get algorithm() {
|
|
return { name: "DH" };
|
|
}
|
|
|
|
static generateKey(algorithm, _extractable) {
|
|
const cipher = new DHCipher;
|
|
cipher._generateKey(algorithm);
|
|
return { privateKey: cipher, publicKey: new DHPublicKey(cipher._publicKey) };
|
|
}
|
|
|
|
_generateKey(algorithm) {
|
|
const g = algorithm.g;
|
|
const p = algorithm.p;
|
|
this._keyBytes = p.length;
|
|
this._gBigInt = u8ArrayToBigInt(g);
|
|
this._pBigInt = u8ArrayToBigInt(p);
|
|
this._privateKey = window.crypto.getRandomValues(new Uint8Array(this._keyBytes));
|
|
this._privateKeyBigInt = u8ArrayToBigInt(this._privateKey);
|
|
this._publicKey = bigIntToU8Array(modPow(
|
|
this._gBigInt, this._privateKeyBigInt, this._pBigInt), this._keyBytes);
|
|
}
|
|
|
|
deriveBits(algorithm, length) {
|
|
const bytes = Math.ceil(length / 8);
|
|
const pkey = new Uint8Array(algorithm.public);
|
|
const len = bytes > this._keyBytes ? bytes : this._keyBytes;
|
|
const secret = modPow(u8ArrayToBigInt(pkey), this._privateKeyBigInt, this._pBigInt);
|
|
return bigIntToU8Array(secret, len).slice(0, len);
|
|
}
|
|
}
|