did-jwt
Version:
Library for Signing and Verifying JWTs that use DIDs as issuers and JWEs that use DIDs as recipients
44 lines • 2.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeX25519EcdhEsKek = computeX25519EcdhEsKek;
exports.createX25519EcdhEsKek = createX25519EcdhEsKek;
const util_js_1 = require("../util.js");
const Digest_js_1 = require("../Digest.js");
const ed25519_js_1 = require("@noble/curves/ed25519.js");
async function computeX25519EcdhEsKek(recipient, receiverSecret, alg) {
const crv = 'X25519';
const keyLen = 256;
const header = recipient.header;
if (header.epk?.crv !== crv || typeof header.epk.x == 'undefined')
return null;
const publicKey = (0, util_js_1.base64ToBytes)(header.epk.x);
let sharedSecret;
if (receiverSecret instanceof Uint8Array) {
sharedSecret = ed25519_js_1.x25519.getSharedSecret(receiverSecret, publicKey);
}
else {
sharedSecret = await receiverSecret(publicKey);
}
// Key Encryption Key
let producerInfo = undefined;
let consumerInfo = undefined;
if (recipient.header.apu)
producerInfo = (0, util_js_1.base64ToBytes)(recipient.header.apu);
if (recipient.header.apv)
consumerInfo = (0, util_js_1.base64ToBytes)(recipient.header.apv);
return (0, Digest_js_1.concatKDF)(sharedSecret, keyLen, alg, producerInfo, consumerInfo);
}
async function createX25519EcdhEsKek(recipientPublicKey, senderSecret, // unused
alg, apu, // unused
apv, ephemeralKeyPair) {
const crv = 'X25519';
const keyLen = 256;
const ephemeral = ephemeralKeyPair ? (0, util_js_1.generateKeyPairFromSeed)(ephemeralKeyPair.secretKey) : (0, util_js_1.generateKeyPair)();
const epk = { kty: 'OKP', crv, x: (0, util_js_1.bytesToBase64url)(ephemeral.publicKey) };
const sharedSecret = ed25519_js_1.x25519.getSharedSecret(ephemeral.secretKey, recipientPublicKey);
// Key Encryption Key
const consumerInfo = (0, util_js_1.base64ToBytes)(apv ?? '');
const kek = (0, Digest_js_1.concatKDF)(sharedSecret, keyLen, alg, undefined, consumerInfo);
return { epk, kek };
}
//# sourceMappingURL=X25519-ECDH-ES.js.map