From b52c6bfbb138ea2e516c757710ad7272c40b74ec Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 7 Dec 2021 17:54:01 +0100 Subject: [PATCH] crypt32: Implement Wow64 entry points in the Unix library. Signed-off-by: Alexandre Julliard --- dlls/crypt32/crypt32_private.h | 10 +-- dlls/crypt32/pfx.c | 4 +- dlls/crypt32/unixlib.c | 121 +++++++++++++++++++++++++++++++-- 3 files changed, 122 insertions(+), 13 deletions(-) diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h index 7fed1665d56..f4131bf2694 100644 --- a/dlls/crypt32/crypt32_private.h +++ b/dlls/crypt32/crypt32_private.h @@ -461,25 +461,25 @@ void init_empty_store(void) DECLSPEC_HIDDEN; /* Unix interface */ -struct cert_store_data; +typedef UINT64 cert_store_data_t; struct open_cert_store_params { CRYPT_DATA_BLOB *pfx; const WCHAR *password; - struct cert_store_data **data_ret; + cert_store_data_t *data_ret; }; struct import_store_key_params { - struct cert_store_data *data; + cert_store_data_t data; void *buf; DWORD *buf_size; }; struct import_store_cert_params { - struct cert_store_data *data; + cert_store_data_t data; unsigned int index; void *buf; DWORD *buf_size; @@ -487,7 +487,7 @@ struct import_store_cert_params struct close_cert_store_params { - struct cert_store_data *data; + cert_store_data_t data; }; struct enum_root_certs_params diff --git a/dlls/crypt32/pfx.c b/dlls/crypt32/pfx.c index 1dd048c2b67..ca29c2aadfc 100644 --- a/dlls/crypt32/pfx.c +++ b/dlls/crypt32/pfx.c @@ -32,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); -static HCRYPTPROV import_key( struct cert_store_data *data, DWORD flags ) +static HCRYPTPROV import_key( cert_store_data_t data, DWORD flags ) { HCRYPTPROV prov = 0; HCRYPTKEY cryptkey; @@ -145,7 +145,7 @@ HCERTSTORE WINAPI PFXImportCertStore( CRYPT_DATA_BLOB *pfx, const WCHAR *passwor DWORD i = 0, size; HCERTSTORE store = NULL; HCRYPTPROV prov = 0; - struct cert_store_data *data = NULL; + cert_store_data_t data = 0; struct open_cert_store_params open_params = { pfx, password, &data }; struct close_cert_store_params close_params; diff --git a/dlls/crypt32/unixlib.c b/dlls/crypt32/unixlib.c index 7cb521eb98b..a345b5e6ac8 100644 --- a/dlls/crypt32/unixlib.c +++ b/dlls/crypt32/unixlib.c @@ -161,10 +161,15 @@ struct cert_store_data unsigned int chain_len; }; +static struct cert_store_data *get_store_data( cert_store_data_t data ) +{ + return (struct cert_store_data *)(ULONG_PTR)data; +} + static NTSTATUS import_store_key( void *args ) { struct import_store_key_params *params = args; - struct cert_store_data *data = params->data; + struct cert_store_data *data = get_store_data( params->data ); int i, ret; unsigned int bitlen = data->key_bitlen; gnutls_datum_t m, e, d, p, q, u, e1, e2; @@ -303,7 +308,7 @@ static NTSTATUS open_cert_store( void *args ) store_data->chain = chain; store_data->key_bitlen = bitlen; store_data->chain_len = chain_len; - *params->data_ret = store_data; + *params->data_ret = (ULONG_PTR)store_data; return STATUS_SUCCESS; error: @@ -316,7 +321,7 @@ error: static NTSTATUS import_store_cert( void *args ) { struct import_store_cert_params *params = args; - struct cert_store_data *data = params->data; + struct cert_store_data *data = get_store_data( params->data ); size_t size = 0; int ret; @@ -339,11 +344,12 @@ static NTSTATUS import_store_cert( void *args ) static NTSTATUS close_cert_store( void *args ) { struct close_cert_store_params *params = args; + struct cert_store_data *data = get_store_data( params->data ); if (params->data) { - pgnutls_pkcs12_deinit( params->data->p12 ); - free( params->data ); + pgnutls_pkcs12_deinit( data->p12 ); + free( data ); } return STATUS_SUCCESS; } @@ -678,7 +684,7 @@ static NTSTATUS enum_root_certs( void *args ) return STATUS_SUCCESS; } -unixlib_entry_t __wine_unix_call_funcs[] = +const unixlib_entry_t __wine_unix_call_funcs[] = { process_attach, process_detach, @@ -688,3 +694,106 @@ unixlib_entry_t __wine_unix_call_funcs[] = close_cert_store, enum_root_certs, }; + +#ifdef _WIN64 + +typedef ULONG PTR32; + +typedef struct +{ + DWORD cbData; + PTR32 pbData; +} CRYPT_DATA_BLOB32; + +static NTSTATUS wow64_open_cert_store( void *args ) +{ + struct + { + PTR32 pfx; + PTR32 password; + PTR32 data_ret; + } const *params32 = args; + + const CRYPT_DATA_BLOB32 *pfx32 = ULongToPtr( params32->pfx ); + CRYPT_DATA_BLOB pfx = { pfx32->cbData, ULongToPtr( pfx32->pbData ) }; + struct open_cert_store_params params = + { + &pfx, + ULongToPtr( params32->password ), + ULongToPtr( params32->data_ret ) + }; + + return open_cert_store( ¶ms ); +} + +static NTSTATUS wow64_import_store_key( void *args ) +{ + struct + { + cert_store_data_t data; + PTR32 buf; + PTR32 buf_size; + } const *params32 = args; + + struct import_store_key_params params = + { + params32->data, + ULongToPtr( params32->buf ), + ULongToPtr( params32->buf_size ) + }; + + return import_store_key( ¶ms ); +} + +static NTSTATUS wow64_import_store_cert( void *args ) +{ + struct + { + cert_store_data_t data; + unsigned int index; + PTR32 buf; + PTR32 buf_size; + } const *params32 = args; + + struct import_store_cert_params params = + { + params32->data, + params32->index, + ULongToPtr( params32->buf ), + ULongToPtr( params32->buf_size ) + }; + + return import_store_cert( ¶ms ); +} + +static NTSTATUS wow64_enum_root_certs( void *args ) +{ + struct + { + PTR32 buffer; + DWORD size; + PTR32 needed; + } const *params32 = args; + + struct enum_root_certs_params params = + { + ULongToPtr( params32->buffer ), + params32->size, + ULongToPtr( params32->needed ) + }; + + return enum_root_certs( ¶ms ); +} + +const unixlib_entry_t __wine_unix_call_wow64_funcs[] = +{ + process_attach, + process_detach, + wow64_open_cert_store, + wow64_import_store_key, + wow64_import_store_cert, + close_cert_store, + wow64_enum_root_certs, +}; + +#endif /* _WIN64 */