From: Michael Müller michael@fds-team.de
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/bcrypt/bcrypt_main.c | 89 ++++++++++++++++++++++++++++++++-------------- dlls/bcrypt/tests/bcrypt.c | 4 +++ 2 files changed, 67 insertions(+), 26 deletions(-)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index a08eb00269..c5eefa49f4 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -679,32 +679,6 @@ NTSTATUS WINAPI BCryptGetProperty( BCRYPT_HANDLE handle, LPCWSTR prop, UCHAR *bu } }
-NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) -{ - struct object *object = handle; - - TRACE( "%p, %s, %p, %u, %08x\n", handle, debugstr_w(prop), value, size, flags ); - - if (!object) return STATUS_INVALID_HANDLE; - - switch (object->magic) - { - case MAGIC_ALG: - { - struct algorithm *alg = (struct algorithm *)object; - return set_alg_property( alg, prop, value, size, flags ); - } - case MAGIC_KEY: - { - FIXME( "keys not implemented yet\n" ); - return STATUS_NOT_IMPLEMENTED; - } - default: - WARN( "unknown magic %08x\n", object->magic ); - return STATUS_INVALID_HANDLE; - } -} - NTSTATUS WINAPI BCryptCreateHash( BCRYPT_ALG_HANDLE algorithm, BCRYPT_HASH_HANDLE *handle, UCHAR *object, ULONG objectlen, UCHAR *secret, ULONG secretlen, ULONG flags ) { @@ -954,6 +928,57 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s return STATUS_SUCCESS; }
+static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{ + if (!strcmpW( prop, BCRYPT_CHAINING_MODE )) + { + if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_CBC, size )) + { + key->mode = MODE_ID_CBC; + return STATUS_SUCCESS; + } + else if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_GCM, size )) + { + key->mode = MODE_ID_GCM; + return STATUS_SUCCESS; + } + else + { + FIXME( "unsupported mode %s\n", debugstr_wn( (WCHAR *)value, size ) ); + return STATUS_NOT_IMPLEMENTED; + } + } + + FIXME( "unsupported key property %s\n", debugstr_w(prop) ); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{ + struct object *object = handle; + + TRACE( "%p, %s, %p, %u, %08x\n", handle, debugstr_w(prop), value, size, flags ); + + if (!object) return STATUS_INVALID_HANDLE; + + switch (object->magic) + { + case MAGIC_ALG: + { + struct algorithm *alg = (struct algorithm *)object; + return set_alg_property( alg, prop, value, size, flags ); + } + case MAGIC_KEY: + { + struct key *key = (struct key *)object; + return set_key_property( key, prop, value, size, flags ); + } + default: + WARN( "unknown magic %08x\n", object->magic ); + return STATUS_INVALID_HANDLE; + } +} + static gnutls_cipher_algorithm_t get_gnutls_cipher( const struct key *key ) { switch (key->alg_id) @@ -1089,6 +1114,12 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s return STATUS_SUCCESS; }
+static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{ + FIXME( "not implemented on Mac\n" ); + return STATUS_NOT_IMPLEMENTED; +} + static NTSTATUS key_set_params( struct key *key, UCHAR *iv, ULONG iv_len ) { CCCryptorStatus status; @@ -1171,6 +1202,12 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s return STATUS_NOT_IMPLEMENTED; }
+static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{ + ERR( "support for keys not available at build time\n" ); + return STATUS_NOT_IMPLEMENTED; +} + static NTSTATUS key_set_params( struct key *key, UCHAR *iv, ULONG iv_len ) { ERR( "support for keys not available at build time\n" ); diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 1176796dbc..9922e4114f 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -525,6 +525,10 @@ static void test_BCryptGenerateSymmetricKey(void) sizeof(BCRYPT_CHAIN_MODE_CBC), 0); ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
+ ret = pBCryptSetProperty(key, BCRYPT_CHAINING_MODE, (UCHAR *)BCRYPT_CHAIN_MODE_CBC, + sizeof(BCRYPT_CHAIN_MODE_CBC), 0); + ok(ret == STATUS_SUCCESS || broken(ret == STATUS_NOT_SUPPORTED) /* < Win 8 */, "got %08x\n", ret); + size = 0xdeadbeef; ret = pBCryptEncrypt(key, NULL, 0, NULL, NULL, 0, NULL, 0, &size, 0); ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
On Tue, 2018-03-20 at 11:14 +0000, Alistair Leslie-Hughes wrote:
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index a08eb00269..c5eefa49f4 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -679,32 +679,6 @@ NTSTATUS WINAPI BCryptGetProperty( BCRYPT_HANDLE handle, LPCWSTR prop, UCHAR *bu } }
-NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) -{
- struct object *object = handle;
- TRACE( "%p, %s, %p, %u, %08x\n", handle, debugstr_w(prop), value, size, flags );
- if (!object) return STATUS_INVALID_HANDLE;
- switch (object->magic)
- {
- case MAGIC_ALG:
- {
struct algorithm *alg = (struct algorithm *)object;
return set_alg_property( alg, prop, value, size, flags );
- }
- case MAGIC_KEY:
- {
FIXME( "keys not implemented yet\n" );
return STATUS_NOT_IMPLEMENTED;
- }
- default:
WARN( "unknown magic %08x\n", object->magic );
return STATUS_INVALID_HANDLE;
- }
-}
NTSTATUS WINAPI BCryptCreateHash( BCRYPT_ALG_HANDLE algorithm, BCRYPT_HASH_HANDLE *handle, UCHAR *object, ULONG objectlen, UCHAR *secret, ULONG secretlen, ULONG flags ) { @@ -954,6 +928,57 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s return STATUS_SUCCESS; }
+static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{
- if (!strcmpW( prop, BCRYPT_CHAINING_MODE ))
- {
if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_CBC, size ))
{
key->mode = MODE_ID_CBC;
return STATUS_SUCCESS;
}
else if (!strncmpW( (WCHAR *)value, BCRYPT_CHAIN_MODE_GCM, size ))
{
key->mode = MODE_ID_GCM;
return STATUS_SUCCESS;
}
else
{
FIXME( "unsupported mode %s\n", debugstr_wn( (WCHAR *)value, size ) );
return STATUS_NOT_IMPLEMENTED;
}
- }
- FIXME( "unsupported key property %s\n", debugstr_w(prop) );
- return STATUS_NOT_IMPLEMENTED;
+}
+NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) +{
- struct object *object = handle;
- TRACE( "%p, %s, %p, %u, %08x\n", handle, debugstr_w(prop), value, size, flags );
- if (!object) return STATUS_INVALID_HANDLE;
- switch (object->magic)
- {
- case MAGIC_ALG:
- {
struct algorithm *alg = (struct algorithm *)object;
return set_alg_property( alg, prop, value, size, flags );
- }
- case MAGIC_KEY:
- {
struct key *key = (struct key *)object;
return set_key_property( key, prop, value, size, flags );
- }
- default:
WARN( "unknown magic %08x\n", object->magic );
return STATUS_INVALID_HANDLE;
- }
This will cause a build failure if gnutls is missing. You need to move BCryptSetProperty all the way down, outside of conditionally compiled code.