SecTrustedApplication.cpp
1 /* 2 * Copyright (c) 2002-2004,2011-2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 #include <Security/SecTrustedApplicationPriv.h> 25 #include <security_keychain/TrustedApplication.h> 26 #include <security_keychain/Certificate.h> 27 #include <securityd_client/ssclient.h> // for code equivalence SPIs 28 29 #include "SecBridge.h" 30 31 32 33 #pragma clang diagnostic push 34 #pragma clang diagnostic ignored "-Wunused-function" 35 static inline CssmData cfData(CFDataRef data) 36 { 37 return CssmData(const_cast<UInt8 *>(CFDataGetBytePtr(data)), 38 CFDataGetLength(data)); 39 } 40 #pragma clang diagnostic pop 41 42 43 CFTypeID 44 SecTrustedApplicationGetTypeID(void) 45 { 46 BEGIN_SECAPI 47 return gTypes().TrustedApplication.typeID; 48 49 END_SECAPI1(_kCFRuntimeNotATypeID) 50 } 51 52 53 OSStatus 54 SecTrustedApplicationCreateFromPath(const char *path, SecTrustedApplicationRef *appRef) 55 { 56 BEGIN_SECAPI 57 SecPointer<TrustedApplication> app = 58 path ? new TrustedApplication(path) : new TrustedApplication; 59 Required(appRef) = app->handle(); 60 END_SECAPI 61 } 62 63 OSStatus SecTrustedApplicationCopyData(SecTrustedApplicationRef appRef, 64 CFDataRef *dataRef) 65 { 66 BEGIN_SECAPI 67 const char *path = TrustedApplication::required(appRef)->path(); 68 Required(dataRef) = CFDataCreate(NULL, (const UInt8 *)path, strlen(path) + 1); 69 END_SECAPI 70 } 71 72 OSStatus SecTrustedApplicationSetData(SecTrustedApplicationRef appRef, 73 CFDataRef dataRef) 74 { 75 BEGIN_SECAPI 76 if (!dataRef) 77 return errSecParam; 78 TrustedApplication::required(appRef)->data(dataRef); 79 END_SECAPI 80 } 81 82 83 OSStatus 84 SecTrustedApplicationValidateWithPath(SecTrustedApplicationRef appRef, const char *path) 85 { 86 BEGIN_SECAPI 87 TrustedApplication &app = *TrustedApplication::required(appRef); 88 if (!app.verifyToDisk(path)) 89 return CSSMERR_CSP_VERIFY_FAILED; 90 END_SECAPI 91 } 92 93 94 // 95 // Convert from/to external data representation 96 // 97 OSStatus SecTrustedApplicationCopyExternalRepresentation( 98 SecTrustedApplicationRef appRef, 99 CFDataRef *externalRef) 100 { 101 BEGIN_SECAPI 102 TrustedApplication &app = *TrustedApplication::required(appRef); 103 Required(externalRef) = app.externalForm(); 104 END_SECAPI 105 } 106 107 OSStatus SecTrustedApplicationCreateWithExternalRepresentation( 108 CFDataRef externalRef, 109 SecTrustedApplicationRef *appRef) 110 { 111 BEGIN_SECAPI 112 Required(appRef) = (new TrustedApplication(externalRef))->handle(); 113 END_SECAPI 114 } 115 116 117 OSStatus 118 SecTrustedApplicationMakeEquivalent(SecTrustedApplicationRef oldRef, 119 SecTrustedApplicationRef newRef, UInt32 flags) 120 { 121 BEGIN_SECAPI 122 return errSecParam; 123 END_SECAPI 124 } 125 126 OSStatus 127 SecTrustedApplicationRemoveEquivalence(SecTrustedApplicationRef appRef, UInt32 flags) 128 { 129 BEGIN_SECAPI 130 return errSecParam; 131 END_SECAPI 132 } 133 134 135 /* 136 * Check to see if an application at a given path is a candidate for 137 * pre-emptive code equivalency establishment 138 */ 139 OSStatus 140 SecTrustedApplicationIsUpdateCandidate(const char *installroot, const char *path) 141 { 142 BEGIN_SECAPI 143 return CSSMERR_DL_RECORD_NOT_FOUND; // whatever 144 END_SECAPI 145 } 146 147 148 /* 149 * Point the system at another system root for equivalence use. 150 * This is for system update installers (only)! 151 */ 152 OSStatus 153 SecTrustedApplicationUseAlternateSystem(const char *systemRoot) 154 { 155 BEGIN_SECAPI 156 return errSecParam; 157 END_SECAPI 158 } 159 160 161 /* 162 * Gateway between traditional SecTrustedApplicationRefs and the Code Signing 163 * subsystem. Invisible to the naked eye, as of 10.5 (Leopard), these reference 164 * may contain Cod e Signing Requirement objects (SecRequirementRefs). For backward 165 * compatibility, these are handled implicitly at the SecAccess/SecACL layer. 166 * However, Those Who Know can bridge the gap for additional functionality. 167 */ 168 OSStatus SecTrustedApplicationCreateFromRequirement(const char *description, 169 SecRequirementRef requirement, SecTrustedApplicationRef *appRef) 170 { 171 BEGIN_SECAPI 172 if (description == NULL) 173 description = "csreq://"; // default to "generic requirement" 174 SecPointer<TrustedApplication> app = new TrustedApplication(description, requirement); 175 Required(appRef) = app->handle(); 176 END_SECAPI 177 } 178 179 OSStatus SecTrustedApplicationCopyRequirement(SecTrustedApplicationRef appRef, 180 SecRequirementRef *requirement) 181 { 182 BEGIN_SECAPI 183 Required(requirement) = TrustedApplication::required(appRef)->requirement(); 184 if (*requirement) 185 CFRetain(*requirement); 186 END_SECAPI 187 } 188 189 190 /* 191 * Create an application group reference. 192 */ 193 OSStatus SecTrustedApplicationCreateApplicationGroup(const char *groupName, 194 SecCertificateRef anchor, SecTrustedApplicationRef *appRef) 195 { 196 BEGIN_SECAPI 197 CFRef<SecRequirementRef> req; 198 MacOSError::check(SecRequirementCreateGroup(CFTempString(groupName), anchor, 199 kSecCSDefaultFlags, &req.aref())); 200 string description = string("group://") + groupName; 201 if (anchor) { 202 Certificate *cert = Certificate::required(anchor); 203 const CssmData &hash = cert->publicKeyHash(); 204 description = description + "?cert=" + cfString(cert->commonName()) 205 + "&hash=" + hash.toHex(); 206 } 207 SecPointer<TrustedApplication> app = new TrustedApplication(description, req); 208 Required(appRef) = app->handle(); 209 210 END_SECAPI 211 }