]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_apple_x509_tp/lib/TPCrlInfo.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_apple_x509_tp / lib / TPCrlInfo.h
diff --git a/Security/libsecurity_apple_x509_tp/lib/TPCrlInfo.h b/Security/libsecurity_apple_x509_tp/lib/TPCrlInfo.h
new file mode 100644 (file)
index 0000000..124f955
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2002,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.
+ */
+
+
+/*
+ * TPCrlInfo.h - TP's private CRL and CRL group classes
+ *
+ */
+#ifndef        _TP_CRL_INFO_H_
+#define _TP_CRL_INFO_H_
+
+#include <Security/cssmtype.h>
+#include <security_utilities/alloc.h>
+#include <security_utilities/threading.h>
+#include <security_utilities/globalizer.h>
+#include "TPCertInfo.h"
+#include "tpCrlVerify.h"
+
+/*
+ * Verification state of a TPCrlInfo. Verification refers to the process
+ * of cert chain validation from the CRL to a trusted root. Since this
+ * is a rather heavyweight operation, this is done on demand, when a given
+ * CRL is "believed to be" the appropriate one for a given cert. It
+ * is separate from not before/after verification, which is performed
+ * on the fly as needed.
+ */
+typedef enum {
+       CVS_Unknown,            // initial default state
+       CVS_Good,                       // known good
+       CVS_Bad                         // known bad
+} TPCrlVerifyState;
+
+/*
+ * Indicates where a particular CRL came from. Currently only used
+ * in the tpCrlVerify module.
+ */
+typedef enum {
+       CFW_Nowhere,            // default, never returned
+       CFW_InGroup,            // from incoming TPCrlGroup
+       CFW_DlDb,                       // verifyContext.dbList
+       CFW_LocalCache,         // tpGlobalCrlCache
+       CFW_Net,                        // tpFetchCrlFromNet
+       /* probably others */
+} TPCrlFromWhere;
+
+
+/*
+ * Class representing one CRL. The raw CRL data usually comes from
+ * a client (via incoming CSSM_TP_VERIFY_CONTEXT.Crls); in this case, we 
+ * don't own the raw data and don't copy or free it. Caller can 
+ * optionally specify that we copy (and own and eventually free) the raw cert data. 
+ * Currently this is only done when we find a CRL in a DlDb. The constructor throws 
+ * on any error (bad CRL data); subsequent to successful construction, no CSSM 
+ * errors are thrown and it's guaranteed that the CRL is basically readable and 
+ * successfully cached in the CL, and that we have a locally cached 
+ * CSSM_X509_SIGNED_CRL and issuer name (in normalized encoded format). 
+ */ 
+class TPCrlInfo : public TPClItemInfo
+{
+       NOCOPY(TPCrlInfo)
+public:
+       /* 
+        * No default constructor - this is the only way.
+        */
+       TPCrlInfo(
+               CSSM_CL_HANDLE          clHand,
+               CSSM_CSP_HANDLE         cspHand,
+               const CSSM_DATA         *crlData,
+               TPItemCopy                      copyCrlData,    
+               const char                      *verifyTime);   // NULL ==> time = right now
+               
+       /* frees mIssuerName, mCacheHand, mX509Crl via mClHand */
+       ~TPCrlInfo();
+       
+       /* 
+        * The heavyweight "perform full verification" op.
+        * If doCrlVerify is true, we'll do an eventually recursive
+        * CRL verification test on the cert group we construct
+        * here to verify the CRL in question. This recursive
+        * verify is also done if the CRL is an indirect CRL.
+        * Currently, the doCrlVerifyFlag will be set false in the
+        * normal case of verifying a cert chain; in that case the 
+        * various certs needed to verify the CRL are assumed to 
+        * be a subset of the cert chain being verified, and CRL
+        * verification of that cert chain is being performed 
+        * elsewhere. The caller would set doCrlVerify true when 
+        * the top-level op is simply a CRL verify.
+        */
+       CSSM_RETURN verifyWithContext(
+               TPVerifyContext         &tpVerifyContext,
+               TPCertInfo                      *forCert,                       // optional
+               bool                            doCrlVerify = false);   
+       
+       /*
+        * Wrapper for verifyWithContext for use when evaluating a CRL
+        * "now" instead of at the time in TPVerifyContext.verifyTime.
+        */
+       CSSM_RETURN verifyWithContextNow(
+               TPVerifyContext         &tpVerifyContext,
+               TPCertInfo                      *forCert,                       // optional
+               bool                            doCrlVerify = false);   
+       
+       /*
+        * Do I have the same issuer as the specified subject cert? 
+        * Returns true if so.
+        */
+       bool hasSameIssuer(
+               const TPCertInfo                &subject);
+               
+       /*
+        * Determine if specified cert has been revoked as of the
+        * provided time; a NULL timestring indicates "now".
+        * Assumes that the current CRL has been fully verified.
+        */
+       CSSM_RETURN isCertRevoked(
+               TPCertInfo                              &subjectCert,
+               CSSM_TIMESTRING                 verifyTime);
+               
+       /* accessors */
+       const CSSM_X509_SIGNED_CRL *x509Crl()           { return mX509Crl; }
+       TPCrlVerifyState                        verifyState()   { return mVerifyState; }
+       
+       const CSSM_DATA                         *uri()                  { return &mUri; }
+       void                                            uri(const CSSM_DATA &uri); 
+       
+       /* 
+        * Ref count info maintained by caller (currently only in 
+        * tpCrlVfy.cpp's global cache module).
+        */
+       int                                     mRefCount;
+       
+       /* used only by tpCrlVerify */
+       TPCrlFromWhere                  mFromWhere;
+       
+       
+private:
+       CSSM_X509_SIGNED_CRL    *mX509Crl;
+       CSSM_DATA_PTR                   mCrlFieldToFree;
+       TPCrlVerifyState                mVerifyState;
+       CSSM_RETURN                             mVerifyError;           // only if mVerifyState = CVS_Bad
+       CSSM_DATA                               mUri;                           // if fetched from net
+       
+       void releaseResources();
+       CSSM_RETURN parseExtensions(
+               TPVerifyContext                         &tpVerifyContext,
+               bool                                            isPerEntry,
+               uint32                                          entryIndex,             // if isPerEntry
+               const CSSM_X509_EXTENSIONS      &extens,
+               TPCertInfo                                      *forCert,               // optional
+               bool                                            &isIndirectCrl);// RETURNED
+       
+};
+
+/*
+ * TP's private CRL Group class.  
+ */
+class TPCrlGroup
+{
+       NOCOPY(TPCrlGroup)
+public:
+       /* construct empty CRL group */
+       TPCrlGroup(
+               Allocator                               &alloc,
+               TPGroupOwner                    whoOwns);               // if TGO_Group, we delete
+       
+       /*
+        * Construct from unordered, untrusted CSSM_CRLGROUP. Resulting
+        * TPCrlInfos are more or less in the same order as the incoming
+        * CRLs, though incoming CRLs are discarded if they don't parse.
+        * No verification of any sort is performed. 
+        */
+       TPCrlGroup(
+               const CSSM_CRLGROUP     *cssmCrlGroup,          // optional
+               CSSM_CL_HANDLE                  clHand,
+               CSSM_CSP_HANDLE                 cspHand,
+               Allocator                               &alloc,
+               const char                              *cssmTimeStr,           // may be NULL
+               TPGroupOwner                    whoOwns);       
+       
+       /*
+        * Deletes all TPCrlInfo's.
+        */
+       ~TPCrlGroup();
+       
+       /* add/remove/access TPCrlInfo's. */
+       void appendCrl(
+               TPCrlInfo                       &crlInfo);                      // appends to end of mCertInfo
+       TPCrlInfo *crlAtIndex(
+               unsigned                        index);
+       TPCrlInfo &removeCrlAtIndex(
+               unsigned                        index);                         // doesn't delete the cert, just 
+                                                                                               // removes it from our list
+       void removeCrl(
+               TPCrlInfo                       &crlInfo);                      // ditto
+       
+       /* 
+        * Convenience accessors for first and last CRL, only valid when we have
+        * at least one cert.
+        */
+       TPCrlInfo *firstCrl();
+       TPCrlInfo *lastCrl();
+               
+       /* 
+        * Find a CRL whose issuer matches specified subject cert.
+        * Returned CRL has not necessarily been verified.
+        */
+       TPCrlInfo *findCrlForCert(
+               TPCertInfo                      &subject);
+               
+       Allocator &alloc()                                                      { return mAlloc; }
+       unsigned numCrls()                                                              { return mNumCrls; }
+       
+private:
+       Allocator                               &mAlloc;
+       TPCrlInfo                               **mCrlInfo;                     // just an array of pointers
+       unsigned                                mNumCrls;                       // valid certs in certInfo
+       unsigned                                mSizeofCrlInfo;         // mallocd space in certInfo
+       TPGroupOwner                    mWhoOwns;                       // if TGO_Group, we delete CRLs 
+                                                                                               //    upon destruction
+};
+#endif /* _TP_CRL_INFO_H_ */
+