]>
Commit | Line | Data |
---|---|---|
427c49bc A |
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 | } |