winapi_ui_automation/um/
mssip.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Microsoft SIP Provider Prototypes and Definitions
7use 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}