@pagopa/io-react-native-jwt 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +145 -0
  3. package/android/build.gradle +97 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +4 -0
  6. package/android/src/main/java/com/pagopa/ioreactnativejwt/IoReactNativeJwtModule.kt +114 -0
  7. package/android/src/main/java/com/pagopa/ioreactnativejwt/IoReactNativeJwtPackage.kt +17 -0
  8. package/android/src/main/java/com/pagopa/ioreactnativejwt/Utils.kt +95 -0
  9. package/ios/ASN1DERParsing.swift +226 -0
  10. package/ios/IoReactNativeJwt-Bridging-Header.h +2 -0
  11. package/ios/IoReactNativeJwt.mm +28 -0
  12. package/ios/IoReactNativeJwt.swift +156 -0
  13. package/ios/IoReactNativeJwt.xcodeproj/project.pbxproj +283 -0
  14. package/lib/commonjs/algorithms.js +39 -0
  15. package/lib/commonjs/algorithms.js.map +1 -0
  16. package/lib/commonjs/hash.js +17 -0
  17. package/lib/commonjs/hash.js.map +1 -0
  18. package/lib/commonjs/index.js +194 -0
  19. package/lib/commonjs/index.js.map +1 -0
  20. package/lib/commonjs/jwt_claims_set.js +112 -0
  21. package/lib/commonjs/jwt_claims_set.js.map +1 -0
  22. package/lib/commonjs/produce.js +140 -0
  23. package/lib/commonjs/produce.js.map +1 -0
  24. package/lib/commonjs/sign.js +159 -0
  25. package/lib/commonjs/sign.js.map +1 -0
  26. package/lib/commonjs/types.js +2 -0
  27. package/lib/commonjs/types.js.map +1 -0
  28. package/lib/commonjs/unsecured.js +118 -0
  29. package/lib/commonjs/unsecured.js.map +1 -0
  30. package/lib/commonjs/utils/asn1.js +37 -0
  31. package/lib/commonjs/utils/asn1.js.map +1 -0
  32. package/lib/commonjs/utils/base64.js +43 -0
  33. package/lib/commonjs/utils/base64.js.map +1 -0
  34. package/lib/commonjs/utils/errors.js +214 -0
  35. package/lib/commonjs/utils/errors.js.map +1 -0
  36. package/lib/commonjs/utils/is_object.js +23 -0
  37. package/lib/commonjs/utils/is_object.js.map +1 -0
  38. package/lib/commonjs/utils/proxy.js +17 -0
  39. package/lib/commonjs/utils/proxy.js.map +1 -0
  40. package/lib/commonjs/utils/secs.js +61 -0
  41. package/lib/commonjs/utils/secs.js.map +1 -0
  42. package/lib/module/algorithms.js +29 -0
  43. package/lib/module/algorithms.js.map +1 -0
  44. package/lib/module/hash.js +11 -0
  45. package/lib/module/hash.js.map +1 -0
  46. package/lib/module/index.js +115 -0
  47. package/lib/module/index.js.map +1 -0
  48. package/lib/module/jwt_claims_set.js +103 -0
  49. package/lib/module/jwt_claims_set.js.map +1 -0
  50. package/lib/module/produce.js +131 -0
  51. package/lib/module/produce.js.map +1 -0
  52. package/lib/module/sign.js +153 -0
  53. package/lib/module/sign.js.map +1 -0
  54. package/lib/module/types.js +2 -0
  55. package/lib/module/types.js.map +1 -0
  56. package/lib/module/unsecured.js +110 -0
  57. package/lib/module/unsecured.js.map +1 -0
  58. package/lib/module/utils/asn1.js +31 -0
  59. package/lib/module/utils/asn1.js.map +1 -0
  60. package/lib/module/utils/base64.js +36 -0
  61. package/lib/module/utils/base64.js.map +1 -0
  62. package/lib/module/utils/errors.js +200 -0
  63. package/lib/module/utils/errors.js.map +1 -0
  64. package/lib/module/utils/is_object.js +17 -0
  65. package/lib/module/utils/is_object.js.map +1 -0
  66. package/lib/module/utils/proxy.js +10 -0
  67. package/lib/module/utils/proxy.js.map +1 -0
  68. package/lib/module/utils/secs.js +53 -0
  69. package/lib/module/utils/secs.js.map +1 -0
  70. package/lib/typescript/algorithms.d.ts +5 -0
  71. package/lib/typescript/algorithms.d.ts.map +1 -0
  72. package/lib/typescript/hash.d.ts +5 -0
  73. package/lib/typescript/hash.d.ts.map +1 -0
  74. package/lib/typescript/index.d.ts +93 -0
  75. package/lib/typescript/index.d.ts.map +1 -0
  76. package/lib/typescript/jwt_claims_set.d.ts +4 -0
  77. package/lib/typescript/jwt_claims_set.d.ts.map +1 -0
  78. package/lib/typescript/produce.d.ts +55 -0
  79. package/lib/typescript/produce.d.ts.map +1 -0
  80. package/lib/typescript/sign.d.ts +61 -0
  81. package/lib/typescript/sign.d.ts.map +1 -0
  82. package/lib/typescript/types.d.ts +172 -0
  83. package/lib/typescript/types.d.ts.map +1 -0
  84. package/lib/typescript/unsecured.d.ts +64 -0
  85. package/lib/typescript/unsecured.d.ts.map +1 -0
  86. package/lib/typescript/utils/asn1.d.ts +2 -0
  87. package/lib/typescript/utils/asn1.d.ts.map +1 -0
  88. package/lib/typescript/utils/base64.d.ts +4 -0
  89. package/lib/typescript/utils/base64.d.ts.map +1 -0
  90. package/lib/typescript/utils/errors.d.ts +157 -0
  91. package/lib/typescript/utils/errors.d.ts.map +1 -0
  92. package/lib/typescript/utils/is_object.d.ts +2 -0
  93. package/lib/typescript/utils/is_object.d.ts.map +1 -0
  94. package/lib/typescript/utils/proxy.d.ts +2 -0
  95. package/lib/typescript/utils/proxy.d.ts.map +1 -0
  96. package/lib/typescript/utils/secs.d.ts +4 -0
  97. package/lib/typescript/utils/secs.d.ts.map +1 -0
  98. package/package.json +170 -0
  99. package/pagopa-io-react-native-jwt.podspec +44 -0
  100. package/src/algorithms.ts +46 -0
  101. package/src/hash.ts +10 -0
  102. package/src/index.tsx +120 -0
  103. package/src/jwt_claims_set.ts +194 -0
  104. package/src/produce.ts +109 -0
  105. package/src/sign.ts +180 -0
  106. package/src/types.ts +203 -0
  107. package/src/unsecured.ts +127 -0
  108. package/src/utils/asn1.ts +36 -0
  109. package/src/utils/base64.ts +37 -0
  110. package/src/utils/errors.ts +206 -0
  111. package/src/utils/is_object.ts +20 -0
  112. package/src/utils/proxy.ts +15 -0
  113. package/src/utils/secs.ts +58 -0
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.epoch = exports.default = void 0;
7
+ const minute = 60;
8
+ const hour = minute * 60;
9
+ const day = hour * 24;
10
+ const week = day * 7;
11
+ const year = day * 365.25;
12
+
13
+ /*
14
+ * It allows to extract the value and the unit of measurement for the time.
15
+ * For example, indicating a string like "1s" or "1 second" or "3 hour"
16
+ * the regex extracts a group made up of [1, "s"], [1, "second"] or [3, "hour"]
17
+ */
18
+ const REGEX = /^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;
19
+ var _default = str => {
20
+ const matched = REGEX.exec(str);
21
+ if (!matched) {
22
+ throw new TypeError('Invalid time period format');
23
+ }
24
+ const value = parseFloat(matched[1]);
25
+ const unit = matched[2].toLowerCase();
26
+ switch (unit) {
27
+ case 'sec':
28
+ case 'secs':
29
+ case 'second':
30
+ case 'seconds':
31
+ case 's':
32
+ return Math.round(value);
33
+ case 'minute':
34
+ case 'minutes':
35
+ case 'min':
36
+ case 'mins':
37
+ case 'm':
38
+ return Math.round(value * minute);
39
+ case 'hour':
40
+ case 'hours':
41
+ case 'hr':
42
+ case 'hrs':
43
+ case 'h':
44
+ return Math.round(value * hour);
45
+ case 'day':
46
+ case 'days':
47
+ case 'd':
48
+ return Math.round(value * day);
49
+ case 'week':
50
+ case 'weeks':
51
+ case 'w':
52
+ return Math.round(value * week);
53
+ // years matched
54
+ default:
55
+ return Math.round(value * year);
56
+ }
57
+ };
58
+ exports.default = _default;
59
+ const epoch = date => Math.floor(date.getTime() / 1000);
60
+ exports.epoch = epoch;
61
+ //# sourceMappingURL=secs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["minute","hour","day","week","year","REGEX","_default","str","matched","exec","TypeError","value","parseFloat","unit","toLowerCase","Math","round","exports","default","epoch","date","floor","getTime"],"sourceRoot":"../../../src","sources":["utils/secs.ts"],"mappings":";;;;;;AAAA,MAAMA,MAAM,GAAG,EAAE;AACjB,MAAMC,IAAI,GAAGD,MAAM,GAAG,EAAE;AACxB,MAAME,GAAG,GAAGD,IAAI,GAAG,EAAE;AACrB,MAAME,IAAI,GAAGD,GAAG,GAAG,CAAC;AACpB,MAAME,IAAI,GAAGF,GAAG,GAAG,MAAM;;AAEzB;AACA;AACA;AACA;AACA;AACA,MAAMG,KAAK,GACT,qGAAqG;AAAC,IAAAC,QAAA,GAExFC,GAAW,IAAa;EACtC,MAAMC,OAAO,GAAGH,KAAK,CAACI,IAAI,CAACF,GAAG,CAAC;EAE/B,IAAI,CAACC,OAAO,EAAE;IACZ,MAAM,IAAIE,SAAS,CAAC,4BAA4B,CAAC;EACnD;EAEA,MAAMC,KAAK,GAAGC,UAAU,CAACJ,OAAO,CAAC,CAAC,CAAE,CAAC;EACrC,MAAMK,IAAI,GAAGL,OAAO,CAAC,CAAC,CAAC,CAAEM,WAAW,CAAC,CAAC;EAEtC,QAAQD,IAAI;IACV,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,GAAG;MACN,OAAOE,IAAI,CAACC,KAAK,CAACL,KAAK,CAAC;IAC1B,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,GAAG;MACN,OAAOI,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGX,MAAM,CAAC;IACnC,KAAK,MAAM;IACX,KAAK,OAAO;IACZ,KAAK,IAAI;IACT,KAAK,KAAK;IACV,KAAK,GAAG;MACN,OAAOe,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGV,IAAI,CAAC;IACjC,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,GAAG;MACN,OAAOc,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGT,GAAG,CAAC;IAChC,KAAK,MAAM;IACX,KAAK,OAAO;IACZ,KAAK,GAAG;MACN,OAAOa,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGR,IAAI,CAAC;IACjC;IACA;MACE,OAAOY,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGP,IAAI,CAAC;EACnC;AACF,CAAC;AAAAa,OAAA,CAAAC,OAAA,GAAAZ,QAAA;AAEM,MAAMa,KAAK,GAAIC,IAAU,IAAKL,IAAI,CAACM,KAAK,CAACD,IAAI,CAACE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;AAACL,OAAA,CAAAE,KAAA,GAAAA,KAAA"}
@@ -0,0 +1,29 @@
1
+ import { JOSENotSupported } from './utils/errors';
2
+ export const supportedAlgorithms = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512'];
3
+ export const isAlgSupported = alg => supportedAlgorithms.includes(alg.toUpperCase());
4
+ export const getKtyFromAlg = alg => {
5
+ switch (alg.slice(0, 2)) {
6
+ case 'RS':
7
+ case 'PS':
8
+ return 'RSA';
9
+ case 'ES':
10
+ return 'EC';
11
+ default:
12
+ throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
13
+ }
14
+ };
15
+
16
+ // Coordinates length in bytes: bits/8
17
+ export const getCoordinateOctetLength = alg => {
18
+ switch (alg.slice(2, 5)) {
19
+ case '256':
20
+ return 32;
21
+ case '384':
22
+ return 48;
23
+ case '512':
24
+ return 66;
25
+ default:
26
+ throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
27
+ }
28
+ };
29
+ //# sourceMappingURL=algorithms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["JOSENotSupported","supportedAlgorithms","isAlgSupported","alg","includes","toUpperCase","getKtyFromAlg","slice","getCoordinateOctetLength"],"sourceRoot":"../../src","sources":["algorithms.ts"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,gBAAgB;AAEjD,OAAO,MAAMC,mBAAmB,GAAG,CACjC,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,CACR;AAED,OAAO,MAAMC,cAAc,GAAIC,GAAW,IACxCF,mBAAmB,CAACG,QAAQ,CAACD,GAAG,CAACE,WAAW,CAAC,CAAC,CAAC;AAEjD,OAAO,MAAMC,aAAa,GAAIH,GAAW,IAAK;EAC5C,QAAQA,GAAG,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,KAAK,IAAI;IACT,KAAK,IAAI;MACP,OAAO,KAAK;IACd,KAAK,IAAI;MACP,OAAO,IAAI;IACb;MACE,MAAM,IAAIP,gBAAgB,CACxB,gDACF,CAAC;EACL;AACF,CAAC;;AAED;AACA,OAAO,MAAMQ,wBAAwB,GAAIL,GAAW,IAAK;EACvD,QAAQA,GAAG,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,KAAK,KAAK;MACR,OAAO,EAAE;IACX,KAAK,KAAK;MACR,OAAO,EAAE;IACX,KAAK,KAAK;MACR,OAAO,EAAE;IACX;MACE,MAAM,IAAIP,gBAAgB,CACxB,gDACF,CAAC;EACL;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { removePadding } from './utils/base64';
2
+ import { IoReactNativeJwt } from './utils/proxy';
3
+
4
+ /**
5
+ * Return base64 encoded SHA256 hash of input string
6
+ */
7
+ export const sha256ToBase64 = async toHash => {
8
+ let hash = await IoReactNativeJwt.sha256(toHash);
9
+ return removePadding(hash);
10
+ };
11
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["removePadding","IoReactNativeJwt","sha256ToBase64","toHash","hash","sha256"],"sourceRoot":"../../src","sources":["hash.ts"],"mappings":"AAAA,SAASA,aAAa,QAAQ,gBAAgB;AAC9C,SAASC,gBAAgB,QAAQ,eAAe;;AAEhD;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAG,MAAOC,MAAc,IAAsB;EACvE,IAAIC,IAAI,GAAG,MAAMH,gBAAgB,CAACI,MAAM,CAACF,MAAM,CAAC;EAChD,OAAOH,aAAa,CAACI,IAAI,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,115 @@
1
+ import jwtPayload from './jwt_claims_set';
2
+ import { JWSSignatureVerificationFailed } from './utils/errors';
3
+ import { IoReactNativeJwt } from './utils/proxy';
4
+ import { SignJWT } from './sign';
5
+ export * from './produce';
6
+ export * from './sign';
7
+ export * from './unsecured';
8
+ export { derToJose } from './utils/asn1';
9
+ export { encodeBase64, decodeBase64 } from './utils/base64';
10
+ export { sha256ToBase64 } from './hash';
11
+ /**
12
+ * Decode the JWT without validation.
13
+ *
14
+ * @example Usage with a public JWK encoded RSA key
15
+ *
16
+ * ```js
17
+ * const jwt =
18
+ * 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
19
+ *
20
+ * const { payload, protectedHeader } = await decode(jwt)
21
+ *
22
+ * ```
23
+ *
24
+ * @param jwt JSON Web Token value (encoded as JWS).
25
+ */
26
+ export const decode = token => SignJWT.decode(token);
27
+
28
+ /**
29
+ * Verifies the JWS signature
30
+ *
31
+ * @example Usage with a public JWK encoded RSA key
32
+ *
33
+ * ```js
34
+ * const jwk = {
35
+ * crv: 'P-256',
36
+ * kty: 'EC',
37
+ * x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
38
+ * y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
39
+ * }
40
+ * const jwt =
41
+ * 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
42
+ *
43
+ * const isSignatureValid = await verify(jwt, jwk)
44
+ * ```
45
+ *
46
+ * @param jwt JSON Web Token value (encoded as JWS).
47
+ * @param key Public key to verify the JWT in JWK format.
48
+ */
49
+ export const isSignatureValid = (token, jwk) => IoReactNativeJwt.verify(token, jwk);
50
+
51
+ /**
52
+ * Verifies the JWT format (to be a JWS Compact format), verifies the JWS signature, validates the
53
+ * JWT Claims Set.
54
+ *
55
+ * @example Usage with a public JWK encoded RSA key
56
+ *
57
+ * ```js
58
+ * const jwk = {
59
+ * crv: 'P-256',
60
+ * kty: 'EC',
61
+ * x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
62
+ * y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
63
+ * }
64
+ * const jwt =
65
+ * 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
66
+ *
67
+ * const { payload, protectedHeader } = await verify(jwt, jwk, {
68
+ * typ: 'entity-statement+jwt',
69
+ * requiredClaims: ['iss', 'sub', 'metadata'],
70
+ * })
71
+ * ```
72
+ *
73
+ * @param jwt JSON Web Token value (encoded as JWS).
74
+ * @param key Public key to verify the JWT in JWK format.
75
+ * @param options JWT Decryption and JWT Claims Set validation options.
76
+ */
77
+ export const verify = async function (token, jwk) {
78
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
79
+ const {
80
+ protectedHeader,
81
+ payload
82
+ } = await decode(token);
83
+ const signatureIsValid = await isSignatureValid(token, jwk);
84
+ if (signatureIsValid) {
85
+ const verifiedPayload = jwtPayload(protectedHeader, payload, options);
86
+ return {
87
+ payload: verifiedPayload,
88
+ protectedHeader
89
+ };
90
+ } else {
91
+ throw new JWSSignatureVerificationFailed();
92
+ }
93
+ };
94
+
95
+ /**
96
+ * Calculate JWK thumbprint
97
+ *
98
+ * @example Get JWK thumbprint
99
+ *
100
+ * ```js
101
+ * const jwk: JWK = {
102
+ * crv: 'P-256',
103
+ * kty: 'EC',
104
+ * x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
105
+ * y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
106
+ * };
107
+
108
+ * const thumbprint = await thumbprint(jwk)
109
+ *
110
+ * ```
111
+ *
112
+ * @param jwk JSON Web Key
113
+ */
114
+ export const thumbprint = jwk => IoReactNativeJwt.thumbprint(jwk);
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jwtPayload","JWSSignatureVerificationFailed","IoReactNativeJwt","SignJWT","derToJose","encodeBase64","decodeBase64","sha256ToBase64","decode","token","isSignatureValid","jwk","verify","options","arguments","length","undefined","protectedHeader","payload","signatureIsValid","verifiedPayload","thumbprint"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAKA,OAAOA,UAAU,MAAM,kBAAkB;AACzC,SAASC,8BAA8B,QAAQ,gBAAgB;AAC/D,SAASC,gBAAgB,QAAQ,eAAe;AAChD,SAASC,OAAO,QAAQ,QAAQ;AAEhC,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,aAAa;AAC3B,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,YAAY,EAAEC,YAAY,QAAQ,gBAAgB;AAC3D,SAASC,cAAc,QAAQ,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,MAAM,GAAIC,KAAa,IAAsBN,OAAO,CAACK,MAAM,CAACC,KAAK,CAAC;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAGA,CAACD,KAAa,EAAEE,GAAQ,KACtDT,gBAAgB,CAACU,MAAM,CAACH,KAAK,EAAEE,GAAG,CAAC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,MAAM,GAAG,eAAAA,CACpBH,KAAa,EACbE,GAAQ,EAEqB;EAAA,IAD7BE,OAAoC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAEzC,MAAM;IAAEG,eAAe;IAAEC;EAAQ,CAAC,GAAG,MAAMV,MAAM,CAACC,KAAK,CAAC;EACxD,MAAMU,gBAAgB,GAAG,MAAMT,gBAAgB,CAACD,KAAK,EAAEE,GAAG,CAAC;EAE3D,IAAIQ,gBAAgB,EAAE;IACpB,MAAMC,eAAe,GAAGpB,UAAU,CAACiB,eAAe,EAAEC,OAAO,EAAEL,OAAO,CAAC;IACrE,OAAO;MAAEK,OAAO,EAAEE,eAAe;MAAEH;IAAgB,CAAC;EACtD,CAAC,MAAM;IACL,MAAM,IAAIhB,8BAA8B,CAAC,CAAC;EAC5C;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMoB,UAAU,GAAIV,GAAQ,IACjCT,gBAAgB,CAACmB,UAAU,CAACV,GAAG,CAAC"}
@@ -0,0 +1,103 @@
1
+ /*
2
+ * This code comes from https://github.com/panva/jose
3
+ */
4
+
5
+ import { JWTClaimValidationFailed, JWTExpired } from './utils/errors';
6
+ import secs, { epoch } from './utils/secs';
7
+ const normalizeTyp = value => value.toLowerCase().replace(/^application\//, '');
8
+ const checkAudiencePresence = (audPayload, audOption) => {
9
+ if (typeof audPayload === 'string') {
10
+ return audOption.includes(audPayload);
11
+ }
12
+ if (Array.isArray(audPayload)) {
13
+ /*
14
+ * Each principal intended to process the JWT MUST
15
+ * identify itself with a value in the audience claim
16
+ */
17
+ return audOption.some(Set.prototype.has.bind(new Set(audPayload)));
18
+ }
19
+ return false;
20
+ };
21
+ export default (function (protectedHeader, payload) {
22
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
23
+ const {
24
+ typ
25
+ } = options;
26
+ if (typ && (typeof protectedHeader.typ !== 'string' || normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {
27
+ throw new JWTClaimValidationFailed('unexpected "typ" JWT header value', 'typ', 'check_failed');
28
+ }
29
+ const {
30
+ requiredClaims = [],
31
+ issuer,
32
+ subject,
33
+ audience,
34
+ maxTokenAge
35
+ } = options;
36
+ if (maxTokenAge !== undefined) requiredClaims.push('iat');
37
+ if (audience !== undefined) requiredClaims.push('aud');
38
+ if (subject !== undefined) requiredClaims.push('sub');
39
+ if (issuer !== undefined) requiredClaims.push('iss');
40
+ for (const claim of new Set(requiredClaims.reverse())) {
41
+ if (!(claim in payload)) {
42
+ throw new JWTClaimValidationFailed(`missing required "${claim}" claim`, claim, 'missing');
43
+ }
44
+ }
45
+ if (issuer && !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {
46
+ throw new JWTClaimValidationFailed('unexpected "iss" claim value', 'iss', 'check_failed');
47
+ }
48
+ if (subject && payload.sub !== subject) {
49
+ throw new JWTClaimValidationFailed('unexpected "sub" claim value', 'sub', 'check_failed');
50
+ }
51
+ if (audience && !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {
52
+ throw new JWTClaimValidationFailed('unexpected "aud" claim value', 'aud', 'check_failed');
53
+ }
54
+ let tolerance;
55
+ switch (typeof options.clockTolerance) {
56
+ case 'string':
57
+ tolerance = secs(options.clockTolerance);
58
+ break;
59
+ case 'number':
60
+ tolerance = options.clockTolerance;
61
+ break;
62
+ case 'undefined':
63
+ tolerance = 0;
64
+ break;
65
+ default:
66
+ throw new TypeError('Invalid clockTolerance option type');
67
+ }
68
+ const {
69
+ currentDate
70
+ } = options;
71
+ const now = epoch(currentDate || new Date());
72
+ if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {
73
+ throw new JWTClaimValidationFailed('"iat" claim must be a number', 'iat', 'invalid');
74
+ }
75
+ if (payload.nbf !== undefined) {
76
+ if (typeof payload.nbf !== 'number') {
77
+ throw new JWTClaimValidationFailed('"nbf" claim must be a number', 'nbf', 'invalid');
78
+ }
79
+ if (payload.nbf > now + tolerance) {
80
+ throw new JWTClaimValidationFailed('"nbf" claim timestamp check failed', 'nbf', 'check_failed');
81
+ }
82
+ }
83
+ if (payload.exp !== undefined) {
84
+ if (typeof payload.exp !== 'number') {
85
+ throw new JWTClaimValidationFailed('"exp" claim must be a number', 'exp', 'invalid');
86
+ }
87
+ if (payload.exp <= now - tolerance) {
88
+ throw new JWTExpired('"exp" claim timestamp check failed', 'exp', 'check_failed');
89
+ }
90
+ }
91
+ if (maxTokenAge) {
92
+ const age = now - payload.iat;
93
+ const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);
94
+ if (age - tolerance > max) {
95
+ throw new JWTExpired('"iat" claim timestamp check failed (too far in the past)', 'iat', 'check_failed');
96
+ }
97
+ if (age < 0 - tolerance) {
98
+ throw new JWTClaimValidationFailed('"iat" claim timestamp check failed (it should be in the past)', 'iat', 'check_failed');
99
+ }
100
+ }
101
+ return payload;
102
+ });
103
+ //# sourceMappingURL=jwt_claims_set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["JWTClaimValidationFailed","JWTExpired","secs","epoch","normalizeTyp","value","toLowerCase","replace","checkAudiencePresence","audPayload","audOption","includes","Array","isArray","some","Set","prototype","has","bind","protectedHeader","payload","options","arguments","length","undefined","typ","requiredClaims","issuer","subject","audience","maxTokenAge","push","claim","reverse","iss","sub","aud","tolerance","clockTolerance","TypeError","currentDate","now","Date","iat","nbf","exp","age","max"],"sourceRoot":"../../src","sources":["jwt_claims_set.ts"],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import isObject from './utils/is_object';
2
+ import secs, { epoch } from './utils/secs';
3
+
4
+ /** Generic class for JWT producing. */
5
+ export class ProduceJWT {
6
+ /** @param payload The JWT Claims Set object. */
7
+ constructor(payload) {
8
+ if (!isObject(payload)) {
9
+ throw new TypeError('JWT Claims Set MUST be an object');
10
+ }
11
+ this._payload = payload;
12
+ }
13
+
14
+ /**
15
+ * Set "iss" (Issuer) Claim.
16
+ *
17
+ * @param issuer "Issuer" Claim value to set on the JWT Claims Set.
18
+ */
19
+ setIssuer(issuer) {
20
+ this._payload = {
21
+ ...this._payload,
22
+ iss: issuer
23
+ };
24
+ return this;
25
+ }
26
+
27
+ /**
28
+ * Set "sub" (Subject) Claim.
29
+ *
30
+ * @param subject "sub" (Subject) Claim value to set on the JWT Claims Set.
31
+ */
32
+ setSubject(subject) {
33
+ this._payload = {
34
+ ...this._payload,
35
+ sub: subject
36
+ };
37
+ return this;
38
+ }
39
+
40
+ /**
41
+ * Set "aud" (Audience) Claim.
42
+ *
43
+ * @param audience "aud" (Audience) Claim value to set on the JWT Claims Set.
44
+ */
45
+ setAudience(audience) {
46
+ this._payload = {
47
+ ...this._payload,
48
+ aud: audience
49
+ };
50
+ return this;
51
+ }
52
+
53
+ /**
54
+ * Set "jti" (JWT ID) Claim.
55
+ *
56
+ * @param jwtId "jti" (JWT ID) Claim value to set on the JWT Claims Set.
57
+ */
58
+ setJti(jwtId) {
59
+ this._payload = {
60
+ ...this._payload,
61
+ jti: jwtId
62
+ };
63
+ return this;
64
+ }
65
+
66
+ /**
67
+ * Set "nbf" (Not Before) Claim.
68
+ *
69
+ * @param input "nbf" (Not Before) Claim value to set on the JWT Claims Set. When number is passed
70
+ * that is used as a value, when string is passed it is resolved to a time span and added to the
71
+ * current timestamp.
72
+ */
73
+ setNotBefore(input) {
74
+ if (typeof input === 'number') {
75
+ this._payload = {
76
+ ...this._payload,
77
+ nbf: input
78
+ };
79
+ } else {
80
+ this._payload = {
81
+ ...this._payload,
82
+ nbf: epoch(new Date()) + secs(input)
83
+ };
84
+ }
85
+ return this;
86
+ }
87
+
88
+ /**
89
+ * Set "exp" (Expiration Time) Claim.
90
+ *
91
+ * @param input "exp" (Expiration Time) Claim value to set on the JWT Claims Set. When number is
92
+ * passed that is used as a value, when string is passed it is resolved to a time span and added
93
+ * to the current timestamp.
94
+ */
95
+ setExpirationTime(input) {
96
+ if (typeof input === 'number') {
97
+ this._payload = {
98
+ ...this._payload,
99
+ exp: input
100
+ };
101
+ } else {
102
+ this._payload = {
103
+ ...this._payload,
104
+ exp: epoch(new Date()) + secs(input)
105
+ };
106
+ }
107
+ return this;
108
+ }
109
+
110
+ /**
111
+ * Set "iat" (Issued At) Claim.
112
+ *
113
+ * @param input "iat" (Issued At) Claim value to set on the JWT Claims Set. Default is current
114
+ * timestamp.
115
+ */
116
+ setIssuedAt(input) {
117
+ if (typeof input === 'undefined') {
118
+ this._payload = {
119
+ ...this._payload,
120
+ iat: epoch(new Date())
121
+ };
122
+ } else {
123
+ this._payload = {
124
+ ...this._payload,
125
+ iat: input
126
+ };
127
+ }
128
+ return this;
129
+ }
130
+ }
131
+ //# sourceMappingURL=produce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isObject","secs","epoch","ProduceJWT","constructor","payload","TypeError","_payload","setIssuer","issuer","iss","setSubject","subject","sub","setAudience","audience","aud","setJti","jwtId","jti","setNotBefore","input","nbf","Date","setExpirationTime","exp","setIssuedAt","iat"],"sourceRoot":"../../src","sources":["produce.ts"],"mappings":"AACA,OAAOA,QAAQ,MAAM,mBAAmB;AACxC,OAAOC,IAAI,IAAIC,KAAK,QAAQ,cAAc;;AAE1C;AACA,OAAO,MAAMC,UAAU,CAAC;EAGtB;EACAC,WAAWA,CAACC,OAAmB,EAAE;IAC/B,IAAI,CAACL,QAAQ,CAACK,OAAO,CAAC,EAAE;MACtB,MAAM,IAAIC,SAAS,CAAC,kCAAkC,CAAC;IACzD;IACA,IAAI,CAACC,QAAQ,GAAGF,OAAO;EACzB;;EAEA;AACF;AACA;AACA;AACA;EACEG,SAASA,CAACC,MAAc,EAAE;IACxB,IAAI,CAACF,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEG,GAAG,EAAED;IAAO,CAAC;IACjD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,UAAUA,CAACC,OAAe,EAAE;IAC1B,IAAI,CAACL,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEM,GAAG,EAAED;IAAQ,CAAC;IAClD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,WAAWA,CAACC,QAA2B,EAAE;IACvC,IAAI,CAACR,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAES,GAAG,EAAED;IAAS,CAAC;IACnD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,MAAMA,CAACC,KAAa,EAAE;IACpB,IAAI,CAACX,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEY,GAAG,EAAED;IAAM,CAAC;IAChD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEE,YAAYA,CAACC,KAAsB,EAAE;IACnC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEe,GAAG,EAAED;MAAM,CAAC;IAClD,CAAC,MAAM;MACL,IAAI,CAACd,QAAQ,GAAG;QACd,GAAG,IAAI,CAACA,QAAQ;QAChBe,GAAG,EAAEpB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC,CAAC,GAAGtB,IAAI,CAACoB,KAAK;MACrC,CAAC;IACH;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,iBAAiBA,CAACH,KAAsB,EAAE;IACxC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEkB,GAAG,EAAEJ;MAAM,CAAC;IAClD,CAAC,MAAM;MACL,IAAI,CAACd,QAAQ,GAAG;QACd,GAAG,IAAI,CAACA,QAAQ;QAChBkB,GAAG,EAAEvB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC,CAAC,GAAGtB,IAAI,CAACoB,KAAK;MACrC,CAAC;IACH;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEK,WAAWA,CAACL,KAAc,EAAE;IAC1B,IAAI,OAAOA,KAAK,KAAK,WAAW,EAAE;MAChC,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEoB,GAAG,EAAEzB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC;MAAE,CAAC;IAC9D,CAAC,MAAM;MACL,IAAI,CAAChB,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEoB,GAAG,EAAEN;MAAM,CAAC;IAClD;IACA,OAAO,IAAI;EACb;AACF"}
@@ -0,0 +1,153 @@
1
+ import { JOSENotSupported, JWSInvalid, JWTInvalid } from './utils/errors';
2
+ import { ProduceJWT } from './produce';
3
+ import { decodeBase64, encodeBase64, removePadding } from './utils/base64';
4
+ import { isAlgSupported } from './algorithms';
5
+ import { derToJose } from './utils/asn1';
6
+
7
+ /**
8
+ * The SignJWT class is used to build and sign Compact JWS formatted JSON Web Tokens.
9
+ *
10
+ * @example Usage with a given signature
11
+ *
12
+ * ```js
13
+ * const alg = 'RS256'
14
+ * const signature = 'Axy0....'
15
+ *
16
+ * const jwt = new SignJWT({ 'urn:example:claim': true })
17
+ * .setProtectedHeader({ alg })
18
+ * .setIssuedAt()
19
+ * .setIssuer('urn:example:issuer')
20
+ * .setAudience('urn:example:audience')
21
+ * .setExpirationTime('2h')
22
+ * .sign(signature)
23
+ *
24
+ * console.log(jwt)
25
+ * ```
26
+ */
27
+ export class SignJWT extends ProduceJWT {
28
+ /**
29
+ * Sets the JWS Protected Header on the SignJWT object.
30
+ *
31
+ * @param protectedHeader JWS Protected Header. Must contain an "alg" (JWS Algorithm) property.
32
+ */
33
+ setProtectedHeader(protectedHeader) {
34
+ if (protectedHeader.alg && isAlgSupported(protectedHeader.alg)) {
35
+ this._protectedHeader = protectedHeader;
36
+ return this;
37
+ }
38
+ throw new JOSENotSupported('Unsupported "alg" value');
39
+ }
40
+
41
+ /**
42
+ * Return a JWT without signature (`header.payload`) to sign.
43
+ *
44
+ */
45
+ toSign() {
46
+ if (!this._protectedHeader || !this._protectedHeader.alg) {
47
+ throw new JWSInvalid('Missing signature algorithm. Specify the `alg` field');
48
+ }
49
+ const protectedHeader = encodeBase64(JSON.stringify(this._protectedHeader));
50
+ const payload = encodeBase64(JSON.stringify(this._payload));
51
+ if (payload && protectedHeader) {
52
+ return `${protectedHeader}.${payload}`;
53
+ } else {
54
+ throw new JWSInvalid();
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Append signature to unsigned JWT.
60
+ * For an ECDSA signature it is required that this is in ASN.1/DER encoded format.
61
+ * The same format used by the TEE. Conversion to JWS is handled automatically.
62
+ *
63
+ * @param jwtWithoutSignature
64
+ * @param signature
65
+ */
66
+ static async appendSignature(jwtWithoutSignature, signature) {
67
+ if (typeof jwtWithoutSignature !== 'string' || typeof signature !== 'string') {
68
+ throw new JWTInvalid('JWS must be a string');
69
+ }
70
+ if (signature === '') throw new JWSInvalid('Invalid signature');
71
+ const jwtDecoded = SignJWT.decodeJwtWithoutSignature(jwtWithoutSignature);
72
+ const alg = jwtDecoded.header.alg;
73
+ try {
74
+ const encodedJws = await derToJose(signature, alg);
75
+ return `${jwtWithoutSignature}.${encodedJws}`;
76
+ } catch {
77
+ const encodedJws = removePadding(signature);
78
+ return `${jwtWithoutSignature}.${encodedJws}`;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Decodes a JWT without signature
84
+ *
85
+ * @param jwtWithoutSignature JWT to sign that needs to be decoded.
86
+ */
87
+ static decodeJwtWithoutSignature(jwtWithoutSignature) {
88
+ if (typeof jwtWithoutSignature !== 'string') {
89
+ throw new JWTInvalid('JWT must be a string');
90
+ }
91
+ const {
92
+ 0: encodedHeader,
93
+ 1: encodedPayload,
94
+ length
95
+ } = jwtWithoutSignature.split('.');
96
+ let header;
97
+ try {
98
+ let decoded = decodeBase64(encodedHeader);
99
+ header = JSON.parse(decoded);
100
+ if (!header.alg || !isAlgSupported(header.alg)) {
101
+ throw new JOSENotSupported('Unsupported "alg" value');
102
+ }
103
+ } catch {
104
+ throw new JWTInvalid('Unable to decode JWT header');
105
+ }
106
+ if (length !== 2 || encodedPayload === '') {
107
+ throw new JWTInvalid('Invalid JWT to sign');
108
+ }
109
+ let decodedPayload = decodeBase64(encodedPayload);
110
+ const payload = JSON.parse(decodedPayload);
111
+ return {
112
+ payload,
113
+ header
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Decodes a JWT without signature
119
+ *
120
+ * @param jwtWithoutSignature JWT to sign that needs to be decoded.
121
+ */
122
+ static decode(jwt) {
123
+ if (typeof jwt !== 'string') {
124
+ throw new JWTInvalid('JWT must be a string');
125
+ }
126
+ const {
127
+ 0: encodedHeader,
128
+ 1: encodedPayload,
129
+ 2: signature,
130
+ length
131
+ } = jwt.split('.');
132
+ let protectedHeader;
133
+ try {
134
+ let decoded = decodeBase64(encodedHeader);
135
+ protectedHeader = JSON.parse(decoded);
136
+ if (!protectedHeader.alg || !isAlgSupported(protectedHeader.alg)) {
137
+ throw new JOSENotSupported('Unsupported "alg" value');
138
+ }
139
+ } catch {
140
+ throw new JWTInvalid('Unable to decode JWT header');
141
+ }
142
+ if (length !== 3 || encodedPayload === '' || signature === '') {
143
+ throw new JWTInvalid('Invalid JWT');
144
+ }
145
+ let decodedPayload = decodeBase64(encodedPayload);
146
+ const payload = JSON.parse(decodedPayload);
147
+ return {
148
+ payload,
149
+ protectedHeader
150
+ };
151
+ }
152
+ }
153
+ //# sourceMappingURL=sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["JOSENotSupported","JWSInvalid","JWTInvalid","ProduceJWT","decodeBase64","encodeBase64","removePadding","isAlgSupported","derToJose","SignJWT","setProtectedHeader","protectedHeader","alg","_protectedHeader","toSign","JSON","stringify","payload","_payload","appendSignature","jwtWithoutSignature","signature","jwtDecoded","decodeJwtWithoutSignature","header","encodedJws","encodedHeader","encodedPayload","length","split","decoded","parse","decodedPayload","decode","jwt"],"sourceRoot":"../../src","sources":["sign.ts"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":""}