]> git.saurik.com Git - apple/security.git/blob - sec/Security/Regressions/secitem/si-11-update-data.c
Security-55471.tar.gz
[apple/security.git] / sec / Security / Regressions / secitem / si-11-update-data.c
1 /*
2 * Copyright (c) 2006-2010 Apple Inc. All Rights Reserved.
3 */
4
5 #include <CoreFoundation/CoreFoundation.h>
6 #include <Security/SecItem.h>
7 #include <Security/SecItemPriv.h>
8 #include <Security/SecBase.h>
9 #include <utilities/array_size.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12
13 #include "Security_regressions.h"
14
15 /* Test basic add delete update copy matching stuff. */
16 static void tests(void)
17 {
18 const char *v_data = "test";
19 CFDataRef pwdata = CFDataCreate(NULL, (UInt8 *)v_data, strlen(v_data));
20 const void *keys[] = {
21 kSecClass,
22 kSecAttrAccount,
23 kSecAttrService,
24 kSecValueData
25 };
26 const void *values[] = {
27 kSecClassGenericPassword,
28 CFSTR("dankeen"),
29 CFSTR("iTools"),
30 pwdata
31 };
32 CFDictionaryRef item = CFDictionaryCreate(NULL, keys, values,
33 array_size(keys), NULL, NULL);
34 ok_status(SecItemAdd(item, NULL), "add generic password");
35
36 CFTypeRef results = NULL;
37 /* Create a dict with all attrs except the data. */
38 CFDictionaryRef query = CFDictionaryCreate(NULL, keys, values,
39 (array_size(keys)) - 1, NULL, NULL);
40 ok_status(SecItemCopyMatching(query, &results), "find generic password");
41 if (results) {
42 CFRelease(results);
43 results = NULL;
44 }
45
46 /* Modify the data of the item. */
47 const char *v_data2 = "different password data this time";
48 CFDataRef pwdata2 = CFDataCreate(NULL, (UInt8 *)v_data2, strlen(v_data2));
49 CFMutableDictionaryRef changes = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
50 CFDictionarySetValue(changes, kSecValueData, pwdata2);
51 ok_status(SecItemUpdate(query, changes), "update generic password");
52
53 CFDictionarySetValue(changes, kSecValueData, NULL);
54 is_status(SecItemUpdate(query, changes), errSecParam, "update NULL data");
55
56 /* This seems to be what we were seeing in
57 <rdar://problem/6940041> 466 Crashes in securityd: kc_encrypt_data (SecItemServer.c:971).
58 which is now fixed. */
59 CFDictionarySetValue(changes, kSecValueData, CFSTR("bogus"));
60 is_status(SecItemUpdate(query, changes), errSecParam, "update string data");
61
62 ok_status(SecItemDelete(query), "delete generic password");
63
64 if (changes) {
65 CFRelease(changes);
66 changes = NULL;
67 }
68
69 if (item) {
70 CFRelease(item);
71 item = NULL;
72 }
73
74 if (query) {
75 CFRelease(query);
76 query = NULL;
77 }
78
79 if (pwdata) {
80 CFRelease(pwdata);
81 pwdata = NULL;
82 }
83
84 if (pwdata2) {
85 CFRelease(pwdata2);
86 pwdata = NULL;
87 }
88 }
89
90 int si_11_update_data(int argc, char *const *argv)
91 {
92 plan_tests(6);
93
94 tests();
95
96 return 0;
97 }