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