--- /dev/null
+/*
+ * tpUtils.h - TP and cert group test support
+ */
+
+#ifndef _TP_UTILS_H_
+#define _TP_UTILS_H_
+
+#include <Security/cssmtype.h>
+#include <Security/x509defs.h>
+#include <Security/cssmapple.h>
+#include <time.h>
+#include <MacTypes.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TP_DB_ENABLE 1
+
+/*
+ * Given an array of certs and an uninitialized CSSM_CERTGROUP, place the
+ * certs into the certgroup and optionally into one of a list of DBs in
+ * random order. Optionaly the first cert in the array is placed in the
+ * first element of certgroup. Only error is memory error. It's legal to
+ * pass in an empty cert array.
+ */
+CSSM_RETURN tpMakeRandCertGroup(
+ CSSM_CL_HANDLE clHand,
+ CSSM_DL_DB_LIST_PTR dbList,
+ const CSSM_DATA_PTR certs,
+ unsigned numCerts,
+ CSSM_CERTGROUP_PTR certGroup,
+ CSSM_BOOL firstCertIsSubject, // true: certs[0] goes to head
+ // of certGroup
+ CSSM_BOOL verbose,
+ CSSM_BOOL allInDbs, // all certs go to DBs
+ CSSM_BOOL skipFirstDb); // no certs go to db[0]
+
+CSSM_RETURN tpStoreCert(
+ CSSM_DL_DB_HANDLE dlDb,
+ const CSSM_DATA_PTR cert,
+ /* REQUIRED fields */
+ CSSM_CERT_TYPE certType, // e.g. CSSM_CERT_X_509v3
+ uint32 serialNum,
+ const CSSM_DATA *issuer, // (shouldn't this be subject?)
+ // normalized & encoded
+ /* OPTIONAL fields */
+ CSSM_CERT_ENCODING certEncoding, // e.g. CSSM_CERT_ENCODING_DER
+ const CSSM_DATA *printName,
+ const CSSM_DATA *subject); // normalized & encoded
+
+/*
+ * Store a cert when we don't already know the required fields. We'll
+ * extract them.
+ */
+CSSM_RETURN tpStoreRawCert(
+ CSSM_DL_DB_HANDLE dlDb,
+ CSSM_CL_HANDLE clHand,
+ const CSSM_DATA_PTR cert);
+
+/*
+ * Generate numKeyPairs key pairs of specified algorithm and size.
+ * Key labels will be 'keyLabelBase' concatenated with a 4-digit
+ * decimal number.
+ */
+CSSM_RETURN tpGenKeys(
+ CSSM_CSP_HANDLE cspHand,
+ CSSM_DL_DB_HANDLE dbHand, /* keys go here */
+ unsigned numKeyPairs,
+ uint32 keyGenAlg, /* CSSM_ALGID_RSA, etc. */
+ uint32 keySizeInBits,
+ const char *keyLabelBase, /* C string */
+ CSSM_KEY_PTR pubKeys, /* array of keys RETURNED here */
+ CSSM_KEY_PTR privKeys, /* array of keys RETURNED here */
+ CSSM_DATA_PTR paramData = NULL); // optional DSA params
+
+/*
+ * Generate a cert chain using specified key pairs. The last cert in the
+ * chain (certs[numCerts-1]) is a root cert, self-signed.
+ */
+CSSM_RETURN tpGenCerts(
+ CSSM_CSP_HANDLE cspHand,
+ CSSM_CL_HANDLE clHand,
+ unsigned numCerts,
+ uint32 sigAlg, /* CSSM_ALGID_SHA1WithRSA, etc. */
+ const char *nameBase, /* C string */
+ CSSM_KEY_PTR pubKeys, /* array of public keys */
+ CSSM_KEY_PTR privKeys, /* array of private keys */
+ CSSM_DATA_PTR certs, /* array of certs RETURNED here */
+ const char *notBeforeStr, /* from genTimeAtNowPlus() */
+ const char *notAfterStr); /* from genTimeAtNowPlus() */
+
+/*
+ * Generate a cert chain using specified key pairs. The last cert in the
+ * chain (certs[numCerts-1]) is a root cert, self-signed. Store
+ * the certs indicated by corresponding element on storeArray. If
+ * storeArray[n].DLHandle == 0, the cert is not stored.
+ */
+CSSM_RETURN tpGenCertsStore(
+ CSSM_CSP_HANDLE cspHand,
+ CSSM_CL_HANDLE clHand,
+ unsigned numCerts,
+ uint32 sigAlg, /* CSSM_ALGID_SHA1WithRSA, etc. */
+ const char *nameBase, /* C string */
+ CSSM_KEY_PTR pubKeys, /* array of public keys */
+ CSSM_KEY_PTR privKeys, /* array of private keys */
+ CSSM_DL_DB_HANDLE *storeArray, /* array of certs stored here */
+ CSSM_DATA_PTR certs, /* array of certs RETURNED here */
+ const char *notBeforeStr, /* from genTimeAtNowPlus() */
+ const char *notAfterStr); /* from genTimeAtNowPlus() */
+
+/* free a CSSM_CERT_GROUP */
+void tpFreeCertGroup(
+ CSSM_CERTGROUP_PTR certGroup,
+ CSSM_BOOL freeCertData, // free individual CertList.Data
+ CSSM_BOOL freeStruct); // free the overall CSSM_CERTGROUP
+
+CSSM_BOOL tpCompareCertGroups(
+ const CSSM_CERTGROUP *grp1,
+ const CSSM_CERTGROUP *grp2);
+
+CSSM_RETURN clDeleteAllCerts(CSSM_DL_DB_HANDLE dlDb);
+
+/*
+ * Wrapper for CSSM_TP_CertGroupVerify.
+ */
+CSSM_RETURN tpCertGroupVerify(
+ CSSM_TP_HANDLE tpHand,
+ CSSM_CL_HANDLE clHand,
+ CSSM_CSP_HANDLE cspHand,
+ CSSM_DL_DB_LIST_PTR dbListPtr,
+ const CSSM_OID *policy, // optional
+ const CSSM_DATA *fieldOpts, // optional
+ const CSSM_DATA *actionData, // optional
+ void *policyOpts,
+ const CSSM_CERTGROUP *certGroup,
+ CSSM_DATA_PTR anchorCerts,
+ unsigned numAnchorCerts,
+ CSSM_TP_STOP_ON stopOn, // CSSM_TP_STOP_ON_POLICY, etc.
+ CSSM_TIMESTRING cssmTimeStr,// optional
+ CSSM_TP_VERIFY_CONTEXT_RESULT_PTR result); // RETURNED
+
+CSSM_RETURN tpKcOpen(
+ CSSM_DL_HANDLE dlHand,
+ const char *kcName,
+ const char *pwd, // optional to avoid UI
+ CSSM_BOOL doCreate,
+ CSSM_DB_HANDLE *dbHand); // RETURNED
+
+CSSM_RETURN freeVfyResult(
+ CSSM_TP_VERIFY_CONTEXT_RESULT *ctx);
+
+void printCertInfo(
+ unsigned numCerts, // from CertGroup
+ const CSSM_TP_APPLE_EVIDENCE_INFO *info);
+
+void dumpVfyResult(
+ const CSSM_TP_VERIFY_CONTEXT_RESULT *vfyResult);
+
+/*
+ * Obtain system anchors in CF and in CSSM_DATA form.
+ * Caller must CFRelease the returned rootArray and
+ * free() the returned CSSM_DATA array, but not its
+ * contents - SecCertificates themselves own that.
+ */
+OSStatus getSystemAnchors(
+ CFArrayRef *rootArray, /* RETURNED */
+ CSSM_DATA **anchors, /* RETURNED */
+ unsigned *numAnchors); /* RETURNED */
+
+/* get a SecCertificateRef from a file */
+SecCertificateRef certFromFile(
+ const char *fileName);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _TP_UTILS_H_ */
+