This is a fork due to permission issues

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of 6_songs-from-the-cloud by MakingMusicWorkshop

Committer:
maclobdell
Date:
Wed May 18 19:06:32 2016 +0000
Revision:
0:f7c60d3e7b8a
clean version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maclobdell 0:f7c60d3e7b8a 1 /**
maclobdell 0:f7c60d3e7b8a 2 * \file ecdsa.h
maclobdell 0:f7c60d3e7b8a 3 *
maclobdell 0:f7c60d3e7b8a 4 * \brief Elliptic curve DSA
maclobdell 0:f7c60d3e7b8a 5 *
maclobdell 0:f7c60d3e7b8a 6 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
maclobdell 0:f7c60d3e7b8a 7 * SPDX-License-Identifier: Apache-2.0
maclobdell 0:f7c60d3e7b8a 8 *
maclobdell 0:f7c60d3e7b8a 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
maclobdell 0:f7c60d3e7b8a 10 * not use this file except in compliance with the License.
maclobdell 0:f7c60d3e7b8a 11 * You may obtain a copy of the License at
maclobdell 0:f7c60d3e7b8a 12 *
maclobdell 0:f7c60d3e7b8a 13 * http://www.apache.org/licenses/LICENSE-2.0
maclobdell 0:f7c60d3e7b8a 14 *
maclobdell 0:f7c60d3e7b8a 15 * Unless required by applicable law or agreed to in writing, software
maclobdell 0:f7c60d3e7b8a 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
maclobdell 0:f7c60d3e7b8a 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
maclobdell 0:f7c60d3e7b8a 18 * See the License for the specific language governing permissions and
maclobdell 0:f7c60d3e7b8a 19 * limitations under the License.
maclobdell 0:f7c60d3e7b8a 20 *
maclobdell 0:f7c60d3e7b8a 21 * This file is part of mbed TLS (https://tls.mbed.org)
maclobdell 0:f7c60d3e7b8a 22 */
maclobdell 0:f7c60d3e7b8a 23 #ifndef MBEDTLS_ECDSA_H
maclobdell 0:f7c60d3e7b8a 24 #define MBEDTLS_ECDSA_H
maclobdell 0:f7c60d3e7b8a 25
maclobdell 0:f7c60d3e7b8a 26 #include "ecp.h"
maclobdell 0:f7c60d3e7b8a 27 #include "md.h"
maclobdell 0:f7c60d3e7b8a 28
maclobdell 0:f7c60d3e7b8a 29 /*
maclobdell 0:f7c60d3e7b8a 30 * RFC 4492 page 20:
maclobdell 0:f7c60d3e7b8a 31 *
maclobdell 0:f7c60d3e7b8a 32 * Ecdsa-Sig-Value ::= SEQUENCE {
maclobdell 0:f7c60d3e7b8a 33 * r INTEGER,
maclobdell 0:f7c60d3e7b8a 34 * s INTEGER
maclobdell 0:f7c60d3e7b8a 35 * }
maclobdell 0:f7c60d3e7b8a 36 *
maclobdell 0:f7c60d3e7b8a 37 * Size is at most
maclobdell 0:f7c60d3e7b8a 38 * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s,
maclobdell 0:f7c60d3e7b8a 39 * twice that + 1 (tag) + 2 (len) for the sequence
maclobdell 0:f7c60d3e7b8a 40 * (assuming ECP_MAX_BYTES is less than 126 for r and s,
maclobdell 0:f7c60d3e7b8a 41 * and less than 124 (total len <= 255) for the sequence)
maclobdell 0:f7c60d3e7b8a 42 */
maclobdell 0:f7c60d3e7b8a 43 #if MBEDTLS_ECP_MAX_BYTES > 124
maclobdell 0:f7c60d3e7b8a 44 #error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN"
maclobdell 0:f7c60d3e7b8a 45 #endif
maclobdell 0:f7c60d3e7b8a 46 /** Maximum size of an ECDSA signature in bytes */
maclobdell 0:f7c60d3e7b8a 47 #define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) )
maclobdell 0:f7c60d3e7b8a 48
maclobdell 0:f7c60d3e7b8a 49 /**
maclobdell 0:f7c60d3e7b8a 50 * \brief ECDSA context structure
maclobdell 0:f7c60d3e7b8a 51 */
maclobdell 0:f7c60d3e7b8a 52 typedef mbedtls_ecp_keypair mbedtls_ecdsa_context;
maclobdell 0:f7c60d3e7b8a 53
maclobdell 0:f7c60d3e7b8a 54 #ifdef __cplusplus
maclobdell 0:f7c60d3e7b8a 55 extern "C" {
maclobdell 0:f7c60d3e7b8a 56 #endif
maclobdell 0:f7c60d3e7b8a 57
maclobdell 0:f7c60d3e7b8a 58 /**
maclobdell 0:f7c60d3e7b8a 59 * \brief Compute ECDSA signature of a previously hashed message
maclobdell 0:f7c60d3e7b8a 60 *
maclobdell 0:f7c60d3e7b8a 61 * \note The deterministic version is usually prefered.
maclobdell 0:f7c60d3e7b8a 62 *
maclobdell 0:f7c60d3e7b8a 63 * \param grp ECP group
maclobdell 0:f7c60d3e7b8a 64 * \param r First output integer
maclobdell 0:f7c60d3e7b8a 65 * \param s Second output integer
maclobdell 0:f7c60d3e7b8a 66 * \param d Private signing key
maclobdell 0:f7c60d3e7b8a 67 * \param buf Message hash
maclobdell 0:f7c60d3e7b8a 68 * \param blen Length of buf
maclobdell 0:f7c60d3e7b8a 69 * \param f_rng RNG function
maclobdell 0:f7c60d3e7b8a 70 * \param p_rng RNG parameter
maclobdell 0:f7c60d3e7b8a 71 *
maclobdell 0:f7c60d3e7b8a 72 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 73 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
maclobdell 0:f7c60d3e7b8a 74 */
maclobdell 0:f7c60d3e7b8a 75 int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
maclobdell 0:f7c60d3e7b8a 76 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
maclobdell 0:f7c60d3e7b8a 77 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
maclobdell 0:f7c60d3e7b8a 78
maclobdell 0:f7c60d3e7b8a 79 #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
maclobdell 0:f7c60d3e7b8a 80 /**
maclobdell 0:f7c60d3e7b8a 81 * \brief Compute ECDSA signature of a previously hashed message,
maclobdell 0:f7c60d3e7b8a 82 * deterministic version (RFC 6979).
maclobdell 0:f7c60d3e7b8a 83 *
maclobdell 0:f7c60d3e7b8a 84 * \param grp ECP group
maclobdell 0:f7c60d3e7b8a 85 * \param r First output integer
maclobdell 0:f7c60d3e7b8a 86 * \param s Second output integer
maclobdell 0:f7c60d3e7b8a 87 * \param d Private signing key
maclobdell 0:f7c60d3e7b8a 88 * \param buf Message hash
maclobdell 0:f7c60d3e7b8a 89 * \param blen Length of buf
maclobdell 0:f7c60d3e7b8a 90 * \param md_alg MD algorithm used to hash the message
maclobdell 0:f7c60d3e7b8a 91 *
maclobdell 0:f7c60d3e7b8a 92 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 93 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
maclobdell 0:f7c60d3e7b8a 94 */
maclobdell 0:f7c60d3e7b8a 95 int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
maclobdell 0:f7c60d3e7b8a 96 const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
maclobdell 0:f7c60d3e7b8a 97 mbedtls_md_type_t md_alg );
maclobdell 0:f7c60d3e7b8a 98 #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
maclobdell 0:f7c60d3e7b8a 99
maclobdell 0:f7c60d3e7b8a 100 /**
maclobdell 0:f7c60d3e7b8a 101 * \brief Verify ECDSA signature of a previously hashed message
maclobdell 0:f7c60d3e7b8a 102 *
maclobdell 0:f7c60d3e7b8a 103 * \param grp ECP group
maclobdell 0:f7c60d3e7b8a 104 * \param buf Message hash
maclobdell 0:f7c60d3e7b8a 105 * \param blen Length of buf
maclobdell 0:f7c60d3e7b8a 106 * \param Q Public key to use for verification
maclobdell 0:f7c60d3e7b8a 107 * \param r First integer of the signature
maclobdell 0:f7c60d3e7b8a 108 * \param s Second integer of the signature
maclobdell 0:f7c60d3e7b8a 109 *
maclobdell 0:f7c60d3e7b8a 110 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 111 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid
maclobdell 0:f7c60d3e7b8a 112 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
maclobdell 0:f7c60d3e7b8a 113 */
maclobdell 0:f7c60d3e7b8a 114 int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
maclobdell 0:f7c60d3e7b8a 115 const unsigned char *buf, size_t blen,
maclobdell 0:f7c60d3e7b8a 116 const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);
maclobdell 0:f7c60d3e7b8a 117
maclobdell 0:f7c60d3e7b8a 118 /**
maclobdell 0:f7c60d3e7b8a 119 * \brief Compute ECDSA signature and write it to buffer,
maclobdell 0:f7c60d3e7b8a 120 * serialized as defined in RFC 4492 page 20.
maclobdell 0:f7c60d3e7b8a 121 * (Not thread-safe to use same context in multiple threads)
maclobdell 0:f7c60d3e7b8a 122 *
maclobdell 0:f7c60d3e7b8a 123 * \note The deterministice version (RFC 6979) is used if
maclobdell 0:f7c60d3e7b8a 124 * MBEDTLS_ECDSA_DETERMINISTIC is defined.
maclobdell 0:f7c60d3e7b8a 125 *
maclobdell 0:f7c60d3e7b8a 126 * \param ctx ECDSA context
maclobdell 0:f7c60d3e7b8a 127 * \param md_alg Algorithm that was used to hash the message
maclobdell 0:f7c60d3e7b8a 128 * \param hash Message hash
maclobdell 0:f7c60d3e7b8a 129 * \param hlen Length of hash
maclobdell 0:f7c60d3e7b8a 130 * \param sig Buffer that will hold the signature
maclobdell 0:f7c60d3e7b8a 131 * \param slen Length of the signature written
maclobdell 0:f7c60d3e7b8a 132 * \param f_rng RNG function
maclobdell 0:f7c60d3e7b8a 133 * \param p_rng RNG parameter
maclobdell 0:f7c60d3e7b8a 134 *
maclobdell 0:f7c60d3e7b8a 135 * \note The "sig" buffer must be at least as large as twice the
maclobdell 0:f7c60d3e7b8a 136 * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit
maclobdell 0:f7c60d3e7b8a 137 * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe.
maclobdell 0:f7c60d3e7b8a 138 *
maclobdell 0:f7c60d3e7b8a 139 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 140 * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or
maclobdell 0:f7c60d3e7b8a 141 * MBEDTLS_ERR_ASN1_XXX error code
maclobdell 0:f7c60d3e7b8a 142 */
maclobdell 0:f7c60d3e7b8a 143 int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
maclobdell 0:f7c60d3e7b8a 144 const unsigned char *hash, size_t hlen,
maclobdell 0:f7c60d3e7b8a 145 unsigned char *sig, size_t *slen,
maclobdell 0:f7c60d3e7b8a 146 int (*f_rng)(void *, unsigned char *, size_t),
maclobdell 0:f7c60d3e7b8a 147 void *p_rng );
maclobdell 0:f7c60d3e7b8a 148
maclobdell 0:f7c60d3e7b8a 149 #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
maclobdell 0:f7c60d3e7b8a 150 #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
maclobdell 0:f7c60d3e7b8a 151 #if defined(MBEDTLS_DEPRECATED_WARNING)
maclobdell 0:f7c60d3e7b8a 152 #define MBEDTLS_DEPRECATED __attribute__((deprecated))
maclobdell 0:f7c60d3e7b8a 153 #else
maclobdell 0:f7c60d3e7b8a 154 #define MBEDTLS_DEPRECATED
maclobdell 0:f7c60d3e7b8a 155 #endif
maclobdell 0:f7c60d3e7b8a 156 /**
maclobdell 0:f7c60d3e7b8a 157 * \brief Compute ECDSA signature and write it to buffer,
maclobdell 0:f7c60d3e7b8a 158 * serialized as defined in RFC 4492 page 20.
maclobdell 0:f7c60d3e7b8a 159 * Deterministic version, RFC 6979.
maclobdell 0:f7c60d3e7b8a 160 * (Not thread-safe to use same context in multiple threads)
maclobdell 0:f7c60d3e7b8a 161 *
maclobdell 0:f7c60d3e7b8a 162 * \deprecated Superseded by mbedtls_ecdsa_write_signature() in 2.0.0
maclobdell 0:f7c60d3e7b8a 163 *
maclobdell 0:f7c60d3e7b8a 164 * \param ctx ECDSA context
maclobdell 0:f7c60d3e7b8a 165 * \param hash Message hash
maclobdell 0:f7c60d3e7b8a 166 * \param hlen Length of hash
maclobdell 0:f7c60d3e7b8a 167 * \param sig Buffer that will hold the signature
maclobdell 0:f7c60d3e7b8a 168 * \param slen Length of the signature written
maclobdell 0:f7c60d3e7b8a 169 * \param md_alg MD algorithm used to hash the message
maclobdell 0:f7c60d3e7b8a 170 *
maclobdell 0:f7c60d3e7b8a 171 * \note The "sig" buffer must be at least as large as twice the
maclobdell 0:f7c60d3e7b8a 172 * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit
maclobdell 0:f7c60d3e7b8a 173 * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe.
maclobdell 0:f7c60d3e7b8a 174 *
maclobdell 0:f7c60d3e7b8a 175 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 176 * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or
maclobdell 0:f7c60d3e7b8a 177 * MBEDTLS_ERR_ASN1_XXX error code
maclobdell 0:f7c60d3e7b8a 178 */
maclobdell 0:f7c60d3e7b8a 179 int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
maclobdell 0:f7c60d3e7b8a 180 const unsigned char *hash, size_t hlen,
maclobdell 0:f7c60d3e7b8a 181 unsigned char *sig, size_t *slen,
maclobdell 0:f7c60d3e7b8a 182 mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED;
maclobdell 0:f7c60d3e7b8a 183 #undef MBEDTLS_DEPRECATED
maclobdell 0:f7c60d3e7b8a 184 #endif /* MBEDTLS_DEPRECATED_REMOVED */
maclobdell 0:f7c60d3e7b8a 185 #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
maclobdell 0:f7c60d3e7b8a 186
maclobdell 0:f7c60d3e7b8a 187 /**
maclobdell 0:f7c60d3e7b8a 188 * \brief Read and verify an ECDSA signature
maclobdell 0:f7c60d3e7b8a 189 *
maclobdell 0:f7c60d3e7b8a 190 * \param ctx ECDSA context
maclobdell 0:f7c60d3e7b8a 191 * \param hash Message hash
maclobdell 0:f7c60d3e7b8a 192 * \param hlen Size of hash
maclobdell 0:f7c60d3e7b8a 193 * \param sig Signature to read and verify
maclobdell 0:f7c60d3e7b8a 194 * \param slen Size of sig
maclobdell 0:f7c60d3e7b8a 195 *
maclobdell 0:f7c60d3e7b8a 196 * \return 0 if successful,
maclobdell 0:f7c60d3e7b8a 197 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,
maclobdell 0:f7c60d3e7b8a 198 * MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is
maclobdell 0:f7c60d3e7b8a 199 * valid but its actual length is less than siglen,
maclobdell 0:f7c60d3e7b8a 200 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX error code
maclobdell 0:f7c60d3e7b8a 201 */
maclobdell 0:f7c60d3e7b8a 202 int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
maclobdell 0:f7c60d3e7b8a 203 const unsigned char *hash, size_t hlen,
maclobdell 0:f7c60d3e7b8a 204 const unsigned char *sig, size_t slen );
maclobdell 0:f7c60d3e7b8a 205
maclobdell 0:f7c60d3e7b8a 206 /**
maclobdell 0:f7c60d3e7b8a 207 * \brief Generate an ECDSA keypair on the given curve
maclobdell 0:f7c60d3e7b8a 208 *
maclobdell 0:f7c60d3e7b8a 209 * \param ctx ECDSA context in which the keypair should be stored
maclobdell 0:f7c60d3e7b8a 210 * \param gid Group (elliptic curve) to use. One of the various
maclobdell 0:f7c60d3e7b8a 211 * MBEDTLS_ECP_DP_XXX macros depending on configuration.
maclobdell 0:f7c60d3e7b8a 212 * \param f_rng RNG function
maclobdell 0:f7c60d3e7b8a 213 * \param p_rng RNG parameter
maclobdell 0:f7c60d3e7b8a 214 *
maclobdell 0:f7c60d3e7b8a 215 * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code.
maclobdell 0:f7c60d3e7b8a 216 */
maclobdell 0:f7c60d3e7b8a 217 int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
maclobdell 0:f7c60d3e7b8a 218 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
maclobdell 0:f7c60d3e7b8a 219
maclobdell 0:f7c60d3e7b8a 220 /**
maclobdell 0:f7c60d3e7b8a 221 * \brief Set an ECDSA context from an EC key pair
maclobdell 0:f7c60d3e7b8a 222 *
maclobdell 0:f7c60d3e7b8a 223 * \param ctx ECDSA context to set
maclobdell 0:f7c60d3e7b8a 224 * \param key EC key to use
maclobdell 0:f7c60d3e7b8a 225 *
maclobdell 0:f7c60d3e7b8a 226 * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code.
maclobdell 0:f7c60d3e7b8a 227 */
maclobdell 0:f7c60d3e7b8a 228 int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );
maclobdell 0:f7c60d3e7b8a 229
maclobdell 0:f7c60d3e7b8a 230 /**
maclobdell 0:f7c60d3e7b8a 231 * \brief Initialize context
maclobdell 0:f7c60d3e7b8a 232 *
maclobdell 0:f7c60d3e7b8a 233 * \param ctx Context to initialize
maclobdell 0:f7c60d3e7b8a 234 */
maclobdell 0:f7c60d3e7b8a 235 void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );
maclobdell 0:f7c60d3e7b8a 236
maclobdell 0:f7c60d3e7b8a 237 /**
maclobdell 0:f7c60d3e7b8a 238 * \brief Free context
maclobdell 0:f7c60d3e7b8a 239 *
maclobdell 0:f7c60d3e7b8a 240 * \param ctx Context to free
maclobdell 0:f7c60d3e7b8a 241 */
maclobdell 0:f7c60d3e7b8a 242 void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );
maclobdell 0:f7c60d3e7b8a 243
maclobdell 0:f7c60d3e7b8a 244 #ifdef __cplusplus
maclobdell 0:f7c60d3e7b8a 245 }
maclobdell 0:f7c60d3e7b8a 246 #endif
maclobdell 0:f7c60d3e7b8a 247
maclobdell 0:f7c60d3e7b8a 248 #endif /* ecdsa.h */