1*817466cbSJens Wiklander /* 2*817466cbSJens Wiklander * Public Key abstraction layer 3*817466cbSJens Wiklander * 4*817466cbSJens Wiklander * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 5*817466cbSJens Wiklander * SPDX-License-Identifier: Apache-2.0 6*817466cbSJens Wiklander * 7*817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 8*817466cbSJens Wiklander * not use this file except in compliance with the License. 9*817466cbSJens Wiklander * You may obtain a copy of the License at 10*817466cbSJens Wiklander * 11*817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 12*817466cbSJens Wiklander * 13*817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 14*817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15*817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*817466cbSJens Wiklander * See the License for the specific language governing permissions and 17*817466cbSJens Wiklander * limitations under the License. 18*817466cbSJens Wiklander * 19*817466cbSJens Wiklander * This file is part of mbed TLS (https://tls.mbed.org) 20*817466cbSJens Wiklander */ 21*817466cbSJens Wiklander 22*817466cbSJens Wiklander #if !defined(MBEDTLS_CONFIG_FILE) 23*817466cbSJens Wiklander #include "mbedtls/config.h" 24*817466cbSJens Wiklander #else 25*817466cbSJens Wiklander #include MBEDTLS_CONFIG_FILE 26*817466cbSJens Wiklander #endif 27*817466cbSJens Wiklander 28*817466cbSJens Wiklander #if defined(MBEDTLS_PK_C) 29*817466cbSJens Wiklander #include "mbedtls/pk.h" 30*817466cbSJens Wiklander #include "mbedtls/pk_internal.h" 31*817466cbSJens Wiklander 32*817466cbSJens Wiklander #include "mbedtls/bignum.h" 33*817466cbSJens Wiklander 34*817466cbSJens Wiklander #if defined(MBEDTLS_RSA_C) 35*817466cbSJens Wiklander #include "mbedtls/rsa.h" 36*817466cbSJens Wiklander #endif 37*817466cbSJens Wiklander #if defined(MBEDTLS_ECP_C) 38*817466cbSJens Wiklander #include "mbedtls/ecp.h" 39*817466cbSJens Wiklander #endif 40*817466cbSJens Wiklander #if defined(MBEDTLS_ECDSA_C) 41*817466cbSJens Wiklander #include "mbedtls/ecdsa.h" 42*817466cbSJens Wiklander #endif 43*817466cbSJens Wiklander 44*817466cbSJens Wiklander #include <limits.h> 45*817466cbSJens Wiklander 46*817466cbSJens Wiklander /* Implementation that should never be optimized out by the compiler */ 47*817466cbSJens Wiklander static void mbedtls_zeroize( void *v, size_t n ) { 48*817466cbSJens Wiklander volatile unsigned char *p = v; while( n-- ) *p++ = 0; 49*817466cbSJens Wiklander } 50*817466cbSJens Wiklander 51*817466cbSJens Wiklander /* 52*817466cbSJens Wiklander * Initialise a mbedtls_pk_context 53*817466cbSJens Wiklander */ 54*817466cbSJens Wiklander void mbedtls_pk_init( mbedtls_pk_context *ctx ) 55*817466cbSJens Wiklander { 56*817466cbSJens Wiklander if( ctx == NULL ) 57*817466cbSJens Wiklander return; 58*817466cbSJens Wiklander 59*817466cbSJens Wiklander ctx->pk_info = NULL; 60*817466cbSJens Wiklander ctx->pk_ctx = NULL; 61*817466cbSJens Wiklander } 62*817466cbSJens Wiklander 63*817466cbSJens Wiklander /* 64*817466cbSJens Wiklander * Free (the components of) a mbedtls_pk_context 65*817466cbSJens Wiklander */ 66*817466cbSJens Wiklander void mbedtls_pk_free( mbedtls_pk_context *ctx ) 67*817466cbSJens Wiklander { 68*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 69*817466cbSJens Wiklander return; 70*817466cbSJens Wiklander 71*817466cbSJens Wiklander ctx->pk_info->ctx_free_func( ctx->pk_ctx ); 72*817466cbSJens Wiklander 73*817466cbSJens Wiklander mbedtls_zeroize( ctx, sizeof( mbedtls_pk_context ) ); 74*817466cbSJens Wiklander } 75*817466cbSJens Wiklander 76*817466cbSJens Wiklander /* 77*817466cbSJens Wiklander * Get pk_info structure from type 78*817466cbSJens Wiklander */ 79*817466cbSJens Wiklander const mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ) 80*817466cbSJens Wiklander { 81*817466cbSJens Wiklander switch( pk_type ) { 82*817466cbSJens Wiklander #if defined(MBEDTLS_RSA_C) 83*817466cbSJens Wiklander case MBEDTLS_PK_RSA: 84*817466cbSJens Wiklander return( &mbedtls_rsa_info ); 85*817466cbSJens Wiklander #endif 86*817466cbSJens Wiklander #if defined(MBEDTLS_ECP_C) 87*817466cbSJens Wiklander case MBEDTLS_PK_ECKEY: 88*817466cbSJens Wiklander return( &mbedtls_eckey_info ); 89*817466cbSJens Wiklander case MBEDTLS_PK_ECKEY_DH: 90*817466cbSJens Wiklander return( &mbedtls_eckeydh_info ); 91*817466cbSJens Wiklander #endif 92*817466cbSJens Wiklander #if defined(MBEDTLS_ECDSA_C) 93*817466cbSJens Wiklander case MBEDTLS_PK_ECDSA: 94*817466cbSJens Wiklander return( &mbedtls_ecdsa_info ); 95*817466cbSJens Wiklander #endif 96*817466cbSJens Wiklander /* MBEDTLS_PK_RSA_ALT omitted on purpose */ 97*817466cbSJens Wiklander default: 98*817466cbSJens Wiklander return( NULL ); 99*817466cbSJens Wiklander } 100*817466cbSJens Wiklander } 101*817466cbSJens Wiklander 102*817466cbSJens Wiklander /* 103*817466cbSJens Wiklander * Initialise context 104*817466cbSJens Wiklander */ 105*817466cbSJens Wiklander int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ) 106*817466cbSJens Wiklander { 107*817466cbSJens Wiklander if( ctx == NULL || info == NULL || ctx->pk_info != NULL ) 108*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 109*817466cbSJens Wiklander 110*817466cbSJens Wiklander if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) 111*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_ALLOC_FAILED ); 112*817466cbSJens Wiklander 113*817466cbSJens Wiklander ctx->pk_info = info; 114*817466cbSJens Wiklander 115*817466cbSJens Wiklander return( 0 ); 116*817466cbSJens Wiklander } 117*817466cbSJens Wiklander 118*817466cbSJens Wiklander #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) 119*817466cbSJens Wiklander /* 120*817466cbSJens Wiklander * Initialize an RSA-alt context 121*817466cbSJens Wiklander */ 122*817466cbSJens Wiklander int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, 123*817466cbSJens Wiklander mbedtls_pk_rsa_alt_decrypt_func decrypt_func, 124*817466cbSJens Wiklander mbedtls_pk_rsa_alt_sign_func sign_func, 125*817466cbSJens Wiklander mbedtls_pk_rsa_alt_key_len_func key_len_func ) 126*817466cbSJens Wiklander { 127*817466cbSJens Wiklander mbedtls_rsa_alt_context *rsa_alt; 128*817466cbSJens Wiklander const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info; 129*817466cbSJens Wiklander 130*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info != NULL ) 131*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 132*817466cbSJens Wiklander 133*817466cbSJens Wiklander if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) 134*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_ALLOC_FAILED ); 135*817466cbSJens Wiklander 136*817466cbSJens Wiklander ctx->pk_info = info; 137*817466cbSJens Wiklander 138*817466cbSJens Wiklander rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx; 139*817466cbSJens Wiklander 140*817466cbSJens Wiklander rsa_alt->key = key; 141*817466cbSJens Wiklander rsa_alt->decrypt_func = decrypt_func; 142*817466cbSJens Wiklander rsa_alt->sign_func = sign_func; 143*817466cbSJens Wiklander rsa_alt->key_len_func = key_len_func; 144*817466cbSJens Wiklander 145*817466cbSJens Wiklander return( 0 ); 146*817466cbSJens Wiklander } 147*817466cbSJens Wiklander #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ 148*817466cbSJens Wiklander 149*817466cbSJens Wiklander /* 150*817466cbSJens Wiklander * Tell if a PK can do the operations of the given type 151*817466cbSJens Wiklander */ 152*817466cbSJens Wiklander int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ) 153*817466cbSJens Wiklander { 154*817466cbSJens Wiklander /* null or NONE context can't do anything */ 155*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 156*817466cbSJens Wiklander return( 0 ); 157*817466cbSJens Wiklander 158*817466cbSJens Wiklander return( ctx->pk_info->can_do( type ) ); 159*817466cbSJens Wiklander } 160*817466cbSJens Wiklander 161*817466cbSJens Wiklander /* 162*817466cbSJens Wiklander * Helper for mbedtls_pk_sign and mbedtls_pk_verify 163*817466cbSJens Wiklander */ 164*817466cbSJens Wiklander static inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len ) 165*817466cbSJens Wiklander { 166*817466cbSJens Wiklander const mbedtls_md_info_t *md_info; 167*817466cbSJens Wiklander 168*817466cbSJens Wiklander if( *hash_len != 0 ) 169*817466cbSJens Wiklander return( 0 ); 170*817466cbSJens Wiklander 171*817466cbSJens Wiklander if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL ) 172*817466cbSJens Wiklander return( -1 ); 173*817466cbSJens Wiklander 174*817466cbSJens Wiklander *hash_len = mbedtls_md_get_size( md_info ); 175*817466cbSJens Wiklander return( 0 ); 176*817466cbSJens Wiklander } 177*817466cbSJens Wiklander 178*817466cbSJens Wiklander /* 179*817466cbSJens Wiklander * Verify a signature 180*817466cbSJens Wiklander */ 181*817466cbSJens Wiklander int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, 182*817466cbSJens Wiklander const unsigned char *hash, size_t hash_len, 183*817466cbSJens Wiklander const unsigned char *sig, size_t sig_len ) 184*817466cbSJens Wiklander { 185*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL || 186*817466cbSJens Wiklander pk_hashlen_helper( md_alg, &hash_len ) != 0 ) 187*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 188*817466cbSJens Wiklander 189*817466cbSJens Wiklander if( ctx->pk_info->verify_func == NULL ) 190*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 191*817466cbSJens Wiklander 192*817466cbSJens Wiklander return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len, 193*817466cbSJens Wiklander sig, sig_len ) ); 194*817466cbSJens Wiklander } 195*817466cbSJens Wiklander 196*817466cbSJens Wiklander /* 197*817466cbSJens Wiklander * Verify a signature with options 198*817466cbSJens Wiklander */ 199*817466cbSJens Wiklander int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, 200*817466cbSJens Wiklander mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, 201*817466cbSJens Wiklander const unsigned char *hash, size_t hash_len, 202*817466cbSJens Wiklander const unsigned char *sig, size_t sig_len ) 203*817466cbSJens Wiklander { 204*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 205*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 206*817466cbSJens Wiklander 207*817466cbSJens Wiklander if( ! mbedtls_pk_can_do( ctx, type ) ) 208*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 209*817466cbSJens Wiklander 210*817466cbSJens Wiklander if( type == MBEDTLS_PK_RSASSA_PSS ) 211*817466cbSJens Wiklander { 212*817466cbSJens Wiklander #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21) 213*817466cbSJens Wiklander int ret; 214*817466cbSJens Wiklander const mbedtls_pk_rsassa_pss_options *pss_opts; 215*817466cbSJens Wiklander 216*817466cbSJens Wiklander #if defined(MBEDTLS_HAVE_INT64) 217*817466cbSJens Wiklander if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) 218*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 219*817466cbSJens Wiklander #endif /* MBEDTLS_HAVE_INT64 */ 220*817466cbSJens Wiklander 221*817466cbSJens Wiklander if( options == NULL ) 222*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 223*817466cbSJens Wiklander 224*817466cbSJens Wiklander pss_opts = (const mbedtls_pk_rsassa_pss_options *) options; 225*817466cbSJens Wiklander 226*817466cbSJens Wiklander if( sig_len < mbedtls_pk_get_len( ctx ) ) 227*817466cbSJens Wiklander return( MBEDTLS_ERR_RSA_VERIFY_FAILED ); 228*817466cbSJens Wiklander 229*817466cbSJens Wiklander ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ), 230*817466cbSJens Wiklander NULL, NULL, MBEDTLS_RSA_PUBLIC, 231*817466cbSJens Wiklander md_alg, (unsigned int) hash_len, hash, 232*817466cbSJens Wiklander pss_opts->mgf1_hash_id, 233*817466cbSJens Wiklander pss_opts->expected_salt_len, 234*817466cbSJens Wiklander sig ); 235*817466cbSJens Wiklander if( ret != 0 ) 236*817466cbSJens Wiklander return( ret ); 237*817466cbSJens Wiklander 238*817466cbSJens Wiklander if( sig_len > mbedtls_pk_get_len( ctx ) ) 239*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); 240*817466cbSJens Wiklander 241*817466cbSJens Wiklander return( 0 ); 242*817466cbSJens Wiklander #else 243*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); 244*817466cbSJens Wiklander #endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */ 245*817466cbSJens Wiklander } 246*817466cbSJens Wiklander 247*817466cbSJens Wiklander /* General case: no options */ 248*817466cbSJens Wiklander if( options != NULL ) 249*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 250*817466cbSJens Wiklander 251*817466cbSJens Wiklander return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) ); 252*817466cbSJens Wiklander } 253*817466cbSJens Wiklander 254*817466cbSJens Wiklander /* 255*817466cbSJens Wiklander * Make a signature 256*817466cbSJens Wiklander */ 257*817466cbSJens Wiklander int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, 258*817466cbSJens Wiklander const unsigned char *hash, size_t hash_len, 259*817466cbSJens Wiklander unsigned char *sig, size_t *sig_len, 260*817466cbSJens Wiklander int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) 261*817466cbSJens Wiklander { 262*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL || 263*817466cbSJens Wiklander pk_hashlen_helper( md_alg, &hash_len ) != 0 ) 264*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 265*817466cbSJens Wiklander 266*817466cbSJens Wiklander if( ctx->pk_info->sign_func == NULL ) 267*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 268*817466cbSJens Wiklander 269*817466cbSJens Wiklander return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len, 270*817466cbSJens Wiklander sig, sig_len, f_rng, p_rng ) ); 271*817466cbSJens Wiklander } 272*817466cbSJens Wiklander 273*817466cbSJens Wiklander /* 274*817466cbSJens Wiklander * Decrypt message 275*817466cbSJens Wiklander */ 276*817466cbSJens Wiklander int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, 277*817466cbSJens Wiklander const unsigned char *input, size_t ilen, 278*817466cbSJens Wiklander unsigned char *output, size_t *olen, size_t osize, 279*817466cbSJens Wiklander int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) 280*817466cbSJens Wiklander { 281*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 282*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 283*817466cbSJens Wiklander 284*817466cbSJens Wiklander if( ctx->pk_info->decrypt_func == NULL ) 285*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 286*817466cbSJens Wiklander 287*817466cbSJens Wiklander return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen, 288*817466cbSJens Wiklander output, olen, osize, f_rng, p_rng ) ); 289*817466cbSJens Wiklander } 290*817466cbSJens Wiklander 291*817466cbSJens Wiklander /* 292*817466cbSJens Wiklander * Encrypt message 293*817466cbSJens Wiklander */ 294*817466cbSJens Wiklander int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, 295*817466cbSJens Wiklander const unsigned char *input, size_t ilen, 296*817466cbSJens Wiklander unsigned char *output, size_t *olen, size_t osize, 297*817466cbSJens Wiklander int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) 298*817466cbSJens Wiklander { 299*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 300*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 301*817466cbSJens Wiklander 302*817466cbSJens Wiklander if( ctx->pk_info->encrypt_func == NULL ) 303*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 304*817466cbSJens Wiklander 305*817466cbSJens Wiklander return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen, 306*817466cbSJens Wiklander output, olen, osize, f_rng, p_rng ) ); 307*817466cbSJens Wiklander } 308*817466cbSJens Wiklander 309*817466cbSJens Wiklander /* 310*817466cbSJens Wiklander * Check public-private key pair 311*817466cbSJens Wiklander */ 312*817466cbSJens Wiklander int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ) 313*817466cbSJens Wiklander { 314*817466cbSJens Wiklander if( pub == NULL || pub->pk_info == NULL || 315*817466cbSJens Wiklander prv == NULL || prv->pk_info == NULL || 316*817466cbSJens Wiklander prv->pk_info->check_pair_func == NULL ) 317*817466cbSJens Wiklander { 318*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 319*817466cbSJens Wiklander } 320*817466cbSJens Wiklander 321*817466cbSJens Wiklander if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT ) 322*817466cbSJens Wiklander { 323*817466cbSJens Wiklander if( pub->pk_info->type != MBEDTLS_PK_RSA ) 324*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 325*817466cbSJens Wiklander } 326*817466cbSJens Wiklander else 327*817466cbSJens Wiklander { 328*817466cbSJens Wiklander if( pub->pk_info != prv->pk_info ) 329*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 330*817466cbSJens Wiklander } 331*817466cbSJens Wiklander 332*817466cbSJens Wiklander return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) ); 333*817466cbSJens Wiklander } 334*817466cbSJens Wiklander 335*817466cbSJens Wiklander /* 336*817466cbSJens Wiklander * Get key size in bits 337*817466cbSJens Wiklander */ 338*817466cbSJens Wiklander size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ) 339*817466cbSJens Wiklander { 340*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 341*817466cbSJens Wiklander return( 0 ); 342*817466cbSJens Wiklander 343*817466cbSJens Wiklander return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) ); 344*817466cbSJens Wiklander } 345*817466cbSJens Wiklander 346*817466cbSJens Wiklander /* 347*817466cbSJens Wiklander * Export debug information 348*817466cbSJens Wiklander */ 349*817466cbSJens Wiklander int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ) 350*817466cbSJens Wiklander { 351*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 352*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); 353*817466cbSJens Wiklander 354*817466cbSJens Wiklander if( ctx->pk_info->debug_func == NULL ) 355*817466cbSJens Wiklander return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); 356*817466cbSJens Wiklander 357*817466cbSJens Wiklander ctx->pk_info->debug_func( ctx->pk_ctx, items ); 358*817466cbSJens Wiklander return( 0 ); 359*817466cbSJens Wiklander } 360*817466cbSJens Wiklander 361*817466cbSJens Wiklander /* 362*817466cbSJens Wiklander * Access the PK type name 363*817466cbSJens Wiklander */ 364*817466cbSJens Wiklander const char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx ) 365*817466cbSJens Wiklander { 366*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 367*817466cbSJens Wiklander return( "invalid PK" ); 368*817466cbSJens Wiklander 369*817466cbSJens Wiklander return( ctx->pk_info->name ); 370*817466cbSJens Wiklander } 371*817466cbSJens Wiklander 372*817466cbSJens Wiklander /* 373*817466cbSJens Wiklander * Access the PK type 374*817466cbSJens Wiklander */ 375*817466cbSJens Wiklander mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ) 376*817466cbSJens Wiklander { 377*817466cbSJens Wiklander if( ctx == NULL || ctx->pk_info == NULL ) 378*817466cbSJens Wiklander return( MBEDTLS_PK_NONE ); 379*817466cbSJens Wiklander 380*817466cbSJens Wiklander return( ctx->pk_info->type ); 381*817466cbSJens Wiklander } 382*817466cbSJens Wiklander 383*817466cbSJens Wiklander #endif /* MBEDTLS_PK_C */ 384