ecdsa.c File Reference

#include "polarssl/config.h"
#include "polarssl/ecdsa.h"
#include "polarssl/asn1write.h"
Include dependency graph for ecdsa.c:

Go to the source code of this file.

Defines

#define MAX_SIG_LEN   ( 3 + 2 * ( 2 + POLARSSL_ECP_MAX_BYTES ) )

Functions

static int derive_mpi (const ecp_group *grp, mpi *x, const unsigned char *buf, size_t blen)
int ecdsa_sign (ecp_group *grp, mpi *r, mpi *s, const mpi *d, const unsigned char *buf, size_t blen, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
 Compute ECDSA signature of a previously hashed message.
int ecdsa_verify (ecp_group *grp, const unsigned char *buf, size_t blen, const ecp_point *Q, const mpi *r, const mpi *s)
 Verify ECDSA signature of a previously hashed message.
int ecdsa_write_signature (ecdsa_context *ctx, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
 Compute ECDSA signature and write it to buffer, serialized as defined in RFC 4492 page 20.
int ecdsa_read_signature (ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen)
 Read and verify an ECDSA signature.
int ecdsa_genkey (ecdsa_context *ctx, ecp_group_id gid, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
 Generate an ECDSA keypair on the given curve.
int ecdsa_from_keypair (ecdsa_context *ctx, const ecp_keypair *key)
 Set an ECDSA context from an EC key pair.
void ecdsa_init (ecdsa_context *ctx)
 Initialize context.
void ecdsa_free (ecdsa_context *ctx)
 Free context.
int ecdsa_self_test (int verbose)
 Checkup routine.

Define Documentation

#define MAX_SIG_LEN   ( 3 + 2 * ( 2 + POLARSSL_ECP_MAX_BYTES ) )

Definition at line 218 of file ecdsa.c.

Referenced by ecdsa_write_signature().


Function Documentation

static int derive_mpi ( const ecp_group grp,
mpi x,
const unsigned char *  buf,
size_t  blen 
) [static]

Definition at line 43 of file ecdsa.c.

References mpi_read_binary(), and ecp_group::nbits.

Referenced by ecdsa_sign(), and ecdsa_verify().

void ecdsa_free ( ecdsa_context ctx  ) 
int ecdsa_from_keypair ( ecdsa_context ctx,
const ecp_keypair key 
)

Set an ECDSA context from an EC key pair.

Parameters:
ctx ECDSA context to set
key EC key to use
Returns:
0 on success, or a POLARSSL_ERR_ECP code.

Definition at line 299 of file ecdsa.c.

References ecp_keypair::d, ecdsa_context::d, ecdsa_free(), ecp_copy(), ecp_group_copy(), ecp_keypair::grp, ecdsa_context::grp, mpi_copy(), ecp_keypair::Q, and ecdsa_context::Q.

Referenced by eckey_sign_wrap(), and eckey_verify_wrap().

int ecdsa_genkey ( ecdsa_context ctx,
ecp_group_id  gid,
int(*)(void *, unsigned char *, size_t)  f_rng,
void *  p_rng 
)

Generate an ECDSA keypair on the given curve.

Parameters:
ctx ECDSA context in which the keypair should be stored
gid Group (elliptic curve) to use. One of the various POLARSSL_ECP_DP_XXX macros depending on configuration.
f_rng RNG function
p_rng RNG parameter
Returns:
0 on success, or a POLARSSL_ERR_ECP code.

Definition at line 289 of file ecdsa.c.

References ecdsa_context::d, ecp_gen_keypair(), ecp_use_known_dp(), ecdsa_context::grp, and ecdsa_context::Q.

Referenced by test_suite_ecdsa_write_read_random().

void ecdsa_init ( ecdsa_context ctx  ) 
int ecdsa_read_signature ( ecdsa_context ctx,
const unsigned char *  hash,
size_t  hlen,
const unsigned char *  sig,
size_t  slen 
)

Read and verify an ECDSA signature.

Parameters:
ctx ECDSA context
hash Message hash
hlen Size of hash
sig Signature to read and verify
slen Size of sig
Returns:
0 if successful, POLARSSL_ERR_ECP_BAD_INPUT_DATA if signature is invalid or a POLARSSL_ERR_ECP or POLARSSL_ERR_MPI error code

Definition at line 256 of file ecdsa.c.

References ASN1_CONSTRUCTED, asn1_get_mpi(), asn1_get_tag(), ASN1_SEQUENCE, ecdsa_verify(), ecdsa_context::grp, POLARSSL_ERR_ASN1_LENGTH_MISMATCH, POLARSSL_ERR_ECP_BAD_INPUT_DATA, ecdsa_context::Q, ecdsa_context::r, and ecdsa_context::s.

Referenced by ecdsa_verify_wrap(), and test_suite_ecdsa_write_read_random().

int ecdsa_self_test ( int  verbose  ) 

Checkup routine.

Returns:
0 if successful, or 1 if the test failed

Definition at line 342 of file ecdsa.c.

int ecdsa_sign ( ecp_group grp,
mpi r,
mpi s,
const mpi d,
const unsigned char *  buf,
size_t  blen,
int(*)(void *, unsigned char *, size_t)  f_rng,
void *  p_rng 
)

Compute ECDSA signature of a previously hashed message.

Parameters:
grp ECP group
r First output integer
s Second output integer
d Private signing key
buf Message hash
blen Length of buf
f_rng RNG function
p_rng RNG parameter
Returns:
0 if successful, or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code

Definition at line 54 of file ecdsa.c.

References derive_mpi(), ecp_gen_keypair(), ecp_point_free(), ecp_point_init(), mpi_add_mpi(), MPI_CHK, mpi_cmp_int(), mpi_free(), mpi_init(), mpi_inv_mod(), mpi_mod_mpi(), mpi_mul_mpi(), ecp_group::N, POLARSSL_ERR_ECP_RANDOM_FAILED, R, and ecp_point::X.

Referenced by ecdsa_write_signature(), test_suite_ecdsa_prim_random(), and test_suite_ecdsa_prim_test_vectors().

int ecdsa_verify ( ecp_group grp,
const unsigned char *  buf,
size_t  blen,
const ecp_point Q,
const mpi r,
const mpi s 
)

Verify ECDSA signature of a previously hashed message.

Parameters:
grp ECP group
buf Message hash
blen Length of buf
Q Public key to use for verification
r First integer of the signature
s Second integer of the signature
Returns:
0 if successful, POLARSSL_ERR_ECP_BAD_INPUT_DATA if signature is invalid or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code

Definition at line 121 of file ecdsa.c.

References derive_mpi(), ecp_add(), ecp_check_pubkey(), ecp_is_zero(), ecp_mul(), ecp_point_free(), ecp_point_init(), ecp_group::G, MPI_CHK, mpi_cmp_int(), mpi_cmp_mpi(), mpi_free(), mpi_init(), mpi_inv_mod(), mpi_mod_mpi(), mpi_mul_mpi(), ecp_group::N, P, POLARSSL_ERR_ECP_VERIFY_FAILED, R, and ecp_point::X.

Referenced by ecdsa_read_signature(), test_suite_ecdsa_prim_random(), and test_suite_ecdsa_prim_test_vectors().

int ecdsa_write_signature ( ecdsa_context ctx,
const unsigned char *  hash,
size_t  hlen,
unsigned char *  sig,
size_t *  slen,
int(*)(void *, unsigned char *, size_t)  f_rng,
void *  p_rng 
)

Compute ECDSA signature and write it to buffer, serialized as defined in RFC 4492 page 20.

(Not thread-safe to use same context in multiple threads)

Parameters:
ctx ECDSA context
hash Message hash
hlen Length of hash
sig Buffer that will hold the signature
slen Length of the signature written
f_rng RNG function
p_rng RNG parameter
Note:
The "sig" buffer must be at least as large as twice the size of the curve used, plus 7 (eg. 71 bytes if a 256-bit curve is used).
Returns:
0 if successful, or a POLARSSL_ERR_ECP, POLARSSL_ERR_MPI or POLARSSL_ERR_ASN1 error code

Definition at line 223 of file ecdsa.c.

References ASN1_CHK_ADD, ASN1_CONSTRUCTED, ASN1_SEQUENCE, asn1_write_len(), asn1_write_mpi(), asn1_write_tag(), ecdsa_context::d, ecdsa_sign(), ecdsa_context::grp, MAX_SIG_LEN, ecdsa_context::r, and ecdsa_context::s.

Referenced by ecdsa_sign_wrap(), and test_suite_ecdsa_write_read_random().


Generated on 9 Apr 2014 for PolarSSL v1.3.2 by  doxygen 1.6.1