encrypt.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { CompactEncrypt } from '../jwe/compact/encrypt.js';
  2. import { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';
  3. import { assertNotSet } from '../lib/helpers.js';
  4. export class EncryptJWT {
  5. #cek;
  6. #iv;
  7. #keyManagementParameters;
  8. #protectedHeader;
  9. #replicateIssuerAsHeader;
  10. #replicateSubjectAsHeader;
  11. #replicateAudienceAsHeader;
  12. #jwt;
  13. constructor(payload = {}) {
  14. this.#jwt = new JWTClaimsBuilder(payload);
  15. }
  16. setIssuer(issuer) {
  17. this.#jwt.iss = issuer;
  18. return this;
  19. }
  20. setSubject(subject) {
  21. this.#jwt.sub = subject;
  22. return this;
  23. }
  24. setAudience(audience) {
  25. this.#jwt.aud = audience;
  26. return this;
  27. }
  28. setJti(jwtId) {
  29. this.#jwt.jti = jwtId;
  30. return this;
  31. }
  32. setNotBefore(input) {
  33. this.#jwt.nbf = input;
  34. return this;
  35. }
  36. setExpirationTime(input) {
  37. this.#jwt.exp = input;
  38. return this;
  39. }
  40. setIssuedAt(input) {
  41. this.#jwt.iat = input;
  42. return this;
  43. }
  44. setProtectedHeader(protectedHeader) {
  45. assertNotSet(this.#protectedHeader, 'setProtectedHeader');
  46. this.#protectedHeader = protectedHeader;
  47. return this;
  48. }
  49. setKeyManagementParameters(parameters) {
  50. assertNotSet(this.#keyManagementParameters, 'setKeyManagementParameters');
  51. this.#keyManagementParameters = parameters;
  52. return this;
  53. }
  54. setContentEncryptionKey(cek) {
  55. assertNotSet(this.#cek, 'setContentEncryptionKey');
  56. this.#cek = cek;
  57. return this;
  58. }
  59. setInitializationVector(iv) {
  60. assertNotSet(this.#iv, 'setInitializationVector');
  61. this.#iv = iv;
  62. return this;
  63. }
  64. replicateIssuerAsHeader() {
  65. this.#replicateIssuerAsHeader = true;
  66. return this;
  67. }
  68. replicateSubjectAsHeader() {
  69. this.#replicateSubjectAsHeader = true;
  70. return this;
  71. }
  72. replicateAudienceAsHeader() {
  73. this.#replicateAudienceAsHeader = true;
  74. return this;
  75. }
  76. async encrypt(key, options) {
  77. const enc = new CompactEncrypt(this.#jwt.data());
  78. if (this.#protectedHeader &&
  79. (this.#replicateIssuerAsHeader ||
  80. this.#replicateSubjectAsHeader ||
  81. this.#replicateAudienceAsHeader)) {
  82. this.#protectedHeader = {
  83. ...this.#protectedHeader,
  84. iss: this.#replicateIssuerAsHeader ? this.#jwt.iss : undefined,
  85. sub: this.#replicateSubjectAsHeader ? this.#jwt.sub : undefined,
  86. aud: this.#replicateAudienceAsHeader ? this.#jwt.aud : undefined,
  87. };
  88. }
  89. enc.setProtectedHeader(this.#protectedHeader);
  90. if (this.#iv) {
  91. enc.setInitializationVector(this.#iv);
  92. }
  93. if (this.#cek) {
  94. enc.setContentEncryptionKey(this.#cek);
  95. }
  96. if (this.#keyManagementParameters) {
  97. enc.setKeyManagementParameters(this.#keyManagementParameters);
  98. }
  99. return enc.encrypt(key, options);
  100. }
  101. }