You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.8 KiB
JavaScript

"use strict";
const unreachable = require("@joepie91/unreachable");
const matchValue = require("match-value");
const defaultValue = require("default-value");
const normalizeEncryptionAlgorithmName = require("../normalize-encryption-algorithm-name");
const normalizePassphraseAlgorithmName = require("../normalize-passphrase-algorithm-name");
let keyIDRegex = /^m\.secret_storage\.key\.(.+)$/;
function getKeyID(type) {
let match = keyIDRegex.exec(type);
if (match != null) {
return match[1];
} else {
unreachable("Event type did not match key ID regex");
}
}
module.exports = function mapSecretStorageKeyEvent(event, _context) {
let isDerived = (event.content.passphrase != null);
let encryptionAlgorithm = normalizeEncryptionAlgorithmName(event.content.algorithm);
let baseProperties = {
type: "secretStorageKey",
keyID: getKeyID(event.type),
name: event.content.name,
encryptionAlgorithm: encryptionAlgorithm,
isDerivedFromPassphrase: isDerived
};
if (isDerived) {
let passphraseData = event.content.passphrase;
let passphraseAlgorithm = normalizePassphraseAlgorithmName(passphraseData.algorithm);
let passphraseConfiguration = matchValue(passphraseAlgorithm, {
"pbkdf2-sha512": {
salt: passphraseData.salt,
iterations: passphraseData.iterations,
bitsToGenerate: defaultValue(passphraseData.bits, 256)
}
});
return {
... baseProperties,
passphraseAlgorithm: passphraseData.algorithm,
passphraseConfiguration: passphraseConfiguration,
encryptionConfiguration: {}
};
} else {
let encryptionConfiguration = matchValue(encryptionAlgorithm, {
"aes-ctr-256.hmac-sha-256": {
iv: event.content.iv,
mac: event.content.mac
}
});
return {
... baseProperties,
passphraseConfiguration: {},
encryptionConfiguration: encryptionConfiguration
};
}
};