@simplito/privmx-webendpoint
Version:
PrivMX Web Endpoint library
53 lines (52 loc) • 1.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeyStore = void 0;
const AES_GCM_KEY_LENGTH_BYTES = 32;
class KeyStore {
_keys = new Map();
_encryptionKeyId = undefined;
setKeys(keys) {
this._keys.clear();
this._encryptionKeyId = undefined;
for (const k of keys) {
const rawKey = new Uint8Array(k.key);
this.assertKeyBytes(rawKey);
this._keys.set(k.keyId, {
keyId: k.keyId,
cryptoKey: crypto.subtle.importKey("raw", rawKey, { name: "AES-GCM" }, false, [
"encrypt",
"decrypt",
]),
type: k.type,
});
if (k.type === 0) {
this._encryptionKeyId = k.keyId;
}
}
}
async getKey(keyId) {
const key = this._keys.get(keyId);
return key ? key.cryptoKey : undefined;
}
hasKey(keyId) {
return this._keys.has(keyId);
}
async getEncriptionKey() {
if (!this._encryptionKeyId) {
throw new Error("No encryption key set.");
}
return this._keys.get(this._encryptionKeyId).cryptoKey;
}
getEncryptionKeyId() {
if (!this._encryptionKeyId) {
throw new Error("No encryption key set.");
}
return this._encryptionKeyId;
}
assertKeyBytes(keyBytes) {
if (keyBytes.length !== AES_GCM_KEY_LENGTH_BYTES) {
throw new Error(`Invalid key length: ${keyBytes.length}`);
}
}
}
exports.KeyStore = KeyStore;