blob: a718c0ef57935dc39a0653929a77dbe13f94c8e5 [file] [log] [blame]
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +01001/**
2 * \file ecdsa.h
3 *
4 * \brief Elliptic curve DSA
5 *
6 * Copyright (C) 2006-2013, Brainspark B.V.
7 *
8 * This file is part of PolarSSL (http://www.polarssl.org)
9 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
10 *
11 * All rights reserved.
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License along
24 * with this program; if not, write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 */
27#ifndef POLARSSL_ECDSA_H
28#define POLARSSL_ECDSA_H
29
Manuel Pégourié-Gonnardbdc96762013-10-03 11:50:39 +020030#include "ecp.h"
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010031
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +010032#if defined(POLARSSL_ECDSA_DETERMINISTIC)
33#include "polarssl/md.h"
34#endif
35
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020036/**
37 * \brief ECDSA context structure
Manuel Pégourié-Gonnard211a64c2013-08-09 15:04:26 +020038 *
39 * \note Purposefully begins with the same members as struct ecp_keypair.
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020040 */
41typedef struct
42{
43 ecp_group grp; /*!< ellipitic curve used */
44 mpi d; /*!< secret signature key */
45 ecp_point Q; /*!< public signature key */
46 mpi r; /*!< first integer from signature */
47 mpi s; /*!< second integer from signature */
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020048}
49ecdsa_context;
50
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010051#ifdef __cplusplus
52extern "C" {
53#endif
54
55/**
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010056 * \brief Compute ECDSA signature of a previously hashed message
57 *
58 * \param grp ECP group
59 * \param r First output integer
60 * \param s Second output integer
61 * \param d Private signing key
62 * \param buf Message hash
63 * \param blen Length of buf
64 * \param f_rng RNG function
65 * \param p_rng RNG parameter
66 *
67 * \return 0 if successful,
68 * or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code
69 */
Manuel Pégourié-Gonnard161ef962013-09-17 19:13:10 +020070int ecdsa_sign( ecp_group *grp, mpi *r, mpi *s,
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010071 const mpi *d, const unsigned char *buf, size_t blen,
72 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
73
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +010074#if defined(POLARSSL_ECDSA_DETERMINISTIC)
75/**
76 * \brief Compute ECDSA signature of a previously hashed message
77 * (deterministic version)
78 *
79 * \param grp ECP group
80 * \param r First output integer
81 * \param s Second output integer
82 * \param d Private signing key
83 * \param buf Message hash
84 * \param blen Length of buf
85 * \param md_alg MD algorithm used to hash the message
86 *
87 * \return 0 if successful,
88 * or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code
89 */
90int ecdsa_sign_det( ecp_group *grp, mpi *r, mpi *s,
91 const mpi *d, const unsigned char *buf, size_t blen,
92 md_type_t md_alg );
93#endif
94
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010095/**
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +010096 * \brief Verify ECDSA signature of a previously hashed message
97 *
98 * \param grp ECP group
99 * \param buf Message hash
100 * \param blen Length of buf
101 * \param Q Public key to use for verification
102 * \param r First integer of the signature
103 * \param s Second integer of the signature
104 *
105 * \return 0 if successful,
106 * POLARSSL_ERR_ECP_BAD_INPUT_DATA if signature is invalid
107 * or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code
108 */
Manuel Pégourié-Gonnard161ef962013-09-17 19:13:10 +0200109int ecdsa_verify( ecp_group *grp,
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100110 const unsigned char *buf, size_t blen,
111 const ecp_point *Q, const mpi *r, const mpi *s);
112
113/**
Manuel Pégourié-Gonnardaa431612013-08-09 17:10:27 +0200114 * \brief Compute ECDSA signature and write it to buffer,
115 * serialized as defined in RFC 4492 page 20.
Paul Bakker6838bd12013-09-30 13:56:38 +0200116 * (Not thread-safe to use same context in multiple threads)
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200117 *
118 * \param ctx ECDSA context
119 * \param hash Message hash
120 * \param hlen Length of hash
121 * \param sig Buffer that will hold the signature
122 * \param slen Length of the signature written
123 * \param f_rng RNG function
124 * \param p_rng RNG parameter
125 *
126 * \note The "sig" buffer must be at least as large as twice the
127 * size of the curve used, plus 7 (eg. 71 bytes if a 256-bit
128 * curve is used).
129 *
130 * \return 0 if successful,
131 * or a POLARSSL_ERR_ECP, POLARSSL_ERR_MPI or
132 * POLARSSL_ERR_ASN1 error code
133 */
134int ecdsa_write_signature( ecdsa_context *ctx,
135 const unsigned char *hash, size_t hlen,
136 unsigned char *sig, size_t *slen,
137 int (*f_rng)(void *, unsigned char *, size_t),
138 void *p_rng );
139
140/**
141 * \brief Read and verify an ECDSA signature
142 *
143 * \param ctx ECDSA context
144 * \param hash Message hash
145 * \param hlen Size of hash
146 * \param sig Signature to read and verify
147 * \param slen Size of sig
148 *
149 * \return 0 if successful,
150 * POLARSSL_ERR_ECP_BAD_INPUT_DATA if signature is invalid
151 * or a POLARSSL_ERR_ECP or POLARSSL_ERR_MPI error code
152 */
153int ecdsa_read_signature( ecdsa_context *ctx,
154 const unsigned char *hash, size_t hlen,
155 const unsigned char *sig, size_t slen );
156
157/**
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200158 * \brief Generate an ECDSA keypair on the given curve
159 *
160 * \param ctx ECDSA context in which the keypair should be stored
Paul Bakkerdcbfdcc2013-09-10 16:16:50 +0200161 * \param gid Group (elliptic curve) to use. One of the various
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200162 * POLARSSL_ECP_DP_XXX macros depending on configuration.
163 * \param f_rng RNG function
164 * \param p_rng RNG parameter
165 *
166 * \return 0 on success, or a POLARSSL_ERR_ECP code.
167 */
168int ecdsa_genkey( ecdsa_context *ctx, ecp_group_id gid,
169 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
170
171/**
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200172 * \brief Set an ECDSA context from an EC key pair
173 *
174 * \param ctx ECDSA context to set
175 * \param key EC key to use
176 *
177 * \return 0 on success, or a POLARSSL_ERR_ECP code.
178 */
179int ecdsa_from_keypair( ecdsa_context *ctx, const ecp_keypair *key );
180
181/**
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200182 * \brief Initialize context
183 *
184 * \param ctx Context to initialize
185 */
186void ecdsa_init( ecdsa_context *ctx );
187
188/**
189 * \brief Free context
190 *
191 * \param ctx Context to free
192 */
193void ecdsa_free( ecdsa_context *ctx );
194
195/**
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +0100196 * \brief Checkup routine
197 *
198 * \return 0 if successful, or 1 if the test failed
199 */
200int ecdsa_self_test( int verbose );
201
202#ifdef __cplusplus
203}
204#endif
205
206#endif