did-jwt
Version:
Library for Signing and Verifying JWTs that use DIDs as issuers and JWEs that use DIDs as recipients
68 lines • 3.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeX25519Ecdh1PUv3Kek = computeX25519Ecdh1PUv3Kek;
exports.createX25519Ecdh1PUv3Kek = createX25519Ecdh1PUv3Kek;
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 computeX25519Ecdh1PUv3Kek(recipient, recipientSecret, senderPublicKey, alg) {
const crv = 'X25519';
const keyLen = 256;
const header = recipient.header;
if (header.epk?.crv !== crv || typeof header.epk.x == 'undefined')
return null;
// ECDH-1PU requires additional shared secret between
// static key of sender and static key of recipient
const publicKey = (0, util_js_1.base64ToBytes)(header.epk.x);
let zE;
let zS;
if (recipientSecret instanceof Uint8Array) {
zE = ed25519_js_1.x25519.getSharedSecret(recipientSecret, publicKey);
zS = ed25519_js_1.x25519.getSharedSecret(recipientSecret, senderPublicKey);
}
else {
zE = await recipientSecret(publicKey);
zS = await recipientSecret(senderPublicKey);
}
const sharedSecret = new Uint8Array(zE.length + zS.length);
sharedSecret.set(zE);
sharedSecret.set(zS, zE.length);
// Key Encryption Key
let producerInfo;
let consumerInfo;
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 createX25519Ecdh1PUv3Kek(recipientPublicKey, senderSecret, alg, // must be provided as this is the key agreement alg + the key wrapper alg, Example: 'ECDH-ES+A256KW'
apu, 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 zE = ed25519_js_1.x25519.getSharedSecret(ephemeral.secretKey, recipientPublicKey);
// ECDH-1PU requires additional shared secret between
// static key of sender and static key of recipient
let zS;
if (senderSecret instanceof Uint8Array) {
zS = ed25519_js_1.x25519.getSharedSecret(senderSecret, recipientPublicKey);
}
else {
zS = await senderSecret(recipientPublicKey);
}
const sharedSecret = new Uint8Array(zE.length + zS.length);
sharedSecret.set(zE);
sharedSecret.set(zS, zE.length);
let partyUInfo = new Uint8Array(0);
let partyVInfo = new Uint8Array(0);
if (apu)
partyUInfo = (0, util_js_1.base64ToBytes)(apu);
if (apv)
partyVInfo = (0, util_js_1.base64ToBytes)(apv);
// Key Encryption Key
const kek = (0, Digest_js_1.concatKDF)(sharedSecret, keyLen, alg, partyUInfo, partyVInfo);
return { epk, kek };
}
//# sourceMappingURL=X25519-ECDH-1PU.js.map