]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_apple_x509_tp/lib/AppleTPSession.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_apple_x509_tp / lib / AppleTPSession.h
diff --git a/Security/libsecurity_apple_x509_tp/lib/AppleTPSession.h b/Security/libsecurity_apple_x509_tp/lib/AppleTPSession.h
new file mode 100644 (file)
index 0000000..366e021
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2000-2001,2011,2014 Apple 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.
+ */
+
+
+/* 
+ * AppleTPSession.h - TP session functions.
+ * 
+ */
+#ifndef _H_APPLE_TP_SESSION
+#define _H_APPLE_TP_SESSION
+
+#include <security_cdsa_plugin/TPsession.h>
+#include "TPCertInfo.h"
+
+#define REALLOC_WORKAROUND     0
+#if    REALLOC_WORKAROUND
+#include <string.h>
+#endif
+
+class AppleTPSession : public TPPluginSession {
+
+public:
+
+       AppleTPSession(
+               CSSM_MODULE_HANDLE theHandle,
+               CssmPlugin &plug,
+               const CSSM_VERSION &version,
+               uint32 subserviceId,
+               CSSM_SERVICE_TYPE subserviceType,
+               CSSM_ATTACH_FLAGS attachFlags,
+               const CSSM_UPCALLS &upcalls);
+
+       ~AppleTPSession();
+       
+       #if             REALLOC_WORKAROUND
+       void *realloc(void *oldp, size_t size) {
+               void *newp = malloc(size);
+               memmove(newp, oldp, size);
+               free(oldp);
+               return newp;
+       }
+       #endif  /* REALLOC_WORKAROUND */
+
+       /* methods declared in TPabstractSession.h */
+       void CertCreateTemplate(CSSM_CL_HANDLE CLHandle,
+         uint32 NumberOfFields,
+         const CSSM_FIELD CertFields[],
+         CssmData &CertTemplate);
+       void CrlVerify(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CSSM_ENCODED_CRL &CrlToBeVerified,
+         const CSSM_CERTGROUP &SignerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT *VerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT *RevokerVerifyResult);
+       void CertReclaimKey(const CSSM_CERTGROUP &CertGroup,
+         uint32 CertIndex,
+         CSSM_LONG_HANDLE KeyCacheHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry);
+       void CertGroupVerify(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CSSM_CERTGROUP &CertGroupToBeVerified,
+         const CSSM_TP_VERIFY_CONTEXT *VerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT_PTR VerifyContextResult);
+       void CertGroupConstruct(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CSSM_DL_DB_LIST &DBList,
+         const void *ConstructParams,
+         const CSSM_CERTGROUP &CertGroupFrag,
+         CSSM_CERTGROUP_PTR &CertGroup);
+       void CertSign(CSSM_CL_HANDLE CLHandle,
+         CSSM_CC_HANDLE CCHandle,
+         const CssmData &CertTemplateToBeSigned,
+         const CSSM_CERTGROUP &SignerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT *SignerVerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT *SignerVerifyResult,
+         CssmData &SignedCert);
+       void TupleGroupToCertGroup(CSSM_CL_HANDLE CLHandle,
+         const CSSM_TUPLEGROUP &TupleGroup,
+         CSSM_CERTGROUP_PTR &CertTemplates);
+       void ReceiveConfirmation(const CssmData &ReferenceIdentifier,
+         CSSM_TP_CONFIRM_RESPONSE_PTR &Responses,
+         sint32 &ElapsedTime);
+       void PassThrough(CSSM_CL_HANDLE CLHandle,
+         CSSM_CC_HANDLE CCHandle,
+         const CSSM_DL_DB_LIST *DBList,
+         uint32 PassThroughId,
+         const void *InputParams,
+         void **OutputParams);
+       void CertRemoveFromCrlTemplate(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CssmData *OldCrlTemplate,
+         const CSSM_CERTGROUP &CertGroupToBeRemoved,
+         const CSSM_CERTGROUP &RevokerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT &RevokerVerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT &RevokerVerifyResult,
+         CssmData &NewCrlTemplate);
+       void CertRevoke(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CssmData *OldCrlTemplate,
+         const CSSM_CERTGROUP &CertGroupToBeRevoked,
+         const CSSM_CERTGROUP &RevokerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT &RevokerVerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT &RevokerVerifyResult,
+         CSSM_TP_CERTCHANGE_REASON Reason,
+         CssmData &NewCrlTemplate);
+       void CertReclaimAbort(CSSM_LONG_HANDLE KeyCacheHandle);
+       void CrlCreateTemplate(CSSM_CL_HANDLE CLHandle,
+         uint32 NumberOfFields,
+         const CSSM_FIELD CrlFields[],
+         CssmData &NewCrlTemplate);
+       void CertGroupToTupleGroup(CSSM_CL_HANDLE CLHandle,
+         const CSSM_CERTGROUP &CertGroup,
+         CSSM_TUPLEGROUP_PTR &TupleGroup);
+       void SubmitCredRequest(const CSSM_TP_AUTHORITY_ID *PreferredAuthority,
+         CSSM_TP_AUTHORITY_REQUEST_TYPE RequestType,
+         const CSSM_TP_REQUEST_SET &RequestInput,
+         const CSSM_TP_CALLERAUTH_CONTEXT *CallerAuthContext,
+         sint32 &EstimatedTime,
+         CssmData &ReferenceIdentifier);
+       void FormRequest(const CSSM_TP_AUTHORITY_ID *PreferredAuthority,
+         CSSM_TP_FORM_TYPE FormType,
+         CssmData &BlankForm);
+       void CrlSign(CSSM_CL_HANDLE CLHandle,
+         CSSM_CC_HANDLE CCHandle,
+         const CSSM_ENCODED_CRL &CrlToBeSigned,
+         const CSSM_CERTGROUP &SignerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT *SignerVerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT *SignerVerifyResult,
+         CssmData &SignedCrl);
+       void CertGroupPrune(CSSM_CL_HANDLE CLHandle,
+         const CSSM_DL_DB_LIST &DBList,
+         const CSSM_CERTGROUP &OrderedCertGroup,
+         CSSM_CERTGROUP_PTR &PrunedCertGroup);
+       void ApplyCrlToDb(CSSM_CL_HANDLE CLHandle,
+         CSSM_CSP_HANDLE CSPHandle,
+         const CSSM_ENCODED_CRL &CrlToBeApplied,
+         const CSSM_CERTGROUP &SignerCertGroup,
+         const CSSM_TP_VERIFY_CONTEXT *ApplyCrlVerifyContext,
+         CSSM_TP_VERIFY_CONTEXT_RESULT &ApplyCrlVerifyResult);
+       void CertGetAllTemplateFields(CSSM_CL_HANDLE CLHandle,
+         const CssmData &CertTemplate,
+         uint32 &NumberOfFields,
+         CSSM_FIELD_PTR &CertFields);
+       void ConfirmCredResult(const CssmData &ReferenceIdentifier,
+         const CSSM_TP_CALLERAUTH_CONTEXT *CallerAuthCredentials,
+         const CSSM_TP_CONFIRM_RESPONSE &Responses,
+         const CSSM_TP_AUTHORITY_ID *PreferredAuthority);
+       void FormSubmit(CSSM_TP_FORM_TYPE FormType,
+         const CssmData &Form,
+         const CSSM_TP_AUTHORITY_ID *ClearanceAuthority,
+         const CSSM_TP_AUTHORITY_ID *RepresentedAuthority,
+         AccessCredentials *Credentials);
+       void RetrieveCredResult(const CssmData &ReferenceIdentifier,
+         const CSSM_TP_CALLERAUTH_CONTEXT *CallerAuthCredentials,
+         sint32 &EstimatedTime,
+         CSSM_BOOL &ConfirmationRequired,
+         CSSM_TP_RESULT_SET_PTR &RetrieveOutput);
+
+private:
+       void CertGroupConstructPriv(CSSM_CL_HANDLE clHand,
+               CSSM_CSP_HANDLE                 cspHand,
+               TPCertGroup                     &inCertGroup,
+               const CSSM_DL_DB_LIST   *DBList,                        // optional here
+               const char                              *cssmTimeStr,           // optional
+               uint32                                  numAnchorCerts,         // optional
+               const CSSM_DATA                 *anchorCerts,
+               
+               /* CSSM_TP_ACTION_FETCH_CERT_FROM_NET, CSSM_TP_ACTION_TRUST_SETTINGS */
+               CSSM_APPLE_TP_ACTION_FLAGS      actionFlags,
+               
+               /* optional user trust parameters */
+               const CSSM_OID                  *policyOid,
+               const char                              *policyStr,
+               uint32                                  policyStrLen,
+               CSSM_KEYUSE                             keyUse,
+
+               /* 
+                * Certs to be freed by caller (i.e., TPCertInfo which we allocate
+                * as a result of using a cert from anchorCerts of dbList) are added
+                * to this group.
+                */
+               TPCertGroup                             &certsToBeFreed,
+
+               /* returned */
+               CSSM_BOOL                               &verifiedToRoot,        // end of chain self-verifies
+               CSSM_BOOL                               &verifiedToAnchor,      // end of chain in anchors
+               CSSM_BOOL                               &verifiedViaTrustSetting,       // chain ends per Trust Setting
+               TPCertGroup                     &outCertGroup);         // RETURNED
+                       
+       /* in tpCredRequest.cp */
+       CSSM_X509_NAME * buildX509Name(const CSSM_APPLE_TP_NAME_OID *nameArray,
+               unsigned numNames);
+       void freeX509Name(CSSM_X509_NAME *top);
+       CSSM_X509_TIME *buildX509Time(unsigned secondsFromNow);
+       void freeX509Time(CSSM_X509_TIME *xtime);
+       void refKeyToRaw(
+               CSSM_CSP_HANDLE cspHand,
+               const CSSM_KEY  *refKey,        
+               CSSM_KEY_PTR    rawKey);
+       void makeCertTemplate(
+               /* required */
+               CSSM_CL_HANDLE                  clHand,
+               CSSM_CSP_HANDLE                 cspHand,                // for converting ref to raw key
+               uint32                                  serialNumber,
+               const CSSM_X509_NAME    *issuerName,    
+               const CSSM_X509_NAME    *subjectName,
+               const CSSM_X509_TIME    *notBefore,     
+               const CSSM_X509_TIME    *notAfter,      
+               const CSSM_KEY                  *subjectPubKey,
+               const CSSM_OID                  &sigOid,                // e.g., CSSMOID_SHA1WithRSA
+               /* optional */
+               const CSSM_DATA                 *subjectUniqueId,
+               const CSSM_DATA                 *issuerUniqueId,
+               CSSM_X509_EXTENSION             *extensions,
+               unsigned                                numExtensions,
+               CSSM_DATA_PTR                   &rawCert);
+
+       void SubmitCsrRequest(
+               const CSSM_TP_REQUEST_SET &RequestInput,
+               const CSSM_TP_CALLERAUTH_CONTEXT *CallerAuthContext,
+               sint32                                  &EstimatedTime, 
+               CssmData                                &ReferenceIdentifier);
+               
+       /* 
+        * Per-session storage of SubmitCredRequest results.
+        *
+        * A TpCredHandle is just an address of a cert, cast to a CSSM_INTPTR. It's 
+        * what ReferenceIdentifier.Data points to.
+        */ 
+       typedef CSSM_INTPTR TpCredHandle;
+       typedef std::map<TpCredHandle, 
+                                    const CSSM_DATA * /* the actual cert */ > credMap;
+       credMap                                 tpCredMap;
+       Mutex                                   tpCredMapLock;
+       
+       /* given a cert and a ReferenceIdentifier, fill in ReferenceIdentifier and 
+        * add it and the cert to tpCredMap. */
+       void addCertToMap(
+               const CSSM_DATA         *cert,
+               CSSM_DATA_PTR           refId);
+               
+       /* given a ReferenceIdentifier, obtain associated cert and remove from the map */
+       CSSM_DATA_PTR getCertFromMap(
+               const CSSM_DATA         *refId);
+
+};
+
+#endif /* _H_APPLE_TP_SESSION */