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