Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers cc_internal.c Source File

cc_internal.c

00001 /*
00002  *  cc_internal.c
00003  *
00004  *  Internal utility functions and definitions,
00005  *  used for converting mbedtls types to CC types, and vice versa
00006  *
00007  *  Copyright (C) 2018, Arm Limited, All Rights Reserved
00008  *  SPDX-License-Identifier: Apache-2.0
00009  *
00010  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
00011  *  not use this file except in compliance with the License.
00012  *  You may obtain a copy of the License at
00013  *
00014  *  http://www.apache.org/licenses/LICENSE-2.0
00015  *
00016  *  Unless required by applicable law or agreed to in writing, software
00017  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00018  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00019  *  See the License for the specific language governing permissions and
00020  *  limitations under the License.
00021  *
00022  */
00023 
00024 #include "cc_internal.h"
00025 #include "crys_ecpki_error.h"
00026 #include "crys_ec_mont_edw_error.h"
00027 #include "mbedtls/platform.h"
00028 
00029 CRYS_ECPKI_DomainID_t  convert_mbedtls_grp_id_to_crys_domain_id( mbedtls_ecp_group_id grp_id )
00030 {
00031     switch( grp_id )
00032     {
00033     case MBEDTLS_ECP_DP_SECP192K1:
00034         return ( CRYS_ECPKI_DomainID_secp192k1  );
00035     case MBEDTLS_ECP_DP_SECP192R1:
00036         return ( CRYS_ECPKI_DomainID_secp192r1  );
00037     case MBEDTLS_ECP_DP_SECP224K1:
00038         return ( CRYS_ECPKI_DomainID_secp224k1  );
00039     case MBEDTLS_ECP_DP_SECP224R1:
00040         return ( CRYS_ECPKI_DomainID_secp224r1  );
00041     case MBEDTLS_ECP_DP_SECP256K1:
00042         return ( CRYS_ECPKI_DomainID_secp256k1  );
00043     case MBEDTLS_ECP_DP_SECP256R1:
00044         return ( CRYS_ECPKI_DomainID_secp256r1  );
00045     case MBEDTLS_ECP_DP_SECP384R1:
00046         return ( CRYS_ECPKI_DomainID_secp384r1  );
00047     case MBEDTLS_ECP_DP_SECP521R1:
00048         return ( CRYS_ECPKI_DomainID_secp521r1  );
00049     default:
00050         return ( CRYS_ECPKI_DomainID_OffMode  );
00051     }
00052 
00053 }
00054 
00055 uint32_t convert_mbedtls_to_cc_rand( void* mbedtls_rnd_ctx, uint16_t outSizeBytes, uint8_t* out_ptr )
00056 {
00057     uint16_t i = 0;
00058     uint8_t temp = 0;
00059     mbedtls_rand_func_container* mbedtls_rand = (mbedtls_rand_func_container*)mbedtls_rnd_ctx;
00060 
00061     if( mbedtls_rand->f_rng( mbedtls_rand->ctx, out_ptr, outSizeBytes ) != 0 )
00062         return ( MBEDTLS_ERR_ECP_RANDOM_FAILED );
00063 
00064     /*
00065      * CC requires the random data as LE, so reversing the data
00066      * (although this is random, but test vectors are in specific Endianess)
00067      */
00068     while ( i < ( outSizeBytes / 2 ) )
00069     {
00070         temp = out_ptr[outSizeBytes - 1 - i];
00071         out_ptr[outSizeBytes - 1 - i] = out_ptr[i];
00072         out_ptr[i] = temp;
00073         ++i;
00074     }
00075     /*
00076      * CC increases the random data by one, to put the vector in the proper range (1 to  n),
00077      * The RFC tests supply a data buffer within range, and in order to generate the proper ephemeral key,
00078      * need to decrease one from this data, before CC increases the data, so the output will be as expected
00079      */
00080     i = 0;
00081     while( out_ptr[i] == 0 )
00082     {
00083         ++i;
00084     }
00085     while( i > 0 )
00086     {
00087         --out_ptr[i];
00088         --i;
00089     }
00090     --out_ptr[0];
00091     return ( 0 );
00092 }
00093 
00094 int convert_CrysError_to_mbedtls_err( CRYSError_t  Crys_err )
00095 {
00096     switch( Crys_err )
00097     {
00098     case CRYS_OK:
00099         return ( 0 );
00100 
00101     case CRYS_ECDH_SVDP_DH_INVALID_USER_PRIV_KEY_PTR_ERROR:
00102     case CRYS_ECDH_SVDP_DH_USER_PRIV_KEY_VALID_TAG_ERROR:
00103     case CRYS_ECDH_SVDP_DH_INVALID_PARTNER_PUBL_KEY_PTR_ERROR:
00104     case CRYS_ECDH_SVDP_DH_PARTNER_PUBL_KEY_VALID_TAG_ERROR:
00105     case CRYS_ECDH_SVDP_DH_INVALID_SHARED_SECRET_VALUE_PTR_ERROR:
00106     case CRYS_ECDH_SVDP_DH_INVALID_TEMP_DATA_PTR_ERROR:
00107     case CRYS_ECDH_SVDP_DH_INVALID_SHARED_SECRET_VALUE_SIZE_PTR_ERROR:
00108     case CRYS_ECDH_SVDP_DH_NOT_CONCENT_PUBL_AND_PRIV_DOMAIN_ID_ERROR:
00109     case CRYS_ECDH_SVDP_DH_INVALID_SHARED_SECRET_VALUE_SIZE_ERROR:
00110     case CRYS_ECMONT_INVALID_INPUT_POINTER_ERROR:
00111     case CRYS_ECMONT_INVALID_INPUT_SIZE_ERROR:
00112     case CRYS_ECMONT_INVALID_DOMAIN_ID_ERROR:
00113     case CRYS_ECDSA_SIGN_INVALID_USER_CONTEXT_PTR_ERROR:
00114     case CRYS_ECDSA_SIGN_INVALID_USER_PRIV_KEY_PTR_ERROR:
00115     case CRYS_ECDSA_SIGN_ILLEGAL_HASH_OP_MODE_ERROR:
00116     case CRYS_ECDSA_SIGN_USER_PRIV_KEY_VALIDATION_TAG_ERROR:
00117     case CRYS_ECDSA_SIGN_USER_CONTEXT_VALIDATION_TAG_ERROR:
00118     case CRYS_ECDSA_SIGN_INVALID_MESSAGE_DATA_IN_PTR_ERROR:
00119     case CRYS_ECDSA_SIGN_INVALID_MESSAGE_DATA_IN_SIZE_ERROR:
00120     case CRYS_ECDSA_SIGN_INVALID_SIGNATURE_OUT_PTR_ERROR:
00121     case CRYS_ECDSA_SIGN_INVALID_SIGNATURE_OUT_SIZE_PTR_ERROR:
00122     case CRYS_ECDSA_SIGN_INVALID_IS_EPHEMER_KEY_INTERNAL_ERROR:
00123     case CRYS_ECDSA_SIGN_INVALID_EPHEMERAL_KEY_PTR_ERROR:
00124     case CRYS_ECDSA_VERIFY_INVALID_SIGNER_PUBL_KEY_PTR_ERROR:
00125     case CRYS_ECDSA_VERIFY_SIGNER_PUBL_KEY_VALIDATION_TAG_ERROR:
00126     case CRYS_ECDSA_VERIFY_INVALID_USER_CONTEXT_PTR_ERROR:
00127     case CRYS_ECDSA_VERIFY_INVALID_SIGNATURE_IN_PTR_ERROR:
00128     case CRYS_ECDSA_VERIFY_INVALID_SIGNATURE_SIZE_ERROR:
00129     case CRYS_ECPKI_INVALID_RND_CTX_PTR_ERROR:
00130     case CRYS_ECPKI_INVALID_RND_FUNC_PTR_ERROR:
00131     case CRYS_ECDSA_SIGN_INVALID_SIGNATURE_OUT_SIZE_ERROR:
00132         return ( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
00133 
00134     case CRYS_ECDSA_VERIFY_INCONSISTENT_VERIFY_ERROR:
00135         return ( MBEDTLS_ERR_ECP_VERIFY_FAILED );
00136 
00137     case CRYS_ECMONT_IS_NOT_SUPPORTED:
00138     case CRYS_ECEDW_IS_NOT_SUPPORTED:
00139         return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
00140 
00141     case CRYS_ECEDW_RND_GEN_VECTOR_FUNC_ERROR:
00142         return ( MBEDTLS_ERR_ECP_RANDOM_FAILED );
00143 
00144     case CRYS_ECPKI_GEN_KEY_INVALID_PRIVATE_KEY_PTR_ERROR:
00145     case CRYS_ECPKI_EXPORT_PUBL_KEY_INVALID_PUBL_KEY_DATA_ERROR:
00146     case CRYS_ECPKI_BUILD_KEY_INVALID_PRIV_KEY_DATA_ERROR:
00147     case CRYS_ECPKI_BUILD_KEY_INVALID_PRIV_KEY_SIZE_ERROR:
00148     case CRYS_ECPKI_BUILD_KEY_INVALID_PUBL_KEY_SIZE_ERROR:
00149         return ( MBEDTLS_ERR_ECP_INVALID_KEY );
00150 
00151     default:
00152         return ( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
00153     }
00154 
00155 
00156 }