SPB Git forge

spb/admin-ka

Public
41commits 1branches 0releases
172.9 MBsize
maindefault branch
19 days agolast push
JavaScript 65.5% Python 17.8% CSS 13% HTML 3.7%
1.6 KB · 56 lines javascript
Raw Blame History
1import { modPow, bigIntToU8Array, u8ArrayToBigInt } from "./bigint.js";23class DHPublicKey {4    constructor(key) {5        this._key = key;6    }78    get algorithm() {9        return { name: "DH" };10    }1112    exportKey() {13        return this._key;14    }15}1617export class DHCipher {18    constructor() {19        this._g = null;20        this._p = null;21        this._gBigInt = null;22        this._pBigInt = null;23        this._privateKey = null;24    }2526    get algorithm() {27        return { name: "DH" };28    }2930    static generateKey(algorithm, _extractable) {31        const cipher = new DHCipher;32        cipher._generateKey(algorithm);33        return { privateKey: cipher, publicKey: new DHPublicKey(cipher._publicKey) };34    }3536    _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);46    }4748    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);54    }55}56