@@ -25,6 +25,16 @@ export interface Recipient {
2525 */
2626 setUnprotectedHeader ( unprotectedHeader : types . JWEHeaderParameters ) : Recipient
2727
28+ /**
29+ * Sets the JWE Key Management parameters to be used when encrypting.
30+ *
31+ * (ECDH-ES) Use of this method is needed for ECDH based algorithms to set the "apu" (Agreement
32+ * PartyUInfo) or "apv" (Agreement PartyVInfo) parameters.
33+ *
34+ * @param parameters JWE Key Management parameters.
35+ */
36+ setKeyManagementParameters ( parameters : types . JWEKeyManagementHeaderParameters ) : Recipient
37+
2838 /** A shorthand for calling addRecipient() on the enclosing {@link GeneralEncrypt} instance */
2939 addRecipient ( ...args : Parameters < GeneralEncrypt [ 'addRecipient' ] > ) : Recipient
3040
@@ -38,6 +48,7 @@ export interface Recipient {
3848class IndividualRecipient implements Recipient {
3949 #parent: GeneralEncrypt
4050 unprotectedHeader ?: types . JWEHeaderParameters
51+ keyManagementParameters ?: types . JWEKeyManagementHeaderParameters
4152 key : types . CryptoKey | types . KeyObject | types . JWK | Uint8Array
4253 options : types . CritOption
4354
@@ -51,14 +62,22 @@ class IndividualRecipient implements Recipient {
5162 this . options = options
5263 }
5364
54- setUnprotectedHeader ( unprotectedHeader : types . JWEHeaderParameters ) {
65+ setUnprotectedHeader ( unprotectedHeader : types . JWEHeaderParameters ) : this {
5566 if ( this . unprotectedHeader ) {
5667 throw new TypeError ( 'setUnprotectedHeader can only be called once' )
5768 }
5869 this . unprotectedHeader = unprotectedHeader
5970 return this
6071 }
6172
73+ setKeyManagementParameters ( parameters : types . JWEKeyManagementHeaderParameters ) : this {
74+ if ( this . keyManagementParameters ) {
75+ throw new TypeError ( 'setKeyManagementParameters can only be called once' )
76+ }
77+ this . keyManagementParameters = parameters
78+ return this
79+ }
80+
6281 addRecipient ( ...args : Parameters < GeneralEncrypt [ 'addRecipient' ] > ) {
6382 return this . #parent. addRecipient ( ...args )
6483 }
@@ -250,32 +269,22 @@ export class GeneralEncrypt {
250269
251270 const jwe : types . GeneralJWE = {
252271 ciphertext : '' ,
253- iv : '' ,
254272 recipients : [ ] ,
255- tag : '' ,
256273 }
257274
258275 for ( let i = 0 ; i < this . #recipients. length ; i ++ ) {
259276 const recipient = this . #recipients[ i ]
260277 const target : Record < string , string | types . JWEHeaderParameters > = { }
261278 jwe . recipients ! . push ( target )
262279
263- const joseHeader = {
264- ...this . #protectedHeader,
265- ...this . #unprotectedHeader,
266- ...recipient . unprotectedHeader ,
267- }
268-
269- const p2c = joseHeader . alg ! . startsWith ( 'PBES2' ) ? 2048 + i : undefined
270-
271280 if ( i === 0 ) {
272281 const flattened = await new FlattenedEncrypt ( this . #plaintext)
273282 . setAdditionalAuthenticatedData ( this . #aad)
274283 . setContentEncryptionKey ( cek )
275284 . setProtectedHeader ( this . #protectedHeader)
276285 . setSharedUnprotectedHeader ( this . #unprotectedHeader)
277286 . setUnprotectedHeader ( recipient . unprotectedHeader ! )
278- . setKeyManagementParameters ( { p2c } )
287+ . setKeyManagementParameters ( recipient . keyManagementParameters ! )
279288 . encrypt ( recipient . key , {
280289 ...recipient . options ,
281290 // @ts -expect-error
@@ -304,7 +313,13 @@ export class GeneralEncrypt {
304313 checkKeyType ( alg === 'dir' ? enc : alg , recipient . key , 'encrypt' )
305314
306315 const k = await normalizeKey ( recipient . key , alg )
307- const { encryptedKey, parameters } = await encryptKeyManagement ( alg , enc , k , cek , { p2c } )
316+ const { encryptedKey, parameters } = await encryptKeyManagement (
317+ alg ,
318+ enc ,
319+ k ,
320+ cek ,
321+ recipient . keyManagementParameters ,
322+ )
308323 target . encrypted_key = b64u ( encryptedKey ! )
309324 if ( recipient . unprotectedHeader || parameters )
310325 target . header = { ...recipient . unprotectedHeader , ...parameters }
0 commit comments