1/* 2 * Copyright (c) 2014 Apple Inc. All Rights Reserved. 3 */ 4 5#include <CoreFoundation/CoreFoundation.h> 6#include <Security/SecItem.h> 7#include <Security/SecBase.h> 8#include <utilities/array_size.h> 9#include <utilities/SecCFWrappers.h> 10#include <stdlib.h> 11#include <unistd.h> 12 13#include "Security_regressions.h" 14 15static void tests(void) 16{ 17 CFDictionaryRef item = CFDictionaryCreateForCFTypes(NULL, 18 kSecClass, kSecClassGenericPassword, 19 kSecAttrAccount, CFSTR("empty-data-account-test"), 20 kSecAttrService, CFSTR("empty-data-svce-test"), 21 NULL); 22 ok_status(SecItemAdd(item, NULL), "add generic password"); 23 24 CFDictionaryRef query = CFDictionaryCreateForCFTypes(NULL, 25 kSecClass, kSecClassGenericPassword, 26 kSecAttrService, CFSTR("empty-data-svce-test"), 27 kSecMatchLimit, kSecMatchLimitAll, 28 kSecReturnData, kCFBooleanTrue, 29 kSecReturnAttributes, kCFBooleanTrue, 30 NULL); 31 CFTypeRef result; 32 ok_status(SecItemCopyMatching(query, &result), "query generic password"); 33 ok(isArray(result) && CFArrayGetCount(result) == 1, "return 1-sized array of results"); 34 CFDictionaryRef row = CFArrayGetValueAtIndex(result, 0); 35 ok(isDictionary(row), "array row is dictionary"); 36 ok(CFDictionaryGetValue(row, kSecValueData) == NULL, "result contains no data"); 37 ok(CFEqual(CFDictionaryGetValue(row, kSecAttrService), CFSTR("empty-data-svce-test")), "svce attribute is returned"); 38 ok(CFEqual(CFDictionaryGetValue(row, kSecAttrAccount), CFSTR("empty-data-account-test")), "account attribute is returned"); 39 40 CFRelease(result); 41 CFRelease(query); 42 query = CFDictionaryCreateForCFTypes(NULL, 43 kSecClass, kSecClassGenericPassword, 44 kSecAttrService, CFSTR("empty-data-svce-test"), 45 NULL); 46 ok_status(SecItemDelete(query), "delete testing item"); 47 48 CFRelease(query); 49 CFRelease(item); 50} 51 52int si_80_empty_data(int argc, char *const *argv) 53{ 54 plan_tests(8); 55 56 tests(); 57 58 return 0; 59} 60