static void arc4_ctx_free( void *ctx ) { mbedtls_arc4_free( (mbedtls_arc4_context *) ctx ); mbedtls_free( ctx ); }
static void ccm_ctx_free( void *ctx ) { mbedtls_ccm_free( ctx ); mbedtls_free( ctx ); }
static void blowfish_ctx_free( void *ctx ) { mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx ); mbedtls_free( ctx ); }
static void ecdsa_free_wrap( void *ctx ) { mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx ); mbedtls_free( ctx ); }
static void rsa_alt_free_wrap( void *ctx ) { mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) ); mbedtls_free( ctx ); }
static void eckey_free_wrap( void *ctx ) { mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx ); mbedtls_free( ctx ); }
static void des3_ctx_free( void *ctx ) { mbedtls_des3_free( (mbedtls_des3_context *) ctx ); mbedtls_free( ctx ); }
static void camellia_ctx_free( void *ctx ) { mbedtls_camellia_free( (mbedtls_camellia_context *) ctx ); mbedtls_free( ctx ); }
int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int ( *f_rng )( void *, unsigned char *, size_t ), void *p_rng ) { int ret = 0; void* pHeap = NULL; size_t heapSize = 0; uint32_t public_key_size = (2 * MAX_KEY_SIZE_IN_BYTES + 1); const CRYS_ECPKI_Domain_t* pDomain = CRYS_ECPKI_GetEcDomain ( convert_mbedtls_grp_id_to_crys_domain_id( grp->id ) ); mbedtls_rand_func_container cc_rand = { f_rng, p_rng }; if ( pDomain ) { uint8_t temp_buf[ 2 * MAX_KEY_SIZE_IN_BYTES + 1 ] = {0}; cc_ecc_ws_keygen_params_t* kgParams = mbedtls_calloc( 1, sizeof( cc_ecc_ws_keygen_params_t ) ); if ( kgParams == NULL ) return ( MBEDTLS_ERR_ECP_ALLOC_FAILED ); pHeap = kgParams; heapSize = sizeof( cc_ecc_ws_keygen_params_t ); ret = convert_CrysError_to_mbedtls_err( CRYS_ECPKI_GenKeyPair( &cc_rand, convert_mbedtls_to_cc_rand, pDomain, &kgParams->privKey, &kgParams->pubKey, &kgParams->kgTempData, NULL ) ); if( ret != 0 ) { goto cleanup; } ret = convert_CrysError_to_mbedtls_err( CRYS_ECPKI_ExportPublKey( &kgParams->pubKey, CRYS_EC_PointUncompressed,temp_buf, &public_key_size ) ); if( ret != 0 ) { goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_point_read_binary( grp, Q, temp_buf, public_key_size ) ); memset ( temp_buf, 0 , sizeof(temp_buf) ); ret = convert_CrysError_to_mbedtls_err( CRYS_COMMON_ConvertLswMswWordsToMsbLsbBytes( temp_buf, (grp->nbits+7)/8, kgParams->privKey.PrivKeyDbBuff, 4*((((grp->nbits+7)/8)+3)/4) ) ); if( ret != 0 ) { mbedtls_zeroize( temp_buf, sizeof( temp_buf ) ); goto cleanup; } MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary( d, temp_buf, (grp->nbits+7)/8 ) ); mbedtls_zeroize( temp_buf, sizeof( temp_buf ) ); } /* if CRYS_ECPKI_GetEcDomain returns NULL, then the given curve is either Montgomery 25519 * or another curve which is not supported by CC310*/ else if ( grp->id == MBEDTLS_ECP_DP_CURVE25519 ) { size_t priv_key_size = public_key_size = CURVE_25519_KEY_SIZE ; cc_ecc_25519_keygen_params_t* kgParams = mbedtls_calloc( 1, sizeof(cc_ecc_25519_keygen_params_t) ); if ( kgParams == NULL ) return ( MBEDTLS_ERR_ECP_ALLOC_FAILED ); pHeap = ( uint8_t* )kgParams; heapSize = sizeof(cc_ecc_25519_keygen_params_t); ret = convert_CrysError_to_mbedtls_err( CRYS_ECMONT_KeyPair( kgParams->pubKey, ( size_t* )&public_key_size, kgParams->privKey, &priv_key_size, &cc_rand, convert_mbedtls_to_cc_rand, &kgParams->kgTempData ) ); if( ret != 0 ) { goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( d, kgParams->privKey, priv_key_size ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &Q->X, kgParams->pubKey, public_key_size ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Q->Z, 1 ) ); } else ret = MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED; cleanup: if ( pHeap ) { mbedtls_zeroize( pHeap, heapSize ); mbedtls_free( pHeap ); } return ( ret ); }
int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; void* pHeap = NULL; size_t heapSize = 0; size_t public_key_size = (grp->nbits+7)/8 ; const CRYS_ECPKI_Domain_t* pDomain = CRYS_ECPKI_GetEcDomain ( convert_mbedtls_grp_id_to_crys_domain_id( grp->id ) ); uint32_t secret_size = ( ( grp->nbits + 7 ) / 8 ) ; const uint32_t secret_size_in_heap = secret_size; uint8_t* secret = mbedtls_calloc( 1, secret_size_in_heap ); if ( secret == NULL ) return ( MBEDTLS_ERR_ECP_ALLOC_FAILED ); /* * Make sure Q is a valid pubkey before using it */ MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) ); if ( pDomain ) { uint8_t temp_buf[ 2 * MAX_KEY_SIZE_IN_BYTES + 1 ] = {0}; cc_ecc_ws_comp_shared_params_t* ecdhParams = mbedtls_calloc( 1, sizeof(cc_ecc_ws_comp_shared_params_t) ); if ( ecdhParams == NULL ) { ret = MBEDTLS_ERR_ECP_ALLOC_FAILED; goto cleanup; } pHeap = ecdhParams; heapSize = sizeof(cc_ecc_ws_comp_shared_params_t); MBEDTLS_MPI_CHK( mbedtls_ecp_point_write_binary( grp, Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &public_key_size, temp_buf, sizeof(temp_buf) ) ); ret = convert_CrysError_to_mbedtls_err( CRYS_ECPKI_BuildPublKey( pDomain, temp_buf, public_key_size, &ecdhParams->pubKey ) ); if ( ret != 0 ) { goto cleanup; } memset ( temp_buf, 0, sizeof(temp_buf) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, temp_buf, mbedtls_mpi_size( d ) ) ); ret = convert_CrysError_to_mbedtls_err( CRYS_ECPKI_BuildPrivKey( pDomain, temp_buf, mbedtls_mpi_size( d ), &ecdhParams->privKey ) ); mbedtls_zeroize( temp_buf, sizeof( temp_buf ) ); if ( ret != 0 ) { goto cleanup; } ret = convert_CrysError_to_mbedtls_err( CRYS_ECDH_SVDP_DH( &ecdhParams->pubKey, &ecdhParams->privKey, secret, &secret_size, &ecdhParams->ecdhTempData ) ); if ( ret != 0 ) { goto cleanup; } } else if ( grp->id == MBEDTLS_ECP_DP_CURVE25519 ) { cc_ecc_25519_comp_shared_params_t* ecdhParams = mbedtls_calloc( 1, sizeof(cc_ecc_25519_comp_shared_params_t) ); if ( ecdhParams == NULL ) { ret = MBEDTLS_ERR_ECP_ALLOC_FAILED; goto cleanup; } pHeap = ecdhParams; heapSize = sizeof(cc_ecc_25519_comp_shared_params_t); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, ecdhParams->privKey, mbedtls_mpi_size( d ) ) ) ; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &Q->X, ecdhParams->pubKey, public_key_size ) ); ret = convert_CrysError_to_mbedtls_err( CRYS_ECMONT_Scalarmult( secret, ( size_t* )&secret_size, ecdhParams->privKey, CURVE_25519_KEY_SIZE , ecdhParams->pubKey, CURVE_25519_KEY_SIZE , &ecdhParams->kgTempData ) ); if ( ret != 0 ) { goto cleanup; } } else { ret = MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( z, secret, secret_size ) ); cleanup: if ( pHeap ) { mbedtls_zeroize( pHeap, heapSize ); mbedtls_free ( pHeap ); } if ( secret ) { mbedtls_zeroize( secret, secret_size_in_heap ); mbedtls_free ( secret ); } return ( ret ); }