CertParser.h   [plain text]


/*
 * 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_ */