2  * Copyright (c) 2006-2014 Apple Inc. All Rights Reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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 
  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. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  26         CSCommon is the common header of all Code Signing API headers. 
  27         It defines types, constants, and error codes. 
  37 #include <CoreFoundation/CoreFoundation.h> 
  39 CF_ASSUME_NONNULL_BEGIN
 
  42         Code Signing specific OSStatus codes. 
  43         [Assigned range 0xFFFE_FAxx]. 
  46         errSecCSUnimplemented 
=                         -67072, /* unimplemented code signing feature */ 
  47         errSecCSInvalidObjectRef 
=                      -67071, /* invalid API object reference */ 
  48         errSecCSInvalidFlags 
=                          -67070, /* invalid or inappropriate API flag(s) specified */ 
  49         errSecCSObjectRequired 
=                        -67069, /* a required pointer argument was NULL */ 
  50         errSecCSStaticCodeNotFound 
=            -67068, /* cannot find code object on disk */ 
  51         errSecCSUnsupportedGuestAttributes 
= -67067, /* cannot locate guests using this attribute set */ 
  52         errSecCSInvalidAttributeValues 
=        -67066, /* given attribute values are invalid */ 
  53         errSecCSNoSuchCode 
=                            -67065, /* host has no guest with the requested attributes */ 
  54         errSecCSMultipleGuests 
=                        -67064, /* ambiguous guest specification (host has multiple guests with these attribute values) */ 
  55         errSecCSGuestInvalid 
=                          -67063, /* code identity has been invalidated */ 
  56         errSecCSUnsigned 
=                                      -67062, /* code object is not signed at all */ 
  57         errSecCSSignatureFailed 
=                       -67061, /* invalid signature (code or signature have been modified) */ 
  58         errSecCSSignatureNotVerifiable 
=        -67060, /* the code cannot be read by the verifier (file system permissions etc.) */ 
  59         errSecCSSignatureUnsupported 
=          -67059, /* unsupported type or version of signature */ 
  60         errSecCSBadDictionaryFormat 
=           -67058, /* a required plist file or resource is malformed */ 
  61         errSecCSResourcesNotSealed 
=            -67057, /* resources are present but not sealed by signature */ 
  62         errSecCSResourcesNotFound 
=                     -67056, /* code has no resources but signature indicates they must be present */ 
  63         errSecCSResourcesInvalid 
=                      -67055, /* the sealed resource directory is invalid */ 
  64         errSecCSBadResource 
=                           -67054, /* a sealed resource is missing or invalid */ 
  65         errSecCSResourceRulesInvalid 
=          -67053, /* invalid resource specification rule(s) */ 
  66         errSecCSReqInvalid 
=                            -67052, /* invalid or corrupted code requirement(s) */ 
  67         errSecCSReqUnsupported 
=                        -67051, /* unsupported type or version of code requirement(s) */ 
  68         errSecCSReqFailed 
=                                     -67050, /* code failed to satisfy specified code requirement(s) */ 
  69         errSecCSBadObjectFormat 
=                       -67049, /* object file format unrecognized, invalid, or unsuitable */ 
  70         errSecCSInternalError 
=                         -67048, /* internal error in Code Signing subsystem */ 
  71         errSecCSHostReject 
=                            -67047, /* code rejected its host */ 
  72         errSecCSNotAHost 
=                                      -67046, /* attempt to specify guest of code that is not a host */ 
  73         errSecCSSignatureInvalid 
=                      -67045, /* invalid or unsupported format for signature */ 
  74         errSecCSHostProtocolRelativePath 
=      -67044, /* host protocol violation - absolute guest path required */ 
  75         errSecCSHostProtocolContradiction 
=     -67043, /* host protocol violation - contradictory hosting modes */ 
  76         errSecCSHostProtocolDedicationError 
= -67042, /* host protocol violation - operation not allowed with/for a dedicated guest */ 
  77         errSecCSHostProtocolNotProxy 
=          -67041, /* host protocol violation - proxy hosting not engaged */ 
  78         errSecCSHostProtocolStateError 
=        -67040, /* host protocol violation - invalid guest state change request */ 
  79         errSecCSHostProtocolUnrelated 
=         -67039, /* host protocol violation - the given guest is not a guest of the given host */ 
  80                                                                          /* -67038 obsolete (no longer issued) */ 
  81         errSecCSNotSupported 
=                          -67037, /* operation inapplicable or not supported for this type of code */ 
  82         errSecCSCMSTooLarge 
=                           -67036, /* signature too large to embed (size limitation of on-disk representation) */ 
  83         errSecCSHostProtocolInvalidHash 
=       -67035, /* host protocol violation - invalid guest hash */ 
  84         errSecCSStaticCodeChanged 
=                     -67034, /* the code on disk does not match what is running */ 
  85         errSecCSDBDenied 
=                                      -67033, /* permission to use a database denied */ 
  86         errSecCSDBAccess 
=                                      -67032, /* cannot access a database */ 
  87         errSecCSSigDBDenied 
= errSecCSDBDenied
, 
  88         errSecCSSigDBAccess 
= errSecCSDBAccess
, 
  89         errSecCSHostProtocolInvalidAttribute 
= -67031, /* host returned invalid or inconsistent guest attributes */ 
  90         errSecCSInfoPlistFailed 
=                       -67030, /* invalid Info.plist (plist or signature have been modified) */ 
  91         errSecCSNoMainExecutable 
=                      -67029, /* the code has no main executable file */ 
  92         errSecCSBadBundleFormat 
=                       -67028, /* bundle format unrecognized, invalid, or unsuitable */ 
  93         errSecCSNoMatches 
=                                     -67027, /* no matches for search or update operation */ 
  94         errSecCSFileHardQuarantined 
=           -67026, /* File created by an AppSandbox, exec/open not allowed */ 
  95         errSecCSOutdated 
=                                      -67025, /* presented data is out of date */ 
  96         errSecCSDbCorrupt 
=                                     -67024, /* a system database or file is corrupt */ 
  97         errSecCSResourceDirectoryFailed 
=       -67023, /* invalid resource directory (directory or signature have been modified) */ 
  98         errSecCSUnsignedNestedCode 
=            -67022, /* nested code is unsigned */ 
  99         errSecCSBadNestedCode 
=                         -67021, /* nested code is modified or invalid */ 
 100         errSecCSBadCallbackValue 
=                      -67020, /* monitor callback returned invalid value */ 
 101         errSecCSHelperFailed 
=                          -67019, /* the codesign_allocate helper tool cannot be found or used */ 
 102         errSecCSVetoed 
=                                        -67018, 
 103         errSecCSBadLVArch 
=                                     -67017, /* library validation flag cannot be used with an i386 binary */ 
 104         errSecCSResourceNotSupported 
=          -67016, /* unsupported resource found (something not a directory, file or symlink) */ 
 105         errSecCSRegularFile 
=                           -67015, /* the main executable or Info.plist must be a regular file (no symlinks, etc.) */ 
 106         errSecCSUnsealedAppRoot 
=                       -67014, /* unsealed contents present in the bundle root */ 
 107         errSecCSWeakResourceRules 
=                     -67013, /* resource envelope is obsolete (custom omit rules) */ 
 108         errSecCSDSStoreSymlink 
=                        -67012, /* .DS_Store files cannot be a symlink */  
 109         errSecCSAmbiguousBundleFormat 
=         -67011, /* bundle format is ambiguous (could be app or framework) */ 
 110         errSecCSBadMainExecutable 
=                     -67010, /* main executable failed strict validation */ 
 111         errSecCSBadFrameworkVersion 
=           -67009, /* embedded framework contains modified or invalid version */ 
 112         errSecCSUnsealedFrameworkRoot 
=         -67008, /* unsealed contents present in the root directory of an embedded framework */ 
 113         errSecCSWeakResourceEnvelope 
=          -67007, /* resource envelope is obsolete (version 1 signature) */ 
 114         errSecCSCancelled 
=                                     -67006, /* operation was terminated by explicit cancellation */ 
 115         errSecCSInvalidPlatform 
=                       -67005, /* invalid platform identifier or platform mismatch */ 
 116         errSecCSTooBig 
=                                        -67004, /* code is too big for current signing format */ 
 117         errSecCSInvalidSymlink 
=                        -67003, /* invalid destination for symbolic link in bundle */ 
 118         errSecCSNotAppLike 
=                            -67002, /* the code is valid but does not seem to be an app */ 
 119         errSecCSBadDiskImageFormat 
=            -67001, /* disk image format unrecognized, invalid, or unsuitable */ 
 120         errSecCSUnsupportedDigestAlgorithm 
= -67000, /* signature digest algorithm(s) specified are not supported */ 
 121         errSecCSInvalidAssociatedFileData 
=     -66999, /* resource fork, Finder information, or similar detritus not allowed */ 
 122     errSecCSInvalidTeamIdentifier 
=     -66998, /* a Team Identifier string is invalid */ 
 123     errSecCSBadTeamIdentifier 
=         -66997, /* a Team Identifier is wrong or inappropriate */ 
 127  * Code Signing specific CFError "user info" keys. 
 128  * In calls that can return CFErrorRef indications, if a CFErrorRef is actually 
 129  * returned, its "user info" dictionary may contain some of the following keys 
 130  * to more closely describe the circumstances of the failure. 
 131  * Do not rely on the presence of any particular key to categorize a problem; 
 132  * always use the primary OSStatus return for that. The data contained under 
 133  * these keys is always supplemental and optional. 
 135 extern const CFStringRef kSecCFErrorArchitecture
;       /* CFStringRef: name of architecture causing the problem */ 
 136 extern const CFStringRef kSecCFErrorPattern
;            /* CFStringRef: invalid resource selection pattern encountered */ 
 137 extern const CFStringRef kSecCFErrorResourceSeal
;       /* CFTypeRef: invalid component in resource seal (CodeResources) */ 
 138 extern const CFStringRef kSecCFErrorResourceAdded
;      /* CFURLRef: unsealed resource found */ 
 139 extern const CFStringRef kSecCFErrorResourceAltered
; /* CFURLRef: modified resource found */ 
 140 extern const CFStringRef kSecCFErrorResourceMissing
; /* CFURLRef: sealed (non-optional) resource missing */ 
 141 extern const CFStringRef kSecCFErrorResourceSideband
; /* CFURLRef: sealed resource has invalid sideband data (resource fork, etc.) */ 
 142 extern const CFStringRef kSecCFErrorInfoPlist
;          /* CFTypeRef: Info.plist dictionary or component thereof found invalid */ 
 143 extern const CFStringRef kSecCFErrorGuestAttributes
; /* CFTypeRef: Guest attribute set of element not accepted */ 
 144 extern const CFStringRef kSecCFErrorRequirementSyntax
; /* CFStringRef: compilation error for Requirement source */ 
 145 extern const CFStringRef kSecCFErrorPath
;                       /* CFURLRef: subcomponent containing the error */ 
 149         This is the type of a reference to running code. 
 151         In many (but not all) calls, this can be passed to a SecStaticCodeRef 
 152         argument, which performs an implicit SecCodeCopyStaticCode call and 
 153         operates on the result. 
 155 typedef struct CF_BRIDGED_TYPE(id
) __SecCode 
*SecCodeRef
;       /* running code */ 
 158         @typedef SecStaticCodeRef 
 159         This is the type of a reference to static code on disk. 
 161 typedef struct CF_BRIDGED_TYPE(id
) __SecCode 
const *SecStaticCodeRef
;   /* code on disk */ 
 164         @typedef SecRequirementRef 
 165         This is the type of a reference to a code requirement. 
 167 typedef struct CF_BRIDGED_TYPE(id
) __SecRequirement 
*SecRequirementRef
; /* code requirement */ 
 172         An abstract handle to identify a particular Guest in the context of its Host. 
 174         Guest handles are assigned by the host at will, with kSecNoGuest (zero) being 
 175         reserved as the null value. They can be reused for new children if desired. 
 177 typedef u_int32_t SecGuestRef
; 
 179 CF_ENUM(SecGuestRef
) { 
 180         kSecNoGuest 
= 0,                /* not a valid SecGuestRef */ 
 186         This is the type of flags arguments to Code Signing API calls. 
 187         It provides a bit mask of request and option flags. All of the bits in these 
 188         masks are reserved to Apple; if you set any bits not defined in these headers, 
 189         the behavior is generally undefined. 
 191         This list describes the flags that are shared among several Code Signing API calls. 
 192         Flags that only apply to one call are defined and documented with that call. 
 193         Global flags are assigned from high order down (31 -> 0); call-specific flags 
 194         are assigned from the bottom up (0 -> 31). 
 196         @constant kSecCSDefaultFlags 
 197         When passed to a flags argument throughout, indicates that default behavior 
 198         is desired. Do not mix with other flags values. 
 199         @constant kSecCSConsiderExpiration 
 200         When passed to a call that performs code validation, requests that code signatures 
 201         made by expired certificates be rejected. By default, expiration of participating 
 202         certificates is not automatic grounds for rejection. 
 204 typedef CF_OPTIONS(uint32_t, SecCSFlags
) { 
 205     kSecCSDefaultFlags 
= 0,                                     /* no particular flags (default behavior) */ 
 207     kSecCSConsiderExpiration 
= 1U << 31,                /* consider expired certificates invalid */ 
 208     kSecCSEnforceRevocationChecks 
= 1 << 30,    /* force revocation checks regardless of preference settings */ 
 209     kSecCSNoNetworkAccess 
= 1 << 29,            /* do not use the network, cancels "kSecCSEnforceRevocationChecks"  */ 
 210         kSecCSReportProgress 
= 1 << 28,                 /* make progress report call-backs when configured */ 
 211     kSecCSCheckTrustedAnchors 
= 1 << 27, /* build certificate chain to system trust anchors, not to any self-signed certificate */ 
 212         kSecCSQuickCheck 
= 1 << 26,             /* (internal) */ 
 217         @typedef SecCodeSignatureFlags 
 218         This is the type of option flags that can be embedded in a code signature 
 219         during signing, and that govern the use of the signature thereafter. 
 220         Some of these flags can be set through the codesign(1) command's --options 
 221         argument; some are set implicitly based on signing circumstances; and all 
 222         can be set with the kSecCodeSignerFlags item of a signing information dictionary. 
 224         @constant kSecCodeSignatureHost 
 225         Indicates that the code may act as a host that controls and supervises guest 
 226         code. If this flag is not set in a code signature, the code is never considered 
 227         eligible to be a host, and any attempt to act like one will be ignored or rejected. 
 228         @constant kSecCodeSignatureAdhoc 
 229         The code has been sealed without a signing identity. No identity may be retrieved 
 230         from it, and any code requirement placing restrictions on the signing identity 
 231         will fail. This flag is set by the code signing API and cannot be set explicitly. 
 232         @constant kSecCodeSignatureForceHard 
 233         Implicitly set the "hard" status bit for the code when it starts running. 
 234         This bit indicates that the code prefers to be denied access to a resource 
 235         if gaining such access would cause its invalidation. Since the hard bit is 
 236         sticky, setting this option bit guarantees that the code will always have 
 238         @constant kSecCodeSignatureForceKill 
 239         Implicitly set the "kill" status bit for the code when it starts running. 
 240         This bit indicates that the code wishes to be terminated with prejudice if 
 241         it is ever invalidated. Since the kill bit is sticky, setting this option bit 
 242         guarantees that the code will always be dynamically valid, since it will die 
 243         immediately     if it becomes invalid. 
 244         @constant kSecCodeSignatureForceExpiration 
 245         Forces the kSecCSConsiderExpiration flag on all validations of the code. 
 247 typedef CF_OPTIONS(uint32_t, SecCodeSignatureFlags
) { 
 248         kSecCodeSignatureHost 
= 0x0001,                 /* may host guest code */ 
 249         kSecCodeSignatureAdhoc 
= 0x0002,                /* must be used without signer */ 
 250         kSecCodeSignatureForceHard 
= 0x0100,    /* always set HARD mode on launch */ 
 251         kSecCodeSignatureForceKill 
= 0x0200,    /* always set KILL mode on launch */ 
 252         kSecCodeSignatureForceExpiration 
= 0x0400, /* force certificate expiration checks */ 
 253         kSecCodeSignatureRestrict 
= 0x0800, /* restrict dyld loading */ 
 254         kSecCodeSignatureEnforcement 
= 0x1000, /* enforce code signing */ 
 255         kSecCodeSignatureLibraryValidation 
= 0x2000, /* library validation required */ 
 260         @typedef SecCodeStatus 
 261         The code signing system attaches a set of status flags to each running code. 
 262         These flags are maintained by the code's host, and can be read by anyone. 
 263         A code may change its own flags, a host may change its guests' flags, 
 264         and root may change anyone's flags.     However, these flags are sticky in that 
 265         each can change in only one direction (and never back, for the lifetime of the code). 
 266         Not even root can violate this restriction. 
 268         There are other flags in SecCodeStatus that are not publicly documented. 
 269         Do not rely on them, and do not ever attempt to explicitly set them. 
 271         @constant kSecCodeStatusValid 
 272         Indicates that the code is dynamically valid, i.e. it started correctly 
 273         and has not been invalidated since then. The valid bit can only be cleared. 
 275         Warning: This bit is not your one-stop shortcut to determining the validity     of code. 
 276         It represents the dynamic component of the full validity function; if this 
 277         bit is unset, the code is definitely invalid, but the converse is not always true. 
 278         In fact, code hosts may represent the outcome of some delayed static validation work in this bit, 
 279         and thus it strictly represents a blend of (all of) dynamic and (some of) static validity, 
 280         depending on the implementation of the particular host managing the code. You can (only) 
 281         rely that (1) dynamic invalidation will clear this bit; and (2) the combination 
 282         of static validation and dynamic validity (as performed by the SecCodeCheckValidity* APIs) 
 283         will give a correct answer. 
 285         @constant kSecCodeStatusHard 
 286         Indicates that the code prefers to be denied access to resources if gaining access 
 287         would invalidate it. This bit can only be set. 
 288         It is undefined whether code that is marked hard and is already invalid will still 
 289         be denied access to a resource that would invalidate it if it were still valid. That is, 
 290         the code may or may not get access to such a resource while being invalid, and that choice 
 293         @constant kSecCodeStatusKill 
 294         Indicates that the code wants to be killed (terminated) if it ever loses its validity. 
 295         This bit can only be set. Code that has the kill flag set will never be dynamically invalid 
 296         (and live). Note however that a change in static validity does not necessarily trigger instant 
 299 typedef CF_OPTIONS(uint32_t, SecCodeStatus
) { 
 300         kSecCodeStatusValid 
=   0x0001, 
 301         kSecCodeStatusHard 
=    0x0100, 
 302         kSecCodeStatusKill 
=    0x0200, 
 307         @typedef SecRequirementType 
 308         An enumeration indicating different types of internal requirements for code. 
 310 typedef CF_ENUM(uint32_t, SecRequirementType
) { 
 311         kSecHostRequirementType 
=                       1,      /* what hosts may run us */ 
 312         kSecGuestRequirementType 
=                      2,      /* what guests we may run */ 
 313         kSecDesignatedRequirementType 
=         3,      /* designated requirement */ 
 314         kSecLibraryRequirementType 
=            4,      /* what libraries we may link against */ 
 315         kSecPluginRequirementType 
=                     5,      /* what plug-ins we may load */ 
 316         kSecInvalidRequirementType
,                             /* invalid type of Requirement (must be last) */ 
 317         kSecRequirementTypeCount 
= kSecInvalidRequirementType 
/* number of valid requirement types */ 
 322  Types of cryptographic digests (hashes) used to hold code signatures 
 325  Each combination of type, length, and other parameters is a separate 
 326  hash type; we don't understand "families" here. 
 328  These type codes govern the digest links that connect a CodeDirectory 
 329  to its subordinate data structures (code pages, resources, etc.) 
 330  They do not directly control other uses of hashes (such as those used 
 331  within X.509 certificates and CMS blobs). 
 333 typedef CF_ENUM(uint32_t, SecCSDigestAlgorithm
) { 
 334         kSecCodeSignatureNoHash                                                 
=  0,   /* null value */ 
 335         kSecCodeSignatureHashSHA1                                               
=  1,   /* SHA-1 */ 
 336         kSecCodeSignatureHashSHA256                                             
=  2,   /* SHA-256 */ 
 337         kSecCodeSignatureHashSHA256Truncated                    
=  3,   /* SHA-256 truncated to first 20 bytes */ 
 338         kSecCodeSignatureHashSHA384                                             
=  4,   /* SHA-384 */ 
 341 CF_ASSUME_NONNULL_END