mirror of
https://github.com/vlang/v.git
synced 2025-09-14 06:52:36 +03:00
thirdparty,net.mbedtls: update mbedtls
to latest compatible version v3.3.0 (#21118)
This commit is contained in:
parent
cb402a3340
commit
64a336932c
156 changed files with 16293 additions and 4396 deletions
233
thirdparty/mbedtls/library/ecjpake.c
vendored
233
thirdparty/mbedtls/library/ecjpake.c
vendored
|
@ -30,16 +30,19 @@
|
|||
#include "mbedtls/platform_util.h"
|
||||
#include "mbedtls/error.h"
|
||||
|
||||
/* We use MD first if it's available (for compatibility reasons)
|
||||
* and "fall back" to PSA otherwise (which needs psa_crypto_init()). */
|
||||
#if !defined(MBEDTLS_MD_C)
|
||||
#include "psa/crypto.h"
|
||||
#include "mbedtls/psa_util.h"
|
||||
#endif /* !MBEDTLS_MD_C */
|
||||
|
||||
#include "hash_info.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#if !defined(MBEDTLS_ECJPAKE_ALT)
|
||||
|
||||
/* Parameter validation macros based on platform_util.h */
|
||||
#define ECJPAKE_VALIDATE_RET( cond ) \
|
||||
MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA )
|
||||
#define ECJPAKE_VALIDATE( cond ) \
|
||||
MBEDTLS_INTERNAL_VALIDATE( cond )
|
||||
|
||||
/*
|
||||
* Convert a mbedtls_ecjpake_role to identifier string
|
||||
*/
|
||||
|
@ -51,14 +54,34 @@ static const char * const ecjpake_id[] = {
|
|||
#define ID_MINE ( ecjpake_id[ ctx->role ] )
|
||||
#define ID_PEER ( ecjpake_id[ 1 - ctx->role ] )
|
||||
|
||||
/**
|
||||
* Helper to Compute a hash from md_type
|
||||
*/
|
||||
static int mbedtls_ecjpake_compute_hash( mbedtls_md_type_t md_type,
|
||||
const unsigned char *input, size_t ilen,
|
||||
unsigned char *output )
|
||||
{
|
||||
#if defined(MBEDTLS_MD_C)
|
||||
return( mbedtls_md( mbedtls_md_info_from_type( md_type ),
|
||||
input, ilen, output ) );
|
||||
#else
|
||||
psa_algorithm_t alg = mbedtls_psa_translate_md( md_type );
|
||||
psa_status_t status;
|
||||
size_t out_size = PSA_HASH_LENGTH( alg );
|
||||
size_t out_len;
|
||||
|
||||
status = psa_hash_compute( alg, input, ilen, output, out_size, &out_len );
|
||||
|
||||
return( mbedtls_md_error_from_psa( status ) );
|
||||
#endif /* !MBEDTLS_MD_C */
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize context
|
||||
*/
|
||||
void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx )
|
||||
{
|
||||
ECJPAKE_VALIDATE( ctx != NULL );
|
||||
|
||||
ctx->md_info = NULL;
|
||||
ctx->md_type = MBEDTLS_MD_NONE;
|
||||
mbedtls_ecp_group_init( &ctx->grp );
|
||||
ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED;
|
||||
|
||||
|
@ -81,7 +104,7 @@ void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx )
|
|||
if( ctx == NULL )
|
||||
return;
|
||||
|
||||
ctx->md_info = NULL;
|
||||
ctx->md_type = MBEDTLS_MD_NONE;
|
||||
mbedtls_ecp_group_free( &ctx->grp );
|
||||
|
||||
mbedtls_ecp_point_free( &ctx->Xm1 );
|
||||
|
@ -107,15 +130,20 @@ int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx,
|
|||
{
|
||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( role == MBEDTLS_ECJPAKE_CLIENT ||
|
||||
role == MBEDTLS_ECJPAKE_SERVER );
|
||||
ECJPAKE_VALIDATE_RET( secret != NULL || len == 0 );
|
||||
if( role != MBEDTLS_ECJPAKE_CLIENT && role != MBEDTLS_ECJPAKE_SERVER )
|
||||
return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
|
||||
|
||||
ctx->role = role;
|
||||
|
||||
if( ( ctx->md_info = mbedtls_md_info_from_type( hash ) ) == NULL )
|
||||
#if defined(MBEDTLS_MD_C)
|
||||
if( ( mbedtls_md_info_from_type( hash ) ) == NULL )
|
||||
return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
|
||||
#else
|
||||
if( mbedtls_psa_translate_md( hash ) == MBEDTLS_MD_NONE )
|
||||
return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
|
||||
#endif
|
||||
|
||||
ctx->md_type = hash;
|
||||
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ctx->grp, curve ) );
|
||||
|
||||
|
@ -147,9 +175,7 @@ int mbedtls_ecjpake_set_point_format( mbedtls_ecjpake_context *ctx,
|
|||
*/
|
||||
int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx )
|
||||
{
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
|
||||
if( ctx->md_info == NULL ||
|
||||
if( ctx->md_type == MBEDTLS_MD_NONE ||
|
||||
ctx->grp.id == MBEDTLS_ECP_DP_NONE ||
|
||||
ctx->s.p == NULL )
|
||||
{
|
||||
|
@ -196,7 +222,7 @@ static int ecjpake_write_len_point( unsigned char **p,
|
|||
/*
|
||||
* Compute hash for ZKP (7.4.2.2.2.1)
|
||||
*/
|
||||
static int ecjpake_hash( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_hash( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -210,7 +236,7 @@ static int ecjpake_hash( const mbedtls_md_info_t *md_info,
|
|||
unsigned char *p = buf;
|
||||
const unsigned char *end = buf + sizeof( buf );
|
||||
const size_t id_len = strlen( id );
|
||||
unsigned char hash[MBEDTLS_MD_MAX_SIZE];
|
||||
unsigned char hash[MBEDTLS_HASH_MAX_SIZE];
|
||||
|
||||
/* Write things to temporary buffer */
|
||||
MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, G ) );
|
||||
|
@ -230,11 +256,12 @@ static int ecjpake_hash( const mbedtls_md_info_t *md_info,
|
|||
p += id_len;
|
||||
|
||||
/* Compute hash */
|
||||
MBEDTLS_MPI_CHK( mbedtls_md( md_info, buf, p - buf, hash ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecjpake_compute_hash( md_type,
|
||||
buf, p - buf, hash ) );
|
||||
|
||||
/* Turn it into an integer mod n */
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( h, hash,
|
||||
mbedtls_md_get_size( md_info ) ) );
|
||||
mbedtls_hash_info_get_size( md_type ) ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( h, h, &grp->N ) );
|
||||
|
||||
cleanup:
|
||||
|
@ -244,7 +271,7 @@ cleanup:
|
|||
/*
|
||||
* Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3)
|
||||
*/
|
||||
static int ecjpake_zkp_read( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_zkp_read( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -294,7 +321,7 @@ static int ecjpake_zkp_read( const mbedtls_md_info_t *md_info,
|
|||
/*
|
||||
* Verification
|
||||
*/
|
||||
MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_hash( md_type, grp, pf, G, &V, X, id, &h ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( (mbedtls_ecp_group *) grp,
|
||||
&VV, &h, X, &r, G ) );
|
||||
|
||||
|
@ -316,7 +343,7 @@ cleanup:
|
|||
/*
|
||||
* Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2)
|
||||
*/
|
||||
static int ecjpake_zkp_write( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_zkp_write( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -344,7 +371,7 @@ static int ecjpake_zkp_write( const mbedtls_md_info_t *md_info,
|
|||
/* Compute signature */
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp,
|
||||
G, &v, &V, f_rng, p_rng ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_hash( md_type, grp, pf, G, &V, X, id, &h ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &h, &h, x ) ); /* x*h */
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &h, &v, &h ) ); /* v - x*h */
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &h, &h, &grp->N ) ); /* r */
|
||||
|
@ -377,7 +404,7 @@ cleanup:
|
|||
* Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof
|
||||
* Output: verified public key X
|
||||
*/
|
||||
static int ecjpake_kkp_read( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_kkp_read( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -404,7 +431,7 @@ static int ecjpake_kkp_read( const mbedtls_md_info_t *md_info,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_info, grp, pf, G, X, id, p, end ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_type, grp, pf, G, X, id, p, end ) );
|
||||
|
||||
cleanup:
|
||||
return( ret );
|
||||
|
@ -414,7 +441,7 @@ cleanup:
|
|||
* Generate an ECJPAKEKeyKP
|
||||
* Output: the serialized structure, plus private/public key pair
|
||||
*/
|
||||
static int ecjpake_kkp_write( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_kkp_write( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -440,7 +467,7 @@ static int ecjpake_kkp_write( const mbedtls_md_info_t *md_info,
|
|||
*p += len;
|
||||
|
||||
/* Generate and write proof */
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_info, grp, pf, G, x, X, id,
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_type, grp, pf, G, x, X, id,
|
||||
p, end, f_rng, p_rng ) );
|
||||
|
||||
cleanup:
|
||||
|
@ -451,7 +478,7 @@ cleanup:
|
|||
* Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs
|
||||
* Outputs: verified peer public keys Xa, Xb
|
||||
*/
|
||||
static int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_kkpp_read( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -470,8 +497,8 @@ static int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info,
|
|||
* ECJPAKEKeyKP ecjpake_key_kp_pair_list[2];
|
||||
* } ECJPAKEKeyKPPairList;
|
||||
*/
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xa, id, &p, end ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xb, id, &p, end ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_type, grp, pf, G, Xa, id, &p, end ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_type, grp, pf, G, Xb, id, &p, end ) );
|
||||
|
||||
if( p != end )
|
||||
ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
|
||||
|
@ -484,7 +511,7 @@ cleanup:
|
|||
* Generate a ECJPAKEKeyKPPairList
|
||||
* Outputs: the serialized structure, plus two private/public key pairs
|
||||
*/
|
||||
static int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info,
|
||||
static int ecjpake_kkpp_write( const mbedtls_md_type_t md_type,
|
||||
const mbedtls_ecp_group *grp,
|
||||
const int pf,
|
||||
const mbedtls_ecp_point *G,
|
||||
|
@ -503,9 +530,9 @@ static int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info,
|
|||
unsigned char *p = buf;
|
||||
const unsigned char *end = buf + len;
|
||||
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm1, Xa, id,
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_type, grp, pf, G, xm1, Xa, id,
|
||||
&p, end, f_rng, p_rng ) );
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm2, Xb, id,
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_type, grp, pf, G, xm2, Xb, id,
|
||||
&p, end, f_rng, p_rng ) );
|
||||
|
||||
*olen = p - buf;
|
||||
|
@ -521,10 +548,7 @@ int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx,
|
|||
const unsigned char *buf,
|
||||
size_t len )
|
||||
{
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( buf != NULL );
|
||||
|
||||
return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, ctx->point_format,
|
||||
return( ecjpake_kkpp_read( ctx->md_type, &ctx->grp, ctx->point_format,
|
||||
&ctx->grp.G,
|
||||
&ctx->Xp1, &ctx->Xp2, ID_PEER,
|
||||
buf, len ) );
|
||||
|
@ -538,12 +562,7 @@ int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx,
|
|||
int (*f_rng)(void *, unsigned char *, size_t),
|
||||
void *p_rng )
|
||||
{
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( buf != NULL );
|
||||
ECJPAKE_VALIDATE_RET( olen != NULL );
|
||||
ECJPAKE_VALIDATE_RET( f_rng != NULL );
|
||||
|
||||
return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, ctx->point_format,
|
||||
return( ecjpake_kkpp_write( ctx->md_type, &ctx->grp, ctx->point_format,
|
||||
&ctx->grp.G,
|
||||
&ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2,
|
||||
ID_MINE, buf, len, olen, f_rng, p_rng ) );
|
||||
|
@ -585,9 +604,6 @@ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,
|
|||
mbedtls_ecp_group grp;
|
||||
mbedtls_ecp_point G; /* C: GB, S: GA */
|
||||
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( buf != NULL );
|
||||
|
||||
mbedtls_ecp_group_init( &grp );
|
||||
mbedtls_ecp_point_init( &G );
|
||||
|
||||
|
@ -616,7 +632,7 @@ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_info, &ctx->grp,
|
||||
MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_type, &ctx->grp,
|
||||
ctx->point_format,
|
||||
&G, &ctx->Xp, ID_PEER, &p, end ) );
|
||||
|
||||
|
@ -680,11 +696,6 @@ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,
|
|||
const unsigned char *end = buf + len;
|
||||
size_t ec_len;
|
||||
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( buf != NULL );
|
||||
ECJPAKE_VALIDATE_RET( olen != NULL );
|
||||
ECJPAKE_VALIDATE_RET( f_rng != NULL );
|
||||
|
||||
mbedtls_ecp_point_init( &G );
|
||||
mbedtls_ecp_point_init( &Xm );
|
||||
mbedtls_mpi_init( &xm );
|
||||
|
@ -731,7 +742,7 @@ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,
|
|||
ctx->point_format, &ec_len, p, end - p ) );
|
||||
p += ec_len;
|
||||
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp,
|
||||
MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_type, &ctx->grp,
|
||||
ctx->point_format,
|
||||
&G, &xm, &Xm, ID_MINE,
|
||||
&p, end, f_rng, p_rng ) );
|
||||
|
@ -749,27 +760,14 @@ cleanup:
|
|||
/*
|
||||
* Derive PMS (7.4.2.7 / 7.4.2.8)
|
||||
*/
|
||||
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 )
|
||||
static int mbedtls_ecjpake_derive_k( mbedtls_ecjpake_context *ctx,
|
||||
mbedtls_ecp_point *K,
|
||||
int (*f_rng)(void *, unsigned char *, size_t),
|
||||
void *p_rng )
|
||||
{
|
||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||
mbedtls_ecp_point K;
|
||||
mbedtls_mpi m_xm2_s, one;
|
||||
unsigned char kx[MBEDTLS_ECP_MAX_BYTES];
|
||||
size_t x_bytes;
|
||||
|
||||
ECJPAKE_VALIDATE_RET( ctx != NULL );
|
||||
ECJPAKE_VALIDATE_RET( buf != NULL );
|
||||
ECJPAKE_VALIDATE_RET( olen != NULL );
|
||||
ECJPAKE_VALIDATE_RET( f_rng != NULL );
|
||||
|
||||
*olen = mbedtls_md_get_size( ctx->md_info );
|
||||
if( len < *olen )
|
||||
return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
||||
|
||||
mbedtls_ecp_point_init( &K );
|
||||
mbedtls_mpi_init( &m_xm2_s );
|
||||
mbedtls_mpi_init( &one );
|
||||
|
||||
|
@ -782,21 +780,72 @@ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,
|
|||
*/
|
||||
MBEDTLS_MPI_CHK( ecjpake_mul_secret( &m_xm2_s, -1, &ctx->xm2, &ctx->s,
|
||||
&ctx->grp.N, f_rng, p_rng ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, &K,
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, K,
|
||||
&one, &ctx->Xp,
|
||||
&m_xm2_s, &ctx->Xp2 ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &K, &ctx->xm2, &K,
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, K, &ctx->xm2, K,
|
||||
f_rng, p_rng ) );
|
||||
|
||||
cleanup:
|
||||
mbedtls_mpi_free( &m_xm2_s );
|
||||
mbedtls_mpi_free( &one );
|
||||
|
||||
return( ret );
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||
mbedtls_ecp_point K;
|
||||
unsigned char kx[MBEDTLS_ECP_MAX_BYTES];
|
||||
size_t x_bytes;
|
||||
|
||||
*olen = mbedtls_hash_info_get_size( ctx->md_type );
|
||||
if( len < *olen )
|
||||
return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
||||
|
||||
mbedtls_ecp_point_init( &K );
|
||||
|
||||
ret = mbedtls_ecjpake_derive_k(ctx, &K, f_rng, p_rng);
|
||||
if( ret )
|
||||
goto cleanup;
|
||||
|
||||
/* PMS = SHA-256( K.X ) */
|
||||
x_bytes = ( ctx->grp.pbits + 7 ) / 8;
|
||||
MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &K.X, kx, x_bytes ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_md( ctx->md_info, kx, x_bytes, buf ) );
|
||||
MBEDTLS_MPI_CHK( mbedtls_ecjpake_compute_hash( ctx->md_type,
|
||||
kx, x_bytes, buf ) );
|
||||
|
||||
cleanup:
|
||||
mbedtls_ecp_point_free( &K );
|
||||
|
||||
return( ret );
|
||||
}
|
||||
|
||||
int mbedtls_ecjpake_write_shared_key( mbedtls_ecjpake_context *ctx,
|
||||
unsigned char *buf, size_t len, size_t *olen,
|
||||
int (*f_rng)(void *, unsigned char *, size_t),
|
||||
void *p_rng )
|
||||
{
|
||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||
mbedtls_ecp_point K;
|
||||
|
||||
mbedtls_ecp_point_init( &K );
|
||||
|
||||
ret = mbedtls_ecjpake_derive_k(ctx, &K, f_rng, p_rng);
|
||||
if( ret )
|
||||
goto cleanup;
|
||||
|
||||
ret = mbedtls_ecp_point_write_binary( &ctx->grp, &K, ctx->point_format,
|
||||
olen, buf, len );
|
||||
if( ret != 0 )
|
||||
goto cleanup;
|
||||
|
||||
cleanup:
|
||||
mbedtls_ecp_point_free( &K );
|
||||
mbedtls_mpi_free( &m_xm2_s );
|
||||
mbedtls_mpi_free( &one );
|
||||
|
||||
return( ret );
|
||||
}
|
||||
|
@ -808,12 +857,7 @@ cleanup:
|
|||
|
||||
#if defined(MBEDTLS_SELF_TEST)
|
||||
|
||||
#if defined(MBEDTLS_PLATFORM_C)
|
||||
#include "mbedtls/platform.h"
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#define mbedtls_printf printf
|
||||
#endif
|
||||
|
||||
#if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \
|
||||
!defined(MBEDTLS_SHA256_C)
|
||||
|
@ -951,6 +995,15 @@ static const unsigned char ecjpake_test_cli_two[] = {
|
|||
0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c
|
||||
};
|
||||
|
||||
static const unsigned char ecjpake_test_shared_key[] = {
|
||||
0x04, 0x01, 0xab, 0xe9, 0xf2, 0xc7, 0x3a, 0x99, 0x14, 0xcb, 0x1f, 0x80,
|
||||
0xfb, 0x9d, 0xdb, 0x7e, 0x00, 0x12, 0xa8, 0x9c, 0x2f, 0x39, 0x27, 0x79,
|
||||
0xf9, 0x64, 0x40, 0x14, 0x75, 0xea, 0xc1, 0x31, 0x28, 0x43, 0x8f, 0xe1,
|
||||
0x12, 0x41, 0xd6, 0xc1, 0xe5, 0x5f, 0x7b, 0x80, 0x88, 0x94, 0xc9, 0xc0,
|
||||
0x27, 0xa3, 0x34, 0x41, 0xf5, 0xcb, 0xa1, 0xfe, 0x6c, 0xc7, 0xe6, 0x12,
|
||||
0x17, 0xc3, 0xde, 0x27, 0xb4,
|
||||
};
|
||||
|
||||
static const unsigned char ecjpake_test_pms[] = {
|
||||
0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7,
|
||||
0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9,
|
||||
|
@ -1137,6 +1190,13 @@ int mbedtls_ecjpake_self_test( int verbose )
|
|||
TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );
|
||||
TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );
|
||||
|
||||
/* Server derives K as unsigned binary data */
|
||||
TEST_ASSERT( mbedtls_ecjpake_write_shared_key( &srv,
|
||||
buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
|
||||
|
||||
TEST_ASSERT( len == sizeof( ecjpake_test_shared_key ) );
|
||||
TEST_ASSERT( memcmp( buf, ecjpake_test_shared_key, len ) == 0 );
|
||||
|
||||
memset( buf, 0, len ); /* Avoid interferences with next step */
|
||||
|
||||
/* Client derives PMS */
|
||||
|
@ -1146,6 +1206,13 @@ int mbedtls_ecjpake_self_test( int verbose )
|
|||
TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );
|
||||
TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );
|
||||
|
||||
/* Client derives K as unsigned binary data */
|
||||
TEST_ASSERT( mbedtls_ecjpake_write_shared_key( &cli,
|
||||
buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
|
||||
|
||||
TEST_ASSERT( len == sizeof( ecjpake_test_shared_key ) );
|
||||
TEST_ASSERT( memcmp( buf, ecjpake_test_shared_key, len ) == 0 );
|
||||
|
||||
if( verbose != 0 )
|
||||
mbedtls_printf( "passed\n" );
|
||||
#endif /* ! MBEDTLS_ECJPAKE_ALT */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue