[PATCH v3 5/5] ncrypt: Implement NCryptFinalizeKey

Hans Leidekker hans at codeweavers.com
Tue Mar 8 04:17:47 CST 2022


On Mon, 2022-03-07 at 20:57 -0300, Santino Mazza wrote:
> Signed-off-by: Santino Mazza <mazzasantino1206 at gmail.com>
> ---
>  dlls/ncrypt/main.c            | 48 ++++++++++++++++++++++++++++++-----
>  dlls/ncrypt/ncrypt_internal.h |  1 +
>  dlls/ncrypt/tests/ncrypt.c    | 25 ++++++++++++++++++
>  3 files changed, 68 insertions(+), 6 deletions(-)
> 
> diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
> index d4248e76c45..81dca4196e0 100644
> --- a/dlls/ncrypt/main.c
> +++ b/dlls/ncrypt/main.c
> @@ -66,12 +66,6 @@ SECURITY_STATUS WINAPI NCryptEnumKeys(NCRYPT_PROV_HANDLE provider, const WCHAR *
>      return NTE_NOT_SUPPORTED;
>  }
>  
> -SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
> -{
> -    FIXME("(%#Ix, %#lx): stub\n", key, flags);
> -    return NTE_NOT_SUPPORTED;
> -}
> -
>  SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID buf)
>  {
>      FIXME("(%p): stub\n", buf);
> @@ -403,6 +397,48 @@ SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCR
>      return ERROR_SUCCESS;
>  }
> 
>  
> +SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
> +{
> +    struct object *key_object = (struct object*)key;
> +    DWORD key_length;
> +    struct object_property *prop;
> +    NTSTATUS ret;
> +
> +    TRACE("(%#Ix, %#lx): stub\n", key, flags);
> +
> +    if (!key) return NTE_INVALID_HANDLE;
> +    if (key_object->key.finalized_key) return NTE_INVALID_HANDLE;
> +
> +    if (key_object->key.type == ASYMMETRIC)
> +    {
> +        prop = get_object_property(key_object, NCRYPT_LENGTH_PROPERTY);
> +        if (!prop) return NTE_INVALID_HANDLE;
> +
> +        key_length = *(DWORD *)prop->value;
> +        BCryptSetProperty(key_object->key.bcrypt_key, BCRYPT_KEY_LENGTH, (UCHAR*)&key_length, sizeof(key_length), 0);
> +
> +        ret = BCryptFinalizeKeyPair(key_object->key.bcrypt_key, 0);
> +        if (ret != ERROR_SUCCESS)
> +        {
> +            ERR("Error finalizing key pair\n");
> +            return NTE_INTERNAL_ERROR;
> +        }
> +    }
> +    else if (key_object->key.type == SYMMETRIC)
> +    {
> +        FIXME("Symmetric keys not implemented\n");
> +        return NTE_NOT_SUPPORTED;
> +    }
> +    else
> +    {
> +        ERR("Got handle with invalid key type");
> +        return NTE_INVALID_HANDLE;
> +    }
> +
> +    key_object->key.finalized_key = 1;
> +    return ERROR_SUCCESS;
> +}
> +

There's no need to move this function. Do you really need finalized_key? If
BCryptFinalizeKeyPair() fails when called a second time we should implement
that and rely on it here.





More information about the wine-devel mailing list