react-native-quick-crypto 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -6
- package/android/CMakeLists.txt +10 -2
- package/android/gradle.properties +1 -1
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/cpp/cpp-adapter.cpp +1 -1
- package/android/src/main/java/com/margelo/quickcrypto/QuickCryptoModule.java +70 -0
- package/android/src/main/java/com/{reactnativequickcrypto → margelo/quickcrypto}/QuickCryptoPackage.java +11 -12
- package/cpp/Cipher/MGLCipherHostObject.cpp +4 -5
- package/cpp/Cipher/MGLCreateCipherInstaller.cpp +1 -3
- package/cpp/Cipher/MGLGenerateKeyPairInstaller.h +6 -3
- package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.h +5 -3
- package/cpp/Cipher/MGLPublicCipher.h +1 -1
- package/cpp/Cipher/MGLPublicCipherInstaller.h +1 -1
- package/cpp/Cipher/MGLRsa.h +5 -1
- package/cpp/JSIUtils/MGLJSIMacros.h +69 -6
- package/cpp/{Cipher/MGLCipherKeys.cpp → MGLKeys.cpp} +47 -49
- package/cpp/{Cipher/MGLCipherKeys.h → MGLKeys.h} +29 -30
- package/cpp/MGLQuickCryptoHostObject.cpp +12 -0
- package/cpp/Sig/MGLSignHostObjects.cpp +889 -0
- package/cpp/Sig/MGLSignHostObjects.h +88 -0
- package/cpp/Sig/MGLSignInstaller.cpp +24 -0
- package/cpp/Sig/MGLSignInstaller.h +29 -0
- package/cpp/Sig/MGLVerifyInstaller.cpp +24 -0
- package/cpp/Sig/MGLVerifyInstaller.h +22 -0
- package/cpp/Utils/MGLUtils.cpp +67 -29
- package/cpp/Utils/MGLUtils.h +17 -17
- package/lib/commonjs/@types/crypto-browserify.d.js +2 -0
- package/lib/commonjs/@types/crypto-browserify.d.js.map +1 -0
- package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/sig.js +2 -0
- package/lib/commonjs/NativeQuickCrypto/sig.js.map +1 -0
- package/lib/commonjs/QuickCrypto.js +4 -0
- package/lib/commonjs/QuickCrypto.js.map +1 -1
- package/lib/commonjs/index.js +7 -7
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys.js +1 -4
- package/lib/commonjs/keys.js.map +1 -1
- package/lib/commonjs/sig.js +170 -0
- package/lib/commonjs/sig.js.map +1 -0
- package/lib/module/@types/crypto-browserify.d.js +2 -0
- package/lib/module/@types/crypto-browserify.d.js.map +1 -0
- package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
- package/lib/module/NativeQuickCrypto/sig.js +2 -0
- package/lib/module/NativeQuickCrypto/sig.js.map +1 -0
- package/lib/module/QuickCrypto.js +3 -0
- package/lib/module/QuickCrypto.js.map +1 -1
- package/lib/module/index.js +6 -9
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys.js +1 -4
- package/lib/module/keys.js.map +1 -1
- package/lib/module/sig.js +155 -0
- package/lib/module/sig.js.map +1 -0
- package/lib/typescript/NativeQuickCrypto/NativeQuickCrypto.d.ts +3 -0
- package/lib/typescript/NativeQuickCrypto/sig.d.ts +12 -0
- package/lib/typescript/QuickCrypto.d.ts +3 -0
- package/lib/typescript/index.d.ts +206 -1
- package/lib/typescript/sig.d.ts +35 -0
- package/package.json +3 -2
- package/src/@types/crypto-browserify.d.ts +4 -0
- package/src/NativeQuickCrypto/NativeQuickCrypto.ts +3 -0
- package/src/NativeQuickCrypto/sig.ts +17 -0
- package/src/QuickCrypto.ts +3 -0
- package/src/index.ts +6 -5
- package/src/keys.ts +18 -13
- package/src/sig.ts +179 -0
- package/android/src/main/java/com/reactnativequickcrypto/QuickCryptoModule.java +0 -70
|
@@ -1,2 +1,207 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
5
|
+
import FallbackCrypto from 'crypto-browserify';
|
|
6
|
+
declare const crypto: {
|
|
7
|
+
randomFill<T extends Buffer | ArrayBufferLike | (Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array) | DataView>(buffer: T, callback: (err: Error | null, buf: T) => void): void;
|
|
8
|
+
randomFill<T_1 extends Buffer | ArrayBufferLike | (Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array) | DataView>(buffer: T_1, offset: number, callback: (err: Error | null, buf: T_1) => void): void;
|
|
9
|
+
randomFill<T_2 extends Buffer | ArrayBufferLike | (Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array) | DataView>(buffer: T_2, offset: number, size: number, callback: (err: Error | null, buf: T_2) => void): void;
|
|
10
|
+
randomFillSync<T_3 extends Buffer | ArrayBufferLike | (Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array) | DataView>(buffer: T_3, offset?: number | undefined, size?: number | undefined): T_3;
|
|
11
|
+
randomBytes(size: number): ArrayBuffer;
|
|
12
|
+
randomBytes(size: number, callback: (err: Error | null, buf?: ArrayBuffer | undefined) => void): void;
|
|
13
|
+
randomInt(max: number, callback: (err: Error | null, value: number) => void): void;
|
|
14
|
+
randomInt(max: number): number;
|
|
15
|
+
randomInt(min: number, max: number, callback: (err: Error | null, value: number) => void): void;
|
|
16
|
+
randomInt(min: number, max: number): number;
|
|
17
|
+
getRandomValues(data: Uint8Array | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array): Uint8Array | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array;
|
|
18
|
+
rng: typeof import("./random").randomBytes;
|
|
19
|
+
pseudoRandomBytes: typeof import("./random").randomBytes;
|
|
20
|
+
prng: typeof import("./random").randomBytes;
|
|
21
|
+
pbkdf2(password: import("./Utils").BinaryLike, salt: import("./Utils").BinaryLike, iterations: number, keylen: number, digest: string, callback: (err: Error | null, derivedKey?: Buffer | undefined) => void): void;
|
|
22
|
+
pbkdf2(password: import("./Utils").BinaryLike, salt: import("./Utils").BinaryLike, iterations: number, keylen: number, callback: (err: Error | null, derivedKey?: Buffer | undefined) => void): void;
|
|
23
|
+
pbkdf2Sync(password: import("./Utils").BinaryLike, salt: import("./Utils").BinaryLike, iterations: number, keylen: number, digest?: string | undefined): Buffer;
|
|
24
|
+
createHmac: typeof import("./Hmac").createHmac;
|
|
25
|
+
Hmac: typeof import("./Hmac").createHmac;
|
|
26
|
+
Hash: typeof import("./Hash").createHash;
|
|
27
|
+
createHash: typeof import("./Hash").createHash;
|
|
28
|
+
createCipher: typeof import("./Cipher").createCipher;
|
|
29
|
+
createCipheriv: typeof import("./Cipher").createCipheriv;
|
|
30
|
+
createDecipher: typeof import("./Cipher").createDecipher;
|
|
31
|
+
createDecipheriv: typeof import("./Cipher").createDecipheriv;
|
|
32
|
+
publicEncrypt: (options: {
|
|
33
|
+
key: any;
|
|
34
|
+
encoding?: string | undefined;
|
|
35
|
+
format?: any;
|
|
36
|
+
padding?: any;
|
|
37
|
+
oaepHash?: any;
|
|
38
|
+
oaepLabel?: any;
|
|
39
|
+
passphrase?: string | undefined;
|
|
40
|
+
}, buffer: import("./Utils").BinaryLike) => Buffer;
|
|
41
|
+
publicDecrypt: (options: {
|
|
42
|
+
key: any;
|
|
43
|
+
encoding?: string | undefined;
|
|
44
|
+
format?: any;
|
|
45
|
+
padding?: any;
|
|
46
|
+
oaepHash?: any;
|
|
47
|
+
oaepLabel?: any;
|
|
48
|
+
passphrase?: string | undefined;
|
|
49
|
+
}, buffer: import("./Utils").BinaryLike) => Buffer;
|
|
50
|
+
privateDecrypt: (options: {
|
|
51
|
+
key: any;
|
|
52
|
+
encoding?: string | undefined;
|
|
53
|
+
format?: any;
|
|
54
|
+
padding?: any;
|
|
55
|
+
oaepHash?: any;
|
|
56
|
+
oaepLabel?: any;
|
|
57
|
+
passphrase?: string | undefined;
|
|
58
|
+
}, buffer: import("./Utils").BinaryLike) => Buffer;
|
|
59
|
+
generateKeyPair: typeof import("./Cipher").generateKeyPair;
|
|
60
|
+
generateKeyPairSync: typeof import("./Cipher").generateKeyPairSync;
|
|
61
|
+
createSign: typeof import("./sig").createSign;
|
|
62
|
+
createVerify: typeof import("./sig").createVerify;
|
|
63
|
+
constants: {
|
|
64
|
+
OPENSSL_VERSION_NUMBER: number;
|
|
65
|
+
SSL_OP_ALL: number;
|
|
66
|
+
SSL_OP_ALLOW_NO_DHE_KEX: number;
|
|
67
|
+
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number;
|
|
68
|
+
SSL_OP_CIPHER_SERVER_PREFERENCE: number;
|
|
69
|
+
SSL_OP_CISCO_ANYCONNECT: number;
|
|
70
|
+
SSL_OP_COOKIE_EXCHANGE: number;
|
|
71
|
+
SSL_OP_CRYPTOPRO_TLSEXT_BUG: number;
|
|
72
|
+
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number;
|
|
73
|
+
SSL_OP_EPHEMERAL_RSA: number;
|
|
74
|
+
SSL_OP_LEGACY_SERVER_CONNECT: number;
|
|
75
|
+
SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number;
|
|
76
|
+
SSL_OP_MICROSOFT_SESS_ID_BUG: number;
|
|
77
|
+
SSL_OP_MSIE_SSLV2_RSA_PADDING: number;
|
|
78
|
+
SSL_OP_NETSCAPE_CA_DN_BUG: number;
|
|
79
|
+
SSL_OP_NETSCAPE_CHALLENGE_BUG: number;
|
|
80
|
+
SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number;
|
|
81
|
+
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number;
|
|
82
|
+
SSL_OP_NO_COMPRESSION: number;
|
|
83
|
+
SSL_OP_NO_ENCRYPT_THEN_MAC: number;
|
|
84
|
+
SSL_OP_NO_QUERY_MTU: number;
|
|
85
|
+
SSL_OP_NO_RENEGOTIATION: number;
|
|
86
|
+
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number;
|
|
87
|
+
SSL_OP_NO_SSLv2: number;
|
|
88
|
+
SSL_OP_NO_SSLv3: number;
|
|
89
|
+
SSL_OP_NO_TICKET: number;
|
|
90
|
+
SSL_OP_NO_TLSv1: number;
|
|
91
|
+
SSL_OP_NO_TLSv1_1: number;
|
|
92
|
+
SSL_OP_NO_TLSv1_2: number;
|
|
93
|
+
SSL_OP_NO_TLSv1_3: number;
|
|
94
|
+
SSL_OP_PKCS1_CHECK_1: number;
|
|
95
|
+
SSL_OP_PKCS1_CHECK_2: number;
|
|
96
|
+
SSL_OP_PRIORITIZE_CHACHA: number;
|
|
97
|
+
SSL_OP_SINGLE_DH_USE: number;
|
|
98
|
+
SSL_OP_SINGLE_ECDH_USE: number;
|
|
99
|
+
SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number;
|
|
100
|
+
SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number;
|
|
101
|
+
SSL_OP_TLS_BLOCK_PADDING_BUG: number;
|
|
102
|
+
SSL_OP_TLS_D5_BUG: number;
|
|
103
|
+
SSL_OP_TLS_ROLLBACK_BUG: number;
|
|
104
|
+
ENGINE_METHOD_RSA: number;
|
|
105
|
+
ENGINE_METHOD_DSA: number;
|
|
106
|
+
ENGINE_METHOD_DH: number;
|
|
107
|
+
ENGINE_METHOD_RAND: number;
|
|
108
|
+
ENGINE_METHOD_EC: number;
|
|
109
|
+
ENGINE_METHOD_CIPHERS: number;
|
|
110
|
+
ENGINE_METHOD_DIGESTS: number;
|
|
111
|
+
ENGINE_METHOD_PKEY_METHS: number;
|
|
112
|
+
ENGINE_METHOD_PKEY_ASN1_METHS: number;
|
|
113
|
+
ENGINE_METHOD_ALL: number;
|
|
114
|
+
ENGINE_METHOD_NONE: number;
|
|
115
|
+
DH_CHECK_P_NOT_SAFE_PRIME: number;
|
|
116
|
+
DH_CHECK_P_NOT_PRIME: number;
|
|
117
|
+
DH_UNABLE_TO_CHECK_GENERATOR: number;
|
|
118
|
+
DH_NOT_SUITABLE_GENERATOR: number;
|
|
119
|
+
ALPN_ENABLED: number;
|
|
120
|
+
RSA_PKCS1_PADDING: number;
|
|
121
|
+
RSA_SSLV23_PADDING: number;
|
|
122
|
+
RSA_NO_PADDING: number;
|
|
123
|
+
RSA_PKCS1_OAEP_PADDING: number;
|
|
124
|
+
RSA_X931_PADDING: number;
|
|
125
|
+
RSA_PKCS1_PSS_PADDING: number;
|
|
126
|
+
RSA_PSS_SALTLEN_DIGEST: number;
|
|
127
|
+
RSA_PSS_SALTLEN_MAX_SIGN: number;
|
|
128
|
+
RSA_PSS_SALTLEN_AUTO: number;
|
|
129
|
+
defaultCoreCipherList: string;
|
|
130
|
+
TLS1_VERSION: number;
|
|
131
|
+
TLS1_1_VERSION: number;
|
|
132
|
+
TLS1_2_VERSION: number;
|
|
133
|
+
TLS1_3_VERSION: number;
|
|
134
|
+
POINT_CONVERSION_COMPRESSED: number;
|
|
135
|
+
POINT_CONVERSION_UNCOMPRESSED: number;
|
|
136
|
+
POINT_CONVERSION_HYBRID: number;
|
|
137
|
+
};
|
|
138
|
+
generateKey(type: "hmac" | "aes", options: {
|
|
139
|
+
length: number;
|
|
140
|
+
}, callback: (err: Error | null, key: FallbackCrypto.KeyObject) => void): void;
|
|
141
|
+
generateKeySync(type: "hmac" | "aes", options: {
|
|
142
|
+
length: number;
|
|
143
|
+
}): FallbackCrypto.KeyObject;
|
|
144
|
+
createPrivateKey(key: string | globalThis.Buffer | FallbackCrypto.PrivateKeyInput | FallbackCrypto.JsonWebKeyInput): FallbackCrypto.KeyObject;
|
|
145
|
+
createPublicKey(key: string | globalThis.Buffer | FallbackCrypto.KeyObject | FallbackCrypto.JsonWebKeyInput | FallbackCrypto.PublicKeyInput): FallbackCrypto.KeyObject;
|
|
146
|
+
createSecretKey(key: NodeJS.ArrayBufferView): FallbackCrypto.KeyObject;
|
|
147
|
+
createSecretKey(key: string, encoding: BufferEncoding): FallbackCrypto.KeyObject;
|
|
148
|
+
createDiffieHellman(primeLength: number, generator?: number | NodeJS.ArrayBufferView | undefined): FallbackCrypto.DiffieHellman;
|
|
149
|
+
createDiffieHellman(prime: NodeJS.ArrayBufferView): FallbackCrypto.DiffieHellman;
|
|
150
|
+
createDiffieHellman(prime: string, primeEncoding: FallbackCrypto.BinaryToTextEncoding): FallbackCrypto.DiffieHellman;
|
|
151
|
+
createDiffieHellman(prime: string, primeEncoding: FallbackCrypto.BinaryToTextEncoding, generator: number | NodeJS.ArrayBufferView): FallbackCrypto.DiffieHellman;
|
|
152
|
+
createDiffieHellman(prime: string, primeEncoding: FallbackCrypto.BinaryToTextEncoding, generator: string, generatorEncoding: FallbackCrypto.BinaryToTextEncoding): FallbackCrypto.DiffieHellman;
|
|
153
|
+
getDiffieHellman(groupName: string): FallbackCrypto.DiffieHellman;
|
|
154
|
+
scrypt(password: FallbackCrypto.BinaryLike, salt: FallbackCrypto.BinaryLike, keylen: number, callback: (err: Error | null, derivedKey: globalThis.Buffer) => void): void;
|
|
155
|
+
scrypt(password: FallbackCrypto.BinaryLike, salt: FallbackCrypto.BinaryLike, keylen: number, options: FallbackCrypto.ScryptOptions, callback: (err: Error | null, derivedKey: globalThis.Buffer) => void): void;
|
|
156
|
+
scryptSync(password: FallbackCrypto.BinaryLike, salt: FallbackCrypto.BinaryLike, keylen: number, options?: FallbackCrypto.ScryptOptions | undefined): globalThis.Buffer;
|
|
157
|
+
privateEncrypt(privateKey: FallbackCrypto.RsaPrivateKey | FallbackCrypto.KeyLike, buffer: NodeJS.ArrayBufferView): globalThis.Buffer;
|
|
158
|
+
getCiphers(): string[];
|
|
159
|
+
getCurves(): string[];
|
|
160
|
+
getFips(): 0 | 1;
|
|
161
|
+
getHashes(): string[];
|
|
162
|
+
createECDH(curveName: string): FallbackCrypto.ECDH;
|
|
163
|
+
timingSafeEqual(a: NodeJS.ArrayBufferView, b: NodeJS.ArrayBufferView): boolean;
|
|
164
|
+
sign(algorithm: string | null | undefined, data: NodeJS.ArrayBufferView, key: FallbackCrypto.KeyLike | FallbackCrypto.SignKeyObjectInput | FallbackCrypto.SignPrivateKeyInput): globalThis.Buffer;
|
|
165
|
+
sign(algorithm: string | null | undefined, data: NodeJS.ArrayBufferView, key: FallbackCrypto.KeyLike | FallbackCrypto.SignKeyObjectInput | FallbackCrypto.SignPrivateKeyInput, callback: (error: Error | null, data: globalThis.Buffer) => void): void;
|
|
166
|
+
verify(algorithm: string | null | undefined, data: NodeJS.ArrayBufferView, key: FallbackCrypto.KeyLike | FallbackCrypto.VerifyKeyObjectInput | FallbackCrypto.VerifyPublicKeyInput, signature: NodeJS.ArrayBufferView): boolean;
|
|
167
|
+
verify(algorithm: string | null | undefined, data: NodeJS.ArrayBufferView, key: FallbackCrypto.KeyLike | FallbackCrypto.VerifyKeyObjectInput | FallbackCrypto.VerifyPublicKeyInput, signature: NodeJS.ArrayBufferView, callback: (error: Error | null, result: boolean) => void): void;
|
|
168
|
+
diffieHellman(options: {
|
|
169
|
+
privateKey: FallbackCrypto.KeyObject;
|
|
170
|
+
publicKey: FallbackCrypto.KeyObject;
|
|
171
|
+
}): globalThis.Buffer;
|
|
172
|
+
getCipherInfo(nameOrNid: string | number, options?: FallbackCrypto.CipherInfoOptions | undefined): FallbackCrypto.CipherInfo | undefined;
|
|
173
|
+
hkdf(digest: string, irm: FallbackCrypto.KeyObject | FallbackCrypto.BinaryLike, salt: FallbackCrypto.BinaryLike, info: FallbackCrypto.BinaryLike, keylen: number, callback: (err: Error | null, derivedKey: ArrayBuffer) => void): void;
|
|
174
|
+
hkdfSync(digest: string, ikm: FallbackCrypto.KeyObject | FallbackCrypto.BinaryLike, salt: FallbackCrypto.BinaryLike, info: FallbackCrypto.BinaryLike, keylen: number): ArrayBuffer;
|
|
175
|
+
secureHeapUsed(): FallbackCrypto.SecureHeapUsage;
|
|
176
|
+
randomUUID(options?: FallbackCrypto.RandomUUIDOptions | undefined): string;
|
|
177
|
+
generatePrime(size: number, callback: (err: Error | null, prime: ArrayBuffer) => void): void;
|
|
178
|
+
generatePrime(size: number, options: FallbackCrypto.GeneratePrimeOptionsBigInt, callback: (err: Error | null, prime: bigint) => void): void;
|
|
179
|
+
generatePrime(size: number, options: FallbackCrypto.GeneratePrimeOptionsArrayBuffer, callback: (err: Error | null, prime: ArrayBuffer) => void): void;
|
|
180
|
+
generatePrime(size: number, options: FallbackCrypto.GeneratePrimeOptions, callback: (err: Error | null, prime: bigint | ArrayBuffer) => void): void;
|
|
181
|
+
generatePrimeSync(size: number): ArrayBuffer;
|
|
182
|
+
generatePrimeSync(size: number, options: FallbackCrypto.GeneratePrimeOptionsBigInt): bigint;
|
|
183
|
+
generatePrimeSync(size: number, options: FallbackCrypto.GeneratePrimeOptionsArrayBuffer): ArrayBuffer;
|
|
184
|
+
generatePrimeSync(size: number, options: FallbackCrypto.GeneratePrimeOptions): bigint | ArrayBuffer;
|
|
185
|
+
checkPrime(value: FallbackCrypto.LargeNumberLike, callback: (err: Error | null, result: boolean) => void): void;
|
|
186
|
+
checkPrime(value: FallbackCrypto.LargeNumberLike, options: FallbackCrypto.CheckPrimeOptions, callback: (err: Error | null, result: boolean) => void): void;
|
|
187
|
+
checkPrimeSync(candidate: FallbackCrypto.LargeNumberLike, options?: FallbackCrypto.CheckPrimeOptions | undefined): boolean;
|
|
188
|
+
Certificate: FallbackCrypto.Certificate & {
|
|
189
|
+
(): FallbackCrypto.Certificate;
|
|
190
|
+
new (): FallbackCrypto.Certificate;
|
|
191
|
+
exportChallenge(spkac: FallbackCrypto.BinaryLike): globalThis.Buffer;
|
|
192
|
+
exportPublicKey(spkac: FallbackCrypto.BinaryLike, encoding?: string | undefined): globalThis.Buffer;
|
|
193
|
+
verifySpkac(spkac: NodeJS.ArrayBufferView): boolean;
|
|
194
|
+
};
|
|
195
|
+
fips: boolean;
|
|
196
|
+
KeyObject: typeof FallbackCrypto.KeyObject;
|
|
197
|
+
Cipher: typeof FallbackCrypto.Cipher;
|
|
198
|
+
Decipher: typeof FallbackCrypto.Decipher;
|
|
199
|
+
Sign: typeof FallbackCrypto.Sign;
|
|
200
|
+
Verify: typeof FallbackCrypto.Verify;
|
|
201
|
+
DiffieHellman: typeof FallbackCrypto.DiffieHellman;
|
|
202
|
+
ECDH: typeof FallbackCrypto.ECDH;
|
|
203
|
+
DEFAULT_ENCODING: BufferEncoding;
|
|
204
|
+
X509Certificate: typeof FallbackCrypto.X509Certificate;
|
|
205
|
+
webcrypto: typeof FallbackCrypto.webcrypto;
|
|
206
|
+
};
|
|
2
207
|
export default crypto;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import Stream from 'stream';
|
|
4
|
+
import { BinaryLike } from './Utils';
|
|
5
|
+
declare class Verify extends Stream.Writable {
|
|
6
|
+
private internal;
|
|
7
|
+
constructor(algorithm: string, options: Stream.WritableOptions);
|
|
8
|
+
_write(chunk: BinaryLike, encoding: string, callback: () => void): void;
|
|
9
|
+
update(data: BinaryLike, encoding?: string): this;
|
|
10
|
+
verify(options: {
|
|
11
|
+
key: string | Buffer;
|
|
12
|
+
format?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
passphrase?: string;
|
|
15
|
+
padding?: number;
|
|
16
|
+
saltLength?: number;
|
|
17
|
+
}, signature: BinaryLike): boolean;
|
|
18
|
+
}
|
|
19
|
+
declare class Sign extends Stream.Writable {
|
|
20
|
+
private internal;
|
|
21
|
+
constructor(algorithm: string, options: Stream.WritableOptions);
|
|
22
|
+
_write(chunk: BinaryLike, encoding: string, callback: () => void): void;
|
|
23
|
+
update(data: BinaryLike, encoding?: string): this;
|
|
24
|
+
sign(options: {
|
|
25
|
+
key: string | Buffer;
|
|
26
|
+
format?: string;
|
|
27
|
+
type?: string;
|
|
28
|
+
passphrase?: string;
|
|
29
|
+
padding?: number;
|
|
30
|
+
saltLength?: number;
|
|
31
|
+
}, encoding?: string): string | Buffer;
|
|
32
|
+
}
|
|
33
|
+
export declare function createSign(algorithm: string, options?: any): Sign;
|
|
34
|
+
export declare function createVerify(algorithm: string, options?: any): Verify;
|
|
35
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-quick-crypto",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "A fast implementation of Node's `crypto` module written in C/C++ JSI",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -128,7 +128,8 @@
|
|
|
128
128
|
]
|
|
129
129
|
},
|
|
130
130
|
"globals": {
|
|
131
|
-
"BufferEncoding": true
|
|
131
|
+
"BufferEncoding": true,
|
|
132
|
+
"Buffer": true
|
|
132
133
|
}
|
|
133
134
|
},
|
|
134
135
|
"eslintIgnore": [
|
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
GenerateKeyPairMethod,
|
|
12
12
|
GenerateKeyPairSyncMethod,
|
|
13
13
|
} from './Cipher';
|
|
14
|
+
import type { CreateSignMethod, CreateVerifyMethod } from './sig';
|
|
14
15
|
|
|
15
16
|
interface NativeQuickCryptoSpec {
|
|
16
17
|
createHmac: CreateHmacMethod;
|
|
@@ -24,6 +25,8 @@ interface NativeQuickCryptoSpec {
|
|
|
24
25
|
privateDecrypt: PrivateDecryptMethod;
|
|
25
26
|
generateKeyPair: GenerateKeyPairMethod;
|
|
26
27
|
generateKeyPairSync: GenerateKeyPairSyncMethod;
|
|
28
|
+
createSign: CreateSignMethod;
|
|
29
|
+
createVerify: CreateVerifyMethod;
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
// global func declaration for JSI functions
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// TODO Add real types to sign/verify, the problem is that because of encryption schemes
|
|
2
|
+
// they will have variable amount of parameters
|
|
3
|
+
export type InternalSign = {
|
|
4
|
+
init: (algorithm: string) => void;
|
|
5
|
+
update: (data: ArrayBuffer) => void;
|
|
6
|
+
sign: (...args: any) => Uint8Array; // returns raw bytes
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type InternalVerify = {
|
|
10
|
+
init: (algorithm: string) => void;
|
|
11
|
+
update: (data: ArrayBuffer) => void;
|
|
12
|
+
verify: (...args: any) => boolean;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type CreateSignMethod = () => InternalSign;
|
|
16
|
+
|
|
17
|
+
export type CreateVerifyMethod = () => InternalVerify;
|
package/src/QuickCrypto.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
generateKeyPair,
|
|
12
12
|
generateKeyPairSync,
|
|
13
13
|
} from './Cipher';
|
|
14
|
+
import { createSign, createVerify } from './sig';
|
|
14
15
|
import { createHmac } from './Hmac';
|
|
15
16
|
import { createHash } from './Hash';
|
|
16
17
|
import { constants } from './constants';
|
|
@@ -29,6 +30,8 @@ export const QuickCrypto = {
|
|
|
29
30
|
privateDecrypt,
|
|
30
31
|
generateKeyPair,
|
|
31
32
|
generateKeyPairSync,
|
|
33
|
+
createSign,
|
|
34
|
+
createVerify,
|
|
32
35
|
constants,
|
|
33
36
|
...pbkdf2,
|
|
34
37
|
...random,
|
package/src/index.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
2
|
import { QuickCrypto } from './QuickCrypto';
|
|
3
|
+
import FallbackCrypto from 'crypto-browserify';
|
|
3
4
|
|
|
4
|
-
// @ts-expect-error
|
|
5
|
+
// @ts-expect-error Buffer does not match exact same type definition.
|
|
5
6
|
global.Buffer = Buffer;
|
|
6
|
-
// @ts-expect-error
|
|
7
|
-
global.crypto = QuickCrypto; // for randombytes https://github.com/crypto-browserify/randombytes/blob/master/browser.js#L16
|
|
8
7
|
|
|
9
|
-
const
|
|
10
|
-
|
|
8
|
+
const crypto = { ...FallbackCrypto, ...QuickCrypto };
|
|
9
|
+
|
|
10
|
+
// for randombytes https://github.com/crypto-browserify/randombytes/blob/master/browser.js#L16
|
|
11
|
+
// @ts-expect-error QuickCrypto is missing `subtle` and `randomUUID`
|
|
11
12
|
global.crypto = crypto;
|
|
12
13
|
|
|
13
14
|
module.exports = crypto;
|
package/src/keys.ts
CHANGED
|
@@ -36,7 +36,7 @@ function option(name: string, objName: string | undefined) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
function parseKeyFormat(
|
|
39
|
-
formatStr: string,
|
|
39
|
+
formatStr: string | undefined,
|
|
40
40
|
defaultFormat: KFormatType | undefined,
|
|
41
41
|
optionName?: string
|
|
42
42
|
) {
|
|
@@ -50,10 +50,10 @@ function parseKeyFormat(
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
function parseKeyType(
|
|
53
|
-
typeStr: string,
|
|
53
|
+
typeStr: string | undefined,
|
|
54
54
|
required: boolean,
|
|
55
|
-
keyType: string,
|
|
56
|
-
isPublic: boolean,
|
|
55
|
+
keyType: string | undefined,
|
|
56
|
+
isPublic: boolean | undefined,
|
|
57
57
|
optionName: string
|
|
58
58
|
) {
|
|
59
59
|
if (typeStr === undefined && !required) {
|
|
@@ -63,10 +63,6 @@ function parseKeyType(
|
|
|
63
63
|
throw new Error(
|
|
64
64
|
`Crypto incompatible key options: ${typeStr} can only be used for RSA keys`
|
|
65
65
|
);
|
|
66
|
-
// throw new ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS(
|
|
67
|
-
// typeStr,
|
|
68
|
-
// 'can only be used for RSA keys'
|
|
69
|
-
// );
|
|
70
66
|
}
|
|
71
67
|
return KeyEncoding.kKeyEncodingPKCS1;
|
|
72
68
|
} else if (typeStr === 'spki' && isPublic !== false) {
|
|
@@ -86,10 +82,17 @@ function parseKeyType(
|
|
|
86
82
|
}
|
|
87
83
|
|
|
88
84
|
function parseKeyFormatAndType(
|
|
89
|
-
enc:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
enc: {
|
|
86
|
+
key: any;
|
|
87
|
+
type?: string;
|
|
88
|
+
encoding?: string;
|
|
89
|
+
format?: string;
|
|
90
|
+
cipher?: string;
|
|
91
|
+
passphrase?: string;
|
|
92
|
+
},
|
|
93
|
+
keyType: string | undefined,
|
|
94
|
+
isPublic: boolean | undefined,
|
|
95
|
+
objName: string | undefined
|
|
93
96
|
) {
|
|
94
97
|
const { format: formatStr, type: typeStr } = enc;
|
|
95
98
|
|
|
@@ -103,6 +106,7 @@ function parseKeyFormatAndType(
|
|
|
103
106
|
const isRequired =
|
|
104
107
|
(!isInput || format === KFormatType.kKeyFormatDER) &&
|
|
105
108
|
format !== KFormatType.kKeyFormatJWK;
|
|
109
|
+
|
|
106
110
|
const type = parseKeyType(
|
|
107
111
|
typeStr,
|
|
108
112
|
isRequired,
|
|
@@ -116,6 +120,7 @@ function parseKeyFormatAndType(
|
|
|
116
120
|
function parseKeyEncoding(
|
|
117
121
|
enc: {
|
|
118
122
|
key: any;
|
|
123
|
+
type?: string;
|
|
119
124
|
encoding?: string;
|
|
120
125
|
format?: string;
|
|
121
126
|
cipher?: string;
|
|
@@ -123,7 +128,7 @@ function parseKeyEncoding(
|
|
|
123
128
|
},
|
|
124
129
|
keyType: string | undefined,
|
|
125
130
|
isPublic: boolean | undefined,
|
|
126
|
-
objName?: string
|
|
131
|
+
objName?: string | undefined
|
|
127
132
|
) {
|
|
128
133
|
// validateObject(enc, 'options');
|
|
129
134
|
|
package/src/sig.ts
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';
|
|
2
|
+
import type { InternalSign, InternalVerify } from './NativeQuickCrypto/sig';
|
|
3
|
+
import Stream from 'stream';
|
|
4
|
+
|
|
5
|
+
// TODO(osp) same as publicCipher on node this are defined on C++ and exposed to node
|
|
6
|
+
// Do the same here
|
|
7
|
+
enum DSASigEnc {
|
|
8
|
+
kSigEncDER,
|
|
9
|
+
kSigEncP1363,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
BinaryLike,
|
|
14
|
+
binaryLikeToArrayBuffer,
|
|
15
|
+
getDefaultEncoding,
|
|
16
|
+
} from './Utils';
|
|
17
|
+
import { preparePrivateKey, preparePublicOrPrivateKey } from './keys';
|
|
18
|
+
|
|
19
|
+
const createInternalSign = NativeQuickCrypto.createSign;
|
|
20
|
+
const createInternalVerify = NativeQuickCrypto.createVerify;
|
|
21
|
+
|
|
22
|
+
function getPadding(options: any) {
|
|
23
|
+
return getIntOption('padding', options);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getSaltLength(options: any) {
|
|
27
|
+
return getIntOption('saltLength', options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function getDSASignatureEncoding(options: any) {
|
|
31
|
+
if (typeof options === 'object') {
|
|
32
|
+
const { dsaEncoding = 'der' } = options;
|
|
33
|
+
if (dsaEncoding === 'der') return DSASigEnc.kSigEncDER;
|
|
34
|
+
else if (dsaEncoding === 'ieee-p1363') return DSASigEnc.kSigEncP1363;
|
|
35
|
+
throw new Error(`options.dsaEncoding: ${dsaEncoding} not a valid encoding`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return DSASigEnc.kSigEncDER;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getIntOption(name: string, options: any) {
|
|
42
|
+
const value = options[name];
|
|
43
|
+
if (value !== undefined) {
|
|
44
|
+
if (value === value >> 0) {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`options.${name}: ${value} not a valid int value`);
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
class Verify extends Stream.Writable {
|
|
53
|
+
private internal: InternalVerify;
|
|
54
|
+
constructor(algorithm: string, options: Stream.WritableOptions) {
|
|
55
|
+
super(options);
|
|
56
|
+
this.internal = createInternalVerify();
|
|
57
|
+
this.internal.init(algorithm);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
_write(chunk: BinaryLike, encoding: string, callback: () => void) {
|
|
61
|
+
this.update(chunk, encoding);
|
|
62
|
+
callback();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
update(data: BinaryLike, encoding?: string) {
|
|
66
|
+
encoding = encoding ?? getDefaultEncoding();
|
|
67
|
+
data = binaryLikeToArrayBuffer(data, encoding);
|
|
68
|
+
this.internal.update(data);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
verify(
|
|
73
|
+
options: {
|
|
74
|
+
key: string | Buffer;
|
|
75
|
+
format?: string;
|
|
76
|
+
type?: string;
|
|
77
|
+
passphrase?: string;
|
|
78
|
+
padding?: number;
|
|
79
|
+
saltLength?: number;
|
|
80
|
+
},
|
|
81
|
+
signature: BinaryLike
|
|
82
|
+
): boolean {
|
|
83
|
+
if (!options) {
|
|
84
|
+
throw new Error('Crypto sign key required');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const { data, format, type, passphrase } =
|
|
88
|
+
preparePublicOrPrivateKey(options);
|
|
89
|
+
|
|
90
|
+
const rsaPadding = getPadding(options);
|
|
91
|
+
const pssSaltLength = getSaltLength(options);
|
|
92
|
+
|
|
93
|
+
// Options specific to (EC)DSA
|
|
94
|
+
const dsaSigEnc = getDSASignatureEncoding(options);
|
|
95
|
+
|
|
96
|
+
const ret = this.internal.verify(
|
|
97
|
+
data,
|
|
98
|
+
format,
|
|
99
|
+
type,
|
|
100
|
+
passphrase,
|
|
101
|
+
binaryLikeToArrayBuffer(signature),
|
|
102
|
+
rsaPadding,
|
|
103
|
+
pssSaltLength,
|
|
104
|
+
dsaSigEnc
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
return ret;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
class Sign extends Stream.Writable {
|
|
112
|
+
private internal: InternalSign;
|
|
113
|
+
constructor(algorithm: string, options: Stream.WritableOptions) {
|
|
114
|
+
super(options);
|
|
115
|
+
this.internal = createInternalSign();
|
|
116
|
+
this.internal.init(algorithm);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
_write(chunk: BinaryLike, encoding: string, callback: () => void) {
|
|
120
|
+
this.update(chunk, encoding);
|
|
121
|
+
callback();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
update(data: BinaryLike, encoding?: string) {
|
|
125
|
+
encoding = encoding ?? getDefaultEncoding();
|
|
126
|
+
data = binaryLikeToArrayBuffer(data, encoding);
|
|
127
|
+
this.internal.update(data);
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
sign(
|
|
132
|
+
options: {
|
|
133
|
+
key: string | Buffer;
|
|
134
|
+
format?: string;
|
|
135
|
+
type?: string;
|
|
136
|
+
passphrase?: string;
|
|
137
|
+
padding?: number;
|
|
138
|
+
saltLength?: number;
|
|
139
|
+
},
|
|
140
|
+
encoding?: string
|
|
141
|
+
) {
|
|
142
|
+
if (!options) {
|
|
143
|
+
throw new Error('Crypto sign key required');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const { data, format, type, passphrase } = preparePrivateKey(options);
|
|
147
|
+
|
|
148
|
+
const rsaPadding = getPadding(options);
|
|
149
|
+
const pssSaltLength = getSaltLength(options);
|
|
150
|
+
|
|
151
|
+
// Options specific to (EC)DSA
|
|
152
|
+
const dsaSigEnc = getDSASignatureEncoding(options);
|
|
153
|
+
|
|
154
|
+
const ret = this.internal.sign(
|
|
155
|
+
data,
|
|
156
|
+
format,
|
|
157
|
+
type,
|
|
158
|
+
passphrase,
|
|
159
|
+
rsaPadding,
|
|
160
|
+
pssSaltLength,
|
|
161
|
+
dsaSigEnc
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
encoding = encoding || getDefaultEncoding();
|
|
165
|
+
if (encoding && encoding !== 'buffer') {
|
|
166
|
+
return Buffer.from(ret).toString(encoding as any);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return Buffer.from(ret);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function createSign(algorithm: string, options?: any) {
|
|
174
|
+
return new Sign(algorithm, options);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function createVerify(algorithm: string, options?: any) {
|
|
178
|
+
return new Verify(algorithm, options);
|
|
179
|
+
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
package com.reactnativequickcrypto;
|
|
2
|
-
|
|
3
|
-
import android.util.Log;
|
|
4
|
-
|
|
5
|
-
import androidx.annotation.NonNull;
|
|
6
|
-
|
|
7
|
-
import com.facebook.jni.HybridData;
|
|
8
|
-
import com.facebook.proguard.annotations.DoNotStrip;
|
|
9
|
-
import com.facebook.react.bridge.JavaScriptContextHolder;
|
|
10
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
11
|
-
import com.facebook.react.bridge.ReactApplicationContext;
|
|
12
|
-
import com.facebook.react.bridge.ReactMethod;
|
|
13
|
-
import com.facebook.react.module.annotations.ReactModule;
|
|
14
|
-
import com.facebook.react.turbomodule.core.CallInvokerHolderImpl;
|
|
15
|
-
|
|
16
|
-
@ReactModule(name = QuickCryptoModule.NAME)
|
|
17
|
-
public class QuickCryptoModule extends ReactContextBaseJavaModule {
|
|
18
|
-
public static final String NAME = "QuickCrypto";
|
|
19
|
-
|
|
20
|
-
@DoNotStrip
|
|
21
|
-
private HybridData mHybridData;
|
|
22
|
-
|
|
23
|
-
private native HybridData initHybrid();
|
|
24
|
-
|
|
25
|
-
public QuickCryptoModule(ReactApplicationContext reactContext) {
|
|
26
|
-
super(reactContext);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@NonNull
|
|
30
|
-
@Override
|
|
31
|
-
public String getName() {
|
|
32
|
-
return NAME;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
36
|
-
public boolean install() {
|
|
37
|
-
try {
|
|
38
|
-
if (mHybridData != null) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
Log.i(NAME, "Loading C++ library...");
|
|
42
|
-
System.loadLibrary("reactnativequickcrypto");
|
|
43
|
-
|
|
44
|
-
JavaScriptContextHolder jsContext = getReactApplicationContext().getJavaScriptContextHolder();
|
|
45
|
-
CallInvokerHolderImpl jsCallInvokerHolder = (CallInvokerHolderImpl) getReactApplicationContext()
|
|
46
|
-
.getCatalystInstance()
|
|
47
|
-
.getJSCallInvokerHolder();
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
Log.i(NAME, "Installing JSI Bindings for react-native-quick-crypto...");
|
|
51
|
-
mHybridData = initHybrid();
|
|
52
|
-
nativeInstall(jsContext.get(), jsCallInvokerHolder);
|
|
53
|
-
Log.i(NAME, "Successfully installed JSI Bindings for react-native-quick-crypto!");
|
|
54
|
-
|
|
55
|
-
return true;
|
|
56
|
-
} catch (Exception exception) {
|
|
57
|
-
Log.e(NAME, "Failed to install JSI Bindings for react-native-quick-crypto!", exception);
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public void destroy() {
|
|
63
|
-
if (mHybridData == null) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
mHybridData.resetNative();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private native void nativeInstall(long jsiPtr, CallInvokerHolderImpl jsCallInvokerHolder);
|
|
70
|
-
}
|