@authduo/authduo
Version:
Free User-sovereign Authentication for the World
43 lines • 1.85 kB
JavaScript
import { Hex } from "@benev/slate";
import { Pubkey } from "./pubkey.js";
import { Token } from "./jwt/token.js";
import { CryptoConstants } from "./crypto-constants.js";
export class Keypair extends Pubkey {
privateKey;
constructor(thumbprint, publicKey, privateKey) {
super(thumbprint, publicKey);
this.privateKey = privateKey;
}
static async generate() {
const keys = await crypto.subtle
.generateKey(CryptoConstants.algos.generate, true, ["sign", "verify"]);
const publicBuffer = await crypto.subtle
.exportKey(CryptoConstants.formats.public, keys.publicKey);
const thumbprint = Hex.string(new Uint8Array(await crypto.subtle.digest(CryptoConstants.algos.thumbprint, publicBuffer)));
return new this(thumbprint, keys.publicKey, keys.privateKey);
}
static async fromData(data) {
const pubkey = await Pubkey.fromData(data);
const extractable = true;
const privateBuffer = Hex.bytes(data.privateKey).buffer;
const privateKey = await crypto.subtle.importKey(CryptoConstants.formats.private, privateBuffer, CryptoConstants.algos.generate, extractable, ["sign"]);
return new this(pubkey.thumbprint, pubkey.publicKey, privateKey);
}
async toData() {
const pubkey = await super.toData();
const privateBuffer = await crypto.subtle
.exportKey(CryptoConstants.formats.private, this.privateKey);
return {
thumbprint: pubkey.thumbprint,
publicKey: pubkey.publicKey,
privateKey: Hex.string(new Uint8Array(privateBuffer)),
};
}
toPubkey() {
return new Pubkey(this.thumbprint, this.publicKey);
}
async sign(payload) {
return await Token.sign(this.privateKey, payload);
}
}
//# sourceMappingURL=keypair.js.map