forked from Mirrors/wine-wine
bcrypt: Allow to call BCryptSetProperty on key objects.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com> Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>oldstable
parent
1f78267530
commit
1b999a447b
|
@ -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,
|
NTSTATUS WINAPI BCryptCreateHash( BCRYPT_ALG_HANDLE algorithm, BCRYPT_HASH_HANDLE *handle, UCHAR *object, ULONG objectlen,
|
||||||
UCHAR *secret, ULONG secretlen, ULONG flags )
|
UCHAR *secret, ULONG secretlen, ULONG flags )
|
||||||
{
|
{
|
||||||
|
@ -954,6 +928,31 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s
|
||||||
return STATUS_SUCCESS;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
static gnutls_cipher_algorithm_t get_gnutls_cipher( const struct key *key )
|
static gnutls_cipher_algorithm_t get_gnutls_cipher( const struct key *key )
|
||||||
{
|
{
|
||||||
switch (key->alg_id)
|
switch (key->alg_id)
|
||||||
|
@ -1089,6 +1088,12 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s
|
||||||
return STATUS_SUCCESS;
|
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 )
|
static NTSTATUS key_set_params( struct key *key, UCHAR *iv, ULONG iv_len )
|
||||||
{
|
{
|
||||||
CCCryptorStatus status;
|
CCCryptorStatus status;
|
||||||
|
@ -1171,6 +1176,12 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, const UCHAR *s
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
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 )
|
static NTSTATUS key_set_params( struct key *key, UCHAR *iv, ULONG iv_len )
|
||||||
{
|
{
|
||||||
ERR( "support for keys not available at build time\n" );
|
ERR( "support for keys not available at build time\n" );
|
||||||
|
@ -1478,6 +1489,32 @@ NTSTATUS WINAPI BCryptDecrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
|
BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
|
||||||
{
|
{
|
||||||
switch (reason)
|
switch (reason)
|
||||||
|
|
|
@ -525,6 +525,10 @@ static void test_BCryptGenerateSymmetricKey(void)
|
||||||
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
||||||
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
|
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;
|
size = 0xdeadbeef;
|
||||||
ret = pBCryptEncrypt(key, NULL, 0, NULL, NULL, 0, NULL, 0, &size, 0);
|
ret = pBCryptEncrypt(key, NULL, 0, NULL, NULL, 0, NULL, 0, &size, 0);
|
||||||
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
|
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
|
||||||
|
|
Loading…
Reference in New Issue