blob: a63bb32f38728ce1c970f663a679deeee95888d6 [file] [log] [blame]
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +02001/**
2 * \file ecjpake.h
3 *
4 * \brief Elliptic curve J-PAKE
Darryl Greena40a1012018-01-05 15:33:17 +00005 */
6/*
Bence Szépkúti1e148272020-08-07 13:07:28 +02007 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +02008 * SPDX-License-Identifier: Apache-2.0
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
11 * not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +020021 */
22#ifndef MBEDTLS_ECJPAKE_H
23#define MBEDTLS_ECJPAKE_H
Mateusz Starzyk846f0212021-05-19 19:44:07 +020024#include "mbedtls/private_access.h"
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +020025
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020026/*
Manuel Pégourié-Gonnardd8204a72015-08-14 13:36:55 +020027 * J-PAKE is a password-authenticated key exchange that allows deriving a
28 * strong shared secret from a (potentially low entropy) pre-shared
29 * passphrase, with forward secrecy and mutual authentication.
30 * https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling
31 *
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +020032 * This file implements the Elliptic Curve variant of J-PAKE,
33 * as defined in Chapter 7.4 of the Thread v1.0 Specification,
34 * available to members of the Thread Group http://threadgroup.org/
Manuel Pégourié-Gonnardd8204a72015-08-14 13:36:55 +020035 *
36 * As the J-PAKE algorithm is inherently symmetric, so is our API.
37 * Each party needs to send its first round message, in any order, to the
38 * other party, then each sends its second round message, in any order.
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +020039 * The payloads are serialized in a way suitable for use in TLS, but could
40 * also be use outside TLS.
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020041 */
Bence Szépkútic662b362021-05-27 11:25:03 +020042#include "mbedtls/build_info.h"
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020043
Jaeden Ameroc49fbbf2019-07-04 20:01:14 +010044#include "mbedtls/ecp.h"
45#include "mbedtls/md.h"
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +020046
47#ifdef __cplusplus
48extern "C" {
49#endif
50
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020051/**
52 * Roles in the EC J-PAKE exchange
53 */
Manuel Pégourié-Gonnard64493912015-08-13 20:19:51 +020054typedef enum {
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020055 MBEDTLS_ECJPAKE_CLIENT = 0, /**< Client */
56 MBEDTLS_ECJPAKE_SERVER, /**< Server */
Manuel Pégourié-Gonnard64493912015-08-13 20:19:51 +020057} mbedtls_ecjpake_role;
58
Ron Eldor4e6d55d2018-02-07 16:36:15 +020059#if !defined(MBEDTLS_ECJPAKE_ALT)
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020060/**
Manuel Pégourié-Gonnardce456762015-08-14 11:54:35 +020061 * EC J-PAKE context structure.
62 *
63 * J-PAKE is a symmetric protocol, except for the identifiers used in
64 * Zero-Knowledge Proofs, and the serialization of the second message
65 * (KeyExchange) as defined by the Thread spec.
66 *
67 * In order to benefit from this symmetry, we choose a different naming
Shaun Case8b0ecbc2021-12-20 21:14:10 -080068 * convention from the Thread v1.0 spec. Correspondence is indicated in the
Simon Butcher5b331b92016-01-03 16:14:14 +000069 * description as a pair C: client name, S: server name
Manuel Pégourié-Gonnard6b798b92015-08-14 11:18:30 +020070 */
David Horstmann8b6068b2023-01-05 15:42:32 +000071typedef struct mbedtls_ecjpake_context {
Neil Armstrong0d763412022-08-11 10:32:22 +020072 mbedtls_md_type_t MBEDTLS_PRIVATE(md_type); /**< Hash to use */
Mateusz Starzyk846f0212021-05-19 19:44:07 +020073 mbedtls_ecp_group MBEDTLS_PRIVATE(grp); /**< Elliptic curve */
74 mbedtls_ecjpake_role MBEDTLS_PRIVATE(role); /**< Are we client or server? */
75 int MBEDTLS_PRIVATE(point_format); /**< Format for point export */
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +020076
Mateusz Starzyk846f0212021-05-19 19:44:07 +020077 mbedtls_ecp_point MBEDTLS_PRIVATE(Xm1); /**< My public key 1 C: X1, S: X3 */
78 mbedtls_ecp_point MBEDTLS_PRIVATE(Xm2); /**< My public key 2 C: X2, S: X4 */
79 mbedtls_ecp_point MBEDTLS_PRIVATE(Xp1); /**< Peer public key 1 C: X3, S: X1 */
80 mbedtls_ecp_point MBEDTLS_PRIVATE(Xp2); /**< Peer public key 2 C: X4, S: X2 */
81 mbedtls_ecp_point MBEDTLS_PRIVATE(Xp); /**< Peer public key C: Xs, S: Xc */
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +020082
Mateusz Starzyk846f0212021-05-19 19:44:07 +020083 mbedtls_mpi MBEDTLS_PRIVATE(xm1); /**< My private key 1 C: x1, S: x3 */
84 mbedtls_mpi MBEDTLS_PRIVATE(xm2); /**< My private key 2 C: x2, S: x4 */
Manuel Pégourié-Gonnard23dcbe32015-08-13 09:37:00 +020085
Mateusz Starzyk846f0212021-05-19 19:44:07 +020086 mbedtls_mpi MBEDTLS_PRIVATE(s); /**< Pre-shared secret (passphrase) */
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +020087} mbedtls_ecjpake_context;
88
Ron Eldor4e6d55d2018-02-07 16:36:15 +020089#else /* MBEDTLS_ECJPAKE_ALT */
90#include "ecjpake_alt.h"
91#endif /* MBEDTLS_ECJPAKE_ALT */
92
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +020093/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050094 * \brief Initialize an ECJPAKE context.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +020095 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050096 * \param ctx The ECJPAKE context to initialize.
97 * This must not be \c NULL.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +020098 */
David Horstmann8b6068b2023-01-05 15:42:32 +000099void mbedtls_ecjpake_init(mbedtls_ecjpake_context *ctx);
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200100
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200101/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500102 * \brief Set up an ECJPAKE context for use.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200103 *
104 * \note Currently the only values for hash/curve allowed by the
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500105 * standard are #MBEDTLS_MD_SHA256/#MBEDTLS_ECP_DP_SECP256R1.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200106 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500107 * \param ctx The ECJPAKE context to set up. This must be initialized.
108 * \param role The role of the caller. This must be either
109 * #MBEDTLS_ECJPAKE_CLIENT or #MBEDTLS_ECJPAKE_SERVER.
110 * \param hash The identifier of the hash function to use,
111 * for example #MBEDTLS_MD_SHA256.
112 * \param curve The identifier of the elliptic curve to use,
113 * for example #MBEDTLS_ECP_DP_SECP256R1.
114 * \param secret The pre-shared secret (passphrase). This must be
Valerio Settiaca21b72022-11-17 18:17:01 +0100115 * a readable not empty buffer of length \p len Bytes. It need
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500116 * only be valid for the duration of this call.
117 * \param len The length of the pre-shared secret \p secret.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200118 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500119 * \return \c 0 if successful.
120 * \return A negative error code on failure.
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200121 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000122int mbedtls_ecjpake_setup(mbedtls_ecjpake_context *ctx,
123 mbedtls_ecjpake_role role,
124 mbedtls_md_type_t hash,
125 mbedtls_ecp_group_id curve,
126 const unsigned char *secret,
127 size_t len);
Manuel Pégourié-Gonnard7af8bc12015-08-12 16:58:50 +0200128
Andres Amaya Garciaaf610a02016-12-14 10:13:43 +0000129/**
Gilles Peskinecd07e222021-05-27 23:17:34 +0200130 * \brief Set the point format for future reads and writes.
131 *
132 * \param ctx The ECJPAKE context to configure.
133 * \param point_format The point format to use:
134 * #MBEDTLS_ECP_PF_UNCOMPRESSED (default)
135 * or #MBEDTLS_ECP_PF_COMPRESSED.
136 *
137 * \return \c 0 if successful.
138 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if \p point_format
139 * is invalid.
140 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000141int mbedtls_ecjpake_set_point_format(mbedtls_ecjpake_context *ctx,
142 int point_format);
Gilles Peskinecd07e222021-05-27 23:17:34 +0200143
144/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500145 * \brief Check if an ECJPAKE context is ready for use.
Manuel Pégourié-Gonnardb813acc2015-09-15 15:34:09 +0200146 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500147 * \param ctx The ECJPAKE context to check. This must be
148 * initialized.
Manuel Pégourié-Gonnardb813acc2015-09-15 15:34:09 +0200149 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500150 * \return \c 0 if the context is ready for use.
151 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise.
Manuel Pégourié-Gonnardb813acc2015-09-15 15:34:09 +0200152 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000153int mbedtls_ecjpake_check(const mbedtls_ecjpake_context *ctx);
Manuel Pégourié-Gonnardb813acc2015-09-15 15:34:09 +0200154
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200155/**
Manuel Pégourié-Gonnardd8204a72015-08-14 13:36:55 +0200156 * \brief Generate and write the first round message
157 * (TLS: contents of the Client/ServerHello extension,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500158 * excluding extension type and length bytes).
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200159 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500160 * \param ctx The ECJPAKE context to use. This must be
161 * initialized and set up.
162 * \param buf The buffer to write the contents to. This must be a
163 * writable buffer of length \p len Bytes.
164 * \param len The length of \p buf in Bytes.
165 * \param olen The address at which to store the total number
166 * of Bytes written to \p buf. This must not be \c NULL.
167 * \param f_rng The RNG function to use. This must not be \c NULL.
168 * \param p_rng The RNG parameter to be passed to \p f_rng. This
169 * may be \c NULL if \p f_rng doesn't use a context.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200170 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500171 * \return \c 0 if successful.
172 * \return A negative error code on failure.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200173 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000174int mbedtls_ecjpake_write_round_one(mbedtls_ecjpake_context *ctx,
175 unsigned char *buf, size_t len, size_t *olen,
176 int (*f_rng)(void *, unsigned char *, size_t),
177 void *p_rng);
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200178
179/**
180 * \brief Read and process the first round message
Manuel Pégourié-Gonnardd8204a72015-08-14 13:36:55 +0200181 * (TLS: contents of the Client/ServerHello extension,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500182 * excluding extension type and length bytes).
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200183 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500184 * \param ctx The ECJPAKE context to use. This must be initialized
185 * and set up.
186 * \param buf The buffer holding the first round message. This must
187 * be a readable buffer of length \p len Bytes.
188 * \param len The length in Bytes of \p buf.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200189 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500190 * \return \c 0 if successful.
191 * \return A negative error code on failure.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200192 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000193int mbedtls_ecjpake_read_round_one(mbedtls_ecjpake_context *ctx,
194 const unsigned char *buf,
195 size_t len);
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200196
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200197/**
198 * \brief Generate and write the second round message
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500199 * (TLS: contents of the Client/ServerKeyExchange).
Manuel Pégourié-Gonnard614bd5e2015-08-13 20:19:16 +0200200 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500201 * \param ctx The ECJPAKE context to use. This must be initialized,
202 * set up, and already have performed round one.
203 * \param buf The buffer to write the round two contents to.
204 * This must be a writable buffer of length \p len Bytes.
205 * \param len The size of \p buf in Bytes.
206 * \param olen The address at which to store the total number of Bytes
207 * written to \p buf. This must not be \c NULL.
208 * \param f_rng The RNG function to use. This must not be \c NULL.
209 * \param p_rng The RNG parameter to be passed to \p f_rng. This
210 * may be \c NULL if \p f_rng doesn't use a context.
Manuel Pégourié-Gonnard614bd5e2015-08-13 20:19:16 +0200211 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500212 * \return \c 0 if successful.
213 * \return A negative error code on failure.
Manuel Pégourié-Gonnard614bd5e2015-08-13 20:19:16 +0200214 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000215int mbedtls_ecjpake_write_round_two(mbedtls_ecjpake_context *ctx,
216 unsigned char *buf, size_t len, size_t *olen,
217 int (*f_rng)(void *, unsigned char *, size_t),
218 void *p_rng);
Manuel Pégourié-Gonnard614bd5e2015-08-13 20:19:16 +0200219
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200220/**
221 * \brief Read and process the second round message
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500222 * (TLS: contents of the Client/ServerKeyExchange).
Manuel Pégourié-Gonnardec0eece2015-08-13 19:13:20 +0200223 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500224 * \param ctx The ECJPAKE context to use. This must be initialized
225 * and set up and already have performed round one.
226 * \param buf The buffer holding the second round message. This must
227 * be a readable buffer of length \p len Bytes.
228 * \param len The length in Bytes of \p buf.
Manuel Pégourié-Gonnardec0eece2015-08-13 19:13:20 +0200229 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500230 * \return \c 0 if successful.
231 * \return A negative error code on failure.
Manuel Pégourié-Gonnardec0eece2015-08-13 19:13:20 +0200232 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000233int mbedtls_ecjpake_read_round_two(mbedtls_ecjpake_context *ctx,
234 const unsigned char *buf,
235 size_t len);
Manuel Pégourié-Gonnardec0eece2015-08-13 19:13:20 +0200236
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200237/**
238 * \brief Derive the shared secret
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500239 * (TLS: Pre-Master Secret).
Manuel Pégourié-Gonnard5f188292015-08-14 10:52:39 +0200240 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500241 * \param ctx The ECJPAKE context to use. This must be initialized,
242 * set up and have performed both round one and two.
243 * \param buf The buffer to write the derived secret to. This must
244 * be a writable buffer of length \p len Bytes.
245 * \param len The length of \p buf in Bytes.
246 * \param olen The address at which to store the total number of Bytes
247 * written to \p buf. This must not be \c NULL.
248 * \param f_rng The RNG function to use. This must not be \c NULL.
249 * \param p_rng The RNG parameter to be passed to \p f_rng. This
250 * may be \c NULL if \p f_rng doesn't use a context.
Manuel Pégourié-Gonnard5f188292015-08-14 10:52:39 +0200251 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500252 * \return \c 0 if successful.
253 * \return A negative error code on failure.
Manuel Pégourié-Gonnard5f188292015-08-14 10:52:39 +0200254 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000255int mbedtls_ecjpake_derive_secret(mbedtls_ecjpake_context *ctx,
256 unsigned char *buf, size_t len, size_t *olen,
257 int (*f_rng)(void *, unsigned char *, size_t),
258 void *p_rng);
Manuel Pégourié-Gonnard5f188292015-08-14 10:52:39 +0200259
Manuel Pégourié-Gonnardf7368c92015-08-14 14:33:05 +0200260/**
Neil Armstrong12663092022-06-15 16:00:00 +0200261 * \brief Write the shared key material to be passed to a Key
262 * Derivation Function as described in RFC8236.
263 *
264 * \param ctx The ECJPAKE context to use. This must be initialized,
265 * set up and have performed both round one and two.
266 * \param buf The buffer to write the derived secret to. This must
267 * be a writable buffer of length \p len Bytes.
268 * \param len The length of \p buf in Bytes.
Neil Armstrong7cd4eac2022-09-08 14:57:55 +0200269 * \param olen The address at which to store the total number of bytes
Neil Armstrong12663092022-06-15 16:00:00 +0200270 * written to \p buf. This must not be \c NULL.
271 * \param f_rng The RNG function to use. This must not be \c NULL.
272 * \param p_rng The RNG parameter to be passed to \p f_rng. This
273 * may be \c NULL if \p f_rng doesn't use a context.
274 *
275 * \return \c 0 if successful.
276 * \return A negative error code on failure.
277 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000278int mbedtls_ecjpake_write_shared_key(mbedtls_ecjpake_context *ctx,
279 unsigned char *buf, size_t len, size_t *olen,
280 int (*f_rng)(void *, unsigned char *, size_t),
281 void *p_rng);
Neil Armstrong12663092022-06-15 16:00:00 +0200282
283/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500284 * \brief This clears an ECJPAKE context and frees any
285 * embedded data structure.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200286 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500287 * \param ctx The ECJPAKE context to free. This may be \c NULL,
288 * in which case this function does nothing. If it is not
289 * \c NULL, it must point to an initialized ECJPAKE context.
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200290 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000291void mbedtls_ecjpake_free(mbedtls_ecjpake_context *ctx);
Manuel Pégourié-Gonnard4e8bc782015-08-12 20:50:31 +0200292
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +0200293#if defined(MBEDTLS_SELF_TEST)
Hanno Becker616d1ca2018-01-24 10:25:05 +0000294
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +0200295/**
296 * \brief Checkup routine
297 *
298 * \return 0 if successful, or 1 if a test failed
299 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000300int mbedtls_ecjpake_self_test(int verbose);
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +0200301
Ron Eldor4e6d55d2018-02-07 16:36:15 +0200302#endif /* MBEDTLS_SELF_TEST */
303
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +0200304#ifdef __cplusplus
305}
306#endif
307
Hanno Becker616d1ca2018-01-24 10:25:05 +0000308
Manuel Pégourié-Gonnard4d8685b2015-08-05 15:44:42 +0200309#endif /* ecjpake.h */