// // secd-02-corruption.c // sec // // Created by Fabrice Gautier on 5/31/13. // // #include "secd_regressions.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if TARGET_OS_IPHONE && USE_KEYSTORE #include #include "SecdTestKeychainUtilities.h" #include "brighton_keychain_2_db.h" static OSStatus query_one(void) { OSStatus ok; /* querying a password */ const void *keys[] = { kSecClass, kSecAttrServer, }; const void *values[] = { kSecClassInternetPassword, CFSTR("members.spamcop.net"), }; CFDictionaryRef query = CFDictionaryCreate(NULL, keys, values, array_size(keys), NULL, NULL); CFTypeRef results = NULL; ok = SecItemCopyMatching(query, &results); CFReleaseSafe(results); CFReleaseSafe(query); return ok; } static void *do_query(void *arg) { /* querying a password */ const void *keys[] = { kSecClass, kSecAttrServer, }; const void *values[] = { kSecClassInternetPassword, CFSTR("members.spamcop.net"), }; CFDictionaryRef query = CFDictionaryCreate(NULL, keys, values, array_size(keys), NULL, NULL); CFTypeRef results = NULL; for(int i=0;i<20;i++) verify_action(SecItemCopyMatching(query, &results)==errSecUpgradePending, return (void *)-1); CFReleaseSafe(query); return NULL; } static void *do_sos(void *arg) { for(int i=0;i<20;i++) verify_action(SOSCCThisDeviceIsInCircle_Server(NULL)==-1, return (void *)-1); return NULL; } #define N_THREADS 10 int secd_02_upgrade_while_locked(int argc, char *const *argv) { plan_tests(11 + N_THREADS + kSecdTestSetupTestCount); __block keybag_handle_t keybag; __block keybag_state_t state; char *passcode="password"; int passcode_len=(int)strlen(passcode); /* custom keychain dir */ secd_test_setup_temp_keychain("secd_02_upgrade_while_locked", ^{ CFStringRef keychain_path_cf = __SecKeychainCopyPath(); CFStringPerformWithCString(keychain_path_cf, ^(const char *keychain_path) { writeFile(keychain_path, brighton_keychain_2_db, brighton_keychain_2_db_len); /* custom notification */ SecItemServerSetKeychainChangedNotification("com.apple.secdtests.keychainchanged"); /* Create and lock custom keybag */ ok(kIOReturnSuccess==aks_create_bag(passcode, passcode_len, kAppleKeyStoreDeviceBag, &keybag), "create keybag"); ok(kIOReturnSuccess==aks_get_lock_state(keybag, &state), "get keybag state"); ok(!(state&keybag_state_locked), "keybag unlocked"); SecItemServerSetKeychainKeybag(keybag); /* lock */ ok(kIOReturnSuccess==aks_lock_bag(keybag), "lock keybag"); ok(kIOReturnSuccess==aks_get_lock_state(keybag, &state), "get keybag state"); ok(state&keybag_state_locked, "keybag locked"); }); CFReleaseSafe(keychain_path_cf); }); pthread_t query_thread[N_THREADS]; pthread_t sos_thread; void *query_err[N_THREADS] = {NULL,}; void *sos_err = NULL; for(int i=0; i