dyld-655.1.tar.gz
[apple/dyld.git] / dyld3 / CodeSigningTypes.h
1 /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
2 *
3 * Copyright (c) 2015 Apple Inc. All rights reserved.
4 *
5 * @APPLE_LICENSE_HEADER_START@
6 *
7 * This file contains Original Code and/or Modifications of Original Code
8 * as defined in and that are subject to the Apple Public Source License
9 * Version 2.0 (the 'License'). You may not use this file except in
10 * compliance with the License. Please obtain a copy of the License at
11 * http://www.opensource.apple.com/apsl/ and read it before using this
12 * file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
19 * Please see the License for the specific language governing rights and
20 * limitations under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24
25 #ifndef _CODE_SIGNING_TYPES_
26 #define _CODE_SIGNING_TYPES_
27
28 #include <stdint.h>
29 #include <stddef.h>
30
31
32 //
33 // Magic numbers used by Code Signing
34 //
35 enum {
36 CSMAGIC_REQUIREMENT = 0xfade0c00, // single Requirement blob
37 CSMAGIC_REQUIREMENTS = 0xfade0c01, // Requirements vector (internal requirements)
38 CSMAGIC_CODEDIRECTORY = 0xfade0c02, // CodeDirectory blob
39 CSMAGIC_EMBEDDED_SIGNATURE = 0xfade0cc0, // embedded form of signature data
40 CSMAGIC_DETACHED_SIGNATURE = 0xfade0cc1, // multi-arch collection of embedded signatures
41 CSMAGIC_BLOBWRAPPER = 0xfade0b01, // used for the cms blob
42 };
43
44 enum {
45 CS_PAGE_SIZE = 4096,
46
47 CS_HASHTYPE_SHA1 = 1,
48 CS_HASHTYPE_SHA256 = 2,
49 CS_HASHTYPE_SHA256_TRUNCATED = 3,
50 CS_HASHTYPE_SHA384 = 4,
51
52 CS_HASH_SIZE_SHA1 = 20,
53 CS_HASH_SIZE_SHA256 = 32,
54 CS_HASH_SIZE_SHA256_TRUNCATED = 20,
55
56 CSSLOT_CODEDIRECTORY = 0,
57 CSSLOT_INFOSLOT = 1,
58 CSSLOT_REQUIREMENTS = 2,
59 CSSLOT_RESOURCEDIR = 3,
60 CSSLOT_APPLICATION = 4,
61 CSSLOT_ENTITLEMENTS = 5,
62 CSSLOT_ALTERNATE_CODEDIRECTORIES = 0x1000,
63 CSSLOT_ALTERNATE_CODEDIRECTORY_MAX = 5,
64 CSSLOT_ALTERNATE_CODEDIRECTORY_LIMIT =
65 CSSLOT_ALTERNATE_CODEDIRECTORIES + CSSLOT_ALTERNATE_CODEDIRECTORY_MAX,
66 CSSLOT_CMS_SIGNATURE = 0x10000,
67
68 kSecCodeSignatureAdhoc = 2
69 };
70
71 enum {
72 CS_REQUIRE_LV = 0x0002000 // require library validation
73 };
74
75 //
76 // Structure of a SuperBlob
77 //
78 struct CS_BlobIndex {
79 uint32_t type; // type of entry
80 uint32_t offset; // offset of entry
81 };
82
83 struct CS_SuperBlob {
84 uint32_t magic; // magic number
85 uint32_t length; // total length of SuperBlob
86 uint32_t count; // number of index entries following
87 CS_BlobIndex index[]; // (count) entries
88 // followed by Blobs in no particular order as indicated by offsets in index
89 };
90
91 //
92 // C form of a CodeDirectory.
93 //
94 struct CS_CodeDirectory {
95 uint32_t magic; // magic number (CSMAGIC_CODEDIRECTORY) */
96 uint32_t length; // total length of CodeDirectory blob
97 uint32_t version; // compatibility version
98 uint32_t flags; // setup and mode flags
99 uint32_t hashOffset; // offset of hash slot element at index zero
100 uint32_t identOffset; // offset of identifier string
101 uint32_t nSpecialSlots; // number of special hash slots
102 uint32_t nCodeSlots; // number of ordinary (code) hash slots
103 uint32_t codeLimit; // limit to main image signature range
104 uint8_t hashSize; // size of each hash in bytes
105 uint8_t hashType; // type of hash (cdHashType* constants)
106 uint8_t platform; // platform identifier; zero if not platform binary
107 uint8_t pageSize; // log2(page size in bytes); 0 => infinite
108 uint32_t spare2; // unused (must be zero)
109
110 char end_earliest[0];
111
112 /* Version 0x20100 */
113 uint32_t scatterOffset; /* offset of optional scatter vector */
114 char end_withScatter[0];
115
116 /* Version 0x20200 */
117 uint32_t teamOffset; /* offset of optional team identifier */
118 char end_withTeam[0];
119
120 /* Version 0x20300 */
121 uint32_t spare3; /* unused (must be zero) */
122 uint64_t codeLimit64; /* limit to main image signature range, 64 bits */
123 char end_withCodeLimit64[0];
124
125 /* Version 0x20400 */
126 uint64_t execSegBase; /* offset of executable segment */
127 uint64_t execSegLimit; /* limit of executable segment */
128 uint64_t execSegFlags; /* exec segment flags */
129 char end_withExecSeg[0];
130
131 /* followed by dynamic content as located by offset fields above */
132 };
133
134 struct CS_Blob {
135 uint32_t magic; // magic number
136 uint32_t length; // total length of blob
137 };
138
139 struct CS_RequirementsBlob {
140 uint32_t magic; // magic number
141 uint32_t length; // total length of blob
142 uint32_t data; // zero for dyld shared cache
143 };
144
145
146 struct CS_Scatter {
147 uint32_t count; // number of pages; zero for sentinel (only)
148 uint32_t base; // first page number
149 uint64_t targetOffset; // byte offset in target
150 uint64_t spare; // reserved (must be zero)
151 };
152
153
154 #endif // _CODE_SIGNING_TYPES_
155
156
157