1use shared::guiddef::GUID;
8use shared::minwindef::{BOOL, BYTE, DWORD, LPVOID};
9use um::mscat::{CRYPTCATMEMBER, CRYPTCATSTORE};
10use um::wincrypt::{
11 CRYPT_ALGORITHM_IDENTIFIER, CRYPT_ATTRIBUTE_TYPE_VALUE, CRYPT_HASH_BLOB, HCRYPTPROV,
12};
13use um::winnt::{HANDLE, LPCWSTR, PWSTR, WCHAR};
14pub type CRYPT_DIGEST_DATA = CRYPT_HASH_BLOB;
15pub const MSSIP_FLAGS_PROHIBIT_RESIZE_ON_CREATE: DWORD = 0x00010000;
16pub const MSSIP_FLAGS_USE_CATALOG: DWORD = 0x00020000;
17pub const MSSIP_FLAGS_MULTI_HASH: DWORD = 0x00040000;
18pub const SPC_INC_PE_RESOURCES_FLAG: DWORD = 0x80;
19pub const SPC_INC_PE_DEBUG_INFO_FLAG: DWORD = 0x40;
20pub const SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG: DWORD = 0x20;
21pub const SPC_EXC_PE_PAGE_HASHES_FLAG: DWORD = 0x10;
22pub const SPC_INC_PE_PAGE_HASHES_FLAG: DWORD = 0x100;
23pub const SPC_DIGEST_GENERATE_FLAG: DWORD = 0x200;
24pub const SPC_DIGEST_SIGN_FLAG: DWORD = 0x400;
25pub const SPC_RELAXED_PE_MARKER_CHECK: DWORD = 0x800;
26pub const SPC_MARKER_CHECK_SKIP_SIP_INDIRECT_DATA_FLAG: DWORD = 0x00000001;
27pub const SPC_MARKER_CHECK_CURRENTLY_SUPPORTED_FLAGS: DWORD
28 = SPC_MARKER_CHECK_SKIP_SIP_INDIRECT_DATA_FLAG;
29pub const MSSIP_ADDINFO_NONE: DWORD = 0;
30pub const MSSIP_ADDINFO_FLAT: DWORD = 1;
31pub const MSSIP_ADDINFO_CATMEMBER: DWORD = 2;
32pub const MSSIP_ADDINFO_BLOB: DWORD = 3;
33pub const MSSIP_ADDINFO_NONMSSIP: DWORD = 500;
34UNION!{union SIP_SUBJECTINFO_u {
35 [usize; 1],
36 psFlat psFlat_mut: *mut MS_ADDINFO_FLAT,
37 psCatMember psCatMember_mut: *mut MS_ADDINFO_CATALOGMEMBER,
38 psBlob psBlob_mut: *mut MS_ADDINFO_BLOB,
39}}
40STRUCT!{struct SIP_SUBJECTINFO {
41 cbSize: DWORD,
42 pgSubjectType: *mut GUID,
43 hFile: HANDLE,
44 pwsFileName: LPCWSTR,
45 pwsDisplayName: LPCWSTR,
46 dwReserved1: DWORD,
47 dwIntVersion: DWORD,
48 hProv: HCRYPTPROV,
49 DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER,
50 dwFlags: DWORD,
51 dwEncodingType: DWORD,
52 dwReserved2: DWORD,
53 fdwCAPISettings: DWORD,
54 fdwSecuritySettings: DWORD,
55 dwIndex: DWORD,
56 dwUnionChoice: DWORD,
57 u: SIP_SUBJECTINFO_u,
58 pClientData: LPVOID,
59}}
60pub type LPSIP_SUBJECTINFO = *mut SIP_SUBJECTINFO;
61STRUCT!{struct MS_ADDINFO_FLAT {
62 cbStruct: DWORD,
63 pIndirectData: *mut SIP_INDIRECT_DATA,
64}}
65pub type PMS_ADDINFO_FLAT = *mut MS_ADDINFO_FLAT;
66STRUCT!{struct MS_ADDINFO_CATALOGMEMBER {
67 cbStruct: DWORD,
68 pStore: *mut CRYPTCATSTORE,
69 pMember: *mut CRYPTCATMEMBER,
70}}
71pub type PMS_ADDINFO_CATALOGMEMBER = *mut MS_ADDINFO_CATALOGMEMBER;
72STRUCT!{struct MS_ADDINFO_BLOB {
73 cbStruct: DWORD,
74 cbMemObject: DWORD,
75 pbMemObject: *mut BYTE,
76 cbMemSignedMsg: DWORD,
77 pbMemSignedMsg: *mut BYTE,
78}}
79pub type PMS_ADDINFO_BLOB = *mut MS_ADDINFO_BLOB;
80STRUCT!{struct SIP_CAP_SET_V2 {
81 cbSize: DWORD,
82 dwVersion: DWORD,
83 isMultiSign: BOOL,
84 dwReserved: DWORD,
85}}
86pub type PSIP_CAP_SET_V2 = *mut SIP_CAP_SET_V2;
87UNION!{union SIP_CAP_SET_V3_u {
88 [u32; 1],
89 dwFlags dwFlags_mut: DWORD,
90 dwReserved dwReserved_mut: DWORD,
91}}
92STRUCT!{struct SIP_CAP_SET_V3 {
93 cbSize: DWORD,
94 dwVersion: DWORD,
95 isMultiSign: BOOL,
96 u: SIP_CAP_SET_V3_u,
97}}
98pub type PSIP_CAP_SET_V3 = *mut SIP_CAP_SET_V3;
99pub type SIP_CAP_SET = SIP_CAP_SET_V3;
100pub type PSIP_CAP_SET = PSIP_CAP_SET_V3;
101pub const SIP_CAP_SET_VERSION_2: DWORD = 2;
102pub const SIP_CAP_SET_VERSION_3: DWORD = 3;
103pub const SIP_CAP_SET_CUR_VER: DWORD = 3;
104pub const SIP_CAP_FLAG_SEALING: DWORD = 0x00000001;
105STRUCT!{struct SIP_INDIRECT_DATA {
106 Data: CRYPT_ATTRIBUTE_TYPE_VALUE,
107 DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER,
108 Digest: CRYPT_HASH_BLOB,
109}}
110pub type PSIP_INDIRECT_DATA = *mut SIP_INDIRECT_DATA;
111extern "system" {
112 pub fn CryptSIPGetSignedDataMsg(
113 pSubjectInfo: *mut SIP_SUBJECTINFO,
114 pdwEncodingType: *mut DWORD,
115 dwIndex: DWORD,
116 pcbSignedDataMsg: *mut DWORD,
117 pbSignedDataMsg: *mut BYTE,
118 ) -> BOOL;
119}
120FN!{stdcall pCryptSIPGetSignedDataMsg(
121 pSubjectInfo: *mut SIP_SUBJECTINFO,
122 pdwEncodingType: *mut DWORD,
123 dwIndex: DWORD,
124 pcbSignedDataMsg: *mut DWORD,
125 pbSignedDataMsg: *mut BYTE,
126) -> BOOL}
127extern "system" {
128 pub fn CryptSIPPutSignedDataMsg(
129 pSubjectInfo: *mut SIP_SUBJECTINFO,
130 dwEncodingType: DWORD,
131 pdwIndex: *mut DWORD,
132 cbSignedDataMsg: DWORD,
133 pbSignedDataMsg: *mut BYTE,
134 ) -> BOOL;
135}
136FN!{stdcall pCryptSIPPutSignedDataMsg(
137 pSubjectInfo: *mut SIP_SUBJECTINFO,
138 dwEncodingType: DWORD,
139 pdwIndex: *mut DWORD,
140 cbSignedDataMsg: DWORD,
141 pbSignedDataMsg: *mut BYTE,
142) -> BOOL}
143extern "system" {
144 pub fn CryptSIPCreateIndirectData(
145 pSubjectInfo: *mut SIP_SUBJECTINFO,
146 pcbIndirectData: *mut DWORD,
147 pIndirectData: *mut SIP_INDIRECT_DATA,
148 ) -> BOOL;
149}
150FN!{stdcall pCryptSIPCreateIndirectData(
151 pSubjectInfo: *mut SIP_SUBJECTINFO,
152 pcbIndirectData: *mut DWORD,
153 pIndirectData: *mut SIP_INDIRECT_DATA,
154) -> BOOL}
155extern "system" {
156 pub fn CryptSIPVerifyIndirectData(
157 pSubjectInfo: *mut SIP_SUBJECTINFO,
158 pIndirectData: *mut SIP_INDIRECT_DATA,
159 ) -> BOOL;
160}
161FN!{stdcall pCryptSIPVerifyIndirectData(
162 pSubjectInfo: *mut SIP_SUBJECTINFO,
163 pIndirectData: *mut SIP_INDIRECT_DATA,
164) -> BOOL}
165extern "system" {
166 pub fn CryptSIPRemoveSignedDataMsg(
167 pSubjectInfo: *mut SIP_SUBJECTINFO,
168 dwIndex: DWORD,
169 ) -> BOOL;
170}
171FN!{stdcall pCryptSIPRemoveSignedDataMsg(
172 pSubjectInfo: *mut SIP_SUBJECTINFO,
173 dwIndex: DWORD,
174) -> BOOL}
175STRUCT!{struct SIP_DISPATCH_INFO {
176 cbSize: DWORD,
177 hSIP: HANDLE,
178 pfGet: pCryptSIPGetSignedDataMsg,
179 pfPut: pCryptSIPPutSignedDataMsg,
180 pfCreate: pCryptSIPCreateIndirectData,
181 pfVerify: pCryptSIPVerifyIndirectData,
182 pfRemove: pCryptSIPRemoveSignedDataMsg,
183}}
184pub type LPSIP_DISPATCH_INFO = *mut SIP_DISPATCH_INFO;
185FN!{stdcall pfnIsFileSupported(
186 hFile: HANDLE,
187 pgSubject: *mut GUID,
188) -> BOOL}
189FN!{stdcall pfnIsFileSupportedName(
190 pwszFileName: *mut WCHAR,
191 pgSubject: *mut GUID,
192) -> BOOL}
193STRUCT!{struct SIP_ADD_NEWPROVIDER {
194 cbStruct: DWORD,
195 pgSubject: *mut GUID,
196 pwszDLLFileName: *mut WCHAR,
197 pwszMagicNumber: *mut WCHAR,
198 pwszIsFunctionName: *mut WCHAR,
199 pwszGetFuncName: *mut WCHAR,
200 pwszPutFuncName: *mut WCHAR,
201 pwszCreateFuncName: *mut WCHAR,
202 pwszVerifyFuncName: *mut WCHAR,
203 pwszRemoveFuncName: *mut WCHAR,
204 pwszIsFunctionNameFmt2: *mut WCHAR,
205 pwszGetCapFuncName: PWSTR,
206}}
207pub type PSIP_ADD_NEWPROVIDER = *mut SIP_ADD_NEWPROVIDER;
208pub const SIP_MAX_MAGIC_NUMBER: DWORD = 4;
209extern "system" {
210 pub fn CryptSIPLoad(
211 pgSubject: *const GUID,
212 dwFlags: DWORD,
213 pSipDispatch: *mut SIP_DISPATCH_INFO,
214 ) -> BOOL;
215 pub fn CryptSIPRetrieveSubjectGuid(
216 FileName: LPCWSTR,
217 hFileIn: HANDLE,
218 pgSubject: *mut GUID,
219 ) -> BOOL;
220 pub fn CryptSIPRetrieveSubjectGuidForCatalogFile(
221 FileName: LPCWSTR,
222 hFileIn: HANDLE,
223 pgSubject: *mut GUID,
224 ) -> BOOL;
225 pub fn CryptSIPAddProvider(
226 psNewProv: *mut SIP_ADD_NEWPROVIDER,
227 ) -> BOOL;
228 pub fn CryptSIPRemoveProvider(
229 pgProv: *mut GUID,
230 ) -> BOOL;
231 pub fn CryptSIPGetCaps(
232 pSubjInfo: *mut SIP_SUBJECTINFO,
233 pCaps: *mut SIP_CAP_SET,
234 ) -> BOOL;
235}
236FN!{stdcall pCryptSIPGetCaps(
237 pSubjInfo: *mut SIP_SUBJECTINFO,
238 pCaps: *mut SIP_CAP_SET,
239) -> BOOL}
240extern "system" {
241 pub fn CryptSIPGetSealedDigest(
242 pSubjectInfo: *mut SIP_SUBJECTINFO,
243 pSig: *const BYTE,
244 dwSig: DWORD,
245 pbDigest: *mut BYTE,
246 pcbDigest: *mut DWORD,
247 ) -> BOOL;
248}
249FN!{stdcall pCryptSIPGetSealedDigest(
250 pSubjectInfo: *mut SIP_SUBJECTINFO,
251 pSig: *const BYTE,
252 dwSig: DWORD,
253 pbDigest: *mut BYTE,
254 pcbDigest: *mut DWORD,
255) -> BOOL}