test_httpcertstore.c (9800B)
1 /* 2 * test_httpcertstore.c 3 * 4 * Test Httpcertstore Type 5 * 6 * Copyright 2004-2005 Sun Microsystems, Inc. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * 1. Redistribution of source code must retain the above copyright notice, 12 * this list of conditions and the following disclaimer. 13 * 14 * 2. Redistribution in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * Neither the name of Sun Microsystems, Inc. or the names of contributors may 19 * be used to endorse or promote products derived from this software without 20 * specific prior written permission. 21 * 22 * This software is provided "AS IS," without a warranty of any kind. ALL 23 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING 24 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 25 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") 26 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE 27 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS 28 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST 29 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 30 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 31 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 32 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 33 * 34 * You acknowledge that this software is not designed or intended for use in 35 * the design, construction, operation or maintenance of any nuclear facility. 36 */ 37 38 #include "testutil.h" 39 #include "testutil_nss.h" 40 #include "pkix_pl_common.h" 41 42 static void *plContext = NULL; 43 44 static void 45 printUsage(char *testname) 46 { 47 char *fmt = 48 "USAGE: %s [-arenas] certDir certName\n"; 49 printf(fmt, "test_httpcertstore"); 50 } 51 52 /* Functional tests for Socket public functions */ 53 static void 54 do_other_work(void) 55 { /* while waiting for nonblocking I/O to complete */ 56 (void)PR_Sleep(2 * 60); 57 } 58 59 PKIX_Error * 60 PKIX_PL_HttpCertStore_Create( 61 PKIX_PL_HttpClient *client, /* if NULL, use default Client */ 62 PKIX_PL_GeneralName *location, 63 PKIX_CertStore **pCertStore, 64 void *plContext); 65 66 PKIX_Error * 67 pkix_pl_HttpCertStore_CreateWithAsciiName( 68 PKIX_PL_HttpClient *client, /* if NULL, use default Client */ 69 char *location, 70 PKIX_CertStore **pCertStore, 71 void *plContext); 72 73 static PKIX_Error * 74 getLocation( 75 PKIX_PL_Cert *certWithAia, 76 PKIX_PL_GeneralName **pLocation, 77 void *plContext) 78 { 79 PKIX_List *aiaList = NULL; 80 PKIX_UInt32 size = 0; 81 PKIX_PL_InfoAccess *aia = NULL; 82 PKIX_UInt32 iaType = PKIX_INFOACCESS_LOCATION_UNKNOWN; 83 PKIX_PL_GeneralName *location = NULL; 84 85 PKIX_TEST_STD_VARS(); 86 87 subTest("Getting Authority Info Access"); 88 89 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetAuthorityInfoAccess(certWithAia, &aiaList, plContext)); 90 91 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetLength(aiaList, &size, plContext)); 92 93 if (size != 1) { 94 pkixTestErrorMsg = "unexpected number of AIA"; 95 goto cleanup; 96 } 97 98 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(aiaList, 0, (PKIX_PL_Object **)&aia, plContext)); 99 100 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_InfoAccess_GetLocationType(aia, &iaType, plContext)); 101 102 if (iaType != PKIX_INFOACCESS_LOCATION_HTTP) { 103 pkixTestErrorMsg = "unexpected location type in AIA"; 104 goto cleanup; 105 } 106 107 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_InfoAccess_GetLocation(aia, &location, plContext)); 108 109 *pLocation = location; 110 111 cleanup: 112 PKIX_TEST_DECREF_AC(aiaList); 113 PKIX_TEST_DECREF_AC(aia); 114 115 PKIX_TEST_RETURN(); 116 117 return (NULL); 118 } 119 120 int 121 test_httpcertstore(int argc, char *argv[]) 122 { 123 124 PKIX_UInt32 i = 0; 125 PKIX_UInt32 numCerts = 0; 126 PKIX_UInt32 numCrls = 0; 127 int j = 0; 128 PKIX_UInt32 actualMinorVersion; 129 PKIX_UInt32 length = 0; 130 131 char *certName = NULL; 132 char *certDir = NULL; 133 PKIX_PL_Cert *cmdLineCert = NULL; 134 PKIX_PL_Cert *cert = NULL; 135 PKIX_CertSelector *certSelector = NULL; 136 PKIX_CertStore *certStore = NULL; 137 PKIX_CertStore *crlStore = NULL; 138 PKIX_PL_GeneralName *location = NULL; 139 PKIX_CertStore_CertCallback getCerts = NULL; 140 PKIX_List *certs = NULL; 141 char *asciiResult = NULL; 142 void *nbio = NULL; 143 144 PKIX_PL_CRL *crl = NULL; 145 PKIX_CRLSelector *crlSelector = NULL; 146 char *crlLocation = "http://betty.nist.gov/pathdiscoverytestsuite/CRL" 147 "files/BasicHTTPURIPeer2CACRL.crl"; 148 PKIX_CertStore_CRLCallback getCrls = NULL; 149 PKIX_List *crls = NULL; 150 PKIX_PL_String *crlString = NULL; 151 152 PKIX_TEST_STD_VARS(); 153 154 startTests("HttpCertStore"); 155 156 PKIX_TEST_EXPECT_NO_ERROR( 157 PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext)); 158 159 if (argc != (j + 3)) { 160 printUsage(argv[0]); 161 pkixTestErrorMsg = "Missing command line argument."; 162 goto cleanup; 163 } 164 165 certDir = argv[++j]; 166 certName = argv[++j]; 167 168 cmdLineCert = createCert(certDir, certName, plContext); 169 if (cmdLineCert == NULL) { 170 pkixTestErrorMsg = "Unable to create Cert"; 171 goto cleanup; 172 } 173 174 /* muster arguments to create HttpCertStore */ 175 PKIX_TEST_EXPECT_NO_ERROR(getLocation(cmdLineCert, &location, plContext)); 176 177 if (location == NULL) { 178 pkixTestErrorMsg = "Give me a cert with an HTTP URI!"; 179 goto cleanup; 180 } 181 182 /* create HttpCertStore */ 183 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_HttpCertStore_Create(NULL, location, &certStore, plContext)); 184 185 /* get the GetCerts callback */ 186 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CertStore_GetCertCallback(certStore, &getCerts, plContext)); 187 188 /* create a CertSelector */ 189 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CertSelector_Create(NULL, NULL, &certSelector, plContext)); 190 191 /* Get the certs */ 192 PKIX_TEST_EXPECT_NO_ERROR(getCerts(certStore, certSelector, &nbio, &certs, plContext)); 193 194 while (nbio != NULL) { 195 /* poll for a completion */ 196 197 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CertStore_CertContinue(certStore, certSelector, &nbio, &certs, plContext)); 198 } 199 200 if (certs) { 201 202 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetLength(certs, &numCerts, plContext)); 203 204 if (numCerts == 0) { 205 printf("HttpCertStore returned an empty Cert list\n"); 206 goto cleanup; 207 } 208 209 for (i = 0; i < numCerts; i++) { 210 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(certs, 211 i, 212 (PKIX_PL_Object **)&cert, 213 plContext)); 214 215 asciiResult = PKIX_Cert2ASCII(cert); 216 217 printf("CERT[%d]:\n%s\n", i, asciiResult); 218 219 /* PKIX_Cert2ASCII used PKIX_PL_Malloc(...,,NULL) */ 220 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(asciiResult, NULL)); 221 asciiResult = NULL; 222 223 PKIX_TEST_DECREF_BC(cert); 224 } 225 } else { 226 printf("HttpCertStore returned a NULL Cert list\n"); 227 } 228 229 /* create HttpCertStore */ 230 PKIX_TEST_EXPECT_NO_ERROR(pkix_pl_HttpCertStore_CreateWithAsciiName(NULL, crlLocation, &crlStore, plContext)); 231 232 /* get the GetCrls callback */ 233 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CertStore_GetCRLCallback(crlStore, &getCrls, plContext)); 234 235 /* create a CrlSelector */ 236 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CRLSelector_Create(NULL, NULL, &crlSelector, plContext)); 237 238 /* Get the crls */ 239 PKIX_TEST_EXPECT_NO_ERROR(getCrls(crlStore, crlSelector, &nbio, &crls, plContext)); 240 241 while (nbio != NULL) { 242 /* poll for a completion */ 243 244 PKIX_TEST_EXPECT_NO_ERROR(PKIX_CertStore_CrlContinue(crlStore, crlSelector, &nbio, &crls, plContext)); 245 } 246 247 if (crls) { 248 249 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetLength(crls, &numCrls, plContext)); 250 251 if (numCrls == 0) { 252 printf("HttpCertStore returned an empty CRL list\n"); 253 goto cleanup; 254 } 255 256 for (i = 0; i < numCrls; i++) { 257 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(crls, 258 i, 259 (PKIX_PL_Object **)&crl, 260 plContext)); 261 262 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString( 263 (PKIX_PL_Object *)crl, 264 &crlString, 265 plContext)); 266 267 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(crlString, 268 PKIX_ESCASCII, 269 (void **)&asciiResult, 270 &length, 271 plContext)); 272 273 printf("CRL[%d]:\n%s\n", i, asciiResult); 274 275 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(asciiResult, plContext)); 276 PKIX_TEST_DECREF_BC(crlString); 277 PKIX_TEST_DECREF_BC(crl); 278 } 279 } else { 280 printf("HttpCertStore returned a NULL CRL list\n"); 281 } 282 283 cleanup: 284 285 PKIX_TEST_DECREF_AC(cert); 286 PKIX_TEST_DECREF_AC(cmdLineCert); 287 PKIX_TEST_DECREF_AC(certStore); 288 PKIX_TEST_DECREF_AC(crlStore); 289 PKIX_TEST_DECREF_AC(location); 290 PKIX_TEST_DECREF_AC(certs); 291 PKIX_TEST_DECREF_AC(crl); 292 PKIX_TEST_DECREF_AC(crlString); 293 PKIX_TEST_DECREF_AC(crls); 294 295 PKIX_TEST_RETURN(); 296 297 endTests("HttpDefaultClient"); 298 299 return (0); 300 }