]> git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_codesigning/lib/SecCode.h
Security-58286.1.32.tar.gz
[apple/security.git] / OSX / libsecurity_codesigning / lib / SecCode.h
1 /*
2 * Copyright (c) 2006-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 /*!
25 @header SecCode
26 SecCode represents separately indentified running code in the system.
27 In addition to UNIX processes, this can also include (with suitable support)
28 scripts, applets, widgets, etc.
29 */
30 #ifndef _H_SECCODE
31 #define _H_SECCODE
32
33 #include <Security/CSCommon.h>
34 #include <CoreFoundation/CFBase.h>
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 CF_ASSUME_NONNULL_BEGIN
41
42 /*!
43 @function SecCodeGetTypeID
44 Returns the type identifier of all SecCode instances.
45 */
46 CFTypeID SecCodeGetTypeID(void);
47
48
49 /*!
50 @function SecCodeCopySelf
51 Obtains a SecCode object for the code making the call.
52 The calling code is determined in a way that is subject to modification over
53 time, but obeys the following rules. If it is a UNIX process, its process id (pid)
54 is always used. If it is an active code host that has a dedicated guest, such a guest
55 is always preferred. If it is a host that has called SecHostSelectGuest, such selection
56 is considered until revoked.
57
58 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
59 @param self Upon successful return, contains a SecCodeRef representing the caller.
60
61 @result Upon success, errSecSuccess. Upon error, an OSStatus value documented in
62 CSCommon.h or certain other Security framework headers.
63 */
64 OSStatus SecCodeCopySelf(SecCSFlags flags, SecCodeRef * __nonnull CF_RETURNS_RETAINED self);
65
66
67 /*!
68 @function SecCodeCopyStaticCode
69 Given a SecCode object, locate its origin in the file system and return
70 a SecStaticCode object representing it.
71
72 The link established by this call is generally reliable but is NOT guaranteed
73 to be secure.
74
75 Many API functions taking SecStaticCodeRef arguments will also directly
76 accept a SecCodeRef and apply this translation implicitly, operating on
77 its result or returning its error code if any. Each of these functions
78 calls out that behavior in its documentation.
79
80 If the code was obtained from a universal (aka "fat") program file,
81 the resulting SecStaticCodeRef will refer only to the architecture actually
82 being used. This means that multiple running codes started from the same file
83 may conceivably result in different static code references if they ended up
84 using different execution architectures. (This is unusual but possible.)
85
86 @param code A valid SecCode object reference representing code running
87 on the system.
88
89 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
90 @constant kSecCSUseAllArchitectures
91 If code refers to a single architecture of a universal binary, return a SecStaticCodeRef
92 that refers to the entire universal code with all its architectures. By default, the
93 returned static reference identifies only the actual architecture of the running program.
94
95 @param staticCode On successful return, a SecStaticCode object reference representing
96 the file system origin of the given SecCode. On error, unchanged.
97 @result Upon success, errSecSuccess. Upon error, an OSStatus value documented in
98 CSCommon.h or certain other Security framework headers.
99 */
100 CF_ENUM(uint32_t) {
101 kSecCSUseAllArchitectures = 1 << 0,
102 };
103
104 OSStatus SecCodeCopyStaticCode(SecCodeRef code, SecCSFlags flags, SecStaticCodeRef * __nonnull CF_RETURNS_RETAINED staticCode);
105
106
107 /*!
108 @function SecCodeCopyHost
109 Given a SecCode object, identify the (different) SecCode object that acts
110 as its host. A SecCode's host acts as a supervisor and controller,
111 and is the ultimate authority on the its dynamic validity and status.
112 The host relationship is securely established (absent reported errors).
113
114 @param guest A valid SecCode object reference representing code running
115 on the system.
116 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
117 @param host On successful return, a SecCode object reference identifying
118 the code's host.
119 @result Upon success, errSecSuccess. Upon error, an OSStatus value documented in
120 CSCommon.h or certain other Security framework headers.
121 */
122 OSStatus SecCodeCopyHost(SecCodeRef guest, SecCSFlags flags, SecCodeRef * __nonnull CF_RETURNS_RETAINED host);
123
124 extern const CFStringRef kSecGuestAttributeCanonical;
125 extern const CFStringRef kSecGuestAttributeHash;
126 extern const CFStringRef kSecGuestAttributeMachPort;
127 extern const CFStringRef kSecGuestAttributePid;
128 extern const CFStringRef kSecGuestAttributeAudit;
129 extern const CFStringRef kSecGuestAttributeDynamicCode;
130 extern const CFStringRef kSecGuestAttributeDynamicCodeInfoPlist;
131 extern const CFStringRef kSecGuestAttributeArchitecture;
132 extern const CFStringRef kSecGuestAttributeSubarchitecture;
133
134 /*!
135 @function SecCodeCopyGuestWithAttributes
136 This is the omnibus API function for obtaining dynamic code references.
137 In general, it asks a particular code acting as a code host to locate
138 and return a guest with given attributes. Different hosts support
139 different combinations of attributes and values for guest selection.
140
141 Asking the NULL host invokes system default procedures for obtaining
142 any running code in the system with the attributes given. The returned
143 code may be anywhere in the system.
144
145 The methods a host uses to identify, separate, and control its guests
146 are specific to each type of host. This call provides a generic abstraction layer
147 that allows uniform interrogation of all hosts. A SecCode that does not
148 act as a host will always return errSecCSNoSuchCode. A SecCode that does
149 support hosting may return itself to signify that the attribute refers to
150 itself rather than one of its hosts.
151
152 @param host A valid SecCode object reference representing code running
153 on the system that acts as a Code Signing host. As a special case, passing
154 NULL indicates that the Code Signing root of trust should be used as a starting
155 point. Currently, that is the system kernel.
156 @param attributes A CFDictionary containing zero or more attribute selector
157 values. Each selector has a CFString key and associated CFTypeRef value.
158 The key name identifies the attribute being specified; the associated value,
159 whose type depends on the the key name, selects a particular value or other
160 constraint on that attribute. Each host only supports particular combinations
161 of keys and values, and errors will be returned if any unsupported set is requested.
162 As a special case, NULL is taken to mean an empty attribute set.
163 Note that some hosts that support hosting chains (guests being hosts)
164 may return sub-guests in this call. In other words, do not assume that
165 a SecCodeRef returned by this call is a direct guest of the queried host
166 (though it will be a proximate guest, i.e. a guest's guest some way down).
167 Asking the NULL host for NULL attributes returns a code reference for the system root
168 of trust (at present, the running Darwin kernel).
169 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
170 @param guest On successful return, a SecCode object reference identifying
171 the particular guest of the host that owns the attribute value(s) specified.
172 This argument will not be changed if the call fails (does not return errSecSuccess).
173 @result Upon success, errSecSuccess. Upon error, an OSStatus value documented in
174 CSCommon.h or certain other Security framework headers. In particular:
175 @error errSecCSUnsupportedGuestAttributes The host does not support the attribute
176 type given by attributeType.
177 @error errSecCSInvalidAttributeValues The type of value given for a guest
178 attribute is not supported by the host.
179 @error errSecCSNoSuchCode The host has no guest with the attribute value given
180 by attributeValue, even though the value is of a supported type. This may also
181 be returned if the host code does not currently act as a Code Signing host.
182 @error errSecCSNotAHost The specified host cannot, in fact, act as a code
183 host. (It is missing the kSecCodeSignatureHost option flag in its code
184 signature.)
185 @error errSecCSMultipleGuests The attributes specified do not uniquely identify
186 a guest (the specification is ambiguous).
187 */
188
189 OSStatus SecCodeCopyGuestWithAttributes(SecCodeRef __nullable host,
190 CFDictionaryRef __nullable attributes, SecCSFlags flags, SecCodeRef * __nonnull CF_RETURNS_RETAINED guest);
191
192
193 /*!
194 @function SecCodeCheckValidity
195 Performs dynamic validation of the given SecCode object. The call obtains and
196 verifies the signature on the code object. It checks the validity of only those
197 sealed components required to establish identity. It checks the SecCode's
198 dynamic validity status as reported by its host. It ensures that the SecCode's
199 host is in turn valid. Finally, it validates the code against a SecRequirement
200 if one is given. The call succeeds if all these conditions are satisfactory.
201 It fails otherwise.
202
203 This call is secure against attempts to modify the file system source of the
204 SecCode.
205
206 @param code The code object to be validated.
207 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
208 @param requirement An optional code requirement specifying additional conditions
209 the code object must satisfy to be considered valid. If NULL, no additional
210 requirements are imposed.
211 @result If validation passes, errSecSuccess. If validation fails, an OSStatus value
212 documented in CSCommon.h or certain other Security framework headers.
213 */
214 OSStatus SecCodeCheckValidity(SecCodeRef code, SecCSFlags flags,
215 SecRequirementRef __nullable requirement);
216
217 /*!
218 @function SecCodeCheckValidityWifErrors
219 Performs dynamic validation of the given SecCode object. The call obtains and
220 verifies the signature on the code object. It checks the validity of only those
221 sealed components required to establish identity. It checks the SecCode's
222 dynamic validity status as reported by its host. It ensures that the SecCode's
223 host is in turn valid. Finally, it validates the code against a SecRequirement
224 if one is given. The call succeeds if all these conditions are satisfactory.
225 It fails otherwise.
226
227 This call is secure against attempts to modify the file system source of the
228 SecCode.
229
230 @param code The code object to be validated.
231 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
232 @param requirement An optional code requirement specifying additional conditions
233 the code object must satisfy to be considered valid. If NULL, no additional
234 requirements are imposed.
235 @param errors An optional pointer to a CFErrorRef variable. If the call fails
236 (and something other than errSecSuccess is returned), and this argument is non-NULL,
237 a CFErrorRef is stored there further describing the nature and circumstances
238 of the failure. The caller must CFRelease() this error object when done with it.
239 @result If validation passes, errSecSuccess. If validation fails, an OSStatus value
240 documented in CSCommon.h or certain other Security framework headers.
241 */
242 OSStatus SecCodeCheckValidityWithErrors(SecCodeRef code, SecCSFlags flags,
243 SecRequirementRef __nullable requirement, CFErrorRef *errors);
244
245
246 /*!
247 @function SecCodeCopyPath
248 For a given Code or StaticCode object, returns a URL to a location on disk where the
249 code object can be found. For single files, the URL points to that file.
250 For bundles, it points to the directory containing the entire bundle.
251
252 @param staticCode The Code or StaticCode object to be located. For a Code
253 argument, its StaticCode is processed as per SecCodeCopyStaticCode.
254 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
255 @param path On successful return, contains a CFURL identifying the location
256 on disk of the staticCode object.
257 @result On success, errSecSuccess. On error, an OSStatus value
258 documented in CSCommon.h or certain other Security framework headers.
259 */
260 OSStatus SecCodeCopyPath(SecStaticCodeRef staticCode, SecCSFlags flags,
261 CFURLRef * __nonnull CF_RETURNS_RETAINED path);
262
263
264 /*!
265 @function SecCodeCopyDesignatedRequirement
266 For a given Code or StaticCode object, determines its Designated Code Requirement.
267 The Designated Requirement is the SecRequirement that the code believes
268 should be used to properly identify it in the future.
269
270 If the SecCode contains an explicit Designated Requirement, a copy of that
271 is returned. If it does not, a SecRequirement is implicitly constructed from
272 its signing authority and its embedded unique identifier. No Designated
273 Requirement can be obtained from code that is unsigned. Code that is modified
274 after signature, improperly signed, or has become invalid, may or may not yield
275 a Designated Requirement. This call does not validate the SecStaticCode argument.
276
277 @param code The Code or StaticCode object to be interrogated. For a Code
278 argument, its StaticCode is processed as per SecCodeCopyStaticCode.
279 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
280 @param requirement On successful return, contains a copy of a SecRequirement
281 object representing the code's Designated Requirement. On error, unchanged.
282 @result On success, errSecSuccess. On error, an OSStatus value
283 documented in CSCommon.h or certain other Security framework headers.
284 */
285 OSStatus SecCodeCopyDesignatedRequirement(SecStaticCodeRef code, SecCSFlags flags,
286 SecRequirementRef * __nonnull CF_RETURNS_RETAINED requirement);
287
288
289 /*
290 @function SecCodeCopySigningInformation
291 For a given Code or StaticCode object, extract various pieces of information
292 from its code signature and return them in the form of a CFDictionary. The amount
293 and detail level of the data is controlled by the flags passed to the call.
294
295 If the code exists but is not signed at all, this call will succeed and return
296 a dictionary that does NOT contain the kSecCodeInfoIdentifier key. This is the
297 recommended way to check quickly whether a code is signed.
298
299 If the signing data for the code is corrupt or invalid, this call may fail or it
300 may return partial data. To ensure that only valid data is returned (and errors
301 are raised for invalid data), you must successfully call one of the CheckValidity
302 functions on the code before calling CopySigningInformation.
303
304 @param code The Code or StaticCode object to be interrogated. For a Code
305 argument, its StaticCode is processed as per SecCodeCopyStaticCode.
306 Note that dynamic information (kSecCSDynamicInformation) cannot be obtained
307 for a StaticCode argument.
308 @param flags Optional flags. Use any or all of the kSecCS*Information flags
309 to select what information to return. A generic set of entries is returned
310 regardless; you may specify kSecCSDefaultFlags for just those.
311 @param information A CFDictionary containing information about the code is stored
312 here on successful completion. The contents of the dictionary depend on
313 the flags passed. Regardless of flags, the kSecCodeInfoIdentifier key is
314 always present if the code is signed, and always absent if the code is
315 unsigned.
316 Note that some of the objects returned are (retained) "live" API objects
317 used by the code signing infrastructure. Making changes to these objects
318 is unsupported and may cause subsequent code signing operations on the
319 affected code to behave in undefined ways.
320 @result On success, errSecSuccess. On error, an OSStatus value
321 documented in CSCommon.h or certain other Security framework headers.
322
323 Flags:
324
325 @constant kSecCSSigningInformation Return cryptographic signing information,
326 including the certificate chain and CMS data (if any). For ad-hoc signed
327 code, there are no certificates and the CMS data is empty.
328 @constant kSecCSRequirementInformation Return information about internal code
329 requirements embedded in the code. This includes the Designated Requirement.
330 @constant kSecCSInternalInformation Return internal code signing information.
331 This information is for use by Apple, and is subject to change without notice.
332 It will not be further documented here.
333 @constant kSecCSDynamicInformation Return dynamic validity information about
334 the Code. The subject code must be a SecCodeRef (not a SecStaticCodeRef).
335 @constant kSecCSContentInformation Return more information about the file system
336 contents making up the signed code on disk. It is not generally advisable to
337 make use of this information, but some utilities (such as software-update
338 tools) may find it useful.
339
340 Dictionary keys:
341
342 @constant kSecCodeInfoCertificates A CFArray of SecCertificates identifying the
343 certificate chain of the signing certificate as seen by the system. Absent
344 for ad-hoc signed code. May be partial or absent in error cases.
345 @constant kSecCodeInfoChangedFiles A CFArray of CFURLs identifying all files in
346 the code that may have been modified by the process of signing it. (In other
347 words, files not in this list will not have been touched by the signing operation.)
348 @constant kSecCodeInfoCMS A CFData containing the CMS cryptographic object that
349 secures the code signature. Empty for ad-hoc signed code.
350 @constant kSecCodeInfoDesignatedRequirement A SecRequirement describing the
351 actual Designated Requirement of the code.
352 @constant kSecCodeInfoEntitlements A CFData containing the embedded entitlement
353 blob of the code, if any.
354 @constant kSecCodeInfoEntitlementsDict A CFDictionary containing the embedded entitlements
355 of the code if it has entitlements and they are in standard dictionary form.
356 Absent if the code has no entitlements, or they are in a different format (in which
357 case, see kSecCodeInfoEntitlements).
358 @constant kSecCodeInfoFlags A CFNumber with the static (on-disk) state of the object.
359 Contants are defined by the type SecCodeSignatureFlags.
360 @constant kSecCodeInfoFormat A CFString characterizing the type and format of
361 the code. Suitable for display to a (knowledeable) user.
362 @constant kSecCodeInfoDigestAlgorithm A CFNumber indicating the kind of cryptographic
363 hash function chosen to establish integrity of the signature on this system, which
364 is the best supported algorithm from kSecCodeInfoDigestAlgorithms.
365 @constant kSecCodeInfoDigestAlgorithms A CFArray of CFNumbers indicating the kinds of
366 cryptographic hash functions available within the signature. The ordering of those items
367 has no significance in terms of priority, but determines the order in which
368 the hashes appear in kSecCodeInfoCdHashes.
369 @constant kSecCodeInfoPlatformIdentifier If this code was signed as part of an operating
370 system release, this value identifies that release.
371 @constant kSecCodeInfoIdentifier A CFString with the actual signing identifier
372 sealed into the signature. Absent for unsigned code.
373 @constant kSecCodeInfoImplicitDesignatedRequirement A SecRequirement describing
374 the designated requirement that the system did generate, or would have generated,
375 for the code. If the Designated Requirement was implicitly generated, this is
376 the same object as kSecCodeInfoDesignatedRequirement; this can be used to test
377 for an explicit Designated Requirement.
378 @constant kSecCodeInfoMainExecutable A CFURL identifying the main executable file
379 of the code. For single files, that is the file itself. For bundles, it is the
380 main executable as identified by its Info.plist.
381 @constant kSecCodeInfoPList A retained CFDictionary referring to the secured Info.plist
382 as seen by code signing. Absent if no Info.plist is known to the code signing
383 subsystem. Note that this is not the same dictionary as the one CFBundle would
384 give you (CFBundle is free to add entries to the on-disk plist).
385 @constant kSecCodeInfoRequirements A CFString describing the internal requirements
386 of the code in canonical syntax.
387 @constant kSecCodeInfoRequirementsData A CFData containing the internal requirements
388 of the code as a binary blob.
389 @constant kSecCodeInfoSource A CFString describing the source of the code signature
390 used for the code object. The values are meant to be shown in informational
391 displays; do not rely on the precise value returned.
392 @constant kSecCodeInfoStatus A CFNumber containing the dynamic status word of the
393 (running) code. This is a snapshot at the time the API is executed and may be
394 out of date by the time you examine it. Do note however that most of the bits
395 are sticky and thus some values are permanently reliable. Be careful.
396 @constant kSecCodeInfoTime A CFDate describing the signing date (securely) embedded
397 in the code signature. Note that a signer is able to omit this date or pre-date
398 it. Nobody certifies that this was really the date the code was signed; however,
399 you do know that this is the date the signer wanted you to see.
400 Ad-hoc signatures have no CMS and thus never have secured signing dates.
401 @constant kSecCodeInfoTimestamp A CFDate describing the signing date as (securely)
402 certified by a timestamp authority service. This time cannot be falsified by the
403 signer; you trust the timestamp authority's word on this.
404 Ad-hoc signatures have no CMS and thus never have secured signing dates.
405 @constant kSecCodeInfoTrust The (retained) SecTrust object the system uses to
406 evaluate the validity of the code's signature. You may use the SecTrust API
407 to extract detailed information, particularly for reasons why certificate
408 validation may have failed. This object may continue to be used for further
409 evaluations of this code; if you make any changes to it, behavior is undefined.
410 @constant kSecCodeInfoUnique A CFData binary identifier that uniquely identifies
411 the static code in question. It can be used to recognize this particular code
412 (and none other) now or in the future. Compare to kSecCodeInfoIdentifier, which
413 remains stable across (developer-approved) updates.
414 The algorithm used may change from time to time. However, for any existing signature,
415 the value is stable.
416 @constant kSecCodeInfoCdHashes An array containing the values of the kSecCodeInfoUnique
417 binary identifier for every digest algorithm supported in the signature, in the same
418 order as in the kSecCodeInfoDigestAlgorithms array. The kSecCodeInfoUnique value
419 will be contained in this array, and be the one corresponding to the
420 kSecCodeInfoDigestAlgorithm value.
421 */
422 CF_ENUM(uint32_t) {
423 kSecCSInternalInformation = 1 << 0,
424 kSecCSSigningInformation = 1 << 1,
425 kSecCSRequirementInformation = 1 << 2,
426 kSecCSDynamicInformation = 1 << 3,
427 kSecCSContentInformation = 1 << 4,
428 kSecCSSkipResourceDirectory = 1 << 5
429 };
430 /* flag required to get this value */
431 extern const CFStringRef kSecCodeInfoCertificates; /* Signing */
432 extern const CFStringRef kSecCodeInfoChangedFiles; /* Content */
433 extern const CFStringRef kSecCodeInfoCMS; /* Signing */
434 extern const CFStringRef kSecCodeInfoDesignatedRequirement; /* Requirement */
435 extern const CFStringRef kSecCodeInfoEntitlements; /* generic */
436 extern const CFStringRef kSecCodeInfoEntitlementsDict; /* generic */
437 extern const CFStringRef kSecCodeInfoFlags; /* generic */
438 extern const CFStringRef kSecCodeInfoFormat; /* generic */
439 extern const CFStringRef kSecCodeInfoDigestAlgorithm; /* generic */
440 extern const CFStringRef kSecCodeInfoDigestAlgorithms; /* generic */
441 extern const CFStringRef kSecCodeInfoPlatformIdentifier; /* generic */
442 extern const CFStringRef kSecCodeInfoIdentifier; /* generic */
443 extern const CFStringRef kSecCodeInfoImplicitDesignatedRequirement; /* Requirement */
444 extern const CFStringRef kSecCodeInfoMainExecutable; /* generic */
445 extern const CFStringRef kSecCodeInfoPList; /* generic */
446 extern const CFStringRef kSecCodeInfoRequirements; /* Requirement */
447 extern const CFStringRef kSecCodeInfoRequirementData; /* Requirement */
448 extern const CFStringRef kSecCodeInfoSource; /* generic */
449 extern const CFStringRef kSecCodeInfoStatus; /* Dynamic */
450 extern const CFStringRef kSecCodeInfoTeamIdentifier; /* Signing */
451 extern const CFStringRef kSecCodeInfoTime; /* Signing */
452 extern const CFStringRef kSecCodeInfoTimestamp; /* Signing */
453 extern const CFStringRef kSecCodeInfoTrust; /* Signing */
454 extern const CFStringRef kSecCodeInfoUnique; /* generic */
455 extern const CFStringRef kSecCodeInfoCdHashes; /* generic */
456
457 OSStatus SecCodeCopySigningInformation(SecStaticCodeRef code, SecCSFlags flags,
458 CFDictionaryRef * __nonnull CF_RETURNS_RETAINED information);
459
460
461 /*
462 @function SecCodeMapMemory
463 For a given Code or StaticCode object, ask the kernel to accept the signing information
464 currently attached to it in the caller and use it to validate memory page-ins against it,
465 updating dynamic validity state accordingly. This change affects all processes that have
466 the main executable of this code mapped.
467
468 @param code A Code or StaticCode object representing the signed code whose main executable
469 should be subject to page-in validation.
470 @param flags Optional flags. Pass kSecCSDefaultFlags for standard behavior.
471 */
472 OSStatus SecCodeMapMemory(SecStaticCodeRef code, SecCSFlags flags);
473
474 CF_ASSUME_NONNULL_END
475
476 #ifdef __cplusplus
477 }
478 #endif
479
480 #endif //_H_SECCODE