secedumodetest.m   [plain text]


//
//  Copyright 2016 Apple. All rights reserved.
//

/*
 * This is to fool os services to not provide the Keychain manager
 * interface tht doens't work since we don't have unified headers
 * between iOS and OS X. rdar://23405418/
 */
#define __KEYCHAINCORE__ 1

#include <Foundation/Foundation.h>
#include <Security/Security.h>
#include <Security/SecItemPriv.h>
#include <TargetConditionals.h>
#include <err.h>


int main (int argc, const char * argv[])
{
    @autoreleasepool {

        NSDictionary *addItem = @{
              (id)kSecClass : (id)kSecClassGenericPassword,
              (id)kSecAttrLabel : @"vpn-test-label",
              (id)kSecAttrAccount : @"vpn-test-account",
              (id)kSecValueData : @"password",
              (id)kSecUseSystemKeychain : @YES,
        };

        NSDictionary *querySystemItem = @{
            (id)kSecClass : (id)kSecClassGenericPassword,
            (id)kSecAttrLabel : @"vpn-test-label",
            (id)kSecAttrAccount : @"vpn-test-account",
            (id)kSecUseSystemKeychain : @YES,
        };

        NSDictionary *queryItem = @{
            (id)kSecClass : (id)kSecClassGenericPassword,
            (id)kSecAttrLabel : @"vpn-test-label",
            (id)kSecAttrAccount : @"vpn-test-account",
        };

        (void)SecItemDelete((__bridge CFDictionaryRef)querySystemItem);


        if (!SecItemAdd((__bridge CFDictionaryRef)addItem, NULL))
            errx(1, "failed to add");


        if (!SecItemCopyMatching((__bridge CFDictionaryRef)queryItem, NULL))
            errx(1, "failed to find in user + system");

        if (!SecItemCopyMatching((__bridge CFDictionaryRef)querySystemItem, NULL))
            errx(1, "failed to find in system");


        if (!SecItemDelete((__bridge CFDictionaryRef)querySystemItem))
            errx(1, "failed to clean up");

        return 0;
    }
}