]> git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_ssl/regressions/ssl-40-clientauth.c
Security-57740.20.22.tar.gz
[apple/security.git] / OSX / libsecurity_ssl / regressions / ssl-40-clientauth.c
1 /*
2 * ssl-40-clientauth.c
3 * Security
4 *
5 * Copyright (c) 2008-2010,2012-2013 Apple Inc. All Rights Reserved.
6 *
7 */
8
9
10 /* This test is only supported for iOS */
11
12 #include <TargetConditionals.h>
13
14 #if TARGET_OS_IPHONE
15
16 #include <CoreFoundation/CoreFoundation.h>
17 #include <Security/SecCertificate.h>
18 #include <Security/SecCertificatePriv.h>
19 #include <Security/SecKey.h>
20 #include <Security/SecItem.h>
21 #include <Security/SecIdentity.h>
22 #include <Security/SecPolicy.h>
23 #include <Security/SecTrust.h>
24 #include <Security/SecureTransport.h>
25 #include <utilities/array_size.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28
29 #if TARGET_OS_IPHONE
30 #include <Security/SecRSAKey.h>
31 #endif
32
33 #include "ssl_regressions.h"
34
35 #define CFReleaseNull(CF) { CFTypeRef _cf = (CF); if (_cf) { (CF) = NULL; CFRelease(_cf); } }
36
37 /*
38 Bag Attributes
39 friendlyName: uranusLeaf
40 localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
41 subject=/CN=uranusLeaf/emailAddress=uranus@uranus.com
42 issuer=/CN=plutoCA/emailAddress=pluto@pluto.com
43 */
44 static const uint8_t _c1[] = {
45 0x30, 0x82, 0x02, 0xe0, 0x30, 0x82, 0x01, 0xc8,
46 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
47 0x30, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
48 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x30, 0x32, 0x31,
49 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03,
50 0x0c, 0x07, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x43,
51 0x41, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x09, 0x2a,
52 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01,
53 0x0c, 0x0f, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x40,
54 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
55 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x31,
56 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32,
57 0x35, 0x5a, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32,
58 0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32, 0x35,
59 0x5a, 0x30, 0x37, 0x31, 0x13, 0x30, 0x11, 0x06,
60 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x75, 0x72,
61 0x61, 0x6e, 0x75, 0x73, 0x4c, 0x65, 0x61, 0x66,
62 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86,
63 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x0c,
64 0x11, 0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x40,
65 0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
66 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
67 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
68 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
69 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,
70 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6, 0x7e,
71 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32, 0x35,
72 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72, 0xa8,
73 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80, 0x80,
74 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93, 0x93,
75 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b, 0xd7,
76 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9, 0xfb,
77 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08, 0xac,
78 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0, 0x2a,
79 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c, 0xc3,
80 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde, 0x78,
81 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e, 0x9b,
82 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1, 0xf6,
83 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03, 0xe7,
84 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57, 0xdc,
85 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64, 0xaa,
86 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43, 0xe2,
87 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9, 0x4f,
88 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd, 0x04,
89 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5, 0xb2,
90 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e, 0x71,
91 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23, 0x44,
92 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1, 0x48,
93 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5, 0x4b,
94 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1, 0x47,
95 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25, 0x08,
96 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a, 0x32,
97 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae, 0x26,
98 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72, 0x23,
99 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2, 0xd4,
100 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75, 0x9e,
101 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d, 0xf8,
102 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01,
103 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
104 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,
105 0x82, 0x01, 0x01, 0x00, 0x17, 0xa5, 0x22, 0xed,
106 0xb8, 0x3e, 0x1f, 0x11, 0x99, 0xc5, 0xba, 0x28,
107 0x3e, 0x7e, 0xa6, 0xeb, 0x02, 0x81, 0x06, 0xa1,
108 0xc6, 0x80, 0xb9, 0x7e, 0x5c, 0x5a, 0x63, 0xe0,
109 0x8d, 0xeb, 0xd0, 0xec, 0x9c, 0x3a, 0x94, 0x64,
110 0x7c, 0x13, 0x54, 0x0d, 0xd6, 0xe3, 0x27, 0x88,
111 0xa6, 0xd2, 0x4b, 0x36, 0xdd, 0x2e, 0xfa, 0x94,
112 0xe5, 0x03, 0x27, 0xc9, 0xa6, 0x31, 0x02, 0xea,
113 0x40, 0x77, 0x2e, 0x93, 0xc4, 0x4d, 0xe2, 0x70,
114 0xe2, 0x67, 0x1c, 0xa8, 0x0d, 0xcd, 0x1a, 0x72,
115 0x86, 0x2c, 0xea, 0xdc, 0x7f, 0x8c, 0x49, 0x2c,
116 0xe7, 0x99, 0x13, 0xda, 0x3f, 0x58, 0x9e, 0xf5,
117 0x4d, 0x3c, 0x8c, 0x1c, 0xed, 0x85, 0xa7, 0xe2,
118 0xae, 0xda, 0x5f, 0xbe, 0x36, 0x1c, 0x9f, 0x5a,
119 0xa0, 0xdc, 0x2a, 0xc0, 0xee, 0x71, 0x07, 0x26,
120 0x8b, 0xe8, 0x8a, 0xf8, 0x2d, 0x36, 0x78, 0xc9,
121 0x79, 0xfa, 0xbe, 0x98, 0x59, 0x95, 0x12, 0x24,
122 0xf1, 0xda, 0x20, 0xc7, 0x78, 0xf9, 0x7c, 0x6a,
123 0x24, 0x43, 0x82, 0xa8, 0x0f, 0xb1, 0x7d, 0x94,
124 0xaa, 0x30, 0x35, 0xe5, 0x69, 0xdc, 0x0a, 0x0e,
125 0xaf, 0x10, 0x5e, 0x1a, 0x81, 0x50, 0x5c, 0x7e,
126 0x24, 0xb3, 0x07, 0x65, 0x4b, 0xc1, 0x7e, 0xc6,
127 0x38, 0xdb, 0xd3, 0x6a, 0xf0, 0xd8, 0x85, 0x61,
128 0x9a, 0x9f, 0xfe, 0x02, 0x46, 0x29, 0xb2, 0x9a,
129 0xe2, 0x04, 0xe7, 0x72, 0xcc, 0x87, 0x46, 0xba,
130 0x7d, 0xa8, 0xf9, 0xd0, 0x0f, 0x29, 0xfc, 0xfd,
131 0xd1, 0xd0, 0x7f, 0x36, 0xc1, 0xd8, 0x7d, 0x88,
132 0x03, 0x62, 0xf5, 0x8c, 0x00, 0xb5, 0xc2, 0x81,
133 0x44, 0x67, 0x58, 0x11, 0xb4, 0x3a, 0xbb, 0xd1,
134 0x8c, 0x94, 0x20, 0x60, 0xea, 0xa0, 0xac, 0xc1,
135 0xf1, 0x08, 0x54, 0xb8, 0xf6, 0x5e, 0xac, 0xf1,
136 0xec, 0x78, 0x69, 0x9d, 0x7e, 0x4d, 0x06, 0x3b,
137 0x9b, 0x78, 0x78, 0x10
138 };
139
140 /*
141 Bag Attributes
142 friendlyName: uranusLeaf
143 localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
144 Key Attributes: <No Attributes>
145 */
146 static const uint8_t _k1[] = {
147 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
148 0x82, 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6,
149 0x7e, 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32,
150 0x35, 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72,
151 0xa8, 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80,
152 0x80, 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93,
153 0x93, 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b,
154 0xd7, 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9,
155 0xfb, 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08,
156 0xac, 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0,
157 0x2a, 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c,
158 0xc3, 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde,
159 0x78, 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e,
160 0x9b, 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1,
161 0xf6, 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03,
162 0xe7, 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57,
163 0xdc, 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64,
164 0xaa, 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43,
165 0xe2, 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9,
166 0x4f, 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd,
167 0x04, 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5,
168 0xb2, 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e,
169 0x71, 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23,
170 0x44, 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1,
171 0x48, 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5,
172 0x4b, 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1,
173 0x47, 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25,
174 0x08, 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a,
175 0x32, 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae,
176 0x26, 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72,
177 0x23, 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2,
178 0xd4, 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75,
179 0x9e, 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d,
180 0xf8, 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00,
181 0x01, 0x02, 0x82, 0x01, 0x00, 0x4d, 0x27, 0xf2,
182 0x40, 0xc8, 0x3f, 0x5c, 0x87, 0x3c, 0xd9, 0xde,
183 0xa6, 0xa5, 0x93, 0xea, 0xbd, 0x36, 0xf8, 0xd9,
184 0xad, 0xc7, 0xda, 0x07, 0x7a, 0xec, 0x31, 0x02,
185 0x41, 0x09, 0x3a, 0x34, 0x32, 0x82, 0x0b, 0x5b,
186 0x7b, 0xe6, 0xa4, 0x2a, 0xe7, 0x14, 0xef, 0x43,
187 0x36, 0x61, 0xbe, 0x20, 0x4b, 0x82, 0x43, 0x63,
188 0x98, 0x80, 0x82, 0x19, 0x61, 0x71, 0x99, 0xaa,
189 0xf8, 0x59, 0xfd, 0xde, 0xa0, 0x03, 0xa8, 0xab,
190 0x9a, 0xec, 0x28, 0xac, 0x63, 0x79, 0x75, 0x84,
191 0x03, 0xac, 0x45, 0x5e, 0x04, 0x15, 0xb3, 0x47,
192 0xa2, 0x8f, 0x28, 0xb0, 0x72, 0xd0, 0x06, 0x02,
193 0xaf, 0x1e, 0x0a, 0x0a, 0xe9, 0x11, 0x35, 0x4a,
194 0x04, 0x42, 0xb5, 0x0f, 0xd2, 0xcf, 0x4d, 0xdf,
195 0xdb, 0xef, 0x58, 0xbd, 0xf3, 0xa5, 0x3b, 0x11,
196 0x3f, 0xc5, 0x47, 0x81, 0x85, 0xad, 0xd7, 0x1f,
197 0x58, 0x06, 0x42, 0xdc, 0x37, 0x3c, 0xdb, 0x98,
198 0x33, 0xa1, 0xc6, 0x80, 0x07, 0xe0, 0x2b, 0xc5,
199 0xf5, 0x60, 0x35, 0x6a, 0xa2, 0x06, 0x40, 0x4a,
200 0xac, 0x64, 0x02, 0x58, 0x4d, 0x07, 0xe3, 0x69,
201 0xd7, 0xe0, 0x8f, 0xb5, 0xf4, 0xbc, 0xfa, 0xab,
202 0x1a, 0xb0, 0xfa, 0x29, 0xf8, 0xca, 0xde, 0x78,
203 0xf0, 0x89, 0xe2, 0xf9, 0xb7, 0x68, 0x5b, 0x0e,
204 0xdc, 0x4e, 0x8a, 0x56, 0x8d, 0x33, 0x20, 0x2e,
205 0xed, 0x2e, 0xab, 0x6f, 0xba, 0x77, 0xef, 0xe6,
206 0x12, 0x62, 0x49, 0x9e, 0x87, 0x76, 0x1c, 0x1e,
207 0xf4, 0x0e, 0x9e, 0x78, 0x98, 0x91, 0x1a, 0xe3,
208 0xb4, 0x51, 0x4b, 0x8c, 0x2f, 0x08, 0x97, 0x8f,
209 0xf9, 0x68, 0x61, 0x40, 0xcd, 0xb6, 0x10, 0xb4,
210 0xfb, 0x75, 0xb4, 0x20, 0xc1, 0x5a, 0xda, 0x64,
211 0xfd, 0x51, 0x06, 0x85, 0x9a, 0x9e, 0x5d, 0x82,
212 0x14, 0xd4, 0x41, 0x4e, 0x75, 0x10, 0xb5, 0x7b,
213 0xd0, 0x4c, 0xd1, 0x00, 0x01, 0x02, 0x81, 0x81,
214 0x00, 0xcf, 0x8e, 0x68, 0x04, 0x67, 0x09, 0xa9,
215 0x6e, 0xff, 0x11, 0x8c, 0xe5, 0xe4, 0x16, 0xdd,
216 0xb6, 0xa6, 0x55, 0xca, 0x4b, 0x0b, 0xbb, 0xb7,
217 0xf5, 0xe5, 0x73, 0xf3, 0x24, 0x84, 0x29, 0xb2,
218 0xc3, 0xbc, 0x7f, 0x2b, 0x4a, 0xc7, 0xdf, 0x46,
219 0x8e, 0xe1, 0x35, 0x69, 0x1b, 0x8e, 0x9f, 0x6b,
220 0x4d, 0xf3, 0x65, 0xae, 0x3d, 0x87, 0x2b, 0xc9,
221 0xf0, 0x8c, 0xf2, 0x88, 0x2f, 0x1b, 0x79, 0x80,
222 0xd2, 0xb2, 0x64, 0x0a, 0xcc, 0x66, 0x69, 0x4c,
223 0xa1, 0x85, 0xc4, 0x6a, 0x94, 0x46, 0x70, 0x69,
224 0xbc, 0x8c, 0x1c, 0x62, 0x65, 0x4d, 0x68, 0xcc,
225 0xe3, 0x3c, 0x6c, 0xe7, 0xd1, 0x09, 0xed, 0xdd,
226 0x42, 0x10, 0x11, 0x6b, 0xdd, 0x7c, 0xe3, 0xe1,
227 0x3b, 0x3b, 0x0d, 0x01, 0x6d, 0xca, 0x2f, 0x4b,
228 0x45, 0x5e, 0x76, 0x5d, 0x5c, 0x6f, 0x53, 0xa4,
229 0x38, 0x74, 0x75, 0x94, 0x2c, 0xda, 0xf8, 0xa6,
230 0x01, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x5f, 0x9d,
231 0x6c, 0x94, 0xf6, 0x44, 0x37, 0x72, 0xfe, 0xcf,
232 0xbe, 0x82, 0x96, 0x24, 0x22, 0x12, 0x07, 0x6f,
233 0xd1, 0x57, 0x7b, 0xc7, 0x63, 0x20, 0xf5, 0x93,
234 0x79, 0x70, 0x0b, 0xe4, 0x38, 0x19, 0x62, 0x7b,
235 0x89, 0x3e, 0x45, 0xdf, 0xd6, 0xae, 0x9d, 0x0d,
236 0xa8, 0x76, 0xc1, 0xbd, 0x04, 0x2b, 0xaa, 0x30,
237 0x6a, 0xac, 0x65, 0x91, 0x61, 0xf0, 0xf8, 0x5d,
238 0xa3, 0x53, 0xa4, 0xfb, 0x99, 0xac, 0x46, 0x7a,
239 0x12, 0x4b, 0xf7, 0xa7, 0x48, 0x41, 0x61, 0x48,
240 0x26, 0x5c, 0x68, 0x2f, 0x73, 0x91, 0xe4, 0x74,
241 0xcd, 0xc9, 0x8b, 0xe7, 0x26, 0xe4, 0x35, 0xde,
242 0x32, 0x6b, 0x24, 0x49, 0xf2, 0x04, 0x67, 0x3d,
243 0x31, 0x8f, 0x22, 0xe5, 0x49, 0xae, 0x49, 0x94,
244 0xb3, 0x45, 0x2b, 0xed, 0x6f, 0x9c, 0xc7, 0x80,
245 0xf0, 0x42, 0xd5, 0x8f, 0x27, 0xd6, 0xd6, 0x49,
246 0xf2, 0x16, 0xcc, 0x4b, 0x39, 0x02, 0x81, 0x81,
247 0x00, 0xbb, 0xb7, 0xd7, 0x59, 0xcb, 0xfb, 0x10,
248 0x13, 0xc4, 0x7b, 0x92, 0x0c, 0x45, 0xcb, 0x6c,
249 0x81, 0x0a, 0x55, 0x63, 0x1d, 0x96, 0xa2, 0x13,
250 0xd2, 0x40, 0xd1, 0x2a, 0xa1, 0xe7, 0x2a, 0x73,
251 0x74, 0xd6, 0x61, 0xc9, 0xbc, 0xdb, 0xa2, 0x93,
252 0x85, 0x1c, 0x28, 0x9b, 0x44, 0x82, 0x2c, 0xaa,
253 0xf7, 0x18, 0x60, 0xe9, 0x42, 0xda, 0xa2, 0xff,
254 0x04, 0x21, 0xe6, 0x24, 0xc7, 0x3e, 0x39, 0x19,
255 0x0a, 0xf6, 0xae, 0xc6, 0x99, 0x71, 0x32, 0x61,
256 0x4d, 0x60, 0xd7, 0x71, 0x71, 0x63, 0x77, 0xbe,
257 0x19, 0xfa, 0x3a, 0x9d, 0xbf, 0x73, 0x50, 0x8a,
258 0xa6, 0x26, 0x7b, 0x74, 0xfa, 0x39, 0xd9, 0xb9,
259 0x18, 0x4b, 0xc2, 0x05, 0xe5, 0x8f, 0x53, 0xe6,
260 0xdc, 0x14, 0x1f, 0x42, 0x20, 0x93, 0x11, 0x4d,
261 0x29, 0x93, 0x32, 0xc8, 0x63, 0x96, 0x88, 0x76,
262 0x69, 0x5c, 0xe3, 0x0e, 0xbd, 0xb6, 0xd9, 0xd6,
263 0x01, 0x02, 0x81, 0x80, 0x62, 0xa2, 0xed, 0x84,
264 0xdc, 0xf6, 0x7a, 0x44, 0xf7, 0x62, 0x12, 0x7c,
265 0xb9, 0x53, 0x4a, 0xff, 0x62, 0x11, 0x58, 0x4e,
266 0xfe, 0xe9, 0x60, 0x15, 0xe8, 0x1a, 0x8a, 0x3d,
267 0xe4, 0xe6, 0x91, 0x31, 0xb0, 0x5f, 0x70, 0x5d,
268 0xb6, 0x1e, 0xf1, 0x26, 0xb6, 0xae, 0x8f, 0x84,
269 0xbd, 0xa4, 0xc7, 0x17, 0x5d, 0xb1, 0x5b, 0x97,
270 0xa0, 0x3d, 0x17, 0xda, 0x26, 0x55, 0xe3, 0x03,
271 0x32, 0x85, 0x26, 0xa1, 0xe3, 0xef, 0xe5, 0x69,
272 0x2c, 0x3b, 0x41, 0x88, 0x9e, 0x7e, 0x0e, 0x9c,
273 0xfd, 0xfc, 0xbb, 0xed, 0x91, 0xc0, 0x5b, 0xa9,
274 0x0a, 0x87, 0xba, 0xf9, 0x1e, 0xda, 0x10, 0x61,
275 0xbe, 0xbb, 0xab, 0x18, 0x25, 0xad, 0x3f, 0xe2,
276 0xb1, 0x90, 0x5c, 0xf7, 0x4a, 0x51, 0xe4, 0xad,
277 0x45, 0x27, 0x97, 0xdd, 0xe7, 0x3a, 0x9a, 0x5e,
278 0xca, 0x7a, 0xaf, 0x4a, 0xbf, 0x10, 0x24, 0x6b,
279 0xb5, 0x2f, 0x61, 0x61, 0x02, 0x81, 0x81, 0x00,
280 0x85, 0x7c, 0x78, 0xa5, 0x11, 0xdf, 0xc3, 0x6a,
281 0x38, 0x48, 0xfa, 0x7e, 0x48, 0xf0, 0x5a, 0x58,
282 0xe2, 0xc5, 0x83, 0x4e, 0x38, 0x3f, 0x4a, 0x2b,
283 0x07, 0x57, 0x31, 0xe7, 0xbe, 0x50, 0xb1, 0xbb,
284 0x24, 0xf3, 0x3d, 0x8b, 0x53, 0xb7, 0xd1, 0x47,
285 0x72, 0x5e, 0xd5, 0xd6, 0x4c, 0xce, 0x2c, 0x46,
286 0x61, 0x9a, 0xaa, 0xc3, 0x0e, 0xd4, 0x23, 0x2c,
287 0xdd, 0xf5, 0xb7, 0xad, 0x38, 0x52, 0x17, 0xc4,
288 0x16, 0xbb, 0xda, 0x1c, 0x61, 0xb1, 0xca, 0x8d,
289 0xb2, 0xa0, 0xbe, 0x4f, 0x3d, 0x19, 0x0e, 0xe0,
290 0x0e, 0x52, 0xad, 0xf3, 0xaf, 0xd9, 0xcc, 0x78,
291 0xc2, 0xb1, 0x5e, 0x05, 0x5e, 0xf2, 0x27, 0x84,
292 0x15, 0xe4, 0x8f, 0xca, 0xc5, 0x92, 0x43, 0xe0,
293 0x24, 0x8d, 0xf2, 0x5d, 0x55, 0xcc, 0x9d, 0x2f,
294 0xa9, 0xf6, 0x9b, 0x67, 0x6a, 0x87, 0x74, 0x36,
295 0x34, 0x7c, 0xd4, 0x9d, 0xff, 0xad, 0xee, 0x69
296 };
297
298 __unused static const uint8_t _k1_digest[] = {
299 0x46, 0xE0, 0x8A, 0x05, 0x63, 0x4D, 0x17, 0x3F,
300 0xCA, 0xA4, 0xAA, 0xB6, 0x5A, 0xDA, 0xCF, 0xBA,
301 0x84, 0x22, 0x7C, 0x23
302 };
303
304 /* Create and identity and try to retrieve it. */
305 static void AddIdentityToKeychain(void)
306 {
307 SecCertificateRef cert = NULL;
308 SecKeyRef privKey = NULL;
309 //SecIdentityRef identity = NULL;
310
311 isnt(cert = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
312 NULL, "create certificate");
313
314 #if TARGET_OS_IPHONE
315 privKey = SecKeyCreateRSAPrivateKey(NULL, _k1, sizeof(_k1),
316 kSecKeyEncodingPkcs1);
317 #else
318 #warning TODO
319 privKey = NULL;
320 #endif
321
322 isnt(privKey, NULL, "create private key");
323
324 const void *certkeys[] = {
325 kSecValueRef
326 };
327 const void *certvalues[] = {
328 cert
329 };
330 CFDictionaryRef certDict = CFDictionaryCreate(NULL, certkeys, certvalues,
331 array_size(certkeys), NULL, NULL);
332 ok_status(SecItemAdd(certDict, NULL), "add certificate");
333 CFReleaseNull(certDict);
334 CFReleaseNull(cert);
335
336 const void *privkeys[] = {
337 kSecValueRef
338 };
339 const void *privvalues[] = {
340 privKey
341 };
342 CFDictionaryRef privDict = CFDictionaryCreate(NULL, privkeys, privvalues,
343 array_size(privkeys), NULL, NULL);
344 ok_status(SecItemAdd(privDict, NULL), "add private key");
345 CFReleaseNull(privDict);
346 CFReleaseNull(privKey);
347 }
348
349 static void DeleteIdentityFromKeychain(void)
350 {
351 SecCertificateRef cert = NULL;
352 SecKeyRef privKey = NULL;
353 //SecIdentityRef identity = NULL;
354
355 isnt(cert = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
356 NULL, "create certificate");
357 #if TARGET_OS_IPHONE
358 privKey = SecKeyCreateRSAPrivateKey(NULL, _k1, sizeof(_k1),
359 kSecKeyEncodingPkcs1);
360 #else
361 #warning TODO
362 privKey = NULL;
363 #endif
364 isnt(privKey, NULL, "create private key");
365
366 const void *certkeys[] = {
367 kSecValueRef
368 };
369 const void *certvalues[] = {
370 cert
371 };
372 CFDictionaryRef certDict = CFDictionaryCreate(NULL, certkeys, certvalues,
373 array_size(certkeys), NULL, NULL);
374 ok_status(SecItemDelete(certDict), "delete certificate");
375 CFReleaseNull(certDict);
376 CFReleaseNull(cert);
377
378 const void *privkeys[] = {
379 kSecValueRef
380 };
381 const void *privvalues[] = {
382 privKey
383 };
384 CFDictionaryRef privDict = CFDictionaryCreate(NULL, privkeys, privvalues,
385 array_size(privkeys), NULL, NULL);
386 ok_status(SecItemDelete(privDict), "delete private key");
387 CFReleaseNull(privDict);
388 CFReleaseNull(privKey);
389 }
390
391
392 static OSStatus
393 EAPSecIdentityListCreate(CFArrayRef * ret_array)
394 {
395 const void * keys[] = {
396 kSecClass,
397 kSecReturnRef,
398 kSecMatchLimit
399 };
400 CFDictionaryRef query;
401 CFTypeRef results = NULL;
402 OSStatus status = errSecSuccess;
403 const void * values[] = {
404 kSecClassIdentity,
405 kCFBooleanTrue,
406 kSecMatchLimitAll
407 };
408
409 query = CFDictionaryCreate(NULL, keys, values,
410 array_size(keys),
411 &kCFTypeDictionaryKeyCallBacks,
412 &kCFTypeDictionaryValueCallBacks);
413 ok_status(status = SecItemCopyMatching(query, &results), "SecItemCopyMatching");
414 CFReleaseNull(query);
415 if (status == errSecSuccess) {
416 *ret_array = results;
417 }
418 return (status);
419 }
420
421 static OSStatus
422 _EAPSecIdentityCreateCertificateTrustChain(SecIdentityRef identity,
423 CFArrayRef * ret_chain)
424 {
425 SecCertificateRef cert = NULL;
426 CFArrayRef certs;
427 SecPolicyRef policy = NULL;
428 OSStatus status;
429 SecTrustRef trust = NULL;
430 SecTrustResultType trust_result;
431
432 *ret_chain = NULL;
433 ok(policy = SecPolicyCreateBasicX509(), "SecPolicyCreateBasicX509");
434 ok_status(status = SecIdentityCopyCertificate(identity, &cert), "SecIdentityCopyCertificate");
435 certs = CFArrayCreate(NULL, (const void **)&cert,
436 1, &kCFTypeArrayCallBacks);
437 CFReleaseNull(cert);
438 ok_status(status = SecTrustCreateWithCertificates(certs, policy, &trust),
439 "SecTrustCreateWithCertificates");
440 CFReleaseNull(certs);
441 ok_status(status = SecTrustEvaluate(trust, &trust_result), "SecTrustEvaluate");
442 {
443 CFMutableArrayRef array;
444 CFIndex count = SecTrustGetCertificateCount(trust);
445 CFIndex i;
446
447 isnt(count, 0, "SecTrustGetCertificateCount is nonzero");
448 array = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks);
449 for (i = 0; i < count; i++) {
450 SecCertificateRef s;
451
452 s = SecTrustGetCertificateAtIndex(trust, i);
453 CFArrayAppendValue(array, s);
454 }
455 *ret_chain = array;
456 }
457
458 CFReleaseNull(trust);
459 CFReleaseNull(policy);
460 return (status);
461 }
462
463 static OSStatus
464 EAPSecIdentityCreateIdentityTrustChain(SecIdentityRef identity,
465 CFArrayRef * ret_array)
466 {
467 CFMutableArrayRef array = NULL;
468 CFIndex count;
469 OSStatus status;
470 CFArrayRef trust_chain = NULL;
471
472 *ret_array = NULL;
473 ok_status(status = _EAPSecIdentityCreateCertificateTrustChain(identity,
474 &trust_chain), "_EAPSecIdentityCreateCertificateTrustChain");
475 count = CFArrayGetCount(trust_chain);
476 array = CFArrayCreateMutable(NULL, count + 1, &kCFTypeArrayCallBacks);
477 CFArrayAppendValue(array, identity); /* identity into [0] */
478 CFArrayAppendArray(array, trust_chain, CFRangeMake(0, count));
479 *ret_array = array;
480
481 CFReleaseNull(trust_chain);
482 return (status);
483 }
484
485
486 static void
487 tests(void)
488 {
489 SSLContextRef ctx = NULL;
490 SecIdentityRef identity;
491 CFArrayRef list = NULL;
492 CFArrayRef trust_chain;
493
494 AddIdentityToKeychain();
495 EAPSecIdentityListCreate(&list);
496 identity = (SecIdentityRef)CFArrayGetValueAtIndex(list, 0);
497 is(CFGetRetainCount(identity), 1, "identity rc = 1");
498 ok_status(EAPSecIdentityCreateIdentityTrustChain(identity, &trust_chain),
499 "EAPSecIdentityCreateIdentityTrustChain");
500 ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLNewContext");
501 ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
502 CFReleaseNull(ctx);
503 DeleteIdentityFromKeychain();
504 CFRelease(trust_chain);
505 CFReleaseNull(list);
506 }
507
508 int ssl_40_clientauth(int argc, char *const *argv)
509 {
510 plan_tests(19);
511
512 tests();
513
514 return 0;
515 }
516
517 #endif /* TARGET_OS_IPHONE */