/* * Copyright (c) 2002-2004,2011,2014 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The 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. * * @APPLE_LICENSE_HEADER_END@ */ // // CertificateRequest.h // #ifndef _SECURITY_CERTIFICATEREQUEST_H_ #define _SECURITY_CERTIFICATEREQUEST_H_ #include #include #include "SecCFTypes.h" #include #include #include #include #include #include #define certReqDbg(args...) secdebug("certReq", ## args) namespace Security { namespace KeychainCore { class CertificateRequest : public SecCFObject { NOCOPY(CertificateRequest) public: SECCFFUNCTIONS(CertificateRequest, SecCertificateRequestRef, errSecInvalidItemRef, gTypes().CertificateRequest) CertificateRequest(const CSSM_OID &policy, CSSM_CERT_TYPE certificateType, CSSM_TP_AUTHORITY_REQUEST_TYPE requestType, SecKeyRef privateKeyItemRef, // optional SecKeyRef publicKeyItemRef, // optional const SecCertificateRequestAttributeList *attributeList, /* * true when called from SecCertificateRequestCreate, cooking up a new * request from scratch * false when called from SecCertificateFindRequest, recomnstructing * a request in progress */ bool isNew = true); virtual ~CertificateRequest() throw(); void submit( sint32 *estimatedTime); void getResult( sint32 *estimatedTime, // optional CssmData &certData); /* * Obtain policy/error specific return data blob. We own the data, it's * not copied. */ void getReturnData( CssmData &rtnData); CSSM_CERT_TYPE certType() { return mCertType; } CSSM_TP_AUTHORITY_REQUEST_TYPE reqType() { return mReqType; } private: void submitDotMac( sint32 *estimatedTime); void getResultDotMac( sint32 *estimatedTime, // optional CssmData &certData); void postPendingRequest(); /* preferences support */ CFStringRef createUserKey(); CFStringRef createPolicyKey(); CFDictionaryRef getPolicyDictionary( CFDictionaryRef prefsDict); CFDictionaryRef getUserDictionary( CFDictionaryRef policyDict); /* * Preferences storage and retrieval. * Both assume valid mPolicy and mUserName. storeResults stores the * specified data; retrieveResults retrieves whatever is found in the * prefs dictionary and restores to mRefId or mCert as appropriate. */ OSStatus storeResults( const CSSM_DATA *refId, // optional, for queued requests const CSSM_DATA *certDat); // optional, for immediate completion void retrieveResults(); void removeResults(); typedef enum { CRS_New = 0, // created via SecCertificateRequestCreate CRS_Reconstructed, // created via SecCertificateFindRequest CRS_HaveCert, // completed request one way or another, have a good cert CRS_HaveRefId, // submitted request, have RefId for later retrieval CRS_HaveOtherData // submitted request, have other data in mRefId } CertReqState; Allocator &mAlloc; CssmClient::TP mTP; CssmClient::CL mCL; CssmAutoData mPolicy; /* i.e., "CssmAutoOid" */ CSSM_CERT_TYPE mCertType; CSSM_TP_AUTHORITY_REQUEST_TYPE mReqType; SecKeyRef mPrivKey; SecKeyRef mPubKey; sint32 mEstTime; CssmAutoData mRefId; /* returned from SubmitCredRequest() */ CertReqState mCertState; CssmAutoData mCertData; /* * The incoming SecCertificateRequestAttributeList oid/value pairs * map to these: */ CssmAutoData mUserName; CssmAutoData mPassword; /* optional (lookup doesn't use it) */ CssmAutoData mHostName; /* optional */ CssmAutoData mDomain; /* optional */ bool mDoRenew; bool mIsAsync; /* true means no persistent state * stored in user prefs; default * is false */ Mutex mMutex; }; } // end namespace KeychainCore } // end namespace Security #endif // !_SECURITY_CERTIFICATEREQUEST_H_