| // Copyright © 2015-2017 winapi-rs developers |
| // Licensed under the Apache License, Version 2.0 |
| // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. |
| // All files in the project carrying such notice may not be copied, modified, or distributed |
| // except according to those terms. |
| //! Microsoft SIP Provider Prototypes and Definitions |
| use shared::guiddef::GUID; |
| use shared::minwindef::{BOOL, BYTE, DWORD, LPVOID}; |
| use um::mscat::{CRYPTCATMEMBER, CRYPTCATSTORE}; |
| use um::wincrypt::{ |
| CRYPT_ALGORITHM_IDENTIFIER, CRYPT_ATTRIBUTE_TYPE_VALUE, CRYPT_HASH_BLOB, HCRYPTPROV, |
| }; |
| use um::winnt::{HANDLE, LPCWSTR, PWSTR, WCHAR}; |
| pub type CRYPT_DIGEST_DATA = CRYPT_HASH_BLOB; |
| pub const MSSIP_FLAGS_PROHIBIT_RESIZE_ON_CREATE: DWORD = 0x00010000; |
| pub const MSSIP_FLAGS_USE_CATALOG: DWORD = 0x00020000; |
| pub const MSSIP_FLAGS_MULTI_HASH: DWORD = 0x00040000; |
| pub const SPC_INC_PE_RESOURCES_FLAG: DWORD = 0x80; |
| pub const SPC_INC_PE_DEBUG_INFO_FLAG: DWORD = 0x40; |
| pub const SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG: DWORD = 0x20; |
| pub const SPC_EXC_PE_PAGE_HASHES_FLAG: DWORD = 0x10; |
| pub const SPC_INC_PE_PAGE_HASHES_FLAG: DWORD = 0x100; |
| pub const SPC_DIGEST_GENERATE_FLAG: DWORD = 0x200; |
| pub const SPC_DIGEST_SIGN_FLAG: DWORD = 0x400; |
| pub const SPC_RELAXED_PE_MARKER_CHECK: DWORD = 0x800; |
| pub const SPC_MARKER_CHECK_SKIP_SIP_INDIRECT_DATA_FLAG: DWORD = 0x00000001; |
| pub const SPC_MARKER_CHECK_CURRENTLY_SUPPORTED_FLAGS: DWORD |
| = SPC_MARKER_CHECK_SKIP_SIP_INDIRECT_DATA_FLAG; |
| pub const MSSIP_ADDINFO_NONE: DWORD = 0; |
| pub const MSSIP_ADDINFO_FLAT: DWORD = 1; |
| pub const MSSIP_ADDINFO_CATMEMBER: DWORD = 2; |
| pub const MSSIP_ADDINFO_BLOB: DWORD = 3; |
| pub const MSSIP_ADDINFO_NONMSSIP: DWORD = 500; |
| UNION!{union SIP_SUBJECTINFO_u { |
| [usize; 1], |
| psFlat psFlat_mut: *mut MS_ADDINFO_FLAT, |
| psCatMember psCatMember_mut: *mut MS_ADDINFO_CATALOGMEMBER, |
| psBlob psBlob_mut: *mut MS_ADDINFO_BLOB, |
| }} |
| STRUCT!{struct SIP_SUBJECTINFO { |
| cbSize: DWORD, |
| pgSubjectType: *mut GUID, |
| hFile: HANDLE, |
| pwsFileName: LPCWSTR, |
| pwsDisplayName: LPCWSTR, |
| dwReserved1: DWORD, |
| dwIntVersion: DWORD, |
| hProv: HCRYPTPROV, |
| DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER, |
| dwFlags: DWORD, |
| dwEncodingType: DWORD, |
| dwReserved2: DWORD, |
| fdwCAPISettings: DWORD, |
| fdwSecuritySettings: DWORD, |
| dwIndex: DWORD, |
| dwUnionChoice: DWORD, |
| u: SIP_SUBJECTINFO_u, |
| pClientData: LPVOID, |
| }} |
| pub type LPSIP_SUBJECTINFO = *mut SIP_SUBJECTINFO; |
| STRUCT!{struct MS_ADDINFO_FLAT { |
| cbStruct: DWORD, |
| pIndirectData: *mut SIP_INDIRECT_DATA, |
| }} |
| pub type PMS_ADDINFO_FLAT = *mut MS_ADDINFO_FLAT; |
| STRUCT!{struct MS_ADDINFO_CATALOGMEMBER { |
| cbStruct: DWORD, |
| pStore: *mut CRYPTCATSTORE, |
| pMember: *mut CRYPTCATMEMBER, |
| }} |
| pub type PMS_ADDINFO_CATALOGMEMBER = *mut MS_ADDINFO_CATALOGMEMBER; |
| STRUCT!{struct MS_ADDINFO_BLOB { |
| cbStruct: DWORD, |
| cbMemObject: DWORD, |
| pbMemObject: *mut BYTE, |
| cbMemSignedMsg: DWORD, |
| pbMemSignedMsg: *mut BYTE, |
| }} |
| pub type PMS_ADDINFO_BLOB = *mut MS_ADDINFO_BLOB; |
| STRUCT!{struct SIP_CAP_SET_V2 { |
| cbSize: DWORD, |
| dwVersion: DWORD, |
| isMultiSign: BOOL, |
| dwReserved: DWORD, |
| }} |
| pub type PSIP_CAP_SET_V2 = *mut SIP_CAP_SET_V2; |
| UNION!{union SIP_CAP_SET_V3_u { |
| [u32; 1], |
| dwFlags dwFlags_mut: DWORD, |
| dwReserved dwReserved_mut: DWORD, |
| }} |
| STRUCT!{struct SIP_CAP_SET_V3 { |
| cbSize: DWORD, |
| dwVersion: DWORD, |
| isMultiSign: BOOL, |
| u: SIP_CAP_SET_V3_u, |
| }} |
| pub type PSIP_CAP_SET_V3 = *mut SIP_CAP_SET_V3; |
| pub type SIP_CAP_SET = SIP_CAP_SET_V3; |
| pub type PSIP_CAP_SET = PSIP_CAP_SET_V3; |
| pub const SIP_CAP_SET_VERSION_2: DWORD = 2; |
| pub const SIP_CAP_SET_VERSION_3: DWORD = 3; |
| pub const SIP_CAP_SET_CUR_VER: DWORD = 3; |
| pub const SIP_CAP_FLAG_SEALING: DWORD = 0x00000001; |
| STRUCT!{struct SIP_INDIRECT_DATA { |
| Data: CRYPT_ATTRIBUTE_TYPE_VALUE, |
| DigestAlgorithm: CRYPT_ALGORITHM_IDENTIFIER, |
| Digest: CRYPT_HASH_BLOB, |
| }} |
| pub type PSIP_INDIRECT_DATA = *mut SIP_INDIRECT_DATA; |
| extern "system" { |
| pub fn CryptSIPGetSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pdwEncodingType: *mut DWORD, |
| dwIndex: DWORD, |
| pcbSignedDataMsg: *mut DWORD, |
| pbSignedDataMsg: *mut BYTE, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPGetSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pdwEncodingType: *mut DWORD, |
| dwIndex: DWORD, |
| pcbSignedDataMsg: *mut DWORD, |
| pbSignedDataMsg: *mut BYTE, |
| ) -> BOOL} |
| extern "system" { |
| pub fn CryptSIPPutSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| dwEncodingType: DWORD, |
| pdwIndex: *mut DWORD, |
| cbSignedDataMsg: DWORD, |
| pbSignedDataMsg: *mut BYTE, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPPutSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| dwEncodingType: DWORD, |
| pdwIndex: *mut DWORD, |
| cbSignedDataMsg: DWORD, |
| pbSignedDataMsg: *mut BYTE, |
| ) -> BOOL} |
| extern "system" { |
| pub fn CryptSIPCreateIndirectData( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pcbIndirectData: *mut DWORD, |
| pIndirectData: *mut SIP_INDIRECT_DATA, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPCreateIndirectData( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pcbIndirectData: *mut DWORD, |
| pIndirectData: *mut SIP_INDIRECT_DATA, |
| ) -> BOOL} |
| extern "system" { |
| pub fn CryptSIPVerifyIndirectData( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pIndirectData: *mut SIP_INDIRECT_DATA, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPVerifyIndirectData( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pIndirectData: *mut SIP_INDIRECT_DATA, |
| ) -> BOOL} |
| extern "system" { |
| pub fn CryptSIPRemoveSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| dwIndex: DWORD, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPRemoveSignedDataMsg( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| dwIndex: DWORD, |
| ) -> BOOL} |
| STRUCT!{struct SIP_DISPATCH_INFO { |
| cbSize: DWORD, |
| hSIP: HANDLE, |
| pfGet: pCryptSIPGetSignedDataMsg, |
| pfPut: pCryptSIPPutSignedDataMsg, |
| pfCreate: pCryptSIPCreateIndirectData, |
| pfVerify: pCryptSIPVerifyIndirectData, |
| pfRemove: pCryptSIPRemoveSignedDataMsg, |
| }} |
| pub type LPSIP_DISPATCH_INFO = *mut SIP_DISPATCH_INFO; |
| FN!{stdcall pfnIsFileSupported( |
| hFile: HANDLE, |
| pgSubject: *mut GUID, |
| ) -> BOOL} |
| FN!{stdcall pfnIsFileSupportedName( |
| pwszFileName: *mut WCHAR, |
| pgSubject: *mut GUID, |
| ) -> BOOL} |
| STRUCT!{struct SIP_ADD_NEWPROVIDER { |
| cbStruct: DWORD, |
| pgSubject: *mut GUID, |
| pwszDLLFileName: *mut WCHAR, |
| pwszMagicNumber: *mut WCHAR, |
| pwszIsFunctionName: *mut WCHAR, |
| pwszGetFuncName: *mut WCHAR, |
| pwszPutFuncName: *mut WCHAR, |
| pwszCreateFuncName: *mut WCHAR, |
| pwszVerifyFuncName: *mut WCHAR, |
| pwszRemoveFuncName: *mut WCHAR, |
| pwszIsFunctionNameFmt2: *mut WCHAR, |
| pwszGetCapFuncName: PWSTR, |
| }} |
| pub type PSIP_ADD_NEWPROVIDER = *mut SIP_ADD_NEWPROVIDER; |
| pub const SIP_MAX_MAGIC_NUMBER: DWORD = 4; |
| extern "system" { |
| pub fn CryptSIPLoad( |
| pgSubject: *const GUID, |
| dwFlags: DWORD, |
| pSipDispatch: *mut SIP_DISPATCH_INFO, |
| ) -> BOOL; |
| pub fn CryptSIPRetrieveSubjectGuid( |
| FileName: LPCWSTR, |
| hFileIn: HANDLE, |
| pgSubject: *mut GUID, |
| ) -> BOOL; |
| pub fn CryptSIPRetrieveSubjectGuidForCatalogFile( |
| FileName: LPCWSTR, |
| hFileIn: HANDLE, |
| pgSubject: *mut GUID, |
| ) -> BOOL; |
| pub fn CryptSIPAddProvider( |
| psNewProv: *mut SIP_ADD_NEWPROVIDER, |
| ) -> BOOL; |
| pub fn CryptSIPRemoveProvider( |
| pgProv: *mut GUID, |
| ) -> BOOL; |
| pub fn CryptSIPGetCaps( |
| pSubjInfo: *mut SIP_SUBJECTINFO, |
| pCaps: *mut SIP_CAP_SET, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPGetCaps( |
| pSubjInfo: *mut SIP_SUBJECTINFO, |
| pCaps: *mut SIP_CAP_SET, |
| ) -> BOOL} |
| extern "system" { |
| pub fn CryptSIPGetSealedDigest( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pSig: *const BYTE, |
| dwSig: DWORD, |
| pbDigest: *mut BYTE, |
| pcbDigest: *mut DWORD, |
| ) -> BOOL; |
| } |
| FN!{stdcall pCryptSIPGetSealedDigest( |
| pSubjectInfo: *mut SIP_SUBJECTINFO, |
| pSig: *const BYTE, |
| dwSig: DWORD, |
| pbDigest: *mut BYTE, |
| pcbDigest: *mut DWORD, |
| ) -> BOOL} |