blob: 4897708565981a171c0b3196a270ee2cae4c62f4 [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
Andrzej Kurek932ebf32018-02-21 08:49:05 -050037#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
38 !defined(inline) && !defined(__cplusplus)
39#define inline __inline
40#endif
41
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020042/*
Rose Zadikbff87d92018-01-25 21:58:53 +000043 * RFC-4492 page 20:
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020044 *
45 * Ecdsa-Sig-Value ::= SEQUENCE {
46 * r INTEGER,
47 * s INTEGER
48 * }
49 *
50 * Size is at most
51 * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s,
52 * twice that + 1 (tag) + 2 (len) for the sequence
53 * (assuming ECP_MAX_BYTES is less than 126 for r and s,
54 * and less than 124 (total len <= 255) for the sequence)
55 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#if MBEDTLS_ECP_MAX_BYTES > 124
57#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN"
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020058#endif
Manuel Pégourié-Gonnard63e93192015-03-31 11:15:48 +020059
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020060/**
Gilles Peskine9a8bb672017-11-02 17:09:49 +010061 * \brief Maximum ECDSA signature size for a given curve bit size
62 *
63 * \param bits Curve size in bits
64 * \return Maximum signature size in bytes
65 *
66 * \note This macro returns a compile-time constant if its argument
67 * is one. It may evaluate its argument multiple times; if
68 * this is a problem, call the function
69 * mbedtls_ecdsa_max_sig_len instead.
70 */
71#define MBEDTLS_ECDSA_MAX_SIG_LEN( bits ) \
72 ( /*T,L of SEQUENCE*/ ( ( bits ) >= 61 * 8 ? 3 : 2 ) + \
73 /*T,L of r,s*/ 2 * ( ( ( bits ) >= 127 * 8 ? 3 : 2 ) + \
74 /*V of r,s*/ ( ( bits ) + 8 ) / 8 ) )
75
76/**
77 * \brief Maximum ECDSA signature size for a given curve bit size
78 *
79 * \param bits Curve size in bits
80 * \return Maximum signature size in bytes
81 *
82 * \note If you need a compile-time constant, call the macro
83 * MBEDTLS_ECDSA_MAX_SIG_LEN instead.
84 */
85static inline size_t mbedtls_ecdsa_max_sig_len( size_t bits )
86{
87 return( MBEDTLS_ECDSA_MAX_SIG_LEN( bits ) );
88}
89
Andrzej Kurek49241632018-02-08 09:03:21 -050090/** The maximal size of an ECDSA signature in Bytes. */
Andrzej Kurekbba09272018-02-14 07:16:27 -050091#define MBEDTLS_ECDSA_MAX_LEN \
92 ( MBEDTLS_ECDSA_MAX_SIG_LEN( 8 * MBEDTLS_ECP_MAX_BYTES ) )
Andrzej Kurek024ab062018-02-12 09:34:39 -050093
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020094/**
Rose Zadikbff87d92018-01-25 21:58:53 +000095 * \brief The ECDSA context structure.
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020096 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097typedef mbedtls_ecp_keypair mbedtls_ecdsa_context;
Manuel Pégourié-Gonnardbec2f452013-06-27 10:17:07 +020098
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +010099#ifdef __cplusplus
100extern "C" {
101#endif
102
103/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000104 * \brief This function computes the ECDSA signature of a
Andrzej Kurekbba09272018-02-14 07:16:27 -0500105 * previously-hashed message. The signature is in
106 * ASN.1 SEQUENCE format, as described in <em>Standards
107 * for Efficient Cryptography Group (SECG): SEC1 Elliptic
108 * Curve Cryptography</em>, section C.5.
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100109 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000110 * \note The deterministic version is usually preferred.
Manuel Pégourié-Gonnardb8cfe3f2015-03-31 11:04:45 +0200111 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000112 * \param grp The ECP group.
113 * \param r The first output integer.
114 * \param s The second output integer.
115 * \param d The private signing key.
116 * \param buf The message hash.
117 * \param blen The length of \p buf.
118 * \param f_rng The RNG function.
119 * \param p_rng The RNG parameter.
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100120 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000121 * \note If the bitlength of the message hash is larger than the
Rose Zadikbff87d92018-01-25 21:58:53 +0000122 * bitlength of the group order, then the hash is truncated
123 * as defined in <em>Standards for Efficient Cryptography Group
124 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
125 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000126 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000127 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX
128 * or \c MBEDTLS_MPI_XXX error code on failure.
129 *
130 * \see ecp.h
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100131 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
133 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100134 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
135
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200136#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100137/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000138 * \brief This function computes the ECDSA signature of a
139 * previously-hashed message, deterministic version.
140 * For more information, see <em>RFC-6979: Deterministic
141 * Usage of the Digital Signature Algorithm (DSA) and Elliptic
142 * Curve Digital Signature Algorithm (ECDSA)</em>.
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100143 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000144 * \param grp The ECP group.
145 * \param r The first output integer.
146 * \param s The second output integer.
147 * \param d The private signing key.
148 * \param buf The message hash.
149 * \param blen The length of \p buf.
150 * \param md_alg The MD algorithm used to hash the message.
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100151 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000152 * \note If the bitlength of the message hash is larger than the
153 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000154 * defined in <em>Standards for Efficient Cryptography Group
155 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
156 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000157 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000158 * \return \c 0 on success,
159 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
160 * error code on failure.
161 *
162 * \see ecp.h
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100163 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200164int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
165 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
166 mbedtls_md_type_t md_alg );
167#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
Manuel Pégourié-Gonnard4daaef72014-01-06 14:25:56 +0100168
Manuel Pégourié-Gonnardb309ab22013-01-26 17:24:59 +0100169/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000170 * \brief This function verifies the ECDSA signature of a
171 * previously-hashed message.
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100172 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000173 * \param grp The ECP group.
174 * \param buf The message hash.
175 * \param blen The length of \p buf.
176 * \param Q The public key to use for verification.
177 * \param r The first integer of the signature.
178 * \param s The second integer of the signature.
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100179 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000180 * \note If the bitlength of the message hash is larger than the
181 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000182 * defined in <em>Standards for Efficient Cryptography Group
183 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
184 * 4.1.4, step 3.
Janos Follath0a5154b2017-03-10 11:31:41 +0000185 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000186 * \return \c 0 on success,
187 * #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
188 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
189 * error code on failure for any other reason.
190 *
191 * \see ecp.h
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100192 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200193int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100194 const unsigned char *buf, size_t blen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195 const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);
Manuel Pégourié-Gonnard3aeb5a72013-01-26 18:05:50 +0100196
197/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000198 * \brief This function computes the ECDSA signature and writes it
199 * to a buffer, serialized as defined in <em>RFC-4492:
200 * Elliptic Curve Cryptography (ECC) Cipher Suites for
201 * Transport Layer Security (TLS)</em>.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200202 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000203 * \warning It is not thread-safe to use the same context in
204 * multiple threads.
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200205 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000206 * \note The deterministic version is used if
207 * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more
208 * information, see <em>RFC-6979: Deterministic Usage
209 * of the Digital Signature Algorithm (DSA) and Elliptic
210 * Curve Digital Signature Algorithm (ECDSA)</em>.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200211 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000212 * \param ctx The ECDSA context.
213 * \param md_alg The message digest that was used to hash the message.
214 * \param hash The message hash.
215 * \param hlen The length of the hash.
216 * \param sig The buffer that holds the signature.
217 * \param slen The length of the signature written.
218 * \param f_rng The RNG function.
219 * \param p_rng The RNG parameter.
220 *
Andrzej Kurek0044ab12018-02-20 11:18:21 -0500221 * \note The signature \p sig is expected to in be ASN.1 SEQUENCE
Andrzej Kurekbba09272018-02-14 07:16:27 -0500222 * format, as described in <em>Standards for Efficient
223 * Cryptography Group (SECG): SEC1 Elliptic Curve
224 * Cryptography</em>, section C.5.
225 *
226 * \note A \p sig buffer length of #MBEDTLS_ECDSA_MAX_LEN is
227 * always safe.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200228 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000229 * \note If the bitlength of the message hash is larger than the
230 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000231 * defined in <em>Standards for Efficient Cryptography Group
232 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
233 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000234 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000235 * \return \c 0 on success,
236 * or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
237 * \c MBEDTLS_ERR_ASN1_XXX error code on failure.
238 *
239 * \see ecp.h
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200240 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200242 const unsigned char *hash, size_t hlen,
243 unsigned char *sig, size_t *slen,
244 int (*f_rng)(void *, unsigned char *, size_t),
245 void *p_rng );
246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200247#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
248#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
249#if defined(MBEDTLS_DEPRECATED_WARNING)
250#define MBEDTLS_DEPRECATED __attribute__((deprecated))
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200251#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252#define MBEDTLS_DEPRECATED
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200253#endif
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100254/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000255 * \brief This function computes an ECDSA signature and writes it to a buffer,
256 * serialized as defined in <em>RFC-4492: Elliptic Curve Cryptography
257 * (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
258 *
259 * The deterministic version is defined in <em>RFC-6979:
260 * Deterministic Usage of the Digital Signature Algorithm (DSA) and
261 * Elliptic Curve Digital Signature Algorithm (ECDSA)</em>.
262 *
263 * \warning It is not thread-safe to use the same context in
264 * multiple threads.
265
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100266 *
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 * \deprecated Superseded by mbedtls_ecdsa_write_signature() in 2.0.0
Manuel Pégourié-Gonnarddfdcac92015-03-31 11:41:42 +0200268 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000269 * \param ctx The ECDSA context.
270 * \param hash The Message hash.
271 * \param hlen The length of the hash.
272 * \param sig The buffer that holds the signature.
273 * \param slen The length of the signature written.
274 * \param md_alg The MD algorithm used to hash the message.
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100275 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000276 * \note The \p sig buffer must be at least twice as large as the
277 * size of the curve used, plus 9. For example, 73 Bytes if a
278 * 256-bit curve is used. A buffer length of
279 * #MBEDTLS_ECDSA_MAX_LEN is always safe.
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100280 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000281 * \note If the bitlength of the message hash is larger than the
282 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000283 * defined in <em>Standards for Efficient Cryptography Group
284 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
285 * 4.1.3, step 5.
Janos Follath0a5154b2017-03-10 11:31:41 +0000286 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000287 * \return \c 0 on success,
288 * or an \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
289 * \c MBEDTLS_ERR_ASN1_XXX error code on failure.
290 *
291 * \see ecp.h
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100292 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100294 const unsigned char *hash, size_t hlen,
295 unsigned char *sig, size_t *slen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200296 mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED;
297#undef MBEDTLS_DEPRECATED
298#endif /* MBEDTLS_DEPRECATED_REMOVED */
299#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
Manuel Pégourié-Gonnard937340b2014-01-06 10:27:16 +0100300
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200301/**
Andrzej Kurek024ab062018-02-12 09:34:39 -0500302 * \brief Convert an ECDSA signature from number pair format to ASN.1
Gilles Peskinebce41d32017-11-02 17:14:18 +0100303 *
304 * \param r First number of the signature
305 * \param s Second number of the signature
306 * \param sig Buffer that will hold the signature
307 * \param slen Length of the signature written
308 * \param ssize Size of the sig buffer
309 *
310 * \note The size of the buffer \c ssize should be at least
Andrzej Kurekbba09272018-02-14 07:16:27 -0500311 * `MBEDTLS_ECDSA_MAX_SIG_LEN(grp->pbits)` bytes long if the
312 * signature was produced from curve \c grp, otherwise
313 * this function may fail with the error
314 * MBEDTLS_ERR_ASN1_BUF_TOO_SMALL.
Unknown6f21aed2018-02-07 08:02:31 -0500315 * The output ASN.1 SEQUENCE format is as follows:
316 * Ecdsa-Sig-Value ::= SEQUENCE {
317 * r INTEGER,
318 * s INTEGER
319 * }
Andrzej Kurekbba09272018-02-14 07:16:27 -0500320 * This format is expected by \c mbedtls_ecdsa_verify.
Gilles Peskinebce41d32017-11-02 17:14:18 +0100321 *
322 * \return 0 if successful,
323 * or a MBEDTLS_ERR_MPI_XXX or MBEDTLS_ERR_ASN1_XXX error code
324 *
325 */
Unknowna2c40622018-02-06 03:24:02 -0500326int mbedtls_ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s,
Gilles Peskinebce41d32017-11-02 17:14:18 +0100327 unsigned char *sig, size_t *slen,
328 size_t ssize );
329
330/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000331 * \brief This function reads and verifies an ECDSA signature.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200332 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000333 * \param ctx The ECDSA context.
334 * \param hash The message hash.
335 * \param hlen The size of the hash.
336 * \param sig The signature to read and verify.
337 * \param slen The size of \p sig.
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200338 *
Janos Follath0a5154b2017-03-10 11:31:41 +0000339 * \note If the bitlength of the message hash is larger than the
340 * bitlength of the group order, then the hash is truncated as
Rose Zadikbff87d92018-01-25 21:58:53 +0000341 * defined in <em>Standards for Efficient Cryptography Group
342 * (SECG): SEC1 Elliptic Curve Cryptography</em>, section
343 * 4.1.4, step 3.
Janos Follath0a5154b2017-03-10 11:31:41 +0000344 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000345 * \return \c 0 on success,
346 * #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
347 * #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is
348 * valid but its actual length is less than \p siglen,
349 * or an \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX
350 * error code on failure for any other reason.
351 *
352 * \see ecp.h
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200353 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
Manuel Pégourié-Gonnardb694b482013-08-08 13:30:57 +0200355 const unsigned char *hash, size_t hlen,
356 const unsigned char *sig, size_t slen );
357
358/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000359 * \brief This function generates an ECDSA keypair on the given curve.
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200360 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000361 * \param ctx The ECDSA context to store the keypair in.
362 * \param gid The elliptic curve to use. One of the various
363 * \c MBEDTLS_ECP_DP_XXX macros depending on configuration.
364 * \param f_rng The RNG function.
365 * \param p_rng The RNG parameter.
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200366 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000367 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
368 * failure.
369 *
370 * \see ecp.h
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200371 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200372int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
Manuel Pégourié-Gonnard8eebd012013-08-09 16:21:34 +0200373 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
374
375/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000376 * \brief This function sets an ECDSA context from an EC key pair.
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200377 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000378 * \param ctx The ECDSA context to set.
379 * \param key The EC key to use.
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200380 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000381 * \return \c 0 on success, or an \c MBEDTLS_ERR_ECP_XXX code on
382 * failure.
383 *
384 * \see ecp.h
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200385 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );
Manuel Pégourié-Gonnardf4999932013-08-12 17:02:59 +0200387
388/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000389 * \brief This function initializes an ECDSA context.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200390 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000391 * \param ctx The ECDSA context to initialize.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200392 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200394
395/**
Rose Zadikbff87d92018-01-25 21:58:53 +0000396 * \brief This function frees an ECDSA context.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200397 *
Rose Zadikbff87d92018-01-25 21:58:53 +0000398 * \param ctx The ECDSA context to free.
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200399 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200400void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );
Manuel Pégourié-Gonnard7c8934e2013-06-27 12:54:02 +0200401
Manuel Pégourié-Gonnard2aea1412013-01-26 16:33:44 +0100402#ifdef __cplusplus
403}
404#endif
405
Paul Bakker9af723c2014-05-01 13:03:14 +0200406#endif /* ecdsa.h */