X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/b04fe171f0375ecd5d8a24747ca1dff85720a0ca..6b200bc335dc93c5516ccb52f14bd896d8c7fad7:/SecurityTests/clxutils/cgVerify/cgVerify.cpp diff --git a/SecurityTests/clxutils/cgVerify/cgVerify.cpp b/SecurityTests/clxutils/cgVerify/cgVerify.cpp deleted file mode 100644 index 8d6e3e5e..00000000 --- a/SecurityTests/clxutils/cgVerify/cgVerify.cpp +++ /dev/null @@ -1,724 +0,0 @@ -/* - * cgVerify.cpp - basic test of TP's CertGroupVerify - * - * cook up array of n key pairs; - * cook up cert chain to go with them; - * main test loop { - * numCerts = total # of incoming certs; - * test one of four or five "expected result" cases { - * case root in certGroup but not found in AnchorCerts: - * certGroup = tpMakeRandCertGroup(certs[0..numCerts-1]; - * anchorCerts = tpMakeRandCertGroup[certs[0...numCerts-2]; - * expErr = CSSMERR_TP_INVALID_ANCHOR_CERT; - * expEvidenceSize = numCerts; - * case root in certGroup, found a copy in AnchorCerts: - * certGroup = tpMakeRandCertGroup(certs[0..numCerts-1]; - * anchorCerts = tpMakeRandCertGroup[certs[0...numCerts-1]; - * expErr = CSSM_OK; - * expEvidenceSize = numCerts; - * case verified by an AnchorCert: - * n = rand(1, numCerts-2); - * certGroup = tpMakeRandCertGroup(certs[0..n]); - * anchorCerts = tpMakeRandCertGroup[certs[0...numCerts-2]; - * expErr = CSSM_OK; - * expEvidenceSize = n+2; - * case no root found: - * n = rand(1, numCerts-3); - * certGroup = tpMakeRandCertGroup(certs[0..n]); - * anchorCerts = tpMakeRandCertGroup[certs[n+2...numCerts-2]; - * anchorCerts may be empty.... - * expErr = CSSMERR_TP_NOT_TRUSTED; - * expEvidenceSize = n+1; - * case incomplete public key (DSA only): - * root public keys is incomplete; - * certGroup = tpMakeRandCertGroup(certs[0..numCerts-1]; - * anchorCerts = tpMakeRandCertGroup[certs[0...numCerts-1]; - * expErr = CSSM_OK; - * expEvidenceSize = numCerts; - * } - * result = certGroupVerify(); - * verify expected result and getError(); - * delete certs from DB; - * } - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NUM_CERTS_DEF 10 -#define KEYGEN_ALG_DEF CSSM_ALGID_RSA -#define SIG_ALG_DEF CSSM_ALGID_SHA1WithRSA -#define LOOPS_DEF 10 -#define SECONDS_TO_LIVE (60 * 60 * 24) /* certs are valid for this long */ -//#define SECONDS_TO_LIVE 5 - -#define CERT_IN_DB 1 -#define DB_NAME "cgVerify.db" -#define DSA_PARAM_FILE "dsaParam512.der" - -/* - * How we define the "expected result". - */ -typedef enum { - ER_InvalidAnchor, // root in certGroup, not found in AnchorCerts - ER_RootInCertGroup, // root in certGroup, copy in AnchorCerts - ER_AnchorVerify, // end of chain verified by an anchor - ER_NoRoot, // no root, no anchor verify - ER_IncompleteKey // un-completable public key (all keys are partial), DSA - // ONLY -} ExpectResult; - -static void usage(char **argv) -{ - printf("Usage: %s [options]\n", argv[0]); - printf(" Options:\n"); - printf(" n=numCerts; default = %d\n", NUM_CERTS_DEF); - printf(" l=loops; default=%d; 0=forever\n", LOOPS_DEF); - printf(" a=alg (f=FEE/MD5, F=FEE/SHA1, e=FEE/ECDSA, s=RSA/SHA1, m=RSA/MD5,\n"); - printf(" d=DSA, 4=RSA/SHA224, 6=RSA/SHA256, 3=RSA/SHA384, 5=RSA/SHA512,\n"); - printf(" E=ANSI/ECDSA, 7=ECDSA/SHA256; default = RSA/SHA1\n"); - printf(" k=keySizeInBits\n"); - printf(" d(isable DB)\n"); - printf(" P(ause on each loop)\n"); - printf(" N (no partial pub keys)\n"); - printf(" v(erbose)\n"); - printf(" q(uiet)\n"); - printf(" h(elp)\n"); - exit(1); -} - -static int doTest( - CSSM_TP_HANDLE tpHand, - CSSM_CL_HANDLE clHand, - CSSM_CSP_HANDLE cspHand, - CSSM_DL_DB_HANDLE dlDb, - CSSM_DATA_PTR certs, - unsigned numCerts, - CSSM_KEY_PTR pubKeys, // for partial key detect - CSSM_BOOL useDb, - ExpectResult expectResult, - CSSM_BOOL verbose, - CSSM_BOOL quiet) -{ - unsigned cgEnd; // last cert in certGroupFrag - unsigned anchorStart; // first cert in anchorGroup - unsigned anchorEnd; // last cert in anchorGroup - CSSM_CERTGROUP certGroupFrag; // INPUT to CertGroupVerify - CSSM_CERTGROUP anchorCerts; // ditto - unsigned die; // random number - CSSM_DL_DB_LIST dbList; - CSSM_DL_DB_LIST_PTR dbListPtr; - CSSM_RETURN expErr; // expected rtn from GroupVfy() - int rtn = 0; - const char *expResStr; - uint32 expEvidenceSize; // expected evidenceSize - unsigned evidenceSize; // actual evidence size - CSSM_TP_VERIFY_CONTEXT_RESULT vfyResult; - CSSM_CERTGROUP_PTR outGrp = NULL; - CSSM_RETURN crtn; - CSSM_DL_DB_HANDLE_PTR dlDbPtr; - unsigned numAnchors; - - memset(&vfyResult, 0, sizeof(CSSM_TP_VERIFY_CONTEXT_RESULT)); - - if(useDb) { - dlDbPtr = &dlDb; - dbList.NumHandles = 1; - dbList.DLDBHandle = &dlDb; - dbListPtr = &dbList; - } - else { - /* not yet */ - dlDbPtr = NULL; - dbListPtr = NULL; - } - - /* the four test cases */ - switch(expectResult) { - case ER_InvalidAnchor: - /* root in certGroup, not found in AnchorCerts */ - cgEnd = numCerts - 1; // certGroupFrag is the whole pile - anchorStart = 0; // anchors = all except root - anchorEnd = numCerts - 2; - expErr = CSSMERR_TP_INVALID_ANCHOR_CERT; - expEvidenceSize = numCerts; - expResStr = "InvalidAnchor (root in certGroup but not in anchors)"; - break; - - case ER_RootInCertGroup: - /* root in certGroup, copy in AnchorCerts */ - cgEnd = numCerts - 1; // certGroupFrag = the whole pile - anchorStart = 0; // anchors = the whole pile - anchorEnd = numCerts - 1; - expErr = CSSM_OK; - expEvidenceSize = numCerts; - expResStr = "Good (root in certGroup AND in anchors)"; - break; - - case ER_AnchorVerify: - /* non-root end of chain verified by an anchor */ - /* break chain at random place other than end */ - /* die is the last cert in certGroupFrag */ - die = genRand(0, numCerts-2); - cgEnd = die; // certGroupFrag up to break point - anchorStart = 0; // anchors = all - anchorEnd = numCerts - 1; - if(pubKeys[die+1].KeyHeader.KeyAttr & CSSM_KEYATTR_PARTIAL) { - /* this will fail due to an unusable anchor */ - expErr = CSSMERR_TP_CERTIFICATE_CANT_OPERATE; - expResStr = "Root ONLY in anchors but has partial pub key"; - } - else { - expErr = CSSM_OK; - expResStr = "Good (root ONLY in anchors)"; - } - /* size = # certs in certGroupFrag, plus one anchor */ - expEvidenceSize = die + 2; - break; - - case ER_NoRoot: - /* no root, no anchor verify */ - /* break chain at random place other than end */ - /* die is the last cert in certGroupFrag */ - /* skip a cert, then anchors start at die + 2 */ - die = genRand(0, numCerts-2); - cgEnd = die; // certGroupFrag up to break point - anchorStart = die + 2; // anchors = n+1...numCerts-2 - // may be empty if n == numCerts-2 - anchorEnd = numCerts - 2; - if((die != 0) && // partial leaf not reported as partial! - (pubKeys[die].KeyHeader.KeyAttr & CSSM_KEYATTR_PARTIAL)) { - /* this will fail due to an unusable cert (this one) */ - expErr = CSSMERR_TP_CERTIFICATE_CANT_OPERATE; - expResStr = "Not Trusted (no root, no anchor verify), partial"; - } - else { - expErr = CSSMERR_TP_NOT_TRUSTED; - expResStr = "Not Trusted (no root, no anchor verify)"; - } - expEvidenceSize = die + 1; - break; - - case ER_IncompleteKey: - /* - * Anchor has incomplete pub key - * Root in certGroup, copy in AnchorCerts - * Avoid putting anchor in certGroupFrag because the TP will think - * it's NOT a root and it'll show up twice in the evidence - once - * from certGroupFrag (at which point the search for a root - * keeps going), and once from Anchors. - */ - cgEnd = numCerts - 2; // certGroupFrag = the whole pile less the anchor - anchorStart = 0; // anchors = the whole pile - anchorEnd = numCerts - 1; - expErr = CSSMERR_TP_CERTIFICATE_CANT_OPERATE; - expEvidenceSize = numCerts; - expResStr = "Partial public key in anchor"; - break; - } - - if(verbose) { - printf(" ...expectResult = %s\n", expResStr); - } - - /* cook up two cert groups */ - if(verbose) { - printf(" ...building certGroupFrag from certs[0..%d]\n", - cgEnd); - } - if(tpMakeRandCertGroup(clHand, - dbListPtr, - certs, // certGroupFrag always starts at 0 - cgEnd+1, // # of certs - &certGroupFrag, - CSSM_TRUE, // firstCertIsSubject - verbose, - CSSM_FALSE, // allInDbs - CSSM_FALSE)) { // skipFirstDb - printf("Error in tpMakeRandCertGroup\n"); - return 1; - } - - if(verbose) { - printf(" ...building anchorCerts from certs[%d..%d]\n", - anchorStart, anchorEnd); - } - if(anchorEnd > (numCerts - 1)) { - printf("anchorEnd overflow\n"); - exit(1); - } - if(anchorStart >= anchorEnd) { - /* legal in some corner cases, ==> empty enchors */ - numAnchors = 0; - } - else { - numAnchors = anchorEnd - anchorStart + 1; - } - /* anchors do not go in DB */ - if(tpMakeRandCertGroup(clHand, - NULL, - certs + anchorStart, - numAnchors, // # of certs - &anchorCerts, - CSSM_FALSE, // firstCertIsSubject - verbose, - CSSM_FALSE, // allInDbs - CSSM_FALSE)) { // skipFirstDb - printf("Error in tpMakeRandCertGroup\n"); - return 1; - } - - crtn = tpCertGroupVerify( - tpHand, - clHand, - cspHand, - dbListPtr, - &CSSMOID_APPLE_X509_BASIC, // policy - NULL, // fieldOpts - NULL, // actionData - NULL, // policyOpts - &certGroupFrag, - anchorCerts.GroupList.CertList, // passed as CSSM_DATA_PTR, not CERTGROUP.... - anchorCerts.NumCerts, - CSSM_TP_STOP_ON_POLICY, - NULL, // cssmTimeStr - &vfyResult); - - /* first verify format of result */ - if( (vfyResult.NumberOfEvidences != 3) || - (vfyResult.Evidence == NULL) || - (vfyResult.Evidence[0].EvidenceForm != CSSM_EVIDENCE_FORM_APPLE_HEADER) || - (vfyResult.Evidence[1].EvidenceForm != CSSM_EVIDENCE_FORM_APPLE_CERTGROUP) || - (vfyResult.Evidence[2].EvidenceForm != CSSM_EVIDENCE_FORM_APPLE_CERT_INFO) || - (vfyResult.Evidence[0].Evidence == NULL) || - (vfyResult.Evidence[1].Evidence == NULL) || - (vfyResult.Evidence[2].Evidence == NULL)) { - printf("***Malformed VerifyContextResult\n"); - rtn = testError(quiet); - if(rtn) { - return rtn; - } - } - if((vfyResult.Evidence != NULL) && (vfyResult.Evidence[1].Evidence != NULL)) { - outGrp = (CSSM_CERTGROUP_PTR)vfyResult.Evidence[1].Evidence; - evidenceSize = outGrp->NumCerts; - } - else { - /* in case no evidence returned */ - evidenceSize = 0; - } - - /* %%% since non-root anchors are permitted as of , - * the test assumptions have become invalid: these tests generate - * an anchors list which always includes the full chain, so by - * definition, the evidence chain will never be longer than 2, - * since the leaf's issuer is always an anchor. - * %%% need to revisit and rewrite these tests. -kcm - */ - if ((evidenceSize > 1) && (evidenceSize < expEvidenceSize) && - (crtn == CSSM_OK || crtn == CSSMERR_TP_CERTIFICATE_CANT_OPERATE)) { - /* ignore, for now */ - expErr = crtn; - expEvidenceSize = evidenceSize; - } - - if((crtn != expErr) || - (evidenceSize != expEvidenceSize)) { - printf("***Error on expectResult %s\n", expResStr); - printf(" err %s expErr %s\n", - cssmErrToStr(crtn), cssmErrToStr(expErr)); - printf(" evidenceSize %d expEvidenceSize %u\n", - evidenceSize, (unsigned)expEvidenceSize); - rtn = testError(quiet); - } - else { - rtn = 0; - } - - /* free resources */ - tpFreeCertGroup(&certGroupFrag, - CSSM_FALSE, // caller malloc'd the actual certs - CSSM_FALSE); // struct is on stack - tpFreeCertGroup(&anchorCerts, - CSSM_FALSE, // caller malloc'd the actual certs - CSSM_FALSE); // struct is on stack - freeVfyResult(&vfyResult); - if(useDb) { - clDeleteAllCerts(dlDb); - } - return rtn; -} - -int main(int argc, char **argv) -{ - int arg; - char *argp; - unsigned loop; - CSSM_TP_HANDLE tpHand = 0; - CSSM_CL_HANDLE clHand = 0; - CSSM_CSP_HANDLE cspHand = 0; - CSSM_DL_DB_HANDLE dlDbHand = {0, 0}; - ExpectResult expectResult; - char *notAfterStr; - char *notBeforeStr; - unsigned i; - CSSM_DATA paramData; - CSSM_DATA_PTR paramDataP = NULL; - unsigned numTests = 4; - unsigned len; - - /* all three of these are arrays with numCert elements */ - CSSM_KEY_PTR pubKeys = NULL; - CSSM_KEY_PTR privKeys = NULL; - CSSM_DATA_PTR certs = NULL; - - /* Keys do NOT go in the cert DB */ - CSSM_DL_DB_HANDLE keyDb = {0, 0}; - CSSM_KEY savedRoot; // for ER_IncompleteKey - - /* - * User-spec'd params - */ - unsigned loops = LOOPS_DEF; - CSSM_BOOL verbose = CSSM_FALSE; - CSSM_BOOL quiet = CSSM_FALSE; - unsigned numCerts = NUM_CERTS_DEF; - uint32 keyGenAlg = KEYGEN_ALG_DEF; - uint32 sigAlg = SIG_ALG_DEF; - #if CERT_IN_DB - CSSM_BOOL useDb = CSSM_TRUE; - #else - CSSM_BOOL useDb = CSSM_FALSE; - #endif - CSSM_BOOL doPause = CSSM_FALSE; - uint32 keySizeInBits = CSP_KEY_SIZE_DEFAULT; - CSSM_BOOL noPartialKeys = CSSM_FALSE; - char dbName[100]; /* DB_NAME_pid */ - - for(arg=1; arg