1/*
2 *  ssl-40-clientauth.c
3 *  Security
4 *
5 *  Copyright (c) 2008-2010,2012-2014 Apple Inc. All Rights Reserved.
6 *
7 */
8
9#include <CoreFoundation/CoreFoundation.h>
10#include <Security/SecCertificatePriv.h>
11#include <Security/SecIdentityPriv.h>
12#include <Security/SecureTransport.h>
13#include <utilities/array_size.h>
14#include <stdlib.h>
15#include <unistd.h>
16
17#if TARGET_OS_IPHONE
18#include <Security/SecRSAKey.h>
19#endif
20
21#include "ssl_regressions.h"
22
23#define CFReleaseSafe(CF) { CFTypeRef _cf = (CF); if (_cf) {  CFRelease(_cf); } }
24#define CFReleaseNull(CF) { CFTypeRef _cf = (CF); if (_cf) {  (CF) = NULL; CFRelease(_cf); } }
25
26/*
27   Bag Attributes
28friendlyName: uranusLeaf
29localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
30subject=/CN=uranusLeaf/emailAddress=uranus@uranus.com
31issuer=/CN=plutoCA/emailAddress=pluto@pluto.com
32 */
33static const uint8_t _c1[] = {
34    0x30, 0x82, 0x02, 0xe0, 0x30, 0x82, 0x01, 0xc8,
35    0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
36    0x30, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
37    0xf7, 0x0d, 0x01, 0x01, 0x05, 0x30, 0x32, 0x31,
38    0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03,
39    0x0c, 0x07, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x43,
40    0x41, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x09, 0x2a,
41    0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01,
42    0x0c, 0x0f, 0x70, 0x6c, 0x75, 0x74, 0x6f, 0x40,
43    0x70, 0x6c, 0x75, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
44    0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x35, 0x31,
45    0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32,
46    0x35, 0x5a, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x32,
47    0x31, 0x37, 0x30, 0x30, 0x30, 0x34, 0x32, 0x35,
48    0x5a, 0x30, 0x37, 0x31, 0x13, 0x30, 0x11, 0x06,
49    0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x75, 0x72,
50    0x61, 0x6e, 0x75, 0x73, 0x4c, 0x65, 0x61, 0x66,
51    0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86,
52    0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x0c,
53    0x11, 0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x40,
54    0x75, 0x72, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
55    0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
56    0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
57    0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
58    0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,
59    0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6, 0x7e,
60    0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32, 0x35,
61    0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72, 0xa8,
62    0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80, 0x80,
63    0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93, 0x93,
64    0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b, 0xd7,
65    0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9, 0xfb,
66    0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08, 0xac,
67    0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0, 0x2a,
68    0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c, 0xc3,
69    0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde, 0x78,
70    0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e, 0x9b,
71    0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1, 0xf6,
72    0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03, 0xe7,
73    0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57, 0xdc,
74    0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64, 0xaa,
75    0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43, 0xe2,
76    0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9, 0x4f,
77    0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd, 0x04,
78    0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5, 0xb2,
79    0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e, 0x71,
80    0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23, 0x44,
81    0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1, 0x48,
82    0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5, 0x4b,
83    0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1, 0x47,
84    0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25, 0x08,
85    0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a, 0x32,
86    0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae, 0x26,
87    0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72, 0x23,
88    0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2, 0xd4,
89    0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75, 0x9e,
90    0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d, 0xf8,
91    0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00, 0x01,
92    0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
93    0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,
94    0x82, 0x01, 0x01, 0x00, 0x17, 0xa5, 0x22, 0xed,
95    0xb8, 0x3e, 0x1f, 0x11, 0x99, 0xc5, 0xba, 0x28,
96    0x3e, 0x7e, 0xa6, 0xeb, 0x02, 0x81, 0x06, 0xa1,
97    0xc6, 0x80, 0xb9, 0x7e, 0x5c, 0x5a, 0x63, 0xe0,
98    0x8d, 0xeb, 0xd0, 0xec, 0x9c, 0x3a, 0x94, 0x64,
99    0x7c, 0x13, 0x54, 0x0d, 0xd6, 0xe3, 0x27, 0x88,
100    0xa6, 0xd2, 0x4b, 0x36, 0xdd, 0x2e, 0xfa, 0x94,
101    0xe5, 0x03, 0x27, 0xc9, 0xa6, 0x31, 0x02, 0xea,
102    0x40, 0x77, 0x2e, 0x93, 0xc4, 0x4d, 0xe2, 0x70,
103    0xe2, 0x67, 0x1c, 0xa8, 0x0d, 0xcd, 0x1a, 0x72,
104    0x86, 0x2c, 0xea, 0xdc, 0x7f, 0x8c, 0x49, 0x2c,
105    0xe7, 0x99, 0x13, 0xda, 0x3f, 0x58, 0x9e, 0xf5,
106    0x4d, 0x3c, 0x8c, 0x1c, 0xed, 0x85, 0xa7, 0xe2,
107    0xae, 0xda, 0x5f, 0xbe, 0x36, 0x1c, 0x9f, 0x5a,
108    0xa0, 0xdc, 0x2a, 0xc0, 0xee, 0x71, 0x07, 0x26,
109    0x8b, 0xe8, 0x8a, 0xf8, 0x2d, 0x36, 0x78, 0xc9,
110    0x79, 0xfa, 0xbe, 0x98, 0x59, 0x95, 0x12, 0x24,
111    0xf1, 0xda, 0x20, 0xc7, 0x78, 0xf9, 0x7c, 0x6a,
112    0x24, 0x43, 0x82, 0xa8, 0x0f, 0xb1, 0x7d, 0x94,
113    0xaa, 0x30, 0x35, 0xe5, 0x69, 0xdc, 0x0a, 0x0e,
114    0xaf, 0x10, 0x5e, 0x1a, 0x81, 0x50, 0x5c, 0x7e,
115    0x24, 0xb3, 0x07, 0x65, 0x4b, 0xc1, 0x7e, 0xc6,
116    0x38, 0xdb, 0xd3, 0x6a, 0xf0, 0xd8, 0x85, 0x61,
117    0x9a, 0x9f, 0xfe, 0x02, 0x46, 0x29, 0xb2, 0x9a,
118    0xe2, 0x04, 0xe7, 0x72, 0xcc, 0x87, 0x46, 0xba,
119    0x7d, 0xa8, 0xf9, 0xd0, 0x0f, 0x29, 0xfc, 0xfd,
120    0xd1, 0xd0, 0x7f, 0x36, 0xc1, 0xd8, 0x7d, 0x88,
121    0x03, 0x62, 0xf5, 0x8c, 0x00, 0xb5, 0xc2, 0x81,
122    0x44, 0x67, 0x58, 0x11, 0xb4, 0x3a, 0xbb, 0xd1,
123    0x8c, 0x94, 0x20, 0x60, 0xea, 0xa0, 0xac, 0xc1,
124    0xf1, 0x08, 0x54, 0xb8, 0xf6, 0x5e, 0xac, 0xf1,
125    0xec, 0x78, 0x69, 0x9d, 0x7e, 0x4d, 0x06, 0x3b,
126    0x9b, 0x78, 0x78, 0x10
127};
128
129/*
130   Bag Attributes
131friendlyName: uranusLeaf
132localKeyID: 46 E0 8A 05 63 4D 17 3F CA A4 AA B6 5A DA CF BA 84 22 7C 23
133Key Attributes: <No Attributes>
134 */
135
136#if TARGET_OS_IPHONE
137/* we use _k1 on iPhone */
138static const uint8_t _k1[] = {
139    0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
140    0x82, 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6,
141    0x7e, 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32,
142    0x35, 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72,
143    0xa8, 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80,
144    0x80, 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93,
145    0x93, 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b,
146    0xd7, 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9,
147    0xfb, 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08,
148    0xac, 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0,
149    0x2a, 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c,
150    0xc3, 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde,
151    0x78, 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e,
152    0x9b, 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1,
153    0xf6, 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03,
154    0xe7, 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57,
155    0xdc, 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64,
156    0xaa, 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43,
157    0xe2, 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9,
158    0x4f, 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd,
159    0x04, 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5,
160    0xb2, 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e,
161    0x71, 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23,
162    0x44, 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1,
163    0x48, 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5,
164    0x4b, 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1,
165    0x47, 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25,
166    0x08, 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a,
167    0x32, 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae,
168    0x26, 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72,
169    0x23, 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2,
170    0xd4, 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75,
171    0x9e, 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d,
172    0xf8, 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00,
173    0x01, 0x02, 0x82, 0x01, 0x00, 0x4d, 0x27, 0xf2,
174    0x40, 0xc8, 0x3f, 0x5c, 0x87, 0x3c, 0xd9, 0xde,
175    0xa6, 0xa5, 0x93, 0xea, 0xbd, 0x36, 0xf8, 0xd9,
176    0xad, 0xc7, 0xda, 0x07, 0x7a, 0xec, 0x31, 0x02,
177    0x41, 0x09, 0x3a, 0x34, 0x32, 0x82, 0x0b, 0x5b,
178    0x7b, 0xe6, 0xa4, 0x2a, 0xe7, 0x14, 0xef, 0x43,
179    0x36, 0x61, 0xbe, 0x20, 0x4b, 0x82, 0x43, 0x63,
180    0x98, 0x80, 0x82, 0x19, 0x61, 0x71, 0x99, 0xaa,
181    0xf8, 0x59, 0xfd, 0xde, 0xa0, 0x03, 0xa8, 0xab,
182    0x9a, 0xec, 0x28, 0xac, 0x63, 0x79, 0x75, 0x84,
183    0x03, 0xac, 0x45, 0x5e, 0x04, 0x15, 0xb3, 0x47,
184    0xa2, 0x8f, 0x28, 0xb0, 0x72, 0xd0, 0x06, 0x02,
185    0xaf, 0x1e, 0x0a, 0x0a, 0xe9, 0x11, 0x35, 0x4a,
186    0x04, 0x42, 0xb5, 0x0f, 0xd2, 0xcf, 0x4d, 0xdf,
187    0xdb, 0xef, 0x58, 0xbd, 0xf3, 0xa5, 0x3b, 0x11,
188    0x3f, 0xc5, 0x47, 0x81, 0x85, 0xad, 0xd7, 0x1f,
189    0x58, 0x06, 0x42, 0xdc, 0x37, 0x3c, 0xdb, 0x98,
190    0x33, 0xa1, 0xc6, 0x80, 0x07, 0xe0, 0x2b, 0xc5,
191    0xf5, 0x60, 0x35, 0x6a, 0xa2, 0x06, 0x40, 0x4a,
192    0xac, 0x64, 0x02, 0x58, 0x4d, 0x07, 0xe3, 0x69,
193    0xd7, 0xe0, 0x8f, 0xb5, 0xf4, 0xbc, 0xfa, 0xab,
194    0x1a, 0xb0, 0xfa, 0x29, 0xf8, 0xca, 0xde, 0x78,
195    0xf0, 0x89, 0xe2, 0xf9, 0xb7, 0x68, 0x5b, 0x0e,
196    0xdc, 0x4e, 0x8a, 0x56, 0x8d, 0x33, 0x20, 0x2e,
197    0xed, 0x2e, 0xab, 0x6f, 0xba, 0x77, 0xef, 0xe6,
198    0x12, 0x62, 0x49, 0x9e, 0x87, 0x76, 0x1c, 0x1e,
199    0xf4, 0x0e, 0x9e, 0x78, 0x98, 0x91, 0x1a, 0xe3,
200    0xb4, 0x51, 0x4b, 0x8c, 0x2f, 0x08, 0x97, 0x8f,
201    0xf9, 0x68, 0x61, 0x40, 0xcd, 0xb6, 0x10, 0xb4,
202    0xfb, 0x75, 0xb4, 0x20, 0xc1, 0x5a, 0xda, 0x64,
203    0xfd, 0x51, 0x06, 0x85, 0x9a, 0x9e, 0x5d, 0x82,
204    0x14, 0xd4, 0x41, 0x4e, 0x75, 0x10, 0xb5, 0x7b,
205    0xd0, 0x4c, 0xd1, 0x00, 0x01, 0x02, 0x81, 0x81,
206    0x00, 0xcf, 0x8e, 0x68, 0x04, 0x67, 0x09, 0xa9,
207    0x6e, 0xff, 0x11, 0x8c, 0xe5, 0xe4, 0x16, 0xdd,
208    0xb6, 0xa6, 0x55, 0xca, 0x4b, 0x0b, 0xbb, 0xb7,
209    0xf5, 0xe5, 0x73, 0xf3, 0x24, 0x84, 0x29, 0xb2,
210    0xc3, 0xbc, 0x7f, 0x2b, 0x4a, 0xc7, 0xdf, 0x46,
211    0x8e, 0xe1, 0x35, 0x69, 0x1b, 0x8e, 0x9f, 0x6b,
212    0x4d, 0xf3, 0x65, 0xae, 0x3d, 0x87, 0x2b, 0xc9,
213    0xf0, 0x8c, 0xf2, 0x88, 0x2f, 0x1b, 0x79, 0x80,
214    0xd2, 0xb2, 0x64, 0x0a, 0xcc, 0x66, 0x69, 0x4c,
215    0xa1, 0x85, 0xc4, 0x6a, 0x94, 0x46, 0x70, 0x69,
216    0xbc, 0x8c, 0x1c, 0x62, 0x65, 0x4d, 0x68, 0xcc,
217    0xe3, 0x3c, 0x6c, 0xe7, 0xd1, 0x09, 0xed, 0xdd,
218    0x42, 0x10, 0x11, 0x6b, 0xdd, 0x7c, 0xe3, 0xe1,
219    0x3b, 0x3b, 0x0d, 0x01, 0x6d, 0xca, 0x2f, 0x4b,
220    0x45, 0x5e, 0x76, 0x5d, 0x5c, 0x6f, 0x53, 0xa4,
221    0x38, 0x74, 0x75, 0x94, 0x2c, 0xda, 0xf8, 0xa6,
222    0x01, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x5f, 0x9d,
223    0x6c, 0x94, 0xf6, 0x44, 0x37, 0x72, 0xfe, 0xcf,
224    0xbe, 0x82, 0x96, 0x24, 0x22, 0x12, 0x07, 0x6f,
225    0xd1, 0x57, 0x7b, 0xc7, 0x63, 0x20, 0xf5, 0x93,
226    0x79, 0x70, 0x0b, 0xe4, 0x38, 0x19, 0x62, 0x7b,
227    0x89, 0x3e, 0x45, 0xdf, 0xd6, 0xae, 0x9d, 0x0d,
228    0xa8, 0x76, 0xc1, 0xbd, 0x04, 0x2b, 0xaa, 0x30,
229    0x6a, 0xac, 0x65, 0x91, 0x61, 0xf0, 0xf8, 0x5d,
230    0xa3, 0x53, 0xa4, 0xfb, 0x99, 0xac, 0x46, 0x7a,
231    0x12, 0x4b, 0xf7, 0xa7, 0x48, 0x41, 0x61, 0x48,
232    0x26, 0x5c, 0x68, 0x2f, 0x73, 0x91, 0xe4, 0x74,
233    0xcd, 0xc9, 0x8b, 0xe7, 0x26, 0xe4, 0x35, 0xde,
234    0x32, 0x6b, 0x24, 0x49, 0xf2, 0x04, 0x67, 0x3d,
235    0x31, 0x8f, 0x22, 0xe5, 0x49, 0xae, 0x49, 0x94,
236    0xb3, 0x45, 0x2b, 0xed, 0x6f, 0x9c, 0xc7, 0x80,
237    0xf0, 0x42, 0xd5, 0x8f, 0x27, 0xd6, 0xd6, 0x49,
238    0xf2, 0x16, 0xcc, 0x4b, 0x39, 0x02, 0x81, 0x81,
239    0x00, 0xbb, 0xb7, 0xd7, 0x59, 0xcb, 0xfb, 0x10,
240    0x13, 0xc4, 0x7b, 0x92, 0x0c, 0x45, 0xcb, 0x6c,
241    0x81, 0x0a, 0x55, 0x63, 0x1d, 0x96, 0xa2, 0x13,
242    0xd2, 0x40, 0xd1, 0x2a, 0xa1, 0xe7, 0x2a, 0x73,
243    0x74, 0xd6, 0x61, 0xc9, 0xbc, 0xdb, 0xa2, 0x93,
244    0x85, 0x1c, 0x28, 0x9b, 0x44, 0x82, 0x2c, 0xaa,
245    0xf7, 0x18, 0x60, 0xe9, 0x42, 0xda, 0xa2, 0xff,
246    0x04, 0x21, 0xe6, 0x24, 0xc7, 0x3e, 0x39, 0x19,
247    0x0a, 0xf6, 0xae, 0xc6, 0x99, 0x71, 0x32, 0x61,
248    0x4d, 0x60, 0xd7, 0x71, 0x71, 0x63, 0x77, 0xbe,
249    0x19, 0xfa, 0x3a, 0x9d, 0xbf, 0x73, 0x50, 0x8a,
250    0xa6, 0x26, 0x7b, 0x74, 0xfa, 0x39, 0xd9, 0xb9,
251    0x18, 0x4b, 0xc2, 0x05, 0xe5, 0x8f, 0x53, 0xe6,
252    0xdc, 0x14, 0x1f, 0x42, 0x20, 0x93, 0x11, 0x4d,
253    0x29, 0x93, 0x32, 0xc8, 0x63, 0x96, 0x88, 0x76,
254    0x69, 0x5c, 0xe3, 0x0e, 0xbd, 0xb6, 0xd9, 0xd6,
255    0x01, 0x02, 0x81, 0x80, 0x62, 0xa2, 0xed, 0x84,
256    0xdc, 0xf6, 0x7a, 0x44, 0xf7, 0x62, 0x12, 0x7c,
257    0xb9, 0x53, 0x4a, 0xff, 0x62, 0x11, 0x58, 0x4e,
258    0xfe, 0xe9, 0x60, 0x15, 0xe8, 0x1a, 0x8a, 0x3d,
259    0xe4, 0xe6, 0x91, 0x31, 0xb0, 0x5f, 0x70, 0x5d,
260    0xb6, 0x1e, 0xf1, 0x26, 0xb6, 0xae, 0x8f, 0x84,
261    0xbd, 0xa4, 0xc7, 0x17, 0x5d, 0xb1, 0x5b, 0x97,
262    0xa0, 0x3d, 0x17, 0xda, 0x26, 0x55, 0xe3, 0x03,
263    0x32, 0x85, 0x26, 0xa1, 0xe3, 0xef, 0xe5, 0x69,
264    0x2c, 0x3b, 0x41, 0x88, 0x9e, 0x7e, 0x0e, 0x9c,
265    0xfd, 0xfc, 0xbb, 0xed, 0x91, 0xc0, 0x5b, 0xa9,
266    0x0a, 0x87, 0xba, 0xf9, 0x1e, 0xda, 0x10, 0x61,
267    0xbe, 0xbb, 0xab, 0x18, 0x25, 0xad, 0x3f, 0xe2,
268    0xb1, 0x90, 0x5c, 0xf7, 0x4a, 0x51, 0xe4, 0xad,
269    0x45, 0x27, 0x97, 0xdd, 0xe7, 0x3a, 0x9a, 0x5e,
270    0xca, 0x7a, 0xaf, 0x4a, 0xbf, 0x10, 0x24, 0x6b,
271    0xb5, 0x2f, 0x61, 0x61, 0x02, 0x81, 0x81, 0x00,
272    0x85, 0x7c, 0x78, 0xa5, 0x11, 0xdf, 0xc3, 0x6a,
273    0x38, 0x48, 0xfa, 0x7e, 0x48, 0xf0, 0x5a, 0x58,
274    0xe2, 0xc5, 0x83, 0x4e, 0x38, 0x3f, 0x4a, 0x2b,
275    0x07, 0x57, 0x31, 0xe7, 0xbe, 0x50, 0xb1, 0xbb,
276    0x24, 0xf3, 0x3d, 0x8b, 0x53, 0xb7, 0xd1, 0x47,
277    0x72, 0x5e, 0xd5, 0xd6, 0x4c, 0xce, 0x2c, 0x46,
278    0x61, 0x9a, 0xaa, 0xc3, 0x0e, 0xd4, 0x23, 0x2c,
279    0xdd, 0xf5, 0xb7, 0xad, 0x38, 0x52, 0x17, 0xc4,
280    0x16, 0xbb, 0xda, 0x1c, 0x61, 0xb1, 0xca, 0x8d,
281    0xb2, 0xa0, 0xbe, 0x4f, 0x3d, 0x19, 0x0e, 0xe0,
282    0x0e, 0x52, 0xad, 0xf3, 0xaf, 0xd9, 0xcc, 0x78,
283    0xc2, 0xb1, 0x5e, 0x05, 0x5e, 0xf2, 0x27, 0x84,
284    0x15, 0xe4, 0x8f, 0xca, 0xc5, 0x92, 0x43, 0xe0,
285    0x24, 0x8d, 0xf2, 0x5d, 0x55, 0xcc, 0x9d, 0x2f,
286    0xa9, 0xf6, 0x9b, 0x67, 0x6a, 0x87, 0x74, 0x36,
287    0x34, 0x7c, 0xd4, 0x9d, 0xff, 0xad, 0xee, 0x69
288};
289#else
290  /* don’t use _k1 */
291#endif
292
293__unused static const uint8_t _k1_digest[] = {
294    0x46, 0xE0, 0x8A, 0x05, 0x63, 0x4D, 0x17, 0x3F,
295    0xCA, 0xA4, 0xAA, 0xB6, 0x5A, 0xDA, 0xCF, 0xBA,
296    0x84, 0x22, 0x7C, 0x23
297};
298
299/* Create and identity and try to retrieve it. */
300static void tests(void)
301{
302    SecCertificateRef cert = NULL, cert2 = NULL;
303    SecKeyRef privKey = NULL;
304    SecIdentityRef identity = NULL;
305    CFArrayRef trust_chain = NULL;
306    SSLContextRef ctx = NULL;
307
308    isnt(cert = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
309            NULL, "create certificate");
310    isnt(cert2 = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
311            NULL, "create certificate2");
312#if TARGET_OS_IPHONE
313    privKey = SecKeyCreateRSAPrivateKey(NULL, _k1, sizeof(_k1),
314                kSecKeyEncodingPkcs1);
315#else
316    privKey = NULL; /* TODO */
317#endif
318    isnt(privKey, NULL, "create private key");
319
320    ok(identity = SecIdentityCreate(kCFAllocatorDefault, cert, privKey), "SecIdentityCreate");
321    CFReleaseSafe(cert);
322    CFReleaseSafe(privKey);
323    const void *values[] = { identity, cert2 };
324    ok(trust_chain = CFArrayCreate(kCFAllocatorDefault, values,
325        array_size(values), &kCFTypeArrayCallBacks), "CFArrayCreate");
326    CFReleaseSafe(identity);
327    CFReleaseSafe(cert2);
328
329    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
330    is(CFGetRetainCount(identity), 1, "identity rc = 1");
331    is(CFGetRetainCount(cert), 1, "cert rc = 1");
332    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
333    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
334
335    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLNewContext");
336    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
337    CFReleaseSafe(ctx);
338
339    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
340    is(CFGetRetainCount(identity), 1, "identity rc = 1");
341    is(CFGetRetainCount(cert), 1, "cert rc = 1");
342    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
343    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
344
345    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLCreateContext");
346    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
347    CFReleaseSafe(ctx);
348
349    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
350    is(CFGetRetainCount(identity), 1, "identity rc = 1");
351    is(CFGetRetainCount(cert), 1, "cert rc = 1");
352    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
353    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
354
355    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLCreateContext");
356    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
357    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
358    CFReleaseSafe(ctx);
359
360    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
361    is(CFGetRetainCount(identity), 1, "identity rc = 1");
362    is(CFGetRetainCount(cert), 1, "cert rc = 1");
363    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
364    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
365
366    CFReleaseNull(trust_chain);
367}
368
369int ssl_41_clientauth(int argc, char *const *argv)
370{
371    plan_tests(32);
372
373
374    tests();
375
376    return 0;
377}
378