diff --git a/.gitignore b/.gitignore index ad3c78b2..1d1d7d1e 100644 --- a/.gitignore +++ b/.gitignore @@ -37,5 +37,6 @@ MasterPassword/C/*.o MasterPassword/C/mpw-*.tar.gz MasterPassword/C/mpw MasterPassword/C/mpw-bench +MasterPassword/C/mpw-tests MasterPassword/C/lib/*/* !MasterPassword/C/lib/*/.source diff --git a/MasterPassword/C/build b/MasterPassword/C/build index f01e4a0d..b2f58d8d 100755 --- a/MasterPassword/C/build +++ b/MasterPassword/C/build @@ -34,6 +34,7 @@ else targets=( mpw # C CLI version of Master Password. mpw-bench # C CLI Master Password benchmark utility. + mpw-tests # C Master Password algorithm tester. ) fi @@ -252,19 +253,48 @@ mpw-bench() { # library paths -L"." -L"lib/scrypt" -L"lib/bcrypt" - # libraries + # link libraries -l"crypto" ) - cc "${CFLAGS[@]}" "$@" -c mpw-algorithm.c -o mpw-algorithm.o - cc "${CFLAGS[@]}" "$@" -c mpw-types.c -o mpw-types.o - cc "${CFLAGS[@]}" "$@" -c mpw-util.c -o mpw-util.o cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" \ mpw-bench.c -o mpw-bench echo "done! Now use ./mpw-bench" } +### MPW-TESTS +mpw-tests() { + depend scrypt + + echo + echo "Building target: $target..." + CFLAGS=( + # include paths + -I"lib/include" + -I"/usr/include/libxml2" + ) + LDFLAGS=( + # scrypt + "lib/scrypt/scrypt-crypto_aesctr.o" + "lib/scrypt/scrypt-sha256.o" + "lib/scrypt/scrypt-crypto_scrypt-nosse.o" + "lib/scrypt/scrypt-memlimit.o" + "lib/scrypt/scrypt-scryptenc_cpuperf.o" + "lib/scrypt/scrypt-scryptenc.o" + # library paths + -L"." -L"lib/scrypt" + # link libraries + -l"crypto" -l"xml2" + ) + + cc "${CFLAGS[@]}" "$@" -c mpw-tests-util.c -o mpw-tests-util.o + cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" "mpw-tests-util.o" \ + mpw-tests.c -o mpw-tests + echo "done! Now use ./mpw-tests" +} + + ### TARGETS haslib() { diff --git a/MasterPassword/C/mpw-algorithm.c b/MasterPassword/C/mpw-algorithm.c index 9f6471c8..0210e789 100644 --- a/MasterPassword/C/mpw-algorithm.c +++ b/MasterPassword/C/mpw-algorithm.c @@ -100,7 +100,7 @@ const char *mpw_passwordForSite(const uint8_t *masterKey, const char *siteName, // Encode the password from the seed using the template. char *const sitePassword = calloc( strlen( template ) + 1, sizeof( char ) ); - for (int c = 0; c < strlen( template ); ++c) { + for (size_t c = 0; c < strlen( template ); ++c) { sitePassword[c] = mpw_characterFromClass( template[c], sitePasswordSeed[c + 1] ); trc( "class %c, index %u (0x%02X) -> character: %c\n", template[c], sitePasswordSeed[c + 1], sitePasswordSeed[c + 1], sitePassword[c] ); diff --git a/MasterPassword/C/mpw-bench.c b/MasterPassword/C/mpw-bench.c index be64de13..5f817c63 100644 --- a/MasterPassword/C/mpw-bench.c +++ b/MasterPassword/C/mpw-bench.c @@ -17,6 +17,7 @@ #include "mpw-types.h" #include "mpw-algorithm.h" +#include "mpw-util.h" #define MP_N 32768 #define MP_r 8 diff --git a/MasterPassword/C/mpw-cli.c b/MasterPassword/C/mpw-cli.c index 0aee2a41..44752099 100644 --- a/MasterPassword/C/mpw-cli.c +++ b/MasterPassword/C/mpw-cli.c @@ -150,7 +150,7 @@ int main(int argc, char *const argv[]) { if (!siteName && !(siteName = getlinep( "Site name:" ))) ftl( "Missing site name.\n" ); if (siteCounterString) - siteCounter = atoi( siteCounterString ); + siteCounter = (uint32_t)atol( siteCounterString ); if (siteCounter < 1) ftl( "Invalid site counter: %d\n", siteCounter ); if (siteVariantString) @@ -189,7 +189,7 @@ int main(int argc, char *const argv[]) { // Output the password. const uint8_t *masterKey = mpw_masterKeyForUser( fullName, masterPassword ); - mpw_free( masterPassword, strlen( masterPassword ) ); + mpw_freeString( masterPassword ); if (!masterKey) ftl( "Couldn't derive master key." ); diff --git a/MasterPassword/C/mpw-tests-util.c b/MasterPassword/C/mpw-tests-util.c new file mode 100644 index 00000000..1636f994 --- /dev/null +++ b/MasterPassword/C/mpw-tests-util.c @@ -0,0 +1,76 @@ +// +// mpw-tests-util.c +// MasterPassword +// +// Created by Maarten Billemont on 2014-12-21. +// Copyright (c) 2014 Lyndir. All rights reserved. +// + +#include +#include +#include + +#include "mpw-util.h" + +#include "mpw-tests-util.h" + +static xmlChar const *mpw_xmlPath(xmlNodePtr context) { + + if (context->parent) { + char *string = calloc( 256, 1 ); + snprintf( string, 256, "%s/%s", mpw_xmlPath( context->parent ), context->name ); + return BAD_CAST string; + } + + return context->name? context->name: (xmlChar const *)""; +} + +xmlNodePtr mpw_xmlTestCaseNode(xmlNodePtr testCaseNode, const char *nodeName) { + + // Try to find an attribute node. + for (xmlAttrPtr child = testCaseNode->properties; child; child = child->next) + if (xmlStrcmp( child->name, BAD_CAST nodeName ) == 0) + return (xmlNodePtr)child; + + // Try to find an element node. + for (xmlNodePtr child = testCaseNode->children; child; child = child->next) + if (xmlStrcmp( child->name, BAD_CAST nodeName ) == 0) + return child; + + // Missing content, try to find parent case. + if (strcmp(nodeName, "parent") == 0) + // Was just searching for testCaseNode's parent, none found. + return NULL; + xmlChar *parentId = mpw_xmlTestCaseString( testCaseNode, "parent" ); + if (!parentId) + // testCaseNode has no parent, give up. + return NULL; + + for (xmlNodePtr otherTestCaseNode = testCaseNode->parent->children; otherTestCaseNode; otherTestCaseNode = otherTestCaseNode->next) { + xmlChar *id = mpw_xmlTestCaseString( otherTestCaseNode, "id" ); + int foundParent = xmlStrcmp( id, parentId ) == 0; + xmlFree( id ); + + if (foundParent) { + xmlFree( parentId ); + return mpw_xmlTestCaseNode( otherTestCaseNode, nodeName ); + } + } + + ftl( "Missing parent: %s, for case: %s\n", parentId, mpw_xmlTestCaseString( testCaseNode, "id" ) ); +} + +xmlChar *mpw_xmlTestCaseString(xmlNodePtr context, const char *nodeName) { + + xmlNodePtr child = mpw_xmlTestCaseNode( context, nodeName ); + return xmlNodeGetContent( child ); +} + +uint32_t mpw_xmlTestCaseInteger(xmlNodePtr context, const char *nodeName) { + + xmlChar *string = mpw_xmlTestCaseString( context, nodeName ); + uint32_t integer = atol( (char *)string ); + xmlFree( string ); + + return integer; +} diff --git a/MasterPassword/C/mpw-tests-util.h b/MasterPassword/C/mpw-tests-util.h new file mode 100644 index 00000000..7dcd1721 --- /dev/null +++ b/MasterPassword/C/mpw-tests-util.h @@ -0,0 +1,16 @@ +// +// mpw-tests-util.h +// MasterPassword +// +// Created by Maarten Billemont on 2014-12-21. +// Copyright (c) 2014 Lyndir. All rights reserved. +// + +#include + +xmlNodePtr mpw_xmlTestCaseNode( + xmlNodePtr testCaseNode, const char *nodeName); +xmlChar *mpw_xmlTestCaseString( + xmlNodePtr context, const char *nodeName); +uint32_t mpw_xmlTestCaseInteger( + xmlNodePtr context, const char *nodeName); diff --git a/MasterPassword/C/mpw-tests.c b/MasterPassword/C/mpw-tests.c new file mode 100644 index 00000000..0ce00f6a --- /dev/null +++ b/MasterPassword/C/mpw-tests.c @@ -0,0 +1,77 @@ +#define _GNU_SOURCE + +#include +#include + +#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); exit(2); } while (0) + +#include "mpw-types.h" +#include "mpw-algorithm.h" +#include "mpw-util.h" + +#include "mpw-tests-util.h" + +int main(int argc, char *const argv[]) { + + int failedTests = 0; + + xmlNodePtr tests = xmlDocGetRootElement( xmlParseFile( "mpw_tests.xml" ) ); + for (xmlNodePtr testCase = tests->children; testCase; testCase = testCase->next) { + if (testCase->type != XML_ELEMENT_NODE || xmlStrcmp( testCase->name, BAD_CAST "case" ) != 0) + continue; + + // Read in the test case. + xmlChar *id = mpw_xmlTestCaseString( testCase, "id" ); + xmlChar *fullName = mpw_xmlTestCaseString( testCase, "fullName" ); + xmlChar *masterPassword = mpw_xmlTestCaseString( testCase, "masterPassword" ); + xmlChar *keyID = mpw_xmlTestCaseString( testCase, "keyID" ); + xmlChar *siteName = mpw_xmlTestCaseString( testCase, "siteName" ); + uint32_t siteCounter = mpw_xmlTestCaseInteger( testCase, "siteCounter" ); + xmlChar *siteTypeString = mpw_xmlTestCaseString( testCase, "siteType" ); + xmlChar *siteVariantString = mpw_xmlTestCaseString( testCase, "siteVariant" ); + xmlChar *siteContext = mpw_xmlTestCaseString( testCase, "siteContext" ); + xmlChar *result = mpw_xmlTestCaseString( testCase, "result" ); + + MPSiteType siteType = mpw_typeWithName( (char *)siteTypeString ); + MPSiteVariant siteVariant = mpw_variantWithName( (char *)siteVariantString ); + + // Run the test case. + fprintf( stdout, "test case %s... ", id ); + + // 1. calculate the master key. + const uint8_t *masterKey = mpw_masterKeyForUser( + (char *)fullName, (char *)masterPassword ); + if (!masterKey) + ftl( "Couldn't derive master key." ); + + // 2. calculate the site password. + const char *sitePassword = mpw_passwordForSite( + masterKey, (char *)siteName, siteType, siteCounter, siteVariant, (char *)siteContext ); + mpw_free( masterKey, MP_dkLen ); + if (!sitePassword) + ftl( "Couldn't derive site password." ); + + // Check the result. + if (xmlStrcmp( result, BAD_CAST sitePassword ) == 0) + fprintf( stdout, "pass.\n" ); + + else { + ++failedTests; + fprintf( stdout, "FAILED! (result %s != expected %s)\n", result, sitePassword ); + } + + // Free test case. + mpw_freeString( sitePassword ); + xmlFree( id ); + xmlFree( fullName ); + xmlFree( masterPassword ); + xmlFree( keyID ); + xmlFree( siteName ); + xmlFree( siteTypeString ); + xmlFree( siteVariantString ); + xmlFree( siteContext ); + xmlFree( result ); + } + + return failedTests; +} diff --git a/MasterPassword/C/mpw-types.c b/MasterPassword/C/mpw-types.c index 4f19bdd3..b86fedd6 100644 --- a/MasterPassword/C/mpw-types.c +++ b/MasterPassword/C/mpw-types.c @@ -17,37 +17,44 @@ #endif #include "mpw-types.h" +#include "mpw-util.h" const MPSiteType mpw_typeWithName(const char *typeName) { - char lowerTypeName[strlen(typeName)]; - strcpy(lowerTypeName, typeName); - for (char *tN = lowerTypeName; *tN; ++tN) - *tN = (char)tolower(*tN); - if (0 == strcmp(lowerTypeName, "x") || 0 == strcmp(lowerTypeName, "max") || 0 == strcmp(lowerTypeName, "maximum")) + size_t stdTypeNameSize = strlen( typeName ); + char stdTypeName[strlen( typeName )]; + if (stdTypeNameSize > strlen( "generated" )) + strcpy( stdTypeName, typeName + strlen( "generated" ) ); + else + strcpy( stdTypeName, typeName ); + for (char *tN = stdTypeName; *tN; ++tN) + *tN = (char)tolower( *tN ); + + if (0 == strcmp( stdTypeName, "x" ) || 0 == strcmp( stdTypeName, "max" ) || 0 == strcmp( stdTypeName, "maximum" )) return MPSiteTypeGeneratedMaximum; - if (0 == strcmp(lowerTypeName, "l") || 0 == strcmp(lowerTypeName, "long")) + if (0 == strcmp( stdTypeName, "l" ) || 0 == strcmp( stdTypeName, "long" )) return MPSiteTypeGeneratedLong; - if (0 == strcmp(lowerTypeName, "m") || 0 == strcmp(lowerTypeName, "med") || 0 == strcmp(lowerTypeName, "medium")) + if (0 == strcmp( stdTypeName, "m" ) || 0 == strcmp( stdTypeName, "med" ) || 0 == strcmp( stdTypeName, "medium" )) return MPSiteTypeGeneratedMedium; - if (0 == strcmp(lowerTypeName, "b") || 0 == strcmp(lowerTypeName, "basic")) + if (0 == strcmp( stdTypeName, "b" ) || 0 == strcmp( stdTypeName, "basic" )) return MPSiteTypeGeneratedBasic; - if (0 == strcmp(lowerTypeName, "s") || 0 == strcmp(lowerTypeName, "short")) + if (0 == strcmp( stdTypeName, "s" ) || 0 == strcmp( stdTypeName, "short" )) return MPSiteTypeGeneratedShort; - if (0 == strcmp(lowerTypeName, "i") || 0 == strcmp(lowerTypeName, "pin")) + if (0 == strcmp( stdTypeName, "i" ) || 0 == strcmp( stdTypeName, "pin" )) return MPSiteTypeGeneratedPIN; - if (0 == strcmp(lowerTypeName, "n") || 0 == strcmp(lowerTypeName, "name")) + if (0 == strcmp( stdTypeName, "n" ) || 0 == strcmp( stdTypeName, "name" )) return MPSiteTypeGeneratedName; - if (0 == strcmp(lowerTypeName, "p") || 0 == strcmp(lowerTypeName, "phrase")) + if (0 == strcmp( stdTypeName, "p" ) || 0 == strcmp( stdTypeName, "phrase" )) return MPSiteTypeGeneratedPhrase; - fprintf(stderr, "Not a generated type name: %s", lowerTypeName); + fprintf( stderr, "Not a generated type name: %s", stdTypeName ); abort(); } const char *mpw_templateForType(MPSiteType type, uint8_t seedByte) { + if (!(type & MPSiteTypeClassGenerated)) { - fprintf(stderr, "Not a generated type: %d", type); + fprintf( stderr, "Not a generated type: %d", type ); abort(); } @@ -57,7 +64,13 @@ const char *mpw_templateForType(MPSiteType type, uint8_t seedByte) { return templates[seedByte % 2]; } case MPSiteTypeGeneratedLong: { - const char *templates[] = { "CvcvnoCvcvCvcv", "CvcvCvcvnoCvcv", "CvcvCvcvCvcvno", "CvccnoCvcvCvcv", "CvccCvcvnoCvcv", "CvccCvcvCvcvno", "CvcvnoCvccCvcv", "CvcvCvccnoCvcv", "CvcvCvccCvcvno", "CvcvnoCvcvCvcc", "CvcvCvcvnoCvcc", "CvcvCvcvCvccno", "CvccnoCvccCvcv", "CvccCvccnoCvcv", "CvccCvccCvcvno", "CvcvnoCvccCvcc", "CvcvCvccnoCvcc", "CvcvCvccCvccno", "CvccnoCvcvCvcc", "CvccCvcvnoCvcc", "CvccCvcvCvccno" }; + const char *templates[] = { "CvcvnoCvcvCvcv", "CvcvCvcvnoCvcv", "CvcvCvcvCvcvno", + "CvccnoCvcvCvcv", "CvccCvcvnoCvcv", "CvccCvcvCvcvno", + "CvcvnoCvccCvcv", "CvcvCvccnoCvcv", "CvcvCvccCvcvno", + "CvcvnoCvcvCvcc", "CvcvCvcvnoCvcc", "CvcvCvcvCvccno", + "CvccnoCvccCvcv", "CvccCvccnoCvcv", "CvccCvccCvcvno", + "CvcvnoCvccCvcc", "CvcvCvccnoCvcc", "CvcvCvccCvccno", + "CvccnoCvcvCvcc", "CvccCvcvnoCvcc", "CvccCvcvCvccno" }; return templates[seedByte % 21]; } case MPSiteTypeGeneratedMedium: { @@ -82,30 +95,32 @@ const char *mpw_templateForType(MPSiteType type, uint8_t seedByte) { return templates[seedByte % 3]; } default: { - fprintf(stderr, "Unknown generated type: %d", type); + fprintf( stderr, "Unknown generated type: %d", type ); abort(); } } } const MPSiteVariant mpw_variantWithName(const char *variantName) { - char lowerVariantName[strlen(variantName)]; - strcpy(lowerVariantName, variantName); - for (char *vN = lowerVariantName; *vN; ++vN) - *vN = (char)tolower(*vN); - if (0 == strcmp(lowerVariantName, "p") || 0 == strcmp(lowerVariantName, "password")) + char stdVariantName[strlen( variantName )]; + strcpy( stdVariantName, variantName ); + for (char *vN = stdVariantName; *vN; ++vN) + *vN = (char)tolower( *vN ); + + if (0 == strcmp( stdVariantName, "p" ) || 0 == strcmp( stdVariantName, "password" )) return MPSiteVariantPassword; - if (0 == strcmp(lowerVariantName, "l") || 0 == strcmp(lowerVariantName, "login")) + if (0 == strcmp( stdVariantName, "l" ) || 0 == strcmp( stdVariantName, "login" )) return MPSiteVariantLogin; - if (0 == strcmp(lowerVariantName, "a") || 0 == strcmp(lowerVariantName, "answer")) + if (0 == strcmp( stdVariantName, "a" ) || 0 == strcmp( stdVariantName, "answer" )) return MPSiteVariantAnswer; - fprintf(stderr, "Not a variant name: %s", lowerVariantName); + fprintf( stderr, "Not a variant name: %s", stdVariantName ); abort(); } const char *mpw_scopeForVariant(MPSiteVariant variant) { + switch (variant) { case MPSiteVariantPassword: { return "com.lyndir.masterpassword"; @@ -117,13 +132,14 @@ const char *mpw_scopeForVariant(MPSiteVariant variant) { return "com.lyndir.masterpassword.answer"; } default: { - fprintf(stderr, "Unknown variant: %d", variant); + fprintf( stderr, "Unknown variant: %d", variant ); abort(); } } } const char mpw_characterFromClass(char characterClass, uint8_t seedByte) { + const char *classCharacters; switch (characterClass) { case 'V': { @@ -167,10 +183,10 @@ const char mpw_characterFromClass(char characterClass, uint8_t seedByte) { break; } default: { - fprintf(stderr, "Unknown character class: %c", characterClass); + fprintf( stderr, "Unknown character class: %c", characterClass ); abort(); - } + } } - return classCharacters[seedByte % strlen(classCharacters)]; + return classCharacters[seedByte % strlen( classCharacters )]; } diff --git a/MasterPassword/C/mpw-types.h b/MasterPassword/C/mpw-types.h index 14334b82..95017074 100644 --- a/MasterPassword/C/mpw-types.h +++ b/MasterPassword/C/mpw-types.h @@ -6,17 +6,6 @@ // Copyright (c) 2014 Lyndir. All rights reserved. // -//// Logging. - -#ifdef DEBUG -#define trc(...) fprintf( stderr, __VA_ARGS__ ) -#else -#define trc(...) do {} while (0) -#endif -#ifndef ftl -#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); abort(); } while (0) -#endif - //// Types. typedef enum { diff --git a/MasterPassword/C/mpw-util.c b/MasterPassword/C/mpw-util.c index be7864c0..7610fc79 100644 --- a/MasterPassword/C/mpw-util.c +++ b/MasterPassword/C/mpw-util.c @@ -22,15 +22,16 @@ void mpw_pushBuf(uint8_t **const buffer, size_t *const bufferSize, const void *p return; *bufferSize += pushSize; - uint8_t **const resizedBuffer = realloc( *buffer, *bufferSize ); + uint8_t *resizedBuffer = realloc( *buffer, *bufferSize ); if (!resizedBuffer) { // realloc failed, we can't push. Mark the buffer as broken. mpw_free( *buffer, *bufferSize - pushSize ); - *bufferSize = -1; + *bufferSize = (size_t)-1; *buffer = NULL; return; } + *buffer = resizedBuffer; uint8_t *pushDst = *buffer + *bufferSize - pushSize; memcpy( pushDst, pushBuffer, pushSize ); } @@ -51,6 +52,11 @@ void mpw_free(const void *buffer, const size_t bufferSize) { free( (void *)buffer ); } +void mpw_freeString(const char *string) { + + mpw_free( string, strlen( string ) ); +} + uint8_t const *mpw_scrypt(const size_t keySize, const char *secret, const uint8_t *salt, const size_t saltSize, uint64_t N, uint32_t r, uint32_t p) { @@ -88,7 +94,7 @@ static char *mpw_hex_buf = NULL; const char *mpw_hex(const void *buf, size_t length) { mpw_hex_buf = realloc( mpw_hex_buf, length * 2 + 1 ); - for (int kH = 0; kH < length; kH++) + for (size_t kH = 0; kH < length; kH++) sprintf( &(mpw_hex_buf[kH * 2]), "%02X", ((const uint8_t *)buf)[kH] ); return mpw_hex_buf; diff --git a/MasterPassword/C/mpw-util.h b/MasterPassword/C/mpw-util.h index 27adf206..701af92c 100644 --- a/MasterPassword/C/mpw-util.h +++ b/MasterPassword/C/mpw-util.h @@ -6,6 +6,17 @@ // Copyright (c) 2014 Lyndir. All rights reserved. // +//// Logging. + +#ifdef DEBUG +#define trc(...) fprintf( stderr, __VA_ARGS__ ) +#else +#define trc(...) do {} while (0) +#endif +#ifndef ftl +#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); abort(); } while (0) +#endif + //// Buffers and memory. /** Push a buffer onto a buffer. reallocs the given buffer and appends the given buffer. */ @@ -20,6 +31,9 @@ void mpw_pushInt( /** Free a buffer after zero'ing its contents. */ void mpw_free( const void *buffer, const size_t bufferSize); +/** Free a string after zero'ing its contents. */ +void mpw_freeString( + const char *string); //// Cryptographic functions. diff --git a/MasterPassword/C/mpw_tests.xml b/MasterPassword/C/mpw_tests.xml new file mode 120000 index 00000000..8fb4c0a1 --- /dev/null +++ b/MasterPassword/C/mpw_tests.xml @@ -0,0 +1 @@ +../Java/masterpassword-algorithm/src/test/resources/mpw_tests.xml \ No newline at end of file diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj index 83f3e0ce..6ece4ab7 100644 --- a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj @@ -75,6 +75,20 @@ DA60717C195D040500CA98B5 /* icon_gear.png in Resources */ = {isa = PBXBuildFile; fileRef = DA607092195D03E200CA98B5 /* icon_gear.png */; }; DA60717D195D040500CA98B5 /* icon_gear@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA607093195D03E200CA98B5 /* icon_gear@2x.png */; }; DA6558A419A99609009A0BEB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DA6558A319A99609009A0BEB /* Images.xcassets */; }; + DA6773CA1A4746AF004F356A /* bashlib in Resources */ = {isa = PBXBuildFile; fileRef = DA67732A1A4746AF004F356A /* bashlib */; }; + DA6773CB1A4746AF004F356A /* build in Resources */ = {isa = PBXBuildFile; fileRef = DA67732B1A4746AF004F356A /* build */; }; + DA6773CC1A4746AF004F356A /* distribute in Resources */ = {isa = PBXBuildFile; fileRef = DA67732C1A4746AF004F356A /* distribute */; }; + DA6773CD1A4746AF004F356A /* install in Resources */ = {isa = PBXBuildFile; fileRef = DA67732D1A4746AF004F356A /* install */; }; + DA6774291A4746AF004F356A /* mpw-algorithm.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773BB1A4746AF004F356A /* mpw-algorithm.c */; }; + DA67742F1A4746AF004F356A /* mpw-types.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773C21A4746AF004F356A /* mpw-types.c */; }; + DA6774311A4746AF004F356A /* mpw-util.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773C51A4746AF004F356A /* mpw-util.c */; }; + DA6774331A4746AF004F356A /* mpw.bashrc in Resources */ = {isa = PBXBuildFile; fileRef = DA6773C81A4746AF004F356A /* mpw.bashrc */; }; + DA6774341A4746AF004F356A /* VERSION in Resources */ = {isa = PBXBuildFile; fileRef = DA6773C91A4746AF004F356A /* VERSION */; }; + DA6774431A474A3B004F356A /* mpw-algorithm.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773BB1A4746AF004F356A /* mpw-algorithm.c */; }; + DA6774441A474A3B004F356A /* mpw-tests.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773C11A4746AF004F356A /* mpw-tests.c */; }; + DA6774451A474A3B004F356A /* mpw-types.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773C21A4746AF004F356A /* mpw-types.c */; }; + DA6774461A474A3B004F356A /* mpw-util.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6773C51A4746AF004F356A /* mpw-util.c */; }; + DA67744A1A47C8F7004F356A /* mpw-tests-util.c in Sources */ = {isa = PBXBuildFile; fileRef = DA6774481A47C8F7004F356A /* mpw-tests-util.c */; }; DA8ED895192906920099B726 /* PearlTween.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8ED891192906920099B726 /* PearlTween.m */; }; DA8ED896192906920099B726 /* PearlTween.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED892192906920099B726 /* PearlTween.h */; }; DA8ED897192906920099B726 /* map-macro.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED894192906920099B726 /* map-macro.h */; }; @@ -211,6 +225,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + DA6774391A474A03004F356A /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; DAADCC4E19FB006500987B1D /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -742,6 +765,24 @@ DA6701B716406A4100B61001 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; }; DA6701DD16406B7300B61001 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; DA672D2E14F92C6B004A189C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + DA67732A1A4746AF004F356A /* bashlib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bashlib; sourceTree = ""; }; + DA67732B1A4746AF004F356A /* build */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = build; sourceTree = ""; }; + DA67732C1A4746AF004F356A /* distribute */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = distribute; sourceTree = ""; }; + DA67732D1A4746AF004F356A /* install */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = install; sourceTree = ""; }; + DA6773BB1A4746AF004F356A /* mpw-algorithm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm.c"; sourceTree = ""; }; + DA6773BC1A4746AF004F356A /* mpw-algorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-algorithm.h"; sourceTree = ""; }; + DA6773BF1A4746AF004F356A /* mpw-bench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-bench.c"; sourceTree = ""; }; + DA6773C01A4746AF004F356A /* mpw-cli.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-cli.c"; sourceTree = ""; }; + DA6773C11A4746AF004F356A /* mpw-tests.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests.c"; sourceTree = ""; }; + DA6773C21A4746AF004F356A /* mpw-types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-types.c"; sourceTree = ""; }; + DA6773C31A4746AF004F356A /* mpw-types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-types.h"; sourceTree = ""; }; + DA6773C51A4746AF004F356A /* mpw-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-util.c"; sourceTree = ""; }; + DA6773C61A4746AF004F356A /* mpw-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-util.h"; sourceTree = ""; }; + DA6773C81A4746AF004F356A /* mpw.bashrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mpw.bashrc; sourceTree = ""; }; + DA6773C91A4746AF004F356A /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = ""; }; + DA67743B1A474A03004F356A /* mpw-test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "mpw-test"; sourceTree = BUILT_PRODUCTS_DIR; }; + DA6774481A47C8F7004F356A /* mpw-tests-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests-util.c"; sourceTree = ""; }; + DA6774491A47C8F7004F356A /* mpw-tests-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-tests-util.h"; sourceTree = ""; }; DA8ED891192906920099B726 /* PearlTween.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlTween.m; sourceTree = ""; }; DA8ED892192906920099B726 /* PearlTween.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlTween.h; sourceTree = ""; }; DA8ED894192906920099B726 /* map-macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-macro.h"; sourceTree = ""; }; @@ -888,6 +929,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DA6774381A474A03004F356A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; DAADCC4D19FB006500987B1D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -939,6 +987,7 @@ DA5BFA39147E415C00F98B1E = { isa = PBXGroup; children = ( + DA6773291A4746AF004F356A /* C */, DA5E5C961724A667003798D8 /* ObjC */, DACA23B41705DF7D002C6C22 /* Resources */, DACA22121705DDC5002C6C22 /* External */, @@ -956,6 +1005,7 @@ DAC77CAD148291A600BCF976 /* libPearl.a */, DAC6326C148680650075AEA5 /* libjrswizzle.a */, DAADCC5019FB006500987B1D /* libKCOrderedAccessorFix.a */, + DA67743B1A474A03004F356A /* mpw-test */, ); name = Products; sourceTree = ""; @@ -1476,6 +1526,31 @@ path = Insignia; sourceTree = ""; }; + DA6773291A4746AF004F356A /* C */ = { + isa = PBXGroup; + children = ( + DA67732A1A4746AF004F356A /* bashlib */, + DA67732B1A4746AF004F356A /* build */, + DA67732C1A4746AF004F356A /* distribute */, + DA67732D1A4746AF004F356A /* install */, + DA6773BB1A4746AF004F356A /* mpw-algorithm.c */, + DA6773BC1A4746AF004F356A /* mpw-algorithm.h */, + DA6773BF1A4746AF004F356A /* mpw-bench.c */, + DA6773C01A4746AF004F356A /* mpw-cli.c */, + DA6774481A47C8F7004F356A /* mpw-tests-util.c */, + DA6774491A47C8F7004F356A /* mpw-tests-util.h */, + DA6773C11A4746AF004F356A /* mpw-tests.c */, + DA6773C21A4746AF004F356A /* mpw-types.c */, + DA6773C31A4746AF004F356A /* mpw-types.h */, + DA6773C51A4746AF004F356A /* mpw-util.c */, + DA6773C61A4746AF004F356A /* mpw-util.h */, + DA6773C81A4746AF004F356A /* mpw.bashrc */, + DA6773C91A4746AF004F356A /* VERSION */, + ); + name = C; + path = ../../C; + sourceTree = ""; + }; DA8ED893192906920099B726 /* include */ = { isa = PBXGroup; children = ( @@ -1847,6 +1922,23 @@ productReference = DA5BFA44147E415C00F98B1E /* Master Password.app */; productType = "com.apple.product-type.application"; }; + DA67743A1A474A03004F356A /* mpw-test */ = { + isa = PBXNativeTarget; + buildConfigurationList = DA67743F1A474A03004F356A /* Build configuration list for PBXNativeTarget "mpw-test" */; + buildPhases = ( + DA6774371A474A03004F356A /* Sources */, + DA6774381A474A03004F356A /* Frameworks */, + DA6774391A474A03004F356A /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "mpw-test"; + productName = "mpw-test"; + productReference = DA67743B1A474A03004F356A /* mpw-test */; + productType = "com.apple.product-type.tool"; + }; DAADCC4F19FB006500987B1D /* KCOrderedAccessorFix */ = { isa = PBXNativeTarget; buildConfigurationList = DAADCC5E19FB006500987B1D /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */; @@ -1919,6 +2011,9 @@ }; }; }; + DA67743A1A474A03004F356A = { + CreatedOnToolsVersion = 6.1.1; + }; DAADCC4F19FB006500987B1D = { CreatedOnToolsVersion = 6.0.1; }; @@ -1947,6 +2042,7 @@ DAC77CAC148291A600BCF976 /* Pearl */, DAC6326B148680650075AEA5 /* jrswizzle */, DAADCC4F19FB006500987B1D /* KCOrderedAccessorFix */, + DA67743A1A474A03004F356A /* mpw-test */, ); }; /* End PBXProject section */ @@ -1972,6 +2068,7 @@ DACA27131705DF81002C6C22 /* avatar-3@2x.png in Resources */, DACA27141705DF81002C6C22 /* avatar-7.png in Resources */, DAF4EF57190A828100023C90 /* Exo2.0-Regular.otf in Resources */, + DA6773CA1A4746AF004F356A /* bashlib in Resources */, DACA27151705DF81002C6C22 /* avatar-0.png in Resources */, DA6558A419A99609009A0BEB /* Images.xcassets in Resources */, DACA27161705DF81002C6C22 /* avatar-12.png in Resources */, @@ -1979,6 +2076,7 @@ DAF4EF59190A828100023C90 /* Exo2.0-Bold.otf in Resources */, DACA27181705DF81002C6C22 /* avatar-9.png in Resources */, DAAA81B0195A8D1300FA30D9 /* gradient.png in Resources */, + DA6774331A4746AF004F356A /* mpw.bashrc in Resources */, DACA27191705DF81002C6C22 /* avatar-1@2x.png in Resources */, DA2508F119511D3600AC23F1 /* MPPasswordWindowController.xib in Resources */, DA60717C195D040500CA98B5 /* icon_gear.png in Resources */, @@ -2001,9 +2099,11 @@ DACA27291705DF81002C6C22 /* avatar-17.png in Resources */, DACA272A1705DF81002C6C22 /* avatar-5.png in Resources */, DACA272B1705DF81002C6C22 /* avatar-2.png in Resources */, + DA6773CD1A4746AF004F356A /* install in Resources */, DACA272C1705DF81002C6C22 /* avatar-14@2x.png in Resources */, DACA272D1705DF81002C6C22 /* avatar-4@2x.png in Resources */, DACA272E1705DF81002C6C22 /* avatar-9@2x.png in Resources */, + DA6774341A4746AF004F356A /* VERSION in Resources */, DACA272F1705DF81002C6C22 /* avatar-3.png in Resources */, DACA27301705DF81002C6C22 /* avatar-18.png in Resources */, DACA27311705DF81002C6C22 /* avatar-4.png in Resources */, @@ -2017,7 +2117,9 @@ DACA27351705DF81002C6C22 /* avatar-11.png in Resources */, DACA27361705DF81002C6C22 /* avatar-0@2x.png in Resources */, DACA27371705DF81002C6C22 /* avatar-10@2x.png in Resources */, + DA6773CC1A4746AF004F356A /* distribute in Resources */, DACA27381705DF81002C6C22 /* menu-icon.png in Resources */, + DA6773CB1A4746AF004F356A /* build in Resources */, DACA29671705DF81002C6C22 /* SourceCodePro-ExtraLight.otf in Resources */, DACA29681705DF81002C6C22 /* SourceCodePro-Black.otf in Resources */, DACA296F1705DF81002C6C22 /* Crashlytics.plist in Resources */, @@ -2104,6 +2206,7 @@ DA32CFE519CF1C71004F3F0E /* MPUserEntity.m in Sources */, DA5E5CF71724A667003798D8 /* MPAlgorithmV0.m in Sources */, DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */, + DA6774311A4746AF004F356A /* mpw-util.c in Sources */, DA5E5CF91724A667003798D8 /* MPAppDelegate_Key.m in Sources */, DA5180CE19FF307E00A587E9 /* MPAppDelegate_Store.m in Sources */, DA5E5CFA1724A667003798D8 /* MPAppDelegate_Shared.m in Sources */, @@ -2119,15 +2222,29 @@ 93D39C5789EFA607CF788082 /* MPSiteModel.m in Sources */, DA5180CA19FF2F9200A587E9 /* MPAlgorithmV2.m in Sources */, 93D39F833DEC1C89B2F795AC /* MPPasswordWindowController.m in Sources */, + DA67742F1A4746AF004F356A /* mpw-types.c in Sources */, DA32CFD919CF1C70004F3F0E /* MPGeneratedSiteEntity.m in Sources */, 93D390C676DF52DA7E459F19 /* MPPasswordWindow.m in Sources */, 93D39784E725A34D1EE3FB3B /* MPInitialWindowController.m in Sources */, DA32CFDF19CF1C70004F3F0E /* MPSiteEntity.m in Sources */, 93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */, + DA6774291A4746AF004F356A /* mpw-algorithm.c in Sources */, 93D395E4830290EBB6E71F34 /* MPNoStateButton.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; + DA6774371A474A03004F356A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DA6774441A474A3B004F356A /* mpw-tests.c in Sources */, + DA67744A1A47C8F7004F356A /* mpw-tests-util.c in Sources */, + DA6774451A474A3B004F356A /* mpw-types.c in Sources */, + DA6774461A474A3B004F356A /* mpw-util.c in Sources */, + DA6774431A474A3B004F356A /* mpw-algorithm.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DAADCC4C19FB006500987B1D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2236,6 +2353,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; @@ -2287,6 +2405,10 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ( @@ -2294,6 +2416,7 @@ "\"$(SRCROOT)/../../../External\"/**", ); MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2311,6 +2434,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; @@ -2362,6 +2486,10 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ( @@ -2369,6 +2497,7 @@ "\"$(SRCROOT)/../../../External\"/**", ); MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "${TARGET_NAME}"; RUN_CLANG_STATIC_ANALYZER = YES; @@ -2426,6 +2555,42 @@ }; name = "AdHoc-Mac"; }; + DA6774401A474A03004F356A /* Debug-Mac */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_DOCUMENTATION_COMMENTS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /usr/include/libxml2, + ); + }; + name = "Debug-Mac"; + }; + DA6774411A474A03004F356A /* AdHoc-Mac */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_DOCUMENTATION_COMMENTS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /usr/include/libxml2, + ); + }; + name = "AdHoc-Mac"; + }; + DA6774421A474A03004F356A /* AppStore-Mac */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_DOCUMENTATION_COMMENTS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /usr/include/libxml2, + ); + }; + name = "AppStore-Mac"; + }; DA95D60914DF3F3B008D1B94 /* AppStore-Mac */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2435,6 +2600,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_WARN_CXX0X_EXTENSIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; @@ -2486,6 +2652,10 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ( @@ -2493,6 +2663,7 @@ "\"$(SRCROOT)/../../../External\"/**", ); MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "${TARGET_NAME}"; RUN_CLANG_STATIC_ANALYZER = YES; @@ -2672,6 +2843,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "AdHoc-Mac"; }; + DA67743F1A474A03004F356A /* Build configuration list for PBXNativeTarget "mpw-test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DA6774401A474A03004F356A /* Debug-Mac */, + DA6774411A474A03004F356A /* AdHoc-Mac */, + DA6774421A474A03004F356A /* AppStore-Mac */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "AdHoc-Mac"; + }; DAADCC5E19FB006500987B1D /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/xcshareddata/xcschemes/mpw-test.xcscheme b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/xcshareddata/xcschemes/mpw-test.xcscheme new file mode 100644 index 00000000..70d726ee --- /dev/null +++ b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/xcshareddata/xcschemes/mpw-test.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj index ee4b3735..a534c884 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj @@ -47,7 +47,6 @@ 93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */; }; 93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D8A953779B35403AF6E /* PearlUICollectionView.m */; }; 93D39AA4A0BE66A872CCC02E /* NSPersistentStore+PearlMigration.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D397F4BAFFF7CF3F1B21A4 /* NSPersistentStore+PearlMigration.h */; }; - 93D39B35D4B8E87ADEC05246 /* mpw-cli.c in Sources */ = {isa = PBXBuildFile; fileRef = 93D398121C8F063A3637144E /* mpw-cli.c */; }; 93D39B429C67A62E29DC02DA /* MPRootSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399493FEDDE74DD1A0C15 /* MPRootSegue.m */; }; 93D39B76DD5AB108BA8928E8 /* UIScrollView+PearlAdjustInsets.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */; }; 93D39B842AB9A5D072810D76 /* NSError+PearlFullDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */; }; @@ -496,6 +495,7 @@ 93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = ""; }; 93D3970502644794E8A027BE /* MPNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNavigationController.h; sourceTree = ""; }; 93D3971FE104BB4052484151 /* MPUsersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUsersViewController.h; sourceTree = ""; }; + 93D397288D0655822A73A539 /* mpw-tests-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests-util.c"; sourceTree = ""; }; 93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = ""; }; 93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+PearlAttributes.m"; sourceTree = ""; }; 93D3979016BF0C5B29D1340D /* distribute */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = distribute; sourceTree = ""; }; @@ -528,6 +528,7 @@ 93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUICollectionView.h; sourceTree = ""; }; 93D39B381350802A194BF332 /* MPAvatarCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAvatarCell.m; sourceTree = ""; }; 93D39B455A71EC98C749E623 /* MPOverlayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayViewController.h; sourceTree = ""; }; + 93D39B48CAB328B3E0C0C67D /* mpw-tests-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-tests-util.h"; sourceTree = ""; }; 93D39B573E4DE98BAE518215 /* build */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = build; sourceTree = ""; }; 93D39B70138D0E28F7D5E86B /* mpw-bench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-bench.c"; sourceTree = ""; }; 93D39BAA71DE51B4D8A1286C /* MPCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCell.m; sourceTree = ""; }; @@ -657,6 +658,7 @@ DA67460A18DE7F0C00DFE240 /* Exo2.0-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Regular.otf"; sourceTree = ""; }; DA67460B18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-ExtraBold.otf"; sourceTree = ""; }; DA67460C18DE7F0C00DFE240 /* Exo2.0-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Bold.otf"; sourceTree = ""; }; + DA6774351A4749CC004F356A /* mpw-tests.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests.c"; sourceTree = ""; }; DA70EC7F1811B13C00F65DB2 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; DA72BD7419C133BF00E6ACFE /* libscryptenc-ios-sim.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libscryptenc-ios-sim.a"; sourceTree = ""; }; DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libopensslcrypto-ios-dev.a"; sourceTree = ""; }; @@ -1608,20 +1610,23 @@ 93D39A2239FFFE6BEC83E191 /* C */ = { isa = PBXGroup; children = ( - 93D39B573E4DE98BAE518215 /* build */, - 93D3969393A3A46BD27D7078 /* mpw-algorithm.c */, 93D39E71D6BAECEC4CD886F4 /* bashlib */, - 93D39ACD33E79386E6F33601 /* install */, - 93D392C5A6572DB0EB5B82C8 /* mpw-types.c */, - 93D39AFD17CBE324D745DAB0 /* mpw-types.h */, - 93D3944F4D55D2A37EF6021B /* VERSION */, + 93D39B573E4DE98BAE518215 /* build */, 93D3979016BF0C5B29D1340D /* distribute */, - 93D39245A478883C672818F3 /* mpw.bashrc */, + 93D39ACD33E79386E6F33601 /* install */, + 93D3969393A3A46BD27D7078 /* mpw-algorithm.c */, + 93D3990D850D76A94C6B7A4D /* mpw-algorithm.h */, 93D39B70138D0E28F7D5E86B /* mpw-bench.c */, 93D398121C8F063A3637144E /* mpw-cli.c */, - 93D3990D850D76A94C6B7A4D /* mpw-algorithm.h */, - 93D39CF7DB942C69D1C5D6BE /* mpw-util.h */, + 93D397288D0655822A73A539 /* mpw-tests-util.c */, + 93D39B48CAB328B3E0C0C67D /* mpw-tests-util.h */, + DA6774351A4749CC004F356A /* mpw-tests.c */, + 93D392C5A6572DB0EB5B82C8 /* mpw-types.c */, + 93D39AFD17CBE324D745DAB0 /* mpw-types.h */, 93D396C311C3725870343EE0 /* mpw-util.c */, + 93D39CF7DB942C69D1C5D6BE /* mpw-util.h */, + 93D39245A478883C672818F3 /* mpw.bashrc */, + 93D3944F4D55D2A37EF6021B /* VERSION */, ); name = C; path = ../../C; @@ -3636,7 +3641,6 @@ 93D39B429C67A62E29DC02DA /* MPRootSegue.m in Sources */, 93D392FD5E2052F7D7DB3774 /* NSString+MPMarkDown.m in Sources */, 93D395B715D15F2B56F2A2EE /* mpw-types.c in Sources */, - 93D39B35D4B8E87ADEC05246 /* mpw-cli.c in Sources */, 93D39943D01E70DAC3B0DF76 /* mpw-util.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0;