mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-01-26 12:30:59 +00:00
da19f4c79f
Summary of merge conflicts: include/mbedtls/ecdh.h -> documentation style include/mbedtls/ecdsa.h -> documentation style include/mbedtls/ecp.h -> alt style, new error codes, documentation style include/mbedtls/error.h -> new error codes library/error.c -> new error codes (generated anyway) library/ecp.c: - code of an extracted function was changed library/ssl_cli.c: - code addition on one side near code change on the other side (ciphersuite validation) library/x509_crt.c -> various things - top fo file: helper structure added near old zeroize removed - documentation of find_parent_in()'s signature: improved on one side, added arguments on the other side - documentation of find_parent()'s signature: same as above - verify_chain(): variables initialised later to give compiler an opportunity to warn us if not initialised on a code path - find_parent(): funcion structure completely changed, for some reason git tried to insert a paragraph of the old structure... - merge_flags_with_cb(): data structure changed, one line was fixed with a cast to keep MSVC happy, this cast is already in the new version - in verify_restratable(): adjacent independent changes (function signature on one line, variable type on the next) programs/ssl/ssl_client2.c: - testing for IN_PROGRESS return code near idle() (event-driven): don't wait for data in the the socket if ECP_IN_PROGRESS tests/data_files/Makefile: adjacent independent additions tests/suites/test_suite_ecdsa.data: adjacent independent additions tests/suites/test_suite_x509parse.data: adjacent independent additions * development: (1059 commits) Change symlink to hardlink to avoid permission issues Fix out-of-tree testing symlinks on Windows Updated version number to 2.10.0 for release Add a disabled CMAC define in the no-entropy configuration Adapt the ARIA test cases for new ECB function Fix file permissions for ssl.h Add ChangeLog entry for PR#1651 Fix MicroBlaze register typo. Fix typo in doc and copy missing warning Fix edit mistake in cipher_wrap.c Update CTR doc for the 64-bit block cipher Update CTR doc for other 128-bit block ciphers Slightly tune ARIA CTR documentation Remove double declaration of mbedtls_ssl_list_ciphersuites Update CTR documentation Use zeroize function from new platform_util Move to new header style for ALT implementations Add ifdef for selftest in header file Fix typo in comments Use more appropriate type for local variable ...
466 lines
18 KiB
C
466 lines
18 KiB
C
/**
|
|
* \file ecdsa.h
|
|
*
|
|
* \brief This file contains ECDSA definitions and functions.
|
|
*
|
|
* The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined in
|
|
* <em>Standards for Efficient Cryptography Group (SECG):
|
|
* SEC1 Elliptic Curve Cryptography</em>.
|
|
* The use of ECDSA for TLS is defined in <em>RFC-4492: Elliptic Curve
|
|
* Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)</em>.
|
|
*
|
|
*/
|
|
/*
|
|
* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* This file is part of Mbed TLS (https://tls.mbed.org)
|
|
*/
|
|
|
|
#ifndef MBEDTLS_ECDSA_H
|
|
#define MBEDTLS_ECDSA_H
|
|
|
|
#include "ecp.h"
|
|
#include "md.h"
|
|
|
|
/*
|
|
* RFC-4492 page 20:
|
|
*
|
|
* Ecdsa-Sig-Value ::= SEQUENCE {
|
|
* r INTEGER,
|
|
* s INTEGER
|
|
* }
|
|
*
|
|
* Size is at most
|
|
* 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s,
|
|
* twice that + 1 (tag) + 2 (len) for the sequence
|
|
* (assuming ECP_MAX_BYTES is less than 126 for r and s,
|
|
* and less than 124 (total len <= 255) for the sequence)
|
|
*/
|
|
#if MBEDTLS_ECP_MAX_BYTES > 124
|
|
#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN"
|
|
#endif
|
|
/** The maximal size of an ECDSA signature in Bytes. */
|
|
#define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) )
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* \brief The ECDSA context structure.
|
|
*
|
|
* \warning Performing multiple operations concurrently on the same
|
|
* ECDSA context is not supported; objects of this type
|
|
* should not be shared between multiple threads.
|
|
*/
|
|
typedef mbedtls_ecp_keypair mbedtls_ecdsa_context;
|
|
|
|
#if defined(MBEDTLS_ECP_RESTARTABLE)
|
|
|
|
/**
|
|
* \brief Internal restart context for ecdsa_verify()
|
|
*
|
|
* \note Opaque struct
|
|
*/
|
|
typedef struct mbedtls_ecdsa_restart_ver mbedtls_ecdsa_restart_ver_ctx;
|
|
|
|
/**
|
|
* \brief Internal restart context for ecdsa_sign()
|
|
*
|
|
* \note Opaque struct, defined in ecdsa.c
|
|
*/
|
|
typedef struct mbedtls_ecdsa_restart_sig mbedtls_ecdsa_restart_sig_ctx;
|
|
|
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
|
/**
|
|
* \brief Internal restart context for ecdsa_sign_det()
|
|
*
|
|
* \note Opaque struct, defined in ecdsa.c
|
|
*/
|
|
typedef struct mbedtls_ecdsa_restart_det mbedtls_ecdsa_restart_det_ctx;
|
|
#endif
|
|
|
|
/**
|
|
* \brief General context for resuming ECDSA operations
|
|
*/
|
|
typedef struct
|
|
{
|
|
mbedtls_ecp_restart_ctx ecp; /*!< base context (admin+ecp info) */
|
|
mbedtls_ecdsa_restart_ver_ctx *ver; /*!< ecdsa_verify() sub-context */
|
|
mbedtls_ecdsa_restart_sig_ctx *sig; /*!< ecdsa_sign() sub-context */
|
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
|
mbedtls_ecdsa_restart_det_ctx *det; /*!< ecdsa_sign_det() sub-context */
|
|
#endif
|
|
} mbedtls_ecdsa_restart_ctx;
|
|
|
|
#else /* MBEDTLS_ECP_RESTARTABLE */
|
|
|
|
/* Now we can declare functions that take a pointer to that */
|
|
typedef void mbedtls_ecdsa_restart_ctx;
|
|
|
|
#endif /* MBEDTLS_ECP_RESTARTABLE */
|
|
|
|
/**
|
|
* \brief This function computes the ECDSA signature of a
|
|
* previously-hashed message.
|
|
*
|
|
* \note The deterministic version is usually preferred.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated
|
|
* as defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.3, step 5.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param grp The ECP group.
|
|
* \param r The first output integer.
|
|
* \param s The second output integer.
|
|
* \param d The private signing key.
|
|
* \param buf The message hash.
|
|
* \param blen The length of \p buf.
|
|
* \param f_rng The RNG function.
|
|
* \param p_rng The RNG context.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX
|
|
* or \c MBEDTLS_MPI_XXX error code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
|
|
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
|
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
|
|
|
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
|
/**
|
|
* \brief This function computes the ECDSA signature of a
|
|
* previously-hashed message, deterministic version.
|
|
*
|
|
* For more information, see <em>RFC-6979: Deterministic
|
|
* Usage of the Digital Signature Algorithm (DSA) and Elliptic
|
|
* Curve Digital Signature Algorithm (ECDSA)</em>.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated as
|
|
* defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.3, step 5.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param grp The ECP group.
|
|
* \param r The first output integer.
|
|
* \param s The second output integer.
|
|
* \param d The private signing key.
|
|
* \param buf The message hash.
|
|
* \param blen The length of \p buf.
|
|
* \param md_alg The MD algorithm used to hash the message.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
|
|
* error code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
|
|
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
|
mbedtls_md_type_t md_alg );
|
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
|
|
|
/**
|
|
* \brief This function verifies the ECDSA signature of a
|
|
* previously-hashed message.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated as
|
|
* defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.4, step 3.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param grp The ECP group.
|
|
* \param buf The message hash.
|
|
* \param blen The length of \p buf.
|
|
* \param Q The public key to use for verification.
|
|
* \param r The first integer of the signature.
|
|
* \param s The second integer of the signature.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the signature
|
|
* is invalid.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
|
|
* error code on failure for any other reason.
|
|
*/
|
|
int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
|
|
const unsigned char *buf, size_t blen,
|
|
const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);
|
|
|
|
/**
|
|
* \brief This function computes the ECDSA signature and writes it
|
|
* to a buffer, serialized as defined in <em>RFC-4492:
|
|
* Elliptic Curve Cryptography (ECC) Cipher Suites for
|
|
* Transport Layer Security (TLS)</em>.
|
|
*
|
|
* \warning It is not thread-safe to use the same context in
|
|
* multiple threads.
|
|
*
|
|
* \note The deterministic version is used if
|
|
* #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more
|
|
* information, see <em>RFC-6979: Deterministic Usage
|
|
* of the Digital Signature Algorithm (DSA) and Elliptic
|
|
* Curve Digital Signature Algorithm (ECDSA)</em>.
|
|
*
|
|
* \note The \p sig buffer must be at least twice as large as the
|
|
* size of the curve used, plus 9. For example, 73 Bytes if
|
|
* a 256-bit curve is used. A buffer length of
|
|
* #MBEDTLS_ECDSA_MAX_LEN is always safe.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated as
|
|
* defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.3, step 5.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param ctx The ECDSA context.
|
|
* \param md_alg The message digest that was used to hash the message.
|
|
* \param hash The message hash.
|
|
* \param hlen The length of the hash.
|
|
* \param sig The buffer that holds the signature.
|
|
* \param slen The length of the signature written.
|
|
* \param f_rng The RNG function.
|
|
* \param p_rng The RNG context.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
|
|
* \c MBEDTLS_ERR_ASN1_XXX error code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
|
|
const unsigned char *hash, size_t hlen,
|
|
unsigned char *sig, size_t *slen,
|
|
int (*f_rng)(void *, unsigned char *, size_t),
|
|
void *p_rng );
|
|
|
|
/**
|
|
* \brief This function computes the ECDSA signature and writes it
|
|
* to a buffer, in a restartable way.
|
|
*
|
|
* \see \c mbedtls_ecdsa_write_signature()
|
|
*
|
|
* \note This function is like \c mbedtls_ecdsa_write_signature()
|
|
* but it can return early and restart according to the limit
|
|
* set with \c mbedtls_ecp_set_max_ops() to reduce blocking.
|
|
*
|
|
* \param ctx The ECDSA context.
|
|
* \param md_alg The message digest that was used to hash the message.
|
|
* \param hash The message hash.
|
|
* \param hlen The length of the hash.
|
|
* \param sig The buffer that holds the signature.
|
|
* \param slen The length of the signature written.
|
|
* \param f_rng The RNG function.
|
|
* \param p_rng The RNG context.
|
|
* \param rs_ctx The restart context.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
|
|
* \c MBEDTLS_ERR_ASN1_XXX error code on failure.
|
|
* \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
|
|
* operations was reached: see \c mbedtls_ecp_set_max_ops().
|
|
*/
|
|
int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx,
|
|
mbedtls_md_type_t md_alg,
|
|
const unsigned char *hash, size_t hlen,
|
|
unsigned char *sig, size_t *slen,
|
|
int (*f_rng)(void *, unsigned char *, size_t),
|
|
void *p_rng,
|
|
mbedtls_ecdsa_restart_ctx *rs_ctx );
|
|
|
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
|
#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
|
|
#if defined(MBEDTLS_DEPRECATED_WARNING)
|
|
#define MBEDTLS_DEPRECATED __attribute__((deprecated))
|
|
#else
|
|
#define MBEDTLS_DEPRECATED
|
|
#endif
|
|
/**
|
|
* \brief This function computes an ECDSA signature and writes
|
|
* it to a buffer, serialized as defined in <em>RFC-4492:
|
|
* Elliptic Curve Cryptography (ECC) Cipher Suites for
|
|
* Transport Layer Security (TLS)</em>.
|
|
*
|
|
* The deterministic version is defined in <em>RFC-6979:
|
|
* Deterministic Usage of the Digital Signature Algorithm (DSA)
|
|
* and Elliptic Curve Digital Signature Algorithm (ECDSA)</em>.
|
|
*
|
|
* \warning It is not thread-safe to use the same context in
|
|
* multiple threads.
|
|
*
|
|
* \note The \p sig buffer must be at least twice as large as the
|
|
* size of the curve used, plus 9. For example, 73 Bytes if a
|
|
* 256-bit curve is used. A buffer length of
|
|
* #MBEDTLS_ECDSA_MAX_LEN is always safe.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated as
|
|
* defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.3, step 5.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \deprecated Superseded by mbedtls_ecdsa_write_signature() in
|
|
* Mbed TLS version 2.0 and later.
|
|
*
|
|
* \param ctx The ECDSA context.
|
|
* \param hash The message hash.
|
|
* \param hlen The length of the hash.
|
|
* \param sig The buffer that holds the signature.
|
|
* \param slen The length of the signature written.
|
|
* \param md_alg The MD algorithm used to hash the message.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
|
|
* \c MBEDTLS_ERR_ASN1_XXX error code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
|
|
const unsigned char *hash, size_t hlen,
|
|
unsigned char *sig, size_t *slen,
|
|
mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED;
|
|
#undef MBEDTLS_DEPRECATED
|
|
#endif /* MBEDTLS_DEPRECATED_REMOVED */
|
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
|
|
|
/**
|
|
* \brief This function reads and verifies an ECDSA signature.
|
|
*
|
|
* \note If the bitlength of the message hash is larger than the
|
|
* bitlength of the group order, then the hash is truncated as
|
|
* defined in <em>Standards for Efficient Cryptography Group
|
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
|
* 4.1.4, step 3.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param ctx The ECDSA context.
|
|
* \param hash The message hash.
|
|
* \param hlen The size of the hash.
|
|
* \param sig The signature to read and verify.
|
|
* \param slen The size of \p sig.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid.
|
|
* \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid
|
|
* signature in \p sig, but its length is less than \p siglen.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX
|
|
* error code on failure for any other reason.
|
|
*/
|
|
int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
|
|
const unsigned char *hash, size_t hlen,
|
|
const unsigned char *sig, size_t slen );
|
|
|
|
/**
|
|
* \brief This function reads and verifies an ECDSA signature,
|
|
* in a restartable way.
|
|
*
|
|
* \see \c mbedtls_ecdsa_read_signature()
|
|
*
|
|
* \note This function is like \c mbedtls_ecdsa_read_signature()
|
|
* but it can return early and restart according to the limit
|
|
* set with \c mbedtls_ecp_set_max_ops() to reduce blocking.
|
|
*
|
|
* \param ctx The ECDSA context.
|
|
* \param hash The message hash.
|
|
* \param hlen The size of the hash.
|
|
* \param sig The signature to read and verify.
|
|
* \param slen The size of \p sig.
|
|
* \param rs_ctx The restart context
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid.
|
|
* \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid
|
|
* signature in \p sig, but its length is less than \p siglen.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX
|
|
* error code on failure for any other reason.
|
|
* \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
|
|
* operations was reached: see \c mbedtls_ecp_set_max_ops().
|
|
*/
|
|
int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx,
|
|
const unsigned char *hash, size_t hlen,
|
|
const unsigned char *sig, size_t slen,
|
|
mbedtls_ecdsa_restart_ctx *rs_ctx );
|
|
|
|
/**
|
|
* \brief This function generates an ECDSA keypair on the given curve.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param ctx The ECDSA context to store the keypair in.
|
|
* \param gid The elliptic curve to use. One of the various
|
|
* \c MBEDTLS_ECP_DP_XXX macros depending on configuration.
|
|
* \param f_rng The RNG function.
|
|
* \param p_rng The RNG context.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
|
|
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
|
|
|
|
/**
|
|
* \brief This function sets an ECDSA context from an EC key pair.
|
|
*
|
|
* \see ecp.h
|
|
*
|
|
* \param ctx The ECDSA context to set.
|
|
* \param key The EC key to use.
|
|
*
|
|
* \return \c 0 on success.
|
|
* \return An \c MBEDTLS_ERR_ECP_XXX code on failure.
|
|
*/
|
|
int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );
|
|
|
|
/**
|
|
* \brief This function initializes an ECDSA context.
|
|
*
|
|
* \param ctx The ECDSA context to initialize.
|
|
*/
|
|
void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );
|
|
|
|
/**
|
|
* \brief This function frees an ECDSA context.
|
|
*
|
|
* \param ctx The ECDSA context to free.
|
|
*/
|
|
void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );
|
|
|
|
#if defined(MBEDTLS_ECP_RESTARTABLE)
|
|
/**
|
|
* \brief Initialize a restart context
|
|
*/
|
|
void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx );
|
|
|
|
/**
|
|
* \brief Free the components of a restart context
|
|
*/
|
|
void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx );
|
|
#endif /* MBEDTLS_ECP_RESTARTABLE */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ecdsa.h */
|