Spaces:
Sleeping
Sleeping
| import { CompactEncrypt } from '../jwe/compact/encrypt.js'; | |
| import { JWTClaimsBuilder } from '../lib/jwt_claims_set.js'; | |
| import { assertNotSet } from '../lib/helpers.js'; | |
| export class EncryptJWT { | |
| #cek; | |
| #iv; | |
| #keyManagementParameters; | |
| #protectedHeader; | |
| #replicateIssuerAsHeader; | |
| #replicateSubjectAsHeader; | |
| #replicateAudienceAsHeader; | |
| #jwt; | |
| constructor(payload = {}) { | |
| this.#jwt = new JWTClaimsBuilder(payload); | |
| } | |
| setIssuer(issuer) { | |
| this.#jwt.iss = issuer; | |
| return this; | |
| } | |
| setSubject(subject) { | |
| this.#jwt.sub = subject; | |
| return this; | |
| } | |
| setAudience(audience) { | |
| this.#jwt.aud = audience; | |
| return this; | |
| } | |
| setJti(jwtId) { | |
| this.#jwt.jti = jwtId; | |
| return this; | |
| } | |
| setNotBefore(input) { | |
| this.#jwt.nbf = input; | |
| return this; | |
| } | |
| setExpirationTime(input) { | |
| this.#jwt.exp = input; | |
| return this; | |
| } | |
| setIssuedAt(input) { | |
| this.#jwt.iat = input; | |
| return this; | |
| } | |
| setProtectedHeader(protectedHeader) { | |
| assertNotSet(this.#protectedHeader, 'setProtectedHeader'); | |
| this.#protectedHeader = protectedHeader; | |
| return this; | |
| } | |
| setKeyManagementParameters(parameters) { | |
| assertNotSet(this.#keyManagementParameters, 'setKeyManagementParameters'); | |
| this.#keyManagementParameters = parameters; | |
| return this; | |
| } | |
| setContentEncryptionKey(cek) { | |
| assertNotSet(this.#cek, 'setContentEncryptionKey'); | |
| this.#cek = cek; | |
| return this; | |
| } | |
| setInitializationVector(iv) { | |
| assertNotSet(this.#iv, 'setInitializationVector'); | |
| this.#iv = iv; | |
| return this; | |
| } | |
| replicateIssuerAsHeader() { | |
| this.#replicateIssuerAsHeader = true; | |
| return this; | |
| } | |
| replicateSubjectAsHeader() { | |
| this.#replicateSubjectAsHeader = true; | |
| return this; | |
| } | |
| replicateAudienceAsHeader() { | |
| this.#replicateAudienceAsHeader = true; | |
| return this; | |
| } | |
| async encrypt(key, options) { | |
| const enc = new CompactEncrypt(this.#jwt.data()); | |
| if (this.#protectedHeader && | |
| (this.#replicateIssuerAsHeader || | |
| this.#replicateSubjectAsHeader || | |
| this.#replicateAudienceAsHeader)) { | |
| this.#protectedHeader = { | |
| ...this.#protectedHeader, | |
| iss: this.#replicateIssuerAsHeader ? this.#jwt.iss : undefined, | |
| sub: this.#replicateSubjectAsHeader ? this.#jwt.sub : undefined, | |
| aud: this.#replicateAudienceAsHeader ? this.#jwt.aud : undefined, | |
| }; | |
| } | |
| enc.setProtectedHeader(this.#protectedHeader); | |
| if (this.#iv) { | |
| enc.setInitializationVector(this.#iv); | |
| } | |
| if (this.#cek) { | |
| enc.setContentEncryptionKey(this.#cek); | |
| } | |
| if (this.#keyManagementParameters) { | |
| enc.setKeyManagementParameters(this.#keyManagementParameters); | |
| } | |
| return enc.encrypt(key, options); | |
| } | |
| } | |