]> git.saurik.com Git - apple/security.git/blob - sec/Security/Regressions/secitem/si-42-identity.c
Security-55471.14.8.tar.gz
[apple/security.git] / sec / Security / Regressions / secitem / si-42-identity.c
1 /*
2 * si-42-secidentity.c
3 * Security
4 *
5 * Created by Michael Brouwer on 1/29/07.
6 * Copyright (c) 2007-2010 Apple Inc. All Rights Reserved.
7 *
8 */
9
10 #include <CoreFoundation/CoreFoundation.h>
11 #include <Security/SecCertificate.h>
12 #include <Security/SecCertificatePriv.h>
13 #include <Security/SecCertificateInternal.h>
14 #include <Security/SecKey.h>
15 #include <Security/SecRSAKey.h>
16 #include <Security/SecItem.h>
17 #include <Security/SecItemPriv.h>
18 #include <Security/SecIdentityPriv.h>
19 #include <Security/SecIdentity.h>
20 #include <utilities/array_size.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23
24 #include "Security_regressions.h"
25
26 #define CFReleaseNull(CF) { CFTypeRef _cf = (CF); if (_cf) { (CF) = NULL; CFRelease(_cf); } }
27
28 static const uint8_t _c0[] = {
29 0x30, 0x82, 0x04, 0xbb, 0x30, 0x82, 0x03, 0xa3,
30 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
31 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
32 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,
33 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
34 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13,
35 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
36 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49,
37 0x6e, 0x63, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06,
38 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, 0x70,
39 0x70, 0x6c, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74,
40 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
41 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
42 0x69, 0x74, 0x79, 0x31, 0x16, 0x30, 0x14, 0x06,
43 0x03, 0x55, 0x04, 0x03, 0x13, 0x0d, 0x41, 0x70,
44 0x70, 0x6c, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74,
45 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30,
46 0x36, 0x30, 0x34, 0x32, 0x35, 0x32, 0x31, 0x34,
47 0x30, 0x33, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x35,
48 0x30, 0x32, 0x30, 0x39, 0x32, 0x31, 0x34, 0x30,
49 0x33, 0x36, 0x5a, 0x30, 0x62, 0x31, 0x0b, 0x30,
50 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
51 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
52 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x41, 0x70, 0x70,
53 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31,
54 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b,
55 0x13, 0x1d, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
56 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
57 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,
58 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,
59 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x03,
60 0x13, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
61 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30,
62 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a,
63 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
64 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
65 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,
66 0xe4, 0x91, 0xa9, 0x09, 0x1f, 0x91, 0xdb, 0x1e,
67 0x47, 0x50, 0xeb, 0x05, 0xed, 0x5e, 0x79, 0x84,
68 0x2d, 0xeb, 0x36, 0xa2, 0x57, 0x4c, 0x55, 0xec,
69 0x8b, 0x19, 0x89, 0xde, 0xf9, 0x4b, 0x6c, 0xf5,
70 0x07, 0xab, 0x22, 0x30, 0x02, 0xe8, 0x18, 0x3e,
71 0xf8, 0x50, 0x09, 0xd3, 0x7f, 0x41, 0xa8, 0x98,
72 0xf9, 0xd1, 0xca, 0x66, 0x9c, 0x24, 0x6b, 0x11,
73 0xd0, 0xa3, 0xbb, 0xe4, 0x1b, 0x2a, 0xc3, 0x1f,
74 0x95, 0x9e, 0x7a, 0x0c, 0xa4, 0x47, 0x8b, 0x5b,
75 0xd4, 0x16, 0x37, 0x33, 0xcb, 0xc4, 0x0f, 0x4d,
76 0xce, 0x14, 0x69, 0xd1, 0xc9, 0x19, 0x72, 0xf5,
77 0x5d, 0x0e, 0xd5, 0x7f, 0x5f, 0x9b, 0xf2, 0x25,
78 0x03, 0xba, 0x55, 0x8f, 0x4d, 0x5d, 0x0d, 0xf1,
79 0x64, 0x35, 0x23, 0x15, 0x4b, 0x15, 0x59, 0x1d,
80 0xb3, 0x94, 0xf7, 0xf6, 0x9c, 0x9e, 0xcf, 0x50,
81 0xba, 0xc1, 0x58, 0x50, 0x67, 0x8f, 0x08, 0xb4,
82 0x20, 0xf7, 0xcb, 0xac, 0x2c, 0x20, 0x6f, 0x70,
83 0xb6, 0x3f, 0x01, 0x30, 0x8c, 0xb7, 0x43, 0xcf,
84 0x0f, 0x9d, 0x3d, 0xf3, 0x2b, 0x49, 0x28, 0x1a,
85 0xc8, 0xfe, 0xce, 0xb5, 0xb9, 0x0e, 0xd9, 0x5e,
86 0x1c, 0xd6, 0xcb, 0x3d, 0xb5, 0x3a, 0xad, 0xf4,
87 0x0f, 0x0e, 0x00, 0x92, 0x0b, 0xb1, 0x21, 0x16,
88 0x2e, 0x74, 0xd5, 0x3c, 0x0d, 0xdb, 0x62, 0x16,
89 0xab, 0xa3, 0x71, 0x92, 0x47, 0x53, 0x55, 0xc1,
90 0xaf, 0x2f, 0x41, 0xb3, 0xf8, 0xfb, 0xe3, 0x70,
91 0xcd, 0xe6, 0xa3, 0x4c, 0x45, 0x7e, 0x1f, 0x4c,
92 0x6b, 0x50, 0x96, 0x41, 0x89, 0xc4, 0x74, 0x62,
93 0x0b, 0x10, 0x83, 0x41, 0x87, 0x33, 0x8a, 0x81,
94 0xb1, 0x30, 0x58, 0xec, 0x5a, 0x04, 0x32, 0x8c,
95 0x68, 0xb3, 0x8f, 0x1d, 0xde, 0x65, 0x73, 0xff,
96 0x67, 0x5e, 0x65, 0xbc, 0x49, 0xd8, 0x76, 0x9f,
97 0x33, 0x14, 0x65, 0xa1, 0x77, 0x94, 0xc9, 0x2d,
98 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01,
99 0x7a, 0x30, 0x82, 0x01, 0x76, 0x30, 0x0e, 0x06,
100 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,
101 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0f, 0x06,
102 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
103 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d,
104 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04,
105 0x14, 0x2b, 0xd0, 0x69, 0x47, 0x94, 0x76, 0x09,
106 0xfe, 0xf4, 0x6b, 0x8d, 0x2e, 0x40, 0xa6, 0xf7,
107 0x47, 0x4d, 0x7f, 0x08, 0x5e, 0x30, 0x1f, 0x06,
108 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,
109 0x80, 0x14, 0x2b, 0xd0, 0x69, 0x47, 0x94, 0x76,
110 0x09, 0xfe, 0xf4, 0x6b, 0x8d, 0x2e, 0x40, 0xa6,
111 0xf7, 0x47, 0x4d, 0x7f, 0x08, 0x5e, 0x30, 0x82,
112 0x01, 0x11, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04,
113 0x82, 0x01, 0x08, 0x30, 0x82, 0x01, 0x04, 0x30,
114 0x82, 0x01, 0x00, 0x06, 0x09, 0x2a, 0x86, 0x48,
115 0x86, 0xf7, 0x63, 0x64, 0x05, 0x01, 0x30, 0x81,
116 0xf2, 0x30, 0x2a, 0x06, 0x08, 0x2b, 0x06, 0x01,
117 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1e, 0x68,
118 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,
119 0x77, 0x77, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65,
120 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x70,
121 0x6c, 0x65, 0x63, 0x61, 0x2f, 0x30, 0x81, 0xc3,
122 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
123 0x02, 0x02, 0x30, 0x81, 0xb6, 0x1a, 0x81, 0xb3,
124 0x52, 0x65, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65,
125 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73,
126 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
127 0x63, 0x61, 0x74, 0x65, 0x20, 0x62, 0x79, 0x20,
128 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, 0x74,
129 0x79, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65,
130 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74,
131 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20,
132 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e,
133 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
134 0x62, 0x6c, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e,
135 0x64, 0x61, 0x72, 0x64, 0x20, 0x74, 0x65, 0x72,
136 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63,
137 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
138 0x73, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65,
139 0x2c, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
140 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x6f,
141 0x6c, 0x69, 0x63, 0x79, 0x20, 0x61, 0x6e, 0x64,
142 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
143 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70,
144 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20,
145 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e,
146 0x74, 0x73, 0x2e, 0x30, 0x0d, 0x06, 0x09, 0x2a,
147 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
148 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5c,
149 0x36, 0x99, 0x4c, 0x2d, 0x78, 0xb7, 0xed, 0x8c,
150 0x9b, 0xdc, 0xf3, 0x77, 0x9b, 0xf2, 0x76, 0xd2,
151 0x77, 0x30, 0x4f, 0xc1, 0x1f, 0x85, 0x83, 0x85,
152 0x1b, 0x99, 0x3d, 0x47, 0x37, 0xf2, 0xa9, 0x9b,
153 0x40, 0x8e, 0x2c, 0xd4, 0xb1, 0x90, 0x12, 0xd8,
154 0xbe, 0xf4, 0x73, 0x9b, 0xee, 0xd2, 0x64, 0x0f,
155 0xcb, 0x79, 0x4f, 0x34, 0xd8, 0xa2, 0x3e, 0xf9,
156 0x78, 0xff, 0x6b, 0xc8, 0x07, 0xec, 0x7d, 0x39,
157 0x83, 0x8b, 0x53, 0x20, 0xd3, 0x38, 0xc4, 0xb1,
158 0xbf, 0x9a, 0x4f, 0x0a, 0x6b, 0xff, 0x2b, 0xfc,
159 0x59, 0xa7, 0x05, 0x09, 0x7c, 0x17, 0x40, 0x56,
160 0x11, 0x1e, 0x74, 0xd3, 0xb7, 0x8b, 0x23, 0x3b,
161 0x47, 0xa3, 0xd5, 0x6f, 0x24, 0xe2, 0xeb, 0xd1,
162 0xb7, 0x70, 0xdf, 0x0f, 0x45, 0xe1, 0x27, 0xca,
163 0xf1, 0x6d, 0x78, 0xed, 0xe7, 0xb5, 0x17, 0x17,
164 0xa8, 0xdc, 0x7e, 0x22, 0x35, 0xca, 0x25, 0xd5,
165 0xd9, 0x0f, 0xd6, 0x6b, 0xd4, 0xa2, 0x24, 0x23,
166 0x11, 0xf7, 0xa1, 0xac, 0x8f, 0x73, 0x81, 0x60,
167 0xc6, 0x1b, 0x5b, 0x09, 0x2f, 0x92, 0xb2, 0xf8,
168 0x44, 0x48, 0xf0, 0x60, 0x38, 0x9e, 0x15, 0xf5,
169 0x3d, 0x26, 0x67, 0x20, 0x8a, 0x33, 0x6a, 0xf7,
170 0x0d, 0x82, 0xcf, 0xde, 0xeb, 0xa3, 0x2f, 0xf9,
171 0x53, 0x6a, 0x5b, 0x64, 0xc0, 0x63, 0x33, 0x77,
172 0xf7, 0x3a, 0x07, 0x2c, 0x56, 0xeb, 0xda, 0x0f,
173 0x21, 0x0e, 0xda, 0xba, 0x73, 0x19, 0x4f, 0xb5,
174 0xd9, 0x36, 0x7f, 0xc1, 0x87, 0x55, 0xd9, 0xa7,
175 0x99, 0xb9, 0x32, 0x42, 0xfb, 0xd8, 0xd5, 0x71,
176 0x9e, 0x7e, 0xa1, 0x52, 0xb7, 0x1b, 0xbd, 0x93,
177 0x42, 0x24, 0x12, 0x2a, 0xc7, 0x0f, 0x1d, 0xb6,
178 0x4d, 0x9c, 0x5e, 0x63, 0xc8, 0x4b, 0x80, 0x17,
179 0x50, 0xaa, 0x8a, 0xd5, 0xda, 0xe4, 0xfc, 0xd0,
180 0x09, 0x07, 0x37, 0xb0, 0x75, 0x75, 0x21,
181 };
182
183
184 /*
185 Bag Attributes
186 friendlyName: uranusLeaf
187 localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
188 subject=/CN=uranusLeaf/emailAddress=uranus@uranus.com
189 issuer=/CN=plutoCA/emailAddress=pluto@pluto.com
190 */
191 static const uint8_t _c1[] = {
192 0x30, 0x82, 0x02, 0xe0, 0x30, 0x82, 0x01, 0xc8,
193 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
194 0x30, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
195 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x30, 0x32, 0x31,
196 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03,
197 0x0c, 0x07, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x43,
198 0x41, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x09, 0x2a,
199 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01,
200 0x0c, 0x0f, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x40,
201 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
202 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x31,
203 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32,
204 0x35, 0x5a, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32,
205 0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32, 0x35,
206 0x5a, 0x30, 0x37, 0x31, 0x13, 0x30, 0x11, 0x06,
207 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x75, 0x72,
208 0x61, 0x6e, 0x75, 0x73, 0x4c, 0x65, 0x61, 0x66,
209 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86,
210 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x0c,
211 0x11, 0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x40,
212 0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
213 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
214 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
215 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
216 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,
217 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6, 0x7e,
218 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32, 0x35,
219 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72, 0xa8,
220 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80, 0x80,
221 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93, 0x93,
222 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b, 0xd7,
223 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9, 0xfb,
224 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08, 0xac,
225 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0, 0x2a,
226 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c, 0xc3,
227 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde, 0x78,
228 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e, 0x9b,
229 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1, 0xf6,
230 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03, 0xe7,
231 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57, 0xdc,
232 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64, 0xaa,
233 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43, 0xe2,
234 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9, 0x4f,
235 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd, 0x04,
236 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5, 0xb2,
237 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e, 0x71,
238 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23, 0x44,
239 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1, 0x48,
240 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5, 0x4b,
241 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1, 0x47,
242 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25, 0x08,
243 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a, 0x32,
244 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae, 0x26,
245 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72, 0x23,
246 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2, 0xd4,
247 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75, 0x9e,
248 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d, 0xf8,
249 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01,
250 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
251 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,
252 0x82, 0x01, 0x01, 0x00, 0x17, 0xa5, 0x22, 0xed,
253 0xb8, 0x3e, 0x1f, 0x11, 0x99, 0xc5, 0xba, 0x28,
254 0x3e, 0x7e, 0xa6, 0xeb, 0x02, 0x81, 0x06, 0xa1,
255 0xc6, 0x80, 0xb9, 0x7e, 0x5c, 0x5a, 0x63, 0xe0,
256 0x8d, 0xeb, 0xd0, 0xec, 0x9c, 0x3a, 0x94, 0x64,
257 0x7c, 0x13, 0x54, 0x0d, 0xd6, 0xe3, 0x27, 0x88,
258 0xa6, 0xd2, 0x4b, 0x36, 0xdd, 0x2e, 0xfa, 0x94,
259 0xe5, 0x03, 0x27, 0xc9, 0xa6, 0x31, 0x02, 0xea,
260 0x40, 0x77, 0x2e, 0x93, 0xc4, 0x4d, 0xe2, 0x70,
261 0xe2, 0x67, 0x1c, 0xa8, 0x0d, 0xcd, 0x1a, 0x72,
262 0x86, 0x2c, 0xea, 0xdc, 0x7f, 0x8c, 0x49, 0x2c,
263 0xe7, 0x99, 0x13, 0xda, 0x3f, 0x58, 0x9e, 0xf5,
264 0x4d, 0x3c, 0x8c, 0x1c, 0xed, 0x85, 0xa7, 0xe2,
265 0xae, 0xda, 0x5f, 0xbe, 0x36, 0x1c, 0x9f, 0x5a,
266 0xa0, 0xdc, 0x2a, 0xc0, 0xee, 0x71, 0x07, 0x26,
267 0x8b, 0xe8, 0x8a, 0xf8, 0x2d, 0x36, 0x78, 0xc9,
268 0x79, 0xfa, 0xbe, 0x98, 0x59, 0x95, 0x12, 0x24,
269 0xf1, 0xda, 0x20, 0xc7, 0x78, 0xf9, 0x7c, 0x6a,
270 0x24, 0x43, 0x82, 0xa8, 0x0f, 0xb1, 0x7d, 0x94,
271 0xaa, 0x30, 0x35, 0xe5, 0x69, 0xdc, 0x0a, 0x0e,
272 0xaf, 0x10, 0x5e, 0x1a, 0x81, 0x50, 0x5c, 0x7e,
273 0x24, 0xb3, 0x07, 0x65, 0x4b, 0xc1, 0x7e, 0xc6,
274 0x38, 0xdb, 0xd3, 0x6a, 0xf0, 0xd8, 0x85, 0x61,
275 0x9a, 0x9f, 0xfe, 0x02, 0x46, 0x29, 0xb2, 0x9a,
276 0xe2, 0x04, 0xe7, 0x72, 0xcc, 0x87, 0x46, 0xba,
277 0x7d, 0xa8, 0xf9, 0xd0, 0x0f, 0x29, 0xfc, 0xfd,
278 0xd1, 0xd0, 0x7f, 0x36, 0xc1, 0xd8, 0x7d, 0x88,
279 0x03, 0x62, 0xf5, 0x8c, 0x00, 0xb5, 0xc2, 0x81,
280 0x44, 0x67, 0x58, 0x11, 0xb4, 0x3a, 0xbb, 0xd1,
281 0x8c, 0x94, 0x20, 0x60, 0xea, 0xa0, 0xac, 0xc1,
282 0xf1, 0x08, 0x54, 0xb8, 0xf6, 0x5e, 0xac, 0xf1,
283 0xec, 0x78, 0x69, 0x9d, 0x7e, 0x4d, 0x06, 0x3b,
284 0x9b, 0x78, 0x78, 0x10
285 };
286
287 /*
288 Bag Attributes
289 friendlyName: uranusLeaf
290 localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
291 Key Attributes: <No Attributes>
292 */
293 static const uint8_t _k1[] = {
294 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
295 0x82, 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6,
296 0x7e, 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32,
297 0x35, 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72,
298 0xa8, 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80,
299 0x80, 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93,
300 0x93, 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b,
301 0xd7, 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9,
302 0xfb, 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08,
303 0xac, 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0,
304 0x2a, 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c,
305 0xc3, 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde,
306 0x78, 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e,
307 0x9b, 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1,
308 0xf6, 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03,
309 0xe7, 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57,
310 0xdc, 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64,
311 0xaa, 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43,
312 0xe2, 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9,
313 0x4f, 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd,
314 0x04, 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5,
315 0xb2, 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e,
316 0x71, 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23,
317 0x44, 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1,
318 0x48, 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5,
319 0x4b, 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1,
320 0x47, 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25,
321 0x08, 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a,
322 0x32, 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae,
323 0x26, 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72,
324 0x23, 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2,
325 0xd4, 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75,
326 0x9e, 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d,
327 0xf8, 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00,
328 0x01, 0x02, 0x82, 0x01, 0x00, 0x4d, 0x27, 0xf2,
329 0x40, 0xc8, 0x3f, 0x5c, 0x87, 0x3c, 0xd9, 0xde,
330 0xa6, 0xa5, 0x93, 0xea, 0xbd, 0x36, 0xf8, 0xd9,
331 0xad, 0xc7, 0xda, 0x07, 0x7a, 0xec, 0x31, 0x02,
332 0x41, 0x09, 0x3a, 0x34, 0x32, 0x82, 0x0b, 0x5b,
333 0x7b, 0xe6, 0xa4, 0x2a, 0xe7, 0x14, 0xef, 0x43,
334 0x36, 0x61, 0xbe, 0x20, 0x4b, 0x82, 0x43, 0x63,
335 0x98, 0x80, 0x82, 0x19, 0x61, 0x71, 0x99, 0xaa,
336 0xf8, 0x59, 0xfd, 0xde, 0xa0, 0x03, 0xa8, 0xab,
337 0x9a, 0xec, 0x28, 0xac, 0x63, 0x79, 0x75, 0x84,
338 0x03, 0xac, 0x45, 0x5e, 0x04, 0x15, 0xb3, 0x47,
339 0xa2, 0x8f, 0x28, 0xb0, 0x72, 0xd0, 0x06, 0x02,
340 0xaf, 0x1e, 0x0a, 0x0a, 0xe9, 0x11, 0x35, 0x4a,
341 0x04, 0x42, 0xb5, 0x0f, 0xd2, 0xcf, 0x4d, 0xdf,
342 0xdb, 0xef, 0x58, 0xbd, 0xf3, 0xa5, 0x3b, 0x11,
343 0x3f, 0xc5, 0x47, 0x81, 0x85, 0xad, 0xd7, 0x1f,
344 0x58, 0x06, 0x42, 0xdc, 0x37, 0x3c, 0xdb, 0x98,
345 0x33, 0xa1, 0xc6, 0x80, 0x07, 0xe0, 0x2b, 0xc5,
346 0xf5, 0x60, 0x35, 0x6a, 0xa2, 0x06, 0x40, 0x4a,
347 0xac, 0x64, 0x02, 0x58, 0x4d, 0x07, 0xe3, 0x69,
348 0xd7, 0xe0, 0x8f, 0xb5, 0xf4, 0xbc, 0xfa, 0xab,
349 0x1a, 0xb0, 0xfa, 0x29, 0xf8, 0xca, 0xde, 0x78,
350 0xf0, 0x89, 0xe2, 0xf9, 0xb7, 0x68, 0x5b, 0x0e,
351 0xdc, 0x4e, 0x8a, 0x56, 0x8d, 0x33, 0x20, 0x2e,
352 0xed, 0x2e, 0xab, 0x6f, 0xba, 0x77, 0xef, 0xe6,
353 0x12, 0x62, 0x49, 0x9e, 0x87, 0x76, 0x1c, 0x1e,
354 0xf4, 0x0e, 0x9e, 0x78, 0x98, 0x91, 0x1a, 0xe3,
355 0xb4, 0x51, 0x4b, 0x8c, 0x2f, 0x08, 0x97, 0x8f,
356 0xf9, 0x68, 0x61, 0x40, 0xcd, 0xb6, 0x10, 0xb4,
357 0xfb, 0x75, 0xb4, 0x20, 0xc1, 0x5a, 0xda, 0x64,
358 0xfd, 0x51, 0x06, 0x85, 0x9a, 0x9e, 0x5d, 0x82,
359 0x14, 0xd4, 0x41, 0x4e, 0x75, 0x10, 0xb5, 0x7b,
360 0xd0, 0x4c, 0xd1, 0x00, 0x01, 0x02, 0x81, 0x81,
361 0x00, 0xcf, 0x8e, 0x68, 0x04, 0x67, 0x09, 0xa9,
362 0x6e, 0xff, 0x11, 0x8c, 0xe5, 0xe4, 0x16, 0xdd,
363 0xb6, 0xa6, 0x55, 0xca, 0x4b, 0x0b, 0xbb, 0xb7,
364 0xf5, 0xe5, 0x73, 0xf3, 0x24, 0x84, 0x29, 0xb2,
365 0xc3, 0xbc, 0x7f, 0x2b, 0x4a, 0xc7, 0xdf, 0x46,
366 0x8e, 0xe1, 0x35, 0x69, 0x1b, 0x8e, 0x9f, 0x6b,
367 0x4d, 0xf3, 0x65, 0xae, 0x3d, 0x87, 0x2b, 0xc9,
368 0xf0, 0x8c, 0xf2, 0x88, 0x2f, 0x1b, 0x79, 0x80,
369 0xd2, 0xb2, 0x64, 0x0a, 0xcc, 0x66, 0x69, 0x4c,
370 0xa1, 0x85, 0xc4, 0x6a, 0x94, 0x46, 0x70, 0x69,
371 0xbc, 0x8c, 0x1c, 0x62, 0x65, 0x4d, 0x68, 0xcc,
372 0xe3, 0x3c, 0x6c, 0xe7, 0xd1, 0x09, 0xed, 0xdd,
373 0x42, 0x10, 0x11, 0x6b, 0xdd, 0x7c, 0xe3, 0xe1,
374 0x3b, 0x3b, 0x0d, 0x01, 0x6d, 0xca, 0x2f, 0x4b,
375 0x45, 0x5e, 0x76, 0x5d, 0x5c, 0x6f, 0x53, 0xa4,
376 0x38, 0x74, 0x75, 0x94, 0x2c, 0xda, 0xf8, 0xa6,
377 0x01, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x5f, 0x9d,
378 0x6c, 0x94, 0xf6, 0x44, 0x37, 0x72, 0xfe, 0xcf,
379 0xbe, 0x82, 0x96, 0x24, 0x22, 0x12, 0x07, 0x6f,
380 0xd1, 0x57, 0x7b, 0xc7, 0x63, 0x20, 0xf5, 0x93,
381 0x79, 0x70, 0x0b, 0xe4, 0x38, 0x19, 0x62, 0x7b,
382 0x89, 0x3e, 0x45, 0xdf, 0xd6, 0xae, 0x9d, 0x0d,
383 0xa8, 0x76, 0xc1, 0xbd, 0x04, 0x2b, 0xaa, 0x30,
384 0x6a, 0xac, 0x65, 0x91, 0x61, 0xf0, 0xf8, 0x5d,
385 0xa3, 0x53, 0xa4, 0xfb, 0x99, 0xac, 0x46, 0x7a,
386 0x12, 0x4b, 0xf7, 0xa7, 0x48, 0x41, 0x61, 0x48,
387 0x26, 0x5c, 0x68, 0x2f, 0x73, 0x91, 0xe4, 0x74,
388 0xcd, 0xc9, 0x8b, 0xe7, 0x26, 0xe4, 0x35, 0xde,
389 0x32, 0x6b, 0x24, 0x49, 0xf2, 0x04, 0x67, 0x3d,
390 0x31, 0x8f, 0x22, 0xe5, 0x49, 0xae, 0x49, 0x94,
391 0xb3, 0x45, 0x2b, 0xed, 0x6f, 0x9c, 0xc7, 0x80,
392 0xf0, 0x42, 0xd5, 0x8f, 0x27, 0xd6, 0xd6, 0x49,
393 0xf2, 0x16, 0xcc, 0x4b, 0x39, 0x02, 0x81, 0x81,
394 0x00, 0xbb, 0xb7, 0xd7, 0x59, 0xcb, 0xfb, 0x10,
395 0x13, 0xc4, 0x7b, 0x92, 0x0c, 0x45, 0xcb, 0x6c,
396 0x81, 0x0a, 0x55, 0x63, 0x1d, 0x96, 0xa2, 0x13,
397 0xd2, 0x40, 0xd1, 0x2a, 0xa1, 0xe7, 0x2a, 0x73,
398 0x74, 0xd6, 0x61, 0xc9, 0xbc, 0xdb, 0xa2, 0x93,
399 0x85, 0x1c, 0x28, 0x9b, 0x44, 0x82, 0x2c, 0xaa,
400 0xf7, 0x18, 0x60, 0xe9, 0x42, 0xda, 0xa2, 0xff,
401 0x04, 0x21, 0xe6, 0x24, 0xc7, 0x3e, 0x39, 0x19,
402 0x0a, 0xf6, 0xae, 0xc6, 0x99, 0x71, 0x32, 0x61,
403 0x4d, 0x60, 0xd7, 0x71, 0x71, 0x63, 0x77, 0xbe,
404 0x19, 0xfa, 0x3a, 0x9d, 0xbf, 0x73, 0x50, 0x8a,
405 0xa6, 0x26, 0x7b, 0x74, 0xfa, 0x39, 0xd9, 0xb9,
406 0x18, 0x4b, 0xc2, 0x05, 0xe5, 0x8f, 0x53, 0xe6,
407 0xdc, 0x14, 0x1f, 0x42, 0x20, 0x93, 0x11, 0x4d,
408 0x29, 0x93, 0x32, 0xc8, 0x63, 0x96, 0x88, 0x76,
409 0x69, 0x5c, 0xe3, 0x0e, 0xbd, 0xb6, 0xd9, 0xd6,
410 0x01, 0x02, 0x81, 0x80, 0x62, 0xa2, 0xed, 0x84,
411 0xdc, 0xf6, 0x7a, 0x44, 0xf7, 0x62, 0x12, 0x7c,
412 0xb9, 0x53, 0x4a, 0xff, 0x62, 0x11, 0x58, 0x4e,
413 0xfe, 0xe9, 0x60, 0x15, 0xe8, 0x1a, 0x8a, 0x3d,
414 0xe4, 0xe6, 0x91, 0x31, 0xb0, 0x5f, 0x70, 0x5d,
415 0xb6, 0x1e, 0xf1, 0x26, 0xb6, 0xae, 0x8f, 0x84,
416 0xbd, 0xa4, 0xc7, 0x17, 0x5d, 0xb1, 0x5b, 0x97,
417 0xa0, 0x3d, 0x17, 0xda, 0x26, 0x55, 0xe3, 0x03,
418 0x32, 0x85, 0x26, 0xa1, 0xe3, 0xef, 0xe5, 0x69,
419 0x2c, 0x3b, 0x41, 0x88, 0x9e, 0x7e, 0x0e, 0x9c,
420 0xfd, 0xfc, 0xbb, 0xed, 0x91, 0xc0, 0x5b, 0xa9,
421 0x0a, 0x87, 0xba, 0xf9, 0x1e, 0xda, 0x10, 0x61,
422 0xbe, 0xbb, 0xab, 0x18, 0x25, 0xad, 0x3f, 0xe2,
423 0xb1, 0x90, 0x5c, 0xf7, 0x4a, 0x51, 0xe4, 0xad,
424 0x45, 0x27, 0x97, 0xdd, 0xe7, 0x3a, 0x9a, 0x5e,
425 0xca, 0x7a, 0xaf, 0x4a, 0xbf, 0x10, 0x24, 0x6b,
426 0xb5, 0x2f, 0x61, 0x61, 0x02, 0x81, 0x81, 0x00,
427 0x85, 0x7c, 0x78, 0xa5, 0x11, 0xdf, 0xc3, 0x6a,
428 0x38, 0x48, 0xfa, 0x7e, 0x48, 0xf0, 0x5a, 0x58,
429 0xe2, 0xc5, 0x83, 0x4e, 0x38, 0x3f, 0x4a, 0x2b,
430 0x07, 0x57, 0x31, 0xe7, 0xbe, 0x50, 0xb1, 0xbb,
431 0x24, 0xf3, 0x3d, 0x8b, 0x53, 0xb7, 0xd1, 0x47,
432 0x72, 0x5e, 0xd5, 0xd6, 0x4c, 0xce, 0x2c, 0x46,
433 0x61, 0x9a, 0xaa, 0xc3, 0x0e, 0xd4, 0x23, 0x2c,
434 0xdd, 0xf5, 0xb7, 0xad, 0x38, 0x52, 0x17, 0xc4,
435 0x16, 0xbb, 0xda, 0x1c, 0x61, 0xb1, 0xca, 0x8d,
436 0xb2, 0xa0, 0xbe, 0x4f, 0x3d, 0x19, 0x0e, 0xe0,
437 0x0e, 0x52, 0xad, 0xf3, 0xaf, 0xd9, 0xcc, 0x78,
438 0xc2, 0xb1, 0x5e, 0x05, 0x5e, 0xf2, 0x27, 0x84,
439 0x15, 0xe4, 0x8f, 0xca, 0xc5, 0x92, 0x43, 0xe0,
440 0x24, 0x8d, 0xf2, 0x5d, 0x55, 0xcc, 0x9d, 0x2f,
441 0xa9, 0xf6, 0x9b, 0x67, 0x6a, 0x87, 0x74, 0x36,
442 0x34, 0x7c, 0xd4, 0x9d, 0xff, 0xad, 0xee, 0x69
443 };
444
445 static const uint8_t _k1_digest[] = {
446 0x46, 0xE0, 0x8A, 0x05, 0x63, 0x4D, 0x17, 0x3F,
447 0xCA, 0xA4, 0xAA, 0xB6, 0x5A, 0xDA, 0xCF, 0xBA,
448 0x84, 0x22, 0x7C, 0x23
449 };
450
451 /* Create and identity and try to retrieve it. */
452 static void tests(void)
453 {
454 SecCertificateRef cert = NULL;
455 SecKeyRef privKey = NULL;
456 SecIdentityRef identity = NULL;
457
458 isnt(cert = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
459 NULL, "create certificate");
460 isnt(privKey = SecKeyCreateRSAPrivateKey(NULL, _k1, sizeof(_k1),
461 kSecKeyEncodingPkcs1), NULL, "create private key");
462
463 const void *certkeys[] = {
464 kSecValueRef
465 };
466 const void *certvalues[] = {
467 cert
468 };
469 CFDictionaryRef certDict = CFDictionaryCreate(NULL, certkeys, certvalues,
470 array_size(certkeys), NULL, NULL);
471 ok_status(SecItemAdd(certDict, NULL), "add certificate");
472 CFReleaseNull(certDict);
473
474 const void *privkeys[] = {
475 kSecValueRef
476 };
477 const void *privvalues[] = {
478 privKey
479 };
480 CFDictionaryRef privDict = CFDictionaryCreate(NULL, privkeys, privvalues,
481 array_size(privkeys), NULL, NULL);
482 ok_status(SecItemAdd(privDict, NULL), "add private key");
483 CFReleaseNull(privDict);
484
485 isnt(identity = SecIdentityCreate(NULL, cert, privKey), NULL, "create identity");
486
487 /* Lookup the key and certificate using SecItemCopyMatching(). */
488 CFDataRef pk_digest = CFDataCreate(NULL, _k1_digest, sizeof(_k1_digest));
489 const void *q_keys[] = {
490 kSecClass,
491 kSecAttrApplicationLabel,
492 kSecReturnRef
493 };
494 const void *q_values[] = {
495 kSecClassKey,
496 pk_digest,
497 kCFBooleanTrue
498 };
499 CFDictionaryRef query = CFDictionaryCreate(NULL, q_keys, q_values,
500 array_size(q_keys), NULL, NULL);
501 CFTypeRef result_key;
502 ok_status(SecItemCopyMatching(query, &result_key), "lookup key");
503
504 isnt(CFEqual(privKey, result_key), 0, "keys match");
505 CFReleaseNull(query);
506
507 q_keys[1] = kSecAttrPublicKeyHash;
508 q_values[0] = kSecClassCertificate;
509 query = CFDictionaryCreate(NULL, q_keys, q_values,
510 array_size(q_keys), NULL, NULL);
511 CFTypeRef result_cert;
512 ok_status(SecItemCopyMatching(query, &result_cert), "lookup certificate");
513 isnt(CFEqual(cert, result_cert), 0, "certificates match");
514 CFReleaseNull(query);
515
516 /* Cleanup. */
517 CFReleaseNull(result_key);
518 CFReleaseNull(result_cert);
519
520 /* identity lookup */
521 const void *idnt_keys[] = {
522 kSecClass,
523 kSecAttrApplicationLabel,
524 kSecReturnRef
525 };
526 const void *idnt_values[] = {
527 kSecClassIdentity,
528 pk_digest,
529 kCFBooleanTrue
530 };
531 CFTypeRef result_idnt;
532 SecCertificateRef result_cert2;
533 query = CFDictionaryCreate(NULL, idnt_keys, idnt_values,
534 array_size(idnt_keys), NULL, NULL);
535 ok_status(SecItemCopyMatching(query, &result_idnt), "lookup identity");
536 isnt(result_idnt, NULL, "found identity?");
537 is(CFGetRetainCount(result_idnt), 1, "result_idnt rc = 1");
538 isnt(CFEqual(identity, result_idnt), 0, "identities match");
539 CFReleaseNull(identity);
540
541 ok_status(SecIdentityCopyCertificate((SecIdentityRef)result_idnt, &result_cert2), "get cert from identity");
542 isnt(CFEqual(cert, result_cert2), 0, "certificates match");
543 CFRelease(query);
544 CFRelease(pk_digest);
545 CFReleaseNull(result_cert2);
546
547 certDict = CFDictionaryCreate(NULL, certkeys, certvalues,
548 array_size(certkeys), NULL, NULL);
549 ok_status(SecItemDelete(certDict), "delete certificate via ref");
550 is_status(errSecItemNotFound, SecItemCopyMatching(certDict, NULL), "verify certificate is gone");
551
552 CFReleaseNull(certDict);
553
554 privDict = CFDictionaryCreate(NULL, privkeys, privvalues,
555 array_size(privkeys), NULL, NULL);
556 ok_status(SecItemDelete(privDict), "delete key via ref");
557 is_status(errSecItemNotFound, SecItemCopyMatching(privDict, NULL), "verify key is gone");
558 CFReleaseNull(privDict);
559
560 /* add certificate to offset cert row id from key row id */
561 SecCertificateRef apple_ca_cert = NULL;
562 isnt(apple_ca_cert = SecCertificateCreateWithBytes(NULL, _c0, sizeof(_c0)),
563 NULL, "create apple ca certificate");
564 CFDictionaryRef appleCertDict = CFDictionaryCreate(NULL, (const void **)&kSecValueRef, (const void **)&apple_ca_cert, 1, NULL, NULL);
565 ok_status(SecItemAdd(appleCertDict, NULL), "add apple ca certificate to offset key and cert rowid");
566
567 /* add identity, get persistent ref */
568 const void *keys_identity[] = { kSecValueRef, kSecReturnPersistentRef };
569 const void *values_identity[] = { result_idnt, kCFBooleanTrue };
570 CFDictionaryRef identity_add = CFDictionaryCreate(NULL, keys_identity, values_identity,
571 array_size(keys_identity), NULL, NULL);
572 CFTypeRef persist = NULL;
573 ok_status(SecItemAdd(identity_add, &persist), "add identity ref");
574 ok(persist, "got back persistent ref");
575 /* <rdar://problem/6537195> SecItemAdd returns success when it shouldn't */
576 CFTypeRef persist_again = NULL;
577 is_status(errSecDuplicateItem, SecItemAdd(identity_add, &persist_again),
578 "fail to add identity ref again");
579 ok(!persist_again, "no persistent ref this time");
580
581 /* find by persistent ref */
582 const void *keys_persist[] = { kSecReturnRef, kSecValuePersistentRef };
583 const void *values_persist[] = { kCFBooleanTrue, persist };
584 CFDictionaryRef persist_find = CFDictionaryCreate(NULL, keys_persist, values_persist,
585 (array_size(keys_persist)), NULL, NULL);
586 CFTypeRef results2 = NULL;
587 ok_status(SecItemCopyMatching(persist_find, &results2), "find identity by persistent ref");
588 is(CFGetRetainCount(results2), 1, "results2 rc = 1");
589 // not implemented ok(CFEqual(result_idnt, results2), "same item (attributes)");
590 CFReleaseNull(results2);
591
592 /* find identity, key and cert by ref and return persistent ref */
593 const void *keys_ref_to_persist[] = { kSecReturnPersistentRef, kSecValueRef };
594 const void *values_ref_to_persist[] = { kCFBooleanTrue, NULL };
595 CFTypeRef items[] = { result_idnt, privKey, cert, NULL };
596 CFTypeRef *item = items;
597 while (*item) {
598 values_ref_to_persist[1] = *item;
599 CFDictionaryRef ref_to_persist_find = CFDictionaryCreate(NULL, keys_ref_to_persist, values_ref_to_persist,
600 (array_size(keys_ref_to_persist)), NULL, NULL);
601 results2 = NULL;
602 ok_status(SecItemCopyMatching(ref_to_persist_find, &results2), "find persistent ref for identity ref");
603 ok(NULL != results2, "good persistent ref");
604 is(CFGetRetainCount(results2), 1, "results2 rc = 1");
605 CFReleaseNull(results2);
606 CFReleaseNull(ref_to_persist_find);
607 item++;
608 }
609
610 /* delete identity by identity ref */
611 ok_status(SecItemDelete(identity_add), "delete identity by identity ref");
612 is(SecItemCopyMatching(persist_find, &results2), errSecItemNotFound,
613 "make sure identity by persistent ref is no longer there");
614 CFRelease(persist_find);
615 CFReleaseNull(persist);
616 ok_status(SecItemAdd(identity_add, &persist), "add identity ref back");
617 CFRelease(identity_add);
618
619 /* delete identity by persistent ref */
620 CFDictionaryRef persist_delete = CFDictionaryCreate(NULL,
621 &kSecValuePersistentRef, &persist, 1, NULL, NULL);
622 ok_status(SecItemDelete(persist_delete),
623 "delete identity by persistent ref");
624 is(SecItemCopyMatching(persist_delete, &results2), errSecItemNotFound,
625 "make sure identity by persistent ref is no longer there");
626 CFRelease(persist_delete);
627 CFReleaseNull(persist);
628
629 /* add identity with a label set */
630 CFStringRef zomg_label = CFSTR("zomg");
631 CFMutableDictionaryRef lbl_idnt_query =
632 CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
633 &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
634 CFDictionarySetValue(lbl_idnt_query, kSecValueRef, result_idnt);
635 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
636 ok_status(SecItemAdd(lbl_idnt_query, NULL), "add identity ref");
637
638 /* find identity with label*/
639 CFDictionaryRemoveAllValues(lbl_idnt_query);
640 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassIdentity);
641 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
642 ok_status(SecItemCopyMatching(lbl_idnt_query, NULL), "find identity by label");
643
644 /* find certs with label */
645 CFTypeRef zomg_cert;
646 CFDictionaryRemoveAllValues(lbl_idnt_query);
647 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassCertificate);
648 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
649 CFDictionarySetValue(lbl_idnt_query, kSecReturnRef, kCFBooleanTrue);
650 ok_status(SecItemCopyMatching(lbl_idnt_query, &zomg_cert), "find cert by label");
651
652 /* find keys with label */
653 CFTypeRef zomg_key;
654 CFDictionaryRemoveAllValues(lbl_idnt_query);
655 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassKey);
656 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
657 CFDictionarySetValue(lbl_idnt_query, kSecReturnRef, kCFBooleanTrue);
658 ok_status(SecItemCopyMatching(lbl_idnt_query, &zomg_key), "find key by label");
659
660 /* update label on key */
661 CFStringRef new_label_value = CFSTR("zzzomg");
662 CFDictionaryRef new_label = CFDictionaryCreate(kCFAllocatorDefault, (const void **)&kSecAttrLabel, (const void **)&new_label_value, 1, NULL, NULL);
663 CFDictionaryRemoveAllValues(lbl_idnt_query);
664 CFDictionarySetValue(lbl_idnt_query, kSecValueRef, zomg_key);
665 ok_status(SecItemUpdate(lbl_idnt_query, new_label), "update label to zzzomg for key");
666
667 CFTypeRef zomg_idnt = NULL;
668 CFDictionaryRemoveAllValues(lbl_idnt_query);
669 CFDictionarySetValue(lbl_idnt_query, kSecReturnRef, kCFBooleanTrue);
670 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
671 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassIdentity);
672 ok_status(SecItemCopyMatching(lbl_idnt_query, &zomg_idnt), "still finding zomg ident");
673 CFReleaseNull(zomg_idnt);
674
675
676 CFDictionaryRemoveAllValues(lbl_idnt_query);
677 CFDictionarySetValue(lbl_idnt_query, kSecValueRef, zomg_cert);
678 ok_status(SecItemUpdate(lbl_idnt_query, new_label), "update label to zzzomg for cert");
679 CFReleaseNull(new_label);
680
681 CFDictionaryRemoveAllValues(lbl_idnt_query);
682 CFDictionarySetValue(lbl_idnt_query, kSecReturnRef, kCFBooleanTrue);
683 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, zomg_label);
684 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassIdentity);
685 is_status(errSecItemNotFound, SecItemCopyMatching(lbl_idnt_query, &zomg_idnt), "no longer find identity by label");
686
687 CFDictionaryRemoveAllValues(lbl_idnt_query);
688 CFDictionarySetValue(lbl_idnt_query, kSecReturnRef, kCFBooleanTrue);
689 CFDictionarySetValue(lbl_idnt_query, kSecAttrLabel, new_label_value);
690 CFDictionarySetValue(lbl_idnt_query, kSecClass, kSecClassIdentity);
691 ok_status(SecItemCopyMatching(lbl_idnt_query, &zomg_idnt), "finding ident with zzzomg label");
692
693 /* Find zomg identity with canonical issuer */
694 {
695 unsigned char DN[] = {
696 0x30, 0x32, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
697 0x07, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x43, 0x41, 0x31, 0x1e, 0x30, 0x1c,
698 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x0c,
699 0x0f, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x40, 0x70, 0x6c, 0x75, 0x74, 0x6f,
700 0x2e, 0x63, 0x6f, 0x6d
701 };
702 unsigned int DN_len = 52;
703 CFMutableDictionaryRef find_by_issuer = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
704 CFDataRef issuer = SecCertificateGetNormalizedIssuerContent(cert);
705 CFTypeRef found_by_issuer = NULL;
706 CFDictionarySetValue(find_by_issuer, kSecAttrIssuer, issuer);
707 CFDictionarySetValue(find_by_issuer, kSecClass, kSecClassIdentity);
708 CFDictionarySetValue(find_by_issuer, kSecReturnRef, kCFBooleanTrue);
709 ok_status(SecItemCopyMatching(find_by_issuer, &found_by_issuer), "find identity by cert issuer");
710 ok(CFEqual(found_by_issuer, zomg_idnt), "should be same as zomg_idnt");
711 CFReleaseNull(found_by_issuer);
712 issuer = CFDataCreate(kCFAllocatorDefault, DN, DN_len);
713 CFDictionarySetValue(find_by_issuer, kSecAttrIssuer, issuer);
714 ok_status(SecItemCopyMatching(find_by_issuer, &found_by_issuer), "find identity by cert issuer");
715 CFReleaseNull(issuer);
716 ok(CFEqual(found_by_issuer, zomg_idnt), "should be same as zomg_idnt");
717 CFReleaseNull(found_by_issuer);
718 CFReleaseNull(find_by_issuer);
719 }
720
721 ok_status(SecItemDelete(lbl_idnt_query), "delete ident with zzzomg label");
722
723 /* Delete the apple cert last */
724 ok_status(SecItemDelete(appleCertDict), "delete apple ca certificate");
725 CFReleaseNull(appleCertDict);
726 CFReleaseNull(apple_ca_cert);
727
728 CFRelease(zomg_key);
729 CFRelease(zomg_cert);
730 CFRelease(zomg_idnt);
731 CFRelease(zomg_label);
732 CFRelease(new_label_value);
733 CFRelease(lbl_idnt_query);
734
735 CFReleaseNull(result_idnt);
736 CFReleaseNull(privKey);
737 CFReleaseNull(cert);
738 }
739
740 int si_42_identity(int argc, char *const *argv)
741 {
742 plan_tests(56);
743
744
745 tests();
746
747 return 0;
748 }