Adding some crypto api

This commit is contained in:
Clement Rouault
2017-10-06 17:32:24 +02:00
parent c12a0c45f9
commit f6e151a7d5
9 changed files with 289 additions and 84 deletions
-38
View File
@@ -1263,44 +1263,6 @@ UINT WINAPI GetWindowModuleFileNameW(
__out LPWSTR pszFileName,
__in UINT cchFileNameMax);
BOOL WINAPI CryptCATAdminCalcHashFromFileHandle(
__in HANDLE hFile,
__inout DWORD *pcbHash,
_Out_opt_ BYTE *pbHash,
__in DWORD dwFlags);
HCATINFO WINAPI CryptCATAdminEnumCatalogFromHash(
__in HCATADMIN hCatAdmin,
__in BYTE *pbHash,
__in DWORD cbHash,
__in DWORD dwFlags,
__inout HCATINFO *phPrevCatInfo);
BOOL WINAPI CryptCATAdminAcquireContext(
_Out_ HCATADMIN *phCatAdmin,
_In_ GUID *pgSubsystem,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATCatalogInfoFromContext(
_In_ HCATINFO hCatInfo,
_Inout_ CATALOG_INFO *psCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseCatalogContext(
_In_ HCATADMIN hCatAdmin,
_In_ HCATINFO hCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseContext(
_In_ HCATADMIN hCatAdmin,
_In_ DWORD dwFlags
);
DWORD WINAPI GetLogicalDriveStringsA(
_In_ DWORD nBufferLength,
_Out_ LPCSTR lpBuffer
@@ -0,0 +1,36 @@
BOOL WINAPI CryptCATAdminCalcHashFromFileHandle(
__in HANDLE hFile,
__inout DWORD *pcbHash,
_Out_opt_ BYTE *pbHash,
__in DWORD dwFlags);
HCATINFO WINAPI CryptCATAdminEnumCatalogFromHash(
__in HCATADMIN hCatAdmin,
__in BYTE *pbHash,
__in DWORD cbHash,
__in DWORD dwFlags,
__inout HCATINFO *phPrevCatInfo);
BOOL WINAPI CryptCATAdminAcquireContext(
_Out_ HCATADMIN *phCatAdmin,
_In_ GUID *pgSubsystem,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATCatalogInfoFromContext(
_In_ HCATINFO hCatInfo,
_Inout_ CATALOG_INFO *psCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseCatalogContext(
_In_ HCATADMIN hCatAdmin,
_In_ HCATINFO hCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseContext(
_In_ HCATADMIN hCatAdmin,
_In_ DWORD dwFlags
);
@@ -1,3 +1,73 @@
BOOL WINAPI CryptCATAdminCalcHashFromFileHandle(
__in HANDLE hFile,
__inout DWORD *pcbHash,
_Out_opt_ BYTE *pbHash,
__in DWORD dwFlags);
HCATINFO WINAPI CryptCATAdminEnumCatalogFromHash(
__in HCATADMIN hCatAdmin,
__in BYTE *pbHash,
__in DWORD cbHash,
__in DWORD dwFlags,
__inout HCATINFO *phPrevCatInfo);
BOOL WINAPI CryptCATAdminAcquireContext(
_Out_ HCATADMIN *phCatAdmin,
_In_ GUID *pgSubsystem,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATCatalogInfoFromContext(
_In_ HCATINFO hCatInfo,
_Inout_ CATALOG_INFO *psCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseCatalogContext(
_In_ HCATADMIN hCatAdmin,
_In_ HCATINFO hCatInfo,
_In_ DWORD dwFlags
);
BOOL WINAPI CryptCATAdminReleaseContext(
_In_ HCATADMIN hCatAdmin,
_In_ DWORD dwFlags
);
CRYPTCATATTRIBUTE* WINAPI CryptCATGetAttrInfo(
_In_ HANDLE hCatalog,
_In_ CRYPTCATMEMBER *pCatMember,
_In_ LPWSTR pwszReferenceTag
);
CRYPTCATMEMBER* WINAPI CryptCATGetMemberInfo(
_In_ HANDLE hCatalog,
_In_ LPWSTR pwszReferenceTag
);
CRYPTCATATTRIBUTE* WINAPI CryptCATGetAttrInfo(
_In_ HANDLE hCatalog,
_In_ CRYPTCATMEMBER *pCatMember,
_In_ LPWSTR pwszReferenceTag
);
CRYPTCATATTRIBUTE* WINAPI CryptCATEnumerateCatAttr(
_In_ HANDLE hCatalog,
_In_ CRYPTCATATTRIBUTE *pPrevAttr
);
CRYPTCATATTRIBUTE* WINAPI CryptCATEnumerateAttr(
_In_ HANDLE hCatalog,
_In_ CRYPTCATMEMBER *pCatMember,
_In_ CRYPTCATATTRIBUTE *pPrevAttr
);
CRYPTCATMEMBER* WINAPI CryptCATEnumerateMember(
_In_ HANDLE hCatalog,
_In_ CRYPTCATMEMBER *pPrevMember
);
BOOL WINAPI CryptQueryObject(
_In_ DWORD dwObjectType,
_In_ VOID *pvObject,
+41 -4
View File
@@ -2030,6 +2030,46 @@ CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;
typedef struct CRYPTCATATTRIBUTE_ {
DWORD cbStruct;
LPWSTR pwszReferenceTag;
DWORD dwAttrTypeAndAction;
DWORD cbValue;
BYTE *pbValue;
DWORD dwReserved;
} CRYPTCATATTRIBUTE, *PCRYPTCATATTRIBUTE;
typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
LPSTR pszObjId;
CRYPT_OBJID_BLOB Value;
} CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;
typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
LPSTR pszObjId;
CRYPT_OBJID_BLOB Parameters;
} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
typedef struct SIP_INDIRECT_DATA_
{
CRYPT_ATTRIBUTE_TYPE_VALUE Data;
CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
CRYPT_HASH_BLOB Digest;
} SIP_INDIRECT_DATA, *PSIP_INDIRECT_DATA;
typedef struct CRYPTCATMEMBER_ {
DWORD cbStruct;
LPWSTR pwszReferenceTag;
LPWSTR pwszFileName;
GUID gSubjectType;
DWORD fdwMemberFlags;
struct SIP_INDIRECT_DATA *pIndirectData;
DWORD dwCertVersion;
DWORD dwReserved;
HANDLE hReserved;
CRYPT_ATTR_BLOB sEncodedIndirectData;
CRYPT_ATTR_BLOB sEncodedMemberInfo;
} CRYPTCATMEMBER, *PCRYPTCATMEMBER;
typedef struct WINTRUST_FILE_INFO_
{
DWORD cbStruct;
@@ -2065,10 +2105,7 @@ typedef struct _CRYPT_ATTRIBUTES {
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
LPSTR pszObjId;
CRYPT_OBJID_BLOB Parameters;
} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
typedef struct _CMSG_SIGNER_INFO {
DWORD dwVersion;
+8 -1
View File
@@ -25,7 +25,10 @@ class WinFunc(object):
def generate_prototype_ctypes(self):
model = "{0} = WINFUNCTYPE({1})"
ctypes_param = [self.return_type]
if isinstance(self.return_type, tuple) and self.return_type[0] == "PTR":
ctypes_param = ["POINTER({0})".format(self.return_type[1])]
else:
ctypes_param = [self.return_type]
for type, name in self.params:
if type.upper() == "POINTER(VOID)":
type = "PVOID"
@@ -81,6 +84,10 @@ class WinFuncParser(Parser):
except StopIteration:
raise NormalParsingTerminaison()
if type(self.peek()) == StarToken:
self.assert_token_type(StarToken)
return_type = ("PTR", return_type)
func_name = self.assert_token_type(NameToken).value
if func_name.upper() == "WINAPI":
has_winapi = True
+5 -2
View File
@@ -404,7 +404,10 @@ class FuncGenerator(CtypesGenerator):
def analyse(self, data):
for func in data:
self.add_imports(func.return_type)
if isinstance(func.return_type, tuple) and func.return_type[0] == "PTR":
self.add_imports(func.return_type[1])
else:
self.add_imports(func.return_type)
for param_type, _ in func.params:
if param_type.startswith("POINTER(") and param_type.endswith(")"):
param_type = param_type[len("POINTER("): -1]
@@ -741,7 +744,7 @@ structs.append_input_file(from_here("definitions\\winstruct_bits.txt"))
structs.append_input_file(from_here("definitions\\winstruct_alpc.txt"))
functions = FuncGenerator(from_here("definitions\\winfunc.txt"), from_here(r"..\windows\generated_def\\winfuncs.py"), dependances=[structs])
functions.append_input_file(from_here("definitions\\wintrust_crypt_func.txt"))
functions.append_input_file(from_here("definitions\\winfunc_crypto_wintrust.txt"))
functions.append_input_file(from_here("definitions\\winfunc_notdoc.txt"))
com = InitialCOMGenerator(from_here("definitions\\com\\*.txt"), DEFAULT_INTERFACE_TO_IID, from_here(r"..\windows\generated_def\\interfaces.py"), dependances=[structs, defs_with_ntstatus])
File diff suppressed because one or more lines are too long
+54 -8
View File
@@ -2680,6 +2680,60 @@ PDATA_BLOB = POINTER(_CRYPTOAPI_BLOB)
PCRYPT_ATTR_BLOB = POINTER(_CRYPTOAPI_BLOB)
CRYPT_ATTR_BLOB = _CRYPTOAPI_BLOB
class CRYPTCATATTRIBUTE_(Structure):
_fields_ = [
("cbStruct", DWORD),
("pwszReferenceTag", LPWSTR),
("dwAttrTypeAndAction", DWORD),
("cbValue", DWORD),
("pbValue", POINTER(BYTE)),
("dwReserved", DWORD),
]
CRYPTCATATTRIBUTE = CRYPTCATATTRIBUTE_
PCRYPTCATATTRIBUTE = POINTER(CRYPTCATATTRIBUTE_)
class _CRYPT_ATTRIBUTE_TYPE_VALUE(Structure):
_fields_ = [
("pszObjId", LPSTR),
("Value", CRYPT_OBJID_BLOB),
]
CRYPT_ATTRIBUTE_TYPE_VALUE = _CRYPT_ATTRIBUTE_TYPE_VALUE
PCRYPT_ATTRIBUTE_TYPE_VALUE = POINTER(_CRYPT_ATTRIBUTE_TYPE_VALUE)
class _CRYPT_ALGORITHM_IDENTIFIER(Structure):
_fields_ = [
("pszObjId", LPSTR),
("Parameters", CRYPT_OBJID_BLOB),
]
CRYPT_ALGORITHM_IDENTIFIER = _CRYPT_ALGORITHM_IDENTIFIER
PCRYPT_ALGORITHM_IDENTIFIER = POINTER(_CRYPT_ALGORITHM_IDENTIFIER)
class SIP_INDIRECT_DATA_(Structure):
_fields_ = [
("Data", CRYPT_ATTRIBUTE_TYPE_VALUE),
("DigestAlgorithm", CRYPT_ALGORITHM_IDENTIFIER),
("Digest", CRYPT_HASH_BLOB),
]
SIP_INDIRECT_DATA = SIP_INDIRECT_DATA_
PSIP_INDIRECT_DATA = POINTER(SIP_INDIRECT_DATA_)
class CRYPTCATMEMBER_(Structure):
_fields_ = [
("cbStruct", DWORD),
("pwszReferenceTag", LPWSTR),
("pwszFileName", LPWSTR),
("gSubjectType", GUID),
("fdwMemberFlags", DWORD),
("pIndirectData", POINTER(SIP_INDIRECT_DATA)),
("dwCertVersion", DWORD),
("dwReserved", DWORD),
("hReserved", HANDLE),
("sEncodedIndirectData", CRYPT_ATTR_BLOB),
("sEncodedMemberInfo", CRYPT_ATTR_BLOB),
]
CRYPTCATMEMBER = CRYPTCATMEMBER_
PCRYPTCATMEMBER = POINTER(CRYPTCATMEMBER_)
class WINTRUST_FILE_INFO_(Structure):
_fields_ = [
("cbStruct", DWORD),
@@ -2725,14 +2779,6 @@ class _CRYPT_ATTRIBUTES(Structure):
CRYPT_ATTRIBUTES = _CRYPT_ATTRIBUTES
PCRYPT_ATTRIBUTES = POINTER(_CRYPT_ATTRIBUTES)
class _CRYPT_ALGORITHM_IDENTIFIER(Structure):
_fields_ = [
("pszObjId", LPSTR),
("Parameters", CRYPT_OBJID_BLOB),
]
CRYPT_ALGORITHM_IDENTIFIER = _CRYPT_ALGORITHM_IDENTIFIER
PCRYPT_ALGORITHM_IDENTIFIER = POINTER(_CRYPT_ALGORITHM_IDENTIFIER)
class _CMSG_SIGNER_INFO(Structure):
_fields_ = [
("dwVersion", DWORD),
+14
View File
@@ -1234,6 +1234,20 @@ def CryptCATAdminReleaseContext(hCatAdmin, dwFlags):
return CryptCATAdminReleaseContext.ctypes_function(hCatAdmin, dwFlags)
@WinTrustProxy('CryptCATEnumerateAttr')
def CryptCATEnumerateAttr(hCatalog, pCatMember, pPrevAttr):
return CryptCATEnumerateAttr.ctypes_function(hCatalog, pCatMember, pPrevAttr)
@WinTrustProxy('CryptCATEnumerateCatAttr')
def CryptCATEnumerateCatAttr(hCatalog, pPrevAttr):
return CryptCATEnumerateCatAttr.ctypes_function(hCatalog, pPrevAttr)
@WinTrustProxy('CryptCATEnumerateMember')
def CryptCATEnumerateMember(hCatalog, pPrevMember):
return CryptCATEnumerateMember.ctypes_function(hCatalog, pPrevMember)
## Crypto API ##
@Crypt32Proxy('CertStrToNameA')
def CertStrToNameA(dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError):