1/*
2 *  ssl-40-clientauth.c
3 *  Security
4 *
5 *  Copyright (c) 2008-2010 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 */
135static const uint8_t _k1[] = {
136    0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
137    0x82, 0x01, 0x01, 0x00, 0xa6, 0x82, 0x8e, 0xc6,
138    0x7e, 0xc9, 0x8c, 0x99, 0x6f, 0xb0, 0x62, 0x32,
139    0x35, 0xe7, 0xdb, 0xff, 0x34, 0x84, 0xdc, 0x72,
140    0xa8, 0xef, 0x22, 0x6f, 0x93, 0x63, 0x64, 0x80,
141    0x80, 0x5d, 0x50, 0x7e, 0xb4, 0x2e, 0x1b, 0x93,
142    0x93, 0x49, 0xca, 0xae, 0xcd, 0x34, 0x44, 0x4b,
143    0xd7, 0xfa, 0x9f, 0x3c, 0xfc, 0x9e, 0x65, 0xa9,
144    0xfb, 0x5e, 0x5d, 0x18, 0xa3, 0xf8, 0xb0, 0x08,
145    0xac, 0x8f, 0xfd, 0x03, 0xcb, 0xbd, 0x7f, 0xa0,
146    0x2a, 0xa6, 0xea, 0xca, 0xa3, 0x24, 0xef, 0x7c,
147    0xc3, 0xeb, 0x95, 0xcb, 0x90, 0x3f, 0x5e, 0xde,
148    0x78, 0xf2, 0x3d, 0x32, 0x72, 0xdb, 0x33, 0x6e,
149    0x9b, 0x52, 0x9f, 0x0c, 0x60, 0x4a, 0x24, 0xa1,
150    0xf6, 0x3b, 0x80, 0xbd, 0xa1, 0xdc, 0x40, 0x03,
151    0xe7, 0xa0, 0x59, 0x1f, 0xdb, 0xb4, 0xed, 0x57,
152    0xdc, 0x74, 0x0d, 0x99, 0x5a, 0x12, 0x74, 0x64,
153    0xaa, 0xb6, 0xa5, 0x96, 0x75, 0xf9, 0x42, 0x43,
154    0xe2, 0x52, 0xc2, 0x57, 0x23, 0x75, 0xd7, 0xa9,
155    0x4f, 0x07, 0x32, 0x99, 0xbd, 0x3d, 0x44, 0xbd,
156    0x04, 0x62, 0xe5, 0xb7, 0x2c, 0x0c, 0x11, 0xc5,
157    0xb2, 0x2e, 0xc4, 0x12, 0x1d, 0x7f, 0x42, 0x1e,
158    0x71, 0xaf, 0x39, 0x2b, 0x78, 0x47, 0x92, 0x23,
159    0x44, 0xef, 0xe3, 0xc1, 0x47, 0x69, 0x5a, 0xf1,
160    0x48, 0xaa, 0x37, 0xa4, 0x94, 0x6b, 0x96, 0xe5,
161    0x4b, 0xfd, 0x05, 0xc7, 0x9c, 0xcc, 0x38, 0xd1,
162    0x47, 0x85, 0x60, 0x7f, 0xef, 0xe9, 0x2e, 0x25,
163    0x08, 0xf8, 0x7d, 0x98, 0xdd, 0x6c, 0xeb, 0x4a,
164    0x32, 0x33, 0x44, 0x0b, 0x61, 0xb3, 0xf9, 0xae,
165    0x26, 0x41, 0xb5, 0x38, 0xdb, 0xcf, 0x13, 0x72,
166    0x23, 0x5b, 0x66, 0x20, 0x86, 0x4d, 0x24, 0xc2,
167    0xd4, 0x94, 0xde, 0xe3, 0x24, 0xb7, 0xcd, 0x75,
168    0x9e, 0x1d, 0x9f, 0xbc, 0xd0, 0x60, 0x34, 0x7d,
169    0xf8, 0xcb, 0x41, 0x39, 0x02, 0x03, 0x01, 0x00,
170    0x01, 0x02, 0x82, 0x01, 0x00, 0x4d, 0x27, 0xf2,
171    0x40, 0xc8, 0x3f, 0x5c, 0x87, 0x3c, 0xd9, 0xde,
172    0xa6, 0xa5, 0x93, 0xea, 0xbd, 0x36, 0xf8, 0xd9,
173    0xad, 0xc7, 0xda, 0x07, 0x7a, 0xec, 0x31, 0x02,
174    0x41, 0x09, 0x3a, 0x34, 0x32, 0x82, 0x0b, 0x5b,
175    0x7b, 0xe6, 0xa4, 0x2a, 0xe7, 0x14, 0xef, 0x43,
176    0x36, 0x61, 0xbe, 0x20, 0x4b, 0x82, 0x43, 0x63,
177    0x98, 0x80, 0x82, 0x19, 0x61, 0x71, 0x99, 0xaa,
178    0xf8, 0x59, 0xfd, 0xde, 0xa0, 0x03, 0xa8, 0xab,
179    0x9a, 0xec, 0x28, 0xac, 0x63, 0x79, 0x75, 0x84,
180    0x03, 0xac, 0x45, 0x5e, 0x04, 0x15, 0xb3, 0x47,
181    0xa2, 0x8f, 0x28, 0xb0, 0x72, 0xd0, 0x06, 0x02,
182    0xaf, 0x1e, 0x0a, 0x0a, 0xe9, 0x11, 0x35, 0x4a,
183    0x04, 0x42, 0xb5, 0x0f, 0xd2, 0xcf, 0x4d, 0xdf,
184    0xdb, 0xef, 0x58, 0xbd, 0xf3, 0xa5, 0x3b, 0x11,
185    0x3f, 0xc5, 0x47, 0x81, 0x85, 0xad, 0xd7, 0x1f,
186    0x58, 0x06, 0x42, 0xdc, 0x37, 0x3c, 0xdb, 0x98,
187    0x33, 0xa1, 0xc6, 0x80, 0x07, 0xe0, 0x2b, 0xc5,
188    0xf5, 0x60, 0x35, 0x6a, 0xa2, 0x06, 0x40, 0x4a,
189    0xac, 0x64, 0x02, 0x58, 0x4d, 0x07, 0xe3, 0x69,
190    0xd7, 0xe0, 0x8f, 0xb5, 0xf4, 0xbc, 0xfa, 0xab,
191    0x1a, 0xb0, 0xfa, 0x29, 0xf8, 0xca, 0xde, 0x78,
192    0xf0, 0x89, 0xe2, 0xf9, 0xb7, 0x68, 0x5b, 0x0e,
193    0xdc, 0x4e, 0x8a, 0x56, 0x8d, 0x33, 0x20, 0x2e,
194    0xed, 0x2e, 0xab, 0x6f, 0xba, 0x77, 0xef, 0xe6,
195    0x12, 0x62, 0x49, 0x9e, 0x87, 0x76, 0x1c, 0x1e,
196    0xf4, 0x0e, 0x9e, 0x78, 0x98, 0x91, 0x1a, 0xe3,
197    0xb4, 0x51, 0x4b, 0x8c, 0x2f, 0x08, 0x97, 0x8f,
198    0xf9, 0x68, 0x61, 0x40, 0xcd, 0xb6, 0x10, 0xb4,
199    0xfb, 0x75, 0xb4, 0x20, 0xc1, 0x5a, 0xda, 0x64,
200    0xfd, 0x51, 0x06, 0x85, 0x9a, 0x9e, 0x5d, 0x82,
201    0x14, 0xd4, 0x41, 0x4e, 0x75, 0x10, 0xb5, 0x7b,
202    0xd0, 0x4c, 0xd1, 0x00, 0x01, 0x02, 0x81, 0x81,
203    0x00, 0xcf, 0x8e, 0x68, 0x04, 0x67, 0x09, 0xa9,
204    0x6e, 0xff, 0x11, 0x8c, 0xe5, 0xe4, 0x16, 0xdd,
205    0xb6, 0xa6, 0x55, 0xca, 0x4b, 0x0b, 0xbb, 0xb7,
206    0xf5, 0xe5, 0x73, 0xf3, 0x24, 0x84, 0x29, 0xb2,
207    0xc3, 0xbc, 0x7f, 0x2b, 0x4a, 0xc7, 0xdf, 0x46,
208    0x8e, 0xe1, 0x35, 0x69, 0x1b, 0x8e, 0x9f, 0x6b,
209    0x4d, 0xf3, 0x65, 0xae, 0x3d, 0x87, 0x2b, 0xc9,
210    0xf0, 0x8c, 0xf2, 0x88, 0x2f, 0x1b, 0x79, 0x80,
211    0xd2, 0xb2, 0x64, 0x0a, 0xcc, 0x66, 0x69, 0x4c,
212    0xa1, 0x85, 0xc4, 0x6a, 0x94, 0x46, 0x70, 0x69,
213    0xbc, 0x8c, 0x1c, 0x62, 0x65, 0x4d, 0x68, 0xcc,
214    0xe3, 0x3c, 0x6c, 0xe7, 0xd1, 0x09, 0xed, 0xdd,
215    0x42, 0x10, 0x11, 0x6b, 0xdd, 0x7c, 0xe3, 0xe1,
216    0x3b, 0x3b, 0x0d, 0x01, 0x6d, 0xca, 0x2f, 0x4b,
217    0x45, 0x5e, 0x76, 0x5d, 0x5c, 0x6f, 0x53, 0xa4,
218    0x38, 0x74, 0x75, 0x94, 0x2c, 0xda, 0xf8, 0xa6,
219    0x01, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x5f, 0x9d,
220    0x6c, 0x94, 0xf6, 0x44, 0x37, 0x72, 0xfe, 0xcf,
221    0xbe, 0x82, 0x96, 0x24, 0x22, 0x12, 0x07, 0x6f,
222    0xd1, 0x57, 0x7b, 0xc7, 0x63, 0x20, 0xf5, 0x93,
223    0x79, 0x70, 0x0b, 0xe4, 0x38, 0x19, 0x62, 0x7b,
224    0x89, 0x3e, 0x45, 0xdf, 0xd6, 0xae, 0x9d, 0x0d,
225    0xa8, 0x76, 0xc1, 0xbd, 0x04, 0x2b, 0xaa, 0x30,
226    0x6a, 0xac, 0x65, 0x91, 0x61, 0xf0, 0xf8, 0x5d,
227    0xa3, 0x53, 0xa4, 0xfb, 0x99, 0xac, 0x46, 0x7a,
228    0x12, 0x4b, 0xf7, 0xa7, 0x48, 0x41, 0x61, 0x48,
229    0x26, 0x5c, 0x68, 0x2f, 0x73, 0x91, 0xe4, 0x74,
230    0xcd, 0xc9, 0x8b, 0xe7, 0x26, 0xe4, 0x35, 0xde,
231    0x32, 0x6b, 0x24, 0x49, 0xf2, 0x04, 0x67, 0x3d,
232    0x31, 0x8f, 0x22, 0xe5, 0x49, 0xae, 0x49, 0x94,
233    0xb3, 0x45, 0x2b, 0xed, 0x6f, 0x9c, 0xc7, 0x80,
234    0xf0, 0x42, 0xd5, 0x8f, 0x27, 0xd6, 0xd6, 0x49,
235    0xf2, 0x16, 0xcc, 0x4b, 0x39, 0x02, 0x81, 0x81,
236    0x00, 0xbb, 0xb7, 0xd7, 0x59, 0xcb, 0xfb, 0x10,
237    0x13, 0xc4, 0x7b, 0x92, 0x0c, 0x45, 0xcb, 0x6c,
238    0x81, 0x0a, 0x55, 0x63, 0x1d, 0x96, 0xa2, 0x13,
239    0xd2, 0x40, 0xd1, 0x2a, 0xa1, 0xe7, 0x2a, 0x73,
240    0x74, 0xd6, 0x61, 0xc9, 0xbc, 0xdb, 0xa2, 0x93,
241    0x85, 0x1c, 0x28, 0x9b, 0x44, 0x82, 0x2c, 0xaa,
242    0xf7, 0x18, 0x60, 0xe9, 0x42, 0xda, 0xa2, 0xff,
243    0x04, 0x21, 0xe6, 0x24, 0xc7, 0x3e, 0x39, 0x19,
244    0x0a, 0xf6, 0xae, 0xc6, 0x99, 0x71, 0x32, 0x61,
245    0x4d, 0x60, 0xd7, 0x71, 0x71, 0x63, 0x77, 0xbe,
246    0x19, 0xfa, 0x3a, 0x9d, 0xbf, 0x73, 0x50, 0x8a,
247    0xa6, 0x26, 0x7b, 0x74, 0xfa, 0x39, 0xd9, 0xb9,
248    0x18, 0x4b, 0xc2, 0x05, 0xe5, 0x8f, 0x53, 0xe6,
249    0xdc, 0x14, 0x1f, 0x42, 0x20, 0x93, 0x11, 0x4d,
250    0x29, 0x93, 0x32, 0xc8, 0x63, 0x96, 0x88, 0x76,
251    0x69, 0x5c, 0xe3, 0x0e, 0xbd, 0xb6, 0xd9, 0xd6,
252    0x01, 0x02, 0x81, 0x80, 0x62, 0xa2, 0xed, 0x84,
253    0xdc, 0xf6, 0x7a, 0x44, 0xf7, 0x62, 0x12, 0x7c,
254    0xb9, 0x53, 0x4a, 0xff, 0x62, 0x11, 0x58, 0x4e,
255    0xfe, 0xe9, 0x60, 0x15, 0xe8, 0x1a, 0x8a, 0x3d,
256    0xe4, 0xe6, 0x91, 0x31, 0xb0, 0x5f, 0x70, 0x5d,
257    0xb6, 0x1e, 0xf1, 0x26, 0xb6, 0xae, 0x8f, 0x84,
258    0xbd, 0xa4, 0xc7, 0x17, 0x5d, 0xb1, 0x5b, 0x97,
259    0xa0, 0x3d, 0x17, 0xda, 0x26, 0x55, 0xe3, 0x03,
260    0x32, 0x85, 0x26, 0xa1, 0xe3, 0xef, 0xe5, 0x69,
261    0x2c, 0x3b, 0x41, 0x88, 0x9e, 0x7e, 0x0e, 0x9c,
262    0xfd, 0xfc, 0xbb, 0xed, 0x91, 0xc0, 0x5b, 0xa9,
263    0x0a, 0x87, 0xba, 0xf9, 0x1e, 0xda, 0x10, 0x61,
264    0xbe, 0xbb, 0xab, 0x18, 0x25, 0xad, 0x3f, 0xe2,
265    0xb1, 0x90, 0x5c, 0xf7, 0x4a, 0x51, 0xe4, 0xad,
266    0x45, 0x27, 0x97, 0xdd, 0xe7, 0x3a, 0x9a, 0x5e,
267    0xca, 0x7a, 0xaf, 0x4a, 0xbf, 0x10, 0x24, 0x6b,
268    0xb5, 0x2f, 0x61, 0x61, 0x02, 0x81, 0x81, 0x00,
269    0x85, 0x7c, 0x78, 0xa5, 0x11, 0xdf, 0xc3, 0x6a,
270    0x38, 0x48, 0xfa, 0x7e, 0x48, 0xf0, 0x5a, 0x58,
271    0xe2, 0xc5, 0x83, 0x4e, 0x38, 0x3f, 0x4a, 0x2b,
272    0x07, 0x57, 0x31, 0xe7, 0xbe, 0x50, 0xb1, 0xbb,
273    0x24, 0xf3, 0x3d, 0x8b, 0x53, 0xb7, 0xd1, 0x47,
274    0x72, 0x5e, 0xd5, 0xd6, 0x4c, 0xce, 0x2c, 0x46,
275    0x61, 0x9a, 0xaa, 0xc3, 0x0e, 0xd4, 0x23, 0x2c,
276    0xdd, 0xf5, 0xb7, 0xad, 0x38, 0x52, 0x17, 0xc4,
277    0x16, 0xbb, 0xda, 0x1c, 0x61, 0xb1, 0xca, 0x8d,
278    0xb2, 0xa0, 0xbe, 0x4f, 0x3d, 0x19, 0x0e, 0xe0,
279    0x0e, 0x52, 0xad, 0xf3, 0xaf, 0xd9, 0xcc, 0x78,
280    0xc2, 0xb1, 0x5e, 0x05, 0x5e, 0xf2, 0x27, 0x84,
281    0x15, 0xe4, 0x8f, 0xca, 0xc5, 0x92, 0x43, 0xe0,
282    0x24, 0x8d, 0xf2, 0x5d, 0x55, 0xcc, 0x9d, 0x2f,
283    0xa9, 0xf6, 0x9b, 0x67, 0x6a, 0x87, 0x74, 0x36,
284    0x34, 0x7c, 0xd4, 0x9d, 0xff, 0xad, 0xee, 0x69
285};
286
287static const uint8_t _k1_digest[] = {
288    0x46, 0xE0, 0x8A, 0x05, 0x63, 0x4D, 0x17, 0x3F,
289    0xCA, 0xA4, 0xAA, 0xB6, 0x5A, 0xDA, 0xCF, 0xBA,
290    0x84, 0x22, 0x7C, 0x23
291};
292
293/* Create and identity and try to retrieve it. */
294static void tests(void)
295{
296    SecCertificateRef cert = NULL, cert2 = NULL;
297    SecKeyRef privKey = NULL;
298    SecIdentityRef identity = NULL;
299    CFArrayRef trust_chain = NULL;
300    SSLContextRef ctx = NULL;
301
302    isnt(cert = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
303            NULL, "create certificate");
304    isnt(cert2 = SecCertificateCreateWithBytes(NULL, _c1, sizeof(_c1)),
305            NULL, "create certificate2");
306#if TARGET_OS_IPHONE
307    privKey = SecKeyCreateRSAPrivateKey(NULL, _k1, sizeof(_k1),
308                kSecKeyEncodingPkcs1);
309#else
310    privKey = NULL; /* TODO */
311#endif
312    isnt(privKey, NULL, "create private key");
313
314    ok(identity = SecIdentityCreate(kCFAllocatorDefault, cert, privKey), "SecIdentityCreate");
315    CFReleaseSafe(cert);
316    CFReleaseSafe(privKey);
317    const void *values[] = { identity, cert2 };
318    ok(trust_chain = CFArrayCreate(kCFAllocatorDefault, values,
319        array_size(values), &kCFTypeArrayCallBacks), "CFArrayCreate");
320    CFReleaseSafe(identity);
321    CFReleaseSafe(cert2);
322
323    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
324    is(CFGetRetainCount(identity), 1, "identity rc = 1");
325    is(CFGetRetainCount(cert), 1, "cert rc = 1");
326    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
327    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
328
329    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLNewContext");
330    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
331    CFReleaseSafe(ctx);
332
333    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
334    is(CFGetRetainCount(identity), 1, "identity rc = 1");
335    is(CFGetRetainCount(cert), 1, "cert rc = 1");
336    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
337    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
338
339    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLCreateContext");
340    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
341    CFReleaseSafe(ctx);
342
343    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
344    is(CFGetRetainCount(identity), 1, "identity rc = 1");
345    is(CFGetRetainCount(cert), 1, "cert rc = 1");
346    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
347    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
348
349    ok(ctx=SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType), "SSLCreateContext");
350    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
351    ok_status(SSLSetCertificate(ctx, trust_chain), "SSLSetCertificate");
352    CFReleaseSafe(ctx);
353
354    is(CFGetRetainCount(trust_chain), 1, "trust_chain rc = 1");
355    is(CFGetRetainCount(identity), 1, "identity rc = 1");
356    is(CFGetRetainCount(cert), 1, "cert rc = 1");
357    is(CFGetRetainCount(cert2), 1, "cert2 rc = 1");
358    is(CFGetRetainCount(privKey), 1, "privKey rc = 1");
359
360    CFReleaseNull(trust_chain);
361}
362
363int ssl_41_clientauth(int argc, char *const *argv)
364{
365    plan_tests(32);
366
367
368    tests();
369
370    return 0;
371}
372