Initial native interface for scrypt.
This commit is contained in:
parent
faf59875bf
commit
cc82e52c33
@ -1,5 +1,6 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'java'
|
id 'java'
|
||||||
|
id 'c'
|
||||||
}
|
}
|
||||||
|
|
||||||
description = 'Master Password Algorithm Implementation'
|
description = 'Master Password Algorithm Implementation'
|
||||||
@ -9,8 +10,69 @@ dependencies {
|
|||||||
exclude( module: 'joda-time' )
|
exclude( module: 'joda-time' )
|
||||||
}
|
}
|
||||||
|
|
||||||
compile 'com.github.joshjdevl.libsodiumjni:libsodium-jni:1.0.6'
|
|
||||||
compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.5'
|
compile 'com.fasterxml.jackson.core:jackson-annotations:2.9.5'
|
||||||
compile group: 'org.jetbrains', name: 'annotations', version: '13.0'
|
compile group: 'org.jetbrains', name: 'annotations', version: '13.0'
|
||||||
compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1'
|
compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
dependsOn 'mpwSharedLibrary'
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: nativeGenHeaders should run prior to mpwSharedLibrary
|
||||||
|
// TODO: but that creates a cyclic dependency since processResources runs before compileJava which nativeGenHeaders depends on.
|
||||||
|
//task mpwSharedLibrary {
|
||||||
|
// dependsOn processResources
|
||||||
|
//}
|
||||||
|
build {
|
||||||
|
// dependsOn 'mpwSharedLibrary'
|
||||||
|
dependsOn 'nativeGenHeaders'
|
||||||
|
}
|
||||||
|
|
||||||
|
task nativeGenHeaders {
|
||||||
|
description "Uses javah to regenerate the JNI header files"
|
||||||
|
inputs.file sourceSets.main.output.asFileTree.matching {
|
||||||
|
include 'com/lyndir/masterpassword/impl/MPAlgorithmV0.class'
|
||||||
|
}
|
||||||
|
outputs.file 'src/mpw/c/jni_mpw.h'
|
||||||
|
def classpath = files( sourceSets.main.compileClasspath, sourceSets.main.output )
|
||||||
|
doLast {
|
||||||
|
ant.javah( class: 'com.lyndir.masterpassword.impl.MPAlgorithmV0',
|
||||||
|
outputFile: 'src/mpw/c/jni_mpw.h',
|
||||||
|
classpath: classpath.asPath )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
model {
|
||||||
|
components {
|
||||||
|
mpw( NativeLibrarySpec ) {
|
||||||
|
binaries.all {
|
||||||
|
if (targetPlatform.operatingSystem.macOsX) {
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/darwin"
|
||||||
|
cCompiler.args '-mmacosx-version-min=10.4'
|
||||||
|
linker.args '-mmacosx-version-min=10.4'
|
||||||
|
} else if (targetPlatform.operatingSystem.linux) {
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/linux"
|
||||||
|
cCompiler.args '-D_FILE_OFFSET_BITS=64'
|
||||||
|
} else if (targetPlatform.operatingSystem.windows) {
|
||||||
|
cCompiler.args "-I${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
|
||||||
|
cCompiler.args "-I${org.gradle.internal.jvm.Jvm.current().javaHome}/include/win32"
|
||||||
|
linker.args "Shlwapi.lib", "Advapi32.lib"
|
||||||
|
} else if (targetPlatform.operatingSystem.freeBSD) {
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
|
||||||
|
cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/freebsd"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Can't we add the sharedLibraryFile to the resources through some kind of task dependency instead?
|
||||||
|
binaries.withType( SharedLibraryBinarySpec ) {
|
||||||
|
sourceSets.main.resources.srcDirs it.sharedLibraryFile.parent
|
||||||
|
// copy {
|
||||||
|
// from sharedLibraryFile
|
||||||
|
// to sourceSets.main.resources.outputDir
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -27,7 +27,6 @@ import com.google.common.primitives.Bytes;
|
|||||||
import com.google.common.primitives.UnsignedInteger;
|
import com.google.common.primitives.UnsignedInteger;
|
||||||
import com.lyndir.lhunath.opal.system.*;
|
import com.lyndir.lhunath.opal.system.*;
|
||||||
import com.lyndir.lhunath.opal.system.logging.Logger;
|
import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||||
import com.lyndir.lhunath.opal.system.util.ConversionUtils;
|
|
||||||
import com.lyndir.masterpassword.*;
|
import com.lyndir.masterpassword.*;
|
||||||
import java.nio.*;
|
import java.nio.*;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
@ -38,7 +37,6 @@ import javax.annotation.Nullable;
|
|||||||
import javax.crypto.*;
|
import javax.crypto.*;
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import org.libsodium.jni.Sodium;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,8 +51,7 @@ public class MPAlgorithmV0 extends MPAlgorithm {
|
|||||||
protected static final int AES_BLOCKSIZE = 128 /* bit */;
|
protected static final int AES_BLOCKSIZE = 128 /* bit */;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
if (Sodium.sodium_init() < 0)
|
Native.load( MPAlgorithmV0.class, "mpw" );
|
||||||
throw new IllegalStateException( "Couldn't initialize libsodium." );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Version version = MPAlgorithm.Version.V0;
|
public final Version version = MPAlgorithm.Version.V0;
|
||||||
@ -93,7 +90,7 @@ public class MPAlgorithmV0 extends MPAlgorithm {
|
|||||||
@Nullable
|
@Nullable
|
||||||
protected byte[] scrypt(final byte[] secret, final byte[] salt, final int keySize) {
|
protected byte[] scrypt(final byte[] secret, final byte[] salt, final int keySize) {
|
||||||
byte[] buffer = new byte[keySize];
|
byte[] buffer = new byte[keySize];
|
||||||
if (Sodium.crypto_pwhash_scryptsalsa208sha256_ll(
|
if (_scrypt(
|
||||||
secret, secret.length, salt, salt.length,
|
secret, secret.length, salt, salt.length,
|
||||||
scrypt_N(), scrypt_r(), scrypt_p(), buffer, buffer.length ) < 0)
|
scrypt_N(), scrypt_r(), scrypt_p(), buffer, buffer.length ) < 0)
|
||||||
return null;
|
return null;
|
||||||
@ -101,6 +98,8 @@ public class MPAlgorithmV0 extends MPAlgorithm {
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected native int _scrypt(byte[] passwd, int passwdlen, byte[] salt, int saltlen, int N, int r, int p, byte[] buf, int buflen);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] siteKey(final byte[] masterKey, final String siteName, UnsignedInteger siteCounter,
|
public byte[] siteKey(final byte[] masterKey, final String siteName, UnsignedInteger siteCounter,
|
||||||
final MPKeyPurpose keyPurpose, @Nullable final String keyContext) {
|
final MPKeyPurpose keyPurpose, @Nullable final String keyContext) {
|
||||||
@ -259,27 +258,29 @@ public class MPAlgorithmV0 extends MPAlgorithm {
|
|||||||
public String siteResultFromDerive(final byte[] masterKey, final byte[] siteKey,
|
public String siteResultFromDerive(final byte[] masterKey, final byte[] siteKey,
|
||||||
final MPResultType resultType, @Nullable final String resultParam) {
|
final MPResultType resultType, @Nullable final String resultParam) {
|
||||||
|
|
||||||
if (resultType == MPResultType.DeriveKey) {
|
throw new UnsupportedOperationException( "TODO" );
|
||||||
int resultParamInt = ConversionUtils.toIntegerNN( resultParam );
|
|
||||||
if (resultParamInt == 0)
|
|
||||||
resultParamInt = mpw_keySize_max();
|
|
||||||
if ((resultParamInt < mpw_keySize_min()) || (resultParamInt > mpw_keySize_max()) || ((resultParamInt % 8) != 0))
|
|
||||||
throw logger.bug( "Parameter is not a valid key size (should be 128 - 512): %s", resultParam );
|
|
||||||
int keySize = resultParamInt / 8;
|
|
||||||
logger.trc( "keySize: %d", keySize );
|
|
||||||
|
|
||||||
// Derive key
|
// if (resultType == MPResultType.DeriveKey) {
|
||||||
byte[] resultKey = null; // TODO: mpw_kdf_blake2b()( keySize, siteKey, MPSiteKeySize, NULL, 0, 0, NULL );
|
// int resultParamInt = ConversionUtils.toIntegerNN( resultParam );
|
||||||
if (resultKey == null)
|
// if (resultParamInt == 0)
|
||||||
throw logger.bug( "Could not derive result key." );
|
// resultParamInt = mpw_keySize_max();
|
||||||
|
// if ((resultParamInt < mpw_keySize_min()) || (resultParamInt > mpw_keySize_max()) || ((resultParamInt % 8) != 0))
|
||||||
// Base64-encode
|
// throw logger.bug( "Parameter is not a valid key size (should be 128 - 512): %s", resultParam );
|
||||||
String b64Key = Preconditions.checkNotNull( BaseEncoding.base64().encode( resultKey ) );
|
// int keySize = resultParamInt / 8;
|
||||||
logger.trc( "b64 encoded -> key: %s", b64Key );
|
// logger.trc( "keySize: %d", keySize );
|
||||||
|
//
|
||||||
return b64Key;
|
// // Derive key
|
||||||
} else
|
// byte[] resultKey = null; // TODO: mpw_kdf_blake2b()( keySize, siteKey, MPSiteKeySize, NULL, 0, 0, NULL );
|
||||||
throw logger.bug( "Unsupported derived password type: %s", resultType );
|
// if (resultKey == null)
|
||||||
|
// throw logger.bug( "Could not derive result key." );
|
||||||
|
//
|
||||||
|
// // Base64-encode
|
||||||
|
// String b64Key = Preconditions.checkNotNull( BaseEncoding.base64().encode( resultKey ) );
|
||||||
|
// logger.trc( "b64 encoded -> key: %s", b64Key );
|
||||||
|
//
|
||||||
|
// return b64Key;
|
||||||
|
// } else
|
||||||
|
// throw logger.bug( "Unsupported derived password type: %s", resultType );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
//==============================================================================
|
||||||
|
// This file is part of Master Password.
|
||||||
|
// Copyright (c) 2011-2017, Maarten Billemont.
|
||||||
|
//
|
||||||
|
// Master Password is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Master Password is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You can find a copy of the GNU General Public License in the
|
||||||
|
// LICENSE file. Alternatively, see <http://www.gnu.org/licenses/>.
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
package com.lyndir.masterpassword.impl;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lhunath, 2018-05-22
|
||||||
|
*/
|
||||||
|
public final class Native {
|
||||||
|
private static final Logger logger = Logger.get( Native.class );
|
||||||
|
|
||||||
|
private static final char FILE_DOT = '.';
|
||||||
|
private static final String NATIVES_PATH = "";
|
||||||
|
|
||||||
|
@SuppressWarnings({ "HardcodedFileSeparator", "LoadLibraryWithNonConstantString" })
|
||||||
|
public static void load(final Class<?> context, final String name) {
|
||||||
|
try {
|
||||||
|
String library = System.mapLibraryName( name );
|
||||||
|
int libraryDot = library.lastIndexOf( FILE_DOT );
|
||||||
|
String libraryName = (libraryDot > 0)? library.substring( 0, libraryDot ): library;
|
||||||
|
String libraryExtension = (libraryDot > 0)? library.substring( libraryDot ): "lib";
|
||||||
|
String libraryResource = String.format( "%s/%s", NATIVES_PATH, library );
|
||||||
|
InputStream libraryStream = context.getResourceAsStream( libraryResource );
|
||||||
|
if (libraryStream == null)
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Library: " + name + " (" + libraryResource + "), not found in class loader for: " + context );
|
||||||
|
|
||||||
|
File libraryFile = File.createTempFile( "libmpw", ".dylib" );
|
||||||
|
ByteStreams.copy( libraryStream, new FileOutputStream( libraryFile ) );
|
||||||
|
System.load( libraryFile.getAbsolutePath() );
|
||||||
|
libraryFile.deleteOnExit();
|
||||||
|
if (!libraryFile.delete())
|
||||||
|
logger.wrn( "Couldn't clean up library after loading: " + libraryFile );
|
||||||
|
}
|
||||||
|
catch (final IOException e) {
|
||||||
|
throw new IllegalStateException( "Couldn't load library: " + name, e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
8
core/java/algorithm/src/mpw/c/jni_mpw.c
Normal file
8
core/java/algorithm/src/mpw/c/jni_mpw.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "jni_mpw.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) {
|
||||||
|
|
||||||
|
return -2;
|
||||||
|
}
|
23
core/java/algorithm/src/mpw/c/jni_mpw.h
Normal file
23
core/java/algorithm/src/mpw/c/jni_mpw.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class com_lyndir_masterpassword_impl_MPAlgorithmV0 */
|
||||||
|
|
||||||
|
#ifndef _Included_com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||||
|
#define _Included_com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#undef com_lyndir_masterpassword_impl_MPAlgorithmV0_AES_BLOCKSIZE
|
||||||
|
#define com_lyndir_masterpassword_impl_MPAlgorithmV0_AES_BLOCKSIZE 128L
|
||||||
|
/*
|
||||||
|
* Class: com_lyndir_masterpassword_impl_MPAlgorithmV0
|
||||||
|
* Method: _scrypt
|
||||||
|
* Signature: ([BI[BIIII[BI)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_com_lyndir_masterpassword_impl_MPAlgorithmV0__1scrypt
|
||||||
|
(JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint, jint, jint, jint, jbyteArray, jint);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -11,4 +11,7 @@ dependencies {
|
|||||||
testCompile group: 'org.testng', name: 'testng', version: '6.8.5'
|
testCompile group: 'org.testng', name: 'testng', version: '6.8.5'
|
||||||
testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.2'
|
testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.2'
|
||||||
}
|
}
|
||||||
|
//tasks.withType(Test) {
|
||||||
|
// systemProperty "java.library.path", "/Users/lhunath/Documents/workspace/lyndir/MasterPassword/core/java/algorithm/build/libs/mpw/shared"
|
||||||
|
//}
|
||||||
test.useTestNG()
|
test.useTestNG()
|
||||||
|
@ -0,0 +1,181 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 50;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
DA1554DE20B3928E00EA92C5 /* aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aes.c; sourceTree = "<group>"; };
|
||||||
|
DA1554DF20B3928E00EA92C5 /* mpw-algorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-algorithm.h"; sourceTree = "<group>"; };
|
||||||
|
DA1554E020B3928E00EA92C5 /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = "<group>"; };
|
||||||
|
DA1554E120B3928E00EA92C5 /* mpw-marshal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-marshal.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E220B3928E00EA92C5 /* mpw-algorithm_v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v2.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E320B3928E00EA92C5 /* mpw-types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-types.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E420B3928E00EA92C5 /* mpw-marshal-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-marshal-util.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E520B3928E00EA92C5 /* mpw-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-util.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E620B3928E00EA92C5 /* mpw-algorithm_v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v1.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554E720B3928E00EA92C5 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
|
||||||
|
DA1554E820B3928E00EA92C5 /* mpw-marshal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-marshal.h"; sourceTree = "<group>"; };
|
||||||
|
DA1554E920B3928E00EA92C5 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = base64.c; sourceTree = "<group>"; };
|
||||||
|
DA1554EA20B3928E00EA92C5 /* mpw-algorithm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554EB20B3928E00EA92C5 /* mpw-algorithm_v0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v0.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554EC20B3928E00EA92C5 /* mpw-types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-types.h"; sourceTree = "<group>"; };
|
||||||
|
DA1554ED20B3928E00EA92C5 /* mpw-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-util.h"; sourceTree = "<group>"; };
|
||||||
|
DA1554EE20B3928E00EA92C5 /* mpw-marshal-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-marshal-util.h"; sourceTree = "<group>"; };
|
||||||
|
DA1554EF20B3928E00EA92C5 /* mpw-algorithm_v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v3.c"; sourceTree = "<group>"; };
|
||||||
|
DA1554F120B392A100EA92C5 /* jni_mpw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jni_mpw.h; sourceTree = "<group>"; };
|
||||||
|
DA1554F220B392A100EA92C5 /* jni_mpw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jni_mpw.c; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
DA1554D220B3924000EA92C5 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DA1554F020B392A100EA92C5 /* jni */,
|
||||||
|
DA1554DD20B3928E00EA92C5 /* core */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DA1554DD20B3928E00EA92C5 /* core */ = {
|
||||||
|
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 */,
|
||||||
|
DA1554EB20B3928E00EA92C5 /* mpw-algorithm_v0.c */,
|
||||||
|
DA1554EC20B3928E00EA92C5 /* mpw-types.h */,
|
||||||
|
DA1554ED20B3928E00EA92C5 /* mpw-util.h */,
|
||||||
|
DA1554EE20B3928E00EA92C5 /* mpw-marshal-util.h */,
|
||||||
|
DA1554EF20B3928E00EA92C5 /* mpw-algorithm_v3.c */,
|
||||||
|
);
|
||||||
|
name = core;
|
||||||
|
path = ../../core/c;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DA1554F020B392A100EA92C5 /* jni */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DA1554F120B392A100EA92C5 /* jni_mpw.h */,
|
||||||
|
DA1554F220B392A100EA92C5 /* jni_mpw.c */,
|
||||||
|
);
|
||||||
|
name = jni;
|
||||||
|
path = ../../core/java/algorithm/src/mpw/c;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXLegacyTarget section */
|
||||||
|
DA1554D720B3924000EA92C5 /* MasterPassword-JNI */ = {
|
||||||
|
isa = PBXLegacyTarget;
|
||||||
|
buildArgumentsString = ":masterpassword-algorithm:nativeGenHeaders";
|
||||||
|
buildConfigurationList = DA1554DA20B3924000EA92C5 /* Build configuration list for PBXLegacyTarget "MasterPassword-JNI" */;
|
||||||
|
buildPhases = (
|
||||||
|
);
|
||||||
|
buildToolPath = gradle;
|
||||||
|
buildWorkingDirectory = /Users/lhunath/Documents/workspace/lyndir/MasterPassword/gradle;
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "MasterPassword-JNI";
|
||||||
|
passBuildSettingsInEnvironment = 1;
|
||||||
|
productName = "MasterPassword-JNI";
|
||||||
|
};
|
||||||
|
/* End PBXLegacyTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
DA1554D320B3924000EA92C5 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 0930;
|
||||||
|
ORGANIZATIONNAME = "Maarten Billemont";
|
||||||
|
TargetAttributes = {
|
||||||
|
DA1554D720B3924000EA92C5 = {
|
||||||
|
CreatedOnToolsVersion = 9.3.1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = DA1554D620B3924000EA92C5 /* Build configuration list for PBXProject "MasterPassword-JNI" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
);
|
||||||
|
mainGroup = DA1554D220B3924000EA92C5;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
DA1554D720B3924000EA92C5 /* MasterPassword-JNI */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
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 = {
|
||||||
|
JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
DA1554DC20B3924000EA92C5 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
DA1554D620B3924000EA92C5 /* Build configuration list for PBXProject "MasterPassword-JNI" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
DA1554D820B3924000EA92C5 /* Debug */,
|
||||||
|
DA1554D920B3924000EA92C5 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
DA1554DA20B3924000EA92C5 /* Build configuration list for PBXLegacyTarget "MasterPassword-JNI" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
DA1554DB20B3924000EA92C5 /* Debug */,
|
||||||
|
DA1554DC20B3924000EA92C5 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = DA1554D320B3924000EA92C5 /* Project object */;
|
||||||
|
}
|
@ -1,6 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Workspace
|
<Workspace
|
||||||
version = "1.0">
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:MasterPassword-JNI/MasterPassword-JNI.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:MasterPassword-iOS.xcodeproj">
|
location = "group:MasterPassword-iOS.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
Loading…
Reference in New Issue
Block a user