Added C tests for mpw_tests.xml
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -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] );
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
 | 
			
		||||
#include "mpw-types.h"
 | 
			
		||||
#include "mpw-algorithm.h"
 | 
			
		||||
#include "mpw-util.h"
 | 
			
		||||
 | 
			
		||||
#define MP_N                32768
 | 
			
		||||
#define MP_r                8
 | 
			
		||||
 
 | 
			
		||||
@@ -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." );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										76
									
								
								MasterPassword/C/mpw-tests-util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								MasterPassword/C/mpw-tests-util.c
									
									
									
									
									
										Normal file
									
								
							@@ -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 <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								MasterPassword/C/mpw-tests-util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								MasterPassword/C/mpw-tests-util.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 <libxml/parser.h>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
							
								
								
									
										77
									
								
								MasterPassword/C/mpw-tests.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								MasterPassword/C/mpw-tests.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
#define _GNU_SOURCE
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#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;
 | 
			
		||||
}
 | 
			
		||||
@@ -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 )];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								MasterPassword/C/mpw_tests.xml
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								MasterPassword/C/mpw_tests.xml
									
									
									
									
									
										Symbolic link
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
../Java/masterpassword-algorithm/src/test/resources/mpw_tests.xml
 | 
			
		||||
@@ -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 = "<group>"; };
 | 
			
		||||
		DA67732B1A4746AF004F356A /* build */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = build; sourceTree = "<group>"; };
 | 
			
		||||
		DA67732C1A4746AF004F356A /* distribute */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = distribute; sourceTree = "<group>"; };
 | 
			
		||||
		DA67732D1A4746AF004F356A /* install */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = install; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773BB1A4746AF004F356A /* mpw-algorithm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773BC1A4746AF004F356A /* mpw-algorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-algorithm.h"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773BF1A4746AF004F356A /* mpw-bench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-bench.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C01A4746AF004F356A /* mpw-cli.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-cli.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C11A4746AF004F356A /* mpw-tests.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C21A4746AF004F356A /* mpw-types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-types.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C31A4746AF004F356A /* mpw-types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-types.h"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C51A4746AF004F356A /* mpw-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-util.c"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C61A4746AF004F356A /* mpw-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-util.h"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C81A4746AF004F356A /* mpw.bashrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mpw.bashrc; sourceTree = "<group>"; };
 | 
			
		||||
		DA6773C91A4746AF004F356A /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = "<group>"; };
 | 
			
		||||
		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 = "<group>"; };
 | 
			
		||||
		DA6774491A47C8F7004F356A /* mpw-tests-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-tests-util.h"; sourceTree = "<group>"; };
 | 
			
		||||
		DA8ED891192906920099B726 /* PearlTween.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlTween.m; sourceTree = "<group>"; };
 | 
			
		||||
		DA8ED892192906920099B726 /* PearlTween.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlTween.h; sourceTree = "<group>"; };
 | 
			
		||||
		DA8ED894192906920099B726 /* map-macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-macro.h"; sourceTree = "<group>"; };
 | 
			
		||||
@@ -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 = "<group>";
 | 
			
		||||
@@ -1476,6 +1526,31 @@
 | 
			
		||||
			path = Insignia;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		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 = "<group>";
 | 
			
		||||
		};
 | 
			
		||||
		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 = (
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,86 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<Scheme
 | 
			
		||||
   LastUpgradeVersion = "0610"
 | 
			
		||||
   version = "1.3">
 | 
			
		||||
   <BuildAction
 | 
			
		||||
      parallelizeBuildables = "YES"
 | 
			
		||||
      buildImplicitDependencies = "YES">
 | 
			
		||||
      <BuildActionEntries>
 | 
			
		||||
         <BuildActionEntry
 | 
			
		||||
            buildForTesting = "YES"
 | 
			
		||||
            buildForRunning = "YES"
 | 
			
		||||
            buildForProfiling = "YES"
 | 
			
		||||
            buildForArchiving = "YES"
 | 
			
		||||
            buildForAnalyzing = "YES">
 | 
			
		||||
            <BuildableReference
 | 
			
		||||
               BuildableIdentifier = "primary"
 | 
			
		||||
               BlueprintIdentifier = "DA67743A1A474A03004F356A"
 | 
			
		||||
               BuildableName = "mpw-test"
 | 
			
		||||
               BlueprintName = "mpw-test"
 | 
			
		||||
               ReferencedContainer = "container:MasterPassword-Mac.xcodeproj">
 | 
			
		||||
            </BuildableReference>
 | 
			
		||||
         </BuildActionEntry>
 | 
			
		||||
      </BuildActionEntries>
 | 
			
		||||
   </BuildAction>
 | 
			
		||||
   <TestAction
 | 
			
		||||
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
 | 
			
		||||
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
 | 
			
		||||
      shouldUseLaunchSchemeArgsEnv = "YES"
 | 
			
		||||
      buildConfiguration = "Debug-Mac">
 | 
			
		||||
      <Testables>
 | 
			
		||||
      </Testables>
 | 
			
		||||
      <MacroExpansion>
 | 
			
		||||
         <BuildableReference
 | 
			
		||||
            BuildableIdentifier = "primary"
 | 
			
		||||
            BlueprintIdentifier = "DA67743A1A474A03004F356A"
 | 
			
		||||
            BuildableName = "mpw-test"
 | 
			
		||||
            BlueprintName = "mpw-test"
 | 
			
		||||
            ReferencedContainer = "container:MasterPassword-Mac.xcodeproj">
 | 
			
		||||
         </BuildableReference>
 | 
			
		||||
      </MacroExpansion>
 | 
			
		||||
   </TestAction>
 | 
			
		||||
   <LaunchAction
 | 
			
		||||
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
 | 
			
		||||
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
 | 
			
		||||
      launchStyle = "0"
 | 
			
		||||
      useCustomWorkingDirectory = "NO"
 | 
			
		||||
      buildConfiguration = "Debug-Mac"
 | 
			
		||||
      ignoresPersistentStateOnLaunch = "NO"
 | 
			
		||||
      debugDocumentVersioning = "YES"
 | 
			
		||||
      allowLocationSimulation = "YES">
 | 
			
		||||
      <BuildableProductRunnable>
 | 
			
		||||
         <BuildableReference
 | 
			
		||||
            BuildableIdentifier = "primary"
 | 
			
		||||
            BlueprintIdentifier = "DA67743A1A474A03004F356A"
 | 
			
		||||
            BuildableName = "mpw-test"
 | 
			
		||||
            BlueprintName = "mpw-test"
 | 
			
		||||
            ReferencedContainer = "container:MasterPassword-Mac.xcodeproj">
 | 
			
		||||
         </BuildableReference>
 | 
			
		||||
      </BuildableProductRunnable>
 | 
			
		||||
      <AdditionalOptions>
 | 
			
		||||
      </AdditionalOptions>
 | 
			
		||||
   </LaunchAction>
 | 
			
		||||
   <ProfileAction
 | 
			
		||||
      shouldUseLaunchSchemeArgsEnv = "YES"
 | 
			
		||||
      savedToolIdentifier = ""
 | 
			
		||||
      useCustomWorkingDirectory = "NO"
 | 
			
		||||
      buildConfiguration = "AdHoc-Mac"
 | 
			
		||||
      debugDocumentVersioning = "YES">
 | 
			
		||||
      <BuildableProductRunnable>
 | 
			
		||||
         <BuildableReference
 | 
			
		||||
            BuildableIdentifier = "primary"
 | 
			
		||||
            BlueprintIdentifier = "DA67743A1A474A03004F356A"
 | 
			
		||||
            BuildableName = "mpw-test"
 | 
			
		||||
            BlueprintName = "mpw-test"
 | 
			
		||||
            ReferencedContainer = "container:MasterPassword-Mac.xcodeproj">
 | 
			
		||||
         </BuildableReference>
 | 
			
		||||
      </BuildableProductRunnable>
 | 
			
		||||
   </ProfileAction>
 | 
			
		||||
   <AnalyzeAction
 | 
			
		||||
      buildConfiguration = "Debug-Mac">
 | 
			
		||||
   </AnalyzeAction>
 | 
			
		||||
   <ArchiveAction
 | 
			
		||||
      buildConfiguration = "AdHoc-Mac"
 | 
			
		||||
      revealArchiveInOrganizer = "YES">
 | 
			
		||||
   </ArchiveAction>
 | 
			
		||||
</Scheme>
 | 
			
		||||
@@ -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 = "<group>"; };
 | 
			
		||||
		93D3970502644794E8A027BE /* MPNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNavigationController.h; sourceTree = "<group>"; };
 | 
			
		||||
		93D3971FE104BB4052484151 /* MPUsersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUsersViewController.h; sourceTree = "<group>"; };
 | 
			
		||||
		93D397288D0655822A73A539 /* mpw-tests-util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests-util.c"; sourceTree = "<group>"; };
 | 
			
		||||
		93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
 | 
			
		||||
		93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+PearlAttributes.m"; sourceTree = "<group>"; };
 | 
			
		||||
		93D3979016BF0C5B29D1340D /* distribute */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = distribute; sourceTree = "<group>"; };
 | 
			
		||||
@@ -528,6 +528,7 @@
 | 
			
		||||
		93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUICollectionView.h; sourceTree = "<group>"; };
 | 
			
		||||
		93D39B381350802A194BF332 /* MPAvatarCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAvatarCell.m; sourceTree = "<group>"; };
 | 
			
		||||
		93D39B455A71EC98C749E623 /* MPOverlayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayViewController.h; sourceTree = "<group>"; };
 | 
			
		||||
		93D39B48CAB328B3E0C0C67D /* mpw-tests-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-tests-util.h"; sourceTree = "<group>"; };
 | 
			
		||||
		93D39B573E4DE98BAE518215 /* build */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = build; sourceTree = "<group>"; };
 | 
			
		||||
		93D39B70138D0E28F7D5E86B /* mpw-bench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-bench.c"; sourceTree = "<group>"; };
 | 
			
		||||
		93D39BAA71DE51B4D8A1286C /* MPCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCell.m; sourceTree = "<group>"; };
 | 
			
		||||
@@ -657,6 +658,7 @@
 | 
			
		||||
		DA67460A18DE7F0C00DFE240 /* Exo2.0-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Regular.otf"; sourceTree = "<group>"; };
 | 
			
		||||
		DA67460B18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-ExtraBold.otf"; sourceTree = "<group>"; };
 | 
			
		||||
		DA67460C18DE7F0C00DFE240 /* Exo2.0-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Bold.otf"; sourceTree = "<group>"; };
 | 
			
		||||
		DA6774351A4749CC004F356A /* mpw-tests.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests.c"; sourceTree = "<group>"; };
 | 
			
		||||
		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 = "<group>"; };
 | 
			
		||||
		DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libopensslcrypto-ios-dev.a"; sourceTree = "<group>"; };
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user