Skip to content

Commit 1481e9c

Browse files
committed
Add some crypto-related ctypes definitions
1 parent 37d5e90 commit 1481e9c

16 files changed

Lines changed: 362 additions & 2 deletions

File tree

ctypes_generation/definitions/defines/wintrust_crypt_def.txt

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,38 @@
387387
#define CRYPT_ARCHIVABLE 0x00004000
388388
#define CRYPT_FORCE_KEY_PROTECTION_HIGH 0x00008000
389389

390+
#define CERT_RDN_ANY_TYPE 0
391+
#define CERT_RDN_ENCODED_BLOB 1
392+
#define CERT_RDN_OCTET_STRING 2
393+
#define CERT_RDN_NUMERIC_STRING 3
394+
#define CERT_RDN_PRINTABLE_STRING 4
395+
#define CERT_RDN_TELETEX_STRING 5
396+
#define CERT_RDN_T61_STRING 5
397+
#define CERT_RDN_VIDEOTEX_STRING 6
398+
#define CERT_RDN_IA5_STRING 7
399+
#define CERT_RDN_GRAPHIC_STRING 8
400+
#define CERT_RDN_VISIBLE_STRING 9
401+
#define CERT_RDN_ISO646_STRING 9
402+
#define CERT_RDN_GENERAL_STRING 10
403+
#define CERT_RDN_UNIVERSAL_STRING 11
404+
#define CERT_RDN_INT4_STRING 11
405+
#define CERT_RDN_BMP_STRING 12
406+
#define CERT_RDN_UNICODE_STRING 12
407+
#define CERT_RDN_UTF8_STRING 13
408+
#define CERT_RDN_TYPE_MASK 0xff
409+
#define CERT_RDN_FLAGS_MASK 0xff000000
410+
#define CERT_RDN_ENABLE_T61_UNICODE_FLAG 0x80000000
411+
#define CERT_RDN_ENABLE_UTF8_UNICODE_FLAG 0x20000000
412+
#define CERT_RDN_FORCE_UTF8_UNICODE_FLAG 0x10000000
413+
#define CERT_RDN_DISABLE_CHECK_TYPE_FLAG 0x40000000
414+
#define CERT_RDN_DISABLE_IE4_UTF8_FLAG 0x1000000
415+
416+
#define CRYPT_DECODE_NOCOPY_FLAG 0x1
417+
#define CRYPT_DECODE_TO_BE_SIGNED_FLAG 0x2
418+
#define CRYPT_DECODE_SHARE_OID_STRING_FLAG 0x4
419+
#define CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8
420+
#define CRYPT_DECODE_ALLOC_FLAG 0x8000
421+
#define CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG CERT_RDN_DISABLE_IE4_UTF8_FLAG
390422

391423
#define CRYPT_ENCODE_DECODE_NONE 0
392424
#define X509_CERT (1)
@@ -582,4 +614,23 @@
582614
#define CMSG_CTRL_MAIL_LIST_DECRYPT 18
583615
#define CMSG_CTRL_VERIFY_SIGNATURE_EX 19
584616
#define CMSG_CTRL_ADD_CMS_SIGNER_INFO 20
585-
#define CMSG_CTRL_ENABLE_STRONG_SIGNATURE 21
617+
#define CMSG_CTRL_ENABLE_STRONG_SIGNATURE 21
618+
619+
620+
//+-------------------------------------------------------------------------
621+
// The following flag should be set in the above dwFlags to enable
622+
// a CertSetCertificateContextProperty(CERT_KEY_CONTEXT_PROP_ID) after a
623+
// CryptAcquireContext is done in the Sign or Decrypt Message functions.
624+
//
625+
// The following define must not collide with any of the
626+
// CryptAcquireContext dwFlag defines.
627+
//--------------------------------------------------------------------------
628+
#define CERT_SET_KEY_PROV_HANDLE_PROP_ID 0x00000001
629+
#define CERT_SET_KEY_CONTEXT_PROP_ID 0x00000001
630+
631+
// Special dwKeySpec indicating a CNG NCRYPT_KEY_HANDLE instead of a CAPI1
632+
// HCRYPTPROV
633+
#define CERT_NCRYPT_KEY_SPEC 0xFFFFFFFF
634+
635+
636+
#define CERT_REQUEST_V1 0

ctypes_generation/definitions/functions/crypto_wintrust.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,4 +617,28 @@ BOOL CryptGetOIDFunctionValue(
617617
BOOL CertCloseStore(
618618
HCERTSTORE hCertStore,
619619
DWORD dwFlags
620+
);
621+
622+
BOOL CryptSignAndEncodeCertificate(
623+
[in] BCRYPT_KEY_HANDLE hBCryptKey,
624+
[in] DWORD dwKeySpec,
625+
[in] DWORD dwCertEncodingType,
626+
[in] LPCSTR lpszStructType,
627+
[in] PVOID pvStructInfo,
628+
[in] PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
629+
[in] PVOID pvHashAuxInfo,
630+
[out] BYTE *pbEncoded,
631+
[in, out] DWORD *pcbEncoded
632+
);
633+
634+
BOOL CryptSignCertificate(
635+
[in] BCRYPT_KEY_HANDLE hBCryptKey,
636+
[in] DWORD dwKeySpec,
637+
[in] DWORD dwCertEncodingType,
638+
[in] BYTE *pbEncodedToBeSigned,
639+
[in] DWORD cbEncodedToBeSigned,
640+
[in] PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
641+
[in] PVOID pvHashAuxInfo,
642+
[out] BYTE *pbSignature,
643+
[in, out] DWORD *pcbSignature
620644
);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
SECURITY_STATUS NCryptOpenKey(
2+
[in] NCRYPT_PROV_HANDLE hProvider,
3+
[out] NCRYPT_KEY_HANDLE *phKey,
4+
[in] LPCWSTR pszKeyName,
5+
[in] DWORD dwLegacyKeySpec,
6+
[in] DWORD dwFlags
7+
);
8+
9+
10+
SECURITY_STATUS NCryptOpenStorageProvider(
11+
[out] NCRYPT_PROV_HANDLE *phProvider,
12+
[in, optional] LPCWSTR pszProviderName,
13+
[in] DWORD dwFlags
14+
);

ctypes_generation/definitions/simple_types.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ PWINDBG_EXTENSION_APIS32 = PVOID
8686
PWINDBG_EXTENSION_APIS64 = PVOID
8787
FILEOP_FLAGS = WORD
8888
NET_API_STATUS = DWORD
89+
SECURITY_STATUS = LONG // Return type of ncrypt functions
8990

9091

9192
// 2 custom PFW defintions for bitness-forces structures
@@ -94,6 +95,7 @@ PVOID64 = DWORD64
9495

9596
NCRYPT_HANDLE = ULONG_PTR
9697
NCRYPT_PROV_HANDLE = ULONG_PTR
98+
BCRYPT_KEY_HANDLE = ULONG_PTR
9799
NCRYPT_KEY_HANDLE = ULONG_PTR
98100
NCRYPT_HASH_HANDLE = ULONG_PTR
99101
NCRYPT_SECRET_HANDLE = ULONG_PTR

ctypes_generation/definitions/structures/crypto.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,4 +715,12 @@ typedef struct _STRUCT_PLAINTEXTKEYBLOB {
715715
BLOBHEADER hdr;
716716
DWORD dwKeySize;
717717
BYTE rgbKeyData[0];
718-
} STRUCT_PLAINTEXTKEYBLOB, *PSTRUCT_PLAINTEXTKEYBLOB;
718+
} STRUCT_PLAINTEXTKEYBLOB, *PSTRUCT_PLAINTEXTKEYBLOB;
719+
720+
typedef struct _CERT_REQUEST_INFO {
721+
DWORD dwVersion;
722+
CERT_NAME_BLOB Subject;
723+
CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
724+
DWORD cAttribute;
725+
PCRYPT_ATTRIBUTE rgAttribute;
726+
} CERT_REQUEST_INFO, *PCERT_REQUEST_INFO;

docs/source/windef_generated.rst

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3344,6 +3344,37 @@ WinDef
33443344
.. autodata:: CRYPT_SGCKEY
33453345
.. autodata:: CRYPT_ARCHIVABLE
33463346
.. autodata:: CRYPT_FORCE_KEY_PROTECTION_HIGH
3347+
.. autodata:: CERT_RDN_ANY_TYPE
3348+
.. autodata:: CERT_RDN_ENCODED_BLOB
3349+
.. autodata:: CERT_RDN_OCTET_STRING
3350+
.. autodata:: CERT_RDN_NUMERIC_STRING
3351+
.. autodata:: CERT_RDN_PRINTABLE_STRING
3352+
.. autodata:: CERT_RDN_TELETEX_STRING
3353+
.. autodata:: CERT_RDN_T61_STRING
3354+
.. autodata:: CERT_RDN_VIDEOTEX_STRING
3355+
.. autodata:: CERT_RDN_IA5_STRING
3356+
.. autodata:: CERT_RDN_GRAPHIC_STRING
3357+
.. autodata:: CERT_RDN_VISIBLE_STRING
3358+
.. autodata:: CERT_RDN_ISO646_STRING
3359+
.. autodata:: CERT_RDN_GENERAL_STRING
3360+
.. autodata:: CERT_RDN_UNIVERSAL_STRING
3361+
.. autodata:: CERT_RDN_INT4_STRING
3362+
.. autodata:: CERT_RDN_BMP_STRING
3363+
.. autodata:: CERT_RDN_UNICODE_STRING
3364+
.. autodata:: CERT_RDN_UTF8_STRING
3365+
.. autodata:: CERT_RDN_TYPE_MASK
3366+
.. autodata:: CERT_RDN_FLAGS_MASK
3367+
.. autodata:: CERT_RDN_ENABLE_T61_UNICODE_FLAG
3368+
.. autodata:: CERT_RDN_ENABLE_UTF8_UNICODE_FLAG
3369+
.. autodata:: CERT_RDN_FORCE_UTF8_UNICODE_FLAG
3370+
.. autodata:: CERT_RDN_DISABLE_CHECK_TYPE_FLAG
3371+
.. autodata:: CERT_RDN_DISABLE_IE4_UTF8_FLAG
3372+
.. autodata:: CRYPT_DECODE_NOCOPY_FLAG
3373+
.. autodata:: CRYPT_DECODE_TO_BE_SIGNED_FLAG
3374+
.. autodata:: CRYPT_DECODE_SHARE_OID_STRING_FLAG
3375+
.. autodata:: CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG
3376+
.. autodata:: CRYPT_DECODE_ALLOC_FLAG
3377+
.. autodata:: CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG
33473378
.. autodata:: CRYPT_ENCODE_DECODE_NONE
33483379
.. autodata:: X509_CERT
33493380
.. autodata:: X509_CERT_TO_BE_SIGNED
@@ -3482,6 +3513,10 @@ WinDef
34823513
.. autodata:: CMSG_CTRL_VERIFY_SIGNATURE_EX
34833514
.. autodata:: CMSG_CTRL_ADD_CMS_SIGNER_INFO
34843515
.. autodata:: CMSG_CTRL_ENABLE_STRONG_SIGNATURE
3516+
.. autodata:: CERT_SET_KEY_PROV_HANDLE_PROP_ID
3517+
.. autodata:: CERT_SET_KEY_CONTEXT_PROP_ID
3518+
.. autodata:: CERT_NCRYPT_KEY_SPEC
3519+
.. autodata:: CERT_REQUEST_V1
34853520
.. autodata:: WSADESCRIPTION_LEN
34863521
.. autodata:: WSASYS_STATUS_LEN
34873522
.. autodata:: WSAPROTOCOL_LEN

docs/source/winfuncs_generated.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ Functions
326326

327327
.. function:: CertCloseStore(hCertStore, dwFlags)
328328

329+
.. function:: CryptSignAndEncodeCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded)
330+
331+
.. function:: CryptSignCertificate(hBCryptKey, dwKeySpec, dwCertEncodingType, pbEncodedToBeSigned, cbEncodedToBeSigned, pSignatureAlgorithm, pvHashAuxInfo, pbSignature, pcbSignature)
332+
329333
.. function:: OpenVirtualDisk(VirtualStorageType, Path, VirtualDiskAccessMask, Flags, Parameters, Handle)
330334

331335
.. function:: AttachVirtualDisk(VirtualDiskHandle, SecurityDescriptor, Flags, ProviderSpecificFlags, Parameters, Overlapped)
@@ -592,6 +596,10 @@ Functions
592596

593597
.. function:: UnmapViewOfFile(lpBaseAddress)
594598

599+
.. function:: NCryptOpenKey(hProvider, phKey, pszKeyName, dwLegacyKeySpec, dwFlags)
600+
601+
.. function:: NCryptOpenStorageProvider(phProvider, pszProviderName, dwFlags)
602+
595603
.. function:: NetQueryDisplayInformation(ServerName, Level, Index, EntriesRequested, PreferredMaximumLength, ReturnedEntryCount, SortedBuffer)
596604

597605
.. function:: NetUserEnum(servername, level, filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle)

docs/source/winstructs_generated.rst

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ Simple types
247247

248248
.. autoclass:: NET_API_STATUS
249249

250+
.. autoclass:: SECURITY_STATUS
251+
250252
.. autoclass:: PVOID32
251253

252254
.. autoclass:: PVOID64
@@ -255,6 +257,8 @@ Simple types
255257

256258
.. autoclass:: NCRYPT_PROV_HANDLE
257259

260+
.. autoclass:: BCRYPT_KEY_HANDLE
261+
258262
.. autoclass:: NCRYPT_KEY_HANDLE
259263

260264
.. autoclass:: NCRYPT_HASH_HANDLE
@@ -21113,6 +21117,42 @@ _STRUCT_PLAINTEXTKEYBLOB
2111321117

2111421118
:class:`BYTE` ``[0]``
2111521119

21120+
_CERT_REQUEST_INFO
21121+
''''''''''''''''''
21122+
.. class:: CERT_REQUEST_INFO
21123+
21124+
Alias for :class:`_CERT_REQUEST_INFO`
21125+
21126+
.. class:: PCERT_REQUEST_INFO
21127+
21128+
Pointer to :class:`_CERT_REQUEST_INFO`
21129+
21130+
.. class:: _CERT_REQUEST_INFO
21131+
21132+
.. attribute:: dwVersion
21133+
21134+
:class:`DWORD`
21135+
21136+
21137+
.. attribute:: Subject
21138+
21139+
:class:`CERT_NAME_BLOB`
21140+
21141+
21142+
.. attribute:: SubjectPublicKeyInfo
21143+
21144+
:class:`CERT_PUBLIC_KEY_INFO`
21145+
21146+
21147+
.. attribute:: cAttribute
21148+
21149+
:class:`DWORD`
21150+
21151+
21152+
.. attribute:: rgAttribute
21153+
21154+
:class:`PCRYPT_ATTRIBUTE`
21155+
2111621156
_EXCEPTION_DEBUG_INFO
2111721157
'''''''''''''''''''''
2111821158
.. class:: EXCEPTION_DEBUG_INFO

tests/test_rpc.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,42 @@ def test_rpc_response_as_view():
157157
# Flags = 7 ?
158158
resp2 = client.call(iid, Proc9_RPC_FWEnumFirewallRules, params=rawpolstore + b"\x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00")
159159
assert client.last_response_was_view
160+
161+
# This cannot work as is: as juste calling NtAlpcDeleteSectionView does not works.
162+
# 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.
163+
# More alpc client/serer test need to be done
164+
165+
# def test_rpc_response_as_view_is_unmapped():
166+
# """Test that when a RCP client response as a view, it is unmapped and does not take place in memory ater the call
167+
# It's not private memory, but it take some place in the AS : which can be problematic in 32b python"""
168+
# # 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
169+
# client = windows.rpc.find_alpc_endpoint_and_connect(FIREWALL_RPC_IID, sid=gdef.WinLocalSid)
170+
# client.__class__ = DbgRpcClient
171+
# iid = client.bind(FIREWALL_RPC_IID)
172+
#
173+
# # https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fasp/230d1ae7-b42e-4d9c-b997-b1463aaa0ded
174+
# # !\x02\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00
175+
# # Binaryversion : 0x022f
176+
# # FW_STORE_TYPE_LOCAL
177+
# # FW_POLICY_ACCESS_RIGHT_READ
178+
# # Flags = 0
179+
# resp1 = client.call(iid, Proc0_RPC_FWOpenPolicyStore, params=b"!\x02\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00")
180+
# rawpolstore = resp1[:20]
181+
# assert not client.last_response_was_view
182+
# initial_ws_size = windows.current_process.memory_info.WorkingSetSize
183+
# ws_sizes = []
184+
#
185+
# for i in range(100):
186+
# # Proc9_RPC_FWEnumFirewallRules
187+
# # \x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00
188+
# # https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fasp/36cddff4-c427-4863-a58d-3d913a12b221
189+
# # FW_PROFILE_TYPE_ALL : 0x7FFFFFFF
190+
# # FW_RULE_STATUS_CLASS_OK + FW_RULE_STATUS_PARTIALLY_IGNORED = 0x00010000 + 0x00020000
191+
# # Flags = 7 ?
192+
# resp2 = client.call(iid, Proc9_RPC_FWEnumFirewallRules, params=rawpolstore + b"\x00\x00\x03\x00\xff\xff\xff\x7f\x07\x00")
193+
# assert client.last_response_was_view
194+
# ws_sizes.append(windows.current_process.memory_info.WorkingSetSize - initial_ws_size)
195+
# print("WorkingSetSize: {0}".format(windows.current_process.memory_info.WorkingSetSize))
196+
# assert max(ws_sizes) - min(ws_sizes) < (1024 ** 2) # We should not vary more than 1 MO ?
197+
# # Check if not all ws_size is not 4k bigger that the last one
198+
# assert not all((ws_sizes[i+1] - ws_sizes[i] > 0x1000) for i in range(len(ws_sizes) - 1))

0 commit comments

Comments
 (0)