diff --git a/ctypes_generation/definitions/defines/wintrust_crypt_def.txt b/ctypes_generation/definitions/defines/wintrust_crypt_def.txt index 635b4cf..f07bf90 100644 --- a/ctypes_generation/definitions/defines/wintrust_crypt_def.txt +++ b/ctypes_generation/definitions/defines/wintrust_crypt_def.txt @@ -387,6 +387,38 @@ #define CRYPT_ARCHIVABLE 0x00004000 #define CRYPT_FORCE_KEY_PROTECTION_HIGH 0x00008000 +#define CERT_RDN_ANY_TYPE 0 +#define CERT_RDN_ENCODED_BLOB 1 +#define CERT_RDN_OCTET_STRING 2 +#define CERT_RDN_NUMERIC_STRING 3 +#define CERT_RDN_PRINTABLE_STRING 4 +#define CERT_RDN_TELETEX_STRING 5 +#define CERT_RDN_T61_STRING 5 +#define CERT_RDN_VIDEOTEX_STRING 6 +#define CERT_RDN_IA5_STRING 7 +#define CERT_RDN_GRAPHIC_STRING 8 +#define CERT_RDN_VISIBLE_STRING 9 +#define CERT_RDN_ISO646_STRING 9 +#define CERT_RDN_GENERAL_STRING 10 +#define CERT_RDN_UNIVERSAL_STRING 11 +#define CERT_RDN_INT4_STRING 11 +#define CERT_RDN_BMP_STRING 12 +#define CERT_RDN_UNICODE_STRING 12 +#define CERT_RDN_UTF8_STRING 13 +#define CERT_RDN_TYPE_MASK 0xff +#define CERT_RDN_FLAGS_MASK 0xff000000 +#define CERT_RDN_ENABLE_T61_UNICODE_FLAG 0x80000000 +#define CERT_RDN_ENABLE_UTF8_UNICODE_FLAG 0x20000000 +#define CERT_RDN_FORCE_UTF8_UNICODE_FLAG 0x10000000 +#define CERT_RDN_DISABLE_CHECK_TYPE_FLAG 0x40000000 +#define CERT_RDN_DISABLE_IE4_UTF8_FLAG 0x1000000 + +#define CRYPT_DECODE_NOCOPY_FLAG 0x1 +#define CRYPT_DECODE_TO_BE_SIGNED_FLAG 0x2 +#define CRYPT_DECODE_SHARE_OID_STRING_FLAG 0x4 +#define CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8 +#define CRYPT_DECODE_ALLOC_FLAG 0x8000 +#define CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG CERT_RDN_DISABLE_IE4_UTF8_FLAG #define CRYPT_ENCODE_DECODE_NONE 0 #define X509_CERT (1) @@ -582,4 +614,23 @@ #define CMSG_CTRL_MAIL_LIST_DECRYPT 18 #define CMSG_CTRL_VERIFY_SIGNATURE_EX 19 #define CMSG_CTRL_ADD_CMS_SIGNER_INFO 20 -#define CMSG_CTRL_ENABLE_STRONG_SIGNATURE 21 \ No newline at end of file +#define CMSG_CTRL_ENABLE_STRONG_SIGNATURE 21 + + +//+------------------------------------------------------------------------- +// The following flag should be set in the above dwFlags to enable +// a CertSetCertificateContextProperty(CERT_KEY_CONTEXT_PROP_ID) after a +// CryptAcquireContext is done in the Sign or Decrypt Message functions. +// +// The following define must not collide with any of the +// CryptAcquireContext dwFlag defines. +//-------------------------------------------------------------------------- +#define CERT_SET_KEY_PROV_HANDLE_PROP_ID 0x00000001 +#define CERT_SET_KEY_CONTEXT_PROP_ID 0x00000001 + +// Special dwKeySpec indicating a CNG NCRYPT_KEY_HANDLE instead of a CAPI1 +// HCRYPTPROV +#define CERT_NCRYPT_KEY_SPEC 0xFFFFFFFF + + +#define CERT_REQUEST_V1 0 \ No newline at end of file diff --git a/ctypes_generation/definitions/functions/crypto_wintrust.txt b/ctypes_generation/definitions/functions/crypto_wintrust.txt index 5994154..192bc59 100644 --- a/ctypes_generation/definitions/functions/crypto_wintrust.txt +++ b/ctypes_generation/definitions/functions/crypto_wintrust.txt @@ -617,4 +617,28 @@ BOOL CryptGetOIDFunctionValue( BOOL CertCloseStore( HCERTSTORE hCertStore, DWORD dwFlags +); + +BOOL CryptSignAndEncodeCertificate( + [in] BCRYPT_KEY_HANDLE hBCryptKey, + [in] DWORD dwKeySpec, + [in] DWORD dwCertEncodingType, + [in] LPCSTR lpszStructType, + [in] PVOID pvStructInfo, + [in] PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, + [in] PVOID pvHashAuxInfo, + [out] BYTE *pbEncoded, + [in, out] DWORD *pcbEncoded +); + +BOOL CryptSignCertificate( + [in] BCRYPT_KEY_HANDLE hBCryptKey, + [in] DWORD dwKeySpec, + [in] DWORD dwCertEncodingType, + [in] BYTE *pbEncodedToBeSigned, + [in] DWORD cbEncodedToBeSigned, + [in] PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, + [in] PVOID pvHashAuxInfo, + [out] BYTE *pbSignature, + [in, out] DWORD *pcbSignature ); \ No newline at end of file diff --git a/ctypes_generation/definitions/functions/ncrypt.txt b/ctypes_generation/definitions/functions/ncrypt.txt new file mode 100644 index 0000000..fbb80cb --- /dev/null +++ b/ctypes_generation/definitions/functions/ncrypt.txt @@ -0,0 +1,14 @@ +SECURITY_STATUS NCryptOpenKey( + [in] NCRYPT_PROV_HANDLE hProvider, + [out] NCRYPT_KEY_HANDLE *phKey, + [in] LPCWSTR pszKeyName, + [in] DWORD dwLegacyKeySpec, + [in] DWORD dwFlags +); + + +SECURITY_STATUS NCryptOpenStorageProvider( + [out] NCRYPT_PROV_HANDLE *phProvider, + [in, optional] LPCWSTR pszProviderName, + [in] DWORD dwFlags +); \ No newline at end of file diff --git a/ctypes_generation/definitions/simple_types.txt b/ctypes_generation/definitions/simple_types.txt index a823a06..a89d082 100644 --- a/ctypes_generation/definitions/simple_types.txt +++ b/ctypes_generation/definitions/simple_types.txt @@ -86,6 +86,7 @@ PWINDBG_EXTENSION_APIS32 = PVOID PWINDBG_EXTENSION_APIS64 = PVOID FILEOP_FLAGS = WORD NET_API_STATUS = DWORD +SECURITY_STATUS = LONG // Return type of ncrypt functions // 2 custom PFW defintions for bitness-forces structures @@ -94,6 +95,7 @@ PVOID64 = DWORD64 NCRYPT_HANDLE = ULONG_PTR NCRYPT_PROV_HANDLE = ULONG_PTR +BCRYPT_KEY_HANDLE = ULONG_PTR NCRYPT_KEY_HANDLE = ULONG_PTR NCRYPT_HASH_HANDLE = ULONG_PTR NCRYPT_SECRET_HANDLE = ULONG_PTR diff --git a/ctypes_generation/definitions/structures/crypto.txt b/ctypes_generation/definitions/structures/crypto.txt index ac41ab2..8282d2f 100644 --- a/ctypes_generation/definitions/structures/crypto.txt +++ b/ctypes_generation/definitions/structures/crypto.txt @@ -715,4 +715,12 @@ typedef struct _STRUCT_PLAINTEXTKEYBLOB { BLOBHEADER hdr; DWORD dwKeySize; BYTE rgbKeyData[0]; -} STRUCT_PLAINTEXTKEYBLOB, *PSTRUCT_PLAINTEXTKEYBLOB; \ No newline at end of file +} STRUCT_PLAINTEXTKEYBLOB, *PSTRUCT_PLAINTEXTKEYBLOB; + +typedef struct _CERT_REQUEST_INFO { + DWORD dwVersion; + CERT_NAME_BLOB Subject; + CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; + DWORD cAttribute; + PCRYPT_ATTRIBUTE rgAttribute; +} CERT_REQUEST_INFO, *PCERT_REQUEST_INFO; \ No newline at end of file diff --git a/docs/source/windef_generated.rst b/docs/source/windef_generated.rst index 45b2014..98b8e04 100644 --- a/docs/source/windef_generated.rst +++ b/docs/source/windef_generated.rst @@ -3344,6 +3344,37 @@ WinDef .. autodata:: CRYPT_SGCKEY .. autodata:: CRYPT_ARCHIVABLE .. autodata:: CRYPT_FORCE_KEY_PROTECTION_HIGH +.. autodata:: CERT_RDN_ANY_TYPE +.. autodata:: CERT_RDN_ENCODED_BLOB +.. autodata:: CERT_RDN_OCTET_STRING +.. autodata:: CERT_RDN_NUMERIC_STRING +.. autodata:: CERT_RDN_PRINTABLE_STRING +.. autodata:: CERT_RDN_TELETEX_STRING +.. autodata:: CERT_RDN_T61_STRING +.. autodata:: CERT_RDN_VIDEOTEX_STRING +.. autodata:: CERT_RDN_IA5_STRING +.. autodata:: CERT_RDN_GRAPHIC_STRING +.. autodata:: CERT_RDN_VISIBLE_STRING +.. autodata:: CERT_RDN_ISO646_STRING +.. autodata:: CERT_RDN_GENERAL_STRING +.. autodata:: CERT_RDN_UNIVERSAL_STRING +.. autodata:: CERT_RDN_INT4_STRING +.. autodata:: CERT_RDN_BMP_STRING +.. autodata:: CERT_RDN_UNICODE_STRING +.. autodata:: CERT_RDN_UTF8_STRING +.. autodata:: CERT_RDN_TYPE_MASK +.. autodata:: CERT_RDN_FLAGS_MASK +.. autodata:: CERT_RDN_ENABLE_T61_UNICODE_FLAG +.. autodata:: CERT_RDN_ENABLE_UTF8_UNICODE_FLAG +.. autodata:: CERT_RDN_FORCE_UTF8_UNICODE_FLAG +.. autodata:: CERT_RDN_DISABLE_CHECK_TYPE_FLAG +.. autodata:: CERT_RDN_DISABLE_IE4_UTF8_FLAG +.. autodata:: CRYPT_DECODE_NOCOPY_FLAG +.. autodata:: CRYPT_DECODE_TO_BE_SIGNED_FLAG +.. autodata:: CRYPT_DECODE_SHARE_OID_STRING_FLAG +.. autodata:: CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG +.. autodata:: CRYPT_DECODE_ALLOC_FLAG +.. autodata:: CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG .. autodata:: CRYPT_ENCODE_DECODE_NONE .. autodata:: X509_CERT .. autodata:: X509_CERT_TO_BE_SIGNED @@ -3482,6 +3513,10 @@ WinDef .. autodata:: CMSG_CTRL_VERIFY_SIGNATURE_EX .. autodata:: CMSG_CTRL_ADD_CMS_SIGNER_INFO .. autodata:: CMSG_CTRL_ENABLE_STRONG_SIGNATURE +.. autodata:: CERT_SET_KEY_PROV_HANDLE_PROP_ID +.. autodata:: CERT_SET_KEY_CONTEXT_PROP_ID +.. autodata:: CERT_NCRYPT_KEY_SPEC +.. autodata:: CERT_REQUEST_V1 .. autodata:: WSADESCRIPTION_LEN .. autodata:: WSASYS_STATUS_LEN .. autodata:: WSAPROTOCOL_LEN diff --git a/docs/source/winfuncs_generated.rst b/docs/source/winfuncs_generated.rst index 9005838..e42bd53 100644 --- a/docs/source/winfuncs_generated.rst +++ b/docs/source/winfuncs_generated.rst @@ -326,6 +326,10 @@ Functions .. function:: CertCloseStore(hCertStore, dwFlags) +.. function:: CryptSignAndEncodeCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded) + +.. function:: CryptSignCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, pbEncodedToBeSigned, cbEncodedToBeSigned, pSignatureAlgorithm, pvHashAuxInfo, pbSignature, pcbSignature) + .. function:: OpenVirtualDisk(VirtualStorageType, Path, VirtualDiskAccessMask, Flags, Parameters, Handle) .. function:: AttachVirtualDisk(VirtualDiskHandle, SecurityDescriptor, Flags, ProviderSpecificFlags, Parameters, Overlapped) @@ -592,6 +596,10 @@ Functions .. function:: UnmapViewOfFile(lpBaseAddress) +.. function:: NCryptOpenKey(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags) + +.. function:: NCryptOpenStorageProvider(phProvider, pszProviderName, dwFlags) + .. function:: NetQueryDisplayInformation(ServerName, Level, Index, EntriesRequested, PreferredMaximumLength, ReturnedEntryCount, SortedBuffer) .. function:: NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle) diff --git a/docs/source/winstructs_generated.rst b/docs/source/winstructs_generated.rst index 77d6560..0e85324 100644 --- a/docs/source/winstructs_generated.rst +++ b/docs/source/winstructs_generated.rst @@ -247,6 +247,8 @@ Simple types .. autoclass:: NET_API_STATUS +.. autoclass:: SECURITY_STATUS + .. autoclass:: PVOID32 .. autoclass:: PVOID64 @@ -255,6 +257,8 @@ Simple types .. autoclass:: NCRYPT_PROV_HANDLE +.. autoclass:: BCRYPT_KEY_HANDLE + .. autoclass:: NCRYPT_KEY_HANDLE .. autoclass:: NCRYPT_HASH_HANDLE @@ -21113,6 +21117,42 @@ _STRUCT_PLAINTEXTKEYBLOB :class:`BYTE` ``[0]`` +_CERT_REQUEST_INFO +'''''''''''''''''' +.. class:: CERT_REQUEST_INFO + + Alias for :class:`_CERT_REQUEST_INFO` + +.. class:: PCERT_REQUEST_INFO + + Pointer to :class:`_CERT_REQUEST_INFO` + +.. class:: _CERT_REQUEST_INFO + + .. attribute:: dwVersion + + :class:`DWORD` + + + .. attribute:: Subject + + :class:`CERT_NAME_BLOB` + + + .. attribute:: SubjectPublicKeyInfo + + :class:`CERT_PUBLIC_KEY_INFO` + + + .. attribute:: cAttribute + + :class:`DWORD` + + + .. attribute:: rgAttribute + + :class:`PCRYPT_ATTRIBUTE` + _EXCEPTION_DEBUG_INFO ''''''''''''''''''''' .. class:: EXCEPTION_DEBUG_INFO diff --git a/tests/test_rpc.py b/tests/test_rpc.py index 477339e..9c31936 100644 --- a/tests/test_rpc.py +++ b/tests/test_rpc.py @@ -157,3 +157,42 @@ def test_rpc_response_as_view(): # Flags = 7 ? resp2 = client.call(iid, Proc9_RPC_FWEnumFirewallRules, params=rawpolstore + b"\x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00") assert client.last_response_was_view + +# This cannot work as is: as juste calling NtAlpcDeleteSectionView does not works. +# We need to disconnect from the port or (guess) reuse the message (based on ID ?) so that the serv known we are done with the message and can suppress it. +# More alpc client/serer test need to be done + +# def test_rpc_response_as_view_is_unmapped(): +# """Test that when a RCP client response as a view, it is unmapped and does not take place in memory ater the call +# It's not private memory, but it take some place in the AS : which can be problematic in 32b python""" +# # The logic we use : make a LOT of call to an API known to send response as a view. And monitor the evolution of WorkingSetSize +# client = windows.rpc.find_alpc_endpoint_and_connect(FIREWALL_RPC_IID, sid=gdef.WinLocalSid) +# client.__class__ = DbgRpcClient +# iid = client.bind(FIREWALL_RPC_IID) +# +# # https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fasp/230d1ae7-b42e-4d9c-b997-b1463aaa0ded +# # !\x02\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00 +# # Binaryversion : 0x022f +# # FW_STORE_TYPE_LOCAL +# # FW_POLICY_ACCESS_RIGHT_READ +# # Flags = 0 +# resp1 = client.call(iid, Proc0_RPC_FWOpenPolicyStore, params=b"!\x02\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00") +# rawpolstore = resp1[:20] +# assert not client.last_response_was_view +# initial_ws_size = windows.current_process.memory_info.WorkingSetSize +# ws_sizes = [] +# +# for i in range(100): +# # Proc9_RPC_FWEnumFirewallRules +# # \x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00 +# # https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fasp/36cddff4-c427-4863-a58d-3d913a12b221 +# # FW_PROFILE_TYPE_ALL : 0x7FFFFFFF +# # FW_RULE_STATUS_CLASS_OK + FW_RULE_STATUS_PARTIALLY_IGNORED = 0x00010000 + 0x00020000 +# # Flags = 7 ? +# resp2 = client.call(iid, Proc9_RPC_FWEnumFirewallRules, params=rawpolstore + b"\x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00") +# assert client.last_response_was_view +# ws_sizes.append(windows.current_process.memory_info.WorkingSetSize - initial_ws_size) +# print("WorkingSetSize: {0}".format(windows.current_process.memory_info.WorkingSetSize)) +# assert max(ws_sizes) - min(ws_sizes) < (1024 ** 2) # We should not vary more than 1 MO ? +# # Check if not all ws_size is not 4k bigger that the last one +# assert not all((ws_sizes[i+1] - ws_sizes[i] > 0x1000) for i in range(len(ws_sizes) - 1)) \ No newline at end of file diff --git a/windows/generated_def/meta.py b/windows/generated_def/meta.py index a13d471..25d8e60 100644 --- a/windows/generated_def/meta.py +++ b/windows/generated_def/meta.py @@ -391,6 +391,7 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS', 'CERT_NAME_SIMPLE_DISPLAY_TYPE', 'CERT_NAME_UPN_TYPE', 'CERT_NAME_URL_TYPE', +'CERT_NCRYPT_KEY_SPEC', 'CERT_NEXT_UPDATE_LOCATION_PROP_ID', 'CERT_OCSP_RESPONSE_PROP_ID', 'CERT_OID_NAME_STR', @@ -435,8 +436,36 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS', 'CERT_QUERY_FORMAT_FLAG_BINARY', 'CERT_QUERY_OBJECT_BLOB', 'CERT_QUERY_OBJECT_FILE', +'CERT_RDN_ANY_TYPE', +'CERT_RDN_BMP_STRING', +'CERT_RDN_DISABLE_CHECK_TYPE_FLAG', +'CERT_RDN_DISABLE_IE4_UTF8_FLAG', +'CERT_RDN_ENABLE_T61_UNICODE_FLAG', +'CERT_RDN_ENABLE_UTF8_UNICODE_FLAG', +'CERT_RDN_ENCODED_BLOB', +'CERT_RDN_FLAGS_MASK', +'CERT_RDN_FORCE_UTF8_UNICODE_FLAG', +'CERT_RDN_GENERAL_STRING', +'CERT_RDN_GRAPHIC_STRING', +'CERT_RDN_IA5_STRING', +'CERT_RDN_INT4_STRING', +'CERT_RDN_ISO646_STRING', +'CERT_RDN_NUMERIC_STRING', +'CERT_RDN_OCTET_STRING', +'CERT_RDN_PRINTABLE_STRING', +'CERT_RDN_T61_STRING', +'CERT_RDN_TELETEX_STRING', +'CERT_RDN_TYPE_MASK', +'CERT_RDN_UNICODE_STRING', +'CERT_RDN_UNIVERSAL_STRING', +'CERT_RDN_UTF8_STRING', +'CERT_RDN_VIDEOTEX_STRING', +'CERT_RDN_VISIBLE_STRING', 'CERT_RENEWAL_PROP_ID', 'CERT_REQUEST_ORIGINATOR_PROP_ID', +'CERT_REQUEST_V1', +'CERT_SET_KEY_CONTEXT_PROP_ID', +'CERT_SET_KEY_PROV_HANDLE_PROP_ID', 'CERT_SHA1_HASH_PROP_ID', 'CERT_SIGNATURE_HASH_PROP_ID', 'CERT_SIMPLE_NAME_STR', @@ -731,6 +760,11 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS', 'CRYPT_CREATE_IV', 'CRYPT_CREATE_SALT', 'CRYPT_DATA_KEY', +'CRYPT_DECODE_ALLOC_FLAG', +'CRYPT_DECODE_NOCOPY_FLAG', +'CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG', +'CRYPT_DECODE_SHARE_OID_STRING_FLAG', +'CRYPT_DECODE_TO_BE_SIGNED_FLAG', 'CRYPT_DEFAULT_CONTAINER_OPTIONAL', 'CRYPT_DELETEKEYSET', 'CRYPT_ENCODE_DECODE_NONE', @@ -754,6 +788,7 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS', 'CRYPT_SF', 'CRYPT_SGCKEY', 'CRYPT_SILENT', +'CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG', 'CRYPT_UPDATE_KEY', 'CRYPT_USER_KEYSET', 'CRYPT_USER_PROTECTED', @@ -12333,6 +12368,7 @@ structs = {'ACCESS_ALLOWED_ACE', 'CERT_NAME_BLOB', 'CERT_PUBLIC_KEY_INFO', 'CERT_RDN_VALUE_BLOB', +'CERT_REQUEST_INFO', 'CERT_REVOCATION_CRL_INFO', 'CERT_REVOCATION_INFO', 'CERT_SIMPLE_CHAIN', @@ -12954,6 +12990,7 @@ structs = {'ACCESS_ALLOWED_ACE', 'PCERT_NAME_BLOB', 'PCERT_PUBLIC_KEY_INFO', 'PCERT_RDN_VALUE_BLOB', +'PCERT_REQUEST_INFO', 'PCERT_REVOCATION_CRL_INFO', 'PCERT_REVOCATION_INFO', 'PCERT_SIMPLE_CHAIN', @@ -13765,6 +13802,7 @@ structs = {'ACCESS_ALLOWED_ACE', '_CERT_ISSUER_SERIAL_NUMBER', '_CERT_KEY_CONTEXT', '_CERT_PUBLIC_KEY_INFO', +'_CERT_REQUEST_INFO', '_CERT_REVOCATION_CRL_INFO', '_CERT_REVOCATION_INFO', '_CERT_SIMPLE_CHAIN', @@ -14762,7 +14800,9 @@ functions = {'AccessCheck', 'CryptProtectMemory', 'CryptQueryObject', 'CryptReleaseContext', +'CryptSignAndEncodeCertificate', 'CryptSignAndEncryptMessage', +'CryptSignCertificate', 'CryptSignHashA', 'CryptSignHashW', 'CryptSignMessage', @@ -15068,6 +15108,8 @@ functions = {'AccessCheck', 'MessageBoxA', 'MessageBoxW', 'MoveWindow', +'NCryptOpenKey', +'NCryptOpenStorageProvider', 'NetApiBufferFree', 'NetGroupEnum', 'NetGroupGetInfo', diff --git a/windows/generated_def/windef.py b/windows/generated_def/windef.py index 7a45703..75b1c33 100644 --- a/windows/generated_def/windef.py +++ b/windows/generated_def/windef.py @@ -3384,6 +3384,37 @@ CRYPT_VOLATILE = make_flag("CRYPT_VOLATILE", 0x00001000) CRYPT_SGCKEY = make_flag("CRYPT_SGCKEY", 0x00002000) CRYPT_ARCHIVABLE = make_flag("CRYPT_ARCHIVABLE", 0x00004000) CRYPT_FORCE_KEY_PROTECTION_HIGH = make_flag("CRYPT_FORCE_KEY_PROTECTION_HIGH", 0x00008000) +CERT_RDN_ANY_TYPE = make_flag("CERT_RDN_ANY_TYPE", 0) +CERT_RDN_ENCODED_BLOB = make_flag("CERT_RDN_ENCODED_BLOB", 1) +CERT_RDN_OCTET_STRING = make_flag("CERT_RDN_OCTET_STRING", 2) +CERT_RDN_NUMERIC_STRING = make_flag("CERT_RDN_NUMERIC_STRING", 3) +CERT_RDN_PRINTABLE_STRING = make_flag("CERT_RDN_PRINTABLE_STRING", 4) +CERT_RDN_TELETEX_STRING = make_flag("CERT_RDN_TELETEX_STRING", 5) +CERT_RDN_T61_STRING = make_flag("CERT_RDN_T61_STRING", 5) +CERT_RDN_VIDEOTEX_STRING = make_flag("CERT_RDN_VIDEOTEX_STRING", 6) +CERT_RDN_IA5_STRING = make_flag("CERT_RDN_IA5_STRING", 7) +CERT_RDN_GRAPHIC_STRING = make_flag("CERT_RDN_GRAPHIC_STRING", 8) +CERT_RDN_VISIBLE_STRING = make_flag("CERT_RDN_VISIBLE_STRING", 9) +CERT_RDN_ISO646_STRING = make_flag("CERT_RDN_ISO646_STRING", 9) +CERT_RDN_GENERAL_STRING = make_flag("CERT_RDN_GENERAL_STRING", 10) +CERT_RDN_UNIVERSAL_STRING = make_flag("CERT_RDN_UNIVERSAL_STRING", 11) +CERT_RDN_INT4_STRING = make_flag("CERT_RDN_INT4_STRING", 11) +CERT_RDN_BMP_STRING = make_flag("CERT_RDN_BMP_STRING", 12) +CERT_RDN_UNICODE_STRING = make_flag("CERT_RDN_UNICODE_STRING", 12) +CERT_RDN_UTF8_STRING = make_flag("CERT_RDN_UTF8_STRING", 13) +CERT_RDN_TYPE_MASK = make_flag("CERT_RDN_TYPE_MASK", 0xff) +CERT_RDN_FLAGS_MASK = make_flag("CERT_RDN_FLAGS_MASK", 0xff000000) +CERT_RDN_ENABLE_T61_UNICODE_FLAG = make_flag("CERT_RDN_ENABLE_T61_UNICODE_FLAG", 0x80000000) +CERT_RDN_ENABLE_UTF8_UNICODE_FLAG = make_flag("CERT_RDN_ENABLE_UTF8_UNICODE_FLAG", 0x20000000) +CERT_RDN_FORCE_UTF8_UNICODE_FLAG = make_flag("CERT_RDN_FORCE_UTF8_UNICODE_FLAG", 0x10000000) +CERT_RDN_DISABLE_CHECK_TYPE_FLAG = make_flag("CERT_RDN_DISABLE_CHECK_TYPE_FLAG", 0x40000000) +CERT_RDN_DISABLE_IE4_UTF8_FLAG = make_flag("CERT_RDN_DISABLE_IE4_UTF8_FLAG", 0x1000000) +CRYPT_DECODE_NOCOPY_FLAG = make_flag("CRYPT_DECODE_NOCOPY_FLAG", 0x1) +CRYPT_DECODE_TO_BE_SIGNED_FLAG = make_flag("CRYPT_DECODE_TO_BE_SIGNED_FLAG", 0x2) +CRYPT_DECODE_SHARE_OID_STRING_FLAG = make_flag("CRYPT_DECODE_SHARE_OID_STRING_FLAG", 0x4) +CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG = make_flag("CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG", 0x8) +CRYPT_DECODE_ALLOC_FLAG = make_flag("CRYPT_DECODE_ALLOC_FLAG", 0x8000) +CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG = make_flag("CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG", CERT_RDN_DISABLE_IE4_UTF8_FLAG) CRYPT_ENCODE_DECODE_NONE = make_flag("CRYPT_ENCODE_DECODE_NONE", 0) X509_CERT = make_flag("X509_CERT", ( 1 )) X509_CERT_TO_BE_SIGNED = make_flag("X509_CERT_TO_BE_SIGNED", ( 2 )) @@ -3522,6 +3553,10 @@ CMSG_CTRL_MAIL_LIST_DECRYPT = make_flag("CMSG_CTRL_MAIL_LIST_DECRYPT", 18) CMSG_CTRL_VERIFY_SIGNATURE_EX = make_flag("CMSG_CTRL_VERIFY_SIGNATURE_EX", 19) CMSG_CTRL_ADD_CMS_SIGNER_INFO = make_flag("CMSG_CTRL_ADD_CMS_SIGNER_INFO", 20) CMSG_CTRL_ENABLE_STRONG_SIGNATURE = make_flag("CMSG_CTRL_ENABLE_STRONG_SIGNATURE", 21) +CERT_SET_KEY_PROV_HANDLE_PROP_ID = make_flag("CERT_SET_KEY_PROV_HANDLE_PROP_ID", 0x00000001) +CERT_SET_KEY_CONTEXT_PROP_ID = make_flag("CERT_SET_KEY_CONTEXT_PROP_ID", 0x00000001) +CERT_NCRYPT_KEY_SPEC = make_flag("CERT_NCRYPT_KEY_SPEC", 0xFFFFFFFF) +CERT_REQUEST_V1 = make_flag("CERT_REQUEST_V1", 0) WSADESCRIPTION_LEN = make_flag("WSADESCRIPTION_LEN", 256) WSASYS_STATUS_LEN = make_flag("WSASYS_STATUS_LEN", 128) WSAPROTOCOL_LEN = make_flag("WSAPROTOCOL_LEN", 255) diff --git a/windows/generated_def/winfuncs.py b/windows/generated_def/winfuncs.py index 0f7f87d..82c464f 100644 --- a/windows/generated_def/winfuncs.py +++ b/windows/generated_def/winfuncs.py @@ -810,6 +810,16 @@ CryptGetOIDFunctionValueParams = ((1, 'dwEncodingType'), (1, 'pszFuncName'), (1, CertCloseStorePrototype = WINFUNCTYPE(BOOL, HCERTSTORE, DWORD) CertCloseStoreParams = ((1, 'hCertStore'), (1, 'dwFlags')) +#def CryptSignAndEncodeCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded): +# return CryptSignAndEncodeCertificate.ctypes_function(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded) +CryptSignAndEncodeCertificatePrototype = WINFUNCTYPE(BOOL, BCRYPT_KEY_HANDLE, DWORD, DWORD, LPCSTR, PVOID, PCRYPT_ALGORITHM_IDENTIFIER, PVOID, POINTER(BYTE), POINTER(DWORD)) +CryptSignAndEncodeCertificateParams = ((1, 'hBCryptKey'), (1, 'dwKeySpec'), (1, 'dwCertEncodingType'), (1, 'lpszStructType'), (1, 'pvStructInfo'), (1, 'pSignatureAlgorithm'), (1, 'pvHashAuxInfo'), (1, 'pbEncoded'), (1, 'pcbEncoded')) + +#def CryptSignCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, pbEncodedToBeSigned, cbEncodedToBeSigned, pSignatureAlgorithm, pvHashAuxInfo, pbSignature, pcbSignature): +# return CryptSignCertificate.ctypes_function(hBCryptKey, dwKeySpec, dwCertEncodingType, pbEncodedToBeSigned, cbEncodedToBeSigned, pSignatureAlgorithm, pvHashAuxInfo, pbSignature, pcbSignature) +CryptSignCertificatePrototype = WINFUNCTYPE(BOOL, BCRYPT_KEY_HANDLE, DWORD, DWORD, POINTER(BYTE), DWORD, PCRYPT_ALGORITHM_IDENTIFIER, PVOID, POINTER(BYTE), POINTER(DWORD)) +CryptSignCertificateParams = ((1, 'hBCryptKey'), (1, 'dwKeySpec'), (1, 'dwCertEncodingType'), (1, 'pbEncodedToBeSigned'), (1, 'cbEncodedToBeSigned'), (1, 'pSignatureAlgorithm'), (1, 'pvHashAuxInfo'), (1, 'pbSignature'), (1, 'pcbSignature')) + #def OpenVirtualDisk(VirtualStorageType, Path, VirtualDiskAccessMask, Flags, Parameters, Handle): # return OpenVirtualDisk.ctypes_function(VirtualStorageType, Path, VirtualDiskAccessMask, Flags, Parameters, Handle) OpenVirtualDiskPrototype = WINFUNCTYPE(DWORD, PVIRTUAL_STORAGE_TYPE, PCWSTR, VIRTUAL_DISK_ACCESS_MASK, OPEN_VIRTUAL_DISK_FLAG, POPEN_VIRTUAL_DISK_PARAMETERS, PHANDLE) @@ -1475,6 +1485,16 @@ OpenFileMappingAParams = ((1, 'dwDesiredAccess'), (1, 'bInheritHandle'), (1, 'lp UnmapViewOfFilePrototype = WINFUNCTYPE(BOOL, LPCVOID) UnmapViewOfFileParams = ((1, 'lpBaseAddress'),) +#def NCryptOpenKey(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags): +# return NCryptOpenKey.ctypes_function(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags) +NCryptOpenKeyPrototype = WINFUNCTYPE(SECURITY_STATUS, NCRYPT_PROV_HANDLE, POINTER(NCRYPT_KEY_HANDLE), LPCWSTR, DWORD, DWORD) +NCryptOpenKeyParams = ((1, 'hProvider'), (1, 'phKey'), (1, 'pszKeyName'), (1, 'dwLegacyKeySpec'), (1, 'dwFlags')) + +#def NCryptOpenStorageProvider(phProvider, pszProviderName, dwFlags): +# return NCryptOpenStorageProvider.ctypes_function(phProvider, pszProviderName, dwFlags) +NCryptOpenStorageProviderPrototype = WINFUNCTYPE(SECURITY_STATUS, POINTER(NCRYPT_PROV_HANDLE), LPCWSTR, DWORD) +NCryptOpenStorageProviderParams = ((1, 'phProvider'), (1, 'pszProviderName'), (1, 'dwFlags')) + #def NetQueryDisplayInformation(ServerName, Level, Index, EntriesRequested, PreferredMaximumLength, ReturnedEntryCount, SortedBuffer): # return NetQueryDisplayInformation.ctypes_function(ServerName, Level, Index, EntriesRequested, PreferredMaximumLength, ReturnedEntryCount, SortedBuffer) NetQueryDisplayInformationPrototype = WINFUNCTYPE(NET_API_STATUS, LPCWSTR, DWORD, DWORD, DWORD, DWORD, LPDWORD, POINTER(PVOID)) diff --git a/windows/generated_def/winstructs.py b/windows/generated_def/winstructs.py index 2e67b77..3a330b8 100644 --- a/windows/generated_def/winstructs.py +++ b/windows/generated_def/winstructs.py @@ -138,10 +138,12 @@ PWINDBG_EXTENSION_APIS32 = PVOID PWINDBG_EXTENSION_APIS64 = PVOID FILEOP_FLAGS = WORD NET_API_STATUS = DWORD +SECURITY_STATUS = LONG PVOID32 = DWORD PVOID64 = DWORD64 NCRYPT_HANDLE = ULONG_PTR NCRYPT_PROV_HANDLE = ULONG_PTR +BCRYPT_KEY_HANDLE = ULONG_PTR NCRYPT_KEY_HANDLE = ULONG_PTR NCRYPT_HASH_HANDLE = ULONG_PTR NCRYPT_SECRET_HANDLE = ULONG_PTR @@ -9282,6 +9284,17 @@ class _STRUCT_PLAINTEXTKEYBLOB(Structure): PSTRUCT_PLAINTEXTKEYBLOB = POINTER(_STRUCT_PLAINTEXTKEYBLOB) STRUCT_PLAINTEXTKEYBLOB = _STRUCT_PLAINTEXTKEYBLOB +class _CERT_REQUEST_INFO(Structure): + _fields_ = [ + ("dwVersion", DWORD), + ("Subject", CERT_NAME_BLOB), + ("SubjectPublicKeyInfo", CERT_PUBLIC_KEY_INFO), + ("cAttribute", DWORD), + ("rgAttribute", PCRYPT_ATTRIBUTE), + ] +CERT_REQUEST_INFO = _CERT_REQUEST_INFO +PCERT_REQUEST_INFO = POINTER(_CERT_REQUEST_INFO) + class _EXCEPTION_DEBUG_INFO(Structure): _fields_ = [ ("ExceptionRecord", EXCEPTION_RECORD), diff --git a/windows/winproxy/apis/__init__.py b/windows/winproxy/apis/__init__.py index e387b34..6b4e60f 100644 --- a/windows/winproxy/apis/__init__.py +++ b/windows/winproxy/apis/__init__.py @@ -7,6 +7,7 @@ from .dnsapi import * from .iphlpapi import * from .kernel32 import * from .ktmw32 import * +from .ncrypt import * from .ntdll import * from .netapi32 import * from .ole32 import * diff --git a/windows/winproxy/apis/crypt32.py b/windows/winproxy/apis/crypt32.py index 8179fc2..c4c0e5a 100644 --- a/windows/winproxy/apis/crypt32.py +++ b/windows/winproxy/apis/crypt32.py @@ -147,6 +147,10 @@ def CryptSignMessage(pSignPara, fDetachedSignature, cToBeSigned, rgpbToBeSigned, def CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob): return CryptSignAndEncryptMessage.ctypes_function(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob) +@Crypt32Proxy() +def CryptSignAndEncodeCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded): + lpszStructType = gdef.LPCSTR(lpszStructType) if isinstance(lpszStructType, int_types) else lpszStructType + return CryptSignAndEncodeCertificate.ctypes_function(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded) @Crypt32Proxy() def CryptVerifyMessageSignature(pVerifyPara, dwSignerIndex, pbSignedBlob, cbSignedBlob, pbDecoded, pcbDecoded, ppSignerCert): @@ -176,6 +180,7 @@ def CryptQueryObject(dwObjectType, pvObject, dwExpectedContentTypeFlags, dwExpec @Crypt32Proxy() def CryptDecodeObject(dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo): + lpszStructType = gdef.LPCSTR(lpszStructType) if isinstance(lpszStructType, int_types) else lpszStructType return CryptDecodeObject.ctypes_function(dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo) @Crypt32Proxy() diff --git a/windows/winproxy/apis/ncrypt.py b/windows/winproxy/apis/ncrypt.py new file mode 100644 index 0000000..8e8de2a --- /dev/null +++ b/windows/winproxy/apis/ncrypt.py @@ -0,0 +1,23 @@ + +import ctypes +import windows.generated_def as gdef + +from ..apiproxy import ApiProxy, NeededParameter +from ..error import no_error_check, succeed_on_zero + +import windows.pycompat +from windows.pycompat import int_types + +class NCryptProxy(ApiProxy): + APIDLL = "ncrypt" + default_error_check = staticmethod(succeed_on_zero) + + +@NCryptProxy() +def NCryptOpenKey(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags): + return NCryptOpenKey.ctypes_function(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags) + + +@NCryptProxy() +def NCryptOpenStorageProvider(phProvider, pszProviderName, dwFlags): + return NCryptOpenStorageProvider.ctypes_function(phProvider, pszProviderName, dwFlags) \ No newline at end of file