sign.js 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.FlattenedSign = void 0;
  4. const base64url_js_1 = require("../../runtime/base64url.js");
  5. const sign_js_1 = require("../../runtime/sign.js");
  6. const is_disjoint_js_1 = require("../../lib/is_disjoint.js");
  7. const errors_js_1 = require("../../util/errors.js");
  8. const buffer_utils_js_1 = require("../../lib/buffer_utils.js");
  9. const check_key_type_js_1 = require("../../lib/check_key_type.js");
  10. const validate_crit_js_1 = require("../../lib/validate_crit.js");
  11. class FlattenedSign {
  12. constructor(payload) {
  13. if (!(payload instanceof Uint8Array)) {
  14. throw new TypeError('payload must be an instance of Uint8Array');
  15. }
  16. this._payload = payload;
  17. }
  18. setProtectedHeader(protectedHeader) {
  19. if (this._protectedHeader) {
  20. throw new TypeError('setProtectedHeader can only be called once');
  21. }
  22. this._protectedHeader = protectedHeader;
  23. return this;
  24. }
  25. setUnprotectedHeader(unprotectedHeader) {
  26. if (this._unprotectedHeader) {
  27. throw new TypeError('setUnprotectedHeader can only be called once');
  28. }
  29. this._unprotectedHeader = unprotectedHeader;
  30. return this;
  31. }
  32. async sign(key, options) {
  33. if (!this._protectedHeader && !this._unprotectedHeader) {
  34. throw new errors_js_1.JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');
  35. }
  36. if (!(0, is_disjoint_js_1.default)(this._protectedHeader, this._unprotectedHeader)) {
  37. throw new errors_js_1.JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');
  38. }
  39. const joseHeader = {
  40. ...this._protectedHeader,
  41. ...this._unprotectedHeader,
  42. };
  43. const extensions = (0, validate_crit_js_1.default)(errors_js_1.JWSInvalid, new Map([['b64', true]]), options === null || options === void 0 ? void 0 : options.crit, this._protectedHeader, joseHeader);
  44. let b64 = true;
  45. if (extensions.has('b64')) {
  46. b64 = this._protectedHeader.b64;
  47. if (typeof b64 !== 'boolean') {
  48. throw new errors_js_1.JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
  49. }
  50. }
  51. const { alg } = joseHeader;
  52. if (typeof alg !== 'string' || !alg) {
  53. throw new errors_js_1.JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
  54. }
  55. (0, check_key_type_js_1.default)(alg, key, 'sign');
  56. let payload = this._payload;
  57. if (b64) {
  58. payload = buffer_utils_js_1.encoder.encode((0, base64url_js_1.encode)(payload));
  59. }
  60. let protectedHeader;
  61. if (this._protectedHeader) {
  62. protectedHeader = buffer_utils_js_1.encoder.encode((0, base64url_js_1.encode)(JSON.stringify(this._protectedHeader)));
  63. }
  64. else {
  65. protectedHeader = buffer_utils_js_1.encoder.encode('');
  66. }
  67. const data = (0, buffer_utils_js_1.concat)(protectedHeader, buffer_utils_js_1.encoder.encode('.'), payload);
  68. const signature = await (0, sign_js_1.default)(alg, key, data);
  69. const jws = {
  70. signature: (0, base64url_js_1.encode)(signature),
  71. payload: '',
  72. };
  73. if (b64) {
  74. jws.payload = buffer_utils_js_1.decoder.decode(payload);
  75. }
  76. if (this._unprotectedHeader) {
  77. jws.header = this._unprotectedHeader;
  78. }
  79. if (this._protectedHeader) {
  80. jws.protected = buffer_utils_js_1.decoder.decode(protectedHeader);
  81. }
  82. return jws;
  83. }
  84. }
  85. exports.FlattenedSign = FlattenedSign;