[v2 PATCH 5/5] bcrypt: Allow to call BCryptSetProperty on key objects.

Hans Leidekker hans at codeweavers.com
Tue Mar 20 06:34:09 CDT 2018


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.




More information about the wine-devel mailing list