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
39friendlyName: uranusLeaf
40localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
41subject=/CN=uranusLeaf/emailAddress=uranus@uranus.com
42issuer=/CN=plutoCA/emailAddress=pluto@pluto.com
43 */
44static 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
142friendlyName: uranusLeaf
143localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
144Key Attributes: <No Attributes>
145 */
146static 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. */
305static 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
349static 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
392static OSStatus
393EAPSecIdentityListCreate(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
421static 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
463static OSStatus
464EAPSecIdentityCreateIdentityTrustChain(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
486static void
487tests(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
508int 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 */
518