diff --git a/core/c/src/mpw-algorithm_v0.c b/core/c/src/mpw-algorithm_v0.c index b1f237d3..49299d81 100644 --- a/core/c/src/mpw-algorithm_v0.c +++ b/core/c/src/mpw-algorithm_v0.c @@ -70,7 +70,8 @@ static MPMasterKey mpw_masterKey_v0( // Calculate the master key. trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )", MP_N, MP_r, MP_p ); - MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); + MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, + (uint8_t *)masterPassword, strlen( masterPassword ), masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( &masterKeySalt, masterKeySaltSize ); if (!masterKey) { err( "Could not derive master key: %s", strerror( errno ) ); diff --git a/core/c/src/mpw-algorithm_v3.c b/core/c/src/mpw-algorithm_v3.c index a3caebde..8dfb2992 100644 --- a/core/c/src/mpw-algorithm_v3.c +++ b/core/c/src/mpw-algorithm_v3.c @@ -62,7 +62,8 @@ static MPMasterKey mpw_masterKey_v3( // Calculate the master key. trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )", MP_N, MP_r, MP_p ); - MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); + MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, + (uint8_t *)masterPassword, strlen( masterPassword ), masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( &masterKeySalt, masterKeySaltSize ); if (!masterKey) { err( "Could not derive master key: %s", strerror( errno ) ); diff --git a/core/c/src/mpw-jni.c b/core/c/src/mpw-jni.c index 720c6df2..e40a6b9d 100644 --- a/core/c/src/mpw-jni.c +++ b/core/c/src/mpw-jni.c @@ -1,8 +1,22 @@ +#include + #include "mpw-jni.h" +#include "mpw-util.h" /** native int _scrypt(byte[] passwd, int passwdlen, byte[] salt, int saltlen, int N, int r, int p, byte[] buf, int buflen); */ JNIEXPORT jint JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1scrypt(JNIEnv *env, jobject obj, - jbyteArray passwd, jint passwdlen, jbyteArray salt, jint saltlen, jint N, jint r, jint p, jbyteArray buf, jint buflen) { + jbyteArray passwd, jint passwdlen, jbyteArray salt, jint saltlen, jint N, jint r, jint p, jbyteArray buf, jint buflen) { - return -2; + jbyte *passwdBytes = (*env)->GetByteArrayElements( env, passwd, NULL ); + jbyte *saltBytes = (*env)->GetByteArrayElements( env, salt, NULL ); + const uint8_t *key = mpw_kdf_scrypt( (size_t)buflen, (uint8_t *)passwdBytes, (size_t)passwdlen, (uint8_t *)saltBytes, (size_t)saltlen, + (uint64_t)N, (uint32_t)r, (uint32_t)p ); + (*env)->ReleaseByteArrayElements( env, passwd, passwdBytes, JNI_ABORT ); + (*env)->ReleaseByteArrayElements( env, salt, saltBytes, JNI_ABORT ); + + if (!key) + return ERR; + + memcpy( buf, key, buflen ); + return OK; } diff --git a/core/c/src/mpw-jni.h b/core/c/src/mpw-jni.h index 990e3440..09756303 100644 --- a/core/c/src/mpw-jni.h +++ b/core/c/src/mpw-jni.h @@ -1,4 +1,5 @@ /* DO NOT EDIT THIS FILE - it is machine generated */ +#undef __cplusplus #include /* Header for class com_lyndir_masterpassword_impl_MPAlgorithmV0 */ diff --git a/core/c/src/mpw-util.c b/core/c/src/mpw-util.c index 1eca80ae..4f30fe1a 100644 --- a/core/c/src/mpw-util.c +++ b/core/c/src/mpw-util.c @@ -169,10 +169,10 @@ bool __mpw_free_strings(char **strings, ...) { return success; } -uint8_t const *mpw_kdf_scrypt(const size_t keySize, const char *secret, const uint8_t *salt, const size_t saltSize, +uint8_t const *mpw_kdf_scrypt(const size_t keySize, const uint8_t *secret, const size_t secretSize, const uint8_t *salt, const size_t saltSize, uint64_t N, uint32_t r, uint32_t p) { - if (!secret || !salt) + if (!secret || !salt || !secretSize || !saltSize) return NULL; uint8_t *key = malloc( keySize ); @@ -185,7 +185,7 @@ uint8_t const *mpw_kdf_scrypt(const size_t keySize, const char *secret, const ui return NULL; } #elif MPW_SODIUM - if (crypto_pwhash_scryptsalsa208sha256_ll( (const uint8_t *)secret, strlen( secret ), salt, saltSize, N, r, p, key, keySize ) != 0) { + if (crypto_pwhash_scryptsalsa208sha256_ll( secret, secretSize, salt, saltSize, N, r, p, key, keySize ) != 0) { mpw_free( &key, keySize ); return NULL; } diff --git a/core/c/src/mpw-util.h b/core/c/src/mpw-util.h index d0d4da96..15b0422c 100644 --- a/core/c/src/mpw-util.h +++ b/core/c/src/mpw-util.h @@ -156,7 +156,7 @@ bool __mpw_free_strings( /** Derive a key from the given secret and salt using the scrypt KDF. * @return A new keySize allocated buffer containing the key. */ uint8_t const *mpw_kdf_scrypt( - const size_t keySize, const char *secret, const uint8_t *salt, const size_t saltSize, + const size_t keySize, const uint8_t *secret, const size_t secretSize, const uint8_t *salt, const size_t saltSize, uint64_t N, uint32_t r, uint32_t p); /** Derive a subkey from the given key using the blake2b KDF. * @return A new keySize allocated buffer containing the key. */ diff --git a/platform-darwin/MasterPassword-JNI/MasterPassword-JNI.xcodeproj/project.pbxproj b/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj similarity index 93% rename from platform-darwin/MasterPassword-JNI/MasterPassword-JNI.xcodeproj/project.pbxproj rename to platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj index 9ade388c..0cb2c8eb 100644 --- a/platform-darwin/MasterPassword-JNI/MasterPassword-JNI.xcodeproj/project.pbxproj +++ b/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj @@ -25,15 +25,14 @@ DA1554ED20B3928E00EA92C5 /* mpw-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-util.h"; sourceTree = ""; }; DA1554EE20B3928E00EA92C5 /* mpw-marshal-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-marshal-util.h"; sourceTree = ""; }; DA1554EF20B3928E00EA92C5 /* mpw-algorithm_v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v3.c"; sourceTree = ""; }; - DA1554F120B392A100EA92C5 /* jni_mpw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jni_mpw.h; sourceTree = ""; }; - DA1554F220B392A100EA92C5 /* jni_mpw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jni_mpw.c; sourceTree = ""; }; + DA1F44B020BCF0C200957B45 /* mpw-jni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-jni.h"; sourceTree = ""; }; + DA1F44B120BCF0C200957B45 /* mpw-jni.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-jni.c"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXGroup section */ DA1554D220B3924000EA92C5 = { isa = PBXGroup; children = ( - DA1554F020B392A100EA92C5 /* jni */, DA1554DD20B3928E00EA92C5 /* core */, ); sourceTree = ""; @@ -42,36 +41,28 @@ isa = PBXGroup; children = ( DA1554DE20B3928E00EA92C5 /* aes.c */, - DA1554DF20B3928E00EA92C5 /* mpw-algorithm.h */, - DA1554E020B3928E00EA92C5 /* base64.h */, - DA1554E120B3928E00EA92C5 /* mpw-marshal.c */, - DA1554E220B3928E00EA92C5 /* mpw-algorithm_v2.c */, - DA1554E320B3928E00EA92C5 /* mpw-types.c */, - DA1554E420B3928E00EA92C5 /* mpw-marshal-util.c */, - DA1554E520B3928E00EA92C5 /* mpw-util.c */, - DA1554E620B3928E00EA92C5 /* mpw-algorithm_v1.c */, DA1554E720B3928E00EA92C5 /* aes.h */, - DA1554E820B3928E00EA92C5 /* mpw-marshal.h */, DA1554E920B3928E00EA92C5 /* base64.c */, - DA1554EA20B3928E00EA92C5 /* mpw-algorithm.c */, + DA1554E020B3928E00EA92C5 /* base64.h */, DA1554EB20B3928E00EA92C5 /* mpw-algorithm_v0.c */, - DA1554EC20B3928E00EA92C5 /* mpw-types.h */, - DA1554ED20B3928E00EA92C5 /* mpw-util.h */, - DA1554EE20B3928E00EA92C5 /* mpw-marshal-util.h */, + DA1554E620B3928E00EA92C5 /* mpw-algorithm_v1.c */, + DA1554E220B3928E00EA92C5 /* mpw-algorithm_v2.c */, DA1554EF20B3928E00EA92C5 /* mpw-algorithm_v3.c */, + DA1554EA20B3928E00EA92C5 /* mpw-algorithm.c */, + DA1554DF20B3928E00EA92C5 /* mpw-algorithm.h */, + DA1F44B120BCF0C200957B45 /* mpw-jni.c */, + DA1F44B020BCF0C200957B45 /* mpw-jni.h */, + DA1554E420B3928E00EA92C5 /* mpw-marshal-util.c */, + DA1554EE20B3928E00EA92C5 /* mpw-marshal-util.h */, + DA1554E120B3928E00EA92C5 /* mpw-marshal.c */, + DA1554E820B3928E00EA92C5 /* mpw-marshal.h */, + DA1554E320B3928E00EA92C5 /* mpw-types.c */, + DA1554EC20B3928E00EA92C5 /* mpw-types.h */, + DA1554E520B3928E00EA92C5 /* mpw-util.c */, + DA1554ED20B3928E00EA92C5 /* mpw-util.h */, ); name = core; - path = ../../core/c; - sourceTree = ""; - }; - DA1554F020B392A100EA92C5 /* jni */ = { - isa = PBXGroup; - children = ( - DA1554F120B392A100EA92C5 /* jni_mpw.h */, - DA1554F220B392A100EA92C5 /* jni_mpw.c */, - ); - name = jni; - path = ../../core/java/algorithm/src/mpw/c; + path = ../core/c/src; sourceTree = ""; }; /* End PBXGroup section */ @@ -125,32 +116,42 @@ DA1554D820B3924000EA92C5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - HEADER_SEARCH_PATHS = ( - "/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/include/**", - ); }; name = Debug; }; DA1554D920B3924000EA92C5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - HEADER_SEARCH_PATHS = ( - "/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/include/**", - ); }; name = Release; }; DA1554DB20B3924000EA92C5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + HEADER_SEARCH_PATHS = ( + "/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/include/**", + ../lib/libsodium/src/libsodium/include, + ); JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home; + OTHER_CFLAGS = ( + "-DMPW_SODIUM=1", + "-DMPW_CPERCIVA=0", + ); }; name = Debug; }; DA1554DC20B3924000EA92C5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + HEADER_SEARCH_PATHS = ( + "/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/include/**", + ../lib/libsodium/src/libsodium/include, + ); JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home; + OTHER_CFLAGS = ( + "-DMPW_SODIUM=1", + "-DMPW_CPERCIVA=0", + ); }; name = Release; }; diff --git a/platform-darwin/MasterPassword.xcworkspace/contents.xcworkspacedata b/platform-darwin/MasterPassword.xcworkspace/contents.xcworkspacedata index d31ca6db..55793aaf 100644 --- a/platform-darwin/MasterPassword.xcworkspace/contents.xcworkspacedata +++ b/platform-darwin/MasterPassword.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:MasterPassword-JNI.xcodeproj">