UNPKG

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
"use strict"; 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