mirror of
https://gitlab.com/spectre.app/cli.git
synced 2024-11-01 10:51:44 +01:00
Fully replace Java mpw algorithm implementation with proxy to standard C implementation.
This commit is contained in:
parent
9ee9ab90bd
commit
30e6eae3d7
2 changed files with 131 additions and 23 deletions
122
src/mpw-jni.c
122
src/mpw-jni.c
|
@ -1,29 +1,113 @@
|
|||
#include <string.h>
|
||||
|
||||
#include "mpw-jni.h"
|
||||
#include "mpw-algorithm.h"
|
||||
#include "mpw-util.h"
|
||||
|
||||
/** native int _scrypt(byte[] passwd, byte[] salt, int N, int r, int p, byte[] buf); */
|
||||
JNIEXPORT jint JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1scrypt(JNIEnv *env, jobject obj,
|
||||
jbyteArray passwd, jbyteArray salt, jint N, jint r, jint p, jbyteArray buf) {
|
||||
// TODO: We may need to zero the jbytes safely.
|
||||
|
||||
jbyte *passwdBytes = (*env)->GetByteArrayElements( env, passwd, NULL );
|
||||
jbyte *saltBytes = (*env)->GetByteArrayElements( env, salt, NULL );
|
||||
const size_t keyLength = (*env)->GetArrayLength( env, buf );
|
||||
const uint8_t *key = mpw_kdf_scrypt( keyLength,
|
||||
(uint8_t *)passwdBytes, (size_t)(*env)->GetArrayLength( env, passwd ),
|
||||
(uint8_t *)saltBytes, (size_t)(*env)->GetArrayLength( env, salt ),
|
||||
(uint64_t)N, (uint32_t)r, (uint32_t)p );
|
||||
(*env)->ReleaseByteArrayElements( env, passwd, passwdBytes, JNI_ABORT );
|
||||
(*env)->ReleaseByteArrayElements( env, salt, saltBytes, JNI_ABORT );
|
||||
/* native int _masterKey(final String fullName, final byte[] masterPassword, final Version version) */
|
||||
JNIEXPORT jbyteArray JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1masterKey(JNIEnv *env, jobject obj,
|
||||
jstring fullName, jbyteArray masterPassword, jint algorithmVersion) {
|
||||
|
||||
if (!key)
|
||||
return ERR;
|
||||
const char *fullNameString = (*env)->GetStringUTFChars( env, fullName, NULL );
|
||||
jbyte *masterPasswordString = (*env)->GetByteArrayElements( env, masterPassword, NULL );
|
||||
|
||||
jbyte *bufBytes = (*env)->GetByteArrayElements( env, buf, NULL );
|
||||
memcpy( bufBytes, key, keyLength );
|
||||
(*env)->ReleaseByteArrayElements( env, buf, bufBytes, JNI_OK );
|
||||
mpw_free( &key, keyLength );
|
||||
MPMasterKey masterKeyBytes = mpw_masterKey( fullNameString, (char *)masterPasswordString, (MPAlgorithmVersion)algorithmVersion );
|
||||
(*env)->ReleaseStringUTFChars( env, fullName, fullNameString );
|
||||
(*env)->ReleaseByteArrayElements( env, masterPassword, masterPasswordString, JNI_ABORT );
|
||||
|
||||
return OK;
|
||||
if (!masterKeyBytes)
|
||||
return NULL;
|
||||
|
||||
jbyteArray masterKey = (*env)->NewByteArray( env, (jsize)MPMasterKeySize );
|
||||
(*env)->SetByteArrayRegion( env, masterKey, 0, (jsize)MPMasterKeySize, (jbyte *)masterKeyBytes );
|
||||
mpw_free( &masterKeyBytes, MPMasterKeySize );
|
||||
|
||||
return masterKey;
|
||||
}
|
||||
|
||||
/* native int _siteKey(final byte[] masterKey, final String siteName, final long siteCounter,
|
||||
final MPKeyPurpose keyPurpose, @Nullable final String keyContext, final Version version) */
|
||||
JNIEXPORT jbyteArray JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteKey(JNIEnv *env, jobject obj,
|
||||
jbyteArray masterKey, jstring siteName, jlong siteCounter, jint keyPurpose, jstring keyContext, jint algorithmVersion) {
|
||||
|
||||
jbyte *masterKeyBytes = (*env)->GetByteArrayElements( env, masterKey, NULL );
|
||||
const char *siteNameString = (*env)->GetStringUTFChars( env, siteName, NULL );
|
||||
const char *keyContextString = keyContext? (*env)->GetStringUTFChars( env, keyContext, NULL ): NULL;
|
||||
MPMasterKey siteKeyBytes = mpw_siteKey(
|
||||
(MPMasterKey)masterKeyBytes, siteNameString, (MPCounterValue)siteCounter,
|
||||
(MPKeyPurpose)keyPurpose, keyContextString, (MPAlgorithmVersion)algorithmVersion );
|
||||
(*env)->ReleaseByteArrayElements( env, masterKey, masterKeyBytes, JNI_ABORT );
|
||||
(*env)->ReleaseStringUTFChars( env, siteName, siteNameString );
|
||||
(*env)->ReleaseStringUTFChars( env, keyContext, keyContextString );
|
||||
|
||||
if (!siteKeyBytes)
|
||||
return NULL;
|
||||
|
||||
jbyteArray siteKey = (*env)->NewByteArray( env, (jsize)MPMasterKeySize );
|
||||
(*env)->SetByteArrayRegion( env, siteKey, 0, (jsize)MPMasterKeySize, (jbyte *)siteKeyBytes );
|
||||
mpw_free( &siteKeyBytes, MPSiteKeySize );
|
||||
|
||||
return siteKey;
|
||||
}
|
||||
|
||||
/* native String _siteResult(final byte[] masterKey, final byte[] siteKey, final String siteName, final long siteCounter,
|
||||
final MPKeyPurpose keyPurpose, @Nullable final String keyContext,
|
||||
final MPResultType resultType, @Nullable final String resultParam, final Version version) */
|
||||
JNIEXPORT jstring JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteResult(JNIEnv *env, jobject obj,
|
||||
jbyteArray masterKey, jbyteArray siteKey, jstring siteName, jlong siteCounter, jint keyPurpose, jstring keyContext,
|
||||
jint resultType, jstring resultParam, jint algorithmVersion) {
|
||||
|
||||
jbyte *masterKeyBytes = (*env)->GetByteArrayElements( env, masterKey, NULL );
|
||||
jbyte *siteKeyBytes = (*env)->GetByteArrayElements( env, siteKey, NULL );
|
||||
const char *siteNameString = (*env)->GetStringUTFChars( env, siteName, NULL );
|
||||
const char *keyContextString = keyContext? (*env)->GetStringUTFChars( env, keyContext, NULL ): NULL;
|
||||
const char *resultParamString = resultParam? (*env)->GetStringUTFChars( env, resultParam, NULL ): NULL;
|
||||
const char *siteResultString = mpw_siteResult(
|
||||
(MPMasterKey)masterKeyBytes, siteNameString, (MPCounterValue)siteCounter,
|
||||
(MPKeyPurpose)keyPurpose, keyContextString, (MPResultType)resultType, resultParamString, (MPAlgorithmVersion)algorithmVersion );
|
||||
(*env)->ReleaseByteArrayElements( env, masterKey, masterKeyBytes, JNI_ABORT );
|
||||
(*env)->ReleaseByteArrayElements( env, siteKey, siteKeyBytes, JNI_ABORT );
|
||||
(*env)->ReleaseStringUTFChars( env, siteName, siteNameString );
|
||||
(*env)->ReleaseStringUTFChars( env, keyContext, keyContextString );
|
||||
(*env)->ReleaseStringUTFChars( env, resultParam, resultParamString );
|
||||
|
||||
if (!siteResultString)
|
||||
return NULL;
|
||||
|
||||
jstring siteResult = (*env)->NewStringUTF( env, siteResultString );
|
||||
mpw_free_string( &siteResultString );
|
||||
|
||||
return siteResult;
|
||||
}
|
||||
|
||||
/* native String _siteState(final byte[] masterKey, final byte[] siteKey, final String siteName, final long siteCounter,
|
||||
final MPKeyPurpose keyPurpose, @Nullable final String keyContext,
|
||||
final MPResultType resultType, final String resultParam, final Version version) */
|
||||
JNIEXPORT jstring JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteState(JNIEnv *env, jobject obj,
|
||||
jbyteArray masterKey, jbyteArray siteKey, jstring siteName, jlong siteCounter, jint keyPurpose, jstring keyContext,
|
||||
jint resultType, jstring resultParam, jint algorithmVersion) {
|
||||
|
||||
jbyte *masterKeyBytes = (*env)->GetByteArrayElements( env, masterKey, NULL );
|
||||
jbyte *siteKeyBytes = (*env)->GetByteArrayElements( env, siteKey, NULL );
|
||||
const char *siteNameString = (*env)->GetStringUTFChars( env, siteName, NULL );
|
||||
const char *keyContextString = keyContext? (*env)->GetStringUTFChars( env, keyContext, NULL ): NULL;
|
||||
const char *resultParamString = (*env)->GetStringUTFChars( env, resultParam, NULL );
|
||||
const char *siteStateString = mpw_siteState(
|
||||
(MPMasterKey)masterKeyBytes, siteNameString, (MPCounterValue)siteCounter,
|
||||
(MPKeyPurpose)keyPurpose, keyContextString, (MPResultType)resultType, resultParamString, (MPAlgorithmVersion)algorithmVersion );
|
||||
(*env)->ReleaseByteArrayElements( env, masterKey, masterKeyBytes, JNI_ABORT );
|
||||
(*env)->ReleaseByteArrayElements( env, siteKey, siteKeyBytes, JNI_ABORT );
|
||||
(*env)->ReleaseStringUTFChars( env, siteName, siteNameString );
|
||||
(*env)->ReleaseStringUTFChars( env, keyContext, keyContextString );
|
||||
(*env)->ReleaseStringUTFChars( env, resultParam, resultParamString );
|
||||
|
||||
if (!siteStateString)
|
||||
return NULL;
|
||||
|
||||
jstring siteState = (*env)->NewStringUTF( env, siteStateString );
|
||||
mpw_free_string( &siteStateString );
|
||||
|
||||
return siteState;
|
||||
}
|
||||
|
|
|
@ -11,11 +11,35 @@ extern "C" {
|
|||
#define com_lyndir_masterpassword_impl_MPAlgorithmV0_AES_BLOCKSIZE 128L
|
||||
/*
|
||||
* Class: com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||
* Method: _scrypt
|
||||
* Signature: ([B[BIII[B)I
|
||||
* Method: _masterKey
|
||||
* Signature: (Ljava/lang/String;[BI)[B
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1scrypt
|
||||
(JNIEnv *, jobject, jbyteArray, jbyteArray, jint, jint, jint, jbyteArray);
|
||||
JNIEXPORT jbyteArray JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1masterKey
|
||||
(JNIEnv *, jobject, jstring, jbyteArray, jint);
|
||||
|
||||
/*
|
||||
* Class: com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||
* Method: _siteKey
|
||||
* Signature: ([BLjava/lang/String;JILjava/lang/String;I)[B
|
||||
*/
|
||||
JNIEXPORT jbyteArray JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteKey
|
||||
(JNIEnv *, jobject, jbyteArray, jstring, jlong, jint, jstring, jint);
|
||||
|
||||
/*
|
||||
* Class: com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||
* Method: _siteResult
|
||||
* Signature: ([B[BLjava/lang/String;JILjava/lang/String;ILjava/lang/String;I)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteResult
|
||||
(JNIEnv *, jobject, jbyteArray, jbyteArray, jstring, jlong, jint, jstring, jint, jstring, jint);
|
||||
|
||||
/*
|
||||
* Class: com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||
* Method: _siteState
|
||||
* Signature: ([B[BLjava/lang/String;JILjava/lang/String;ILjava/lang/String;I)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1siteState
|
||||
(JNIEnv *, jobject, jbyteArray, jbyteArray, jstring, jlong, jint, jstring, jint, jstring, jint);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue