--- /dev/null
+/*
+ * Copyright (c) 2002-2015 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@
+ */
+
+//
+// Trust.h - Trust control wrappers
+//
+#ifndef _SECURITY_TRUST_H_
+#define _SECURITY_TRUST_H_
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <security_keychain/StorageManager.h>
+#include <security_cdsa_client/tpclient.h>
+#include <security_utilities/cfutilities.h>
+#include <Security/SecTrust.h>
+#include <security_keychain/Certificate.h>
+#include <security_keychain/Policies.h>
+#include <security_keychain/TrustStore.h>
+#include <vector>
+
+using namespace CssmClient;
+
+namespace Security {
+namespace KeychainCore {
+
+
+//
+// The Trust object manages trust-verification workflow.
+// As such, it represents a somewhat more complex concept than
+// a single "object".
+//
+class Trust : public SecCFObject
+{
+ NOCOPY(Trust)
+public:
+ SECCFFUNCTIONS(Trust, SecTrustRef, errSecInvalidItemRef, gTypes().Trust)
+
+ Trust(CFTypeRef certificates, CFTypeRef policies);
+ virtual ~Trust();
+
+ enum AnchorPolicy {
+ useAnchorsDefault, // default policy: trust built-in unless passed-in
+ useAnchorsAndBuiltIns, // SetTrustAnchorCertificatesOnly value = false
+ useAnchorsOnly // SetTrustAnchorCertificatesOnly value = true
+ };
+
+ enum NetworkPolicy {
+ useNetworkDefault, // default policy: network fetch enabled only for SSL
+ useNetworkDisabled, // explicitly disable network use for any policy
+ useNetworkEnabled // explicitly enable network use for any policy
+ };
+
+ // set (or reset) more input parameters
+ void policies(CFTypeRef policies) { mPolicies.take(cfArrayize(policies)); }
+ void action(CSSM_TP_ACTION action) { mAction = action; }
+ void actionData(CFDataRef data) { mActionData = data; }
+ void time(CFDateRef verifyTime) { mVerifyTime = verifyTime; }
+ void anchors(CFArrayRef anchorList) { mAnchors.take(cfArrayize(anchorList)); }
+ void anchorPolicy(AnchorPolicy policy) { mAnchorPolicy = policy; }
+ void networkPolicy(NetworkPolicy policy) { mNetworkPolicy = policy; }
+ void exceptions(CFArrayRef exceptions) { mExceptions.take(cfArrayize(exceptions)); }
+ void responses(CFTypeRef responseData) { mResponses.take(cfArrayize(responseData)); }
+
+ StorageManager::KeychainList &searchLibs(bool init=true);
+ void searchLibs(StorageManager::KeychainList &libs);
+
+ // perform evaluation
+ void evaluate(bool disableEV=false);
+
+ // update evaluation results
+ void setResult(SecTrustResultType result) { mResult = result; }
+
+ // get at evaluation results
+ void buildEvidence(CFArrayRef &certChain, TPEvidenceInfo * &statusChain);
+ CSSM_TP_VERIFY_CONTEXT_RESULT_PTR cssmResult();
+ void extendedResult(CFDictionaryRef &extendedResult);
+ CFArrayRef properties();
+ CFDictionaryRef results();
+
+ SecTrustResultType result() const { return mResult; }
+ OSStatus cssmResultCode() const { return mTpReturn; }
+ TP getTPHandle() const { return mTP; }
+ CFArrayRef evidence() const { return mEvidenceReturned; }
+ CFArrayRef policies() const { return mPolicies; }
+ CFArrayRef anchors() const { return mAnchors; }
+ CFArrayRef certificates() const { return mCerts; }
+ CFDateRef time() const { return mVerifyTime; }
+ AnchorPolicy anchorPolicy() const { return mAnchorPolicy; }
+ NetworkPolicy networkPolicy() const { return mNetworkPolicy; }
+ CFArrayRef exceptions() const { return mExceptions; }
+
+ // an independent release function for TP evidence results
+ // (yes, we could hand this out to the C layer if desired)
+ static void releaseTPEvidence(TPVerifyResult &result, Allocator &allocator);
+
+private:
+ SecTrustResultType diagnoseOutcome();
+ void evaluateUserTrust(const CertGroup &certs,
+ const CSSM_TP_APPLE_EVIDENCE_INFO *info,
+ CFCopyRef<CFArrayRef> anchors);
+ void clearResults();
+
+ Keychain keychainByDLDb(const CSSM_DL_DB_HANDLE &handle);
+
+ /* revocation policy support */
+ CFMutableArrayRef addPreferenceRevocationPolicies(
+ bool ocspEnabledOnBestAttempt,
+ bool crlEnabledOnBestAttempt,
+ uint32 &numAdded,
+ Allocator &alloc);
+ void freeAddedRevocationPolicyData(CFArrayRef policies,
+ uint32 numAdded,
+ Allocator &alloc);
+ CFDictionaryRef defaultRevocationSettings();
+
+public:
+ bool policySpecified(CFArrayRef policies, const CSSM_OID &inOid);
+ bool revocationPolicySpecified(CFArrayRef policies);
+ void orderRevocationPolicies(CFMutableArrayRef policies);
+ CFMutableArrayRef convertRevocationPolicy(uint32 &numAdded, Allocator &alloc);
+ CFMutableArrayRef forceRevocationPolicies(
+ bool ocspEnabled,
+ bool crlEnabled,
+ uint32 &numAdded,
+ Allocator &alloc,
+ bool requirePerCert=false);
+
+private:
+ TP mTP; // our TP
+
+ // input arguments: set up before evaluate()
+ CSSM_TP_ACTION mAction; // TP action to verify
+ CFRef<CFDataRef> mActionData; // action data
+ CFRef<CFArrayRef> mExceptions; // trust exceptions
+ CFRef<CFArrayRef> mResponses; // array of OCSP response data (optional)
+ CFRef<CFDateRef> mVerifyTime; // verification "now"
+ CFRef<CFArrayRef> mCerts; // certificates to verify (item 1 is subject)
+ CFRef<CFArrayRef> mPolicies; // array of policy objects to control verification
+ CFRef<CFArrayRef> mAnchors; // array of anchor certs
+ StorageManager::KeychainList *mSearchLibs; // array of databases to search
+ bool mSearchLibsSet; // true if mSearchLibs has been initialized
+
+ // evaluation results: set as a result of evaluate()
+ SecTrustResultType mResult; // result classification
+ uint32 mResultIndex; // which result cert made the decision?
+ OSStatus mTpReturn; // return code from TP Verify
+ TPVerifyResult mTpResult; // result of latest TP verify
+
+ vector< SecPointer<Certificate> > mCertChain; // distilled certificate chain
+
+ // information returned to caller but owned by us
+ CFRef<CFArrayRef> mEvidenceReturned; // evidence chain returned
+ CFRef<CFArrayRef> mAllowedAnchors; // array of permitted anchor certificates
+ CFRef<CFArrayRef> mFilteredCerts; // array of certificates to verify, post-filtering
+ CFRef<CFDictionaryRef> mExtendedResult; // dictionary of extended results
+
+ bool mUsingTrustSettings; // true if built-in anchors will be trusted
+ AnchorPolicy mAnchorPolicy; // policy for trusting passed-in and/or built-in anchors
+ NetworkPolicy mNetworkPolicy; // policy for allowing network use during evaluation
+
+public:
+ static ModuleNexus<TrustStore> gStore;
+
+private:
+ Mutex mMutex;
+};
+
+} // end namespace KeychainCore
+
+} // end namespace Security
+
+#endif // !_SECURITY_TRUST_H_