test_crl.c (8180B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 /* 5 * test_crl.c 6 * 7 * Test CRL Type 8 * 9 */ 10 11 #include "testutil.h" 12 #include "testutil_nss.h" 13 14 static void *plContext = NULL; 15 16 static void 17 createCRLs( 18 char *dataDir, 19 char *goodInput, 20 char *diffInput, 21 PKIX_PL_CRL **goodObject, 22 PKIX_PL_CRL **equalObject, 23 PKIX_PL_CRL **diffObject) 24 { 25 PKIX_TEST_STD_VARS(); 26 27 subTest("PKIX_PL_CRL_Create <goodObject>"); 28 *goodObject = createCRL(dataDir, goodInput, plContext); 29 30 subTest("PKIX_PL_CRL_Create <equalObject>"); 31 *equalObject = createCRL(dataDir, goodInput, plContext); 32 33 subTest("PKIX_PL_CRL_Create <diffObject>"); 34 *diffObject = createCRL(dataDir, diffInput, plContext); 35 36 PKIX_TEST_RETURN(); 37 } 38 39 static void 40 testGetCRLEntryForSerialNumber( 41 PKIX_PL_CRL *goodObject) 42 { 43 PKIX_PL_BigInt *bigInt; 44 PKIX_PL_String *bigIntString = NULL; 45 PKIX_PL_CRLEntry *crlEntry = NULL; 46 PKIX_PL_String *crlEntryString = NULL; 47 char *snAscii = "3039"; 48 char *expectedAscii = 49 "\n\t[\n" 50 "\tSerialNumber: 3039\n" 51 "\tReasonCode: 257\n" 52 "\tRevocationDate: Fri Jan 07, 2005\n" 53 /* "\tRevocationDate: Fri Jan 07 15:09:10 2005\n" */ 54 "\tCritExtOIDs: (EMPTY)\n" 55 "\t]\n\t"; 56 57 PKIX_TEST_STD_VARS(); 58 59 subTest("PKIX_PL_CRL_GetCRLEntryForSerialNumber"); 60 61 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create( 62 PKIX_ESCASCII, 63 snAscii, 64 PL_strlen(snAscii), 65 &bigIntString, 66 plContext)); 67 68 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_BigInt_Create( 69 bigIntString, 70 &bigInt, 71 plContext)); 72 73 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_GetCRLEntryForSerialNumber( 74 goodObject, bigInt, &crlEntry, plContext)); 75 76 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString( 77 (PKIX_PL_Object *)crlEntry, 78 &crlEntryString, 79 plContext)); 80 81 testToStringHelper((PKIX_PL_Object *)crlEntryString, 82 expectedAscii, plContext); 83 84 cleanup: 85 86 PKIX_TEST_DECREF_AC(bigIntString); 87 PKIX_TEST_DECREF_AC(bigInt); 88 PKIX_TEST_DECREF_AC(crlEntryString); 89 PKIX_TEST_DECREF_AC(crlEntry); 90 PKIX_TEST_RETURN(); 91 } 92 93 static void 94 testGetIssuer( 95 PKIX_PL_CRL *goodObject, 96 PKIX_PL_CRL *equalObject, 97 PKIX_PL_CRL *diffObject) 98 { 99 PKIX_PL_X500Name *goodIssuer = NULL; 100 PKIX_PL_X500Name *equalIssuer = NULL; 101 PKIX_PL_X500Name *diffIssuer = NULL; 102 char *expectedAscii = "CN=hanfeiyu,O=sun,C=us"; 103 104 PKIX_TEST_STD_VARS(); 105 106 subTest("PKIX_PL_CRL_GetIssuer"); 107 108 PKIX_TEST_EXPECT_NO_ERROR( 109 PKIX_PL_CRL_GetIssuer(goodObject, &goodIssuer, plContext)); 110 111 PKIX_TEST_EXPECT_NO_ERROR( 112 PKIX_PL_CRL_GetIssuer(equalObject, &equalIssuer, plContext)); 113 114 PKIX_TEST_EXPECT_NO_ERROR( 115 PKIX_PL_CRL_GetIssuer(diffObject, &diffIssuer, plContext)); 116 117 PKIX_TEST_EQ_HASH_TOSTR_DUP(goodIssuer, 118 equalIssuer, 119 diffIssuer, 120 expectedAscii, 121 X500Name, 122 PKIX_TRUE); 123 124 cleanup: 125 126 PKIX_TEST_DECREF_AC(goodIssuer); 127 PKIX_TEST_DECREF_AC(equalIssuer); 128 PKIX_TEST_DECREF_AC(diffIssuer); 129 130 PKIX_TEST_RETURN(); 131 } 132 133 static void 134 testCritExtensionsAbsent(PKIX_PL_CRL *crl) 135 { 136 PKIX_List *oidList = NULL; 137 PKIX_UInt32 numOids = 0; 138 139 PKIX_TEST_STD_VARS(); 140 141 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_GetCriticalExtensionOIDs(crl, &oidList, plContext)); 142 143 PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetLength(oidList, &numOids, plContext)); 144 if (numOids != 0) { 145 pkixTestErrorMsg = "unexpected mismatch"; 146 } 147 148 cleanup: 149 150 PKIX_TEST_DECREF_AC(oidList); 151 152 PKIX_TEST_RETURN(); 153 } 154 155 static void 156 testGetCriticalExtensionOIDs(PKIX_PL_CRL *goodObject) 157 { 158 subTest("PKIX_PL_CRL_GetCriticalExtensionOIDs " 159 "<0 element>"); 160 testCritExtensionsAbsent(goodObject); 161 } 162 163 static void 164 testVerifySignature(char *dataCentralDir, PKIX_PL_CRL *crl) 165 { 166 PKIX_PL_Cert *firstCert = NULL; 167 PKIX_PL_Cert *secondCert = NULL; 168 PKIX_PL_PublicKey *firstPubKey = NULL; 169 PKIX_PL_PublicKey *secondPubKey = NULL; 170 171 PKIX_TEST_STD_VARS(); 172 173 subTest("PKIX_PL_Cert_Create <hanfeiyu2hanfeiyu>"); 174 firstCert = createCert(dataCentralDir, "hanfeiyu2hanfeiyu", plContext); 175 176 subTest("PKIX_PL_Cert_Create <hy2hy-bc0>"); 177 secondCert = createCert(dataCentralDir, "hy2hy-bc0", plContext); 178 179 subTest("PKIX_PL_Cert_GetSubjectPublicKey <hanfeiyu2hanfeiyu>"); 180 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetSubjectPublicKey(firstCert, &firstPubKey, plContext)); 181 182 subTest("PKIX_PL_Cert_GetSubjectPublicKey <hanfei2hanfei>"); 183 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetSubjectPublicKey(secondCert, &secondPubKey, plContext)); 184 185 subTest("PKIX_PL_CRL_VerifySignature <positive>"); 186 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_VerifySignature(crl, firstPubKey, plContext)); 187 188 subTest("PKIX_PL_CRL_VerifySignature <negative>"); 189 PKIX_TEST_EXPECT_ERROR(PKIX_PL_CRL_VerifySignature(crl, secondPubKey, plContext)); 190 191 cleanup: 192 193 PKIX_TEST_DECREF_AC(firstCert); 194 PKIX_TEST_DECREF_AC(secondCert); 195 PKIX_TEST_DECREF_AC(firstPubKey); 196 PKIX_TEST_DECREF_AC(secondPubKey); 197 198 PKIX_TEST_RETURN(); 199 } 200 201 static void 202 printUsage(void) 203 { 204 (void)printf("\nUSAGE:\ttest_crl <test-purpose> <data-central-dir>\n\n"); 205 } 206 207 /* Functional tests for CRL public functions */ 208 209 int 210 test_crl(int argc, char *argv[]) 211 { 212 PKIX_PL_CRL *goodObject = NULL; 213 PKIX_PL_CRL *equalObject = NULL; 214 PKIX_PL_CRL *diffObject = NULL; 215 PKIX_UInt32 actualMinorVersion; 216 PKIX_UInt32 j = 0; 217 218 char *dataCentralDir = NULL; 219 char *goodInput = "crlgood.crl"; 220 char *diffInput = "crldiff.crl"; 221 char *expectedAscii = 222 "[\n" 223 "\tVersion: v2\n" 224 "\tIssuer: CN=hanfeiyu,O=sun,C=us\n" 225 "\tUpdate: [Last: Fri Jan 07, 2005\n" 226 /* "\tUpdate: [Last: Fri Jan 07 15:09:10 2005\n" */ 227 "\t Next: Sat Jan 07, 2006]\n" 228 /* "\t Next: Sat Jan 07 15:09:10 2006]\n" */ 229 "\tSignatureAlgId: 1.2.840.10040.4.3\n" 230 "\tCRL Number : (null)\n" 231 "\n\tEntry List: (\n" 232 "\t[\n" 233 "\tSerialNumber: 010932\n" 234 "\tReasonCode: 260\n" 235 "\tRevocationDate: Fri Jan 07, 2005\n" 236 /* "\tRevocationDate: Fri Jan 07 15:09:10 2005\n" */ 237 "\tCritExtOIDs: (EMPTY)\n" 238 "\t]\n\t" 239 ", " 240 "\n\t[\n" 241 "\tSerialNumber: 3039\n" 242 "\tReasonCode: 257\n" 243 "\tRevocationDate: Fri Jan 07, 2005\n" 244 /* "\tRevocationDate: Fri Jan 07 15:09:10 2005\n" */ 245 "\tCritExtOIDs: (EMPTY)\n" 246 "\t]\n\t" 247 ")" 248 "\n\n" 249 "\tCritExtOIDs: (EMPTY)\n" 250 "]\n"; 251 /* Note XXX serialnumber and reasoncode need debug */ 252 253 PKIX_TEST_STD_VARS(); 254 255 startTests("CRL"); 256 257 PKIX_TEST_EXPECT_NO_ERROR( 258 PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext)); 259 260 if (argc < 3 + j) { 261 printUsage(); 262 return (0); 263 } 264 265 dataCentralDir = argv[2 + j]; 266 267 createCRLs(dataCentralDir, 268 goodInput, 269 diffInput, 270 &goodObject, 271 &equalObject, 272 &diffObject); 273 274 PKIX_TEST_EQ_HASH_TOSTR_DUP(goodObject, 275 equalObject, 276 diffObject, 277 expectedAscii, 278 CRL, 279 PKIX_TRUE); 280 281 testGetIssuer(goodObject, equalObject, diffObject); 282 283 testGetCriticalExtensionOIDs(goodObject); 284 285 testGetCRLEntryForSerialNumber(goodObject); 286 287 testVerifySignature(dataCentralDir, goodObject); 288 289 cleanup: 290 291 PKIX_TEST_DECREF_AC(goodObject); 292 PKIX_TEST_DECREF_AC(equalObject); 293 PKIX_TEST_DECREF_AC(diffObject); 294 295 PKIX_Shutdown(plContext); 296 297 PKIX_TEST_RETURN(); 298 299 endTests("CRL"); 300 301 return (0); 302 }