react-native-quick-crypto 0.6.0 → 0.7.0-rc.0

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 (196) 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/wrapper/gradle-wrapper.properties +1 -1
  5. package/android/gradle.properties +5 -5
  6. package/android/src/main/{AndroidManifest.xml → AndroidManifestNew.xml} +1 -2
  7. package/cpp/Cipher/MGLCipherHostObject.cpp +31 -5
  8. package/cpp/Cipher/MGLGenerateKeyPairInstaller.cpp +21 -31
  9. package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp +4 -17
  10. package/cpp/Cipher/MGLPublicCipher.h +1 -1
  11. package/cpp/Cipher/MGLPublicCipherInstaller.h +6 -6
  12. package/cpp/Cipher/MGLRsa.cpp +224 -11
  13. package/cpp/Cipher/MGLRsa.h +13 -3
  14. package/cpp/Hash/MGLHashHostObject.cpp +1 -1
  15. package/cpp/Hash/MGLHashInstaller.cpp +2 -4
  16. package/cpp/JSIUtils/MGLJSIMacros.h +10 -0
  17. package/cpp/JSIUtils/MGLThreadAwareHostObject.h +1 -1
  18. package/cpp/MGLKeys.cpp +415 -471
  19. package/cpp/MGLKeys.h +70 -2
  20. package/cpp/MGLQuickCryptoHostObject.cpp +9 -0
  21. package/cpp/Random/MGLRandomHostObject.cpp +9 -2
  22. package/cpp/Sig/MGLSignHostObjects.cpp +1 -1
  23. package/cpp/Utils/MGLUtils.cpp +104 -32
  24. package/cpp/Utils/MGLUtils.h +172 -143
  25. package/cpp/Utils/node.h +13 -0
  26. package/cpp/webcrypto/MGLWebCrypto.cpp +63 -0
  27. package/cpp/webcrypto/MGLWebCrypto.h +34 -0
  28. package/cpp/webcrypto/crypto_ec.cpp +334 -0
  29. package/cpp/webcrypto/crypto_ec.h +65 -0
  30. package/ios/QuickCrypto.xcodeproj/project.pbxproj +4 -4
  31. package/lib/commonjs/@types/crypto-browserify.d.js.map +1 -1
  32. package/lib/commonjs/Cipher.js +53 -194
  33. package/lib/commonjs/Cipher.js.map +1 -1
  34. package/lib/commonjs/Hash.js +29 -29
  35. package/lib/commonjs/Hash.js.map +1 -1
  36. package/lib/commonjs/Hashnames.js +75 -0
  37. package/lib/commonjs/Hashnames.js.map +1 -0
  38. package/lib/commonjs/Hmac.js +6 -29
  39. package/lib/commonjs/Hmac.js.map +1 -1
  40. package/lib/commonjs/NativeQuickCrypto/Cipher.js +3 -5
  41. package/lib/commonjs/NativeQuickCrypto/Cipher.js.map +1 -1
  42. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js +11 -20
  43. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
  44. package/lib/commonjs/NativeQuickCrypto/hash.js.map +1 -1
  45. package/lib/commonjs/NativeQuickCrypto/hmac.js.map +1 -1
  46. package/lib/commonjs/NativeQuickCrypto/pbkdf2.js.map +1 -1
  47. package/lib/commonjs/NativeQuickCrypto/random.js.map +1 -1
  48. package/lib/commonjs/NativeQuickCrypto/sig.js.map +1 -1
  49. package/lib/commonjs/NativeQuickCrypto/webcrypto.js +6 -0
  50. package/lib/commonjs/NativeQuickCrypto/webcrypto.js.map +1 -0
  51. package/lib/commonjs/QuickCrypto.js +5 -14
  52. package/lib/commonjs/QuickCrypto.js.map +1 -1
  53. package/lib/commonjs/Utils.js +360 -48
  54. package/lib/commonjs/Utils.js.map +1 -1
  55. package/lib/commonjs/aes.js +324 -0
  56. package/lib/commonjs/aes.js.map +1 -0
  57. package/lib/commonjs/constants.js +1 -2
  58. package/lib/commonjs/constants.js.map +1 -1
  59. package/lib/commonjs/ec.js +288 -0
  60. package/lib/commonjs/ec.js.map +1 -0
  61. package/lib/commonjs/index.js +6 -10
  62. package/lib/commonjs/index.js.map +1 -1
  63. package/lib/commonjs/keys.js +280 -48
  64. package/lib/commonjs/keys.js.map +1 -1
  65. package/lib/commonjs/pbkdf2.js +44 -18
  66. package/lib/commonjs/pbkdf2.js.map +1 -1
  67. package/lib/commonjs/random.js +49 -68
  68. package/lib/commonjs/random.js.map +1 -1
  69. package/lib/commonjs/rsa.js +329 -0
  70. package/lib/commonjs/rsa.js.map +1 -0
  71. package/lib/commonjs/sig.js +13 -54
  72. package/lib/commonjs/sig.js.map +1 -1
  73. package/lib/commonjs/subtle.js +271 -0
  74. package/lib/commonjs/subtle.js.map +1 -0
  75. package/lib/module/@types/crypto-browserify.d.js.map +1 -1
  76. package/lib/module/Cipher.js +53 -188
  77. package/lib/module/Cipher.js.map +1 -1
  78. package/lib/module/Hash.js +27 -21
  79. package/lib/module/Hash.js.map +1 -1
  80. package/lib/module/Hashnames.js +71 -0
  81. package/lib/module/Hashnames.js.map +1 -0
  82. package/lib/module/Hmac.js +4 -21
  83. package/lib/module/Hmac.js.map +1 -1
  84. package/lib/module/NativeQuickCrypto/Cipher.js +3 -4
  85. package/lib/module/NativeQuickCrypto/Cipher.js.map +1 -1
  86. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js +11 -17
  87. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
  88. package/lib/module/NativeQuickCrypto/hash.js.map +1 -1
  89. package/lib/module/NativeQuickCrypto/hmac.js.map +1 -1
  90. package/lib/module/NativeQuickCrypto/pbkdf2.js.map +1 -1
  91. package/lib/module/NativeQuickCrypto/random.js.map +1 -1
  92. package/lib/module/NativeQuickCrypto/sig.js.map +1 -1
  93. package/lib/module/NativeQuickCrypto/webcrypto.js +2 -0
  94. package/lib/module/NativeQuickCrypto/webcrypto.js.map +1 -0
  95. package/lib/module/QuickCrypto.js +2 -0
  96. package/lib/module/QuickCrypto.js.map +1 -1
  97. package/lib/module/Utils.js +319 -33
  98. package/lib/module/Utils.js.map +1 -1
  99. package/lib/module/aes.js +317 -0
  100. package/lib/module/aes.js.map +1 -0
  101. package/lib/module/constants.js.map +1 -1
  102. package/lib/module/ec.js +282 -0
  103. package/lib/module/ec.js.map +1 -0
  104. package/lib/module/index.js +7 -4
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/keys.js +279 -43
  107. package/lib/module/keys.js.map +1 -1
  108. package/lib/module/pbkdf2.js +44 -13
  109. package/lib/module/pbkdf2.js.map +1 -1
  110. package/lib/module/random.js +46 -54
  111. package/lib/module/random.js.map +1 -1
  112. package/lib/module/rsa.js +323 -0
  113. package/lib/module/rsa.js.map +1 -0
  114. package/lib/module/sig.js +13 -46
  115. package/lib/module/sig.js.map +1 -1
  116. package/lib/module/subtle.js +265 -0
  117. package/lib/module/subtle.js.map +1 -0
  118. package/lib/typescript/src/Cipher.d.ts +72 -0
  119. package/lib/typescript/src/Cipher.d.ts.map +1 -0
  120. package/lib/typescript/{Hash.d.ts → src/Hash.d.ts} +8 -7
  121. package/lib/typescript/src/Hash.d.ts.map +1 -0
  122. package/lib/typescript/src/Hashnames.d.ts +11 -0
  123. package/lib/typescript/src/Hashnames.d.ts.map +1 -0
  124. package/lib/typescript/{Hmac.d.ts → src/Hmac.d.ts} +3 -3
  125. package/lib/typescript/src/Hmac.d.ts.map +1 -0
  126. package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts +34 -0
  127. package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts.map +1 -0
  128. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/NativeQuickCrypto.d.ts +3 -0
  129. package/lib/typescript/src/NativeQuickCrypto/NativeQuickCrypto.d.ts.map +1 -0
  130. package/lib/typescript/src/NativeQuickCrypto/hash.d.ts +7 -0
  131. package/lib/typescript/src/NativeQuickCrypto/hash.d.ts.map +1 -0
  132. package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts +6 -0
  133. package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts.map +1 -0
  134. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/pbkdf2.d.ts +2 -1
  135. package/lib/typescript/src/NativeQuickCrypto/pbkdf2.d.ts.map +1 -0
  136. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/random.d.ts +2 -1
  137. package/lib/typescript/src/NativeQuickCrypto/random.d.ts.map +1 -0
  138. package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/sig.d.ts +5 -4
  139. package/lib/typescript/src/NativeQuickCrypto/sig.d.ts.map +1 -0
  140. package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts +27 -0
  141. package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts.map +1 -0
  142. package/lib/typescript/{QuickCrypto.d.ts → src/QuickCrypto.d.ts} +16 -8
  143. package/lib/typescript/src/QuickCrypto.d.ts.map +1 -0
  144. package/lib/typescript/src/Utils.d.ts +44 -0
  145. package/lib/typescript/src/Utils.d.ts.map +1 -0
  146. package/lib/typescript/src/aes.d.ts +5 -0
  147. package/lib/typescript/src/aes.d.ts.map +1 -0
  148. package/lib/typescript/{constants.d.ts → src/constants.d.ts} +1 -0
  149. package/lib/typescript/src/constants.d.ts.map +1 -0
  150. package/lib/typescript/src/ec.d.ts +5 -0
  151. package/lib/typescript/src/ec.d.ts.map +1 -0
  152. package/lib/typescript/{index.d.ts → src/index.d.ts} +33 -27
  153. package/lib/typescript/src/index.d.ts.map +1 -0
  154. package/lib/typescript/src/keys.d.ts +154 -0
  155. package/lib/typescript/src/keys.d.ts.map +1 -0
  156. package/lib/typescript/src/pbkdf2.d.ts +12 -0
  157. package/lib/typescript/src/pbkdf2.d.ts.map +1 -0
  158. package/lib/typescript/{random.d.ts → src/random.d.ts} +7 -6
  159. package/lib/typescript/src/random.d.ts.map +1 -0
  160. package/lib/typescript/src/rsa.d.ts +4 -0
  161. package/lib/typescript/src/rsa.d.ts.map +1 -0
  162. package/lib/typescript/{sig.d.ts → src/sig.d.ts} +3 -3
  163. package/lib/typescript/src/sig.d.ts.map +1 -0
  164. package/lib/typescript/src/subtle.d.ts +11 -0
  165. package/lib/typescript/src/subtle.d.ts.map +1 -0
  166. package/package.json +35 -30
  167. package/react-native-quick-crypto.podspec +5 -4
  168. package/src/Cipher.ts +103 -100
  169. package/src/Hash.ts +42 -6
  170. package/src/Hashnames.ts +91 -0
  171. package/src/Hmac.ts +3 -3
  172. package/src/NativeQuickCrypto/Cipher.ts +1 -0
  173. package/src/NativeQuickCrypto/NativeQuickCrypto.ts +2 -0
  174. package/src/NativeQuickCrypto/webcrypto.ts +46 -0
  175. package/src/QuickCrypto.ts +2 -0
  176. package/src/Utils.ts +409 -5
  177. package/src/aes.ts +365 -0
  178. package/src/ec.ts +351 -0
  179. package/src/keys.ts +428 -54
  180. package/src/pbkdf2.ts +84 -11
  181. package/src/random.ts +37 -24
  182. package/src/rsa.ts +396 -0
  183. package/src/sig.ts +3 -2
  184. package/src/subtle.ts +358 -0
  185. package/lib/commonjs/@types/stream-browserify.d.js +0 -2
  186. package/lib/commonjs/@types/stream-browserify.d.js.map +0 -1
  187. package/lib/module/@types/stream-browserify.d.js +0 -2
  188. package/lib/module/@types/stream-browserify.d.js.map +0 -1
  189. package/lib/typescript/Cipher.d.ts +0 -87
  190. package/lib/typescript/NativeQuickCrypto/Cipher.d.ts +0 -32
  191. package/lib/typescript/NativeQuickCrypto/hash.d.ts +0 -6
  192. package/lib/typescript/NativeQuickCrypto/hmac.d.ts +0 -5
  193. package/lib/typescript/Utils.d.ts +0 -23
  194. package/lib/typescript/keys.d.ts +0 -60
  195. package/lib/typescript/pbkdf2.d.ts +0 -9
  196. package/src/@types/stream-browserify.d.ts +0 -4
@@ -3,57 +3,75 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.WebCryptoKeyExportStatus = exports.SecretKeyObject = exports.PublicKeyObject = exports.PrivateKeyObject = exports.KeyType = exports.KeyEncoding = exports.KWebCryptoKeyFormat = exports.KFormatType = exports.CryptoKey = void 0;
7
+ exports.createSecretKey = createSecretKey;
8
+ exports.kNamedCurveAliases = void 0;
6
9
  exports.parsePrivateKeyEncoding = parsePrivateKeyEncoding;
7
10
  exports.parsePublicKeyEncoding = parsePublicKeyEncoding;
8
11
  exports.preparePrivateKey = preparePrivateKey;
9
12
  exports.preparePublicOrPrivateKey = preparePublicOrPrivateKey;
10
-
11
13
  var _Utils = require("./Utils");
12
-
14
+ var _NativeQuickCrypto = require("./NativeQuickCrypto/NativeQuickCrypto");
15
+ const kNamedCurveAliases = exports.kNamedCurveAliases = {
16
+ 'P-256': 'prime256v1',
17
+ 'P-384': 'secp384r1',
18
+ 'P-521': 'secp521r1'
19
+ };
13
20
  // On node this value is defined on the native side, for now I'm just creating it here in JS
14
21
  // TODO(osp) move this into native side to make sure they always match
15
- var KFormatType;
16
-
17
- (function (KFormatType) {
22
+ let KFormatType = exports.KFormatType = /*#__PURE__*/function (KFormatType) {
18
23
  KFormatType[KFormatType["kKeyFormatDER"] = 0] = "kKeyFormatDER";
19
24
  KFormatType[KFormatType["kKeyFormatPEM"] = 1] = "kKeyFormatPEM";
20
25
  KFormatType[KFormatType["kKeyFormatJWK"] = 2] = "kKeyFormatJWK";
21
- })(KFormatType || (KFormatType = {}));
22
-
23
- var KeyInputContext;
24
-
25
- (function (KeyInputContext) {
26
+ return KFormatType;
27
+ }({}); // Same as KFormatType, this enum needs to be defined on the native side
28
+ let KeyType = exports.KeyType = /*#__PURE__*/function (KeyType) {
29
+ KeyType[KeyType["Secret"] = 0] = "Secret";
30
+ KeyType[KeyType["Public"] = 1] = "Public";
31
+ KeyType[KeyType["Private"] = 2] = "Private";
32
+ return KeyType;
33
+ }({}); // Same as KFormatType, this enum needs to be defined on the native side
34
+ let KWebCryptoKeyFormat = exports.KWebCryptoKeyFormat = /*#__PURE__*/function (KWebCryptoKeyFormat) {
35
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatRaw"] = 0] = "kWebCryptoKeyFormatRaw";
36
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatPKCS8"] = 1] = "kWebCryptoKeyFormatPKCS8";
37
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatSPKI"] = 2] = "kWebCryptoKeyFormatSPKI";
38
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatJWK"] = 3] = "kWebCryptoKeyFormatJWK";
39
+ return KWebCryptoKeyFormat;
40
+ }({});
41
+ let WebCryptoKeyExportStatus = exports.WebCryptoKeyExportStatus = /*#__PURE__*/function (WebCryptoKeyExportStatus) {
42
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["OK"] = 0] = "OK";
43
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["INVALID_KEY_TYPE"] = 1] = "INVALID_KEY_TYPE";
44
+ WebCryptoKeyExportStatus[WebCryptoKeyExportStatus["FAILED"] = 2] = "FAILED";
45
+ return WebCryptoKeyExportStatus;
46
+ }({});
47
+ var KeyInputContext = /*#__PURE__*/function (KeyInputContext) {
26
48
  KeyInputContext[KeyInputContext["kConsumePublic"] = 0] = "kConsumePublic";
27
49
  KeyInputContext[KeyInputContext["kConsumePrivate"] = 1] = "kConsumePrivate";
28
50
  KeyInputContext[KeyInputContext["kCreatePublic"] = 2] = "kCreatePublic";
29
51
  KeyInputContext[KeyInputContext["kCreatePrivate"] = 3] = "kCreatePrivate";
30
- })(KeyInputContext || (KeyInputContext = {}));
31
-
32
- var KeyEncoding;
33
-
34
- (function (KeyEncoding) {
52
+ return KeyInputContext;
53
+ }(KeyInputContext || {});
54
+ let KeyEncoding = exports.KeyEncoding = /*#__PURE__*/function (KeyEncoding) {
35
55
  KeyEncoding[KeyEncoding["kKeyEncodingPKCS1"] = 0] = "kKeyEncodingPKCS1";
36
56
  KeyEncoding[KeyEncoding["kKeyEncodingPKCS8"] = 1] = "kKeyEncodingPKCS8";
37
57
  KeyEncoding[KeyEncoding["kKeyEncodingSPKI"] = 2] = "kKeyEncodingSPKI";
38
58
  KeyEncoding[KeyEncoding["kKeyEncodingSEC1"] = 3] = "kKeyEncodingSEC1";
39
- })(KeyEncoding || (KeyEncoding = {}));
40
-
59
+ return KeyEncoding;
60
+ }({});
41
61
  const encodingNames = {
42
62
  [KeyEncoding.kKeyEncodingPKCS1]: 'pkcs1',
43
63
  [KeyEncoding.kKeyEncodingPKCS8]: 'pkcs8',
44
64
  [KeyEncoding.kKeyEncodingSPKI]: 'spki',
45
65
  [KeyEncoding.kKeyEncodingSEC1]: 'sec1'
46
66
  };
47
-
48
67
  function option(name, objName) {
49
68
  return objName === undefined ? `options.${name}` : `options.${objName}.${name}`;
50
69
  }
51
-
52
70
  function parseKeyFormat(formatStr, defaultFormat, optionName) {
53
71
  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;
54
- throw new Error(`Invalid key format str: ${optionName}`); // throw new ERR_INVALID_ARG_VALUE(optionName, formatStr);
72
+ throw new Error(`Invalid key format str: ${optionName}`);
73
+ // throw new ERR_INVALID_ARG_VALUE(optionName, formatStr);
55
74
  }
56
-
57
75
  function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
58
76
  if (typeStr === undefined && !required) {
59
77
  return undefined;
@@ -61,7 +79,6 @@ function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
61
79
  if (keyType !== undefined && keyType !== 'rsa') {
62
80
  throw new Error(`Crypto incompatible key options: ${typeStr} can only be used for RSA keys`);
63
81
  }
64
-
65
82
  return KeyEncoding.kKeyEncodingPKCS1;
66
83
  } else if (typeStr === 'spki' && isPublic !== false) {
67
84
  return KeyEncoding.kKeyEncodingSPKI;
@@ -71,13 +88,10 @@ function parseKeyType(typeStr, required, keyType, isPublic, optionName) {
71
88
  if (keyType !== undefined && keyType !== 'ec') {
72
89
  throw new Error(`Incompatible key options ${typeStr} can only be used for EC keys`);
73
90
  }
74
-
75
91
  return KeyEncoding.kKeyEncodingSEC1;
76
92
  }
77
-
78
93
  throw new Error(`Invalid option ${optionName} - ${typeStr}`);
79
94
  }
80
-
81
95
  function parseKeyFormatAndType(enc, keyType, isPublic, objName) {
82
96
  const {
83
97
  format: formatStr,
@@ -92,27 +106,24 @@ function parseKeyFormatAndType(enc, keyType, isPublic, objName) {
92
106
  type
93
107
  };
94
108
  }
95
-
96
109
  function parseKeyEncoding(enc, keyType, isPublic, objName) {
97
110
  // validateObject(enc, 'options');
111
+
98
112
  const isInput = keyType === undefined;
99
113
  const {
100
114
  format,
101
115
  type
102
116
  } = parseKeyFormatAndType(enc, keyType, isPublic, objName);
103
117
  let cipher, passphrase, encoding;
104
-
105
118
  if (isPublic !== true) {
106
119
  ({
107
120
  cipher,
108
121
  passphrase,
109
122
  encoding
110
123
  } = enc);
111
-
112
124
  if (!isInput) {
113
125
  if (cipher != null) {
114
126
  if (typeof cipher !== 'string') throw new Error(`Invalid argument ${option('cipher', objName)}: ${cipher}`);
115
-
116
127
  if (format === KFormatType.kKeyFormatDER && (type === KeyEncoding.kKeyEncodingPKCS1 || type === KeyEncoding.kKeyEncodingSEC1)) {
117
128
  throw new Error(`Incompatible key options ${encodingNames[type]} does not support encryption`);
118
129
  }
@@ -120,12 +131,10 @@ function parseKeyEncoding(enc, keyType, isPublic, objName) {
120
131
  throw new Error(`invalid argument ${option('cipher', objName)}: ${cipher}`);
121
132
  }
122
133
  }
123
-
124
134
  if (isInput && passphrase !== undefined && !(0, _Utils.isStringOrBuffer)(passphrase) || !isInput && cipher != null && !(0, _Utils.isStringOrBuffer)(passphrase)) {
125
135
  throw new Error(`Invalid argument value ${option('passphrase', objName)}: ${passphrase}`);
126
136
  }
127
137
  }
128
-
129
138
  if (passphrase !== undefined) passphrase = (0, _Utils.binaryLikeToArrayBuffer)(passphrase, encoding);
130
139
  return {
131
140
  format,
@@ -134,7 +143,6 @@ function parseKeyEncoding(enc, keyType, isPublic, objName) {
134
143
  passphrase
135
144
  };
136
145
  }
137
-
138
146
  function prepareAsymmetricKey(key, ctx) {
139
147
  // TODO(osp) check, KeyObject some node object
140
148
  // if (isKeyObject(key)) {
@@ -153,9 +161,10 @@ function prepareAsymmetricKey(key, ctx) {
153
161
  } else if (typeof key === 'object') {
154
162
  const {
155
163
  key: data,
156
- encoding // format
157
-
158
- } = key; // // The 'key' property can be a KeyObject as well to allow specifying
164
+ encoding
165
+ // format
166
+ } = key;
167
+ // // The 'key' property can be a KeyObject as well to allow specifying
159
168
  // // additional options such as padding along with the key.
160
169
  // if (isKeyObject(data)) return { data: getKeyObjectHandle(data, ctx) };
161
170
  // else if (isCryptoKey(data))
@@ -163,42 +172,265 @@ function prepareAsymmetricKey(key, ctx) {
163
172
  // else if (isJwk(data) && format === 'jwk')
164
173
  // return { data: getKeyObjectHandleFromJwk(data, ctx), format: 'jwk' };
165
174
  // Either PEM or DER using PKCS#1 or SPKI.
166
-
167
175
  if (!(0, _Utils.isStringOrBuffer)(data)) {
168
176
  throw new Error('prepareAsymmetricKey: key is not a string or ArrayBuffer');
169
177
  }
170
-
171
178
  const isPublic = ctx === KeyInputContext.kConsumePrivate || ctx === KeyInputContext.kCreatePrivate ? false : undefined;
172
179
  return {
173
180
  data: (0, _Utils.binaryLikeToArrayBuffer)(data, encoding),
174
181
  ...parseKeyEncoding(key, undefined, isPublic)
175
182
  };
176
183
  }
177
-
178
184
  throw new Error('[prepareAsymetricKey] Invalid argument key: ${key}');
179
- } // TODO(osp) any here is a node KeyObject
180
-
185
+ }
181
186
 
187
+ // TODO(osp) any here is a node KeyObject
182
188
  function preparePrivateKey(key) {
183
189
  return prepareAsymmetricKey(key, KeyInputContext.kConsumePrivate);
184
- } // TODO(osp) any here is a node KeyObject
185
-
190
+ }
186
191
 
192
+ // TODO(osp) any here is a node KeyObject
187
193
  function preparePublicOrPrivateKey(key) {
188
194
  return prepareAsymmetricKey(key, KeyInputContext.kConsumePublic);
189
- } // Parses the public key encoding based on an object. keyType must be undefined
195
+ }
196
+
197
+ // Parses the public key encoding based on an object. keyType must be undefined
190
198
  // when this is used to parse an input encoding and must be a valid key type if
191
199
  // used to parse an output encoding.
192
-
193
-
194
200
  function parsePublicKeyEncoding(enc, keyType, objName) {
195
201
  return parseKeyEncoding(enc, keyType, keyType ? true : undefined, objName);
196
- } // Parses the private key encoding based on an object. keyType must be undefined
202
+ }
203
+
204
+ // Parses the private key encoding based on an object. keyType must be undefined
197
205
  // when this is used to parse an input encoding and must be a valid key type if
198
206
  // used to parse an output encoding.
199
-
200
-
201
207
  function parsePrivateKeyEncoding(enc, keyType, objName) {
202
208
  return parseKeyEncoding(enc, keyType, false, objName);
203
209
  }
210
+ function prepareSecretKey(key,
211
+ //KeyObject | CryptoKey | string,
212
+ encoding, bufferOnly = false) {
213
+ if (!bufferOnly) {
214
+ // TODO: maybe use `key.constructor.name === 'KeyObject'` ?
215
+ if (key instanceof KeyObject) {
216
+ if (key.type !== 'secret') throw new Error(`invalid KeyObject type: ${key.type}, expected 'secret'`);
217
+ return key.handle;
218
+ }
219
+ // TODO: maybe use `key.constructor.name === 'CryptoKey'` ?
220
+ else if (key instanceof CryptoKey) {
221
+ if (key.type !== 'secret') throw new Error(`invalid CryptoKey type: ${key.type}, expected 'secret'`);
222
+ return key.keyObject.handle;
223
+ }
224
+ }
225
+ if (key instanceof ArrayBuffer) {
226
+ return key;
227
+ }
228
+ if (typeof key === 'string') {
229
+ return (0, _Utils.binaryLikeToArrayBuffer)(key, encoding);
230
+ }
231
+ throw new Error('invalid argument type "key"');
232
+ }
233
+ function createSecretKey(key, encoding) {
234
+ const k = prepareSecretKey(key, encoding, true);
235
+ const handle = _NativeQuickCrypto.NativeQuickCrypto.webcrypto.createKeyObjectHandle();
236
+ handle.init(KeyType.Secret, k);
237
+ return new SecretKeyObject(handle);
238
+ }
239
+ class CryptoKey {
240
+ constructor(keyObject, keyAlgorithm, keyUsages, keyExtractable) {
241
+ this.keyObject = keyObject;
242
+ this.keyAlgorithm = keyAlgorithm;
243
+ this.keyUsages = keyUsages;
244
+ this.keyExtractable = keyExtractable;
245
+ }
246
+ inspect(_depth, _options) {
247
+ throw new Error('CryptoKey.inspect is not implemented');
248
+ // if (depth < 0) return this;
249
+
250
+ // const opts = {
251
+ // ...options,
252
+ // depth: options.depth == null ? null : options.depth - 1,
253
+ // };
254
+
255
+ // return `CryptoKey ${inspect(
256
+ // {
257
+ // type: this.type,
258
+ // extractable: this.extractable,
259
+ // algorithm: this.algorithm,
260
+ // usages: this.usages,
261
+ // },
262
+ // opts
263
+ // )}`;
264
+ }
265
+ get type() {
266
+ // if (!(this instanceof CryptoKey)) throw new Error('Invalid CryptoKey');
267
+ return this.keyObject.type;
268
+ }
269
+ get extractable() {
270
+ return this.keyExtractable;
271
+ }
272
+ get algorithm() {
273
+ return this.keyAlgorithm;
274
+ }
275
+ get usages() {
276
+ return this.keyUsages;
277
+ }
278
+ }
279
+
280
+ // ObjectDefineProperties(CryptoKey.prototype, {
281
+ // type: kEnumerableProperty,
282
+ // extractable: kEnumerableProperty,
283
+ // algorithm: kEnumerableProperty,
284
+ // usages: kEnumerableProperty,
285
+ // [SymbolToStringTag]: {
286
+ // __proto__: null,
287
+ // configurable: true,
288
+ // value: 'CryptoKey',
289
+ // },
290
+ // });
291
+ exports.CryptoKey = CryptoKey;
292
+ class KeyObject {
293
+ type = 'unknown';
294
+ export(_options) {
295
+ return new ArrayBuffer(0);
296
+ }
297
+ constructor(type, handle) {
298
+ if (type !== 'secret' && type !== 'public' && type !== 'private') throw new Error(`invalid KeyObject type: ${type}`);
299
+ this.handle = handle;
300
+ this.type = type;
301
+ }
302
+
303
+ // get type(): string {
304
+ // return this.type;
305
+ // }
306
+
307
+ // static from(key) {
308
+ // if (!isCryptoKey(key))
309
+ // throw new ERR_INVALID_ARG_TYPE('key', 'CryptoKey', key);
310
+ // return key[kKeyObject];
311
+ // }
312
+
313
+ // equals(otherKeyObject) {
314
+ // if (!isKeyObject(otherKeyObject)) {
315
+ // throw new ERR_INVALID_ARG_TYPE(
316
+ // 'otherKeyObject',
317
+ // 'KeyObject',
318
+ // otherKeyObject
319
+ // );
320
+ // }
321
+
322
+ // return (
323
+ // otherKeyObject.type === this.type &&
324
+ // this[kHandle].equals(otherKeyObject[kHandle])
325
+ // );
326
+ // }
327
+ }
328
+
329
+ // ObjectDefineProperties(KeyObject.prototype, {
330
+ // [SymbolToStringTag]: {
331
+ // __proto__: null,
332
+ // configurable: true,
333
+ // value: 'KeyObject',
334
+ // },
335
+ // });
336
+
337
+ class SecretKeyObject extends KeyObject {
338
+ constructor(handle) {
339
+ super('secret', handle);
340
+ }
341
+
342
+ // get symmetricKeySize() {
343
+ // return this[kHandle].getSymmetricKeySize();
344
+ // }
345
+
346
+ export(options) {
347
+ if (options !== undefined) {
348
+ if (options.format === 'jwk') {
349
+ throw new Error('SecretKey export for jwk is not implemented');
350
+ // return this.handle.exportJwk({}, false);
351
+ }
352
+ }
353
+ return this.handle.export();
354
+ }
355
+ }
356
+
357
+ // const kAsymmetricKeyType = Symbol('kAsymmetricKeyType');
358
+ // const kAsymmetricKeyDetails = Symbol('kAsymmetricKeyDetails');
359
+
360
+ // function normalizeKeyDetails(details = {}) {
361
+ // if (details.publicExponent !== undefined) {
362
+ // return {
363
+ // ...details,
364
+ // publicExponent: bigIntArrayToUnsignedBigInt(
365
+ // new Uint8Array(details.publicExponent)
366
+ // ),
367
+ // };
368
+ // }
369
+ // return details;
370
+ // }
371
+ exports.SecretKeyObject = SecretKeyObject;
372
+ class AsymmetricKeyObject extends KeyObject {
373
+ constructor(type, handle) {
374
+ super(type, handle);
375
+ }
376
+ get asymmetricKeyType() {
377
+ return this.asymmetricKeyType || this.handle.getAsymmetricKeyType();
378
+ }
379
+
380
+ // get asymmetricKeyDetails() {
381
+ // switch (this.asymmetricKeyType) {
382
+ // case 'rsa':
383
+ // case 'rsa-pss':
384
+ // case 'dsa':
385
+ // case 'ec':
386
+ // return (
387
+ // this[kAsymmetricKeyDetails] ||
388
+ // (this[kAsymmetricKeyDetails] = normalizeKeyDetails(
389
+ // this[kHandle].keyDetail({})
390
+ // ))
391
+ // );
392
+ // default:
393
+ // return {};
394
+ // }
395
+ // }
396
+ }
397
+ class PublicKeyObject extends AsymmetricKeyObject {
398
+ constructor(handle) {
399
+ super('public', handle);
400
+ }
401
+ export(options) {
402
+ if (options?.format === 'jwk') {
403
+ throw new Error('PublicKey export for jwk is not implemented');
404
+ // return this.handle.exportJwk({}, false);
405
+ }
406
+ const {
407
+ format,
408
+ type
409
+ } = parsePublicKeyEncoding(options, this.asymmetricKeyType);
410
+ return this.handle.export(format, type);
411
+ }
412
+ }
413
+ exports.PublicKeyObject = PublicKeyObject;
414
+ class PrivateKeyObject extends AsymmetricKeyObject {
415
+ constructor(handle) {
416
+ super('private', handle);
417
+ }
418
+ export(options) {
419
+ if (options?.format === 'jwk') {
420
+ if (options.passphrase !== undefined) {
421
+ throw new Error('jwk does not support encryption');
422
+ }
423
+ throw new Error('PrivateKey export for jwk is not implemented');
424
+ // return this.handle.exportJwk({}, false);
425
+ }
426
+ const {
427
+ format,
428
+ type,
429
+ cipher,
430
+ passphrase
431
+ } = parsePrivateKeyEncoding(options, this.asymmetricKeyType);
432
+ return this.handle.export(format, type, cipher, passphrase);
433
+ }
434
+ }
435
+ exports.PrivateKeyObject = PrivateKeyObject;
204
436
  //# sourceMappingURL=keys.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["keys.ts"],"names":["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":["_Utils","require","_NativeQuickCrypto","kNamedCurveAliases","exports","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","isStringOrBuffer","binaryLikeToArrayBuffer","prepareAsymmetricKey","key","ctx","data","kConsumePrivate","kCreatePrivate","preparePrivateKey","preparePublicOrPrivateKey","kConsumePublic","parsePublicKeyEncoding","parsePrivateKeyEncoding","prepareSecretKey","bufferOnly","KeyObject","handle","CryptoKey","keyObject","ArrayBuffer","createSecretKey","k","NativeQuickCrypto","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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"}
@@ -4,17 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.pbkdf2 = pbkdf2;
7
+ exports.pbkdf2DeriveBits = pbkdf2DeriveBits;
7
8
  exports.pbkdf2Sync = pbkdf2Sync;
8
-
9
9
  var _NativeQuickCrypto = require("./NativeQuickCrypto/NativeQuickCrypto");
10
-
11
10
  var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
12
-
13
11
  var _Utils = require("./Utils");
14
-
12
+ var _util = require("util");
15
13
  const WRONG_PASS = 'Password must be a string, a Buffer, a typed array or a DataView';
16
- const WRON_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
17
-
14
+ const WRONG_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
18
15
  function sanitizeInput(input, errorMsg) {
19
16
  try {
20
17
  return (0, _Utils.binaryLikeToArrayBuffer)(input);
@@ -22,16 +19,12 @@ function sanitizeInput(input, errorMsg) {
22
19
  throw errorMsg;
23
20
  }
24
21
  }
25
-
26
22
  const nativePbkdf2 = _NativeQuickCrypto.NativeQuickCrypto.pbkdf2;
27
-
28
23
  function pbkdf2(password, salt, iterations, keylen, arg0, arg1) {
29
- let digest = 'sha1';
24
+ let digest = 'SHA-1';
30
25
  let callback;
31
-
32
26
  if (typeof arg0 === 'string') {
33
27
  digest = arg0;
34
-
35
28
  if (typeof arg1 === 'function') {
36
29
  callback = arg1;
37
30
  }
@@ -40,25 +33,58 @@ function pbkdf2(password, salt, iterations, keylen, arg0, arg1) {
40
33
  callback = arg0;
41
34
  }
42
35
  }
43
-
44
36
  if (callback === undefined) {
45
37
  throw new Error('No callback provided to pbkdf2');
46
38
  }
47
-
48
39
  const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
49
- const sanitizedSalt = sanitizeInput(salt, WRON_SALT);
50
- nativePbkdf2.pbkdf2(sanitizedPassword, sanitizedSalt, iterations, keylen, digest).then(res => {
40
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
41
+ const normalizedDigest = (0, _Utils.normalizeHashName)(digest, _Utils.HashContext.Node);
42
+ nativePbkdf2.pbkdf2(sanitizedPassword, sanitizedSalt, iterations, keylen, normalizedDigest).then(res => {
51
43
  callback(null, _reactNativeBuffer.Buffer.from(res));
52
44
  }, e => {
53
45
  callback(e);
54
46
  });
55
47
  }
56
-
57
48
  function pbkdf2Sync(password, salt, iterations, keylen, digest) {
58
49
  const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
59
- const sanitizedSalt = sanitizeInput(salt, WRON_SALT);
60
- const algo = digest ? digest : 'sha1';
50
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
51
+ const algo = digest ? (0, _Utils.normalizeHashName)(digest, _Utils.HashContext.Node) : 'sha1';
61
52
  let result = nativePbkdf2.pbkdf2Sync(sanitizedPassword, sanitizedSalt, iterations, keylen, algo);
62
53
  return _reactNativeBuffer.Buffer.from(result);
63
54
  }
55
+
56
+ // We need this because the typescript overload signatures in pbkdf2() above do
57
+ // not play nice with promisify() below.
58
+ const pbkdf2WithDigest = (password, salt, iterations, keylen, digest, callback) => pbkdf2(password, salt, iterations, keylen, digest, callback);
59
+ const pbkdf2Promise = (0, _util.promisify)(pbkdf2WithDigest);
60
+ async function pbkdf2DeriveBits(algorithm, baseKey, length) {
61
+ const {
62
+ iterations,
63
+ hash,
64
+ salt
65
+ } = algorithm;
66
+ const normalizedHash = (0, _Utils.normalizeHashName)(hash);
67
+ if (!normalizedHash) {
68
+ throw (0, _Utils.lazyDOMException)('hash cannot be blank', 'OperationError');
69
+ }
70
+ if (!iterations || iterations === 0) {
71
+ throw (0, _Utils.lazyDOMException)('iterations cannot be zero', 'OperationError');
72
+ }
73
+ if (!salt) {
74
+ throw (0, _Utils.lazyDOMException)(WRONG_SALT, 'OperationError');
75
+ }
76
+ const raw = baseKey.keyObject.export();
77
+ if (length === 0) throw (0, _Utils.lazyDOMException)('length cannot be zero', 'OperationError');
78
+ if (length === null) throw (0, _Utils.lazyDOMException)('length cannot be null', 'OperationError');
79
+ if (length % 8) {
80
+ throw (0, _Utils.lazyDOMException)('length must be a multiple of 8', 'OperationError');
81
+ }
82
+ const sanitizedPassword = sanitizeInput(raw, WRONG_PASS);
83
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
84
+ let result = await pbkdf2Promise(sanitizedPassword, sanitizedSalt, iterations, length / 8, normalizedHash);
85
+ if (!result) {
86
+ throw (0, _Utils.lazyDOMException)('received bad result from pbkdf2()', 'OperationError');
87
+ }
88
+ return (0, _Utils.bufferLikeToArrayBuffer)(result);
89
+ }
64
90
  //# sourceMappingURL=pbkdf2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["pbkdf2.ts"],"names":["WRONG_PASS","WRON_SALT","sanitizeInput","input","errorMsg","e","nativePbkdf2","NativeQuickCrypto","pbkdf2","password","salt","iterations","keylen","arg0","arg1","digest","callback","undefined","Error","sanitizedPassword","sanitizedSalt","then","res","Buffer","from","pbkdf2Sync","algo","result"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;AAEA,MAAMA,UAAU,GACd,kEADF;AAEA,MAAMC,SAAS,GAAI,8DAAnB;;AAMA,SAASC,aAAT,CAAuBC,KAAvB,EAA0CC,QAA1C,EAAyE;AACvE,MAAI;AACF,WAAO,oCAAwBD,KAAxB,CAAP;AACD,GAFD,CAEE,OAAOE,CAAP,EAAe;AACf,UAAMD,QAAN;AACD;AACF;;AAED,MAAME,YAAY,GAAGC,qCAAkBC,MAAvC;;AAiBO,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,GAAGjB,aAAa,CAACO,QAAD,EAAWT,UAAX,CAAvC;AACA,QAAMoB,aAAa,GAAGlB,aAAa,CAACQ,IAAD,EAAOT,SAAP,CAAnC;AAEAK,EAAAA,YAAY,CACTE,MADH,CACUW,iBADV,EAC6BC,aAD7B,EAC4CT,UAD5C,EACwDC,MADxD,EACgEG,MADhE,EAEGM,IAFH,CAGKC,GAAD,IAAsB;AACpBN,IAAAA,QAAQ,CAAE,IAAF,EAAQO,0BAAOC,IAAP,CAAYF,GAAZ,CAAR,CAAR;AACD,GALL,EAMKjB,CAAD,IAAc;AACZW,IAAAA,QAAQ,CAAEX,CAAF,CAAR;AACD,GARL;AAUD;;AACM,SAASoB,UAAT,CACLhB,QADK,EAELC,IAFK,EAGLC,UAHK,EAILC,MAJK,EAKLG,MALK,EAMG;AACR,QAAMI,iBAAiB,GAAGjB,aAAa,CAACO,QAAD,EAAWT,UAAX,CAAvC;AACA,QAAMoB,aAAa,GAAGlB,aAAa,CAACQ,IAAD,EAAOT,SAAP,CAAnC;AAEA,QAAMyB,IAAI,GAAGX,MAAM,GAAGA,MAAH,GAAY,MAA/B;AACA,MAAIY,MAAmB,GAAGrB,YAAY,CAACmB,UAAb,CACxBN,iBADwB,EAExBC,aAFwB,EAGxBT,UAHwB,EAIxBC,MAJwB,EAKxBc,IALwB,CAA1B;AAQA,SAAOH,0BAAOC,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","require","_reactNativeBuffer","_Utils","_util","WRONG_PASS","WRONG_SALT","sanitizeInput","input","errorMsg","binaryLikeToArrayBuffer","e","nativePbkdf2","NativeQuickCrypto","pbkdf2","password","salt","iterations","keylen","arg0","arg1","digest","callback","undefined","Error","sanitizedPassword","sanitizedSalt","normalizedDigest","normalizeHashName","HashContext","Node","then","res","Buffer","from","pbkdf2Sync","algo","result","pbkdf2WithDigest","pbkdf2Promise","promisify","pbkdf2DeriveBits","algorithm","baseKey","length","hash","normalizedHash","lazyDOMException","raw","keyObject","export","bufferLikeToArrayBuffer"],"sourceRoot":"../../src","sources":["pbkdf2.ts"],"mappings":"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"}