From 13b5f33022fe50354739fe381acff5c3a2e3af1a Mon Sep 17 00:00:00 2001 From: tex0l Date: Fri, 25 Sep 2020 18:13:08 +0200 Subject: [PATCH 1/2] =?UTF-8?q?[BREAKING]=C2=A0Changed=20function=20signat?= =?UTF-8?q?ure=20:=20passwd,=20salt=20and=20the=20result=20are=20now=20all?= =?UTF-8?q?=20passed=20as=20hexadecimal=20strings=20;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG | 6 +- README.md | 3 +- .../com/crypho/scrypt/RNScryptModule.java | 67 +++++++++--------- android/src/main/jni/libscrypt-jni.c | 23 ++---- .../src/main/libs/arm64-v8a/libscrypt_jni.so | Bin 22344 -> 22488 bytes .../main/libs/armeabi-v7a/libscrypt_jni.so | Bin 26144 -> 26264 bytes android/src/main/libs/x86/libscrypt_jni.so | Bin 26080 -> 22104 bytes android/src/main/libs/x86_64/libscrypt_jni.so | Bin 26720 -> 22752 bytes example/App.js | 27 +++---- example/ios/Podfile.lock | 6 +- example/yarn.lock | 2 +- ios/RNScrypt.m | 41 +++++++---- 12 files changed, 91 insertions(+), 84 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8adff1b..b425083 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,10 @@ Changelog ========= +UNRELEASED - 2020-09-25 +------------------ +- [BREAKING] Changed function signature : passwd, salt and the result are now all passed as hexadecimal strings ; + 1.1.2 - 2019-12-20 ------------------ @@ -17,4 +21,4 @@ Changelog [danh] - Update iOS config. - [maddijoyce] \ No newline at end of file + [maddijoyce] diff --git a/README.md b/README.md index 744e087..7441c9b 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,7 @@ This plugin is for use with React Native and allows your application to use scry ```javascript import scrypt from 'react-native-scrypt'; -// passwd must be a string -// salt must be an array of bytes integers +// passwd and salt must be encoded in hexadecimal, and the result will be encoded in hexadecimal // see example/App.js const result = await scrypt(passwd, salt[, N=16384, r=8, p=1, dkLen=64]) diff --git a/android/src/main/java/com/crypho/scrypt/RNScryptModule.java b/android/src/main/java/com/crypho/scrypt/RNScryptModule.java index b26f789..f349b7f 100644 --- a/android/src/main/java/com/crypho/scrypt/RNScryptModule.java +++ b/android/src/main/java/com/crypho/scrypt/RNScryptModule.java @@ -13,60 +13,59 @@ public class RNScryptModule extends ReactContextBaseJavaModule { System.loadLibrary("scrypt_jni"); } - private static final char[] HEX = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private final ReactApplicationContext reactContext; private static final String SCRYPT_ERROR = "Failure in scrypt"; - public native byte[] scryptBridgeJNI(byte[] pass, char[] salt, Integer N, Integer r, Integer p, Integer dkLen); - + public native byte[] scryptBridgeJNI(byte[] pass, byte[] salt, Integer N, Integer r, Integer p, Integer dkLen); + public RNScryptModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; } - @ReactMethod public void scrypt( - String passwd, - ReadableArray salt, - Integer N, - Integer r, - Integer p, - Integer dkLen, - Promise promise) { - try { - final byte[] passwordBytes = passwd.getBytes("UTF-8"); - final char[] ssalt = getSalt(salt); - byte[] res = scryptBridgeJNI(passwordBytes, ssalt, N, r, p, dkLen); - String result = hexify(res); - promise.resolve(result); - } catch (Exception e) { - promise.reject(SCRYPT_ERROR, e); - } + String passwd, + String salt, + Integer N, + Integer r, + Integer p, + Integer dkLen, + Promise promise) { + try { + final byte[] passwordBytes = hexStringToByteArray(passwd); + final byte[] ssalt = hexStringToByteArray(salt); + byte[] res = scryptBridgeJNI(passwordBytes, ssalt, N, r, p, dkLen); + String result = hexify(res); + promise.resolve(result); + } catch (Exception e) { + promise.reject(SCRYPT_ERROR, e); + } } - private String hexify (byte[] input) { - int len = input.length; - char[] result = new char[2 * len]; - for ( int j = 0; j < len; j++ ) { - int v = input[j] & 0xFF; - result[j * 2] = HEX[v >>> 4]; - result[j * 2 + 1] = HEX[v & 0x0F]; + private static String hexify(byte[] input) { + int len = input.length; + char[] result = new char[2 * len]; + for (int j = 0; j < len; j++) { + int v = input[j] & 0xFF; + result[j * 2] = HEX[v >>> 4]; + result[j * 2 + 1] = HEX[v & 0x0F]; } return new String(result).toLowerCase(); } - private char[] getSalt(ReadableArray src){ - int s = src.size(); - char[] result = new char[s]; - for (int i = 0; i < s ; i++) { - result[i] = (char) src.getInt(i); + private static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16)); } - return result; + return data; } @Override public String getName() { return "RNScrypt"; } -} \ No newline at end of file +} diff --git a/android/src/main/jni/libscrypt-jni.c b/android/src/main/jni/libscrypt-jni.c index c061210..c55d315 100644 --- a/android/src/main/jni/libscrypt-jni.c +++ b/android/src/main/jni/libscrypt-jni.c @@ -19,7 +19,7 @@ static void throwException(JNIEnv* env, char *msg); JNIEXPORT jbyteArray JNICALL Java_com_crypho_scrypt_RNScryptModule_scryptBridgeJNI( JNIEnv* env, jobject thiz, - jbyteArray pass, jcharArray salt, jobject N, jobject r, jobject p, jobject dkLen) + jbyteArray pass, jbyteArray salt, jobject N, jobject r, jobject p, jobject dkLen) { int i; char *msg_error; @@ -31,13 +31,13 @@ Java_com_crypho_scrypt_RNScryptModule_scryptBridgeJNI( JNIEnv* env, jobject thiz jint passLen = (*env)->GetArrayLength(env, pass); if((*env)->ExceptionOccurred(env)) { - LOGE("Failed to get passphrase lenght."); + LOGE("Failed to get passphrase length."); goto END; } jint saltLen = (*env)->GetArrayLength(env, salt); if((*env)->ExceptionOccurred(env)) { - LOGE("Failed to get salt lenght."); + LOGE("Failed to get salt length."); goto END; } @@ -47,20 +47,12 @@ Java_com_crypho_scrypt_RNScryptModule_scryptBridgeJNI( JNIEnv* env, jobject thiz goto END; } - jchar *salt_chars = (*env)->GetCharArrayElements(env, salt, NULL); + jbyte *parsedSalt = (*env)->GetByteArrayElements(env, salt, NULL); if((*env)->ExceptionOccurred(env)) { LOGE("Failed to get salt elements."); goto END; } - uint8_t *parsedSalt = malloc(sizeof(uint8_t) * saltLen); - if (parsedSalt == NULL) { - msg_error = "Failed to malloc parsedSalt."; - LOGE("%s", msg_error); - throwException(env, msg_error); - goto END; - } - uint8_t *hashbuf = malloc(sizeof(uint8_t) * dkLen_i); if (hashbuf == NULL) { msg_error = "Failed to malloc hashbuf."; @@ -69,10 +61,6 @@ Java_com_crypho_scrypt_RNScryptModule_scryptBridgeJNI( JNIEnv* env, jobject thiz goto END; } - for (i = 0; i < saltLen; ++i) { - parsedSalt[i] = (uint8_t) salt_chars[i]; - } - if (libscrypt_scrypt(passphrase, passLen, parsedSalt, saltLen, N_i, r_i, p_i, hashbuf, dkLen_i)) { switch (errno) { case EINVAL: @@ -103,9 +91,8 @@ Java_com_crypho_scrypt_RNScryptModule_scryptBridgeJNI( JNIEnv* env, jobject thiz END: if (passphrase) (*env)->ReleaseByteArrayElements(env, pass, passphrase, JNI_ABORT); - if (salt_chars) (*env)->ReleaseCharArrayElements(env, salt, salt_chars, JNI_ABORT); + if (parsedSalt) (*env)->ReleaseByteArrayElements(env, salt, parsedSalt, JNI_ABORT); if (hashbuf) free(hashbuf); - if (parsedSalt) free(parsedSalt); return result; } diff --git a/android/src/main/libs/arm64-v8a/libscrypt_jni.so b/android/src/main/libs/arm64-v8a/libscrypt_jni.so index 1abe5f26e3a46102657fb85465f2d831d940228d..16c4c7fa342119f6fa3b916471fc410052562d4b 100755 GIT binary patch literal 22488 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 literal 22344 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 diff --git a/android/src/main/libs/armeabi-v7a/libscrypt_jni.so b/android/src/main/libs/armeabi-v7a/libscrypt_jni.so index 2e1de043c7ada4dd6fd9615018f0b1822389fbdd..d18cf45306a07bf3ed61822350945d6173ab80e3 100755 GIT binary patch literal 26264 zcmeHw3w#q*_Wzw^5|T7+Qz%#->XZVe1xj05C_Y0QrVk1&h%PG9R{|-Nwxj`zvKmTZ z(M2r?Zm5qR?&2;Yx~+nX2o@DxU+lK(?xHKZ@!595BSoM=sr`S?Oi}{EuKU^F{y+cE z|FZ*U&bhC1&pr3tbMMUD+}<~>K;$@%g)TKSvrs4keYf#OA<({-L7ng%B`mceYM)!vpqj1_q;a^`A-g{B_jf=wXT@?N_EF1&+cvzU~`~ISE zY?y$Qo_|sJwu{1!i^6pmg|8sx1TU(8L|B;kPrN96?M31DFADzx;V*7bY-1pcWFryY zJ(00o@S^Z=)E_g2VeBa3hk^6L!tt=HnCldqr~IwRKLbjqzNGLmq|XY=Uj_dB^+*h+ zdyqaDZHs zUlOLj+feRJbVP1Ye)0>qq5WHf{PYNaJe;xR!SHVowohVgXE3}T{5FFhjRWG(Bis%B zP~TGcrwC_2*iir6g!Wj`9=c4dyKg$eGs42ZL;jYq{Q0Qwr{G7vkN9OF{VdWmgW)4c zkAc3LgW=4J_@^QLE0hoE_YBIv8K&OE6HnytKHydPy;Ha#R-w zInJJWv&?!%wQX6YJs6witgtP#gA|vx=mwb(NMcE-rU0E?!VtQF%ec!eymS8?#lG+H6j0pskV`w!mq( zhc#D`ku52$tgJ4lN`ELzN?7)ytm#%Ut@!5Lsc9LL`m-;wFDb8dUJ$HVaZxZcJX~vc zWrlIhoiQ~#$g@}^Eng-ruL_-UzN^BE-BM#iXN4syBL09~F!~}+!Pp>^;#-ui$gW;e zQ)vg+P=wV^!D)5n_8M13bya_Sj@?yIS_OSCwBKA~FRxfoQEn}Dm4>I!wl749n_Z<& zm{XAdY_h{2a+__hUAE+WrMJ$$xfm7nm!fc9mCNp|ab6T#R9$mHuA3?SQazf6=!I3w zLMFGsSxWU4*NUvPtQrE^?B&%qd$HZ&Dz;a-oGaLZ1(nNc9c)3+{9vlZ3+=9AgzXDi zC{*LDE-$XAT2S2|6P8+D4Uy|ya#97l5msG}ex|ZcrM*PfmM*s!FJDkoTv}T^S5Abb zgjGYK5Yt+h9nF>7af{MlFdbVl2CS{FUjkXCDrz3Fuc!^d3MxKMT@zyf$< zaOa2D{q&*q8@^Q4T@OgrT$%lWEv@h-(CT|N$2u3UdhNG`GvC|rlvH=*&)oda6Y3v| zzvIkecH@~dCr-Ei_K5A~2h{6#w!GQ*!QiI{9≫*O8~EY~Jz6U;q4G(O;k3WpEBT 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 ZpMOjd#EUM%BwOg3iG0zaL_~(j{{v1@BZdF~ literal 26144 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 diff --git a/android/src/main/libs/x86/libscrypt_jni.so b/android/src/main/libs/x86/libscrypt_jni.so index 3c12e926a2ed09c1079bceffcee8277fe28905e1..6076bbb8113f9369db311c004fb49fd4b220ff26 100755 GIT binary patch literal 22104 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 diff --git a/android/src/main/libs/x86_64/libscrypt_jni.so b/android/src/main/libs/x86_64/libscrypt_jni.so index 2e3fff4ba44edc75ee2514faed9eb3a44321712d..e8a9132e97364f45bf5a5c4c4e912aec47c59414 100755 GIT binary patch literal 22752 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 literal 26720 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 D_wK9M diff --git a/example/App.js b/example/App.js index 5a49975..a46dbbf 100644 --- a/example/App.js +++ b/example/App.js @@ -10,8 +10,8 @@ import React, {Component} from 'react' import {StyleSheet, Text, View} from 'react-native' import scrypt from 'react-native-scrypt' import sjcl from './sjcl' +import {randomBytes} from 'react-native-randombytes' -const password = 'correct horse battery staple' const params = [16384, 8, 1] const length = 64 @@ -33,28 +33,29 @@ export default class App extends Component { async componentDidMount() { await seeded() - const salt = sjcl.random.randomWords(2) - await this.libScrypt(salt) - await this.sjclScrypt(salt) + const password = (await randomBytes(64)).toString('hex') + const salt = (await randomBytes(64)).toString('hex') + await this.libScrypt(password, salt) + await this.sjclScrypt(password, salt) } - async sjclScrypt(salt) { + async sjclScrypt(password, salt) { const start = Date.now() const sjclScrypt = sjcl.codec.hex.fromBits( - sjcl.misc.scrypt(password, salt, ...params, length * 8), + sjcl.misc.scrypt( + sjcl.codec.hex.toBits(password), + sjcl.codec.hex.toBits(salt), + ...params, + length * 8, + ), ) this.setState({sjcl: `${sjclScrypt} ${Date.now() - start}ms`}) return sjclScrypt } - async libScrypt(salt) { + async libScrypt(password, salt) { const start = Date.now() - const libScrypt = await scrypt( - password, - sjcl.codec.bytes.fromBits(salt), - ...params, - length, - ) + const libScrypt = await scrypt(password, salt, ...params, length) this.setState({libscrypt: `${libScrypt} ${Date.now() - start}ms`}) return libScrypt } diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 3e317b8..c327c7f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -219,7 +219,7 @@ PODS: - React-cxxreact (= 0.61.4) - React-jsi (= 0.61.4) - ReactCommon/jscallinvoker (= 0.61.4) - - RNScrypt (1.1.0): + - RNScrypt (1.1.2): - React - Yoga (1.14.0) @@ -342,9 +342,9 @@ SPEC CHECKSUMS: React-RCTText: 21934e0a51d522abcd0a275407e80af45d6fd9ec React-RCTVibration: 0f76400ee3cec6edb9c125da49fed279340d145a ReactCommon: a6a294e7028ed67b926d29551aa9394fd989c24c - RNScrypt: 711178949ab15a806e140be2f281076c395a28f7 + RNScrypt: dd5e6b7daa3b84e2f21e2342efda2f183856ea90 Yoga: ba3d99dbee6c15ea6bbe3783d1f0cb1ffb79af0f PODFILE CHECKSUM: 79310af6b976c356911a8a833e9b99c3399fdda3 -COCOAPODS: 1.8.4 +COCOAPODS: 1.9.1 diff --git a/example/yarn.lock b/example/yarn.lock index fda48bf..efbfd1f 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -5639,7 +5639,7 @@ react-native-randombytes@^3.5.1: sjcl "^1.0.3" "react-native-scrypt@file:..": - version "1.1.0" + version "1.1.2" react-native@0.61.4: version "0.61.4" diff --git a/ios/RNScrypt.m b/ios/RNScrypt.m index 6a965b6..5cf6fae 100644 --- a/ios/RNScrypt.m +++ b/ios/RNScrypt.m @@ -24,7 +24,7 @@ - (dispatch_queue_t)methodQueue RCT_EXPORT_MODULE() RCT_REMAP_METHOD(scrypt, scrypt:(NSString *)passwd - salt:(NSArray *)salt + salt:(NSString *)salt N:(NSUInteger)N r:(NSUInteger)r p:(NSUInteger)p @@ -33,21 +33,37 @@ - (dispatch_queue_t)methodQueue rejecter:(RCTPromiseRejectBlock)reject) { int i, success; - size_t saltLength; uint8_t hashbuf[dkLen]; - const uint8_t *parsedSalt; - uint8_t *buffer = NULL; - const char* passphrase = [passwd UTF8String]; - saltLength = (int) [salt count]; - buffer = malloc(sizeof(uint8_t) * saltLength); - for (i = 0; i < saltLength; ++i) { - buffer[i] = (uint8_t)[[salt objectAtIndex:i] integerValue]; + const char *chars_passwd = [passwd UTF8String]; + int j = 0; + long len_passwd = passwd.length; + uint8_t *passwd_buffer = malloc(sizeof(uint8_t) * len_passwd / 2); + + char byteChars[3] = {'\0','\0','\0'}; + unsigned long wholeByte; + + while (j < len_passwd) { + byteChars[0] = chars_passwd[j++]; + byteChars[1] = chars_passwd[j++]; + wholeByte = strtoul(byteChars, NULL, 16); + passwd_buffer[(j / 2) - 1] = wholeByte; + } + + const char *chars_salt = [salt UTF8String]; + j = 0; + long len_salt = salt.length; + uint8_t *salt_buffer = malloc(sizeof(uint8_t) * len_salt / 2); + + while (j < len_salt) { + byteChars[0] = chars_salt[j++]; + byteChars[1] = chars_salt[j++]; + wholeByte = strtoul(byteChars, NULL, 16); + salt_buffer[(j / 2) - 1] = wholeByte; } - parsedSalt = buffer; @try { - success = libscrypt_scrypt((uint8_t *)passphrase, strlen(passphrase), parsedSalt, saltLength, N, r, p, hashbuf, dkLen); + success = libscrypt_scrypt((uint8_t *) passwd_buffer, len_passwd / 2, (uint8_t *) salt_buffer, len_salt / 2, N, r, p, hashbuf, dkLen); } @catch (NSException * e) { NSError *error = [NSError errorWithDomain:@"com.crypho.scrypt" code:200 userInfo:@{@"Error reason": @"Error in scrypt"}]; @@ -61,7 +77,8 @@ - (dispatch_queue_t)methodQueue } NSString *result = [NSString stringWithString: hexResult]; resolve(result); - free(buffer); + free(passwd_buffer); + free(salt_buffer); } @end From 451602a7e041ec309c4f800dcddf3148143fdce6 Mon Sep 17 00:00:00 2001 From: tex0l Date: Sun, 4 Oct 2020 21:39:37 +0200 Subject: [PATCH 2/2] - Unified native I/O to hex strings ; - Added other encoding methods : 'legacy' which behaves like in v1.1.2, 'hex', 'base64' and 'buffer' - Update example with tests for a range of test vectors, removed Jest because it's unusable in this context (it's made for mocking native dependencies) --- .gitignore | 3 + CHANGELOG | 6 +- README.md | 8 +- example/.prettierrc.js | 1 + example/App.js | 178 ++++- example/__tests__/App-test.js | 14 - example/package.json | 6 +- example/test_vectors.js | 244 +++++++ example/yarn.lock | 1155 +++------------------------------ index.js | 50 +- package-lock.json | 27 + package.json | 5 +- 12 files changed, 570 insertions(+), 1127 deletions(-) create mode 100644 .gitignore delete mode 100644 example/__tests__/App-test.js create mode 100644 example/test_vectors.js create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6432642 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.idea + diff --git a/CHANGELOG b/CHANGELOG index b425083..291b3c4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,9 +1,11 @@ Changelog ========= -UNRELEASED - 2020-09-25 +UNRELEASED - 2020-10-04 ------------------ -- [BREAKING] Changed function signature : passwd, salt and the result are now all passed as hexadecimal strings ; +- Unified native I/O to hex strings ; +- Added other encoding methods : 'legacy' which behaves like v1.1.2, 'hex', 'base64' and 'buffer' +- Update example with tests for a range of test vectors 1.1.2 - 2019-12-20 ------------------ diff --git a/README.md b/README.md index 7441c9b..bdcad5d 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,14 @@ This plugin is for use with React Native and allows your application to use scry ```javascript import scrypt from 'react-native-scrypt'; -// passwd and salt must be encoded in hexadecimal, and the result will be encoded in hexadecimal +// With 'legacy' encoding (default): passwd must be a string, salt must be an array of bytes integers +// With 'hex' encoding: passwd and salt must be string encoded in hexadecimal +// With 'base64' encoding: passwd and salt must be string encoded in base64 +// With 'buffer' encoding: passwd and salt must be Buffers (in the sense of [`buffer`](https://github.com/feross/buffer/) package) // see example/App.js -const result = await scrypt(passwd, salt[, N=16384, r=8, p=1, dkLen=64]) + +const result = await scrypt(passwd, salt[, N=16384, r=8, p=1, dkLen=64, encoding='legacy']) ``` ## LICENSE diff --git a/example/.prettierrc.js b/example/.prettierrc.js index 6015616..8338db4 100644 --- a/example/.prettierrc.js +++ b/example/.prettierrc.js @@ -4,4 +4,5 @@ module.exports = { singleQuote: true, trailingComma: 'all', semi: false, + printWidth: 120 } diff --git a/example/App.js b/example/App.js index a46dbbf..c8aaf7f 100644 --- a/example/App.js +++ b/example/App.js @@ -7,18 +7,21 @@ */ import React, {Component} from 'react' -import {StyleSheet, Text, View} from 'react-native' +import {ActivityIndicator, Button, StyleSheet, Text, View} from 'react-native' import scrypt from 'react-native-scrypt' import sjcl from './sjcl' import {randomBytes} from 'react-native-randombytes' - -const params = [16384, 8, 1] -const length = 64 +import {assert} from 'chai' +import {Buffer} from 'buffer' +import testVectors from './test_vectors' function seeded() { return new Promise(resolve => { - if (sjcl.random.isReady()) resolve() - else sjcl.random.addEventListener('seeded', resolve) + if (sjcl.random.isReady()) { + resolve() + } else { + sjcl.random.addEventListener('seeded', resolve) + } }) } @@ -28,35 +31,156 @@ export default class App extends Component { this.state = { sjcl: '...', libscrypt: '...', + ready: false, + tests: 0, + passedTests: 0, + } + } + + async test(name, callback) { + console.log(`Executing ${name}...`) + const start = Date.now() + try { + await callback() + console.log(`Test ${name} passed in ${Date.now() - start}ms`) + this.setState({tests: this.state.tests + 1, passedTests: this.state.passedTests + 1}) + } catch (error) { + console.warn(`Test ${name} failed in ${Date.now() - start}ms with error`, error) + this.setState({tests: this.state.tests + 1}) } } async componentDidMount() { await seeded() - const password = (await randomBytes(64)).toString('hex') - const salt = (await randomBytes(64)).toString('hex') - await this.libScrypt(password, salt) - await this.sjclScrypt(password, salt) + await this.generateRandomTestVector() + await this.runExample() } - async sjclScrypt(password, salt) { - const start = Date.now() - const sjclScrypt = sjcl.codec.hex.fromBits( - sjcl.misc.scrypt( - sjcl.codec.hex.toBits(password), - sjcl.codec.hex.toBits(salt), - ...params, - length * 8, + async generateRandomTestVector() { + // add a random test vector with non-ASCII characters + console.log('generating random test vector') + const testVector = { + password: await randomBytes(64), + salt: await randomBytes(64), + N: 16384, + r: 8, + p: 1, + dkLen: 64, + skipInLegacy: true, + } + testVector.expected = Buffer.from( + sjcl.codec.hex.fromBits( + sjcl.misc.scrypt( + sjcl.codec.hex.toBits(testVector.password.toString('hex')), + sjcl.codec.hex.toBits(testVector.salt.toString('hex')), + testVector.N, + testVector.r, + testVector.p, + testVector.dkLen * 8, + ), ), + 'hex', ) - this.setState({sjcl: `${sjclScrypt} ${Date.now() - start}ms`}) - return sjclScrypt + testVectors.push(testVector) + console.log('random test vector generated') + } + + async runExample() { + console.log('running quick example', testVectors.length) + await this.sjclScrypt(testVectors[21]) + console.log('control sjcl scrypt done') + await this.libScrypt(testVectors[21]) + console.log('native scrypt done') + this.setState({ready: true}) + } + + async startTests() { + if (this.state.ready === false) { + return + } + this.setState({ready: false, tests: 0, passedTests: 0}) + console.log('starting tests...') + + for (let i = 0; i < testVectors.length; i++) { + const {password, salt, N, r, p, dkLen, expected, skipInLegacy = false} = testVectors[i] + if (!skipInLegacy) { + await this.test(`Test vector ${i + 1} with encoding legacy`, async () => { + const encodedPassword = password.toString('utf-8') + const encodedSalt = sjcl.codec.utf8String.toBits(salt.toString('utf-8')) + const actualResult = await scrypt(encodedPassword, encodedSalt, N, r, p, dkLen) + assert.strictEqual(actualResult, expected.toString('hex')) + }) + } + } + + for (let i = 0; i < testVectors.length; i++) { + const {password, salt, N, r, p, dkLen, expected} = testVectors[i] + await this.test(`Test vector ${i + 1} with encoding base64`, async () => { + const encodedPassword = password.toString('base64') + const encodedSalt = salt.toString('base64') + const actualResult = await scrypt(encodedPassword, encodedSalt, N, r, p, dkLen, 'base64') + assert.strictEqual(actualResult, expected.toString('base64')) + }) + } + + for (let i = 0; i < testVectors.length; i++) { + const {password, salt, N, r, p, dkLen, expected} = testVectors[i] + await this.test(`Test vector ${i + 1} with encoding hex`, async () => { + const encodedPassword = password.toString('hex') + const encodedSalt = salt.toString('hex') + const actualResult = await scrypt(encodedPassword, encodedSalt, N, r, p, dkLen, 'hex') + assert.strictEqual(actualResult, expected.toString('hex')) + }) + } + + for (let i = 0; i < testVectors.length; i++) { + const {password, salt, N, r, p, dkLen, expected} = testVectors[i] + await this.test(`Test vector ${i + 1} with encoding buffer`, async () => { + const encodedPassword = password + const encodedSalt = salt + const actualResult = await scrypt(encodedPassword, encodedSalt, N, r, p, dkLen, 'buffer') + assert.isTrue(actualResult.equals(expected)) + }) + } + + if (this.state.tests === this.state.passedTests) { + console.log(`All ${this.state.tests} passed.`) + } else { + console.error( + `${this.state.passedTests} / ${this.state.tests} passed, ${this.state.tests - this.state.passedTests} failed.`, + ) + } + this.setState({ready: true}) } - async libScrypt(password, salt) { + async sjclScrypt(testVector) { + const password = sjcl.codec.hex.toBits(testVector.password.toString('hex')) + const salt = sjcl.codec.hex.toBits(testVector.salt.toString('hex')) + const N = testVector.N + const r = testVector.r + const p = testVector.p + const dkLen = testVector.dkLen * 8 + const start = Date.now() - const libScrypt = await scrypt(password, salt, ...params, length) - this.setState({libscrypt: `${libScrypt} ${Date.now() - start}ms`}) + const sjclScrypt = sjcl.misc.scrypt(password, salt, N, r, p, dkLen) + const elapsed = Date.now() - start + + this.setState({sjcl: `${sjcl.codec.hex.fromBits(sjclScrypt)} ${elapsed}ms`}) + } + + async libScrypt(testVector) { + const password = testVector.password.toString('utf-8') + const salt = sjcl.codec.hex.toBits(testVector.salt.toString('hex')) + const N = testVector.N + const r = testVector.r + const p = testVector.p + const dkLen = testVector.dkLen + + const start = Date.now() + const libScrypt = await scrypt(password, salt, N, r, p, dkLen) + const elapsed = Date.now() - start + + this.setState({libscrypt: `${libScrypt} ${elapsed}ms`}) return libScrypt } @@ -64,9 +188,11 @@ export default class App extends Component { return ( {`sjcl: ${this.state.sjcl}`} - - {`react-native-scrypt: ${this.state.libscrypt}`} - + {`react-native-scrypt: ${this.state.libscrypt}`} +