blob: a213e91ec924ae88a89ba6c0455e84b136870c51 [file] [log] [blame]
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +01001/**
2 * \file ecdsa.h
3 *
Rose Zadikbff87d92018-01-25 21:58:53 +00004 * \brief The Elliptic Curve Digital Signature Algorithm (ECDSA).
5 *
6 * ECDSA is defined in <em>Standards for Efficient Cryptography Group (SECG):
7 * SEC1 Elliptic Curve Cryptography</em>.
8 * The use of ECDSA for TLS is defined in <em>RFC-4492: Elliptic Curve
9 * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
10 *
Darryl Greena40a1012018-01-05 15:33:17 +000011 */
12/*
Rose Zadikbff87d92018-01-25 21:58:53 +000013 * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020014 * SPDX-License-Identifier: Apache-2.0
15 *
16 * Licensed under the Apache License, Version 2.0 (the "License"); you may
17 * not use this file except in compliance with the License.
18 * You may obtain a copy of the License at
19 *
20 * http://www.apache.org/licenses/LICENSE-2.0
21 *
22 * Unless required by applicable law or agreed to in writing, software
23 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
24 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25 * See the License for the specific language governing permissions and
26 * limitations under the License.
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010027 *
Rose Zadikbff87d92018-01-25 21:58:53 +000028 * This file is part of Mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010029 */
Rose Zadikbff87d92018-01-25 21:58:53 +000030
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#ifndef MBEDTLS_ECDSA_H
32#define MBEDTLS_ECDSA_H
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010033
Manuel Pégourié-Gonnardbdc96762013-10-03 11:50:39 +020034#include "ecp.h"
Manuel Pégourié-Gonnard887aa5b2014-04-04 13:57:20 +020035#include "md.h"
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +010036
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020037/*
Rose Zadikbff87d92018-01-25 21:58:53 +000038 * RFC-4492 page 20:
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020039 *
40 * Ecdsa-Sig-Value ::= SEQUENCE {
41 * r INTEGER,
42 * s INTEGER
43 * }
44 *
45 * Size is at most
46 * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s,
47 * twice that + 1 (tag) + 2 (len) for the sequence
48 * (assuming ECP_MAX_BYTES is less than 126 for r and s,
49 * and less than 124 (total len <= 255) for the sequence)
50 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#if MBEDTLS_ECP_MAX_BYTES > 124
52#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN"
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020053#endif
Rose Zadikbff87d92018-01-25 21:58:53 +000054/** The maximal size of an ECDSA signature in Bytes. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) )
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020056
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020057/**
Rose Zadikbff87d92018-01-25 21:58:53 +000058 * \brief The ECDSA context structure.
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020059 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060typedef mbedtls_ecp_keypair mbedtls_ecdsa_context;
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020061
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010062#ifdef __cplusplus
63extern "C" {
64#endif
65
66/**
Rose Zadikbff87d92018-01-25 21:58:53 +000067 * \brief This function computes the ECDSA signature of a
68 * previously-hashed message.
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010069 *
Rose Zadikbff87d92018-01-25 21:58:53 +000070 * \note The deterministic version is usually preferred.
Manuel Pégourié-Gonnardb8cfe3f2015-03-31 11:04:45 +020071 *
Rose Zadikbff87d92018-01-25 21:58:53 +000072 * \param grp The ECP group.
73 * \param r The first output integer.
74 * \param s The second output integer.
75 * \param d The private signing key.
76 * \param buf The message hash.
77 * \param blen The length of \p buf.
78 * \param f_rng The RNG function.
79 * \param p_rng The RNG parameter.
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010080 *
Janos Follath0a5154b2017-03-10 11:31:41 +000081 * \note If the bitlength of the message hash is larger than the
Rose Zadikbff87d92018-01-25 21:58:53 +000082 * bitlength of the group order, then the hash is truncated
83 * as defined in <em>Standards for Efficient Cryptography Group
84 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
85 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +000086 *
Rose Zadikbff87d92018-01-25 21:58:53 +000087 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX
88 * or \c MBEDTLS_MPI_XXX error code on failure.
89 *
90 * \see ecp.h
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010091 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
93 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +010094 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
95
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +010097/**
Rose Zadikbff87d92018-01-25 21:58:53 +000098 * \brief This function computes the ECDSA signature of a
99 * previously-hashed message, deterministic version.
100 * For more information, see <em>RFC-6979: Deterministic
101 * Usage of the Digital Signature Algorithm (DSA) and Elliptic
102 * Curve Digital Signature Algorithm (ECDSA)</em>.
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100103 *
Janos Follath2934c322019-01-04 14:32:30 +0000104 *
105 * \warning Since the output of the internal RNG is always the same for
106 * the same key and message, this limits the efficiency of
107 * blinding and leaks information through side channels. For
108 * secure behavior use mbedtls_ecdsa_sign_det_ext() instead.
109 *
110 * (Optimally the blinding is a random value that is different
111 * on every execution. In this case the blinding is still
112 * random from the attackers perspective, but is the same on
113 * each execution. This means that this blinding does not
114 * prevent attackers from recovering secrets by combining
115 * several measurement traces, but may prevent some attacks
116 * that exploit relationships between secret data.)
117 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000118 * \param grp The ECP group.
119 * \param r The first output integer.
120 * \param s The second output integer.
121 * \param d The private signing key.
122 * \param buf The message hash.
123 * \param blen The length of \p buf.
124 * \param md_alg The MD algorithm used to hash the message.
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100125 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000126 * \note If the bitlength of the message hash is larger than the
127 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000128 * defined in <em>Standards for Efficient Cryptography Group
129 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
130 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000131 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000132 * \return \c 0 on success,
133 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
134 * error code on failure.
135 *
136 * \see ecp.h
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100137 */
Janos Follath2934c322019-01-04 14:32:30 +0000138int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r,
139 mbedtls_mpi *s, const mbedtls_mpi *d,
140 const unsigned char *buf, size_t blen,
141 mbedtls_md_type_t md_alg );
142/**
143 * \brief This function computes the ECDSA signature of a
144 * previously-hashed message, deterministic version.
145 *
146 * For more information, see <em>RFC-6979: Deterministic
147 * Usage of the Digital Signature Algorithm (DSA) and Elliptic
148 * Curve Digital Signature Algorithm (ECDSA)</em>.
149 *
150 * \note If the bitlength of the message hash is larger than the
151 * bitlength of the group order, then the hash is truncated as
152 * defined in <em>Standards for Efficient Cryptography Group
153 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
154 * 4.1.3, step 5.
155 *
156 * \see ecp.h
157 *
158 * \param grp The context for the elliptic curve to use.
159 * This must be initialized and have group parameters
160 * set, for example through mbedtls_ecp_group_load().
161 * \param r The MPI context in which to store the first part
162 * the signature. This must be initialized.
163 * \param s The MPI context in which to store the second part
164 * the signature. This must be initialized.
165 * \param d The private signing key. This must be initialized
166 * and setup, for example through mbedtls_ecp_gen_privkey().
167 * \param buf The hashed content to be signed. This must be a readable
168 * buffer of length \p blen Bytes. It may be \c NULL if
169 * \p blen is zero.
170 * \param blen The length of \p buf in Bytes.
171 * \param md_alg The hash algorithm used to hash the original data.
172 * \param f_rng_blind The RNG function used for blinding. This must not be
173 * \c NULL.
174 * \param p_rng_blind The RNG context to be passed to \p f_rng. This may be
175 * \c NULL if \p f_rng doesn't need a context parameter.
176 *
177 * \return \c 0 on success.
178 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
179 * error code on failure.
180 */
181int mbedtls_ecdsa_sign_det_ext( mbedtls_ecp_group *grp, mbedtls_mpi *r,
182 mbedtls_mpi *s, const mbedtls_mpi *d,
183 const unsigned char *buf, size_t blen,
184 mbedtls_md_type_t md_alg,
185 int (*f_rng_blind)(void *, unsigned char *,
186 size_t),
187 void *p_rng_blind );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100189
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100190/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000191 * \brief This function verifies the ECDSA signature of a
192 * previously-hashed message.
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100193 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000194 * \param grp The ECP group.
195 * \param buf The message hash.
196 * \param blen The length of \p buf.
197 * \param Q The public key to use for verification.
198 * \param r The first integer of the signature.
199 * \param s The second integer of the signature.
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100200 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000201 * \note If the bitlength of the message hash is larger than the
202 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000203 * defined in <em>Standards for Efficient Cryptography Group
204 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
205 * 4.1.4, step 3.
Janos Follath0a5154b2017-03-10 11:31:41 +0000206 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000207 * \return \c 0 on success,
208 * #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
209 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
210 * error code on failure for any other reason.
211 *
212 * \see ecp.h
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100213 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100215 const unsigned char *buf, size_t blen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200216 const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100217
218/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000219 * \brief This function computes the ECDSA signature and writes it
220 * to a buffer, serialized as defined in <em>RFC-4492:
221 * Elliptic Curve Cryptography (ECC) Cipher Suites for
222 * Transport Layer Security (TLS)</em>.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200223 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000224 * \warning It is not thread-safe to use the same context in
225 * multiple threads.
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200226 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000227 * \note The deterministic version is used if
228 * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more
229 * information, see <em>RFC-6979: Deterministic Usage
230 * of the Digital Signature Algorithm (DSA) and Elliptic
231 * Curve Digital Signature Algorithm (ECDSA)</em>.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200232 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000233 * \param ctx The ECDSA context.
234 * \param md_alg The message digest that was used to hash the message.
235 * \param hash The message hash.
236 * \param hlen The length of the hash.
237 * \param sig The buffer that holds the signature.
238 * \param slen The length of the signature written.
239 * \param f_rng The RNG function.
240 * \param p_rng The RNG parameter.
241 *
242 * \note The \p sig buffer must be at least twice as large as the
243 * size of the curve used, plus 9. For example, 73 Bytes if
244 * a 256-bit curve is used. A buffer length of
245 * #MBEDTLS_ECDSA_MAX_LEN is always safe.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200246 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000247 * \note If the bitlength of the message hash is larger than the
248 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000249 * defined in <em>Standards for Efficient Cryptography Group
250 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
251 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000252 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000253 * \return \c 0 on success,
254 * or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
255 * \c MBEDTLS_ERR_ASN1_XXX error code on failure.
256 *
257 * \see ecp.h
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200258 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200260 const unsigned char *hash, size_t hlen,
261 unsigned char *sig, size_t *slen,
262 int (*f_rng)(void *, unsigned char *, size_t),
263 void *p_rng );
264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
266#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
267#if defined(MBEDTLS_DEPRECATED_WARNING)
268#define MBEDTLS_DEPRECATED __attribute__((deprecated))
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200269#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270#define MBEDTLS_DEPRECATED
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200271#endif
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100272/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000273 * \brief This function computes an ECDSA signature and writes it to a buffer,
274 * serialized as defined in <em>RFC-4492: Elliptic Curve Cryptography
275 * (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
276 *
277 * The deterministic version is defined in <em>RFC-6979:
278 * Deterministic Usage of the Digital Signature Algorithm (DSA) and
279 * Elliptic Curve Digital Signature Algorithm (ECDSA)</em>.
280 *
281 * \warning It is not thread-safe to use the same context in
282 * multiple threads.
283
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100284 *
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 * \deprecated Superseded by mbedtls_ecdsa_write_signature() in 2.0.0
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200286 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000287 * \param ctx The ECDSA context.
288 * \param hash The Message hash.
289 * \param hlen The length of the hash.
290 * \param sig The buffer that holds the signature.
291 * \param slen The length of the signature written.
292 * \param md_alg The MD algorithm used to hash the message.
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100293 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000294 * \note The \p sig buffer must be at least twice as large as the
295 * size of the curve used, plus 9. For example, 73 Bytes if a
296 * 256-bit curve is used. A buffer length of
297 * #MBEDTLS_ECDSA_MAX_LEN is always safe.
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100298 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000299 * \note If the bitlength of the message hash is larger than the
300 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000301 * defined in <em>Standards for Efficient Cryptography Group
302 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
303 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000304 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000305 * \return \c 0 on success,
306 * or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
307 * \c MBEDTLS_ERR_ASN1_XXX error code on failure.
308 *
309 * \see ecp.h
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100310 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200311int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100312 const unsigned char *hash, size_t hlen,
313 unsigned char *sig, size_t *slen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314 mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED;
315#undef MBEDTLS_DEPRECATED
316#endif /* MBEDTLS_DEPRECATED_REMOVED */
317#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100318
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200319/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000320 * \brief This function reads and verifies an ECDSA signature.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200321 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000322 * \param ctx The ECDSA context.
323 * \param hash The message hash.
324 * \param hlen The size of the hash.
325 * \param sig The signature to read and verify.
326 * \param slen The size of \p sig.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200327 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000328 * \note If the bitlength of the message hash is larger than the
329 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000330 * defined in <em>Standards for Efficient Cryptography Group
331 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
332 * 4.1.4, step 3.
Janos Follath0a5154b2017-03-10 11:31:41 +0000333 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000334 * \return \c 0 on success,
335 * #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
Gilles Peskine5114d3e2018-03-30 07:12:15 +0200336 * #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid
337 * signature in sig but its length is less than \p siglen,
Rose Zadikbff87d92018-01-25 21:58:53 +0000338 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX
339 * error code on failure for any other reason.
340 *
341 * \see ecp.h
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200342 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200344 const unsigned char *hash, size_t hlen,
345 const unsigned char *sig, size_t slen );
346
347/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000348 * \brief This function generates an ECDSA keypair on the given curve.
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200349 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000350 * \param ctx The ECDSA context to store the keypair in.
351 * \param gid The elliptic curve to use. One of the various
352 * \c MBEDTLS_ECP_DP_XXX macros depending on configuration.
353 * \param f_rng The RNG function.
354 * \param p_rng The RNG parameter.
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200355 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000356 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
357 * failure.
358 *
359 * \see ecp.h
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200360 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200362 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
363
364/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000365 * \brief This function sets an ECDSA context from an EC key pair.
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200366 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000367 * \param ctx The ECDSA context to set.
368 * \param key The EC key to use.
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200369 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000370 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
371 * failure.
372 *
373 * \see ecp.h
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200374 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200376
377/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000378 * \brief This function initializes an ECDSA context.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200379 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000380 * \param ctx The ECDSA context to initialize.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200381 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200383
384/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000385 * \brief This function frees an ECDSA context.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200386 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000387 * \param ctx The ECDSA context to free.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200388 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200390
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +0100391#ifdef __cplusplus
392}
393#endif
394
Paul Bakker9af723c2014-05-01 13:03:14 +0200395#endif /* ecdsa.h */