mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-25 17:25:37 +01:00
Merge pull request #328 from ARMmbed/iotssl-461-ecjpake-finalization
Iotssl 461 ecjpake finalization
This commit is contained in:
commit
e357a64355
@ -1,5 +1,13 @@
|
|||||||
mbed TLS ChangeLog (Sorted per branch, date)
|
mbed TLS ChangeLog (Sorted per branch, date)
|
||||||
|
|
||||||
|
= mbed TLS 2.2.0 released 2015-10-xx
|
||||||
|
|
||||||
|
Features
|
||||||
|
* Experimental support for EC J-PAKE as defined in Thread 1.0.0.
|
||||||
|
Disabled by default as the specification might still change.
|
||||||
|
* Added a key extraction callback to accees the master secret and key
|
||||||
|
block. (Potential uses include EAP-TLS and Thread.)
|
||||||
|
|
||||||
= mbed TLS 2.1.2 released 2015-10-06
|
= mbed TLS 2.1.2 released 2015-10-06
|
||||||
|
|
||||||
Security
|
Security
|
||||||
|
94
configs/config-thread.h
Normal file
94
configs/config-thread.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Minimal configuration for using TLS as part of Thread
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2015, ARM Limited, 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)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Minimal configuration for using TLS a part of Thread
|
||||||
|
* http://threadgroup.org/
|
||||||
|
*
|
||||||
|
* Distinguishing features:
|
||||||
|
* - no RSA or classic DH, fully based on ECC
|
||||||
|
* - no X.509
|
||||||
|
* - support for experimental EC J-PAKE key exchange
|
||||||
|
*
|
||||||
|
* See README.txt for usage instructions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MBEDTLS_CONFIG_H
|
||||||
|
#define MBEDTLS_CONFIG_H
|
||||||
|
|
||||||
|
/* System support */
|
||||||
|
#define MBEDTLS_HAVE_ASM
|
||||||
|
|
||||||
|
/* mbed TLS feature support */
|
||||||
|
#define MBEDTLS_AES_ROM_TABLES
|
||||||
|
#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
|
||||||
|
#define MBEDTLS_ECP_NIST_OPTIM
|
||||||
|
#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
|
||||||
|
#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
|
||||||
|
#define MBEDTLS_SSL_PROTO_TLS1_2
|
||||||
|
#define MBEDTLS_SSL_PROTO_DTLS
|
||||||
|
#define MBEDTLS_SSL_DTLS_ANTI_REPLAY
|
||||||
|
#define MBEDTLS_SSL_DTLS_HELLO_VERIFY
|
||||||
|
#define MBEDTLS_SSL_EXPORT_KEYS
|
||||||
|
|
||||||
|
/* mbed TLS modules */
|
||||||
|
#define MBEDTLS_AES_C
|
||||||
|
#define MBEDTLS_ASN1_PARSE_C
|
||||||
|
#define MBEDTLS_ASN1_WRITE_C
|
||||||
|
#define MBEDTLS_BIGNUM_C
|
||||||
|
#define MBEDTLS_CCM_C
|
||||||
|
#define MBEDTLS_CIPHER_C
|
||||||
|
#define MBEDTLS_CTR_DRBG_C
|
||||||
|
#define MBEDTLS_ECJPAKE_C
|
||||||
|
#define MBEDTLS_ECP_C
|
||||||
|
#define MBEDTLS_ENTROPY_C
|
||||||
|
#define MBEDTLS_HMAC_DRBG_C
|
||||||
|
#define MBEDTLS_MD_C
|
||||||
|
#define MBEDTLS_OID_C
|
||||||
|
#define MBEDTLS_PK_C
|
||||||
|
#define MBEDTLS_PK_PARSE_C
|
||||||
|
#define MBEDTLS_SHA256_C
|
||||||
|
#define MBEDTLS_SSL_COOKIE_C
|
||||||
|
#define MBEDTLS_SSL_CLI_C
|
||||||
|
#define MBEDTLS_SSL_SRV_C
|
||||||
|
#define MBEDTLS_SSL_TLS_C
|
||||||
|
|
||||||
|
/* For tests using ssl-opt.sh */
|
||||||
|
#define MBEDTLS_NET_C
|
||||||
|
#define MBEDTLS_TIMING_C
|
||||||
|
|
||||||
|
/* Save RAM at the expense of ROM */
|
||||||
|
#define MBEDTLS_AES_ROM_TABLES
|
||||||
|
|
||||||
|
/* Save RAM by adjusting to our exact needs */
|
||||||
|
#define MBEDTLS_ECP_MAX_BITS 256
|
||||||
|
#define MBEDTLS_MPI_MAX_SIZE 32 // 256 bits is 32 bytes
|
||||||
|
|
||||||
|
/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */
|
||||||
|
#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
|
||||||
|
|
||||||
|
#if defined(TARGET_LIKE_MBED)
|
||||||
|
#include "mbedtls/target_config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mbedtls/check_config.h"
|
||||||
|
|
||||||
|
#endif /* MBEDTLS_CONFIG_H */
|
@ -88,6 +88,11 @@
|
|||||||
#error "MBEDTLS_ECDSA_C defined, but not all prerequisites"
|
#error "MBEDTLS_ECDSA_C defined, but not all prerequisites"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_ECJPAKE_C) && \
|
||||||
|
( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) )
|
||||||
|
#error "MBEDTLS_ECJPAKE_C defined, but not all prerequisites"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C)
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C)
|
||||||
#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites"
|
#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites"
|
||||||
#endif
|
#endif
|
||||||
@ -187,6 +192,12 @@
|
|||||||
#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites"
|
#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
|
||||||
|
( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) || \
|
||||||
|
!defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) )
|
||||||
|
#error "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \
|
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \
|
||||||
( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) )
|
( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) )
|
||||||
#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites"
|
#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites"
|
||||||
|
@ -694,6 +694,25 @@
|
|||||||
*/
|
*/
|
||||||
#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
|
#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
|
||||||
|
*
|
||||||
|
* Enable the ECJPAKE based ciphersuite modes in SSL / TLS.
|
||||||
|
*
|
||||||
|
* \warning This is currently experimental. EC J-PAKE support is based on the
|
||||||
|
* Thread v1.0.0 specification; incompatible changes to the specification
|
||||||
|
* might still happen. For this reason, this is disabled by default.
|
||||||
|
*
|
||||||
|
* Requires: MBEDTLS_ECJPAKE_C
|
||||||
|
* MBEDTLS_SHA256_C
|
||||||
|
* MBEDTLS_ECP_DP_SECP256R1_ENABLED
|
||||||
|
*
|
||||||
|
* This enables the following ciphersuites (if other requisites are
|
||||||
|
* enabled as well):
|
||||||
|
* MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
|
||||||
|
*/
|
||||||
|
//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def MBEDTLS_PK_PARSE_EC_EXTENDED
|
* \def MBEDTLS_PK_PARSE_EC_EXTENDED
|
||||||
*
|
*
|
||||||
@ -1175,6 +1194,16 @@
|
|||||||
*/
|
*/
|
||||||
#define MBEDTLS_SSL_SESSION_TICKETS
|
#define MBEDTLS_SSL_SESSION_TICKETS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def MBEDTLS_SSL_EXPORT_KEYS
|
||||||
|
*
|
||||||
|
* Enable support for exporting key block and master secret.
|
||||||
|
* This is required for certain users of TLS, e.g. EAP-TLS.
|
||||||
|
*
|
||||||
|
* Comment this macro to disable support for key export
|
||||||
|
*/
|
||||||
|
#define MBEDTLS_SSL_EXPORT_KEYS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def MBEDTLS_SSL_SERVER_NAME_INDICATION
|
* \def MBEDTLS_SSL_SERVER_NAME_INDICATION
|
||||||
*
|
*
|
||||||
@ -1688,6 +1717,25 @@
|
|||||||
*/
|
*/
|
||||||
#define MBEDTLS_ECDSA_C
|
#define MBEDTLS_ECDSA_C
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def MBEDTLS_ECJPAKE_C
|
||||||
|
*
|
||||||
|
* Enable the elliptic curve J-PAKE library.
|
||||||
|
*
|
||||||
|
* \warning This is currently experimental. EC J-PAKE support is based on the
|
||||||
|
* Thread v1.0.0 specification; incompatible changes to the specification
|
||||||
|
* might still happen. For this reason, this is disabled by default.
|
||||||
|
*
|
||||||
|
* Module: library/ecjpake.c
|
||||||
|
* Caller:
|
||||||
|
*
|
||||||
|
* This module is used by the following key exchanges:
|
||||||
|
* ECJPAKE
|
||||||
|
*
|
||||||
|
* Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C
|
||||||
|
*/
|
||||||
|
//#define MBEDTLS_ECJPAKE_C
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def MBEDTLS_ECP_C
|
* \def MBEDTLS_ECP_C
|
||||||
*
|
*
|
||||||
@ -1696,6 +1744,7 @@
|
|||||||
* Module: library/ecp.c
|
* Module: library/ecp.c
|
||||||
* Caller: library/ecdh.c
|
* Caller: library/ecdh.c
|
||||||
* library/ecdsa.c
|
* library/ecdsa.c
|
||||||
|
* library/ecjpake.c
|
||||||
*
|
*
|
||||||
* Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED
|
* Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED
|
||||||
*/
|
*/
|
||||||
|
238
include/mbedtls/ecjpake.h
Normal file
238
include/mbedtls/ecjpake.h
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/**
|
||||||
|
* \file ecjpake.h
|
||||||
|
*
|
||||||
|
* \brief Elliptic curve J-PAKE
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2015, ARM Limited, 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_ECJPAKE_H
|
||||||
|
#define MBEDTLS_ECJPAKE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* J-PAKE is a password-authenticated key exchange that allows deriving a
|
||||||
|
* strong shared secret from a (potentially low entropy) pre-shared
|
||||||
|
* passphrase, with forward secrecy and mutual authentication.
|
||||||
|
* https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling
|
||||||
|
*
|
||||||
|
* This file implements the Elliptic Curve variant of J-PAKE,
|
||||||
|
* as defined in Chapter 7.4 of the Thread v1.0 Specification,
|
||||||
|
* available to members of the Thread Group http://threadgroup.org/
|
||||||
|
*
|
||||||
|
* As the J-PAKE algorithm is inherently symmetric, so is our API.
|
||||||
|
* Each party needs to send its first round message, in any order, to the
|
||||||
|
* other party, then each sends its second round message, in any order.
|
||||||
|
* The payloads are serialized in a way suitable for use in TLS, but could
|
||||||
|
* also be use outside TLS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ecp.h"
|
||||||
|
#include "md.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Roles in the EC J-PAKE exchange
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MBEDTLS_ECJPAKE_CLIENT = 0, /**< Client */
|
||||||
|
MBEDTLS_ECJPAKE_SERVER, /**< Server */
|
||||||
|
} mbedtls_ecjpake_role;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EC J-PAKE context structure.
|
||||||
|
*
|
||||||
|
* J-PAKE is a symmetric protocol, except for the identifiers used in
|
||||||
|
* Zero-Knowledge Proofs, and the serialization of the second message
|
||||||
|
* (KeyExchange) as defined by the Thread spec.
|
||||||
|
*
|
||||||
|
* In order to benefit from this symmetry, we choose a different naming
|
||||||
|
* convetion from the Thread v1.0 spec. Correspondance is indicated in the
|
||||||
|
* description as a pair C: <client name>, S: <server name>
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const mbedtls_md_info_t *md_info; /**< Hash to use */
|
||||||
|
mbedtls_ecp_group grp; /**< Elliptic curve */
|
||||||
|
mbedtls_ecjpake_role role; /**< Are we client or server? */
|
||||||
|
int point_format; /**< Format for point export */
|
||||||
|
|
||||||
|
mbedtls_ecp_point Xm1; /**< My public key 1 C: X1, S: X3 */
|
||||||
|
mbedtls_ecp_point Xm2; /**< My public key 2 C: X2, S: X4 */
|
||||||
|
mbedtls_ecp_point Xp1; /**< Peer public key 1 C: X3, S: X1 */
|
||||||
|
mbedtls_ecp_point Xp2; /**< Peer public key 2 C: X4, S: X2 */
|
||||||
|
mbedtls_ecp_point Xp; /**< Peer public key C: Xs, S: Xc */
|
||||||
|
|
||||||
|
mbedtls_mpi xm1; /**< My private key 1 C: x1, S: x3 */
|
||||||
|
mbedtls_mpi xm2; /**< My private key 2 C: x2, S: x4 */
|
||||||
|
|
||||||
|
mbedtls_mpi s; /**< Pre-shared secret (passphrase) */
|
||||||
|
} mbedtls_ecjpake_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize a context
|
||||||
|
* (just makes it ready for setup() or free()).
|
||||||
|
*
|
||||||
|
* \param ctx context to initialize
|
||||||
|
*/
|
||||||
|
void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set up a context for use
|
||||||
|
*
|
||||||
|
* \note Currently the only values for hash/curve allowed by the
|
||||||
|
* standard are MBEDTLS_MD_SHA256/MBEDTLS_ECP_DP_SECP256R1.
|
||||||
|
*
|
||||||
|
* \param ctx context to set up
|
||||||
|
* \param role Our role: client or server
|
||||||
|
* \param hash hash function to use (MBEDTLS_MD_XXX)
|
||||||
|
* \param curve elliptic curve identifier (MBEDTLS_ECP_DP_XXX)
|
||||||
|
* \param secret pre-shared secret (passphrase)
|
||||||
|
* \param len length of the shared secret
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx,
|
||||||
|
mbedtls_ecjpake_role role,
|
||||||
|
mbedtls_md_type_t hash,
|
||||||
|
mbedtls_ecp_group_id curve,
|
||||||
|
const unsigned char *secret,
|
||||||
|
size_t len );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \brief Check if a context is ready for use
|
||||||
|
*
|
||||||
|
* \param ctx Context to check
|
||||||
|
*
|
||||||
|
* \return 0 if the context is ready for use,
|
||||||
|
* MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Generate and write the first round message
|
||||||
|
* (TLS: contents of the Client/ServerHello extension,
|
||||||
|
* excluding extension type and length bytes)
|
||||||
|
*
|
||||||
|
* \param ctx Context to use
|
||||||
|
* \param buf Buffer to write the contents to
|
||||||
|
* \param len Buffer size
|
||||||
|
* \param olen Will be updated with the number of bytes written
|
||||||
|
* \param f_rng RNG function
|
||||||
|
* \param p_rng RNG parameter
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx,
|
||||||
|
unsigned char *buf, size_t len, size_t *olen,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read and process the first round message
|
||||||
|
* (TLS: contents of the Client/ServerHello extension,
|
||||||
|
* excluding extension type and length bytes)
|
||||||
|
*
|
||||||
|
* \param ctx Context to use
|
||||||
|
* \param buf Pointer to extension contents
|
||||||
|
* \param len Extension length
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx,
|
||||||
|
const unsigned char *buf,
|
||||||
|
size_t len );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Generate and write the second round message
|
||||||
|
* (TLS: contents of the Client/ServerKeyExchange)
|
||||||
|
*
|
||||||
|
* \param ctx Context to use
|
||||||
|
* \param buf Buffer to write the contents to
|
||||||
|
* \param len Buffer size
|
||||||
|
* \param olen Will be updated with the number of bytes written
|
||||||
|
* \param f_rng RNG function
|
||||||
|
* \param p_rng RNG parameter
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,
|
||||||
|
unsigned char *buf, size_t len, size_t *olen,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read and process the second round message
|
||||||
|
* (TLS: contents of the Client/ServerKeyExchange)
|
||||||
|
*
|
||||||
|
* \param ctx Context to use
|
||||||
|
* \param buf Pointer to the message
|
||||||
|
* \param len Message length
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,
|
||||||
|
const unsigned char *buf,
|
||||||
|
size_t len );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Derive the shared secret
|
||||||
|
* (TLS: Pre-Master Secret)
|
||||||
|
*
|
||||||
|
* \param ctx Context to use
|
||||||
|
* \param buf Buffer to write the contents to
|
||||||
|
* \param len Buffer size
|
||||||
|
* \param olen Will be updated with the number of bytes written
|
||||||
|
* \param f_rng RNG function
|
||||||
|
* \param p_rng RNG parameter
|
||||||
|
*
|
||||||
|
* \return 0 if successfull,
|
||||||
|
* a negative error code otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,
|
||||||
|
unsigned char *buf, size_t len, size_t *olen,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Free a context's content
|
||||||
|
*
|
||||||
|
* \param ctx context to free
|
||||||
|
*/
|
||||||
|
void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx );
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SELF_TEST)
|
||||||
|
/**
|
||||||
|
* \brief Checkup routine
|
||||||
|
*
|
||||||
|
* \return 0 if successful, or 1 if a test failed
|
||||||
|
*/
|
||||||
|
int mbedtls_ecjpake_self_test( int verbose );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ecjpake.h */
|
@ -346,6 +346,21 @@ int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
|
|||||||
*/
|
*/
|
||||||
int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
|
int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Compare two points
|
||||||
|
*
|
||||||
|
* \note This assumes the points are normalized. Otherwise,
|
||||||
|
* they may compare as "not equal" even if they are.
|
||||||
|
*
|
||||||
|
* \param P First point to compare
|
||||||
|
* \param Q Second point to compare
|
||||||
|
*
|
||||||
|
* \return 0 if the points are equal,
|
||||||
|
* MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise
|
||||||
|
*/
|
||||||
|
int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
|
||||||
|
const mbedtls_ecp_point *Q );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Import a non-zero point from two ASCII strings
|
* \brief Import a non-zero point from two ASCII strings
|
||||||
*
|
*
|
||||||
@ -569,6 +584,29 @@ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_po
|
|||||||
*/
|
*/
|
||||||
int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
|
int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Generate a keypair with configurable base point
|
||||||
|
*
|
||||||
|
* \param grp ECP group
|
||||||
|
* \param G Chosen base point
|
||||||
|
* \param d Destination MPI (secret part)
|
||||||
|
* \param Q Destination point (public part)
|
||||||
|
* \param f_rng RNG function
|
||||||
|
* \param p_rng RNG parameter
|
||||||
|
*
|
||||||
|
* \return 0 if successful,
|
||||||
|
* or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
|
||||||
|
*
|
||||||
|
* \note Uses bare components rather than an mbedtls_ecp_keypair structure
|
||||||
|
* in order to ease use with other structures such as
|
||||||
|
* mbedtls_ecdh_context of mbedtls_ecdsa_context.
|
||||||
|
*/
|
||||||
|
int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
|
||||||
|
const mbedtls_ecp_point *G,
|
||||||
|
mbedtls_mpi *d, mbedtls_ecp_point *Q,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Generate a keypair
|
* \brief Generate a keypair
|
||||||
*
|
*
|
||||||
|
@ -352,6 +352,8 @@
|
|||||||
|
|
||||||
#define MBEDTLS_TLS_EXT_SESSION_TICKET 35
|
#define MBEDTLS_TLS_EXT_SESSION_TICKET 35
|
||||||
|
|
||||||
|
#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */
|
||||||
|
|
||||||
#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01
|
#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -390,6 +392,9 @@ union mbedtls_ssl_premaster_secret
|
|||||||
unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES
|
unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES
|
||||||
+ MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */
|
+ MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret )
|
#define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret )
|
||||||
@ -542,6 +547,13 @@ struct mbedtls_ssl_config
|
|||||||
void *p_ticket; /*!< context for the ticket callbacks */
|
void *p_ticket; /*!< context for the ticket callbacks */
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
/** Callback to export key block and master secret */
|
||||||
|
int (*f_export_keys)( void *, const unsigned char *,
|
||||||
|
const unsigned char *, size_t, size_t, size_t );
|
||||||
|
void *p_export_keys; /*!< context for key export callback */
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||||
const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */
|
const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */
|
||||||
mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */
|
mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */
|
||||||
@ -1069,6 +1081,35 @@ typedef int mbedtls_ssl_ticket_write_t( void *p_ticket,
|
|||||||
size_t *tlen,
|
size_t *tlen,
|
||||||
uint32_t *lifetime );
|
uint32_t *lifetime );
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
/**
|
||||||
|
* \brief Callback type: Export key block and master secret
|
||||||
|
*
|
||||||
|
* \note This is required for certain uses of TLS, e.g. EAP-TLS
|
||||||
|
* (RFC 5216) and Thread. The key pointers are ephemeral and
|
||||||
|
* therefore must not be stored. The master secret and keys
|
||||||
|
* should not be used directly except as an input to a key
|
||||||
|
* derivation function.
|
||||||
|
*
|
||||||
|
* \param p_expkey Context for the callback
|
||||||
|
* \param ms Pointer to master secret (fixed length: 48 bytes)
|
||||||
|
* \param kb Pointer to key block, see RFC 5246 section 6.3
|
||||||
|
* (variable length: 2 * maclen + 2 * keylen + 2 * ivlen).
|
||||||
|
* \param maclen MAC length
|
||||||
|
* \param keylen Key length
|
||||||
|
* \param ivlen IV length
|
||||||
|
*
|
||||||
|
* \return 0 if successful, or
|
||||||
|
* a specific MBEDTLS_ERR_XXX code.
|
||||||
|
*/
|
||||||
|
typedef int mbedtls_ssl_export_keys_t( void *p_expkey,
|
||||||
|
const unsigned char *ms,
|
||||||
|
const unsigned char *kb,
|
||||||
|
size_t maclen,
|
||||||
|
size_t keylen,
|
||||||
|
size_t ivlen );
|
||||||
|
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Callback type: parse and load session ticket
|
* \brief Callback type: parse and load session ticket
|
||||||
*
|
*
|
||||||
@ -1118,6 +1159,22 @@ void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
|
|||||||
void *p_ticket );
|
void *p_ticket );
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
/**
|
||||||
|
* \brief Configure key export callback.
|
||||||
|
* (Default: none.)
|
||||||
|
*
|
||||||
|
* \note See \c mbedtls_ssl_export_keys_t.
|
||||||
|
*
|
||||||
|
* \param conf SSL configuration context
|
||||||
|
* \param f_export_keys Callback for exporting keys
|
||||||
|
* \param p_export_keys Context for the callback
|
||||||
|
*/
|
||||||
|
void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
|
||||||
|
mbedtls_ssl_export_keys_t *f_export_keys,
|
||||||
|
void *p_export_keys );
|
||||||
|
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Callback type: generate a cookie
|
* \brief Callback type: generate a cookie
|
||||||
*
|
*
|
||||||
@ -1679,6 +1736,29 @@ void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
|
|||||||
void *p_sni );
|
void *p_sni );
|
||||||
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
/**
|
||||||
|
* \brief Set the EC J-PAKE password for current handshake.
|
||||||
|
*
|
||||||
|
* \note An internal copy is made, and destroyed as soon as the
|
||||||
|
* handshake is completed, or when the SSL context is reset or
|
||||||
|
* freed.
|
||||||
|
*
|
||||||
|
* \note The SSL context needs to be already set up. The right place
|
||||||
|
* to call this function is between \c mbedtls_ssl_setup() or
|
||||||
|
* \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake().
|
||||||
|
*
|
||||||
|
* \param ssl SSL context
|
||||||
|
* \param pw EC J-PAKE password (pre-shared secret)
|
||||||
|
* \param pw_len length of pw in bytes
|
||||||
|
*
|
||||||
|
* \return 0 on success, or a negative error code.
|
||||||
|
*/
|
||||||
|
int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
|
||||||
|
const unsigned char *pw,
|
||||||
|
size_t pw_len );
|
||||||
|
#endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN)
|
#if defined(MBEDTLS_SSL_ALPN)
|
||||||
/**
|
/**
|
||||||
* \brief Set the supported Application Layer Protocols.
|
* \brief Set the supported Application Layer Protocols.
|
||||||
|
@ -229,6 +229,8 @@ extern "C" {
|
|||||||
#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */
|
#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */
|
||||||
#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */
|
#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */
|
||||||
|
|
||||||
|
#define MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 0xC0FF /**< experimental */
|
||||||
|
|
||||||
/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange.
|
/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange.
|
||||||
* Reminder: update MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED below.
|
* Reminder: update MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED below.
|
||||||
*/
|
*/
|
||||||
@ -244,6 +246,7 @@ typedef enum {
|
|||||||
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
|
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
|
||||||
MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
|
MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
|
||||||
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
|
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE,
|
||||||
} mbedtls_key_exchange_type_t;
|
} mbedtls_key_exchange_type_t;
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
|
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
|
||||||
|
@ -41,6 +41,10 @@
|
|||||||
#include "sha512.h"
|
#include "sha512.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
#include "ecjpake.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
|
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
|
||||||
!defined(inline) && !defined(__cplusplus)
|
!defined(inline) && !defined(__cplusplus)
|
||||||
#define inline __inline
|
#define inline __inline
|
||||||
@ -147,6 +151,7 @@
|
|||||||
* of state of the renegotiation flag, so no indicator is required)
|
* of state of the renegotiation flag, so no indicator is required)
|
||||||
*/
|
*/
|
||||||
#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0)
|
#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0)
|
||||||
|
#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK (1 << 1)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -169,7 +174,15 @@ struct mbedtls_ssl_handshake_params
|
|||||||
#if defined(MBEDTLS_ECDH_C)
|
#if defined(MBEDTLS_ECDH_C)
|
||||||
mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */
|
mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */
|
||||||
#endif
|
#endif
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
mbedtls_ecjpake_context ecjpake_ctx; /*!< EC J-PAKE key exchange */
|
||||||
|
#if defined(MBEDTLS_SSL_CLI_C)
|
||||||
|
unsigned char *ecjpake_cache; /*!< Cache for ClientHello ext */
|
||||||
|
size_t ecjpake_cache_len; /*!< Length of cached data */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */
|
const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */
|
||||||
#endif
|
#endif
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
||||||
|
@ -20,6 +20,7 @@ set(src_crypto
|
|||||||
dhm.c
|
dhm.c
|
||||||
ecdh.c
|
ecdh.c
|
||||||
ecdsa.c
|
ecdsa.c
|
||||||
|
ecjpake.c
|
||||||
ecp.c
|
ecp.c
|
||||||
ecp_curves.c
|
ecp_curves.c
|
||||||
entropy.c
|
entropy.c
|
||||||
|
@ -49,7 +49,8 @@ OBJS_CRYPTO= aes.o aesni.o arc4.o \
|
|||||||
bignum.o blowfish.o camellia.o \
|
bignum.o blowfish.o camellia.o \
|
||||||
ccm.o cipher.o cipher_wrap.o \
|
ccm.o cipher.o cipher_wrap.o \
|
||||||
ctr_drbg.o des.o dhm.o \
|
ctr_drbg.o des.o dhm.o \
|
||||||
ecdh.o ecdsa.o ecp.o \
|
ecdh.o ecdsa.o ecjpake.o \
|
||||||
|
ecp.o \
|
||||||
ecp_curves.o entropy.o entropy_poll.o \
|
ecp_curves.o entropy.o entropy_poll.o \
|
||||||
error.o gcm.o havege.o \
|
error.o gcm.o havege.o \
|
||||||
hmac_drbg.o md.o md2.o \
|
hmac_drbg.o md.o md2.o \
|
||||||
|
1103
library/ecjpake.c
Normal file
1103
library/ecjpake.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -403,6 +403,22 @@ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt )
|
|||||||
return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 );
|
return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare two points lazyly
|
||||||
|
*/
|
||||||
|
int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
|
||||||
|
const mbedtls_ecp_point *Q )
|
||||||
|
{
|
||||||
|
if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 &&
|
||||||
|
mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 &&
|
||||||
|
mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Import a non-zero point from ASCII strings
|
* Import a non-zero point from ASCII strings
|
||||||
*/
|
*/
|
||||||
@ -1667,8 +1683,39 @@ cleanup:
|
|||||||
}
|
}
|
||||||
#endif /* ECP_SHORTWEIERSTRASS */
|
#endif /* ECP_SHORTWEIERSTRASS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* R = m * P with shortcuts for m == 1 and m == -1
|
||||||
|
* NOT constant-time - ONLY for short Weierstrass!
|
||||||
|
*/
|
||||||
|
static int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp,
|
||||||
|
mbedtls_ecp_point *R,
|
||||||
|
const mbedtls_mpi *m,
|
||||||
|
const mbedtls_ecp_point *P )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if( mbedtls_mpi_cmp_int( m, 1 ) == 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );
|
||||||
|
}
|
||||||
|
else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );
|
||||||
|
if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 )
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, R, m, P, NULL, NULL ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Linear combination
|
* Linear combination
|
||||||
|
* NOT constant-time
|
||||||
*/
|
*/
|
||||||
int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
||||||
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
|
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
|
||||||
@ -1682,8 +1729,9 @@ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
|
|
||||||
mbedtls_ecp_point_init( &mP );
|
mbedtls_ecp_point_init( &mP );
|
||||||
|
|
||||||
MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, &mP, m, P, NULL, NULL ) );
|
MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, &mP, m, P ) );
|
||||||
MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, R, n, Q, NULL, NULL ) );
|
MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, R, n, Q ) );
|
||||||
|
|
||||||
MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, &mP, R ) );
|
MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, &mP, R ) );
|
||||||
MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );
|
MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );
|
||||||
|
|
||||||
@ -1762,9 +1810,11 @@ int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate a keypair
|
* Generate a keypair with configurable base point
|
||||||
*/
|
*/
|
||||||
int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
|
int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
|
||||||
|
const mbedtls_ecp_point *G,
|
||||||
|
mbedtls_mpi *d, mbedtls_ecp_point *Q,
|
||||||
int (*f_rng)(void *, unsigned char *, size_t),
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
void *p_rng )
|
void *p_rng )
|
||||||
{
|
{
|
||||||
@ -1836,7 +1886,18 @@ cleanup:
|
|||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
|
|
||||||
return( mbedtls_ecp_mul( grp, Q, d, &grp->G, f_rng, p_rng ) );
|
return( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate key pair, wrapper for conventional base point
|
||||||
|
*/
|
||||||
|
int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp,
|
||||||
|
mbedtls_mpi *d, mbedtls_ecp_point *Q,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng )
|
||||||
|
{
|
||||||
|
return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1181,6 +1181,7 @@ int mbedtls_pk_parse_key( mbedtls_pk_context *pk,
|
|||||||
return( ret );
|
return( ret );
|
||||||
#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */
|
#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */
|
||||||
#else
|
#else
|
||||||
|
((void) ret);
|
||||||
((void) pwd);
|
((void) pwd);
|
||||||
((void) pwdlen);
|
((void) pwdlen);
|
||||||
#endif /* MBEDTLS_PEM_PARSE_C */
|
#endif /* MBEDTLS_PEM_PARSE_C */
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
*
|
*
|
||||||
* Current rule (except rc4, weak and null which come last):
|
* Current rule (except rc4, weak and null which come last):
|
||||||
* 1. By key exchange:
|
* 1. By key exchange:
|
||||||
* Forward-secure non-PSK > forward-secure PSK > other non-PSK > other PSK
|
* Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK
|
||||||
* 2. By key length and cipher:
|
* 2. By key length and cipher:
|
||||||
* AES-256 > Camellia-256 > AES-128 > Camellia-128 > 3DES
|
* AES-256 > Camellia-256 > AES-128 > Camellia-128 > 3DES
|
||||||
* 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8
|
* 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8
|
||||||
@ -131,6 +131,9 @@ static const int ciphersuite_preference[] =
|
|||||||
MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
|
MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
|
||||||
MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
|
MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
|
||||||
|
|
||||||
|
/* The ECJPAKE suite */
|
||||||
|
MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8,
|
||||||
|
|
||||||
/* All AES-256 suites */
|
/* All AES-256 suites */
|
||||||
MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384,
|
MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
MBEDTLS_TLS_RSA_WITH_AES_256_CCM,
|
MBEDTLS_TLS_RSA_WITH_AES_256_CCM,
|
||||||
@ -1510,6 +1513,18 @@ static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] =
|
|||||||
#endif /* MBEDTLS_ARC4_C */
|
#endif /* MBEDTLS_ARC4_C */
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
#if defined(MBEDTLS_AES_C)
|
||||||
|
#if defined(MBEDTLS_CCM_C)
|
||||||
|
{ MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, "TLS-ECJPAKE-WITH-AES-128-CCM-8",
|
||||||
|
MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE,
|
||||||
|
MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
|
||||||
|
MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
|
||||||
|
MBEDTLS_CIPHERSUITE_SHORT_TAG },
|
||||||
|
#endif /* MBEDTLS_CCM_C */
|
||||||
|
#endif /* MBEDTLS_AES_C */
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)
|
#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)
|
||||||
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
|
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
|
||||||
|
@ -241,7 +241,8 @@ static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
|
|||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
||||||
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
|
static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
|
||||||
unsigned char *buf,
|
unsigned char *buf,
|
||||||
size_t *olen )
|
size_t *olen )
|
||||||
@ -336,7 +337,86 @@ static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
|||||||
|
|
||||||
*olen = 6;
|
*olen = 6;
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
|
||||||
|
unsigned char *buf,
|
||||||
|
size_t *olen )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned char *p = buf;
|
||||||
|
const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
|
||||||
|
size_t kkpp_len;
|
||||||
|
|
||||||
|
*olen = 0;
|
||||||
|
|
||||||
|
/* Skip costly extension if we can't use EC J-PAKE anyway */
|
||||||
|
if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
|
||||||
|
|
||||||
|
if( end - p < 4 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
|
||||||
|
*p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We may need to send ClientHello multiple times for Hello verification.
|
||||||
|
* We don't want to compute fresh values every time (both for performance
|
||||||
|
* and consistency reasons), so cache the extension content.
|
||||||
|
*/
|
||||||
|
if( ssl->handshake->ecjpake_cache == NULL ||
|
||||||
|
ssl->handshake->ecjpake_cache_len == 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
|
||||||
|
p + 2, end - p - 2, &kkpp_len,
|
||||||
|
ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
|
||||||
|
if( ssl->handshake->ecjpake_cache == NULL )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
|
||||||
|
ssl->handshake->ecjpake_cache_len = kkpp_len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
|
||||||
|
|
||||||
|
kkpp_len = ssl->handshake->ecjpake_cache_len;
|
||||||
|
|
||||||
|
if( (size_t)( end - p - 2 ) < kkpp_len )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
|
||||||
|
*p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
|
||||||
|
|
||||||
|
*olen = kkpp_len + 4;
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
||||||
@ -790,8 +870,14 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
|
|||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
ciphersuites[i] ) );
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
|
||||||
|
mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
|
||||||
|
ciphersuites[i] ) );
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
*p++ = (unsigned char)( ciphersuites[i] >> 8 );
|
*p++ = (unsigned char)( ciphersuites[i] >> 8 );
|
||||||
@ -881,7 +967,8 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
|
|||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
|
ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
|
|
||||||
@ -889,6 +976,11 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
|
|||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
|
ext_len += olen;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
|
ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
@ -1096,7 +1188,8 @@ static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
|
|||||||
}
|
}
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
||||||
const unsigned char *buf,
|
const unsigned char *buf,
|
||||||
size_t len )
|
size_t len )
|
||||||
@ -1117,7 +1210,12 @@ static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
|||||||
if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
|
if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
|
||||||
p[0] == MBEDTLS_ECP_PF_COMPRESSED )
|
p[0] == MBEDTLS_ECP_PF_COMPRESSED )
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
||||||
ssl->handshake->ecdh_ctx.point_format = p[0];
|
ssl->handshake->ecdh_ctx.point_format = p[0];
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
ssl->handshake->ecjpake_ctx.point_format = p[0];
|
||||||
|
#endif
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
|
MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
@ -1129,7 +1227,38 @@ static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
|||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
|
||||||
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
|
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
|
||||||
|
const unsigned char *buf,
|
||||||
|
size_t len )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we got here, we no longer need our cached extension */
|
||||||
|
mbedtls_free( ssl->handshake->ecjpake_cache );
|
||||||
|
ssl->handshake->ecjpake_cache = NULL;
|
||||||
|
ssl->handshake->ecjpake_cache_len = 0;
|
||||||
|
|
||||||
|
if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
|
||||||
|
buf, len ) ) != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN)
|
#if defined(MBEDTLS_SSL_ALPN)
|
||||||
static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
|
static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
|
||||||
@ -1479,7 +1608,7 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
|||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
|
||||||
ssl->handshake->resume ? "a" : "no" ) );
|
ssl->handshake->resume ? "a" : "no" ) );
|
||||||
|
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
|
||||||
|
|
||||||
suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
|
suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
|
||||||
@ -1494,6 +1623,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
|||||||
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
|
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
@ -1617,7 +1748,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
|||||||
break;
|
break;
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
|
case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
|
||||||
|
|
||||||
@ -1628,7 +1760,21 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
|
||||||
|
|
||||||
|
if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
|
||||||
|
ext + 4, ext_size ) ) != 0 )
|
||||||
|
{
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN)
|
#if defined(MBEDTLS_SSL_ALPN)
|
||||||
case MBEDTLS_TLS_EXT_ALPN:
|
case MBEDTLS_TLS_EXT_ALPN:
|
||||||
@ -2147,6 +2293,19 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
|
|||||||
#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
|
||||||
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
|
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
|
||||||
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
|
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
{
|
||||||
|
ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
|
||||||
|
p, end - p );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
|
||||||
|
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
|
||||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||||
@ -2351,7 +2510,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -2375,7 +2535,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -2755,6 +2916,31 @@ static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
|
|||||||
return( ret );
|
return( ret );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
{
|
||||||
|
i = 4;
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
|
||||||
|
ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
|
||||||
|
ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
|
||||||
|
ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
|
||||||
|
ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
|
||||||
{
|
{
|
||||||
((void) ciphersuite_info);
|
((void) ciphersuite_info);
|
||||||
@ -2799,7 +2985,8 @@ static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -2831,7 +3018,8 @@ static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
|
@ -232,7 +232,8 @@ have_sig_alg:
|
|||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
||||||
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,
|
static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,
|
||||||
const unsigned char *buf,
|
const unsigned char *buf,
|
||||||
size_t len )
|
size_t len )
|
||||||
@ -305,7 +306,12 @@ static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,
|
|||||||
if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
|
if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
|
||||||
p[0] == MBEDTLS_ECP_PF_COMPRESSED )
|
p[0] == MBEDTLS_ECP_PF_COMPRESSED )
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
||||||
ssl->handshake->ecdh_ctx.point_format = p[0];
|
ssl->handshake->ecdh_ctx.point_format = p[0];
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
ssl->handshake->ecjpake_ctx.point_format = p[0];
|
||||||
|
#endif
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
|
MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
@ -316,7 +322,35 @@ static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,
|
|||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
|
||||||
|
const unsigned char *buf,
|
||||||
|
size_t len )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
|
||||||
|
buf, len ) ) != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only mark the extension as OK when we're sure it is */
|
||||||
|
ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
||||||
@ -707,6 +741,17 @@ static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
|
||||||
|
( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake "
|
||||||
|
"not configured or ext missing" ) );
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
||||||
if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&
|
if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&
|
||||||
( ssl->handshake->curves == NULL ||
|
( ssl->handshake->curves == NULL ||
|
||||||
@ -1541,7 +1586,8 @@ read_record_header:
|
|||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
|
||||||
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
|
case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
|
||||||
|
|
||||||
@ -1558,7 +1604,18 @@ read_record_header:
|
|||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) );
|
||||||
|
|
||||||
|
ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size );
|
||||||
|
if( ret != 0 )
|
||||||
|
return( ret );
|
||||||
|
break;
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
|
case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
|
||||||
@ -1976,7 +2033,8 @@ static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
|||||||
}
|
}
|
||||||
#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
|
#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
||||||
unsigned char *buf,
|
unsigned char *buf,
|
||||||
size_t *olen )
|
size_t *olen )
|
||||||
@ -2004,7 +2062,51 @@ static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
|
|||||||
|
|
||||||
*olen = 6;
|
*olen = 6;
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
|
||||||
|
unsigned char *buf,
|
||||||
|
size_t *olen )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned char *p = buf;
|
||||||
|
const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
|
||||||
|
size_t kkpp_len;
|
||||||
|
|
||||||
|
*olen = 0;
|
||||||
|
|
||||||
|
/* Skip costly computation if not needed */
|
||||||
|
if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
|
||||||
|
MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
return;
|
||||||
|
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) );
|
||||||
|
|
||||||
|
if( end - p < 4 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
|
||||||
|
*p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
|
||||||
|
p + 2, end - p - 2, &kkpp_len,
|
||||||
|
ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
|
||||||
|
*p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
|
||||||
|
|
||||||
|
*olen = kkpp_len + 4;
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN )
|
#if defined(MBEDTLS_SSL_ALPN )
|
||||||
static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
|
static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
|
||||||
@ -2290,11 +2392,17 @@ static int ssl_write_server_hello( mbedtls_ssl_context *ssl )
|
|||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
|
ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
|
ext_len += olen;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN)
|
#if defined(MBEDTLS_SSL_ALPN)
|
||||||
ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
|
ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
|
||||||
ext_len += olen;
|
ext_len += olen;
|
||||||
@ -2333,7 +2441,8 @@ static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -2370,6 +2479,7 @@ static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
|
|||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
|
||||||
authmode == MBEDTLS_SSL_VERIFY_NONE )
|
authmode == MBEDTLS_SSL_VERIFY_NONE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
|
||||||
@ -2544,12 +2654,14 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
|
|||||||
defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
|
defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
|
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
|
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
|
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
|
||||||
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
unsigned char *p = ssl->out_msg + 4;
|
unsigned char *p = ssl->out_msg + 4;
|
||||||
unsigned char *dig_signed = p;
|
unsigned char *dig_signed = p;
|
||||||
size_t dig_signed_len = 0, len;
|
size_t dig_signed_len = 0, len;
|
||||||
((void) dig_signed);
|
((void) dig_signed);
|
||||||
((void) dig_signed_len);
|
((void) dig_signed_len);
|
||||||
|
((void) len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
|
||||||
@ -2580,6 +2692,25 @@ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
{
|
||||||
|
size_t jlen;
|
||||||
|
const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
|
||||||
|
p, end - p, &jlen, ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
p += jlen;
|
||||||
|
n += jlen;
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
|
#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
|
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
|
||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
@ -3331,6 +3462,28 @@ static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
|
{
|
||||||
|
ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
|
||||||
|
p, end - p );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
|
||||||
|
return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
|
||||||
|
ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
|
||||||
|
ssl->conf->f_rng, ssl->conf->p_rng );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
|
||||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||||
@ -3362,7 +3515,8 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -3392,6 +3546,7 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
|
|||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
|
||||||
ssl->session_negotiate->peer_cert == NULL )
|
ssl->session_negotiate->peer_cert == NULL )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
|
||||||
|
@ -862,6 +862,16 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
|
|||||||
}
|
}
|
||||||
#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
|
#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
if( ssl->conf->f_export_keys != NULL )
|
||||||
|
{
|
||||||
|
ssl->conf->f_export_keys( ssl->conf->p_export_keys,
|
||||||
|
session->master, keyblk,
|
||||||
|
transform->maclen, transform->keylen,
|
||||||
|
iv_copy_len );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
|
if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
|
||||||
cipher_info ) ) != 0 )
|
cipher_info ) ) != 0 )
|
||||||
{
|
{
|
||||||
@ -3968,7 +3978,8 @@ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
|
|||||||
|
|
||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -3987,7 +3998,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
|
|||||||
|
|
||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -4009,7 +4021,8 @@ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
|
|||||||
|
|
||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -4124,7 +4137,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
|
|||||||
|
|
||||||
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
|
||||||
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
|
||||||
|
ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
|
||||||
ssl->state++;
|
ssl->state++;
|
||||||
@ -5146,6 +5160,13 @@ static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
|
|||||||
#if defined(MBEDTLS_ECDH_C)
|
#if defined(MBEDTLS_ECDH_C)
|
||||||
mbedtls_ecdh_init( &handshake->ecdh_ctx );
|
mbedtls_ecdh_init( &handshake->ecdh_ctx );
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
|
||||||
|
#if defined(MBEDTLS_SSL_CLI_C)
|
||||||
|
handshake->ecjpake_cache = NULL;
|
||||||
|
handshake->ecjpake_cache_len = 0;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
||||||
handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
|
handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
|
||||||
@ -5679,6 +5700,32 @@ void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
|
|||||||
}
|
}
|
||||||
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
/*
|
||||||
|
* Set EC J-PAKE password for current handshake
|
||||||
|
*/
|
||||||
|
int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
|
||||||
|
const unsigned char *pw,
|
||||||
|
size_t pw_len )
|
||||||
|
{
|
||||||
|
mbedtls_ecjpake_role role;
|
||||||
|
|
||||||
|
if( ssl->handshake == NULL && ssl->conf == NULL )
|
||||||
|
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||||
|
|
||||||
|
if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
|
||||||
|
role = MBEDTLS_ECJPAKE_SERVER;
|
||||||
|
else
|
||||||
|
role = MBEDTLS_ECJPAKE_CLIENT;
|
||||||
|
|
||||||
|
return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
|
||||||
|
role,
|
||||||
|
MBEDTLS_MD_SHA256,
|
||||||
|
MBEDTLS_ECP_DP_SECP256R1,
|
||||||
|
pw, pw_len ) );
|
||||||
|
}
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
||||||
int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
|
int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
|
||||||
const unsigned char *psk, size_t psk_len,
|
const unsigned char *psk, size_t psk_len,
|
||||||
@ -6002,6 +6049,16 @@ void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
|
|||||||
#endif
|
#endif
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
|
||||||
|
mbedtls_ssl_export_keys_t *f_export_keys,
|
||||||
|
void *p_export_keys )
|
||||||
|
{
|
||||||
|
conf->f_export_keys = f_export_keys;
|
||||||
|
conf->p_export_keys = p_export_keys;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SSL get accessors
|
* SSL get accessors
|
||||||
*/
|
*/
|
||||||
@ -6822,6 +6879,14 @@ void mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake )
|
|||||||
#if defined(MBEDTLS_ECDH_C)
|
#if defined(MBEDTLS_ECDH_C)
|
||||||
mbedtls_ecdh_free( &handshake->ecdh_ctx );
|
mbedtls_ecdh_free( &handshake->ecdh_ctx );
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
|
||||||
|
#if defined(MBEDTLS_SSL_CLI_C)
|
||||||
|
mbedtls_free( handshake->ecjpake_cache );
|
||||||
|
handshake->ecjpake_cache = NULL;
|
||||||
|
handshake->ecjpake_cache_len = 0;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
|
||||||
/* explicit void pointer cast for buggy MS compiler */
|
/* explicit void pointer cast for buggy MS compiler */
|
||||||
@ -7171,7 +7236,8 @@ void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
|
|||||||
mbedtls_zeroize( conf, sizeof( mbedtls_ssl_config ) );
|
mbedtls_zeroize( conf, sizeof( mbedtls_ssl_config ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MBEDTLS_PK_C)
|
#if defined(MBEDTLS_PK_C) && \
|
||||||
|
( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
|
||||||
/*
|
/*
|
||||||
* Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
|
* Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
|
||||||
*/
|
*/
|
||||||
@ -7204,7 +7270,7 @@ mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
|
|||||||
return( MBEDTLS_PK_NONE );
|
return( MBEDTLS_PK_NONE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_PK_C */
|
#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
|
* Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
|
||||||
@ -7360,6 +7426,7 @@ int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
|
|||||||
case MBEDTLS_KEY_EXCHANGE_PSK:
|
case MBEDTLS_KEY_EXCHANGE_PSK:
|
||||||
case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
|
case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
|
||||||
case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
|
case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
|
||||||
|
case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
|
||||||
usage = 0;
|
usage = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,6 +264,9 @@ static const char *features[] = {
|
|||||||
#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
|
||||||
"MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED",
|
"MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED",
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
"MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED",
|
||||||
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
|
#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
|
||||||
"MBEDTLS_PK_PARSE_EC_EXTENDED",
|
"MBEDTLS_PK_PARSE_EC_EXTENDED",
|
||||||
#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */
|
#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */
|
||||||
@ -378,6 +381,9 @@ static const char *features[] = {
|
|||||||
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
||||||
"MBEDTLS_SSL_SESSION_TICKETS",
|
"MBEDTLS_SSL_SESSION_TICKETS",
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
||||||
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
|
"MBEDTLS_SSL_EXPORT_KEYS",
|
||||||
|
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
||||||
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
||||||
"MBEDTLS_SSL_SERVER_NAME_INDICATION",
|
"MBEDTLS_SSL_SERVER_NAME_INDICATION",
|
||||||
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
||||||
@ -465,6 +471,9 @@ static const char *features[] = {
|
|||||||
#if defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDSA_C)
|
||||||
"MBEDTLS_ECDSA_C",
|
"MBEDTLS_ECDSA_C",
|
||||||
#endif /* MBEDTLS_ECDSA_C */
|
#endif /* MBEDTLS_ECDSA_C */
|
||||||
|
#if defined(MBEDTLS_ECJPAKE_C)
|
||||||
|
"MBEDTLS_ECJPAKE_C",
|
||||||
|
#endif /* MBEDTLS_ECJPAKE_C */
|
||||||
#if defined(MBEDTLS_ECP_C)
|
#if defined(MBEDTLS_ECP_C)
|
||||||
"MBEDTLS_ECP_C",
|
"MBEDTLS_ECP_C",
|
||||||
#endif /* MBEDTLS_ECP_C */
|
#endif /* MBEDTLS_ECP_C */
|
||||||
|
@ -75,6 +75,7 @@ int main( void )
|
|||||||
#define DFL_KEY_FILE ""
|
#define DFL_KEY_FILE ""
|
||||||
#define DFL_PSK ""
|
#define DFL_PSK ""
|
||||||
#define DFL_PSK_IDENTITY "Client_identity"
|
#define DFL_PSK_IDENTITY "Client_identity"
|
||||||
|
#define DFL_ECJPAKE_PW NULL
|
||||||
#define DFL_FORCE_CIPHER 0
|
#define DFL_FORCE_CIPHER 0
|
||||||
#define DFL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION_DISABLED
|
#define DFL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION_DISABLED
|
||||||
#define DFL_ALLOW_LEGACY -2
|
#define DFL_ALLOW_LEGACY -2
|
||||||
@ -211,6 +212,13 @@ int main( void )
|
|||||||
#define USAGE_RENEGO ""
|
#define USAGE_RENEGO ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
#define USAGE_ECJPAKE \
|
||||||
|
" ecjpake_pw=%%s default: none (disabled)\n"
|
||||||
|
#else
|
||||||
|
#define USAGE_ECJPAKE ""
|
||||||
|
#endif
|
||||||
|
|
||||||
#define USAGE \
|
#define USAGE \
|
||||||
"\n usage: ssl_client2 param=<>...\n" \
|
"\n usage: ssl_client2 param=<>...\n" \
|
||||||
"\n acceptable parameters:\n" \
|
"\n acceptable parameters:\n" \
|
||||||
@ -233,6 +241,7 @@ int main( void )
|
|||||||
USAGE_IO \
|
USAGE_IO \
|
||||||
"\n" \
|
"\n" \
|
||||||
USAGE_PSK \
|
USAGE_PSK \
|
||||||
|
USAGE_ECJPAKE \
|
||||||
"\n" \
|
"\n" \
|
||||||
" allow_legacy=%%d default: (library default: no)\n" \
|
" allow_legacy=%%d default: (library default: no)\n" \
|
||||||
USAGE_RENEGO \
|
USAGE_RENEGO \
|
||||||
@ -279,6 +288,7 @@ struct options
|
|||||||
const char *key_file; /* the file with the client key */
|
const char *key_file; /* the file with the client key */
|
||||||
const char *psk; /* the pre-shared key */
|
const char *psk; /* the pre-shared key */
|
||||||
const char *psk_identity; /* the pre-shared key identity */
|
const char *psk_identity; /* the pre-shared key identity */
|
||||||
|
const char *ecjpake_pw; /* the EC J-PAKE password */
|
||||||
int force_ciphersuite[2]; /* protocol/ciphersuite to use, or all */
|
int force_ciphersuite[2]; /* protocol/ciphersuite to use, or all */
|
||||||
int renegotiation; /* enable / disable renegotiation */
|
int renegotiation; /* enable / disable renegotiation */
|
||||||
int allow_legacy; /* allow legacy renegotiation */
|
int allow_legacy; /* allow legacy renegotiation */
|
||||||
@ -469,6 +479,7 @@ int main( int argc, char *argv[] )
|
|||||||
opt.key_file = DFL_KEY_FILE;
|
opt.key_file = DFL_KEY_FILE;
|
||||||
opt.psk = DFL_PSK;
|
opt.psk = DFL_PSK;
|
||||||
opt.psk_identity = DFL_PSK_IDENTITY;
|
opt.psk_identity = DFL_PSK_IDENTITY;
|
||||||
|
opt.ecjpake_pw = DFL_ECJPAKE_PW;
|
||||||
opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
|
opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
|
||||||
opt.renegotiation = DFL_RENEGOTIATION;
|
opt.renegotiation = DFL_RENEGOTIATION;
|
||||||
opt.allow_legacy = DFL_ALLOW_LEGACY;
|
opt.allow_legacy = DFL_ALLOW_LEGACY;
|
||||||
@ -557,6 +568,8 @@ int main( int argc, char *argv[] )
|
|||||||
opt.psk = q;
|
opt.psk = q;
|
||||||
else if( strcmp( p, "psk_identity" ) == 0 )
|
else if( strcmp( p, "psk_identity" ) == 0 )
|
||||||
opt.psk_identity = q;
|
opt.psk_identity = q;
|
||||||
|
else if( strcmp( p, "ecjpake_pw" ) == 0 )
|
||||||
|
opt.ecjpake_pw = q;
|
||||||
else if( strcmp( p, "force_ciphersuite" ) == 0 )
|
else if( strcmp( p, "force_ciphersuite" ) == 0 )
|
||||||
{
|
{
|
||||||
opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );
|
opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );
|
||||||
@ -1204,6 +1217,19 @@ int main( int argc, char *argv[] )
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( opt.ecjpake_pw != DFL_ECJPAKE_PW )
|
||||||
|
{
|
||||||
|
if( ( ret = mbedtls_ssl_set_hs_ecjpake_password( &ssl,
|
||||||
|
(const unsigned char *) opt.ecjpake_pw,
|
||||||
|
strlen( opt.ecjpake_pw ) ) ) != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_printf( " failed\n ! mbedtls_ssl_set_hs_ecjpake_password returned %d\n\n", ret );
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if( opt.nbio == 2 )
|
if( opt.nbio == 2 )
|
||||||
mbedtls_ssl_set_bio( &ssl, &server_fd, my_send, my_recv, NULL );
|
mbedtls_ssl_set_bio( &ssl, &server_fd, my_send, my_recv, NULL );
|
||||||
else
|
else
|
||||||
|
@ -102,6 +102,7 @@ int main( void )
|
|||||||
#define DFL_KEY_FILE2 ""
|
#define DFL_KEY_FILE2 ""
|
||||||
#define DFL_PSK ""
|
#define DFL_PSK ""
|
||||||
#define DFL_PSK_IDENTITY "Client_identity"
|
#define DFL_PSK_IDENTITY "Client_identity"
|
||||||
|
#define DFL_ECJPAKE_PW NULL
|
||||||
#define DFL_PSK_LIST NULL
|
#define DFL_PSK_LIST NULL
|
||||||
#define DFL_FORCE_CIPHER 0
|
#define DFL_FORCE_CIPHER 0
|
||||||
#define DFL_VERSION_SUITES NULL
|
#define DFL_VERSION_SUITES NULL
|
||||||
@ -293,6 +294,13 @@ int main( void )
|
|||||||
#define USAGE_RENEGO ""
|
#define USAGE_RENEGO ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
#define USAGE_ECJPAKE \
|
||||||
|
" ecjpake_pw=%%s default: none (disabled)\n"
|
||||||
|
#else
|
||||||
|
#define USAGE_ECJPAKE ""
|
||||||
|
#endif
|
||||||
|
|
||||||
#define USAGE \
|
#define USAGE \
|
||||||
"\n usage: ssl_server2 param=<>...\n" \
|
"\n usage: ssl_server2 param=<>...\n" \
|
||||||
"\n acceptable parameters:\n" \
|
"\n acceptable parameters:\n" \
|
||||||
@ -314,6 +322,7 @@ int main( void )
|
|||||||
USAGE_SNI \
|
USAGE_SNI \
|
||||||
"\n" \
|
"\n" \
|
||||||
USAGE_PSK \
|
USAGE_PSK \
|
||||||
|
USAGE_ECJPAKE \
|
||||||
"\n" \
|
"\n" \
|
||||||
" allow_legacy=%%d default: (library default: no)\n" \
|
" allow_legacy=%%d default: (library default: no)\n" \
|
||||||
USAGE_RENEGO \
|
USAGE_RENEGO \
|
||||||
@ -358,6 +367,7 @@ struct options
|
|||||||
const char *psk; /* the pre-shared key */
|
const char *psk; /* the pre-shared key */
|
||||||
const char *psk_identity; /* the pre-shared key identity */
|
const char *psk_identity; /* the pre-shared key identity */
|
||||||
char *psk_list; /* list of PSK id/key pairs for callback */
|
char *psk_list; /* list of PSK id/key pairs for callback */
|
||||||
|
const char *ecjpake_pw; /* the EC J-PAKE password */
|
||||||
int force_ciphersuite[2]; /* protocol/ciphersuite to use, or all */
|
int force_ciphersuite[2]; /* protocol/ciphersuite to use, or all */
|
||||||
const char *version_suites; /* per-version ciphersuites */
|
const char *version_suites; /* per-version ciphersuites */
|
||||||
int renegotiation; /* enable / disable renegotiation */
|
int renegotiation; /* enable / disable renegotiation */
|
||||||
@ -900,6 +910,7 @@ int main( int argc, char *argv[] )
|
|||||||
opt.psk = DFL_PSK;
|
opt.psk = DFL_PSK;
|
||||||
opt.psk_identity = DFL_PSK_IDENTITY;
|
opt.psk_identity = DFL_PSK_IDENTITY;
|
||||||
opt.psk_list = DFL_PSK_LIST;
|
opt.psk_list = DFL_PSK_LIST;
|
||||||
|
opt.ecjpake_pw = DFL_ECJPAKE_PW;
|
||||||
opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
|
opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;
|
||||||
opt.version_suites = DFL_VERSION_SUITES;
|
opt.version_suites = DFL_VERSION_SUITES;
|
||||||
opt.renegotiation = DFL_RENEGOTIATION;
|
opt.renegotiation = DFL_RENEGOTIATION;
|
||||||
@ -985,6 +996,8 @@ int main( int argc, char *argv[] )
|
|||||||
opt.psk_identity = q;
|
opt.psk_identity = q;
|
||||||
else if( strcmp( p, "psk_list" ) == 0 )
|
else if( strcmp( p, "psk_list" ) == 0 )
|
||||||
opt.psk_list = q;
|
opt.psk_list = q;
|
||||||
|
else if( strcmp( p, "ecjpake_pw" ) == 0 )
|
||||||
|
opt.ecjpake_pw = q;
|
||||||
else if( strcmp( p, "force_ciphersuite" ) == 0 )
|
else if( strcmp( p, "force_ciphersuite" ) == 0 )
|
||||||
{
|
{
|
||||||
opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );
|
opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );
|
||||||
@ -1904,6 +1917,19 @@ reset:
|
|||||||
}
|
}
|
||||||
#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
|
#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
|
if( opt.ecjpake_pw != DFL_ECJPAKE_PW )
|
||||||
|
{
|
||||||
|
if( ( ret = mbedtls_ssl_set_hs_ecjpake_password( &ssl,
|
||||||
|
(const unsigned char *) opt.ecjpake_pw,
|
||||||
|
strlen( opt.ecjpake_pw ) ) ) != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_printf( " failed\n ! mbedtls_ssl_set_hs_ecjpake_password returned %d\n\n", ret );
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
mbedtls_printf( " ok\n" );
|
mbedtls_printf( " ok\n" );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "mbedtls/xtea.h"
|
#include "mbedtls/xtea.h"
|
||||||
#include "mbedtls/pkcs5.h"
|
#include "mbedtls/pkcs5.h"
|
||||||
#include "mbedtls/ecp.h"
|
#include "mbedtls/ecp.h"
|
||||||
|
#include "mbedtls/ecjpake.h"
|
||||||
#include "mbedtls/timing.h"
|
#include "mbedtls/timing.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -244,6 +245,11 @@ int main( int argc, char *argv[] )
|
|||||||
return( ret );
|
return( ret );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_ECJPAKE_C)
|
||||||
|
if( ( ret = mbedtls_ecjpake_self_test( v ) ) != 0 )
|
||||||
|
return( ret );
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_DHM_C)
|
#if defined(MBEDTLS_DHM_C)
|
||||||
if( ( ret = mbedtls_dhm_self_test( v ) ) != 0 )
|
if( ( ret = mbedtls_dhm_self_test( v ) ) != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
|
52
scripts/footprint.sh
Executable file
52
scripts/footprint.sh
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
CONFIG_H='include/mbedtls/config.h'
|
||||||
|
|
||||||
|
if [ -r $CONFIG_H ]; then :; else
|
||||||
|
echo "$CONFIG_H not found" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -i cmake Makefile >/dev/null; then
|
||||||
|
echo "Not compatible with CMake" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
doit()
|
||||||
|
{
|
||||||
|
NAME="$1"
|
||||||
|
FILE="$2"
|
||||||
|
|
||||||
|
echo "$NAME:"
|
||||||
|
|
||||||
|
cp $CONFIG_H ${CONFIG_H}.bak
|
||||||
|
cp "$FILE" include/mbedtls/config.h
|
||||||
|
|
||||||
|
{
|
||||||
|
scripts/config.pl unset MBEDTLS_NET_C || true
|
||||||
|
scripts/config.pl unset MBEDTLS_TIMING_C || true
|
||||||
|
scripts/config.pl unset MBEDTLS_FS_IO || true
|
||||||
|
} >/dev/null 2>&1
|
||||||
|
|
||||||
|
CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld \
|
||||||
|
CFLAGS='-Wa,--noexecstack -Os -march=armv7-m -mthumb' \
|
||||||
|
make clean lib >/dev/null
|
||||||
|
|
||||||
|
OUT="size-${NAME}.txt"
|
||||||
|
arm-none-eabi-size -t library/libmbed*.a > "$OUT"
|
||||||
|
head -n1 "$OUT"
|
||||||
|
tail -n1 "$OUT"
|
||||||
|
|
||||||
|
cp ${CONFIG_H}.bak $CONFIG_H
|
||||||
|
}
|
||||||
|
|
||||||
|
# creates the yotta config
|
||||||
|
yotta/create-module.sh >/dev/null
|
||||||
|
|
||||||
|
doit default include/mbedtls/config.h.bak
|
||||||
|
doit yotta yotta/module/mbedtls/config.h
|
||||||
|
doit thread configs/config-thread.h
|
||||||
|
doit ecc configs/config-suite-b.h
|
||||||
|
doit psk configs/config-ccm-psk-tls1_2.h
|
@ -60,9 +60,10 @@ add_test_suite(ctr_drbg)
|
|||||||
add_test_suite(debug)
|
add_test_suite(debug)
|
||||||
add_test_suite(des)
|
add_test_suite(des)
|
||||||
add_test_suite(dhm)
|
add_test_suite(dhm)
|
||||||
add_test_suite(ecp)
|
|
||||||
add_test_suite(ecdh)
|
add_test_suite(ecdh)
|
||||||
add_test_suite(ecdsa)
|
add_test_suite(ecdsa)
|
||||||
|
add_test_suite(ecjpake)
|
||||||
|
add_test_suite(ecp)
|
||||||
add_test_suite(entropy)
|
add_test_suite(entropy)
|
||||||
add_test_suite(error)
|
add_test_suite(error)
|
||||||
add_test_suite(gcm gcm.aes128_en)
|
add_test_suite(gcm gcm.aes128_en)
|
||||||
|
@ -60,7 +60,7 @@ APPS = test_suite_aes.ecb$(EXEXT) test_suite_aes.cbc$(EXEXT) \
|
|||||||
test_suite_ctr_drbg$(EXEXT) test_suite_debug$(EXEXT) \
|
test_suite_ctr_drbg$(EXEXT) test_suite_debug$(EXEXT) \
|
||||||
test_suite_des$(EXEXT) test_suite_dhm$(EXEXT) \
|
test_suite_des$(EXEXT) test_suite_dhm$(EXEXT) \
|
||||||
test_suite_ecdh$(EXEXT) test_suite_ecdsa$(EXEXT) \
|
test_suite_ecdh$(EXEXT) test_suite_ecdsa$(EXEXT) \
|
||||||
test_suite_ecp$(EXEXT) \
|
test_suite_ecjpake$(EXEXT) test_suite_ecp$(EXEXT) \
|
||||||
test_suite_error$(EXEXT) test_suite_entropy$(EXEXT) \
|
test_suite_error$(EXEXT) test_suite_entropy$(EXEXT) \
|
||||||
test_suite_gcm.aes128_de$(EXEXT) \
|
test_suite_gcm.aes128_de$(EXEXT) \
|
||||||
test_suite_gcm.aes192_de$(EXEXT) \
|
test_suite_gcm.aes192_de$(EXEXT) \
|
||||||
@ -292,6 +292,10 @@ test_suite_ecdsa$(EXEXT): test_suite_ecdsa.c $(DEP)
|
|||||||
echo " CC $<"
|
echo " CC $<"
|
||||||
$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
|
$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
test_suite_ecjpake$(EXEXT): test_suite_ecjpake.c $(DEP)
|
||||||
|
echo " CC $<"
|
||||||
|
$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
|
||||||
test_suite_ecp$(EXEXT): test_suite_ecp.c $(DEP)
|
test_suite_ecp$(EXEXT): test_suite_ecp.c $(DEP)
|
||||||
echo " CC $<"
|
echo " CC $<"
|
||||||
$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
|
$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
@ -23,6 +23,8 @@ sub abort {
|
|||||||
|
|
||||||
for my $curve (@curves) {
|
for my $curve (@curves) {
|
||||||
system( "cp $config_h.bak $config_h" ) and die "$config_h not restored\n";
|
system( "cp $config_h.bak $config_h" ) and die "$config_h not restored\n";
|
||||||
|
# depends on a specific curve. Also, ignore error if it wasn't enabled
|
||||||
|
system( "scripts/config.pl unset MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED" );
|
||||||
system( "make clean" ) and die;
|
system( "make clean" ) and die;
|
||||||
|
|
||||||
print "\n******************************************\n";
|
print "\n******************************************\n";
|
||||||
@ -32,7 +34,7 @@ for my $curve (@curves) {
|
|||||||
system( "scripts/config.pl unset $curve" )
|
system( "scripts/config.pl unset $curve" )
|
||||||
and abort "Failed to disable $curve\n";
|
and abort "Failed to disable $curve\n";
|
||||||
|
|
||||||
system( "make mbedtls" ) and abort "Failed to build lib: $curve\n";
|
system( "make lib" ) and abort "Failed to build lib: $curve\n";
|
||||||
system( "cd tests && make" ) and abort "Failed to build tests: $curve\n";
|
system( "cd tests && make" ) and abort "Failed to build tests: $curve\n";
|
||||||
system( "make test" ) and abort "Failed test suite: $curve\n";
|
system( "make test" ) and abort "Failed test suite: $curve\n";
|
||||||
|
|
||||||
|
@ -11,14 +11,20 @@ use warnings;
|
|||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
my %configs = (
|
my %configs = (
|
||||||
'config-mini-tls1_1.h'
|
'config-mini-tls1_1.h' => {
|
||||||
=> '-m tls1_1 -f \'^DES-CBC3-SHA$\|^TLS-RSA-WITH-3DES-EDE-CBC-SHA$\'',
|
'compat' => '-m tls1_1 -f \'^DES-CBC3-SHA$\|^TLS-RSA-WITH-3DES-EDE-CBC-SHA$\'',
|
||||||
'config-suite-b.h'
|
},
|
||||||
=> "-m tls1_2 -f 'ECDHE-ECDSA.*AES.*GCM' -p mbedTLS",
|
'config-suite-b.h' => {
|
||||||
'config-picocoin.h'
|
'compat' => "-m tls1_2 -f 'ECDHE-ECDSA.*AES.*GCM' -p mbedTLS",
|
||||||
=> 0,
|
},
|
||||||
'config-ccm-psk-tls1_2.h'
|
'config-picocoin.h' => {
|
||||||
=> '-m tls1_2 -f \'^TLS-PSK-WITH-AES-...-CCM-8\'',
|
},
|
||||||
|
'config-ccm-psk-tls1_2.h' => {
|
||||||
|
'compat' => '-m tls1_2 -f \'^TLS-PSK-WITH-AES-...-CCM-8\'',
|
||||||
|
},
|
||||||
|
'config-thread.h' => {
|
||||||
|
'opt' => '-f ECJPAKE.*nolog',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
# If no config-name is provided, use all known configs.
|
# If no config-name is provided, use all known configs.
|
||||||
@ -46,7 +52,7 @@ sub abort {
|
|||||||
die $_[0];
|
die $_[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
while( my ($conf, $args) = each %configs ) {
|
while( my ($conf, $data) = each %configs ) {
|
||||||
system( "cp $config_h.bak $config_h" ) and die;
|
system( "cp $config_h.bak $config_h" ) and die;
|
||||||
system( "make clean" ) and die;
|
system( "make clean" ) and die;
|
||||||
|
|
||||||
@ -60,16 +66,29 @@ while( my ($conf, $args) = each %configs ) {
|
|||||||
system( "make" ) and abort "Failed to build: $conf\n";
|
system( "make" ) and abort "Failed to build: $conf\n";
|
||||||
system( "make test" ) and abort "Failed test suite: $conf\n";
|
system( "make test" ) and abort "Failed test suite: $conf\n";
|
||||||
|
|
||||||
if( $args )
|
my $compat = $data->{'compat'};
|
||||||
|
if( $compat )
|
||||||
{
|
{
|
||||||
print "\nrunning compat.sh $args\n";
|
print "\nrunning compat.sh $compat\n";
|
||||||
system( "tests/compat.sh $args" )
|
system( "tests/compat.sh $compat" )
|
||||||
and abort "Failed compat.sh: $conf\n";
|
and abort "Failed compat.sh: $conf\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print "\nskipping compat.sh\n";
|
print "\nskipping compat.sh\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $opt = $data->{'opt'};
|
||||||
|
if( $opt )
|
||||||
|
{
|
||||||
|
print "\nrunning ssl-opt.sh $opt\n";
|
||||||
|
system( "tests/ssl-opt.sh $opt" )
|
||||||
|
and abort "Failed ssl-opt.sh: $conf\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print "\nskipping ssl-opt.sh\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
system( "mv $config_h.bak $config_h" ) and warn "$config_h not restored\n";
|
system( "mv $config_h.bak $config_h" ) and warn "$config_h not restored\n";
|
||||||
|
@ -2499,6 +2499,98 @@ run_test "PSK callback: wrong key" \
|
|||||||
-S "SSL - Unknown identity received" \
|
-S "SSL - Unknown identity received" \
|
||||||
-s "SSL - Verification of the message MAC failed"
|
-s "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
# Tests for EC J-PAKE
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: client not configured" \
|
||||||
|
"$P_SRV debug_level=3" \
|
||||||
|
"$P_CLI debug_level=3" \
|
||||||
|
0 \
|
||||||
|
-C "add ciphersuite: c0ff" \
|
||||||
|
-C "adding ecjpake_kkpp extension" \
|
||||||
|
-S "found ecjpake kkpp extension" \
|
||||||
|
-S "skip ecjpake kkpp extension" \
|
||||||
|
-S "ciphersuite mismatch: ecjpake not configured" \
|
||||||
|
-S "server hello, ecjpake kkpp extension" \
|
||||||
|
-C "found ecjpake_kkpp extension" \
|
||||||
|
-S "None of the common ciphersuites is usable"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: server not configured" \
|
||||||
|
"$P_SRV debug_level=3" \
|
||||||
|
"$P_CLI debug_level=3 ecjpake_pw=bla \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
1 \
|
||||||
|
-c "add ciphersuite: c0ff" \
|
||||||
|
-c "adding ecjpake_kkpp extension" \
|
||||||
|
-s "found ecjpake kkpp extension" \
|
||||||
|
-s "skip ecjpake kkpp extension" \
|
||||||
|
-s "ciphersuite mismatch: ecjpake not configured" \
|
||||||
|
-S "server hello, ecjpake kkpp extension" \
|
||||||
|
-C "found ecjpake_kkpp extension" \
|
||||||
|
-s "None of the common ciphersuites is usable"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: working, TLS" \
|
||||||
|
"$P_SRV debug_level=3 ecjpake_pw=bla" \
|
||||||
|
"$P_CLI debug_level=3 ecjpake_pw=bla \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
0 \
|
||||||
|
-c "add ciphersuite: c0ff" \
|
||||||
|
-c "adding ecjpake_kkpp extension" \
|
||||||
|
-C "re-using cached ecjpake parameters" \
|
||||||
|
-s "found ecjpake kkpp extension" \
|
||||||
|
-S "skip ecjpake kkpp extension" \
|
||||||
|
-S "ciphersuite mismatch: ecjpake not configured" \
|
||||||
|
-s "server hello, ecjpake kkpp extension" \
|
||||||
|
-c "found ecjpake_kkpp extension" \
|
||||||
|
-S "None of the common ciphersuites is usable" \
|
||||||
|
-S "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: password mismatch, TLS" \
|
||||||
|
"$P_SRV debug_level=3 ecjpake_pw=bla" \
|
||||||
|
"$P_CLI debug_level=3 ecjpake_pw=bad \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
1 \
|
||||||
|
-C "re-using cached ecjpake parameters" \
|
||||||
|
-s "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: working, DTLS" \
|
||||||
|
"$P_SRV debug_level=3 dtls=1 ecjpake_pw=bla" \
|
||||||
|
"$P_CLI debug_level=3 dtls=1 ecjpake_pw=bla \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
0 \
|
||||||
|
-c "re-using cached ecjpake parameters" \
|
||||||
|
-S "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: working, DTLS, no cookie" \
|
||||||
|
"$P_SRV debug_level=3 dtls=1 ecjpake_pw=bla cookies=0" \
|
||||||
|
"$P_CLI debug_level=3 dtls=1 ecjpake_pw=bla \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
0 \
|
||||||
|
-C "re-using cached ecjpake parameters" \
|
||||||
|
-S "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: password mismatch, DTLS" \
|
||||||
|
"$P_SRV debug_level=3 dtls=1 ecjpake_pw=bla" \
|
||||||
|
"$P_CLI debug_level=3 dtls=1 ecjpake_pw=bad \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
1 \
|
||||||
|
-c "re-using cached ecjpake parameters" \
|
||||||
|
-s "SSL - Verification of the message MAC failed"
|
||||||
|
|
||||||
|
# for tests with configs/config-thread.h
|
||||||
|
requires_config_enabled MBEDTLS_KEY_EXCHANGE_ECJPAKE
|
||||||
|
run_test "ECJPAKE: working, DTLS, nolog" \
|
||||||
|
"$P_SRV dtls=1 ecjpake_pw=bla" \
|
||||||
|
"$P_CLI dtls=1 ecjpake_pw=bla \
|
||||||
|
force_ciphersuite=TLS-ECJPAKE-WITH-AES-128-CCM-8" \
|
||||||
|
0
|
||||||
|
|
||||||
# Tests for ciphersuites per version
|
# Tests for ciphersuites per version
|
||||||
|
|
||||||
run_test "Per-version suites: SSL3" \
|
run_test "Per-version suites: SSL3" \
|
||||||
|
230
tests/suites/test_suite_ecjpake.data
Normal file
230
tests/suites/test_suite_ecjpake.data
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
ECJPAKE selftest
|
||||||
|
ecjpake_selftest:
|
||||||
|
|
||||||
|
ECJPAKE round one: client, valid
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d905193735144104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb12":0
|
||||||
|
|
||||||
|
ECJPAKE round one: server, valid
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_SERVER:"4104accf0106ef858fa2d919331346805a78b58bbad0b844e5c7892879146187dd2666ada781bb7f111372251a8910621f634df128ac48e381fd6ef9060731f694a441041dd0bd5d4566c9bed9ce7de701b5e82e08e84b730466018ab903c79eb982172236c0c1728ae4bf73610d34de44246ef3d9c05a2236fb66a6583d7449308babce2072fe16662992e9235c25002f11b15087b82738e03c945bf7a2995dda1e98345841047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b4104a49558d32ed1ebfc1816af4ff09b55fcb4ca47b2a02d1e7caf1179ea3fe1395b22b861964016fabaf72c975695d93d4df0e5197fe9f040634ed59764937787be20bc4deebbf9b8d60a335f046ca3aa941e45864c7cadef9cf75b3d8b010e443ef0":0
|
||||||
|
|
||||||
|
ECJPAKE round one: role mismatch
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104accf0106ef858fa2d919331346805a78b58bbad0b844e5c7892879146187dd2666ada781bb7f111372251a8910621f634df128ac48e381fd6ef9060731f694a441041dd0bd5d4566c9bed9ce7de701b5e82e08e84b730466018ab903c79eb982172236c0c1728ae4bf73610d34de44246ef3d9c05a2236fb66a6583d7449308babce2072fe16662992e9235c25002f11b15087b82738e03c945bf7a2995dda1e98345841047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b4104a49558d32ed1ebfc1816af4ff09b55fcb4ca47b2a02d1e7caf1179ea3fe1395b22b861964016fabaf72c975695d93d4df0e5197fe9f040634ed59764937787be20bc4deebbf9b8d60a335f046ca3aa941e45864c7cadef9cf75b3d8b010e443ef0":MBEDTLS_ERR_ECP_VERIFY_FAILED
|
||||||
|
|
||||||
|
ECJPAKE round one: trailing byte
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d905193735144104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1200":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: no data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: length of first point too small
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: length of first point too big
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"01":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: no point data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"0104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: first point is zero
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"0100":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: unknown first point format
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41057ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: nothing after first point
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: length of second point too small
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: length of second point too big
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b01":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: no second point data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b0104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: unknow second point format
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410509f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb516":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: nothing after second point
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb516":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: zero-length r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51600":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: no data for r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51601":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: corrupted r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d90519373515":MBEDTLS_ERR_ECP_VERIFY_FAILED
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP1: X not on the curve
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"41047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2a410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d90519373514":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: no data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb12":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: length of first point too small
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1200":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: length of first point too big
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1201":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: no point data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb120104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: first point is zero
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb120100":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: unknown first point format
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241057ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: nothing after first point
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: length of second point too small
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: length of second point too big
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b01":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: no second point data
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b0104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: unknow second point format
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410509f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb516":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: nothing after second point
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb516":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: zero-length r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51600":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: no data for r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51601":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: corrupted r
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2b410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d90519373515":MBEDTLS_ERR_ECP_VERIFY_FAILED
|
||||||
|
|
||||||
|
ECJPAKE round one: KKP2: X not on the curve
|
||||||
|
read_round_one:MBEDTLS_ECJPAKE_CLIENT:"4104190a07700ffa4be6ae1d79ee0f06aeb544cd5addaabedf70f8623321332c54f355f0fbfec783ed359e5d0bf7377a0fc4ea7ace473c9c112b41ccd41ac56a56124104360a1cea33fce641156458e0a4eac219e96831e6aebc88b3f3752f93a0281d1bf1fb106051db9694a8d6e862a5ef1324a3d9e27894f1ee4f7c59199965a8dd4a2091847d2d22df3ee55faa2a3fb33fd2d1e055a07a7c61ecfb8d80ec00c2c9eb1241047ea6e3a4487037a9e0dbd79262b2cc273e779930fc18409ac5361c5fe669d702e147790aeb4ce7fd6575ab0f6c7fd1c335939aa863ba37ec91b7e32bb013bb2a410409f85b3d20ebd7885ce464c08d056d6428fe4dd9287aa365f131f4360ff386d846898bc4b41583c2a5197f65d78742746c12a5ec0a4ffe2f270a750a1d8fb51620934d74eb43e54df424fd96306c0117bf131afabf90a9d33d1198d90519373514":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two client: valid
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c820ff724a9a70b88cb86f20b434c6865aa1cd7906dd7c9bce3525f508276f26836c":0
|
||||||
|
|
||||||
|
ECJPAKE round two client: trailing byte
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c820ff724a9a70b88cb86f20b434c6865aa1cd7906dd7c9bce3525f508276f26836c00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: no data
|
||||||
|
read_round_two_cli:"":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: ECParams too short
|
||||||
|
read_round_two_cli:"0300":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: ECParams not named curve
|
||||||
|
read_round_two_cli:"010017":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: ECParams wrong curve
|
||||||
|
read_round_two_cli:"030016":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round two client: no data after ECParams
|
||||||
|
read_round_two_cli:"030017":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: length of first point too small
|
||||||
|
read_round_two_cli:"03001700":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: length of first point too big
|
||||||
|
read_round_two_cli:"03001701":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: no first point data
|
||||||
|
read_round_two_cli:"0300170104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: first point is zero
|
||||||
|
read_round_two_cli:"0300170100":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two client: unknown first point format
|
||||||
|
read_round_two_cli:"03001741050fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a6":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round two client: nothing after first point
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a6":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: length of second point too small
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a600":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: length of second point too big
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a601":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: no second point data
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a60104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: unknown second point format
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641055516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c8":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round two client: nothing after second point
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c8":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: zero-length r
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c800":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two client: no data for r
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c801":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two client: corrupted r
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a641045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c820ff724a9a70b88cb86f20b434c6865aa1cd7906dd7c9bce3525f508276f26836d":MBEDTLS_ERR_ECP_VERIFY_FAILED
|
||||||
|
|
||||||
|
ECJPAKE round two client: X not on the curve
|
||||||
|
read_round_two_cli:"03001741040fb22b1d5d1123e0ef9feb9d8a2e590a1f4d7ced2c2b06586e8f2a16d4eb2fda4328a20b07d8fd667654ca18c54e32a333a0845451e926ee8804fd7af0aaa7a741045516ea3e54a0d5d8b2ce786b38d383370029a5dbe4459c9dd601b408a24ae6465c8ac905b9eb03b5d3691c139ef83f1cd4200f6c9cd4ec392218a59ed243d3c820ff724a9a70b88cb86f20b434c6865aa1cd7906dd7c9bce3525f508276f26836c":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two server: valid
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d200f011f19483535a6e89a580c9b0003baf21462ece91a82cc38dbdcae60d9c54c":0
|
||||||
|
|
||||||
|
ECJPAKE round two server: trailing byte
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d200f011f19483535a6e89a580c9b0003baf21462ece91a82cc38dbdcae60d9c54c00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: no data
|
||||||
|
read_round_two_srv:"":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: length of forst point too small
|
||||||
|
read_round_two_srv:"00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: length of first point too big
|
||||||
|
read_round_two_srv:"01":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: no first point data
|
||||||
|
read_round_two_srv:"0104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: first point is zero
|
||||||
|
read_round_two_srv:"0100":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two server: unknown first point format
|
||||||
|
read_round_two_srv:"410569d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round two server: nothing after first point
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: length of second point too small
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee00":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: length of second point too big
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee01":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: no second point data
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee0104":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: unknown second point format
|
||||||
|
read_round_two_srv:"410569d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d":MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE
|
||||||
|
|
||||||
|
ECJPAKE round two server: nothing after second point
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: zero-length r
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d00":MBEDTLS_ERR_ECP_INVALID_KEY
|
||||||
|
|
||||||
|
ECJPAKE round two server: no data for r
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d20":MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
|
|
||||||
|
ECJPAKE round two server: corrupted r
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ee4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d200f011f19483535a6e89a580c9b0003baf21462ece91a82cc38dbdcae60d9c54d":MBEDTLS_ERR_ECP_VERIFY_FAILED
|
||||||
|
|
||||||
|
ECJPAKE round two server: X not on curve
|
||||||
|
read_round_two_srv:"410469d54ee85e90ce3f1246742de507e939e81d1dc1c5cb988b58c310c9fdd9524d93720b45541c83ee8841191da7ced86e3312d43623c1d63e74989aba4affd1ef4104077e8c31e20e6bedb760c13593e69f15be85c27d68cd09ccb8c4183608917c5c3d409fac39fefee82f7292d36f0d23e055913f45a52b85dd8a2052e9e129bb4d200f011f19483535a6e89a580c9b0003baf21462ece91a82cc38dbdcae60d9c54c":MBEDTLS_ERR_ECP_INVALID_KEY
|
190
tests/suites/test_suite_ecjpake.function
Normal file
190
tests/suites/test_suite_ecjpake.function
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
/* BEGIN_HEADER */
|
||||||
|
#include "mbedtls/ecjpake.h"
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && defined(MBEDTLS_SHA256_C)
|
||||||
|
static const unsigned char ecjpake_test_x1[] = {
|
||||||
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
|
||||||
|
0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
|
||||||
|
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_x2[] = {
|
||||||
|
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
|
||||||
|
0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||||
|
0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_x3[] = {
|
||||||
|
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
|
||||||
|
0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||||
|
0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_x4[] = {
|
||||||
|
0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc,
|
||||||
|
0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||||
|
0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_X1[] = {
|
||||||
|
0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19, 0x33,
|
||||||
|
0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44, 0xe5,
|
||||||
|
0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad, 0xa7,
|
||||||
|
0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62, 0x1f,
|
||||||
|
0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9, 0x06,
|
||||||
|
0x07, 0x31, 0xf6, 0x94, 0xa4
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_X2[] = {
|
||||||
|
0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7,
|
||||||
|
0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40,
|
||||||
|
0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79,
|
||||||
|
0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1,
|
||||||
|
0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3,
|
||||||
|
0x2b, 0xb0, 0x13, 0xbb, 0x2b
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_X3[] = {
|
||||||
|
0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7,
|
||||||
|
0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40,
|
||||||
|
0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79,
|
||||||
|
0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1,
|
||||||
|
0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3,
|
||||||
|
0x2b, 0xb0, 0x13, 0xbb, 0x2b
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char ecjpake_test_X4[] = {
|
||||||
|
0x04, 0x19, 0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79,
|
||||||
|
0xee, 0x0f, 0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf,
|
||||||
|
0x70, 0xf8, 0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb,
|
||||||
|
0xfe, 0xc7, 0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f,
|
||||||
|
0xc4, 0xea, 0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4,
|
||||||
|
0x1a, 0xc5, 0x6a, 0x56, 0x12
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Load my private and public keys, and peer's public keys */
|
||||||
|
static int ecjpake_test_load( mbedtls_ecjpake_context *ctx,
|
||||||
|
const unsigned char *xm1, size_t len_xm1,
|
||||||
|
const unsigned char *xm2, size_t len_xm2,
|
||||||
|
const unsigned char *Xm1, size_t len_Xm1,
|
||||||
|
const unsigned char *Xm2, size_t len_Xm2,
|
||||||
|
const unsigned char *Xp1, size_t len_Xp1,
|
||||||
|
const unsigned char *Xp2, size_t len_Xp2 )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm1, xm1, len_xm1 ) );
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm2, xm2, len_xm2 ) );
|
||||||
|
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_point_read_binary( &ctx->grp,
|
||||||
|
&ctx->Xm1, Xm1, len_Xm1 ) );
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_point_read_binary( &ctx->grp,
|
||||||
|
&ctx->Xm2, Xm2, len_Xm2 ) );
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_point_read_binary( &ctx->grp,
|
||||||
|
&ctx->Xp1, Xp1, len_Xp1 ) );
|
||||||
|
MBEDTLS_MPI_CHK( mbedtls_ecp_point_read_binary( &ctx->grp,
|
||||||
|
&ctx->Xp2, Xp2, len_Xp2 ) );
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD_SIZE( x ) x, sizeof( x )
|
||||||
|
#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */
|
||||||
|
/* END_HEADER */
|
||||||
|
|
||||||
|
/* BEGIN_DEPENDENCIES
|
||||||
|
* depends_on:MBEDTLS_ECJPAKE_C
|
||||||
|
* END_DEPENDENCIES
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
|
||||||
|
void ecjpake_selftest()
|
||||||
|
{
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_self_test( 0 ) == 0 );
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
||||||
|
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_SHA256_C */
|
||||||
|
void read_round_one( int role, char *data, int ref_ret )
|
||||||
|
{
|
||||||
|
mbedtls_ecjpake_context ctx;
|
||||||
|
const unsigned char pw[] = {};
|
||||||
|
unsigned char *msg;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
mbedtls_ecjpake_init( &ctx );
|
||||||
|
|
||||||
|
msg = unhexify_alloc( data, &len );
|
||||||
|
TEST_ASSERT( msg != NULL );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_setup( &ctx, role,
|
||||||
|
MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, pw, 0 ) == 0 );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_read_round_one( &ctx, msg, len ) == ref_ret );
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_ecjpake_free( &ctx );
|
||||||
|
mbedtls_free( msg );
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
||||||
|
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_SHA256_C */
|
||||||
|
void read_round_two_cli( char *data, int ref_ret )
|
||||||
|
{
|
||||||
|
mbedtls_ecjpake_context ctx;
|
||||||
|
const unsigned char pw[] = {};
|
||||||
|
unsigned char *msg;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
mbedtls_ecjpake_init( &ctx );
|
||||||
|
|
||||||
|
msg = unhexify_alloc( data, &len );
|
||||||
|
TEST_ASSERT( msg != NULL );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_setup( &ctx, MBEDTLS_ECJPAKE_CLIENT,
|
||||||
|
MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, pw, 0 ) == 0 );
|
||||||
|
|
||||||
|
TEST_ASSERT( ecjpake_test_load( &ctx,
|
||||||
|
ADD_SIZE( ecjpake_test_x1 ), ADD_SIZE( ecjpake_test_x2 ),
|
||||||
|
ADD_SIZE( ecjpake_test_X1 ), ADD_SIZE( ecjpake_test_X2 ),
|
||||||
|
ADD_SIZE( ecjpake_test_X3 ), ADD_SIZE( ecjpake_test_X4 ) )
|
||||||
|
== 0 );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_read_round_two( &ctx, msg, len ) == ref_ret );
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_ecjpake_free( &ctx );
|
||||||
|
mbedtls_free( msg );
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
||||||
|
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_SHA256_C */
|
||||||
|
void read_round_two_srv( char *data, int ref_ret )
|
||||||
|
{
|
||||||
|
mbedtls_ecjpake_context ctx;
|
||||||
|
const unsigned char pw[] = {};
|
||||||
|
unsigned char *msg;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
mbedtls_ecjpake_init( &ctx );
|
||||||
|
|
||||||
|
msg = unhexify_alloc( data, &len );
|
||||||
|
TEST_ASSERT( msg != NULL );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_setup( &ctx, MBEDTLS_ECJPAKE_SERVER,
|
||||||
|
MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, pw, 0 ) == 0 );
|
||||||
|
|
||||||
|
TEST_ASSERT( ecjpake_test_load( &ctx,
|
||||||
|
ADD_SIZE( ecjpake_test_x3 ), ADD_SIZE( ecjpake_test_x4 ),
|
||||||
|
ADD_SIZE( ecjpake_test_X3 ), ADD_SIZE( ecjpake_test_X4 ),
|
||||||
|
ADD_SIZE( ecjpake_test_X1 ), ADD_SIZE( ecjpake_test_X2 ) )
|
||||||
|
== 0 );
|
||||||
|
|
||||||
|
TEST_ASSERT( mbedtls_ecjpake_read_round_two( &ctx, msg, len ) == ref_ret );
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_ecjpake_free( &ctx );
|
||||||
|
mbedtls_free( msg );
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
Loading…
Reference in New Issue
Block a user