[email protected] (Niels Möller) writes:
> I'd like to post the interface I use for low-level ecc functions.
And here's the current interface for ECDSA functions. Low-level
functions with similar conventions as the low-level ecc functions. And
high-level functions using mpz_t for arguments, and using the same
allocation function as GMP for storage.
For the RSA signature functions, we have a larger number of functions of
the form rsa_<hash-algorithm>_sign, mostly because the pkcs#1 padding
wants to embed the hash algorithm object identifier.
But for ecdsa, do we need any functions like that? I guess, for
convenience and consistency, it would make sense with some functions
like
void
ecdsa_sha256_sign (const struct ecdsa_private_key *key,
void *random_ctx, nettle_random_func *random,
struct sha256_ctx *hash,
struct dsa_signature *signature);
which take a hashing context as argument. Which hash functions are
people using for ecdsa with the various curves? RFC 4754 (IKE and IKEv2
Authentication Using ECDSA) defines:
Digital
Signature
Algorithm Elliptic Curve Group Hash Function
----------- -------------------------- ---------------
ECDSA-256 256-bit random ECP group SHA-256
ECDSA-384 384-bit random ECP group SHA-384
ECDSA-521 521-bit random ECP group SHA-512
Is this typical? (Then it's the first time I've seen a specification
using). I implement also secp192r1 and secp224r1, which I guess would be
used with sha256 (or possibly sha224).
Regards,
/Niels
/* ecdsa.h */
/* nettle, low-level cryptographics library
*
* Copyright (C) 2013 Niels Möller
*
* The nettle library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* The nettle library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the nettle library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02111-1301, USA.
*/
/* Development of Nettle's ECC support was funded by Internetfonden. */
#ifndef NETTLE_ECDSA_H_INCLUDED
#define NETTLE_ECDSA_H_INCLUDED
#include <nettle/dsa.h>
#include "ecc.h"
/* High-level ECDSA interface. Uses mpz interface, and allocates
storage using the same allocation functions as GMP. */
struct ecdsa_public_key
{
const struct ecc_curve *ecc;
/* Allocated using the same allocation function as GMP. */
mp_limb_t *Y;
};
struct ecdsa_private_key
{
const struct ecc_curve *ecc;
/* Size ecc->size. */
mp_limb_t *z;
};
void
ecdsa_public_key_init (struct ecdsa_public_key *pub,
const struct ecc_curve *ecc);
void
ecdsa_public_key_clear (struct ecdsa_public_key *pub);
int
ecdsa_set_public_key (struct ecdsa_public_key *pub,
const mpz_t x, const mpz_t y);
void
ecdsa_get_public_key (struct ecdsa_public_key *pub,
mpz_t x, mpz_t y);
void
ecdsa_private_key_init (struct ecdsa_private_key *key,
const struct ecc_curve *ecc);
void
ecdsa_private_key_clear (struct ecdsa_private_key *key);
int
ecdsa_set_private_key (struct ecdsa_private_key *key,
const mpz_t z);
void
ecdsa_get_private_key (struct ecdsa_private_key *key,
mpz_t z);
void
ecdsa_sign (const struct ecdsa_private_key *key,
void *random_ctx, nettle_random_func *random,
unsigned digest_length,
const uint8_t *digest,
struct dsa_signature *signature);
int
ecdsa_verify (const struct ecdsa_public_key *pub,
unsigned length, const uint8_t *digest,
const struct dsa_signature *signature);
void
ecdsa_generate_keypair (struct ecdsa_public_key *pub,
struct ecdsa_private_key *key,
void *random_ctx, nettle_random_func *random);
/* Low-level ECDSA interface. */
mp_size_t
_ecdsa_sign_itch (const struct ecc_curve *ecc);
void
_ecdsa_sign (const struct ecc_curve *ecc,
/* Private key */
const mp_limb_t *zp,
/* Random nonce, must be invertible mod ecc group
order. */
const mp_limb_t *kp,
unsigned length, const uint8_t *digest,
mp_limb_t *rp, mp_limb_t *sp, mp_limb_t *scratch);
mp_size_t
_ecdsa_verify_itch (const struct ecc_curve *ecc);
int
_ecdsa_verify (const struct ecc_curve *ecc,
const mp_limb_t *pp, /* Public key */
unsigned length, const uint8_t *digest,
const mp_limb_t *rp, const mp_limb_t *sp,
mp_limb_t *scratch);
#endif /* NETTLE_ECDSA_H_INCLUDED */
--
Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.
_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs