[PATCH 3/5] lib: ecdsa: Implement signature verification for crypto_algo API

Alex G. mr.nuke.me at gmail.com
Tue Feb 9 23:58:56 CET 2021


On 2/9/21 9:56 AM, Patrick DELAUNAY wrote:
> Hi,

[snip]

>> diff --git a/lib/ecdsa/ecdsa-verify.c b/lib/ecdsa/ecdsa-verify.c
>> index d2e6a40f4a..d84f6eb093 100644
>> --- a/lib/ecdsa/ecdsa-verify.c
>> +++ b/lib/ecdsa/ecdsa-verify.c
>> @@ -1,13 +1,128 @@
>>   // SPDX-License-Identifier: GPL-2.0+
>>   /*
>> + * ECDSA signature verification for u-boot
>> + *
>> + * This implements the firmware-side wrapper for ECDSA verification. 
>> It bridges
>> + * the struct crypto_algo API to the ECDSA uclass implementations.
>> + *
>>    * Copyright (c) 2020, Alexandru Gagniuc<mr.nuke.me at gmail.com>
>>    */
> 
> http://www.denx.de/wiki/U-Boot/CodingStyle #Include files
> 
> #include <crypto/ecdsa-uclass.h>
> 
> it is normally the first in alphabetic order of directory

Thank your for catching that. I will have it fixed in the next iteration 
of this series.

>> +#include <dm/uclass.h>
>>   #include <u-boot/ecdsa.h>
>> +#include <crypto/ecdsa-uclass.h>
>> +
>> +/*
>> + * Derive size of an ECDSA key from the curve name
>> + *
>> + * While it's possible to extract the key size by using string 
>> manipulation,
>> + * use a list of known curves for the time being.
>> + */
>> +static int ecdsa_key_size(const char *curve_name)
>> +{
>> +    if (!strcmp(curve_name, "prime256v1"))
>> +        return 256;
>> +    else
>> +        return 0;
>> +}
>> +
> 
> 
> To prepare the future can you parse a array of supported curves with 
> associated ID
> 
> used as parameter of ECDSA parameter = enum ECDSA_CURVES
> 
> for example: char * name, int size, enum ECDSA_CURVES
> 
> const [] = {
> {"prime256v1", 256, ECDSA_PRIME256V1 },
> 
> }

That is possible. If I were to have a longer list of curve names, I 
change things to extract the key length from the name itself. So instead 
of running strncmp() of N keyname strings, I would extract the digits 
from 'curve_name'.

I chose not to do that here because I want this patch to be didactic. 
That is, I'm trying to achieve the goal clearly, with the lowest number 
of lines of code.

[snip]

>> +static int ecdsa_verify_hash(struct udevice *dev,
>> +                 const struct image_sign_info *info,
>> +                 const void *hash, const void *sig, uint sig_len)
>> +{
>> +    const struct ecdsa_ops *ops = device_get_ops(dev);
>> +    const struct checksum_algo *algo = info->checksum;
>> +    struct ecdsa_public_key key;
>> +    int sig_node, key_node, ret;
>> +
>> +    if (!ops || !ops->verify)
>> +        return -ENODEV;
>> +
>> +    if (info->required_keynode > 0) {
>> +        ret = fdt_get_key(&key, info->fdt_blob, info->required_keynode);
>> +        if (ret < 0)
>> +            return ret;
>> +
>> +        return ops->verify(dev, &key, hash, algo->checksum_len,
>> +                   sig, sig_len);
> 
> 
> Need to indicate the used curve here as parameter of the verify opts ?

The curve name is part of the key (struct ecdsa_public_key).


[snip]
>> +        ret = ops->verify(dev, &key, hash, algo->checksum_len,
>> +                  sig, sig_len);
>> +
>> +        /* On success, don't worry about remaining keys */
>> +        if (ret == 0)
> 
> 
> issue raised by chekpatch I think
> 
> if (!ret)

Oh! I'll get this fixed. Thanks!

Alex


More information about the U-Boot mailing list