]> git.saurik.com Git - apple/security.git/blobdiff - libsecurity_codesigning/lib/SecCode.h
Security-55163.44.tar.gz
[apple/security.git] / libsecurity_codesigning / lib / SecCode.h
diff --git a/libsecurity_codesigning/lib/SecCode.h b/libsecurity_codesigning/lib/SecCode.h
new file mode 100644 (file)
index 0000000..4ae85d9
--- /dev/null
@@ -0,0 +1,431 @@
+/*
+ * Copyright (c) 2006-2010 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@
+ */
+
+/*!
+       @header SecCode
+       SecCode represents separately indentified running code in the system.
+       In addition to UNIX processes, this can also include (with suitable support)
+       scripts, applets, widgets, etc.
+*/
+#ifndef _H_SECCODE
+#define _H_SECCODE
+
+#include <Security/CSCommon.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*!
+       @function SecCodeGetTypeID
+       Returns the type identifier of all SecCode instances.
+*/
+CFTypeID SecCodeGetTypeID(void);
+
+
+/*!
+       @function SecCodeCopySelf
+       Obtains a SecCode object for the code making the call.
+       The calling code is determined in a way that is subject to modification over
+       time, but obeys the following rules. If it is a UNIX process, its process id (pid)
+       is always used. If it is an active code host that has a dedicated guest, such a guest
+       is always preferred. If it is a host that has called SecHostSelectGuest, such selection
+       is considered until revoked.
+
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param self Upon successful return, contains a SecCodeRef representing the caller.
+       
+       @result Upon success, noErr. Upon error, an OSStatus value documented in
+       CSCommon.h or certain other Security framework headers.
+ */
+OSStatus SecCodeCopySelf(SecCSFlags flags, SecCodeRef *self);
+
+
+/*!
+       @function SecCodeCopyStaticCode
+       Given a SecCode object, locate its origin in the file system and return
+       a SecStaticCode object representing it.
+       
+       The link established by this call is generally reliable but is NOT guaranteed
+       to be secure.
+       
+       Many API functions taking SecStaticCodeRef arguments will also directly
+       accept a SecCodeRef and apply this translation implicitly, operating on
+       its result or returning its error code if any. Each of these functions
+       calls out that behavior in its documentation.
+       
+       If the code was obtained from a universal (aka "fat") program file,
+       the resulting SecStaticCodeRef will refer only to the architecture actually
+       being used. This means that multiple running codes started from the same file
+       may conceivably result in different static code references if they ended up
+       using different execution architectures. (This is unusual but possible.)
+
+       @param code A valid SecCode object reference representing code running
+       on the system.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param staticCode On successful return, a SecStaticCode object reference representing
+       the file system origin of the given SecCode. On error, unchanged.
+       @result Upon success, noErr. Upon error, an OSStatus value documented in
+       CSCommon.h or certain other Security framework headers.
+*/
+OSStatus SecCodeCopyStaticCode(SecCodeRef code, SecCSFlags flags, SecStaticCodeRef *staticCode);
+
+
+/*!
+       @function SecCodeCopyHost
+       Given a SecCode object, identify the (different) SecCode object that acts
+       as its host. A SecCode's host acts as a supervisor and controller,
+       and is the ultimate authority on the its dynamic validity and status.
+       The host relationship is securely established (absent reported errors).
+       
+       @param code A valid SecCode object reference representing code running
+       on the system.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param host On successful return, a SecCode object reference identifying
+       the code's host.
+       @result Upon success, noErr. Upon error, an OSStatus value documented in
+       CSCommon.h or certain other Security framework headers.
+*/
+OSStatus SecCodeCopyHost(SecCodeRef guest, SecCSFlags flags, SecCodeRef *host);
+
+
+/*!
+       @function SecCodeCopyGuestWithAttributes
+       This is the omnibus API function for obtaining dynamic code references.
+       In general, it asks a particular code acting as a code host to locate
+       and return a guest with given attributes. Different hosts support
+       different combinations of attributes and values for guest selection. 
+
+       Asking the NULL host invokes system default     procedures for obtaining
+       any running code in the system with the attributes given. The returned
+       code may be anywhere in the system.
+       The methods a host uses to identify, separate, and control its guests
+       are specific to each type of host. This call provides a generic abstraction layer
+       that allows uniform interrogation of all hosts. A SecCode that does not
+       act as a host will always return errSecCSNoSuchCode. A SecCode that does
+       support hosting may return itself to signify that the attribute refers to
+       itself rather than one of its hosts.
+       
+       @param host A valid SecCode object reference representing code running
+       on the system that acts as a Code Signing host. As a special case, passing
+       NULL indicates that the Code Signing root of trust should be used as a starting
+       point. Currently, that is the system kernel.
+       @param attributes A CFDictionary containing zero or more attribute selector
+       values. Each selector has a CFString key and associated CFTypeRef value.
+       The key name identifies the attribute being specified; the associated value,
+       whose type depends on the the key name, selects a particular value or other
+       constraint on that attribute. Each host only supports particular combinations
+       of keys and values,     and errors will be returned if any unsupported set is requested.
+       As a special case, NULL is taken to mean an empty attribute set.
+       Note that some hosts that support hosting chains (guests being hosts)
+       may return sub-guests in this call. In other words, do not assume that
+       a SecCodeRef returned by this call is a direct guest of the queried host
+       (though it will be a proximate guest, i.e. a guest's guest some way down).
+       Asking the NULL host for NULL attributes returns a code reference for the system root
+       of trust (at present, the running Darwin kernel).
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param guest On successful return, a SecCode object reference identifying
+       the particular guest of the host that owns the attribute value(s) specified.
+       This argument will not be changed if the call fails (does not return noErr).
+       @result Upon success, noErr. Upon error, an OSStatus value documented in
+       CSCommon.h or certain other Security framework headers. In particular:
+       @error errSecCSUnsupportedGuestAttributes The host does not support the attribute
+       type given by attributeType.
+       @error errSecCSInvalidAttributeValues The type of value given for a guest
+       attribute is not supported by the host.
+       @error errSecCSNoSuchCode The host has no guest with the attribute value given
+       by attributeValue, even though the value is of a supported type. This may also
+       be returned if the host code does not currently act as a Code Signing host.
+       @error errSecCSNotAHost The specified host cannot, in fact, act as a code
+       host. (It is missing the kSecCodeSignatureHost option flag in its code
+       signature.)
+       @error errSecCSMultipleGuests The attributes specified do not uniquely identify
+       a guest (the specification is ambiguous).
+*/
+extern const CFStringRef kSecGuestAttributeCanonical;
+extern const CFStringRef kSecGuestAttributeHash;
+extern const CFStringRef kSecGuestAttributeMachPort;
+extern const CFStringRef kSecGuestAttributePid;
+extern const CFStringRef kSecGuestAttributeArchitecture;
+extern const CFStringRef kSecGuestAttributeSubarchitecture;
+
+OSStatus SecCodeCopyGuestWithAttributes(SecCodeRef host,
+       CFDictionaryRef attributes,     SecCSFlags flags, SecCodeRef *guest);
+
+
+/*!
+       @function SecCodeCheckValidity
+       Performs dynamic validation of the given SecCode object. The call obtains and
+       verifies the signature on the code object. It checks the validity of only those
+       sealed components required to establish identity. It checks the SecCode's
+       dynamic validity status as reported by its host. It ensures that the SecCode's
+       host is in turn valid. Finally, it validates the code against a SecRequirement
+       if one is given. The call succeeds if all these conditions are satisfactory.
+       It fails otherwise.
+       
+       This call is secure against attempts to modify the file system source of the
+       SecCode.
+
+       @param code The code object to be validated.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param requirement An optional code requirement specifying additional conditions
+       the code object must satisfy to be considered valid. If NULL, no additional
+       requirements are imposed.
+       @param errors An optional pointer to a CFErrorRef variable. If the call fails
+       (and something other than noErr is returned), and this argument is non-NULL,
+       a CFErrorRef is stored there further describing the nature and circumstances
+       of the failure. The caller must CFRelease() this error object when done with it.
+       @result If validation passes, noErr. If validation fails, an OSStatus value
+       documented in CSCommon.h or certain other Security framework headers.
+*/
+OSStatus SecCodeCheckValidity(SecCodeRef code, SecCSFlags flags,
+       SecRequirementRef requirement);
+
+OSStatus SecCodeCheckValidityWithErrors(SecCodeRef code, SecCSFlags flags,
+       SecRequirementRef requirement, CFErrorRef *errors);
+
+
+/*!
+       @function SecCodeCopyPath
+       For a given Code or StaticCode object, returns a URL to a location on disk where the
+       code object can be found. For single files, the URL points to that file.
+       For bundles, it points to the directory containing the entire bundle.
+       
+       This returns the same URL as the kSecCodeInfoMainExecutable key returned
+       by SecCodeCopySigningInformation.
+
+       @param code The Code or StaticCode object to be located. For a Code
+               argument, its StaticCode is processed as per SecCodeCopyStaticCode.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param path On successful return, contains a CFURL identifying the location
+       on disk of the staticCode object.
+       @result On success, noErr. On error, an OSStatus value
+       documented in CSCommon.h or certain other Security framework headers.
+*/
+OSStatus SecCodeCopyPath(SecStaticCodeRef staticCode, SecCSFlags flags,
+       CFURLRef *path);
+
+
+/*!
+       @function SecCodeCopyDesignatedRequirement
+       For a given Code or StaticCode object, determines its Designated Code Requirement.
+       The Designated Requirement is the SecRequirement that the code believes
+       should be used to properly identify it in the future.
+       
+       If the SecCode contains an explicit Designated Requirement, a copy of that
+       is returned. If it does not, a SecRequirement is implicitly constructed from
+       its signing authority and its embedded unique identifier. No Designated
+       Requirement can be obtained from code that is unsigned. Code that is modified
+       after signature, improperly signed, or has become invalid, may or may not yield
+       a Designated Requirement. This call does not validate the SecStaticCode argument.
+       
+       @param code The Code or StaticCode object to be interrogated. For a Code
+               argument, its StaticCode is processed as per SecCodeCopyStaticCode.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+       @param requirement On successful return, contains a copy of a SecRequirement
+       object representing the code's Designated Requirement. On error, unchanged.
+       @result On success, noErr. On error, an OSStatus value
+               documented in CSCommon.h or certain other Security framework headers.
+*/
+OSStatus SecCodeCopyDesignatedRequirement(SecStaticCodeRef code, SecCSFlags flags,
+       SecRequirementRef *requirement);
+
+
+/*
+       @function SecCodeCopySigningInformation
+       For a given Code or StaticCode object, extract various pieces of information
+       from its code signature and return them in the form of a CFDictionary. The amount
+       and detail level of the data is controlled by the flags passed to the call.
+       
+       If the code exists but is not signed at all, this call will succeed and return
+       a dictionary that does NOT contain the kSecCodeInfoIdentifier key. This is the
+       recommended way to check quickly whether a code is signed.
+       
+       If the signing data for the code is corrupt or invalid, this call may fail or it
+       may return partial data. To ensure that only valid data is returned (and errors
+       are raised for invalid data), you must successfully call one of the CheckValidity
+       functions on the code before calling CopySigningInformation.
+       
+       @param code The Code or StaticCode object to be interrogated. For a Code
+               argument, its StaticCode is processed as per SecCodeCopyStaticCode.
+               Note that dynamic information (kSecCSDynamicInformation) cannot be obtained
+               for a StaticCode argument.
+       @param flags Optional flags. Use any or all of the kSecCS*Information flags
+               to select what information to return. A generic set of entries is returned
+               regardless; you may specify kSecCSDefaultFlags for just those.
+       @param information A CFDictionary containing information about the code is stored
+               here on successful completion. The contents of the dictionary depend on
+               the flags passed. Regardless of flags, the kSecCodeInfoIdentifier key is
+               always present if the code is signed, and always absent if the code is
+               unsigned.
+               Note that some of the objects returned are (retained) "live" API objects
+               used by the code signing infrastructure. Making changes to these objects
+               is unsupported and may cause subsequent code signing operations on the
+               affected code to behave in undefined ways.
+       @result On success, noErr. On error, an OSStatus value
+               documented in CSCommon.h or certain other Security framework headers.
+               
+       Flags:
+       
+       @constant kSecCSSigningInformation Return cryptographic signing information,
+               including the certificate chain and CMS data (if any). For ad-hoc signed
+               code, there are no certificates and the CMS data is empty.
+       @constant kSecCSRequirementInformation Return information about internal code
+               requirements embedded in the code. This includes the Designated Requirement.
+       @constant kSecCSInternalInformation Return internal code signing information.
+               This information is for use by Apple, and is subject to change without notice.
+               It will not be further documented here.
+       @constant kSecCSDynamicInformation Return dynamic validity information about
+               the Code. The subject code must be a SecCodeRef (not a SecStaticCodeRef).
+       @constant kSecCSContentInformation Return more information about the file system
+               contents making up the signed code on disk. It is not generally advisable to
+               make use of this information, but some utilities (such as software-update
+               tools) may find it useful.
+       
+       Dictionary keys:
+
+       @constant kSecCodeInfoCertificates A CFArray of SecCertificates identifying the
+               certificate chain of the signing certificate as seen by the system. Absent
+               for ad-hoc signed code. May be partial or absent in error cases.
+       @constant kSecCodeInfoChangedFiles A CFArray of CFURLs identifying all files in
+               the code that may have been modified by the process of signing it. (In other
+               words, files not in this list will not have been touched by the signing operation.)
+       @constant kSecCodeInfoCMS A CFData containing the CMS cryptographic object that
+               secures the code signature. Empty for ad-hoc signed code.
+       @constant kSecCodeInfoDesignatedRequirement A SecRequirement describing the
+               actual Designated Requirement of the code.
+       @constant kSecCodeInfoEntitlements A CFData containing the embedded entitlement
+               blob of the code, if any.
+       @constant kSecCodeInfoEntitlementsDict A CFDictionary containing the embedded entitlements
+               of the code if it has entitlements and they are in standard dictionary form.
+               Absent if the code has no entitlements, or they are in a different format (in which
+               case, see kSecCodeInfoEntitlements).
+       @constant kSecCodeInfoFormat A CFString characterizing the type and format of
+               the code. Suitable for display to a (knowledeable) user.
+       @constant kSecCodeInfoDigestAlgorithm A CFNumber indicating the kind of cryptographic
+               hash function used within the signature to seal its pieces together.
+       @constant kSecCodeInfoIdentifier A CFString with the actual signing identifier
+               sealed into the signature. Absent for unsigned code.
+       @constant kSecCodeInfoImplicitDesignatedRequirement A SecRequirement describing
+               the designated requirement that the system did generate, or would have generated,
+               for the code. If the Designated Requirement was implicitly generated, this is
+               the same object as kSecCodeInfoDesignatedRequirement; this can be used to test
+               for an explicit Designated Requirement.
+       @constant kSecCodeInfoMainExecutable A CFURL identifying the main executable file
+               of the code. For single files, that is the file itself. For bundles, it is the
+               main executable as identified by its Info.plist.
+       @constant kSecCodeInfoPList A retained CFDictionary referring to the secured Info.plist
+               as seen by code signing. Absent if no Info.plist is known to the code signing
+               subsystem. Note that this is not the same dictionary as the one CFBundle would
+               give you (CFBundle is free to add entries to the on-disk plist).
+       @constant kSecCodeInfoRequirements A CFString describing the internal requirements
+               of the code in canonical syntax.
+       @constant kSecCodeInfoRequirementsData A CFData containing the internal requirements
+               of the code as a binary blob.
+       @constant kSecCodeInfoSource A CFString describing the source of the code signature
+               used for the code object. The values are meant to be shown in informational
+               displays; do not rely on the precise value returned.
+       @constant kSecCodeInfoStatus A CFNumber containing the dynamic status word of the
+               (running) code. This is a snapshot at the time the API is executed and may be
+               out of date by the time you examine it. Do note however that most of the bits
+               are sticky and thus some values are permanently reliable. Be careful.
+       @constant kSecCodeInfoTime A CFDate describing the signing date (securely) embedded
+               in the code signature. Note that a signer is able to omit this date or pre-date
+               it. Nobody certifies that this was really the date the code was signed; however,
+               you do know that this is the date the signer wanted you to see.
+               Ad-hoc signatures have no CMS and thus never have secured signing dates.
+       @constant kSecCodeInfoTimestamp A CFDate describing the signing date as (securely)
+               certified by a timestamp authority service. This time cannot be falsified by the
+               signer; you trust the timestamp authority's word on this.
+               Ad-hoc signatures have no CMS and thus never have secured signing dates.
+       @constant kSecCodeInfoTrust The (retained) SecTrust object the system uses to
+               evaluate the validity of the code's signature. You may use the SecTrust API
+               to extract detailed information, particularly for reasons why certificate
+               validation may have failed. This object may continue to be used for further
+               evaluations of this code; if you make any changes to it, behavior is undefined.
+       @constant kSecCodeInfoUnique A CFData binary identifier that uniquely identifies
+               the static code in question. It can be used to recognize this particular code
+               (and none other) now or in the future. Compare to kSecCodeInfoIdentifier, which
+               remains stable across (developer-approved) updates.
+               This is currently the SHA-1 hash of the code's CodeDirectory. However, future
+               versions of the system may use a different algorithm for newly signed code.
+               Already-signed code not change the reported value in this case.
+       @constant kSecCodeSignerFlags A CFNumber with the dynamic state of the object.
+               Contants are defined by the type SecCodeSignatureFlags.
+ */
+enum {
+       kSecCSInternalInformation = 1 << 0,
+       kSecCSSigningInformation = 1 << 1,
+       kSecCSRequirementInformation = 1 << 2,
+       kSecCSDynamicInformation = 1 << 3,
+       kSecCSContentInformation = 1 << 4
+};
+
+                                                                                                       /* flag required to get this value */
+extern const CFStringRef kSecCodeInfoCertificates;     /* Signing */
+extern const CFStringRef kSecCodeInfoChangedFiles;     /* Content */
+extern const CFStringRef kSecCodeInfoCMS;                      /* Signing */
+extern const CFStringRef kSecCodeInfoDesignatedRequirement; /* Requirement */
+extern const CFStringRef kSecCodeInfoEntitlements;     /* Requirement */
+extern const CFStringRef kSecCodeInfoEntitlementsDict; /* Requirement */
+extern const CFStringRef kSecCodeInfoFormat;           /* generic */
+extern const CFStringRef kSecCodeInfoDigestAlgorithm; /* generic */
+extern const CFStringRef kSecCodeInfoIdentifier;       /* generic */
+extern const CFStringRef kSecCodeInfoImplicitDesignatedRequirement; /* Requirement */
+extern const CFStringRef kSecCodeInfoMainExecutable; /* generic */
+extern const CFStringRef kSecCodeInfoPList;                    /* generic */
+extern const CFStringRef kSecCodeInfoRequirements;     /* Requirement */
+extern const CFStringRef kSecCodeInfoRequirementData; /* Requirement */
+extern const CFStringRef kSecCodeInfoSource;           /* generic */
+extern const CFStringRef kSecCodeInfoStatus;           /* Dynamic */
+extern const CFStringRef kSecCodeInfoTime;                     /* Signing */
+extern const CFStringRef kSecCodeInfoTimestamp;                /* Signing */
+extern const CFStringRef kSecCodeInfoTrust;                    /* Signing */
+extern const CFStringRef kSecCodeInfoUnique;           /* generic */
+extern const CFStringRef kSecCodeSignerFlags;          /* dynamic */
+
+OSStatus SecCodeCopySigningInformation(SecStaticCodeRef code, SecCSFlags flags,
+       CFDictionaryRef *information);
+
+
+/*
+       @function SecCodeMapMemory
+       For a given Code or StaticCode object, ask the kernel to accept the signing information
+       currently attached to it in the caller and use it to validate memory page-ins against it,
+       updating dynamic validity state accordingly. This change affects all processes that have
+       the main executable of this code mapped.
+       
+       @param code A Code or StaticCode object representing the signed code whose main executable
+               should be subject to page-in validation.
+       @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
+ */
+OSStatus SecCodeMapMemory(SecStaticCodeRef code, SecCSFlags flags);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_H_SECCODE