From 14e4d3d6240ee27c9e89053ce669ac30a1f78003 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 16 Apr 2023 01:35:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8Android=205.1?= =?UTF-8?q?=E4=B8=8B=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toside/music/mobile/MainApplication.java | 2 + .../cn/toside/music/mobile/crypto/AES.java | 98 ++ .../music/mobile/crypto/CryptoModule.java | 141 +++ .../music/mobile/crypto/CryptoPackage.java | 23 + .../cn/toside/music/mobile/crypto/RSA.java | 113 +++ metro.config.js | 4 +- package-lock.json | 852 ------------------ package.json | 1 - publish/changeLog.md | 1 + src/app.ts | 2 + src/core/leaderboard.ts | 4 +- src/plugins/sync/client/utils.ts | 59 +- src/plugins/sync/utils.ts | 26 +- src/types/shims.d.ts | 8 +- src/utils/musicSdk/utils.js | 4 +- src/utils/musicSdk/wy/utils/crypto.js | 46 +- src/utils/nativeModules/crypto.ts | 87 ++ src/utils/nativeModules/cryptoTest.ts | 75 ++ test.js | 126 +++ 19 files changed, 750 insertions(+), 922 deletions(-) create mode 100644 android/app/src/main/java/cn/toside/music/mobile/crypto/AES.java create mode 100644 android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoModule.java create mode 100644 android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoPackage.java create mode 100644 android/app/src/main/java/cn/toside/music/mobile/crypto/RSA.java create mode 100644 src/utils/nativeModules/crypto.ts create mode 100644 src/utils/nativeModules/cryptoTest.ts create mode 100644 test.js diff --git a/android/app/src/main/java/cn/toside/music/mobile/MainApplication.java b/android/app/src/main/java/cn/toside/music/mobile/MainApplication.java index f6b773c..98a209f 100644 --- a/android/app/src/main/java/cn/toside/music/mobile/MainApplication.java +++ b/android/app/src/main/java/cn/toside/music/mobile/MainApplication.java @@ -11,6 +11,7 @@ import com.facebook.soloader.SoLoader; import java.util.List; import cn.toside.music.mobile.cache.CachePackage; +import cn.toside.music.mobile.crypto.CryptoPackage; import cn.toside.music.mobile.gzip.GzipPackage; import cn.toside.music.mobile.lyric.LyricPackage; import cn.toside.music.mobile.utils.UtilsPackage; @@ -34,6 +35,7 @@ public class MainApplication extends NavigationApplication { packages.add(new GzipPackage()); packages.add(new LyricPackage()); packages.add(new UtilsPackage()); + packages.add(new CryptoPackage()); return packages; } diff --git a/android/app/src/main/java/cn/toside/music/mobile/crypto/AES.java b/android/app/src/main/java/cn/toside/music/mobile/crypto/AES.java new file mode 100644 index 0000000..bfd8f56 --- /dev/null +++ b/android/app/src/main/java/cn/toside/music/mobile/crypto/AES.java @@ -0,0 +1,98 @@ +package cn.toside.music.mobile.crypto; + +import android.util.Base64; + +import java.nio.charset.StandardCharsets; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class AES { + private static final String AES_MODE_CBC_PKCS7Padding = "AES/CBC/PKCS7Padding"; + private static final String AES_MODE_ECB_NoPadding = "AES/ECB/NoPadding"; + + private static byte[] decodeBase64(String data) { + return Base64.decode(data, Base64.DEFAULT); + } + + private static String encodeBase64(byte[] data) { + return new String(Base64.encode(data, Base64.NO_WRAP), StandardCharsets.UTF_8); + } + + public static String encrypt(byte[] data, byte[] key, byte[] iv, String mode) { + String encryptedBase64 = ""; + try { + Cipher cipher = Cipher.getInstance(mode); + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + byte[] finalIvs = new byte[16]; + int len = Math.min(iv.length, 16); + System.arraycopy(iv, 0, finalIvs, 0, len); + IvParameterSpec ivps = new IvParameterSpec(finalIvs); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps); + encryptedBase64 = encodeBase64(cipher.doFinal(data)); + } catch (Exception e) { + e.printStackTrace(); + } + + return encryptedBase64; + } + + public static String encrypt(byte[] data, byte[] key, String mode) { + String encryptedBase64 = ""; + try { + Cipher cipher = Cipher.getInstance(mode); + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); + encryptedBase64 = encodeBase64(cipher.doFinal(data)); + } catch (Exception e) { + e.printStackTrace(); + } + + return encryptedBase64; + } + + public static String encrypt(String data, String key, String iv, String mode) { + return "".equals(iv) ? encrypt(decodeBase64(data), decodeBase64(key), mode) + : encrypt(decodeBase64(data), decodeBase64(key), decodeBase64(iv), mode); + } + + + public static String decrypt(byte[] data, byte[] key, byte[] iv, String mode) { + String decryptedString = ""; + try { + Cipher cipher = Cipher.getInstance(mode); + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + byte[] finalIvs = new byte[16]; + int len = Math.min(iv.length, 16); + System.arraycopy(iv, 0, finalIvs, 0, len); + IvParameterSpec ivps = new IvParameterSpec(finalIvs); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivps); + decryptedString = new String(cipher.doFinal(data), StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + } + + return decryptedString; + } + + public static String decrypt(byte[] data, byte[] key, String mode) { + String decryptedString = ""; + try { + Cipher cipher = Cipher.getInstance(mode); + SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + decryptedString = new String(cipher.doFinal(data), StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + } + + return decryptedString; + } + + public static String decrypt(String data, String key, String iv, String mode) { + return "".equals(iv) ? decrypt(decodeBase64(data), decodeBase64(key), mode) + : decrypt(decodeBase64(data), decodeBase64(key), decodeBase64(iv), mode); + } + +} diff --git a/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoModule.java b/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoModule.java new file mode 100644 index 0000000..83b6649 --- /dev/null +++ b/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoModule.java @@ -0,0 +1,141 @@ +package cn.toside.music.mobile.crypto; + +import android.util.Base64; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.WritableMap; + +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.security.spec.PKCS8EncodedKeySpec; + +public class CryptoModule extends ReactContextBaseJavaModule { + private final ReactApplicationContext reactContext; + + CryptoModule(ReactApplicationContext reactContext) { + super(reactContext); + this.reactContext = reactContext; + } + + @Override + public String getName() { + return "CryptoModule"; + } + + @ReactMethod + public void generateRsaKey(Promise promise) { + KeyPair kp = RSA.getKeyPair(); + String publicKeyBytesBase64 = new String(Base64.encode(kp.getPublic().getEncoded(), Base64.DEFAULT)); + + KeyFactory keyFac; + try { + keyFac = KeyFactory.getInstance("RSA"); + } catch (NoSuchAlgorithmException e) { + promise.reject("-1", e.toString()); + return; + } + KeySpec keySpec = new PKCS8EncodedKeySpec(kp.getPrivate().getEncoded()); + Key key; + try { + key = keyFac.generatePrivate(keySpec); + } catch (InvalidKeySpecException e) { + promise.reject("-1", e.toString()); + return; + } + String privateKeyBytesBase64 = new String(Base64.encode(key.getEncoded(), Base64.DEFAULT)); + WritableMap params = Arguments.createMap(); + params.putString("publicKey", publicKeyBytesBase64); + params.putString("privateKey", privateKeyBytesBase64); + promise.resolve(params); + } + + @ReactMethod + public void rsaEncrypt(String text, String key, String padding, Promise promise) { + promise.resolve(RSA.encryptRSAToString(text, key, padding)); + // TaskRunner taskRunner = new TaskRunner(); + // try { + // taskRunner.executeAsync(new GzipModule.UnGzip(source, target, force), (String errMessage) -> { + // if ("".equals(errMessage)) { + // promise.resolve(null); + // } else promise.reject("-2", errMessage); + // }); + // } catch (RuntimeException err) { + // promise.reject("-2", err.getMessage()); + // } + } + + @ReactMethod + public void rsaDecrypt(String text, String key, String padding, Promise promise) { + promise.resolve(RSA.decryptRSAToString(text, key, padding)); + // TaskRunner taskRunner = new TaskRunner(); + // try { + // taskRunner.executeAsync(new GzipModule.UnGzip(source, target, force), (String errMessage) -> { + // if ("".equals(errMessage)) { + // promise.resolve(null); + // } else promise.reject("-2", errMessage); + // }); + // } catch (RuntimeException err) { + // promise.reject("-2", err.getMessage()); + // } + } + + @ReactMethod(isBlockingSynchronousMethod = true) + public String rsaEncryptSync(String text, String key, String padding) { + return RSA.encryptRSAToString(text, key, padding); + } + + @ReactMethod(isBlockingSynchronousMethod = true) + public String rsaDecryptSync(String text, String key, String padding) { + return RSA.decryptRSAToString(text, key, padding); + } + + @ReactMethod + public void aesEncrypt(String text, String key, String iv, String mode, Promise promise) { + promise.resolve(AES.encrypt(text, key, iv, mode)); + // TaskRunner taskRunner = new TaskRunner(); + // try { + // taskRunner.executeAsync(new GzipModule.UnGzip(source, target, force), (String errMessage) -> { + // if ("".equals(errMessage)) { + // promise.resolve(null); + // } else promise.reject("-2", errMessage); + // }); + // } catch (RuntimeException err) { + // promise.reject("-2", err.getMessage()); + // } + } + + @ReactMethod + public void aesDecrypt(String text, String key, String iv, String mode, Promise promise) { + promise.resolve(AES.decrypt(text, key, iv, mode)); + // TaskRunner taskRunner = new TaskRunner(); + // try { + // taskRunner.executeAsync(new GzipModule.UnGzip(source, target, force), (String errMessage) -> { + // if ("".equals(errMessage)) { + // promise.resolve(null); + // } else promise.reject("-2", errMessage); + // }); + // } catch (RuntimeException err) { + // promise.reject("-2", err.getMessage()); + // } + } + + @ReactMethod(isBlockingSynchronousMethod = true) + public String aesEncryptSync(String text, String key, String iv, String mode) { + return AES.encrypt(text, key, iv, mode); + } + + @ReactMethod(isBlockingSynchronousMethod = true) + public String aesDecryptSync(String text, String key, String iv, String mode) { + return AES.decrypt(text, key, iv, mode); + } + +} + diff --git a/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoPackage.java b/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoPackage.java new file mode 100644 index 0000000..b12ff97 --- /dev/null +++ b/android/app/src/main/java/cn/toside/music/mobile/crypto/CryptoPackage.java @@ -0,0 +1,23 @@ +package cn.toside.music.mobile.crypto; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CryptoPackage implements ReactPackage { + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + return Arrays.asList(new CryptoModule(reactContext)); + } +} diff --git a/android/app/src/main/java/cn/toside/music/mobile/crypto/RSA.java b/android/app/src/main/java/cn/toside/music/mobile/crypto/RSA.java new file mode 100644 index 0000000..4bb8f6f --- /dev/null +++ b/android/app/src/main/java/cn/toside/music/mobile/crypto/RSA.java @@ -0,0 +1,113 @@ +package cn.toside.music.mobile.crypto; + +import android.util.Base64; + +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.spec.KeySpec; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +import javax.crypto.Cipher; + +public class RSA { + static final String PADDING_OAEPWithSHA1AndMGF1Padding = "RSA/ECB/OAEPWithSHA1AndMGF1Padding"; + static final String PADDING_NoPadding = "RSA/ECB/NoPadding"; + + // https://stackoverflow.com/a/40978042 +// public void testEncryptData(String dataToEncrypt) throws NoSuchAlgorithmException, InvalidKeySpecException { +// // generate a new public/private key pair to test with (note. you should only do this once and keep them!) +// KeyPair kp = getKeyPair(); +// +// PublicKey publicKey = kp.getPublic(); +// byte[] publicKeyBytes = publicKey.getEncoded(); +// String publicKeyBytesBase64 = new String(Base64.encode(publicKeyBytes, Base64.DEFAULT)); +// Log.d("RSATest", "publicKeyBytesBase64: " + publicKeyBytesBase64); +// +// PrivateKey privateKey = kp.getPrivate(); +// KeyFactory keyFac = KeyFactory.getInstance("RSA"); +// KeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded()); +// Key key = keyFac.generatePrivate(keySpec); +// +// StringBuilder sb = new StringBuilder(); +// sb.append("-----BEGIN PRIVATE KEY-----"); +// sb.append(new String(Base64.encode(key.getEncoded(), Base64.DEFAULT))); +// sb.append("-----END PRIVATE KEY-----"); +// Log.d("RSATest", "privateKeyBytesBase64: " + sb); +// +// // return new String(Base64.encode(sb.toString().getBytes())); +// +// byte[] privateKeyBytes = privateKey.getEncoded(); +// String privateKeyBytesBase64 = new String(Base64.encode(privateKeyBytes, Base64.DEFAULT)); +// Log.d("RSATest", "privateKeyBytesBase64: " + privateKeyBytesBase64); +// +// // test encryption +// String encrypted = encryptRSAToString(dataToEncrypt, publicKeyBytesBase64); +// +// Log.d("RSATest", "encrypted: " + encrypted); +// +// // test decryption +// String decrypted = decryptRSAToString(encrypted, privateKeyBytesBase64); +// +// Log.d("RSATest", "decrypted: " + decrypted); +// } + + public static KeyPair getKeyPair() { + KeyPair kp = null; + try { + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); + kpg.initialize(2048); + kp = kpg.generateKeyPair(); + } catch (Exception e) { + e.printStackTrace(); + } + + return kp; + } + + public static String encryptRSAToString(String decryptedBase64, String publicKey, String padding) { + String encryptedBase64 = ""; + try { + KeyFactory keyFac = KeyFactory.getInstance("RSA"); + KeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKey.trim().getBytes(), Base64.DEFAULT)); + Key key = keyFac.generatePublic(keySpec); + + // get an RSA cipher object and print the provider + final Cipher cipher = Cipher.getInstance(padding); + // encrypt the plain text using the public key + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] encryptedBytes = cipher.doFinal(Base64.decode(decryptedBase64, Base64.DEFAULT)); + encryptedBase64 = new String(Base64.encode(encryptedBytes, Base64.NO_WRAP)); + } catch (Exception e) { + e.printStackTrace(); + } + + return encryptedBase64; + } + + public static String decryptRSAToString(String encryptedBase64, String privateKey, String padding) { + + String decryptedString = ""; + try { + KeyFactory keyFac = KeyFactory.getInstance("RSA"); + KeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey.trim().getBytes(), Base64.DEFAULT)); + Key key = keyFac.generatePrivate(keySpec); + + // get an RSA cipher object and print the provider + final Cipher cipher = Cipher.getInstance(padding); + // encrypt the plain text using the public key + cipher.init(Cipher.DECRYPT_MODE, key); + + byte[] encryptedBytes = Base64.decode(encryptedBase64, Base64.DEFAULT); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + decryptedString = new String(decryptedBytes); + } catch (Exception e) { + e.printStackTrace(); + } + + return decryptedString; + } +} diff --git a/metro.config.js b/metro.config.js index db38965..d7750d4 100644 --- a/metro.config.js +++ b/metro.config.js @@ -16,8 +16,8 @@ module.exports = { }, resolver: { extraNodeModules: { - crypto: require.resolve('react-native-quick-crypto'), - stream: require.resolve('stream-browserify'), + // crypto: require.resolve('react-native-quick-crypto'), + // stream: require.resolve('stream-browserify'), buffer: require.resolve('@craftzdog/react-native-buffer'), }, }, diff --git a/package-lock.json b/package-lock.json index 132519d..9df329f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "react-native-navigation": "^7.32.1", "react-native-pager-view": "^6.2.0", "react-native-quick-base64": "^2.0.5", - "react-native-quick-crypto": "github:lyswhut/react-native-quick-crypto#b4ea59238ded4fe9cd4d252a838ddfcb7bcd19d8", "react-native-quick-md5": "^3.0.4", "react-native-track-player": "github:lyswhut/react-native-track-player#879d3dc6b7ad41f736943d7495be0ba87b4cf050", "react-native-vector-icons": "^9.2.0" @@ -3914,22 +3913,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -4204,11 +4187,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4229,89 +4207,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -4375,11 +4270,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -4575,15 +4465,6 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -4952,45 +4833,6 @@ "node": ">=4" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5006,27 +4848,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -5147,15 +4968,6 @@ "prop-types": "*" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5165,21 +4977,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5215,25 +5012,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz", "integrity": "sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==" }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6161,23 +5939,6 @@ "node": ">=6" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -7130,47 +6891,6 @@ "node": ">=0.10.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hermes-estree": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.8.0.tgz", @@ -7203,16 +6923,6 @@ "node": ">= 8" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -8715,16 +8425,6 @@ "node": ">=0.10.0" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -9431,23 +9131,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -9486,16 +9169,6 @@ "node": ">=6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10135,18 +9808,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -10215,21 +9876,6 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -10417,24 +10063,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -10474,23 +10102,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -10697,30 +10308,6 @@ "react-native": "*" } }, - "node_modules/react-native-quick-crypto": { - "version": "0.5.0", - "resolved": "git+ssh://git@github.com/lyswhut/react-native-quick-crypto.git#b4ea59238ded4fe9cd4d252a838ddfcb7bcd19d8", - "integrity": "sha512-LB8PoJsWgwyUpyZxEfgQ8L9oa/F1wk0Uq5PFGpv8jR3mFZ7U3GH6XqfdWjl/ZOZuZkAGai2jxR1quv1zwqPsNg==", - "license": "MIT", - "dependencies": { - "@craftzdog/react-native-buffer": "^6.0.4", - "@types/node": "^17.0.31", - "crypto-browserify": "^3.12.0", - "events": "^3.3.0", - "react-native-quick-base64": "^2.0.2", - "stream-browserify": "^3.0.0", - "string_decoder": "^1.3.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-quick-crypto/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, "node_modules/react-native-quick-md5": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-native-quick-md5/-/react-native-quick-md5-3.0.4.tgz", @@ -11181,15 +10768,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11397,18 +10975,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -11872,15 +11438,6 @@ "node": ">= 0.6" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -15535,24 +15092,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -15766,11 +15305,6 @@ "readable-stream": "^3.4.0" } }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -15788,77 +15322,6 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -15892,11 +15355,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -16032,15 +15490,6 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -16344,47 +15793,6 @@ } } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -16397,24 +15805,6 @@ "which": "^2.0.1" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -16503,37 +15893,11 @@ "prop-types": "*" } }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -16563,27 +15927,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz", "integrity": "sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==" }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -17264,20 +16607,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -17999,32 +17328,6 @@ } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "hermes-estree": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.8.0.tgz", @@ -18053,16 +17356,6 @@ } } }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -19175,16 +18468,6 @@ "object-visit": "^1.0.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -19769,22 +19052,6 @@ "picomatch": "^2.3.1" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -19808,16 +19075,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -20284,18 +19541,6 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -20343,18 +19588,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -20497,26 +19730,6 @@ } } }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -20539,23 +19752,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -20781,27 +19977,6 @@ "base64-js": "^1.5.1" } }, - "react-native-quick-crypto": { - "version": "git+ssh://git@github.com/lyswhut/react-native-quick-crypto.git#b4ea59238ded4fe9cd4d252a838ddfcb7bcd19d8", - "integrity": "sha512-LB8PoJsWgwyUpyZxEfgQ8L9oa/F1wk0Uq5PFGpv8jR3mFZ7U3GH6XqfdWjl/ZOZuZkAGai2jxR1quv1zwqPsNg==", - "from": "react-native-quick-crypto@github:lyswhut/react-native-quick-crypto#b4ea59238ded4fe9cd4d252a838ddfcb7bcd19d8", - "requires": { - "@craftzdog/react-native-buffer": "^6.0.4", - "@types/node": "^17.0.31", - "crypto-browserify": "^3.12.0", - "events": "^3.3.0", - "react-native-quick-base64": "^2.0.2", - "stream-browserify": "^3.0.0", - "string_decoder": "^1.3.0" - }, - "dependencies": { - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - } - } - }, "react-native-quick-md5": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-native-quick-md5/-/react-native-quick-md5-3.0.4.tgz", @@ -21064,15 +20239,6 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -21236,15 +20402,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -21615,15 +20772,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", diff --git a/package.json b/package.json index 5a669cb..b9b0e11 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "react-native-navigation": "^7.32.1", "react-native-pager-view": "^6.2.0", "react-native-quick-base64": "^2.0.5", - "react-native-quick-crypto": "github:lyswhut/react-native-quick-crypto#b4ea59238ded4fe9cd4d252a838ddfcb7bcd19d8", "react-native-quick-md5": "^3.0.4", "react-native-track-player": "github:lyswhut/react-native-track-player#879d3dc6b7ad41f736943d7495be0ba87b4cf050", "react-native-vector-icons": "^9.2.0" diff --git a/publish/changeLog.md b/publish/changeLog.md index 5f34864..eeb26c0 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -8,6 +8,7 @@ - 修复在线列表的多选问题 - 修复mg搜索不显示时长的问题(@Folltoshe) - 修复mg评论加载失败的问题(@Folltoshe) +- 修复在Android 5.1下报错的问题 ### 其他 diff --git a/src/app.ts b/src/app.ts index 69904bb..eaaadae 100644 --- a/src/app.ts +++ b/src/app.ts @@ -36,6 +36,8 @@ const handleInit = async() => { initNavigation(async() => { await handleInit() if (!isInited) return + // import('@/utils/nativeModules/cryptoTest') + await navigations.pushHomeScreen().then(() => { handlePushedHomeScreen() }).catch((err: any) => { diff --git a/src/core/leaderboard.ts b/src/core/leaderboard.ts index 9229559..de31395 100644 --- a/src/core/leaderboard.ts +++ b/src/core/leaderboard.ts @@ -11,8 +11,8 @@ import musicSdk from '@/utils/musicSdk' */ export const setListDetailInfo = (id: string) => { clearListDetail() - const [source, bangId] = id.split('__') as [LX.OnlineSource, string] - leaderboardActions.setListDetailInfo(source, bangId) + const [source] = id.split('__') as [LX.OnlineSource, string] + leaderboardActions.setListDetailInfo(source, id) } export const setListDetail = (result: ListDetailInfo, id: string, page: number) => { return leaderboardActions.setListDetail(result, id, page) diff --git a/src/plugins/sync/client/utils.ts b/src/plugins/sync/client/utils.ts index a8ddd1b..734c5e0 100644 --- a/src/plugins/sync/client/utils.ts +++ b/src/plugins/sync/client/utils.ts @@ -1,4 +1,4 @@ -import { generateKeyPair } from 'crypto' +// import { generateKeyPair } from 'crypto' import BackgroundTimer from 'react-native-background-timer' export const request = async(url: string, { timeout = 10000, ...options }: RequestInit & { timeout?: number } = {}) => { @@ -37,34 +37,35 @@ export const request = async(url: string, { timeout = 10000, ...options }: Reque // return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString() // } -export const generateRsaKey = async() => new Promise<{ publicKey: string, privateKey: string }>((resolve, reject) => { - generateKeyPair( - 'rsa', - { - modulusLength: 2048, // It holds a number. It is the key size in bits and is applicable for RSA, and DSA algorithm only. - publicKeyEncoding: { - type: 'spki', // Note the type is pkcs1 not spki - format: 'pem', - }, - privateKeyEncoding: { - type: 'pkcs8', // Note again the type is set to pkcs1 - format: 'pem', - // cipher: "aes-256-cbc", //Optional - // passphrase: "", //Optional - }, - }, - (err, publicKey, privateKey) => { - if (err) { - reject(err) - return - } - resolve({ - publicKey, - privateKey, - }) - }, - ) -}) +export { generateRsaKey } from '@/utils/nativeModules/crypto' +// export const generateRsaKey = async() => new Promise<{ publicKey: string, privateKey: string }>((resolve, reject) => { +// generateKeyPair( +// 'rsa', +// { +// modulusLength: 2048, // It holds a number. It is the key size in bits and is applicable for RSA, and DSA algorithm only. +// publicKeyEncoding: { +// type: 'spki', // Note the type is pkcs1 not spki +// format: 'pem', +// }, +// privateKeyEncoding: { +// type: 'pkcs8', // Note again the type is set to pkcs1 +// format: 'pem', +// // cipher: "aes-256-cbc", //Optional +// // passphrase: "", //Optional +// }, +// }, +// (err, publicKey, privateKey) => { +// if (err) { +// reject(err) +// return +// } +// resolve({ +// publicKey, +// privateKey, +// }) +// }, +// ) +// }) export const encryptMsg = (keyInfo: LX.Sync.KeyInfo, msg: string): string => { diff --git a/src/plugins/sync/utils.ts b/src/plugins/sync/utils.ts index 4926bbc..79a2c60 100644 --- a/src/plugins/sync/utils.ts +++ b/src/plugins/sync/utils.ts @@ -1,24 +1,30 @@ -import { createCipheriv, createDecipheriv, publicEncrypt, privateDecrypt, constants } from 'crypto' +// import { createCipheriv, createDecipheriv, publicEncrypt, privateDecrypt, constants } from 'crypto' +import { aesEncryptSync, aesDecryptSync, rsaEncryptSync, rsaDecryptSync, AES_MODE, RSA_PADDING } from '@/utils/nativeModules/crypto' +import { btoa } from 'react-native-quick-base64' import { LIST_IDS } from '@/config/constant' import { getListMusics } from '@/core/list' import { userLists } from '@/utils/listManage' -export const aesEncrypt = (text: string, key: string) => { - const cipher = createCipheriv('aes-128-ecb', Buffer.from(key, 'base64'), '') - return Buffer.concat([cipher.update(Buffer.from(text)), cipher.final()]).toString('base64') +export const aesEncrypt = (text: string, b64Key: string) => { + // const cipher = createCipheriv('aes-128-ecb', Buffer.from(key, 'base64'), '') + // return Buffer.concat([cipher.update(Buffer.from(text)), cipher.final()]).toString('base64') + return aesEncryptSync(btoa(text), b64Key, '', AES_MODE.ECB_128_NoPadding) } -export const aesDecrypt = (text: string, key: string) => { - const decipher = createDecipheriv('aes-128-ecb', Buffer.from(key, 'base64'), '') - return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString() +export const aesDecrypt = (text: string, b64Key: string) => { + // const decipher = createDecipheriv('aes-128-ecb', Buffer.from(key, 'base64'), '') + // return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString() + return aesDecryptSync(btoa(text), b64Key, '', AES_MODE.ECB_128_NoPadding) } export const rsaEncrypt = (buffer: Buffer, key: string): string => { - return publicEncrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer).toString('base64') + // return publicEncrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer).toString('base64') + return rsaEncryptSync(buffer.toString('base64'), key, RSA_PADDING.OAEPWithSHA1AndMGF1Padding) } -export const rsaDecrypt = (buffer: Buffer, key: string): Buffer => { - return privateDecrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer) +export const rsaDecrypt = (buffer: Buffer, key: string): string => { + // return privateDecrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer) + return rsaDecryptSync(buffer.toString('base64'), key, RSA_PADDING.OAEPWithSHA1AndMGF1Padding) } export const getLocalListData = async(): Promise => { diff --git a/src/types/shims.d.ts b/src/types/shims.d.ts index 3031be1..2f07a8a 100644 --- a/src/types/shims.d.ts +++ b/src/types/shims.d.ts @@ -1,5 +1,5 @@ -declare module 'crypto' { - import crypto from 'react-native-quick-crypto' - export default crypto -} +// declare module 'crypto' { +// import crypto from 'react-native-quick-crypto' +// export default crypto +// } diff --git a/src/utils/musicSdk/utils.js b/src/utils/musicSdk/utils.js index e0ee37f..690398d 100644 --- a/src/utils/musicSdk/utils.js +++ b/src/utils/musicSdk/utils.js @@ -1,4 +1,4 @@ -import crypto from 'crypto' +import { stringMd5 } from 'react-native-quick-md5' /** * 获取音乐音质 @@ -18,4 +18,4 @@ export const getMusicType = (info, type) => { return '128k' } -export const toMD5 = str => crypto.createHash('md5').update(str).digest('hex') +export const toMD5 = str => stringMd5(str) diff --git a/src/utils/musicSdk/wy/utils/crypto.js b/src/utils/musicSdk/wy/utils/crypto.js index ce365dd..c5874b3 100644 --- a/src/utils/musicSdk/wy/utils/crypto.js +++ b/src/utils/musicSdk/wy/utils/crypto.js @@ -1,40 +1,46 @@ // https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/util/crypto.js -import { createCipheriv, createDecipheriv, publicEncrypt, randomBytes, createHash } from 'crypto' -const iv = Buffer.from('0102030405060708') -const presetKey = Buffer.from('0CoJUm6Qyw8W8jud') -const linuxapiKey = Buffer.from('rFgB&h#%2?^eDg:Q') -const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' +import { btoa } from 'react-native-quick-base64' +import { aesEncryptSync, aesDecryptSync, rsaEncryptSync, AES_MODE, RSA_PADDING } from '@/utils/nativeModules/crypto' +import { toMD5 } from '../../utils' +const iv = btoa('0102030405060708') +const presetKey = btoa('0CoJUm6Qyw8W8jud') +const linuxapiKey = btoa('rFgB&h#%2?^eDg:Q') +// const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' const publicKey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6sXqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9SdB1Ua44oncaTWz7OBGLbCiK45wIDAQAB\n-----END PUBLIC KEY-----' -const eapiKey = 'e82ckenh8dichen8' +const eapiKey = btoa('e82ckenh8dichen8') -const aesEncrypt = (buffer, mode, key, iv) => { - const cipher = createCipheriv(mode, key, iv) - return Buffer.concat([cipher.update(buffer), cipher.final()]) + +const aesEncrypt = (b64, mode, key, iv) => { + // console.log(b64, mode, key, iv) + // const cipher = createCipheriv(mode, key, iv) + // return Buffer.concat([cipher.update(buffer), cipher.final()]) + return aesEncryptSync(b64, key, iv, mode) } -const aesDecrypt = function(cipherBuffer, mode, key, iv) { - let decipher = createDecipheriv(mode, key, iv) - return Buffer.concat([decipher.update(cipherBuffer), decipher.final()]) +const aesDecrypt = (b64, mode, key, iv) => { + // let decipher = createDecipheriv(mode, key, iv) + // return Buffer.concat([decipher.update(b64), decipher.final()]) + return aesDecryptSync(b64, key, iv, mode) } const rsaEncrypt = (buffer, key) => { buffer = Buffer.concat([Buffer.alloc(128 - buffer.length), buffer]) - return publicEncrypt({ key, padding: 3 }, buffer) + return Buffer.from(rsaEncryptSync(buffer.toString('base64'), key, RSA_PADDING.NoPadding), 'base64') } export const weapi = object => { const text = JSON.stringify(object) - const secretKey = randomBytes(16).map(n => (base62.charAt(n % 62).charCodeAt())) + const secretKey = String(Math.random()).substring(2, 18) return { - params: aesEncrypt(Buffer.from(aesEncrypt(Buffer.from(text), 'aes-128-cbc', presetKey, iv).toString('base64')), 'aes-128-cbc', secretKey, iv).toString('base64'), - encSecKey: rsaEncrypt(secretKey.reverse(), publicKey).toString('hex'), + params: aesEncrypt(btoa(aesEncrypt(btoa(text), AES_MODE.CBC_128_PKCS7Padding, presetKey, iv)), AES_MODE.CBC_128_PKCS7Padding, btoa(secretKey), iv), + encSecKey: rsaEncrypt(Buffer.from(secretKey).reverse(), publicKey).toString('hex'), } } export const linuxapi = object => { const text = JSON.stringify(object) return { - eparams: aesEncrypt(Buffer.from(text), 'aes-128-ecb', linuxapiKey, '').toString('hex').toUpperCase(), + eparams: Buffer.from(aesEncrypt(btoa(text), AES_MODE.ECB_128_NoPadding, linuxapiKey, ''), 'base64').toString('hex').toUpperCase(), } } @@ -42,13 +48,13 @@ export const linuxapi = object => { export const eapi = (url, object) => { const text = typeof object === 'object' ? JSON.stringify(object) : object const message = `nobody${url}use${text}md5forencrypt` - const digest = createHash('md5').update(message).digest('hex') + const digest = toMD5(message) const data = `${url}-36cd479b6b5-${text}-36cd479b6b5-${digest}` return { - params: aesEncrypt(Buffer.from(data), 'aes-128-ecb', eapiKey, '').toString('hex').toUpperCase(), + params: Buffer.from(aesEncrypt(Buffer.from(data).toString('base64'), AES_MODE.ECB_128_NoPadding, eapiKey, ''), 'base64').toString('hex').toUpperCase(), } } export const eapiDecrypt = cipherBuffer => { - return aesDecrypt(cipherBuffer, 'aes-128-ecb', eapiKey, '').toString() + return aesDecrypt(cipherBuffer, AES_MODE.ECB_128_NoPadding, eapiKey, '').toString() } diff --git a/src/utils/nativeModules/crypto.ts b/src/utils/nativeModules/crypto.ts new file mode 100644 index 0000000..c7e1855 --- /dev/null +++ b/src/utils/nativeModules/crypto.ts @@ -0,0 +1,87 @@ +import { NativeModules } from 'react-native' + +const { CryptoModule } = NativeModules + +// export const testRsa = (text: string, key: string) => { +// // console.log(sourceFilePath, targetFilePath) +// return CryptoModule.testRsa() +// } + +enum KEY_PREFIX { + publicKeyStart = '-----BEGIN PUBLIC KEY-----', + publicKeyEnd = '-----END PUBLIC KEY-----', + privateKeyStart = '-----BEGIN PRIVATE KEY-----', + privateKeyEnd = '-----END PRIVATE KEY-----', +} + +export enum RSA_PADDING { + OAEPWithSHA1AndMGF1Padding = 'RSA/ECB/OAEPWithSHA1AndMGF1Padding', + NoPadding = 'RSA/ECB/NoPadding', +} + +export enum AES_MODE { + CBC_128_PKCS7Padding = 'AES/CBC/PKCS7Padding', + ECB_128_NoPadding = 'AES', +} + +export const generateRsaKey = async() => { + // console.log(sourceFilePath, targetFilePath) + const key = await CryptoModule.generateRsaKey() as { publicKey: string, privateKey: string } + return { + publicKey: `${KEY_PREFIX.publicKeyStart}\n${key.publicKey}${KEY_PREFIX.publicKeyEnd}`, + privateKey: `${KEY_PREFIX.privateKeyStart}\n${key.privateKey}${KEY_PREFIX.privateKeyEnd}`, + } +} + +export const rsaEncrypt = async(text: string, key: string, padding: RSA_PADDING): Promise => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.rsaEncrypt(text, key + .replace(KEY_PREFIX.publicKeyStart, '') + .replace(KEY_PREFIX.publicKeyEnd, ''), + padding) +} + +export const rsaDecrypt = async(text: string, key: string, padding: RSA_PADDING): Promise => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.rsaDecrypt(text, key + .replace(KEY_PREFIX.privateKeyStart, '') + .replace(KEY_PREFIX.privateKeyEnd, ''), + padding) +} + +export const rsaEncryptSync = (text: string, key: string, padding: RSA_PADDING): string => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.rsaEncryptSync(text, key + .replace(KEY_PREFIX.publicKeyStart, '') + .replace(KEY_PREFIX.publicKeyEnd, ''), + padding) +} + +export const rsaDecryptSync = (text: string, key: string, padding: RSA_PADDING): string => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.rsaDecryptSync(text, key + .replace(KEY_PREFIX.privateKeyStart, '') + .replace(KEY_PREFIX.privateKeyEnd, ''), + padding) +} + + +export const aesEncrypt = async(text: string, key: string, vi: string, mode: AES_MODE): Promise => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.aesEncrypt(text, key, vi, mode) +} + +export const aesDecrypt = async(text: string, key: string, vi: string, mode: AES_MODE): Promise => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.aesDecrypt(text, key, vi, mode) +} + +export const aesEncryptSync = (text: string, key: string, vi: string, mode: AES_MODE): string => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.aesEncryptSync(text, key, vi, mode) +} + +export const aesDecryptSync = (text: string, key: string, vi: string, mode: AES_MODE): string => { + // console.log(sourceFilePath, targetFilePath) + return CryptoModule.aesDecryptSync(text, key, vi, mode) +} diff --git a/src/utils/nativeModules/cryptoTest.ts b/src/utils/nativeModules/cryptoTest.ts new file mode 100644 index 0000000..bec72ad --- /dev/null +++ b/src/utils/nativeModules/cryptoTest.ts @@ -0,0 +1,75 @@ +import { + rsaEncrypt, + rsaDecrypt, + RSA_PADDING, + generateRsaKey, + AES_MODE, + aesEncrypt, + aesDecrypt, +} from '@/utils/nativeModules/crypto' + + +const publicKey = ` +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4U2m4fBhTkQOOeAlEusFCDa28UI3xZqv +5EGiOZCJ2bH1LfBjwG5dL3Zk2vT6XLaAn7vyXwVYNmdDn4Fa3l8fZndCty1aUAkpxZehZVy/0I+z +Q7QwSvzQpv2yHPQ76Kcuc3E7VEMSPZkx71dQpsDBtE/F04TW6zOxomFcbqUA97QsjNwU8KKSKKJR +2FhjEX0WhJpvDrkAKQBEujwf3pQDa8iUuF4F0v+oCKiSEf6tuWYx5iBpOvXUmZDLPeBnVZuvJM0e +2yXaIYeZorDaosIvCEqVcDPT3gvePZp6eTyffRJmqk7OkyG2epWM1XPXynu85BYK91pZ03YRNBrp +OkdU7wIDAQAB +-----END PUBLIC KEY----- +` +const privateKey = ` +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDhTabh8GFORA454CUS6wUINrbx +QjfFmq/kQaI5kInZsfUt8GPAbl0vdmTa9PpctoCfu/JfBVg2Z0OfgVreXx9md0K3LVpQCSnFl6Fl +XL/Qj7NDtDBK/NCm/bIc9Dvopy5zcTtUQxI9mTHvV1CmwMG0T8XThNbrM7GiYVxupQD3tCyM3BTw +opIoolHYWGMRfRaEmm8OuQApAES6PB/elANryJS4XgXS/6gIqJIR/q25ZjHmIGk69dSZkMs94GdV +m68kzR7bJdohh5misNqiwi8ISpVwM9PeC949mnp5PJ99EmaqTs6TIbZ6lYzVc9fKe7zkFgr3WlnT +dhE0Guk6R1TvAgMBAAECggEAOTnF94Fc1cpHar/Z6tIy9wEeumy9Sb2ei3V4RPLHcLnYspBqZcgi +dxm1SEAND1tzlB7i0uvCmh7keDEc6XpzuUz1bx1f4RBSwdNftSU3uzukpr+vvHw2axPpF52ZUeCU +1dGe5iobCfZNTqN44sH28VuJvc3x4M/CgKIGHjxe4IsyxFCIBpitjk829ymWqlUp/xdVxYfY+WFQ +7/SgA48MU2ASyQVzBA4Q3MQ1d8Fn7Ogd+nYdCGaMfRvO0MI9DcB6uj6KoNZ2VxZkT6eXNEkbzCJR +mbsHfWUx39HVGmlKvZefvryYKJoui1jAZw24F2h8WtBkeGIZ3DgyR9QLQaVT4QKBgQD/HkZUcYXw +I8To/YDtO7i0UZ+vj95PHkfYsWizW1pUiFMHc2jxsyXcjYoKebf8gogKAYnwMxs9iZNkQ4V6zAHi +zeE9C3SwMvh4l6MGJo10+/VmD3SaGZpHEs38HPyXqqqIsQEQq/WDiOMeacTY06AzeIAbW1lVHcTA +Xa8N3TOVuQKBgQDiFP9PAy0trTE8lozQHINytluXlsJap3WcRkGxOTR0v8YLHWYVXMQYo+s4s2Qx +t48nwtBeDEI7OVMA2ip7mAC1IwNObYarLztyB1Vz2FJgVpyj63TdTUaxsiOeAbkLzo4r0TCZnuqi +wdkhAWGu4i3hRrnXe6sbb2Dv4zYysNKT5wKBgQCTjN8AV+gvS4DHgFbg3nmlUNAaqgrZl5nWKkVz +9pH38iCTXpyDrilntjTwehV/Zb9oihtNYUGQBdHJW4QH0ZYFpy1uMQH8Jn6uwIT5ObL2xgLYVHgL +6GLiWG3qMpmk3oBjLnx/N/V3beRt4p6HCV7OZhMxv1Obduwklgp46ka7gQKBgQDDGbOpj+gw/sD6 +tEEYZ0LYf55TFvrqGJFaJxcRxXgLOGPDu78YuFFRokOfTtAsR2f2vBvszU9qpHGIzrzSo74YkvqL +d+E7YSs/oCySKCAOmy/aFZtoTwOu3Tf3Zy01jy8JiSETsRxzEC48WWDe9rj5K3u9BTAIIPnaio1+ ++TEACQKBgQCfdfmP/05Q4Yc2wEtLfiuHatiobIBzdrem0lXS3ZsRsabnddkeGoQ2QvoMo1+D1/CA +BL/KT6V2h9E8eNQVIOpwjxjR9wPBeHVSLhRV0Rh0Lkog4tGwvWVOh+W+ICr+s6Xn9xxvMUiL3Uw6 +9qebfBzruW5Gzke5E5/k3K6aCvFm0Q== +-----END PRIVATE KEY----- +` + +// void rsaEncrypt(Buffer.from('hello').toString('base64'), publicKey, RSA_PADDING.OAEPWithSHA1AndMGF1Padding).then((text) => { +// console.log(text) +// void rsaDecrypt(text, privateKey, RSA_PADDING.OAEPWithSHA1AndMGF1Padding).then((text) => { +// console.log(text) +// }) +// }) +// void generateRsaKey().then((key) => { +// console.log(key.publicKey) +// console.log(key.privateKey) +// }) + +const aesKey = Buffer.from('123456789abcdefg').toString('base64') +const vi = Buffer.from('012345678901234a').toString('base64') + +// void aesEncrypt(Buffer.from('hello').toString('base64'), aesKey, vi, AES_MODE.CBC_PKCS7Padding).then((text) => { +// console.log('hello', text) +// void aesDecrypt(text, aesKey, vi, AES_MODE.CBC_PKCS7Padding).then((text) => { +// console.log(text) +// }) +// }) + +// void aesEncrypt(Buffer.from('hello2').toString('base64'), aesKey, '', AES_MODE.ECB_NoPadding).then((text) => { +// console.log('hello2', text) +// void aesDecrypt(text, aesKey, '', AES_MODE.ECB_NoPadding).then((text) => { +// console.log(text) +// }) +// }) diff --git a/test.js b/test.js new file mode 100644 index 0000000..ae0cc9a --- /dev/null +++ b/test.js @@ -0,0 +1,126 @@ +const { publicEncrypt, privateDecrypt, generateKeyPair, createCipheriv, createDecipheriv, constants } = require('crypto') + + +const generateRsaKey = () => new Promise((resolve, reject) => { + generateKeyPair( + 'rsa', + { + modulusLength: 2048, // It holds a number. It is the key size in bits and is applicable for RSA, and DSA algorithm only. + publicKeyEncoding: { + type: 'spki', // Note the type is pkcs1 not spki + format: 'pem', + }, + privateKeyEncoding: { + type: 'pkcs8', // Note again the type is set to pkcs1 + format: 'pem', + // cipher: "aes-256-cbc", //Optional + // passphrase: "", //Optional + }, + }, + (err, publicKey, privateKey) => { + if (err) { + reject(err) + return + } + resolve({ + publicKey, + privateKey, + }) + }, + ) +}) + +// generateRsaKey().then(({ publicKey, privateKey }) => { +// console.log(publicKey) +// console.log(privateKey) +// }) + +const rsaEncrypt = (buffer, key) => { + return publicEncrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer).toString('base64') +} +const rsaDecrypt = (buffer, key) => { + return privateDecrypt({ key, padding: constants.RSA_PKCS1_OAEP_PADDING }, buffer) +} + +const publicKey = ` +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0rggENU2JbXgYGoQBIyqlBJP76mgMKh8 +5gRIUsAwoq/Oj7qEoKYX9jqtnRgAwEPIV7aLMQxGryfm9fGlohDcUPtcF6za5l6L9Szd+0McOCxZ +SY98/pPFdTYnBHRHPrHHYqzqs4y5wPqpFFNrt2z312YS4xy3SYHkooNPxL0OscxejeG9KtmXQmMd +ejm2MxOIuItlqGHpdwInlvY8Wm/gOMvBmPVffsMaNB412xSZA25D3gRNZRO6O28+S2pXRdSbmFX6 +DLWQ/xRDJW1QnfbtjbAJ7Xo1X1anS/NEKRpZqHidjjWI43rL/LhcIAt45a1MkxpBEO+1yCivaNCF +E5jyQwIDAQAB +-----END PUBLIC KEY----- +` +const privateKey = ` +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDSuCAQ1TYlteBgahAEjKqUEk/v +qaAwqHzmBEhSwDCir86PuoSgphf2Oq2dGADAQ8hXtosxDEavJ+b18aWiENxQ+1wXrNrmXov1LN37 +Qxw4LFlJj3z+k8V1NicEdEc+scdirOqzjLnA+qkUU2u3bPfXZhLjHLdJgeSig0/EvQ6xzF6N4b0q +2ZdCYx16ObYzE4i4i2WoYel3AieW9jxab+A4y8GY9V9+wxo0HjXbFJkDbkPeBE1lE7o7bz5LaldF +1JuYVfoMtZD/FEMlbVCd9u2NsAntejVfVqdL80QpGlmoeJ2ONYjjesv8uFwgC3jlrUyTGkEQ77XI +KK9o0IUTmPJDAgMBAAECggEAUCLE0xH6pym9XH1JfSlvv6MdMkQ8jvSslx8+z/WWKXCZqjBhOuUf +jL0xBGK5+mRsvurFkZAdG4SdwZ+2AWXPG58UHU7X6q8/I6z9+I3DoBtBk4eVng1dlR9UhE2iQJYE +gSLImSLmC51oCrpU5ytyL8D6YtOrYrGa3TD595R8j6G8ElDuvgeqIeFdb5CQUm/4/v+kZ8i8QzGY +lZ65N/mIyl6xB+DnZmWtPRk9HXDdtAnNQlj7uUrKdChq4JNIbwOmrjdmfVkpk5f5JBrCLt8YjGDM +Tf0bSfQcX/PGtm5RHb95XsAp4nGMhVnV44Dnw7kHLIElHRYtt3oXu/SHo3/BDQKBgQDrEpmFaYNS +iVJczAcqmOR+rLHCZnx3GUrKq2udIE6Zb/s2FTzmYHqcSQ66xsn4XzueaCrj9tqUuYIjYnnVM4lL +ux7CgGAwB6moBlUVcDbPZEMJEXXvDE6+oWg3eLGp1S5U7Q8ab0/9laC+c1ncMrgYhBNJ9RhvzimC +/+LPNbdmDQKBgQDleoBdsCDPIpbJVGjkgwN1T6aDPfs+A2lKx0z8Grzmv17HlhYqjy5Jvdx8bulR +0xY81YJ+h8dFD9e9fHdlxpfGj+gtHB8oGzjdN6JWfob6im+XAmg2ftWd1pHx9KBXkpL34NpqleJF +EH7LjGcMjbnceVAM6FEAiPI8BE6RrM91jwKBgQCMzIkzxa0oxKOWfYZVV1qVHS8jt2sZkwafOemt +JWqusMoQ7MubWXJXJdMywFq8752wFciK3pKxviNaumMq9kFoIN4dtfLnEc/mmlRgEORjeDRGvDSd +SAvqVpcrkpknlk64A32mYcHRq8uqB0FtiNuHo6RCChHm9d8bXdUmM5B0CQKBgQCM6xYq8j6jlHUO +O2SSdxXHk1sImyZO5Z9iCVNwOScpd/lHDRadmgFtzUa5rw5ebgbo4qBY/R5Ufa8ZMHbNrA+GItcL +5IoJgfYAeuqYvOg8sIhoLlU6qdaaL6q972ALhvnzeEQIUfR6Pu/uJVEet2WcS27qDju33WELlAV/ +laRsZwKBgBzjfllho66+JLamWnthlDHqgEKZDiZF+1fZipOITd7jaA3W8teGc8v9YmSABG4b9IGd +M8XtAFeDYN/MHMKRq+nmLF6hvEQYHUgqYGZGkxX2HcKnRHUssbUOTWJynvRVNPL/k9g9q0d6PeSS +DaE3OO3AUN8voDBaHDII1YscbEBg +-----END PRIVATE KEY----- +` + +// const encrypted = rsaEncrypt('123', publicKey) +// console.log(encrypted) +// // const encrypted = 'lJVUCFSV2K90ZdCeosUbtek/wZPmqmKR7ShsP2vfheldde6o9e2Qrmj1QojEwsZtjvq61FCmwpX46LkbsLY/jpM17PUZeqQHhqCy4Rz/hIyMCyIQTPwH5907pIwcpQH2XpJ45/hrjkhLhGU9pkZXtr3qkJiRTi0nllu7z6p6Qf0Hx/zYGxe41VVVnq/9t5xkoUyAfknEn1LMAJyJVft4pD43vTn4tz34+cf7GuzlC4xPiUyKC/trDGBW0kEQBPIaRpd7q1ab9x5fg8mffhBSDR3o+PvVuq3UP02MwpoMDs2bnnwzYawuGv87VNsvEHcvTkZDnh8ME9vtbQboLWVD5w==' + + +// console.log(rsaDecrypt(Buffer.from(encrypted, 'base64'), privateKey).toString()) + + +const aesEncrypt = (buffer, mode, key, iv) => { + const cipher = createCipheriv(mode, key, iv) + return Buffer.concat([cipher.update(buffer), cipher.final()]) +} + +const aesDecrypt = function(cipherBuffer, mode, key, iv) { + let decipher = createDecipheriv(mode, key, iv) + return Buffer.concat([decipher.update(cipherBuffer), decipher.final()]) +} + + +// const aesKey = Buffer.from('123456789abcdefg') +// const iv = Buffer.from('012345678901234a') + +// // const encryptedAes = aesEncrypt(Buffer.from('hello'), 'aes-128-cbc', aesKey, iv) +// // console.log(encryptedAes) +// // // const encryptedAes = '4zbNfntuHPrHtPvhEVC10Q==' + +// // console.log(aesDecrypt(Buffer.from(encryptedAes, 'base64'), 'aes-128-cbc', aesKey, iv).toString()) + +// // const encryptedAes = aesEncrypt(Buffer.from('hello'), 'aes-128-ecb', aesKey, '') +// // console.log(encryptedAes) +// const encryptedAes = 'oEShKajDOUILq3cVoRv0iw==' + +// console.log(aesDecrypt(Buffer.from(encryptedAes, 'base64'), 'aes-128-ecb', aesKey, '').toString()) + +const text = '{"id":"3779629","n":100000,"p":1}' +const iv = Buffer.from('0102030405060708') +const presetKey = Buffer.from('0CoJUm6Qyw8W8jud') +const secretKey = [56, 70, 110, 77, 99, 98, 51, 117, 67, 98, 85, 73, 118, 80, 104, 70] + +// Rn061YcbiMv3hQJlOLNklgQqbcUEF2YyiShXN8kevX3z+iU8j1qHhNEVEoNTNTPQ +// 4dbKbQjGbYdp/Q0bEwCTHcoB8vEQZNc5OUxz6VxScq4AuCYNHwWY44GJrfYuMV7GqQlC/88WdKg4w9ILJGAx5w== + +const r1 = aesEncrypt(text, 'aes-128-cbc', presetKey, iv) +console.log(r1.toString('base64')) +console.log(aesEncrypt(r1, 'aes-128-cbc', Buffer.from(secretKey), iv).toString('base64'))