mbed client lightswitch demo

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of mbed-client-classic-example-lwip by Austin Blackstone

Committer:
mbedAustin
Date:
Thu Jun 09 17:08:36 2016 +0000
Revision:
11:cada08fc8a70
Commit for public Consumption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 11:cada08fc8a70 1 /**
mbedAustin 11:cada08fc8a70 2 * \file ecdh.h
mbedAustin 11:cada08fc8a70 3 *
mbedAustin 11:cada08fc8a70 4 * \brief Elliptic curve Diffie-Hellman
mbedAustin 11:cada08fc8a70 5 *
mbedAustin 11:cada08fc8a70 6 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
mbedAustin 11:cada08fc8a70 7 * SPDX-License-Identifier: Apache-2.0
mbedAustin 11:cada08fc8a70 8 *
mbedAustin 11:cada08fc8a70 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
mbedAustin 11:cada08fc8a70 10 * not use this file except in compliance with the License.
mbedAustin 11:cada08fc8a70 11 * You may obtain a copy of the License at
mbedAustin 11:cada08fc8a70 12 *
mbedAustin 11:cada08fc8a70 13 * http://www.apache.org/licenses/LICENSE-2.0
mbedAustin 11:cada08fc8a70 14 *
mbedAustin 11:cada08fc8a70 15 * Unless required by applicable law or agreed to in writing, software
mbedAustin 11:cada08fc8a70 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
mbedAustin 11:cada08fc8a70 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbedAustin 11:cada08fc8a70 18 * See the License for the specific language governing permissions and
mbedAustin 11:cada08fc8a70 19 * limitations under the License.
mbedAustin 11:cada08fc8a70 20 *
mbedAustin 11:cada08fc8a70 21 * This file is part of mbed TLS (https://tls.mbed.org)
mbedAustin 11:cada08fc8a70 22 */
mbedAustin 11:cada08fc8a70 23 #ifndef MBEDTLS_ECDH_H
mbedAustin 11:cada08fc8a70 24 #define MBEDTLS_ECDH_H
mbedAustin 11:cada08fc8a70 25
mbedAustin 11:cada08fc8a70 26 #include "ecp.h"
mbedAustin 11:cada08fc8a70 27
mbedAustin 11:cada08fc8a70 28 #ifdef __cplusplus
mbedAustin 11:cada08fc8a70 29 extern "C" {
mbedAustin 11:cada08fc8a70 30 #endif
mbedAustin 11:cada08fc8a70 31
mbedAustin 11:cada08fc8a70 32 /**
mbedAustin 11:cada08fc8a70 33 * When importing from an EC key, select if it is our key or the peer's key
mbedAustin 11:cada08fc8a70 34 */
mbedAustin 11:cada08fc8a70 35 typedef enum
mbedAustin 11:cada08fc8a70 36 {
mbedAustin 11:cada08fc8a70 37 MBEDTLS_ECDH_OURS,
mbedAustin 11:cada08fc8a70 38 MBEDTLS_ECDH_THEIRS,
mbedAustin 11:cada08fc8a70 39 } mbedtls_ecdh_side;
mbedAustin 11:cada08fc8a70 40
mbedAustin 11:cada08fc8a70 41 /**
mbedAustin 11:cada08fc8a70 42 * \brief ECDH context structure
mbedAustin 11:cada08fc8a70 43 */
mbedAustin 11:cada08fc8a70 44 typedef struct
mbedAustin 11:cada08fc8a70 45 {
mbedAustin 11:cada08fc8a70 46 mbedtls_ecp_group grp; /*!< elliptic curve used */
mbedAustin 11:cada08fc8a70 47 mbedtls_mpi d; /*!< our secret value (private key) */
mbedAustin 11:cada08fc8a70 48 mbedtls_ecp_point Q; /*!< our public value (public key) */
mbedAustin 11:cada08fc8a70 49 mbedtls_ecp_point Qp; /*!< peer's public value (public key) */
mbedAustin 11:cada08fc8a70 50 mbedtls_mpi z; /*!< shared secret */
mbedAustin 11:cada08fc8a70 51 int point_format; /*!< format for point export in TLS messages */
mbedAustin 11:cada08fc8a70 52 mbedtls_ecp_point Vi; /*!< blinding value (for later) */
mbedAustin 11:cada08fc8a70 53 mbedtls_ecp_point Vf; /*!< un-blinding value (for later) */
mbedAustin 11:cada08fc8a70 54 mbedtls_mpi _d; /*!< previous d (for later) */
mbedAustin 11:cada08fc8a70 55 }
mbedAustin 11:cada08fc8a70 56 mbedtls_ecdh_context;
mbedAustin 11:cada08fc8a70 57
mbedAustin 11:cada08fc8a70 58 /**
mbedAustin 11:cada08fc8a70 59 * \brief Generate a public key.
mbedAustin 11:cada08fc8a70 60 * Raw function that only does the core computation.
mbedAustin 11:cada08fc8a70 61 *
mbedAustin 11:cada08fc8a70 62 * \param grp ECP group
mbedAustin 11:cada08fc8a70 63 * \param d Destination MPI (secret exponent, aka private key)
mbedAustin 11:cada08fc8a70 64 * \param Q Destination point (public key)
mbedAustin 11:cada08fc8a70 65 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 66 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 67 *
mbedAustin 11:cada08fc8a70 68 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 69 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
mbedAustin 11:cada08fc8a70 70 */
mbedAustin 11:cada08fc8a70 71 int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
mbedAustin 11:cada08fc8a70 72 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 73 void *p_rng );
mbedAustin 11:cada08fc8a70 74
mbedAustin 11:cada08fc8a70 75 /**
mbedAustin 11:cada08fc8a70 76 * \brief Compute shared secret
mbedAustin 11:cada08fc8a70 77 * Raw function that only does the core computation.
mbedAustin 11:cada08fc8a70 78 *
mbedAustin 11:cada08fc8a70 79 * \param grp ECP group
mbedAustin 11:cada08fc8a70 80 * \param z Destination MPI (shared secret)
mbedAustin 11:cada08fc8a70 81 * \param Q Public key from other party
mbedAustin 11:cada08fc8a70 82 * \param d Our secret exponent (private key)
mbedAustin 11:cada08fc8a70 83 * \param f_rng RNG function (see notes)
mbedAustin 11:cada08fc8a70 84 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 85 *
mbedAustin 11:cada08fc8a70 86 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 87 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
mbedAustin 11:cada08fc8a70 88 *
mbedAustin 11:cada08fc8a70 89 * \note If f_rng is not NULL, it is used to implement
mbedAustin 11:cada08fc8a70 90 * countermeasures against potential elaborate timing
mbedAustin 11:cada08fc8a70 91 * attacks, see \c mbedtls_ecp_mul() for details.
mbedAustin 11:cada08fc8a70 92 */
mbedAustin 11:cada08fc8a70 93 int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
mbedAustin 11:cada08fc8a70 94 const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
mbedAustin 11:cada08fc8a70 95 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 96 void *p_rng );
mbedAustin 11:cada08fc8a70 97
mbedAustin 11:cada08fc8a70 98 /**
mbedAustin 11:cada08fc8a70 99 * \brief Initialize context
mbedAustin 11:cada08fc8a70 100 *
mbedAustin 11:cada08fc8a70 101 * \param ctx Context to initialize
mbedAustin 11:cada08fc8a70 102 */
mbedAustin 11:cada08fc8a70 103 void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx );
mbedAustin 11:cada08fc8a70 104
mbedAustin 11:cada08fc8a70 105 /**
mbedAustin 11:cada08fc8a70 106 * \brief Free context
mbedAustin 11:cada08fc8a70 107 *
mbedAustin 11:cada08fc8a70 108 * \param ctx Context to free
mbedAustin 11:cada08fc8a70 109 */
mbedAustin 11:cada08fc8a70 110 void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx );
mbedAustin 11:cada08fc8a70 111
mbedAustin 11:cada08fc8a70 112 /**
mbedAustin 11:cada08fc8a70 113 * \brief Generate a public key and a TLS ServerKeyExchange payload.
mbedAustin 11:cada08fc8a70 114 * (First function used by a TLS server for ECDHE.)
mbedAustin 11:cada08fc8a70 115 *
mbedAustin 11:cada08fc8a70 116 * \param ctx ECDH context
mbedAustin 11:cada08fc8a70 117 * \param olen number of chars written
mbedAustin 11:cada08fc8a70 118 * \param buf destination buffer
mbedAustin 11:cada08fc8a70 119 * \param blen length of buffer
mbedAustin 11:cada08fc8a70 120 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 121 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 122 *
mbedAustin 11:cada08fc8a70 123 * \note This function assumes that ctx->grp has already been
mbedAustin 11:cada08fc8a70 124 * properly set (for example using mbedtls_ecp_group_load).
mbedAustin 11:cada08fc8a70 125 *
mbedAustin 11:cada08fc8a70 126 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 127 */
mbedAustin 11:cada08fc8a70 128 int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
mbedAustin 11:cada08fc8a70 129 unsigned char *buf, size_t blen,
mbedAustin 11:cada08fc8a70 130 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 131 void *p_rng );
mbedAustin 11:cada08fc8a70 132
mbedAustin 11:cada08fc8a70 133 /**
mbedAustin 11:cada08fc8a70 134 * \brief Parse and procress a TLS ServerKeyExhange payload.
mbedAustin 11:cada08fc8a70 135 * (First function used by a TLS client for ECDHE.)
mbedAustin 11:cada08fc8a70 136 *
mbedAustin 11:cada08fc8a70 137 * \param ctx ECDH context
mbedAustin 11:cada08fc8a70 138 * \param buf pointer to start of input buffer
mbedAustin 11:cada08fc8a70 139 * \param end one past end of buffer
mbedAustin 11:cada08fc8a70 140 *
mbedAustin 11:cada08fc8a70 141 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 142 */
mbedAustin 11:cada08fc8a70 143 int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,
mbedAustin 11:cada08fc8a70 144 const unsigned char **buf, const unsigned char *end );
mbedAustin 11:cada08fc8a70 145
mbedAustin 11:cada08fc8a70 146 /**
mbedAustin 11:cada08fc8a70 147 * \brief Setup an ECDH context from an EC key.
mbedAustin 11:cada08fc8a70 148 * (Used by clients and servers in place of the
mbedAustin 11:cada08fc8a70 149 * ServerKeyEchange for static ECDH: import ECDH parameters
mbedAustin 11:cada08fc8a70 150 * from a certificate's EC key information.)
mbedAustin 11:cada08fc8a70 151 *
mbedAustin 11:cada08fc8a70 152 * \param ctx ECDH constext to set
mbedAustin 11:cada08fc8a70 153 * \param key EC key to use
mbedAustin 11:cada08fc8a70 154 * \param side Is it our key (1) or the peer's key (0) ?
mbedAustin 11:cada08fc8a70 155 *
mbedAustin 11:cada08fc8a70 156 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 157 */
mbedAustin 11:cada08fc8a70 158 int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key,
mbedAustin 11:cada08fc8a70 159 mbedtls_ecdh_side side );
mbedAustin 11:cada08fc8a70 160
mbedAustin 11:cada08fc8a70 161 /**
mbedAustin 11:cada08fc8a70 162 * \brief Generate a public key and a TLS ClientKeyExchange payload.
mbedAustin 11:cada08fc8a70 163 * (Second function used by a TLS client for ECDH(E).)
mbedAustin 11:cada08fc8a70 164 *
mbedAustin 11:cada08fc8a70 165 * \param ctx ECDH context
mbedAustin 11:cada08fc8a70 166 * \param olen number of bytes actually written
mbedAustin 11:cada08fc8a70 167 * \param buf destination buffer
mbedAustin 11:cada08fc8a70 168 * \param blen size of destination buffer
mbedAustin 11:cada08fc8a70 169 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 170 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 171 *
mbedAustin 11:cada08fc8a70 172 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 173 */
mbedAustin 11:cada08fc8a70 174 int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
mbedAustin 11:cada08fc8a70 175 unsigned char *buf, size_t blen,
mbedAustin 11:cada08fc8a70 176 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 177 void *p_rng );
mbedAustin 11:cada08fc8a70 178
mbedAustin 11:cada08fc8a70 179 /**
mbedAustin 11:cada08fc8a70 180 * \brief Parse and process a TLS ClientKeyExchange payload.
mbedAustin 11:cada08fc8a70 181 * (Second function used by a TLS server for ECDH(E).)
mbedAustin 11:cada08fc8a70 182 *
mbedAustin 11:cada08fc8a70 183 * \param ctx ECDH context
mbedAustin 11:cada08fc8a70 184 * \param buf start of input buffer
mbedAustin 11:cada08fc8a70 185 * \param blen length of input buffer
mbedAustin 11:cada08fc8a70 186 *
mbedAustin 11:cada08fc8a70 187 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 188 */
mbedAustin 11:cada08fc8a70 189 int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,
mbedAustin 11:cada08fc8a70 190 const unsigned char *buf, size_t blen );
mbedAustin 11:cada08fc8a70 191
mbedAustin 11:cada08fc8a70 192 /**
mbedAustin 11:cada08fc8a70 193 * \brief Derive and export the shared secret.
mbedAustin 11:cada08fc8a70 194 * (Last function used by both TLS client en servers.)
mbedAustin 11:cada08fc8a70 195 *
mbedAustin 11:cada08fc8a70 196 * \param ctx ECDH context
mbedAustin 11:cada08fc8a70 197 * \param olen number of bytes written
mbedAustin 11:cada08fc8a70 198 * \param buf destination buffer
mbedAustin 11:cada08fc8a70 199 * \param blen buffer length
mbedAustin 11:cada08fc8a70 200 * \param f_rng RNG function, see notes for \c mbedtls_ecdh_compute_shared()
mbedAustin 11:cada08fc8a70 201 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 202 *
mbedAustin 11:cada08fc8a70 203 * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code
mbedAustin 11:cada08fc8a70 204 */
mbedAustin 11:cada08fc8a70 205 int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,
mbedAustin 11:cada08fc8a70 206 unsigned char *buf, size_t blen,
mbedAustin 11:cada08fc8a70 207 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 208 void *p_rng );
mbedAustin 11:cada08fc8a70 209
mbedAustin 11:cada08fc8a70 210 #ifdef __cplusplus
mbedAustin 11:cada08fc8a70 211 }
mbedAustin 11:cada08fc8a70 212 #endif
mbedAustin 11:cada08fc8a70 213
mbedAustin 11:cada08fc8a70 214 #endif /* ecdh.h */