--- /dev/null
+/*
+ * Copyright (c) 2003-2005 Apple Computer, Inc. All Rights Reserved.
+ *
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please
+ * obtain a copy of the License at http://www.apple.com/publicsource and
+ * read it before using this file.
+ *
+ * This Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ */
+
+/*
+ * CertParser.h - cert parser with autorelease of fetched fields
+ *
+ * Created 24 October 2003 by Doug Mitchell
+ */
+
+#ifndef _CERT_PARSER_H_
+#define _CERT_PARSER_H_
+
+#include <Security/Security.h>
+#include <vector>
+
+using std::vector;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * We store an vector<> of these as an "autorelease" pool of fetched fields.
+ */
+class CP_FetchedField;
+
+class CertParser
+{
+public:
+ /*
+ * Construct with or without data - you can add the data later with
+ * initWithData() to parse without exceptions
+ */
+
+ CertParser(); // must be used with initWithSecCert to get clHand
+ CertParser( // use with initWithData
+ CSSM_CL_HANDLE clHand);
+ CertParser(
+ CSSM_CL_HANDLE clHand,
+ const CSSM_DATA &certData);
+ CertParser(
+ SecCertificateRef secCert);
+
+ /* frees all the fields we fetched */
+ ~CertParser();
+
+ /*
+ * No cert- or CDSA-related exceptions thrown by remainder
+ */
+ CSSM_RETURN initWithData(
+ const CSSM_DATA &certData);
+ OSStatus initWithSecCert(
+ SecCertificateRef secCert);
+ CSSM_RETURN initWithCFData(
+ CFDataRef cfData);
+
+ /*
+ * Obtain atrbitrary field from cached cert. This class takes care of freeing
+ * the field in its destructor.
+ *
+ * Returns NULL if field not found (not exception).
+ *
+ * Caller optionally specifies field length to check - specifying zero means
+ * "don't care, don't check". Actual field length always returned in fieldLength.
+ */
+ const void *fieldForOid(
+ const CSSM_OID &oid,
+ CSSM_SIZE &fieldLength); // IN/OUT
+
+ /*
+ * Conveneince routine to fetch an extension we "know" the CL can parse.
+ * The return value gets cast to one of the CE_Data types.
+ */
+ const void *extensionForOid(
+ const CSSM_OID &oid);
+
+private:
+ void initFields();
+
+ CSSM_CL_HANDLE mClHand;
+ CSSM_HANDLE mCacheHand; // the parsed & cached cert
+ vector<CP_FetchedField *> mFetchedFields;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CERT_PARSER_H_ */
+