/* * Copyright (c) 2002-2004 Apple Computer, 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@ */ #include #include #include #include "SecBridge.h" // // CF boilerplate // CFTypeID SecTrustGetTypeID(void) { BEGIN_SECAPI return gTypes().Trust.typeID; END_SECAPI1(_kCFRuntimeNotATypeID) } // // Sec* API bridge functions // OSStatus SecTrustCreateWithCertificates( CFArrayRef certificates, CFTypeRef policies, SecTrustRef *trustRef) { BEGIN_SECAPI Required(trustRef); *trustRef = (new Trust(certificates, policies))->handle(); END_SECAPI } OSStatus SecTrustSetPolicies(SecTrustRef trustRef, CFTypeRef policies) { BEGIN_SECAPI Trust::required(trustRef)->policies(policies); END_SECAPI } OSStatus SecTrustSetParameters( SecTrustRef trustRef, CSSM_TP_ACTION action, CFDataRef actionData) { BEGIN_SECAPI Trust *trust = Trust::required(trustRef); trust->action(action); trust->actionData(actionData); END_SECAPI } OSStatus SecTrustSetAnchorCertificates(SecTrustRef trust, CFArrayRef anchorCertificates) { BEGIN_SECAPI Trust::required(trust)->anchors(anchorCertificates); END_SECAPI } OSStatus SecTrustSetKeychains(SecTrustRef trust, CFTypeRef keychainOrArray) { BEGIN_SECAPI StorageManager::KeychainList keychains; globals().storageManager.optionalSearchList(keychainOrArray, keychains); Trust::required(trust)->searchLibs() = keychains; END_SECAPI } OSStatus SecTrustSetVerifyDate(SecTrustRef trust, CFDateRef verifyDate) { BEGIN_SECAPI Trust::required(trust)->time(verifyDate); END_SECAPI } OSStatus SecTrustEvaluate(SecTrustRef trustRef, SecTrustResultType *resultP) { BEGIN_SECAPI Trust *trust = Trust::required(trustRef); trust->evaluate(); if (resultP) *resultP = trust->result(); END_SECAPI } // // Construct the "official" result evidence and return it // OSStatus SecTrustGetResult( SecTrustRef trustRef, SecTrustResultType *result, CFArrayRef *certChain, CSSM_TP_APPLE_EVIDENCE_INFO **statusChain) { BEGIN_SECAPI Trust *trust = Trust::required(trustRef); if (result) *result = trust->result(); if (certChain && statusChain) trust->buildEvidence(*certChain, TPEvidenceInfo::overlayVar(*statusChain)); END_SECAPI } // // Retrieve CSSM-level information for those who want to dig down // OSStatus SecTrustGetCssmResult(SecTrustRef trust, CSSM_TP_VERIFY_CONTEXT_RESULT_PTR *result) { BEGIN_SECAPI Required(result) = Trust::required(trust)->cssmResult(); END_SECAPI } // // Retrieve CSSM_LEVEL TP return code // OSStatus SecTrustGetCssmResultCode(SecTrustRef trustRef, OSStatus *result) { BEGIN_SECAPI Trust *trust = Trust::required(trustRef); if (trust->result() == kSecTrustResultInvalid) return paramErr; else Required(result) = trust->cssmResultCode(); END_SECAPI } OSStatus SecTrustGetTPHandle(SecTrustRef trust, CSSM_TP_HANDLE *handle) { BEGIN_SECAPI Required(handle) = Trust::required(trust)->getTPHandle(); END_SECAPI } // // Get the user's default anchor certificate set // OSStatus SecTrustCopyAnchorCertificates(CFArrayRef* anchorCertificates) { BEGIN_SECAPI Required(anchorCertificates) = Trust::gStore().copyRootCertificates(); END_SECAPI } OSStatus SecTrustGetCSSMAnchorCertificates(const CSSM_DATA **cssmAnchors, uint32 *cssmAnchorCount) { BEGIN_SECAPI CertGroup certs; Trust::gStore().getCssmRootCertificates(certs); Required(cssmAnchors) = certs.blobCerts(); Required(cssmAnchorCount) = certs.count(); END_SECAPI } // // Get and set user trust settings // OSStatus SecTrustGetUserTrust(SecCertificateRef certificate, SecPolicyRef policy, SecTrustUserSetting *trustSetting) { BEGIN_SECAPI Required(trustSetting) = Trust::gStore().find( Certificate::required(certificate), Policy::required(policy)); END_SECAPI } OSStatus SecTrustSetUserTrust(SecCertificateRef certificate, SecPolicyRef policy, SecTrustUserSetting trustSetting) { BEGIN_SECAPI switch (trustSetting) { case kSecTrustResultProceed: case kSecTrustResultConfirm: case kSecTrustResultDeny: case kSecTrustResultUnspecified: break; default: MacOSError::throwMe(errSecInvalidTrustSetting); } Trust::gStore().assign( Certificate::required(certificate), Policy::required(policy), trustSetting); END_SECAPI } /* SecGetAppleTPHandle - @@@NOT EXPORTED YET; copied from SecurityInterface, but could be useful in the future. */ /* CSSM_TP_HANDLE SecGetAppleTPHandle() { BEGIN_SECAPI return TP(gGuidAppleX509TP)->handle(); END_SECAPI1(NULL); } */