react-native-quick-crypto 0.6.1 → 0.7.0-rc.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 (205) hide show
  1. package/README.md +70 -18
  2. package/android/CMakeLists.txt +58 -61
  3. package/android/build.gradle +105 -53
  4. package/android/gradle.properties +5 -5
  5. package/android/src/main/{AndroidManifest.xml → AndroidManifestNew.xml} +1 -2
  6. package/cpp/Cipher/MGLCipherHostObject.cpp +30 -6
  7. package/cpp/Cipher/MGLGenerateKeyPairInstaller.cpp +21 -31
  8. package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp +4 -17
  9. package/cpp/Cipher/MGLPublicCipher.h +1 -1
  10. package/cpp/Cipher/MGLPublicCipherInstaller.h +6 -6
  11. package/cpp/Cipher/MGLRsa.cpp +224 -11
  12. package/cpp/Cipher/MGLRsa.h +13 -3
  13. package/cpp/Hash/MGLHashHostObject.cpp +1 -1
  14. package/cpp/Hash/MGLHashInstaller.cpp +2 -4
  15. package/cpp/JSIUtils/MGLJSIMacros.h +10 -0
  16. package/cpp/JSIUtils/MGLThreadAwareHostObject.h +1 -1
  17. package/cpp/MGLKeys.cpp +415 -471
  18. package/cpp/MGLKeys.h +70 -2
  19. package/cpp/MGLQuickCryptoHostObject.cpp +9 -0
  20. package/cpp/Random/MGLRandomHostObject.cpp +9 -2
  21. package/cpp/Sig/MGLSignHostObjects.cpp +1 -1
  22. package/cpp/Utils/MGLUtils.cpp +104 -32
  23. package/cpp/Utils/MGLUtils.h +172 -143
  24. package/cpp/Utils/node.h +13 -0
  25. package/cpp/webcrypto/MGLWebCrypto.cpp +63 -0
  26. package/cpp/webcrypto/MGLWebCrypto.h +34 -0
  27. package/cpp/webcrypto/crypto_ec.cpp +334 -0
  28. package/cpp/webcrypto/crypto_ec.h +65 -0
  29. package/ios/QuickCrypto.xcodeproj/project.pbxproj +4 -4
  30. package/ios/QuickCrypto.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  31. package/ios/QuickCrypto.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  32. package/ios/QuickCrypto.xcodeproj/project.xcworkspace/xcuserdata/brad.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  33. package/ios/QuickCrypto.xcodeproj/xcuserdata/brad.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  34. package/lib/commonjs/@types/crypto-browserify.d.js.map +1 -1
  35. package/lib/commonjs/Cipher.js +54 -195
  36. package/lib/commonjs/Cipher.js.map +1 -1
  37. package/lib/commonjs/Hash.js +29 -29
  38. package/lib/commonjs/Hash.js.map +1 -1
  39. package/lib/commonjs/Hashnames.js +75 -0
  40. package/lib/commonjs/Hashnames.js.map +1 -0
  41. package/lib/commonjs/Hmac.js +6 -29
  42. package/lib/commonjs/Hmac.js.map +1 -1
  43. package/lib/commonjs/NativeQuickCrypto/Cipher.js +3 -5
  44. package/lib/commonjs/NativeQuickCrypto/Cipher.js.map +1 -1
  45. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js +11 -20
  46. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
  47. package/lib/commonjs/NativeQuickCrypto/hash.js.map +1 -1
  48. package/lib/commonjs/NativeQuickCrypto/hmac.js.map +1 -1
  49. package/lib/commonjs/NativeQuickCrypto/pbkdf2.js.map +1 -1
  50. package/lib/commonjs/NativeQuickCrypto/random.js.map +1 -1
  51. package/lib/commonjs/NativeQuickCrypto/sig.js.map +1 -1
  52. package/lib/commonjs/NativeQuickCrypto/webcrypto.js +6 -0
  53. package/lib/commonjs/NativeQuickCrypto/webcrypto.js.map +1 -0
  54. package/lib/commonjs/QuickCrypto.js +9 -15
  55. package/lib/commonjs/QuickCrypto.js.map +1 -1
  56. package/lib/commonjs/Utils.js +374 -48
  57. package/lib/commonjs/Utils.js.map +1 -1
  58. package/lib/commonjs/aes.js +324 -0
  59. package/lib/commonjs/aes.js.map +1 -0
  60. package/lib/commonjs/constants.js +1 -2
  61. package/lib/commonjs/constants.js.map +1 -1
  62. package/lib/commonjs/ec.js +288 -0
  63. package/lib/commonjs/ec.js.map +1 -0
  64. package/lib/commonjs/index.js +3 -15
  65. package/lib/commonjs/index.js.map +1 -1
  66. package/lib/commonjs/keys.js +280 -48
  67. package/lib/commonjs/keys.js.map +1 -1
  68. package/lib/commonjs/pbkdf2.js +44 -18
  69. package/lib/commonjs/pbkdf2.js.map +1 -1
  70. package/lib/commonjs/random.js +49 -68
  71. package/lib/commonjs/random.js.map +1 -1
  72. package/lib/commonjs/rsa.js +329 -0
  73. package/lib/commonjs/rsa.js.map +1 -0
  74. package/lib/commonjs/sig.js +13 -54
  75. package/lib/commonjs/sig.js.map +1 -1
  76. package/lib/commonjs/subtle.js +271 -0
  77. package/lib/commonjs/subtle.js.map +1 -0
  78. package/lib/module/@types/crypto-browserify.d.js.map +1 -1
  79. package/lib/module/Cipher.js +54 -189
  80. package/lib/module/Cipher.js.map +1 -1
  81. package/lib/module/Hash.js +27 -21
  82. package/lib/module/Hash.js.map +1 -1
  83. package/lib/module/Hashnames.js +71 -0
  84. package/lib/module/Hashnames.js.map +1 -0
  85. package/lib/module/Hmac.js +4 -21
  86. package/lib/module/Hmac.js.map +1 -1
  87. package/lib/module/NativeQuickCrypto/Cipher.js +3 -4
  88. package/lib/module/NativeQuickCrypto/Cipher.js.map +1 -1
  89. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js +11 -17
  90. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
  91. package/lib/module/NativeQuickCrypto/hash.js.map +1 -1
  92. package/lib/module/NativeQuickCrypto/hmac.js.map +1 -1
  93. package/lib/module/NativeQuickCrypto/pbkdf2.js.map +1 -1
  94. package/lib/module/NativeQuickCrypto/random.js.map +1 -1
  95. package/lib/module/NativeQuickCrypto/sig.js.map +1 -1
  96. package/lib/module/NativeQuickCrypto/webcrypto.js +2 -0
  97. package/lib/module/NativeQuickCrypto/webcrypto.js.map +1 -0
  98. package/lib/module/QuickCrypto.js +6 -1
  99. package/lib/module/QuickCrypto.js.map +1 -1
  100. package/lib/module/Utils.js +327 -33
  101. package/lib/module/Utils.js.map +1 -1
  102. package/lib/module/aes.js +317 -0
  103. package/lib/module/aes.js.map +1 -0
  104. package/lib/module/constants.js.map +1 -1
  105. package/lib/module/ec.js +282 -0
  106. package/lib/module/ec.js.map +1 -0
  107. package/lib/module/index.js +4 -8
  108. package/lib/module/index.js.map +1 -1
  109. package/lib/module/keys.js +279 -43
  110. package/lib/module/keys.js.map +1 -1
  111. package/lib/module/pbkdf2.js +44 -13
  112. package/lib/module/pbkdf2.js.map +1 -1
  113. package/lib/module/random.js +46 -54
  114. package/lib/module/random.js.map +1 -1
  115. package/lib/module/rsa.js +323 -0
  116. package/lib/module/rsa.js.map +1 -0
  117. package/lib/module/sig.js +13 -46
  118. package/lib/module/sig.js.map +1 -1
  119. package/lib/module/subtle.js +265 -0
  120. package/lib/module/subtle.js.map +1 -0
  121. package/lib/typescript/src/Cipher.d.ts +72 -0
  122. package/lib/typescript/src/Cipher.d.ts.map +1 -0
  123. package/lib/typescript/{Hash.d.ts → src/Hash.d.ts} +8 -7
  124. package/lib/typescript/src/Hash.d.ts.map +1 -0
  125. package/lib/typescript/src/Hashnames.d.ts +11 -0
  126. package/lib/typescript/src/Hashnames.d.ts.map +1 -0
  127. package/lib/typescript/{Hmac.d.ts → src/Hmac.d.ts} +3 -3
  128. package/lib/typescript/src/Hmac.d.ts.map +1 -0
  129. package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts +34 -0
  130. package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts.map +1 -0
  131. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/NativeQuickCrypto.d.ts +3 -0
  132. package/lib/typescript/src/NativeQuickCrypto/NativeQuickCrypto.d.ts.map +1 -0
  133. package/lib/typescript/src/NativeQuickCrypto/hash.d.ts +7 -0
  134. package/lib/typescript/src/NativeQuickCrypto/hash.d.ts.map +1 -0
  135. package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts +6 -0
  136. package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts.map +1 -0
  137. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/pbkdf2.d.ts +2 -1
  138. package/lib/typescript/src/NativeQuickCrypto/pbkdf2.d.ts.map +1 -0
  139. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/random.d.ts +2 -1
  140. package/lib/typescript/src/NativeQuickCrypto/random.d.ts.map +1 -0
  141. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/sig.d.ts +5 -4
  142. package/lib/typescript/src/NativeQuickCrypto/sig.d.ts.map +1 -0
  143. package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts +27 -0
  144. package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts.map +1 -0
  145. package/lib/typescript/{QuickCrypto.d.ts → src/QuickCrypto.d.ts} +18 -8
  146. package/lib/typescript/src/QuickCrypto.d.ts.map +1 -0
  147. package/lib/typescript/src/Utils.d.ts +46 -0
  148. package/lib/typescript/src/Utils.d.ts.map +1 -0
  149. package/lib/typescript/src/aes.d.ts +5 -0
  150. package/lib/typescript/src/aes.d.ts.map +1 -0
  151. package/lib/typescript/{constants.d.ts → src/constants.d.ts} +1 -0
  152. package/lib/typescript/src/constants.d.ts.map +1 -0
  153. package/lib/typescript/src/ec.d.ts +5 -0
  154. package/lib/typescript/src/ec.d.ts.map +1 -0
  155. package/lib/typescript/src/index.d.ts +3 -0
  156. package/lib/typescript/src/index.d.ts.map +1 -0
  157. package/lib/typescript/src/keys.d.ts +154 -0
  158. package/lib/typescript/src/keys.d.ts.map +1 -0
  159. package/lib/typescript/src/pbkdf2.d.ts +12 -0
  160. package/lib/typescript/src/pbkdf2.d.ts.map +1 -0
  161. package/lib/typescript/{random.d.ts → src/random.d.ts} +7 -6
  162. package/lib/typescript/src/random.d.ts.map +1 -0
  163. package/lib/typescript/src/rsa.d.ts +4 -0
  164. package/lib/typescript/src/rsa.d.ts.map +1 -0
  165. package/lib/typescript/{sig.d.ts → src/sig.d.ts} +3 -3
  166. package/lib/typescript/src/sig.d.ts.map +1 -0
  167. package/lib/typescript/src/subtle.d.ts +11 -0
  168. package/lib/typescript/src/subtle.d.ts.map +1 -0
  169. package/package.json +39 -34
  170. package/react-native-quick-crypto.podspec +4 -5
  171. package/src/Cipher.ts +108 -102
  172. package/src/Hash.ts +42 -6
  173. package/src/Hashnames.ts +91 -0
  174. package/src/Hmac.ts +3 -3
  175. package/src/NativeQuickCrypto/Cipher.ts +1 -0
  176. package/src/NativeQuickCrypto/NativeQuickCrypto.ts +2 -0
  177. package/src/NativeQuickCrypto/webcrypto.ts +46 -0
  178. package/src/QuickCrypto.ts +5 -0
  179. package/src/Utils.ts +491 -5
  180. package/src/aes.ts +365 -0
  181. package/src/ec.ts +351 -0
  182. package/src/index.ts +3 -8
  183. package/src/keys.ts +428 -54
  184. package/src/pbkdf2.ts +84 -11
  185. package/src/random.ts +37 -24
  186. package/src/rsa.ts +396 -0
  187. package/src/sig.ts +3 -2
  188. package/src/subtle.ts +358 -0
  189. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  190. package/android/gradle/wrapper/gradle-wrapper.properties +0 -5
  191. package/android/gradlew +0 -183
  192. package/android/gradlew.bat +0 -100
  193. package/lib/commonjs/@types/stream-browserify.d.js +0 -2
  194. package/lib/commonjs/@types/stream-browserify.d.js.map +0 -1
  195. package/lib/module/@types/stream-browserify.d.js +0 -2
  196. package/lib/module/@types/stream-browserify.d.js.map +0 -1
  197. package/lib/typescript/Cipher.d.ts +0 -87
  198. package/lib/typescript/NativeQuickCrypto/Cipher.d.ts +0 -32
  199. package/lib/typescript/NativeQuickCrypto/hash.d.ts +0 -6
  200. package/lib/typescript/NativeQuickCrypto/hmac.d.ts +0 -5
  201. package/lib/typescript/Utils.d.ts +0 -23
  202. package/lib/typescript/index.d.ts +0 -207
  203. package/lib/typescript/keys.d.ts +0 -60
  204. package/lib/typescript/pbkdf2.d.ts +0 -9
  205. package/src/@types/stream-browserify.d.ts +0 -4
@@ -1,14 +1,10 @@
1
1
  import { Buffer } from '@craftzdog/react-native-buffer';
2
2
  import { QuickCrypto } from './QuickCrypto';
3
- import FallbackCrypto from 'crypto-browserify'; // @ts-expect-error Buffer does not match exact same type definition.
4
3
 
4
+ // @ts-expect-error Buffer does not match exact same type definition.
5
5
  global.Buffer = Buffer;
6
- const crypto = { ...FallbackCrypto,
7
- ...QuickCrypto
8
- }; // for randombytes https://github.com/crypto-browserify/randombytes/blob/master/browser.js#L16
9
- // @ts-expect-error QuickCrypto is missing `subtle` and `randomUUID`
10
6
 
11
- global.crypto = crypto;
12
- module.exports = crypto;
13
- export default crypto;
7
+ // @ts-expect-error subtle isn't full implemented and Cryptokey is missing
8
+ global.crypto = QuickCrypto;
9
+ export default QuickCrypto;
14
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"names":["Buffer","QuickCrypto","FallbackCrypto","global","crypto","module","exports"],"mappings":"AAAA,SAASA,MAAT,QAAuB,gCAAvB;AACA,SAASC,WAAT,QAA4B,eAA5B;AACA,OAAOC,cAAP,MAA2B,mBAA3B,C,CAEA;;AACAC,MAAM,CAACH,MAAP,GAAgBA,MAAhB;AAEA,MAAMI,MAAM,GAAG,EAAE,GAAGF,cAAL;AAAqB,KAAGD;AAAxB,CAAf,C,CAEA;AACA;;AACAE,MAAM,CAACC,MAAP,GAAgBA,MAAhB;AAEAC,MAAM,CAACC,OAAP,GAAiBF,MAAjB;AACA,eAAeA,MAAf","sourcesContent":["import { Buffer } from '@craftzdog/react-native-buffer';\nimport { QuickCrypto } from './QuickCrypto';\nimport FallbackCrypto from 'crypto-browserify';\n\n// @ts-expect-error Buffer does not match exact same type definition.\nglobal.Buffer = Buffer;\n\nconst crypto = { ...FallbackCrypto, ...QuickCrypto };\n\n// for randombytes https://github.com/crypto-browserify/randombytes/blob/master/browser.js#L16\n// @ts-expect-error QuickCrypto is missing `subtle` and `randomUUID`\nglobal.crypto = crypto;\n\nmodule.exports = crypto;\nexport default crypto;\n"]}
1
+ {"version":3,"names":["Buffer","QuickCrypto","global","crypto"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,SAASA,MAAM,QAAQ,gCAAgC;AACvD,SAASC,WAAW,QAAQ,eAAe;;AAE3C;AACAC,MAAM,CAACF,MAAM,GAAGA,MAAM;;AAEtB;AACAE,MAAM,CAACC,MAAM,GAAGF,WAAW;AAE3B,eAAeA,WAAW","ignoreList":[]}
@@ -1,48 +1,69 @@
1
- import { binaryLikeToArrayBuffer, isStringOrBuffer } from './Utils'; // On node this value is defined on the native side, for now I'm just creating it here in JS
1
+ import { binaryLikeToArrayBuffer, isStringOrBuffer } from './Utils';
2
+ import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';
3
+ export const kNamedCurveAliases = {
4
+ 'P-256': 'prime256v1',
5
+ 'P-384': 'secp384r1',
6
+ 'P-521': 'secp521r1'
7
+ };
8
+ // On node this value is defined on the native side, for now I'm just creating it here in JS
2
9
  // TODO(osp) move this into native side to make sure they always match
3
-
4
- var KFormatType;
5
-
6
- (function (KFormatType) {
10
+ export let KFormatType = /*#__PURE__*/function (KFormatType) {
7
11
  KFormatType[KFormatType["kKeyFormatDER"] = 0] = "kKeyFormatDER";
8
12
  KFormatType[KFormatType["kKeyFormatPEM"] = 1] = "kKeyFormatPEM";
9
13
  KFormatType[KFormatType["kKeyFormatJWK"] = 2] = "kKeyFormatJWK";
10
- })(KFormatType || (KFormatType = {}));
14
+ return KFormatType;
15
+ }({});
11
16
 
12
- var KeyInputContext;
17
+ // Same as KFormatType, this enum needs to be defined on the native side
18
+ export let KeyType = /*#__PURE__*/function (KeyType) {
19
+ KeyType[KeyType["Secret"] = 0] = "Secret";
20
+ KeyType[KeyType["Public"] = 1] = "Public";
21
+ KeyType[KeyType["Private"] = 2] = "Private";
22
+ return KeyType;
23
+ }({});
13
24
 
14
- (function (KeyInputContext) {
25
+ // Same as KFormatType, this enum needs to be defined on the native side
26
+ export let KWebCryptoKeyFormat = /*#__PURE__*/function (KWebCryptoKeyFormat) {
27
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatRaw"] = 0] = "kWebCryptoKeyFormatRaw";
28
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatPKCS8"] = 1] = "kWebCryptoKeyFormatPKCS8";
29
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatSPKI"] = 2] = "kWebCryptoKeyFormatSPKI";
30
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatJWK"] = 3] = "kWebCryptoKeyFormatJWK";
31
+ return KWebCryptoKeyFormat;
32
+ }({});
33
+ export let WebCryptoKeyExportStatus = /*#__PURE__*/function (WebCryptoKeyExportStatus) {
34
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["OK"] = 0] = "OK";
35
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["INVALID_KEY_TYPE"] = 1] = "INVALID_KEY_TYPE";
36
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["FAILED"] = 2] = "FAILED";
37
+ return WebCryptoKeyExportStatus;
38
+ }({});
39
+ var KeyInputContext = /*#__PURE__*/function (KeyInputContext) {
15
40
  KeyInputContext[KeyInputContext["kConsumePublic"] = 0] = "kConsumePublic";
16
41
  KeyInputContext[KeyInputContext["kConsumePrivate"] = 1] = "kConsumePrivate";
17
42
  KeyInputContext[KeyInputContext["kCreatePublic"] = 2] = "kCreatePublic";
18
43
  KeyInputContext[KeyInputContext["kCreatePrivate"] = 3] = "kCreatePrivate";
19
- })(KeyInputContext || (KeyInputContext = {}));
20
-
21
- var KeyEncoding;
22
-
23
- (function (KeyEncoding) {
44
+ return KeyInputContext;
45
+ }(KeyInputContext || {});
46
+ export let KeyEncoding = /*#__PURE__*/function (KeyEncoding) {
24
47
  KeyEncoding[KeyEncoding["kKeyEncodingPKCS1"] = 0] = "kKeyEncodingPKCS1";
25
48
  KeyEncoding[KeyEncoding["kKeyEncodingPKCS8"] = 1] = "kKeyEncodingPKCS8";
26
49
  KeyEncoding[KeyEncoding["kKeyEncodingSPKI"] = 2] = "kKeyEncodingSPKI";
27
50
  KeyEncoding[KeyEncoding["kKeyEncodingSEC1"] = 3] = "kKeyEncodingSEC1";
28
- })(KeyEncoding || (KeyEncoding = {}));
29
-
51
+ return KeyEncoding;
52
+ }({});
30
53
  const encodingNames = {
31
54
  [KeyEncoding.kKeyEncodingPKCS1]: 'pkcs1',
32
55
  [KeyEncoding.kKeyEncodingPKCS8]: 'pkcs8',
33
56
  [KeyEncoding.kKeyEncodingSPKI]: 'spki',
34
57
  [KeyEncoding.kKeyEncodingSEC1]: 'sec1'
35
58
  };
36
-
37
59
  function option(name, objName) {
38
60
  return objName === undefined ? `options.${name}` : `options.${objName}.${name}`;
39
61
  }
40
-
41
62
  function parseKeyFormat(formatStr, defaultFormat, optionName) {
42
63
  if (formatStr === undefined && defaultFormat !== undefined) return defaultFormat;else if (formatStr === 'pem') return KFormatType.kKeyFormatPEM;else if (formatStr === 'der') return KFormatType.kKeyFormatDER;else if (formatStr === 'jwk') return KFormatType.kKeyFormatJWK;
43
- throw new Error(`Invalid key format str: ${optionName}`); // throw new ERR_INVALID_ARG_VALUE(optionName, formatStr);
64
+ throw new Error(`Invalid key format str: ${optionName}`);
65
+ // throw new ERR_INVALID_ARG_VALUE(optionName, formatStr);
44
66
  }
45
-
46
67
  function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
47
68
  if (typeStr === undefined && !required) {
48
69
  return undefined;
@@ -50,7 +71,6 @@ function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
50
71
  if (keyType !== undefined && keyType !== 'rsa') {
51
72
  throw new Error(`Crypto incompatible key options: ${typeStr} can only be used for RSA keys`);
52
73
  }
53
-
54
74
  return KeyEncoding.kKeyEncodingPKCS1;
55
75
  } else if (typeStr === 'spki' && isPublic !== false) {
56
76
  return KeyEncoding.kKeyEncodingSPKI;
@@ -60,13 +80,10 @@ function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
60
80
  if (keyType !== undefined && keyType !== 'ec') {
61
81
  throw new Error(`Incompatible key options ${typeStr} can only be used for EC keys`);
62
82
  }
63
-
64
83
  return KeyEncoding.kKeyEncodingSEC1;
65
84
  }
66
-
67
85
  throw new Error(`Invalid option ${optionName} - ${typeStr}`);
68
86
  }
69
-
70
87
  function parseKeyFormatAndType(enc, keyType, isPublic, objName) {
71
88
  const {
72
89
  format: formatStr,
@@ -81,27 +98,24 @@ function parseKeyFormatAndType(enc, keyType, isPublic, objName) {
81
98
  type
82
99
  };
83
100
  }
84
-
85
101
  function parseKeyEncoding(enc, keyType, isPublic, objName) {
86
102
  // validateObject(enc, 'options');
103
+
87
104
  const isInput = keyType === undefined;
88
105
  const {
89
106
  format,
90
107
  type
91
108
  } = parseKeyFormatAndType(enc, keyType, isPublic, objName);
92
109
  let cipher, passphrase, encoding;
93
-
94
110
  if (isPublic !== true) {
95
111
  ({
96
112
  cipher,
97
113
  passphrase,
98
114
  encoding
99
115
  } = enc);
100
-
101
116
  if (!isInput) {
102
117
  if (cipher != null) {
103
118
  if (typeof cipher !== 'string') throw new Error(`Invalid argument ${option('cipher', objName)}: ${cipher}`);
104
-
105
119
  if (format === KFormatType.kKeyFormatDER && (type === KeyEncoding.kKeyEncodingPKCS1 || type === KeyEncoding.kKeyEncodingSEC1)) {
106
120
  throw new Error(`Incompatible key options ${encodingNames[type]} does not support encryption`);
107
121
  }
@@ -109,12 +123,10 @@ function parseKeyEncoding(enc, keyType, isPublic, objName) {
109
123
  throw new Error(`invalid argument ${option('cipher', objName)}: ${cipher}`);
110
124
  }
111
125
  }
112
-
113
126
  if (isInput && passphrase !== undefined && !isStringOrBuffer(passphrase) || !isInput && cipher != null && !isStringOrBuffer(passphrase)) {
114
127
  throw new Error(`Invalid argument value ${option('passphrase', objName)}: ${passphrase}`);
115
128
  }
116
129
  }
117
-
118
130
  if (passphrase !== undefined) passphrase = binaryLikeToArrayBuffer(passphrase, encoding);
119
131
  return {
120
132
  format,
@@ -123,7 +135,6 @@ function parseKeyEncoding(enc, keyType, isPublic, objName) {
123
135
  passphrase
124
136
  };
125
137
  }
126
-
127
138
  function prepareAsymmetricKey(key, ctx) {
128
139
  // TODO(osp) check, KeyObject some node object
129
140
  // if (isKeyObject(key)) {
@@ -142,9 +153,10 @@ function prepareAsymmetricKey(key, ctx) {
142
153
  } else if (typeof key === 'object') {
143
154
  const {
144
155
  key: data,
145
- encoding // format
146
-
147
- } = key; // // The 'key' property can be a KeyObject as well to allow specifying
156
+ encoding
157
+ // format
158
+ } = key;
159
+ // // The 'key' property can be a KeyObject as well to allow specifying
148
160
  // // additional options such as padding along with the key.
149
161
  // if (isKeyObject(data)) return { data: getKeyObjectHandle(data, ctx) };
150
162
  // else if (isCryptoKey(data))
@@ -152,39 +164,263 @@ function prepareAsymmetricKey(key, ctx) {
152
164
  // else if (isJwk(data) && format === 'jwk')
153
165
  // return { data: getKeyObjectHandleFromJwk(data, ctx), format: 'jwk' };
154
166
  // Either PEM or DER using PKCS#1 or SPKI.
155
-
156
167
  if (!isStringOrBuffer(data)) {
157
168
  throw new Error('prepareAsymmetricKey: key is not a string or ArrayBuffer');
158
169
  }
159
-
160
170
  const isPublic = ctx === KeyInputContext.kConsumePrivate || ctx === KeyInputContext.kCreatePrivate ? false : undefined;
161
171
  return {
162
172
  data: binaryLikeToArrayBuffer(data, encoding),
163
173
  ...parseKeyEncoding(key, undefined, isPublic)
164
174
  };
165
175
  }
166
-
167
176
  throw new Error('[prepareAsymetricKey] Invalid argument key: ${key}');
168
- } // TODO(osp) any here is a node KeyObject
169
-
177
+ }
170
178
 
179
+ // TODO(osp) any here is a node KeyObject
171
180
  export function preparePrivateKey(key) {
172
181
  return prepareAsymmetricKey(key, KeyInputContext.kConsumePrivate);
173
- } // TODO(osp) any here is a node KeyObject
182
+ }
174
183
 
184
+ // TODO(osp) any here is a node KeyObject
175
185
  export function preparePublicOrPrivateKey(key) {
176
186
  return prepareAsymmetricKey(key, KeyInputContext.kConsumePublic);
177
- } // Parses the public key encoding based on an object. keyType must be undefined
187
+ }
188
+
189
+ // Parses the public key encoding based on an object. keyType must be undefined
178
190
  // when this is used to parse an input encoding and must be a valid key type if
179
191
  // used to parse an output encoding.
180
-
181
192
  export function parsePublicKeyEncoding(enc, keyType, objName) {
182
193
  return parseKeyEncoding(enc, keyType, keyType ? true : undefined, objName);
183
- } // Parses the private key encoding based on an object. keyType must be undefined
194
+ }
195
+
196
+ // Parses the private key encoding based on an object. keyType must be undefined
184
197
  // when this is used to parse an input encoding and must be a valid key type if
185
198
  // used to parse an output encoding.
186
-
187
199
  export function parsePrivateKeyEncoding(enc, keyType, objName) {
188
200
  return parseKeyEncoding(enc, keyType, false, objName);
189
201
  }
202
+ function prepareSecretKey(key,
203
+ //KeyObject | CryptoKey | string,
204
+ encoding, bufferOnly = false) {
205
+ if (!bufferOnly) {
206
+ // TODO: maybe use `key.constructor.name === 'KeyObject'` ?
207
+ if (key instanceof KeyObject) {
208
+ if (key.type !== 'secret') throw new Error(`invalid KeyObject type: ${key.type}, expected 'secret'`);
209
+ return key.handle;
210
+ }
211
+ // TODO: maybe use `key.constructor.name === 'CryptoKey'` ?
212
+ else if (key instanceof CryptoKey) {
213
+ if (key.type !== 'secret') throw new Error(`invalid CryptoKey type: ${key.type}, expected 'secret'`);
214
+ return key.keyObject.handle;
215
+ }
216
+ }
217
+ if (key instanceof ArrayBuffer) {
218
+ return key;
219
+ }
220
+ if (typeof key === 'string') {
221
+ return binaryLikeToArrayBuffer(key, encoding);
222
+ }
223
+ throw new Error('invalid argument type "key"');
224
+ }
225
+ export function createSecretKey(key, encoding) {
226
+ const k = prepareSecretKey(key, encoding, true);
227
+ const handle = NativeQuickCrypto.webcrypto.createKeyObjectHandle();
228
+ handle.init(KeyType.Secret, k);
229
+ return new SecretKeyObject(handle);
230
+ }
231
+ export class CryptoKey {
232
+ constructor(keyObject, keyAlgorithm, keyUsages, keyExtractable) {
233
+ this.keyObject = keyObject;
234
+ this.keyAlgorithm = keyAlgorithm;
235
+ this.keyUsages = keyUsages;
236
+ this.keyExtractable = keyExtractable;
237
+ }
238
+ inspect(_depth, _options) {
239
+ throw new Error('CryptoKey.inspect is not implemented');
240
+ // if (depth < 0) return this;
241
+
242
+ // const opts = {
243
+ // ...options,
244
+ // depth: options.depth == null ? null : options.depth - 1,
245
+ // };
246
+
247
+ // return `CryptoKey ${inspect(
248
+ // {
249
+ // type: this.type,
250
+ // extractable: this.extractable,
251
+ // algorithm: this.algorithm,
252
+ // usages: this.usages,
253
+ // },
254
+ // opts
255
+ // )}`;
256
+ }
257
+ get type() {
258
+ // if (!(this instanceof CryptoKey)) throw new Error('Invalid CryptoKey');
259
+ return this.keyObject.type;
260
+ }
261
+ get extractable() {
262
+ return this.keyExtractable;
263
+ }
264
+ get algorithm() {
265
+ return this.keyAlgorithm;
266
+ }
267
+ get usages() {
268
+ return this.keyUsages;
269
+ }
270
+ }
271
+
272
+ // ObjectDefineProperties(CryptoKey.prototype, {
273
+ // type: kEnumerableProperty,
274
+ // extractable: kEnumerableProperty,
275
+ // algorithm: kEnumerableProperty,
276
+ // usages: kEnumerableProperty,
277
+ // [SymbolToStringTag]: {
278
+ // __proto__: null,
279
+ // configurable: true,
280
+ // value: 'CryptoKey',
281
+ // },
282
+ // });
283
+
284
+ class KeyObject {
285
+ type = 'unknown';
286
+ export(_options) {
287
+ return new ArrayBuffer(0);
288
+ }
289
+ constructor(type, handle) {
290
+ if (type !== 'secret' && type !== 'public' && type !== 'private') throw new Error(`invalid KeyObject type: ${type}`);
291
+ this.handle = handle;
292
+ this.type = type;
293
+ }
294
+
295
+ // get type(): string {
296
+ // return this.type;
297
+ // }
298
+
299
+ // static from(key) {
300
+ // if (!isCryptoKey(key))
301
+ // throw new ERR_INVALID_ARG_TYPE('key', 'CryptoKey', key);
302
+ // return key[kKeyObject];
303
+ // }
304
+
305
+ // equals(otherKeyObject) {
306
+ // if (!isKeyObject(otherKeyObject)) {
307
+ // throw new ERR_INVALID_ARG_TYPE(
308
+ // 'otherKeyObject',
309
+ // 'KeyObject',
310
+ // otherKeyObject
311
+ // );
312
+ // }
313
+
314
+ // return (
315
+ // otherKeyObject.type === this.type &&
316
+ // this[kHandle].equals(otherKeyObject[kHandle])
317
+ // );
318
+ // }
319
+ }
320
+
321
+ // ObjectDefineProperties(KeyObject.prototype, {
322
+ // [SymbolToStringTag]: {
323
+ // __proto__: null,
324
+ // configurable: true,
325
+ // value: 'KeyObject',
326
+ // },
327
+ // });
328
+
329
+ export class SecretKeyObject extends KeyObject {
330
+ constructor(handle) {
331
+ super('secret', handle);
332
+ }
333
+
334
+ // get symmetricKeySize() {
335
+ // return this[kHandle].getSymmetricKeySize();
336
+ // }
337
+
338
+ export(options) {
339
+ if (options !== undefined) {
340
+ if (options.format === 'jwk') {
341
+ throw new Error('SecretKey export for jwk is not implemented');
342
+ // return this.handle.exportJwk({}, false);
343
+ }
344
+ }
345
+ return this.handle.export();
346
+ }
347
+ }
348
+
349
+ // const kAsymmetricKeyType = Symbol('kAsymmetricKeyType');
350
+ // const kAsymmetricKeyDetails = Symbol('kAsymmetricKeyDetails');
351
+
352
+ // function normalizeKeyDetails(details = {}) {
353
+ // if (details.publicExponent !== undefined) {
354
+ // return {
355
+ // ...details,
356
+ // publicExponent: bigIntArrayToUnsignedBigInt(
357
+ // new Uint8Array(details.publicExponent)
358
+ // ),
359
+ // };
360
+ // }
361
+ // return details;
362
+ // }
363
+
364
+ class AsymmetricKeyObject extends KeyObject {
365
+ constructor(type, handle) {
366
+ super(type, handle);
367
+ }
368
+ get asymmetricKeyType() {
369
+ return this.asymmetricKeyType || this.handle.getAsymmetricKeyType();
370
+ }
371
+
372
+ // get asymmetricKeyDetails() {
373
+ // switch (this.asymmetricKeyType) {
374
+ // case 'rsa':
375
+ // case 'rsa-pss':
376
+ // case 'dsa':
377
+ // case 'ec':
378
+ // return (
379
+ // this[kAsymmetricKeyDetails] ||
380
+ // (this[kAsymmetricKeyDetails] = normalizeKeyDetails(
381
+ // this[kHandle].keyDetail({})
382
+ // ))
383
+ // );
384
+ // default:
385
+ // return {};
386
+ // }
387
+ // }
388
+ }
389
+ export class PublicKeyObject extends AsymmetricKeyObject {
390
+ constructor(handle) {
391
+ super('public', handle);
392
+ }
393
+ export(options) {
394
+ if (options?.format === 'jwk') {
395
+ throw new Error('PublicKey export for jwk is not implemented');
396
+ // return this.handle.exportJwk({}, false);
397
+ }
398
+ const {
399
+ format,
400
+ type
401
+ } = parsePublicKeyEncoding(options, this.asymmetricKeyType);
402
+ return this.handle.export(format, type);
403
+ }
404
+ }
405
+ export class PrivateKeyObject extends AsymmetricKeyObject {
406
+ constructor(handle) {
407
+ super('private', handle);
408
+ }
409
+ export(options) {
410
+ if (options?.format === 'jwk') {
411
+ if (options.passphrase !== undefined) {
412
+ throw new Error('jwk does not support encryption');
413
+ }
414
+ throw new Error('PrivateKey export for jwk is not implemented');
415
+ // return this.handle.exportJwk({}, false);
416
+ }
417
+ const {
418
+ format,
419
+ type,
420
+ cipher,
421
+ passphrase
422
+ } = parsePrivateKeyEncoding(options, this.asymmetricKeyType);
423
+ return this.handle.export(format, type, cipher, passphrase);
424
+ }
425
+ }
190
426
  //# sourceMappingURL=keys.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["keys.ts"],"names":["binaryLikeToArrayBuffer","isStringOrBuffer","KFormatType","KeyInputContext","KeyEncoding","encodingNames","kKeyEncodingPKCS1","kKeyEncodingPKCS8","kKeyEncodingSPKI","kKeyEncodingSEC1","option","name","objName","undefined","parseKeyFormat","formatStr","defaultFormat","optionName","kKeyFormatPEM","kKeyFormatDER","kKeyFormatJWK","Error","parseKeyType","typeStr","required","keyType","isPublic","parseKeyFormatAndType","enc","format","type","isInput","isRequired","parseKeyEncoding","cipher","passphrase","encoding","prepareAsymmetricKey","key","ctx","data","kConsumePrivate","kCreatePrivate","preparePrivateKey","preparePublicOrPrivateKey","kConsumePublic","parsePublicKeyEncoding","parsePrivateKeyEncoding"],"mappings":"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","sourcesContent":["import { BinaryLike, binaryLikeToArrayBuffer, isStringOrBuffer } from './Utils';\n\n// On node this value is defined on the native side, for now I'm just creating it here in JS\n// TODO(osp) move this into native side to make sure they always match\nenum KFormatType {\n kKeyFormatDER,\n kKeyFormatPEM,\n kKeyFormatJWK,\n}\n\nenum KeyInputContext {\n kConsumePublic,\n kConsumePrivate,\n kCreatePublic,\n kCreatePrivate,\n}\n\nenum KeyEncoding {\n kKeyEncodingPKCS1,\n kKeyEncodingPKCS8,\n kKeyEncodingSPKI,\n kKeyEncodingSEC1,\n}\n\nconst encodingNames = {\n [KeyEncoding.kKeyEncodingPKCS1]: 'pkcs1',\n [KeyEncoding.kKeyEncodingPKCS8]: 'pkcs8',\n [KeyEncoding.kKeyEncodingSPKI]: 'spki',\n [KeyEncoding.kKeyEncodingSEC1]: 'sec1',\n};\n\nfunction option(name: string, objName: string | undefined) {\n return objName === undefined\n ? `options.${name}`\n : `options.${objName}.${name}`;\n}\n\nfunction parseKeyFormat(\n formatStr: string | undefined,\n defaultFormat: KFormatType | undefined,\n optionName?: string\n) {\n if (formatStr === undefined && defaultFormat !== undefined)\n return defaultFormat;\n else if (formatStr === 'pem') return KFormatType.kKeyFormatPEM;\n else if (formatStr === 'der') return KFormatType.kKeyFormatDER;\n else if (formatStr === 'jwk') return KFormatType.kKeyFormatJWK;\n throw new Error(`Invalid key format str: ${optionName}`);\n // throw new ERR_INVALID_ARG_VALUE(optionName, formatStr);\n}\n\nfunction parseKeyType(\n typeStr: string | undefined,\n required: boolean,\n keyType: string | undefined,\n isPublic: boolean | undefined,\n optionName: string\n) {\n if (typeStr === undefined && !required) {\n return undefined;\n } else if (typeStr === 'pkcs1') {\n if (keyType !== undefined && keyType !== 'rsa') {\n throw new Error(\n `Crypto incompatible key options: ${typeStr} can only be used for RSA keys`\n );\n }\n return KeyEncoding.kKeyEncodingPKCS1;\n } else if (typeStr === 'spki' && isPublic !== false) {\n return KeyEncoding.kKeyEncodingSPKI;\n } else if (typeStr === 'pkcs8' && isPublic !== true) {\n return KeyEncoding.kKeyEncodingPKCS8;\n } else if (typeStr === 'sec1' && isPublic !== true) {\n if (keyType !== undefined && keyType !== 'ec') {\n throw new Error(\n `Incompatible key options ${typeStr} can only be used for EC keys`\n );\n }\n return KeyEncoding.kKeyEncodingSEC1;\n }\n\n throw new Error(`Invalid option ${optionName} - ${typeStr}`);\n}\n\nfunction parseKeyFormatAndType(\n enc: {\n key: any;\n type?: string;\n encoding?: string;\n format?: string;\n cipher?: string;\n passphrase?: string;\n },\n keyType: string | undefined,\n isPublic: boolean | undefined,\n objName: string | undefined\n) {\n const { format: formatStr, type: typeStr } = enc;\n\n const isInput = keyType === undefined;\n const format = parseKeyFormat(\n formatStr,\n isInput ? KFormatType.kKeyFormatPEM : undefined,\n option('format', objName)\n );\n\n const isRequired =\n (!isInput || format === KFormatType.kKeyFormatDER) &&\n format !== KFormatType.kKeyFormatJWK;\n\n const type = parseKeyType(\n typeStr,\n isRequired,\n keyType,\n isPublic,\n option('type', objName)\n );\n return { format, type };\n}\n\nfunction parseKeyEncoding(\n enc: {\n key: any;\n type?: string;\n encoding?: string;\n format?: string;\n cipher?: string;\n passphrase?: string;\n },\n keyType: string | undefined,\n isPublic: boolean | undefined,\n objName?: string | undefined\n) {\n // validateObject(enc, 'options');\n\n const isInput = keyType === undefined;\n\n const { format, type } = parseKeyFormatAndType(\n enc,\n keyType,\n isPublic,\n objName\n );\n\n let cipher, passphrase, encoding;\n if (isPublic !== true) {\n ({ cipher, passphrase, encoding } = enc);\n\n if (!isInput) {\n if (cipher != null) {\n if (typeof cipher !== 'string')\n throw new Error(\n `Invalid argument ${option('cipher', objName)}: ${cipher}`\n );\n if (\n format === KFormatType.kKeyFormatDER &&\n (type === KeyEncoding.kKeyEncodingPKCS1 ||\n type === KeyEncoding.kKeyEncodingSEC1)\n ) {\n throw new Error(\n `Incompatible key options ${encodingNames[type]} does not support encryption`\n );\n }\n } else if (passphrase !== undefined) {\n throw new Error(\n `invalid argument ${option('cipher', objName)}: ${cipher}`\n );\n }\n }\n\n if (\n (isInput && passphrase !== undefined && !isStringOrBuffer(passphrase)) ||\n (!isInput && cipher != null && !isStringOrBuffer(passphrase))\n ) {\n throw new Error(\n `Invalid argument value ${option('passphrase', objName)}: ${passphrase}`\n );\n }\n }\n\n if (passphrase !== undefined)\n passphrase = binaryLikeToArrayBuffer(passphrase, encoding);\n\n return { format, type, cipher, passphrase };\n}\n\nfunction prepareAsymmetricKey(\n key:\n | BinaryLike\n | { key: any; encoding?: string; format?: any; passphrase?: string },\n ctx: KeyInputContext\n): {\n format: KFormatType;\n data: ArrayBuffer;\n type?: any;\n passphrase?: any;\n} {\n // TODO(osp) check, KeyObject some node object\n // if (isKeyObject(key)) {\n // // Best case: A key object, as simple as that.\n // return { data: getKeyObjectHandle(key, ctx) };\n // } else\n // if (isCryptoKey(key)) {\n // return { data: getKeyObjectHandle(key[kKeyObject], ctx) };\n // } else\n if (isStringOrBuffer(key)) {\n // Expect PEM by default, mostly for backward compatibility.\n return {\n format: KFormatType.kKeyFormatPEM,\n data: binaryLikeToArrayBuffer(key),\n };\n } else if (typeof key === 'object') {\n const {\n key: data,\n encoding,\n // format\n } = key;\n // // The 'key' property can be a KeyObject as well to allow specifying\n // // additional options such as padding along with the key.\n // if (isKeyObject(data)) return { data: getKeyObjectHandle(data, ctx) };\n // else if (isCryptoKey(data))\n // return { data: getKeyObjectHandle(data[kKeyObject], ctx) };\n // else if (isJwk(data) && format === 'jwk')\n // return { data: getKeyObjectHandleFromJwk(data, ctx), format: 'jwk' };\n // Either PEM or DER using PKCS#1 or SPKI.\n if (!isStringOrBuffer(data)) {\n throw new Error(\n 'prepareAsymmetricKey: key is not a string or ArrayBuffer'\n );\n }\n\n const isPublic =\n ctx === KeyInputContext.kConsumePrivate ||\n ctx === KeyInputContext.kCreatePrivate\n ? false\n : undefined;\n\n return {\n data: binaryLikeToArrayBuffer(data, encoding),\n ...parseKeyEncoding(key, undefined, isPublic),\n };\n }\n\n throw new Error('[prepareAsymetricKey] Invalid argument key: ${key}');\n}\n\n// TODO(osp) any here is a node KeyObject\nexport function preparePrivateKey(\n key:\n | BinaryLike\n | {\n key: any;\n encoding?: string;\n format?: any;\n padding?: number;\n passphrase?: string;\n }\n) {\n return prepareAsymmetricKey(key, KeyInputContext.kConsumePrivate);\n}\n\n// TODO(osp) any here is a node KeyObject\nexport function preparePublicOrPrivateKey(\n key:\n | BinaryLike\n | { key: any; encoding?: string; format?: any; padding?: number }\n) {\n return prepareAsymmetricKey(key, KeyInputContext.kConsumePublic);\n}\n\n// Parses the public key encoding based on an object. keyType must be undefined\n// when this is used to parse an input encoding and must be a valid key type if\n// used to parse an output encoding.\nexport function parsePublicKeyEncoding(\n enc: {\n key: any;\n encoding?: string;\n format?: string;\n cipher?: string;\n passphrase?: string;\n },\n keyType: string | undefined,\n objName?: string\n) {\n return parseKeyEncoding(enc, keyType, keyType ? true : undefined, objName);\n}\n\n// Parses the private key encoding based on an object. keyType must be undefined\n// when this is used to parse an input encoding and must be a valid key type if\n// used to parse an output encoding.\nexport function parsePrivateKeyEncoding(\n enc: {\n key: any;\n encoding?: string;\n format?: string;\n cipher?: string;\n passphrase?: string;\n },\n keyType: string | undefined,\n objName?: string\n) {\n return parseKeyEncoding(enc, keyType, false, objName);\n}\n"]}
1
+ {"version":3,"names":["binaryLikeToArrayBuffer","isStringOrBuffer","NativeQuickCrypto","kNamedCurveAliases","KFormatType","KeyType","KWebCryptoKeyFormat","WebCryptoKeyExportStatus","KeyInputContext","KeyEncoding","encodingNames","kKeyEncodingPKCS1","kKeyEncodingPKCS8","kKeyEncodingSPKI","kKeyEncodingSEC1","option","name","objName","undefined","parseKeyFormat","formatStr","defaultFormat","optionName","kKeyFormatPEM","kKeyFormatDER","kKeyFormatJWK","Error","parseKeyType","typeStr","required","keyType","isPublic","parseKeyFormatAndType","enc","format","type","isInput","isRequired","parseKeyEncoding","cipher","passphrase","encoding","prepareAsymmetricKey","key","ctx","data","kConsumePrivate","kCreatePrivate","preparePrivateKey","preparePublicOrPrivateKey","kConsumePublic","parsePublicKeyEncoding","parsePrivateKeyEncoding","prepareSecretKey","bufferOnly","KeyObject","handle","CryptoKey","keyObject","ArrayBuffer","createSecretKey","k","webcrypto","createKeyObjectHandle","init","Secret","SecretKeyObject","constructor","keyAlgorithm","keyUsages","keyExtractable","inspect","_depth","_options","extractable","algorithm","usages","export","options","AsymmetricKeyObject","asymmetricKeyType","getAsymmetricKeyType","PublicKeyObject","PrivateKeyObject"],"sourceRoot":"../../src","sources":["keys.ts"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';
2
2
  import { Buffer } from '@craftzdog/react-native-buffer';
3
- import { binaryLikeToArrayBuffer } from './Utils';
3
+ import { binaryLikeToArrayBuffer, lazyDOMException, bufferLikeToArrayBuffer, normalizeHashName, HashContext } from './Utils';
4
+ import { promisify } from 'util';
4
5
  const WRONG_PASS = 'Password must be a string, a Buffer, a typed array or a DataView';
5
- const WRON_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
6
-
6
+ const WRONG_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
7
7
  function sanitizeInput(input, errorMsg) {
8
8
  try {
9
9
  return binaryLikeToArrayBuffer(input);
@@ -11,15 +11,12 @@ function sanitizeInput(input, errorMsg) {
11
11
  throw errorMsg;
12
12
  }
13
13
  }
14
-
15
14
  const nativePbkdf2 = NativeQuickCrypto.pbkdf2;
16
15
  export function pbkdf2(password, salt, iterations, keylen, arg0, arg1) {
17
- let digest = 'sha1';
16
+ let digest = 'SHA-1';
18
17
  let callback;
19
-
20
18
  if (typeof arg0 === 'string') {
21
19
  digest = arg0;
22
-
23
20
  if (typeof arg1 === 'function') {
24
21
  callback = arg1;
25
22
  }
@@ -28,14 +25,13 @@ export function pbkdf2(password, salt, iterations, keylen, arg0, arg1) {
28
25
  callback = arg0;
29
26
  }
30
27
  }
31
-
32
28
  if (callback === undefined) {
33
29
  throw new Error('No callback provided to pbkdf2');
34
30
  }
35
-
36
31
  const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
37
- const sanitizedSalt = sanitizeInput(salt, WRON_SALT);
38
- nativePbkdf2.pbkdf2(sanitizedPassword, sanitizedSalt, iterations, keylen, digest).then(res => {
32
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
33
+ const normalizedDigest = normalizeHashName(digest, HashContext.Node);
34
+ nativePbkdf2.pbkdf2(sanitizedPassword, sanitizedSalt, iterations, keylen, normalizedDigest).then(res => {
39
35
  callback(null, Buffer.from(res));
40
36
  }, e => {
41
37
  callback(e);
@@ -43,9 +39,44 @@ export function pbkdf2(password, salt, iterations, keylen, arg0, arg1) {
43
39
  }
44
40
  export function pbkdf2Sync(password, salt, iterations, keylen, digest) {
45
41
  const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
46
- const sanitizedSalt = sanitizeInput(salt, WRON_SALT);
47
- const algo = digest ? digest : 'sha1';
42
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
43
+ const algo = digest ? normalizeHashName(digest, HashContext.Node) : 'sha1';
48
44
  let result = nativePbkdf2.pbkdf2Sync(sanitizedPassword, sanitizedSalt, iterations, keylen, algo);
49
45
  return Buffer.from(result);
50
46
  }
47
+
48
+ // We need this because the typescript overload signatures in pbkdf2() above do
49
+ // not play nice with promisify() below.
50
+ const pbkdf2WithDigest = (password, salt, iterations, keylen, digest, callback) => pbkdf2(password, salt, iterations, keylen, digest, callback);
51
+ const pbkdf2Promise = promisify(pbkdf2WithDigest);
52
+ export async function pbkdf2DeriveBits(algorithm, baseKey, length) {
53
+ const {
54
+ iterations,
55
+ hash,
56
+ salt
57
+ } = algorithm;
58
+ const normalizedHash = normalizeHashName(hash);
59
+ if (!normalizedHash) {
60
+ throw lazyDOMException('hash cannot be blank', 'OperationError');
61
+ }
62
+ if (!iterations || iterations === 0) {
63
+ throw lazyDOMException('iterations cannot be zero', 'OperationError');
64
+ }
65
+ if (!salt) {
66
+ throw lazyDOMException(WRONG_SALT, 'OperationError');
67
+ }
68
+ const raw = baseKey.keyObject.export();
69
+ if (length === 0) throw lazyDOMException('length cannot be zero', 'OperationError');
70
+ if (length === null) throw lazyDOMException('length cannot be null', 'OperationError');
71
+ if (length % 8) {
72
+ throw lazyDOMException('length must be a multiple of 8', 'OperationError');
73
+ }
74
+ const sanitizedPassword = sanitizeInput(raw, WRONG_PASS);
75
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
76
+ let result = await pbkdf2Promise(sanitizedPassword, sanitizedSalt, iterations, length / 8, normalizedHash);
77
+ if (!result) {
78
+ throw lazyDOMException('received bad result from pbkdf2()', 'OperationError');
79
+ }
80
+ return bufferLikeToArrayBuffer(result);
81
+ }
51
82
  //# sourceMappingURL=pbkdf2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["pbkdf2.ts"],"names":["NativeQuickCrypto","Buffer","binaryLikeToArrayBuffer","WRONG_PASS","WRON_SALT","sanitizeInput","input","errorMsg","e","nativePbkdf2","pbkdf2","password","salt","iterations","keylen","arg0","arg1","digest","callback","undefined","Error","sanitizedPassword","sanitizedSalt","then","res","from","pbkdf2Sync","algo","result"],"mappings":"AAAA,SAASA,iBAAT,QAAkC,uCAAlC;AACA,SAASC,MAAT,QAAuB,gCAAvB;AACA,SAAqBC,uBAArB,QAAoD,SAApD;AAEA,MAAMC,UAAU,GACd,kEADF;AAEA,MAAMC,SAAS,GAAI,8DAAnB;;AAMA,SAASC,aAAT,CAAuBC,KAAvB,EAA0CC,QAA1C,EAAyE;AACvE,MAAI;AACF,WAAOL,uBAAuB,CAACI,KAAD,CAA9B;AACD,GAFD,CAEE,OAAOE,CAAP,EAAe;AACf,UAAMD,QAAN;AACD;AACF;;AAED,MAAME,YAAY,GAAGT,iBAAiB,CAACU,MAAvC;AAiBA,OAAO,SAASA,MAAT,CACLC,QADK,EAELC,IAFK,EAGLC,UAHK,EAILC,MAJK,EAKLC,IALK,EAMLC,IANK,EAOC;AACN,MAAIC,MAAM,GAAG,MAAb;AACA,MAAIC,QAAJ;;AACA,MAAI,OAAOH,IAAP,KAAgB,QAApB,EAA8B;AAC5BE,IAAAA,MAAM,GAAGF,IAAT;;AACA,QAAI,OAAOC,IAAP,KAAgB,UAApB,EAAgC;AAC9BE,MAAAA,QAAQ,GAAGF,IAAX;AACD;AACF,GALD,MAKO;AACL,QAAI,OAAOD,IAAP,KAAgB,UAApB,EAAgC;AAC9BG,MAAAA,QAAQ,GAAGH,IAAX;AACD;AACF;;AACD,MAAIG,QAAQ,KAAKC,SAAjB,EAA4B;AAC1B,UAAM,IAAIC,KAAJ,CAAU,gCAAV,CAAN;AACD;;AAED,QAAMC,iBAAiB,GAAGhB,aAAa,CAACM,QAAD,EAAWR,UAAX,CAAvC;AACA,QAAMmB,aAAa,GAAGjB,aAAa,CAACO,IAAD,EAAOR,SAAP,CAAnC;AAEAK,EAAAA,YAAY,CACTC,MADH,CACUW,iBADV,EAC6BC,aAD7B,EAC4CT,UAD5C,EACwDC,MADxD,EACgEG,MADhE,EAEGM,IAFH,CAGKC,GAAD,IAAsB;AACpBN,IAAAA,QAAQ,CAAE,IAAF,EAAQjB,MAAM,CAACwB,IAAP,CAAYD,GAAZ,CAAR,CAAR;AACD,GALL,EAMKhB,CAAD,IAAc;AACZU,IAAAA,QAAQ,CAAEV,CAAF,CAAR;AACD,GARL;AAUD;AACD,OAAO,SAASkB,UAAT,CACLf,QADK,EAELC,IAFK,EAGLC,UAHK,EAILC,MAJK,EAKLG,MALK,EAMG;AACR,QAAMI,iBAAiB,GAAGhB,aAAa,CAACM,QAAD,EAAWR,UAAX,CAAvC;AACA,QAAMmB,aAAa,GAAGjB,aAAa,CAACO,IAAD,EAAOR,SAAP,CAAnC;AAEA,QAAMuB,IAAI,GAAGV,MAAM,GAAGA,MAAH,GAAY,MAA/B;AACA,MAAIW,MAAmB,GAAGnB,YAAY,CAACiB,UAAb,CACxBL,iBADwB,EAExBC,aAFwB,EAGxBT,UAHwB,EAIxBC,MAJwB,EAKxBa,IALwB,CAA1B;AAQA,SAAO1B,MAAM,CAACwB,IAAP,CAAYG,MAAZ,CAAP;AACD","sourcesContent":["import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';\nimport { Buffer } from '@craftzdog/react-native-buffer';\nimport { BinaryLike, binaryLikeToArrayBuffer } from './Utils';\n\nconst WRONG_PASS =\n 'Password must be a string, a Buffer, a typed array or a DataView';\nconst WRON_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;\n\ntype Password = BinaryLike;\ntype Salt = BinaryLike;\ntype Pbkdf2Callback = (err: Error | null, derivedKey?: Buffer) => void;\n\nfunction sanitizeInput(input: BinaryLike, errorMsg: string): ArrayBuffer {\n try {\n return binaryLikeToArrayBuffer(input);\n } catch (e: any) {\n throw errorMsg;\n }\n}\n\nconst nativePbkdf2 = NativeQuickCrypto.pbkdf2;\n\nexport function pbkdf2(\n password: Password,\n salt: Salt,\n iterations: number,\n keylen: number,\n digest: string,\n callback: Pbkdf2Callback\n): void;\nexport function pbkdf2(\n password: Password,\n salt: Salt,\n iterations: number,\n keylen: number,\n callback: Pbkdf2Callback\n): void;\nexport function pbkdf2(\n password: Password,\n salt: Salt,\n iterations: number,\n keylen: number,\n arg0?: unknown,\n arg1?: unknown\n): void {\n let digest = 'sha1';\n let callback: undefined | Pbkdf2Callback;\n if (typeof arg0 === 'string') {\n digest = arg0;\n if (typeof arg1 === 'function') {\n callback = arg1 as Pbkdf2Callback;\n }\n } else {\n if (typeof arg0 === 'function') {\n callback = arg0 as Pbkdf2Callback;\n }\n }\n if (callback === undefined) {\n throw new Error('No callback provided to pbkdf2');\n }\n\n const sanitizedPassword = sanitizeInput(password, WRONG_PASS);\n const sanitizedSalt = sanitizeInput(salt, WRON_SALT);\n\n nativePbkdf2\n .pbkdf2(sanitizedPassword, sanitizedSalt, iterations, keylen, digest)\n .then(\n (res: ArrayBuffer) => {\n callback!(null, Buffer.from(res));\n },\n (e: Error) => {\n callback!(e);\n }\n );\n}\nexport function pbkdf2Sync(\n password: Password,\n salt: Salt,\n iterations: number,\n keylen: number,\n digest?: string\n): Buffer {\n const sanitizedPassword = sanitizeInput(password, WRONG_PASS);\n const sanitizedSalt = sanitizeInput(salt, WRON_SALT);\n\n const algo = digest ? digest : 'sha1';\n let result: ArrayBuffer = nativePbkdf2.pbkdf2Sync(\n sanitizedPassword,\n sanitizedSalt,\n iterations,\n keylen,\n algo\n );\n\n return Buffer.from(result);\n}\n"]}
1
+ {"version":3,"names":["NativeQuickCrypto","Buffer","binaryLikeToArrayBuffer","lazyDOMException","bufferLikeToArrayBuffer","normalizeHashName","HashContext","promisify","WRONG_PASS","WRONG_SALT","sanitizeInput","input","errorMsg","e","nativePbkdf2","pbkdf2","password","salt","iterations","keylen","arg0","arg1","digest","callback","undefined","Error","sanitizedPassword","sanitizedSalt","normalizedDigest","Node","then","res","from","pbkdf2Sync","algo","result","pbkdf2WithDigest","pbkdf2Promise","pbkdf2DeriveBits","algorithm","baseKey","length","hash","normalizedHash","raw","keyObject","export"],"sourceRoot":"../../src","sources":["pbkdf2.ts"],"mappings":"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","ignoreList":[]}