mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
Child:
1:9db0e321a9f4
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Public Key abstraction layer
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kenjiArai 0:5b88d5760320 5 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 6 *
kenjiArai 0:5b88d5760320 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kenjiArai 0:5b88d5760320 8 * not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 9 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 12 *
kenjiArai 0:5b88d5760320 13 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kenjiArai 0:5b88d5760320 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 16 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 17 * limitations under the License.
kenjiArai 0:5b88d5760320 18 *
kenjiArai 0:5b88d5760320 19 * This file is part of mbed TLS (https://tls.mbed.org)
kenjiArai 0:5b88d5760320 20 */
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #if !defined(MBEDTLS_CONFIG_FILE)
kenjiArai 0:5b88d5760320 23 #include "mbedtls/config.h"
kenjiArai 0:5b88d5760320 24 #else
kenjiArai 0:5b88d5760320 25 #include MBEDTLS_CONFIG_FILE
kenjiArai 0:5b88d5760320 26 #endif
kenjiArai 0:5b88d5760320 27
kenjiArai 0:5b88d5760320 28 #if defined(MBEDTLS_PK_C)
kenjiArai 0:5b88d5760320 29 #include "mbedtls/pk.h"
kenjiArai 0:5b88d5760320 30 #include "mbedtls/pk_internal.h"
kenjiArai 0:5b88d5760320 31
kenjiArai 0:5b88d5760320 32 #include "mbedtls/platform_util.h"
kenjiArai 0:5b88d5760320 33
kenjiArai 0:5b88d5760320 34 #if defined(MBEDTLS_RSA_C)
kenjiArai 0:5b88d5760320 35 #include "mbedtls/rsa.h"
kenjiArai 0:5b88d5760320 36 #endif
kenjiArai 0:5b88d5760320 37 #if defined(MBEDTLS_ECP_C)
kenjiArai 0:5b88d5760320 38 #include "mbedtls/ecp.h"
kenjiArai 0:5b88d5760320 39 #endif
kenjiArai 0:5b88d5760320 40 #if defined(MBEDTLS_ECDSA_C)
kenjiArai 0:5b88d5760320 41 #include "mbedtls/ecdsa.h"
kenjiArai 0:5b88d5760320 42 #endif
kenjiArai 0:5b88d5760320 43
kenjiArai 0:5b88d5760320 44 #if defined(MBEDTLS_USE_PSA_CRYPTO)
kenjiArai 0:5b88d5760320 45 #include "mbedtls/psa_util.h"
kenjiArai 0:5b88d5760320 46 #endif
kenjiArai 0:5b88d5760320 47
kenjiArai 0:5b88d5760320 48 #include <limits.h>
kenjiArai 0:5b88d5760320 49 #include <stdint.h>
kenjiArai 0:5b88d5760320 50
kenjiArai 0:5b88d5760320 51 /* Parameter validation macros based on platform_util.h */
kenjiArai 0:5b88d5760320 52 #define PK_VALIDATE_RET( cond ) \
kenjiArai 0:5b88d5760320 53 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA )
kenjiArai 0:5b88d5760320 54 #define PK_VALIDATE( cond ) \
kenjiArai 0:5b88d5760320 55 MBEDTLS_INTERNAL_VALIDATE( cond )
kenjiArai 0:5b88d5760320 56
kenjiArai 0:5b88d5760320 57 /*
kenjiArai 0:5b88d5760320 58 * Initialise a mbedtls_pk_context
kenjiArai 0:5b88d5760320 59 */
kenjiArai 0:5b88d5760320 60 void mbedtls_pk_init( mbedtls_pk_context *ctx )
kenjiArai 0:5b88d5760320 61 {
kenjiArai 0:5b88d5760320 62 PK_VALIDATE( ctx != NULL );
kenjiArai 0:5b88d5760320 63
kenjiArai 0:5b88d5760320 64 ctx->pk_info = NULL;
kenjiArai 0:5b88d5760320 65 ctx->pk_ctx = NULL;
kenjiArai 0:5b88d5760320 66 }
kenjiArai 0:5b88d5760320 67
kenjiArai 0:5b88d5760320 68 /*
kenjiArai 0:5b88d5760320 69 * Free (the components of) a mbedtls_pk_context
kenjiArai 0:5b88d5760320 70 */
kenjiArai 0:5b88d5760320 71 void mbedtls_pk_free( mbedtls_pk_context *ctx )
kenjiArai 0:5b88d5760320 72 {
kenjiArai 0:5b88d5760320 73 if( ctx == NULL )
kenjiArai 0:5b88d5760320 74 return;
kenjiArai 0:5b88d5760320 75
kenjiArai 0:5b88d5760320 76 if ( ctx->pk_info != NULL )
kenjiArai 0:5b88d5760320 77 ctx->pk_info->ctx_free_func( ctx->pk_ctx );
kenjiArai 0:5b88d5760320 78
kenjiArai 0:5b88d5760320 79 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_pk_context ) );
kenjiArai 0:5b88d5760320 80 }
kenjiArai 0:5b88d5760320 81
kenjiArai 0:5b88d5760320 82 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
kenjiArai 0:5b88d5760320 83 /*
kenjiArai 0:5b88d5760320 84 * Initialize a restart context
kenjiArai 0:5b88d5760320 85 */
kenjiArai 0:5b88d5760320 86 void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx )
kenjiArai 0:5b88d5760320 87 {
kenjiArai 0:5b88d5760320 88 PK_VALIDATE( ctx != NULL );
kenjiArai 0:5b88d5760320 89 ctx->pk_info = NULL;
kenjiArai 0:5b88d5760320 90 ctx->rs_ctx = NULL;
kenjiArai 0:5b88d5760320 91 }
kenjiArai 0:5b88d5760320 92
kenjiArai 0:5b88d5760320 93 /*
kenjiArai 0:5b88d5760320 94 * Free the components of a restart context
kenjiArai 0:5b88d5760320 95 */
kenjiArai 0:5b88d5760320 96 void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx )
kenjiArai 0:5b88d5760320 97 {
kenjiArai 0:5b88d5760320 98 if( ctx == NULL || ctx->pk_info == NULL ||
kenjiArai 0:5b88d5760320 99 ctx->pk_info->rs_free_func == NULL )
kenjiArai 0:5b88d5760320 100 {
kenjiArai 0:5b88d5760320 101 return;
kenjiArai 0:5b88d5760320 102 }
kenjiArai 0:5b88d5760320 103
kenjiArai 0:5b88d5760320 104 ctx->pk_info->rs_free_func( ctx->rs_ctx );
kenjiArai 0:5b88d5760320 105
kenjiArai 0:5b88d5760320 106 ctx->pk_info = NULL;
kenjiArai 0:5b88d5760320 107 ctx->rs_ctx = NULL;
kenjiArai 0:5b88d5760320 108 }
kenjiArai 0:5b88d5760320 109 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 110
kenjiArai 0:5b88d5760320 111 /*
kenjiArai 0:5b88d5760320 112 * Get pk_info structure from type
kenjiArai 0:5b88d5760320 113 */
kenjiArai 0:5b88d5760320 114 const mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type )
kenjiArai 0:5b88d5760320 115 {
kenjiArai 0:5b88d5760320 116 switch( pk_type ) {
kenjiArai 0:5b88d5760320 117 #if defined(MBEDTLS_RSA_C)
kenjiArai 0:5b88d5760320 118 case MBEDTLS_PK_RSA:
kenjiArai 0:5b88d5760320 119 return( &mbedtls_rsa_info );
kenjiArai 0:5b88d5760320 120 #endif
kenjiArai 0:5b88d5760320 121 #if defined(MBEDTLS_ECP_C)
kenjiArai 0:5b88d5760320 122 case MBEDTLS_PK_ECKEY:
kenjiArai 0:5b88d5760320 123 return( &mbedtls_eckey_info );
kenjiArai 0:5b88d5760320 124 case MBEDTLS_PK_ECKEY_DH:
kenjiArai 0:5b88d5760320 125 return( &mbedtls_eckeydh_info );
kenjiArai 0:5b88d5760320 126 #endif
kenjiArai 0:5b88d5760320 127 #if defined(MBEDTLS_ECDSA_C)
kenjiArai 0:5b88d5760320 128 case MBEDTLS_PK_ECDSA:
kenjiArai 0:5b88d5760320 129 return( &mbedtls_ecdsa_info );
kenjiArai 0:5b88d5760320 130 #endif
kenjiArai 0:5b88d5760320 131 /* MBEDTLS_PK_RSA_ALT omitted on purpose */
kenjiArai 0:5b88d5760320 132 default:
kenjiArai 0:5b88d5760320 133 return( NULL );
kenjiArai 0:5b88d5760320 134 }
kenjiArai 0:5b88d5760320 135 }
kenjiArai 0:5b88d5760320 136
kenjiArai 0:5b88d5760320 137 /*
kenjiArai 0:5b88d5760320 138 * Initialise context
kenjiArai 0:5b88d5760320 139 */
kenjiArai 0:5b88d5760320 140 int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info )
kenjiArai 0:5b88d5760320 141 {
kenjiArai 0:5b88d5760320 142 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 143 if( info == NULL || ctx->pk_info != NULL )
kenjiArai 0:5b88d5760320 144 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 145
kenjiArai 0:5b88d5760320 146 if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
kenjiArai 0:5b88d5760320 147 return( MBEDTLS_ERR_PK_ALLOC_FAILED );
kenjiArai 0:5b88d5760320 148
kenjiArai 0:5b88d5760320 149 ctx->pk_info = info;
kenjiArai 0:5b88d5760320 150
kenjiArai 0:5b88d5760320 151 return( 0 );
kenjiArai 0:5b88d5760320 152 }
kenjiArai 0:5b88d5760320 153
kenjiArai 0:5b88d5760320 154 #if defined(MBEDTLS_USE_PSA_CRYPTO)
kenjiArai 0:5b88d5760320 155 /*
kenjiArai 0:5b88d5760320 156 * Initialise a PSA-wrapping context
kenjiArai 0:5b88d5760320 157 */
kenjiArai 0:5b88d5760320 158 int mbedtls_pk_setup_opaque( mbedtls_pk_context *ctx, const psa_key_handle_t key )
kenjiArai 0:5b88d5760320 159 {
kenjiArai 0:5b88d5760320 160 const mbedtls_pk_info_t * const info = &mbedtls_pk_opaque_info;
kenjiArai 0:5b88d5760320 161 psa_key_handle_t *pk_ctx;
kenjiArai 0:5b88d5760320 162 psa_key_type_t type;
kenjiArai 0:5b88d5760320 163
kenjiArai 0:5b88d5760320 164 if( ctx == NULL || ctx->pk_info != NULL )
kenjiArai 0:5b88d5760320 165 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 166
kenjiArai 0:5b88d5760320 167 if( PSA_SUCCESS != psa_get_key_information( key, &type, NULL ) )
kenjiArai 0:5b88d5760320 168 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 169
kenjiArai 0:5b88d5760320 170 /* Current implementation of can_do() relies on this. */
kenjiArai 0:5b88d5760320 171 if( ! PSA_KEY_TYPE_IS_ECC_KEYPAIR( type ) )
kenjiArai 0:5b88d5760320 172 return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE) ;
kenjiArai 0:5b88d5760320 173
kenjiArai 0:5b88d5760320 174 if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
kenjiArai 0:5b88d5760320 175 return( MBEDTLS_ERR_PK_ALLOC_FAILED );
kenjiArai 0:5b88d5760320 176
kenjiArai 0:5b88d5760320 177 ctx->pk_info = info;
kenjiArai 0:5b88d5760320 178
kenjiArai 0:5b88d5760320 179 pk_ctx = (psa_key_handle_t *) ctx->pk_ctx;
kenjiArai 0:5b88d5760320 180 *pk_ctx = key;
kenjiArai 0:5b88d5760320 181
kenjiArai 0:5b88d5760320 182 return( 0 );
kenjiArai 0:5b88d5760320 183 }
kenjiArai 0:5b88d5760320 184 #endif /* MBEDTLS_USE_PSA_CRYPTO */
kenjiArai 0:5b88d5760320 185
kenjiArai 0:5b88d5760320 186 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
kenjiArai 0:5b88d5760320 187 /*
kenjiArai 0:5b88d5760320 188 * Initialize an RSA-alt context
kenjiArai 0:5b88d5760320 189 */
kenjiArai 0:5b88d5760320 190 int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,
kenjiArai 0:5b88d5760320 191 mbedtls_pk_rsa_alt_decrypt_func decrypt_func,
kenjiArai 0:5b88d5760320 192 mbedtls_pk_rsa_alt_sign_func sign_func,
kenjiArai 0:5b88d5760320 193 mbedtls_pk_rsa_alt_key_len_func key_len_func )
kenjiArai 0:5b88d5760320 194 {
kenjiArai 0:5b88d5760320 195 mbedtls_rsa_alt_context *rsa_alt;
kenjiArai 0:5b88d5760320 196 const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info;
kenjiArai 0:5b88d5760320 197
kenjiArai 0:5b88d5760320 198 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 199 if( ctx->pk_info != NULL )
kenjiArai 0:5b88d5760320 200 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 201
kenjiArai 0:5b88d5760320 202 if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
kenjiArai 0:5b88d5760320 203 return( MBEDTLS_ERR_PK_ALLOC_FAILED );
kenjiArai 0:5b88d5760320 204
kenjiArai 0:5b88d5760320 205 ctx->pk_info = info;
kenjiArai 0:5b88d5760320 206
kenjiArai 0:5b88d5760320 207 rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx;
kenjiArai 0:5b88d5760320 208
kenjiArai 0:5b88d5760320 209 rsa_alt->key = key;
kenjiArai 0:5b88d5760320 210 rsa_alt->decrypt_func = decrypt_func;
kenjiArai 0:5b88d5760320 211 rsa_alt->sign_func = sign_func;
kenjiArai 0:5b88d5760320 212 rsa_alt->key_len_func = key_len_func;
kenjiArai 0:5b88d5760320 213
kenjiArai 0:5b88d5760320 214 return( 0 );
kenjiArai 0:5b88d5760320 215 }
kenjiArai 0:5b88d5760320 216 #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
kenjiArai 0:5b88d5760320 217
kenjiArai 0:5b88d5760320 218 /*
kenjiArai 0:5b88d5760320 219 * Tell if a PK can do the operations of the given type
kenjiArai 0:5b88d5760320 220 */
kenjiArai 0:5b88d5760320 221 int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type )
kenjiArai 0:5b88d5760320 222 {
kenjiArai 0:5b88d5760320 223 /* A context with null pk_info is not set up yet and can't do anything.
kenjiArai 0:5b88d5760320 224 * For backward compatibility, also accept NULL instead of a context
kenjiArai 0:5b88d5760320 225 * pointer. */
kenjiArai 0:5b88d5760320 226 if( ctx == NULL || ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 227 return( 0 );
kenjiArai 0:5b88d5760320 228
kenjiArai 0:5b88d5760320 229 return( ctx->pk_info->can_do( type ) );
kenjiArai 0:5b88d5760320 230 }
kenjiArai 0:5b88d5760320 231
kenjiArai 0:5b88d5760320 232 /*
kenjiArai 0:5b88d5760320 233 * Helper for mbedtls_pk_sign and mbedtls_pk_verify
kenjiArai 0:5b88d5760320 234 */
kenjiArai 0:5b88d5760320 235 static inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len )
kenjiArai 0:5b88d5760320 236 {
kenjiArai 0:5b88d5760320 237 const mbedtls_md_info_t *md_info;
kenjiArai 0:5b88d5760320 238
kenjiArai 0:5b88d5760320 239 if( *hash_len != 0 )
kenjiArai 0:5b88d5760320 240 return( 0 );
kenjiArai 0:5b88d5760320 241
kenjiArai 0:5b88d5760320 242 if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )
kenjiArai 0:5b88d5760320 243 return( -1 );
kenjiArai 0:5b88d5760320 244
kenjiArai 0:5b88d5760320 245 *hash_len = mbedtls_md_get_size( md_info );
kenjiArai 0:5b88d5760320 246 return( 0 );
kenjiArai 0:5b88d5760320 247 }
kenjiArai 0:5b88d5760320 248
kenjiArai 0:5b88d5760320 249 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
kenjiArai 0:5b88d5760320 250 /*
kenjiArai 0:5b88d5760320 251 * Helper to set up a restart context if needed
kenjiArai 0:5b88d5760320 252 */
kenjiArai 0:5b88d5760320 253 static int pk_restart_setup( mbedtls_pk_restart_ctx *ctx,
kenjiArai 0:5b88d5760320 254 const mbedtls_pk_info_t *info )
kenjiArai 0:5b88d5760320 255 {
kenjiArai 0:5b88d5760320 256 /* Don't do anything if already set up or invalid */
kenjiArai 0:5b88d5760320 257 if( ctx == NULL || ctx->pk_info != NULL )
kenjiArai 0:5b88d5760320 258 return( 0 );
kenjiArai 0:5b88d5760320 259
kenjiArai 0:5b88d5760320 260 /* Should never happen when we're called */
kenjiArai 0:5b88d5760320 261 if( info->rs_alloc_func == NULL || info->rs_free_func == NULL )
kenjiArai 0:5b88d5760320 262 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 263
kenjiArai 0:5b88d5760320 264 if( ( ctx->rs_ctx = info->rs_alloc_func() ) == NULL )
kenjiArai 0:5b88d5760320 265 return( MBEDTLS_ERR_PK_ALLOC_FAILED );
kenjiArai 0:5b88d5760320 266
kenjiArai 0:5b88d5760320 267 ctx->pk_info = info;
kenjiArai 0:5b88d5760320 268
kenjiArai 0:5b88d5760320 269 return( 0 );
kenjiArai 0:5b88d5760320 270 }
kenjiArai 0:5b88d5760320 271 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 272
kenjiArai 0:5b88d5760320 273 /*
kenjiArai 0:5b88d5760320 274 * Verify a signature (restartable)
kenjiArai 0:5b88d5760320 275 */
kenjiArai 0:5b88d5760320 276 int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx,
kenjiArai 0:5b88d5760320 277 mbedtls_md_type_t md_alg,
kenjiArai 0:5b88d5760320 278 const unsigned char *hash, size_t hash_len,
kenjiArai 0:5b88d5760320 279 const unsigned char *sig, size_t sig_len,
kenjiArai 0:5b88d5760320 280 mbedtls_pk_restart_ctx *rs_ctx )
kenjiArai 0:5b88d5760320 281 {
kenjiArai 0:5b88d5760320 282 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 283 PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) ||
kenjiArai 0:5b88d5760320 284 hash != NULL );
kenjiArai 0:5b88d5760320 285 PK_VALIDATE_RET( sig != NULL );
kenjiArai 0:5b88d5760320 286
kenjiArai 0:5b88d5760320 287 if( ctx->pk_info == NULL ||
kenjiArai 0:5b88d5760320 288 pk_hashlen_helper( md_alg, &hash_len ) != 0 )
kenjiArai 0:5b88d5760320 289 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 290
kenjiArai 0:5b88d5760320 291 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
kenjiArai 0:5b88d5760320 292 /* optimization: use non-restartable version if restart disabled */
kenjiArai 0:5b88d5760320 293 if( rs_ctx != NULL &&
kenjiArai 0:5b88d5760320 294 mbedtls_ecp_restart_is_enabled() &&
kenjiArai 0:5b88d5760320 295 ctx->pk_info->verify_rs_func != NULL )
kenjiArai 0:5b88d5760320 296 {
kenjiArai 0:5b88d5760320 297 int ret;
kenjiArai 0:5b88d5760320 298
kenjiArai 0:5b88d5760320 299 if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 )
kenjiArai 0:5b88d5760320 300 return( ret );
kenjiArai 0:5b88d5760320 301
kenjiArai 0:5b88d5760320 302 ret = ctx->pk_info->verify_rs_func( ctx->pk_ctx,
kenjiArai 0:5b88d5760320 303 md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx );
kenjiArai 0:5b88d5760320 304
kenjiArai 0:5b88d5760320 305 if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
kenjiArai 0:5b88d5760320 306 mbedtls_pk_restart_free( rs_ctx );
kenjiArai 0:5b88d5760320 307
kenjiArai 0:5b88d5760320 308 return( ret );
kenjiArai 0:5b88d5760320 309 }
kenjiArai 0:5b88d5760320 310 #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 311 (void) rs_ctx;
kenjiArai 0:5b88d5760320 312 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 313
kenjiArai 0:5b88d5760320 314 if( ctx->pk_info->verify_func == NULL )
kenjiArai 0:5b88d5760320 315 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 316
kenjiArai 0:5b88d5760320 317 return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len,
kenjiArai 0:5b88d5760320 318 sig, sig_len ) );
kenjiArai 0:5b88d5760320 319 }
kenjiArai 0:5b88d5760320 320
kenjiArai 0:5b88d5760320 321 /*
kenjiArai 0:5b88d5760320 322 * Verify a signature
kenjiArai 0:5b88d5760320 323 */
kenjiArai 0:5b88d5760320 324 int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
kenjiArai 0:5b88d5760320 325 const unsigned char *hash, size_t hash_len,
kenjiArai 0:5b88d5760320 326 const unsigned char *sig, size_t sig_len )
kenjiArai 0:5b88d5760320 327 {
kenjiArai 0:5b88d5760320 328 return( mbedtls_pk_verify_restartable( ctx, md_alg, hash, hash_len,
kenjiArai 0:5b88d5760320 329 sig, sig_len, NULL ) );
kenjiArai 0:5b88d5760320 330 }
kenjiArai 0:5b88d5760320 331
kenjiArai 0:5b88d5760320 332 /*
kenjiArai 0:5b88d5760320 333 * Verify a signature with options
kenjiArai 0:5b88d5760320 334 */
kenjiArai 0:5b88d5760320 335 int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,
kenjiArai 0:5b88d5760320 336 mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
kenjiArai 0:5b88d5760320 337 const unsigned char *hash, size_t hash_len,
kenjiArai 0:5b88d5760320 338 const unsigned char *sig, size_t sig_len )
kenjiArai 0:5b88d5760320 339 {
kenjiArai 0:5b88d5760320 340 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 341 PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) ||
kenjiArai 0:5b88d5760320 342 hash != NULL );
kenjiArai 0:5b88d5760320 343 PK_VALIDATE_RET( sig != NULL );
kenjiArai 0:5b88d5760320 344
kenjiArai 0:5b88d5760320 345 if( ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 346 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 347
kenjiArai 0:5b88d5760320 348 if( ! mbedtls_pk_can_do( ctx, type ) )
kenjiArai 0:5b88d5760320 349 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 350
kenjiArai 0:5b88d5760320 351 if( type == MBEDTLS_PK_RSASSA_PSS )
kenjiArai 0:5b88d5760320 352 {
kenjiArai 0:5b88d5760320 353 #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21)
kenjiArai 0:5b88d5760320 354 int ret;
kenjiArai 0:5b88d5760320 355 const mbedtls_pk_rsassa_pss_options *pss_opts;
kenjiArai 0:5b88d5760320 356
kenjiArai 0:5b88d5760320 357 #if SIZE_MAX > UINT_MAX
kenjiArai 0:5b88d5760320 358 if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
kenjiArai 0:5b88d5760320 359 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 360 #endif /* SIZE_MAX > UINT_MAX */
kenjiArai 0:5b88d5760320 361
kenjiArai 0:5b88d5760320 362 if( options == NULL )
kenjiArai 0:5b88d5760320 363 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 364
kenjiArai 0:5b88d5760320 365 pss_opts = (const mbedtls_pk_rsassa_pss_options *) options;
kenjiArai 0:5b88d5760320 366
kenjiArai 0:5b88d5760320 367 if( sig_len < mbedtls_pk_get_len( ctx ) )
kenjiArai 0:5b88d5760320 368 return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
kenjiArai 0:5b88d5760320 369
kenjiArai 0:5b88d5760320 370 ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ),
kenjiArai 0:5b88d5760320 371 NULL, NULL, MBEDTLS_RSA_PUBLIC,
kenjiArai 0:5b88d5760320 372 md_alg, (unsigned int) hash_len, hash,
kenjiArai 0:5b88d5760320 373 pss_opts->mgf1_hash_id,
kenjiArai 0:5b88d5760320 374 pss_opts->expected_salt_len,
kenjiArai 0:5b88d5760320 375 sig );
kenjiArai 0:5b88d5760320 376 if( ret != 0 )
kenjiArai 0:5b88d5760320 377 return( ret );
kenjiArai 0:5b88d5760320 378
kenjiArai 0:5b88d5760320 379 if( sig_len > mbedtls_pk_get_len( ctx ) )
kenjiArai 0:5b88d5760320 380 return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
kenjiArai 0:5b88d5760320 381
kenjiArai 0:5b88d5760320 382 return( 0 );
kenjiArai 0:5b88d5760320 383 #else
kenjiArai 0:5b88d5760320 384 return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
kenjiArai 0:5b88d5760320 385 #endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */
kenjiArai 0:5b88d5760320 386 }
kenjiArai 0:5b88d5760320 387
kenjiArai 0:5b88d5760320 388 /* General case: no options */
kenjiArai 0:5b88d5760320 389 if( options != NULL )
kenjiArai 0:5b88d5760320 390 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 391
kenjiArai 0:5b88d5760320 392 return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) );
kenjiArai 0:5b88d5760320 393 }
kenjiArai 0:5b88d5760320 394
kenjiArai 0:5b88d5760320 395 /*
kenjiArai 0:5b88d5760320 396 * Make a signature (restartable)
kenjiArai 0:5b88d5760320 397 */
kenjiArai 0:5b88d5760320 398 int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx,
kenjiArai 0:5b88d5760320 399 mbedtls_md_type_t md_alg,
kenjiArai 0:5b88d5760320 400 const unsigned char *hash, size_t hash_len,
kenjiArai 0:5b88d5760320 401 unsigned char *sig, size_t *sig_len,
kenjiArai 0:5b88d5760320 402 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
kenjiArai 0:5b88d5760320 403 mbedtls_pk_restart_ctx *rs_ctx )
kenjiArai 0:5b88d5760320 404 {
kenjiArai 0:5b88d5760320 405 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 406 PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) ||
kenjiArai 0:5b88d5760320 407 hash != NULL );
kenjiArai 0:5b88d5760320 408 PK_VALIDATE_RET( sig != NULL );
kenjiArai 0:5b88d5760320 409
kenjiArai 0:5b88d5760320 410 if( ctx->pk_info == NULL ||
kenjiArai 0:5b88d5760320 411 pk_hashlen_helper( md_alg, &hash_len ) != 0 )
kenjiArai 0:5b88d5760320 412 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 413
kenjiArai 0:5b88d5760320 414 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
kenjiArai 0:5b88d5760320 415 /* optimization: use non-restartable version if restart disabled */
kenjiArai 0:5b88d5760320 416 if( rs_ctx != NULL &&
kenjiArai 0:5b88d5760320 417 mbedtls_ecp_restart_is_enabled() &&
kenjiArai 0:5b88d5760320 418 ctx->pk_info->sign_rs_func != NULL )
kenjiArai 0:5b88d5760320 419 {
kenjiArai 0:5b88d5760320 420 int ret;
kenjiArai 0:5b88d5760320 421
kenjiArai 0:5b88d5760320 422 if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 )
kenjiArai 0:5b88d5760320 423 return( ret );
kenjiArai 0:5b88d5760320 424
kenjiArai 0:5b88d5760320 425 ret = ctx->pk_info->sign_rs_func( ctx->pk_ctx, md_alg,
kenjiArai 0:5b88d5760320 426 hash, hash_len, sig, sig_len, f_rng, p_rng, rs_ctx->rs_ctx );
kenjiArai 0:5b88d5760320 427
kenjiArai 0:5b88d5760320 428 if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
kenjiArai 0:5b88d5760320 429 mbedtls_pk_restart_free( rs_ctx );
kenjiArai 0:5b88d5760320 430
kenjiArai 0:5b88d5760320 431 return( ret );
kenjiArai 0:5b88d5760320 432 }
kenjiArai 0:5b88d5760320 433 #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 434 (void) rs_ctx;
kenjiArai 0:5b88d5760320 435 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
kenjiArai 0:5b88d5760320 436
kenjiArai 0:5b88d5760320 437 if( ctx->pk_info->sign_func == NULL )
kenjiArai 0:5b88d5760320 438 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 439
kenjiArai 0:5b88d5760320 440 return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len,
kenjiArai 0:5b88d5760320 441 sig, sig_len, f_rng, p_rng ) );
kenjiArai 0:5b88d5760320 442 }
kenjiArai 0:5b88d5760320 443
kenjiArai 0:5b88d5760320 444 /*
kenjiArai 0:5b88d5760320 445 * Make a signature
kenjiArai 0:5b88d5760320 446 */
kenjiArai 0:5b88d5760320 447 int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
kenjiArai 0:5b88d5760320 448 const unsigned char *hash, size_t hash_len,
kenjiArai 0:5b88d5760320 449 unsigned char *sig, size_t *sig_len,
kenjiArai 0:5b88d5760320 450 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kenjiArai 0:5b88d5760320 451 {
kenjiArai 0:5b88d5760320 452 return( mbedtls_pk_sign_restartable( ctx, md_alg, hash, hash_len,
kenjiArai 0:5b88d5760320 453 sig, sig_len, f_rng, p_rng, NULL ) );
kenjiArai 0:5b88d5760320 454 }
kenjiArai 0:5b88d5760320 455
kenjiArai 0:5b88d5760320 456 /*
kenjiArai 0:5b88d5760320 457 * Decrypt message
kenjiArai 0:5b88d5760320 458 */
kenjiArai 0:5b88d5760320 459 int mbedtls_pk_decrypt( mbedtls_pk_context *ctx,
kenjiArai 0:5b88d5760320 460 const unsigned char *input, size_t ilen,
kenjiArai 0:5b88d5760320 461 unsigned char *output, size_t *olen, size_t osize,
kenjiArai 0:5b88d5760320 462 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kenjiArai 0:5b88d5760320 463 {
kenjiArai 0:5b88d5760320 464 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 465 PK_VALIDATE_RET( input != NULL || ilen == 0 );
kenjiArai 0:5b88d5760320 466 PK_VALIDATE_RET( output != NULL || osize == 0 );
kenjiArai 0:5b88d5760320 467 PK_VALIDATE_RET( olen != NULL );
kenjiArai 0:5b88d5760320 468
kenjiArai 0:5b88d5760320 469 if( ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 470 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 471
kenjiArai 0:5b88d5760320 472 if( ctx->pk_info->decrypt_func == NULL )
kenjiArai 0:5b88d5760320 473 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 474
kenjiArai 0:5b88d5760320 475 return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen,
kenjiArai 0:5b88d5760320 476 output, olen, osize, f_rng, p_rng ) );
kenjiArai 0:5b88d5760320 477 }
kenjiArai 0:5b88d5760320 478
kenjiArai 0:5b88d5760320 479 /*
kenjiArai 0:5b88d5760320 480 * Encrypt message
kenjiArai 0:5b88d5760320 481 */
kenjiArai 0:5b88d5760320 482 int mbedtls_pk_encrypt( mbedtls_pk_context *ctx,
kenjiArai 0:5b88d5760320 483 const unsigned char *input, size_t ilen,
kenjiArai 0:5b88d5760320 484 unsigned char *output, size_t *olen, size_t osize,
kenjiArai 0:5b88d5760320 485 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kenjiArai 0:5b88d5760320 486 {
kenjiArai 0:5b88d5760320 487 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 488 PK_VALIDATE_RET( input != NULL || ilen == 0 );
kenjiArai 0:5b88d5760320 489 PK_VALIDATE_RET( output != NULL || osize == 0 );
kenjiArai 0:5b88d5760320 490 PK_VALIDATE_RET( olen != NULL );
kenjiArai 0:5b88d5760320 491
kenjiArai 0:5b88d5760320 492 if( ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 493 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 494
kenjiArai 0:5b88d5760320 495 if( ctx->pk_info->encrypt_func == NULL )
kenjiArai 0:5b88d5760320 496 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 497
kenjiArai 0:5b88d5760320 498 return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen,
kenjiArai 0:5b88d5760320 499 output, olen, osize, f_rng, p_rng ) );
kenjiArai 0:5b88d5760320 500 }
kenjiArai 0:5b88d5760320 501
kenjiArai 0:5b88d5760320 502 /*
kenjiArai 0:5b88d5760320 503 * Check public-private key pair
kenjiArai 0:5b88d5760320 504 */
kenjiArai 0:5b88d5760320 505 int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv )
kenjiArai 0:5b88d5760320 506 {
kenjiArai 0:5b88d5760320 507 PK_VALIDATE_RET( pub != NULL );
kenjiArai 0:5b88d5760320 508 PK_VALIDATE_RET( prv != NULL );
kenjiArai 0:5b88d5760320 509
kenjiArai 0:5b88d5760320 510 if( pub->pk_info == NULL ||
kenjiArai 0:5b88d5760320 511 prv->pk_info == NULL )
kenjiArai 0:5b88d5760320 512 {
kenjiArai 0:5b88d5760320 513 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 514 }
kenjiArai 0:5b88d5760320 515
kenjiArai 0:5b88d5760320 516 if( prv->pk_info->check_pair_func == NULL )
kenjiArai 0:5b88d5760320 517 return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
kenjiArai 0:5b88d5760320 518
kenjiArai 0:5b88d5760320 519 if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT )
kenjiArai 0:5b88d5760320 520 {
kenjiArai 0:5b88d5760320 521 if( pub->pk_info->type != MBEDTLS_PK_RSA )
kenjiArai 0:5b88d5760320 522 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 523 }
kenjiArai 0:5b88d5760320 524 else
kenjiArai 0:5b88d5760320 525 {
kenjiArai 0:5b88d5760320 526 if( pub->pk_info != prv->pk_info )
kenjiArai 0:5b88d5760320 527 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 528 }
kenjiArai 0:5b88d5760320 529
kenjiArai 0:5b88d5760320 530 return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) );
kenjiArai 0:5b88d5760320 531 }
kenjiArai 0:5b88d5760320 532
kenjiArai 0:5b88d5760320 533 /*
kenjiArai 0:5b88d5760320 534 * Get key size in bits
kenjiArai 0:5b88d5760320 535 */
kenjiArai 0:5b88d5760320 536 size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx )
kenjiArai 0:5b88d5760320 537 {
kenjiArai 0:5b88d5760320 538 /* For backward compatibility, accept NULL or a context that
kenjiArai 0:5b88d5760320 539 * isn't set up yet, and return a fake value that should be safe. */
kenjiArai 0:5b88d5760320 540 if( ctx == NULL || ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 541 return( 0 );
kenjiArai 0:5b88d5760320 542
kenjiArai 0:5b88d5760320 543 return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) );
kenjiArai 0:5b88d5760320 544 }
kenjiArai 0:5b88d5760320 545
kenjiArai 0:5b88d5760320 546 /*
kenjiArai 0:5b88d5760320 547 * Export debug information
kenjiArai 0:5b88d5760320 548 */
kenjiArai 0:5b88d5760320 549 int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items )
kenjiArai 0:5b88d5760320 550 {
kenjiArai 0:5b88d5760320 551 PK_VALIDATE_RET( ctx != NULL );
kenjiArai 0:5b88d5760320 552 if( ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 553 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kenjiArai 0:5b88d5760320 554
kenjiArai 0:5b88d5760320 555 if( ctx->pk_info->debug_func == NULL )
kenjiArai 0:5b88d5760320 556 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 557
kenjiArai 0:5b88d5760320 558 ctx->pk_info->debug_func( ctx->pk_ctx, items );
kenjiArai 0:5b88d5760320 559 return( 0 );
kenjiArai 0:5b88d5760320 560 }
kenjiArai 0:5b88d5760320 561
kenjiArai 0:5b88d5760320 562 /*
kenjiArai 0:5b88d5760320 563 * Access the PK type name
kenjiArai 0:5b88d5760320 564 */
kenjiArai 0:5b88d5760320 565 const char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx )
kenjiArai 0:5b88d5760320 566 {
kenjiArai 0:5b88d5760320 567 if( ctx == NULL || ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 568 return( "invalid PK" );
kenjiArai 0:5b88d5760320 569
kenjiArai 0:5b88d5760320 570 return( ctx->pk_info->name );
kenjiArai 0:5b88d5760320 571 }
kenjiArai 0:5b88d5760320 572
kenjiArai 0:5b88d5760320 573 /*
kenjiArai 0:5b88d5760320 574 * Access the PK type
kenjiArai 0:5b88d5760320 575 */
kenjiArai 0:5b88d5760320 576 mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx )
kenjiArai 0:5b88d5760320 577 {
kenjiArai 0:5b88d5760320 578 if( ctx == NULL || ctx->pk_info == NULL )
kenjiArai 0:5b88d5760320 579 return( MBEDTLS_PK_NONE );
kenjiArai 0:5b88d5760320 580
kenjiArai 0:5b88d5760320 581 return( ctx->pk_info->type );
kenjiArai 0:5b88d5760320 582 }
kenjiArai 0:5b88d5760320 583
kenjiArai 0:5b88d5760320 584 #if defined(MBEDTLS_USE_PSA_CRYPTO)
kenjiArai 0:5b88d5760320 585 /*
kenjiArai 0:5b88d5760320 586 * Load the key to a PSA key slot,
kenjiArai 0:5b88d5760320 587 * then turn the PK context into a wrapper for that key slot.
kenjiArai 0:5b88d5760320 588 *
kenjiArai 0:5b88d5760320 589 * Currently only works for EC private keys.
kenjiArai 0:5b88d5760320 590 */
kenjiArai 0:5b88d5760320 591 int mbedtls_pk_wrap_as_opaque( mbedtls_pk_context *pk,
kenjiArai 0:5b88d5760320 592 psa_key_handle_t *slot,
kenjiArai 0:5b88d5760320 593 psa_algorithm_t hash_alg )
kenjiArai 0:5b88d5760320 594 {
kenjiArai 0:5b88d5760320 595 #if !defined(MBEDTLS_ECP_C)
kenjiArai 0:5b88d5760320 596 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 597 #else
kenjiArai 0:5b88d5760320 598 psa_key_handle_t key;
kenjiArai 0:5b88d5760320 599 const mbedtls_ecp_keypair *ec;
kenjiArai 0:5b88d5760320 600 unsigned char d[MBEDTLS_ECP_MAX_BYTES];
kenjiArai 0:5b88d5760320 601 size_t d_len;
kenjiArai 0:5b88d5760320 602 psa_ecc_curve_t curve_id;
kenjiArai 0:5b88d5760320 603 psa_key_type_t key_type;
kenjiArai 0:5b88d5760320 604 psa_key_policy_t policy;
kenjiArai 0:5b88d5760320 605 int ret;
kenjiArai 0:5b88d5760320 606
kenjiArai 0:5b88d5760320 607 /* export the private key material in the format PSA wants */
kenjiArai 0:5b88d5760320 608 if( mbedtls_pk_get_type( pk ) != MBEDTLS_PK_ECKEY )
kenjiArai 0:5b88d5760320 609 return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
kenjiArai 0:5b88d5760320 610
kenjiArai 0:5b88d5760320 611 ec = mbedtls_pk_ec( *pk );
kenjiArai 0:5b88d5760320 612 d_len = ( ec->grp.nbits + 7 ) / 8;
kenjiArai 0:5b88d5760320 613 if( ( ret = mbedtls_mpi_write_binary( &ec->d, d, d_len ) ) != 0 )
kenjiArai 0:5b88d5760320 614 return( ret );
kenjiArai 0:5b88d5760320 615
kenjiArai 0:5b88d5760320 616 curve_id = mbedtls_ecp_curve_info_from_grp_id( ec->grp.id )->tls_id;
kenjiArai 0:5b88d5760320 617 key_type = PSA_KEY_TYPE_ECC_KEYPAIR(
kenjiArai 0:5b88d5760320 618 mbedtls_psa_parse_tls_ecc_group ( curve_id ) );
kenjiArai 0:5b88d5760320 619
kenjiArai 0:5b88d5760320 620 /* allocate a key slot */
kenjiArai 0:5b88d5760320 621 if( PSA_SUCCESS != psa_allocate_key( &key ) )
kenjiArai 0:5b88d5760320 622 return( MBEDTLS_ERR_PK_HW_ACCEL_FAILED );
kenjiArai 0:5b88d5760320 623
kenjiArai 0:5b88d5760320 624 /* set policy */
kenjiArai 0:5b88d5760320 625 policy = psa_key_policy_init();
kenjiArai 0:5b88d5760320 626 psa_key_policy_set_usage( &policy, PSA_KEY_USAGE_SIGN,
kenjiArai 0:5b88d5760320 627 PSA_ALG_ECDSA(hash_alg) );
kenjiArai 0:5b88d5760320 628 if( PSA_SUCCESS != psa_set_key_policy( key, &policy ) )
kenjiArai 0:5b88d5760320 629 return( MBEDTLS_ERR_PK_HW_ACCEL_FAILED );
kenjiArai 0:5b88d5760320 630
kenjiArai 0:5b88d5760320 631 /* import private key in slot */
kenjiArai 0:5b88d5760320 632 if( PSA_SUCCESS != psa_import_key( key, key_type, d, d_len ) )
kenjiArai 0:5b88d5760320 633 return( MBEDTLS_ERR_PK_HW_ACCEL_FAILED );
kenjiArai 0:5b88d5760320 634
kenjiArai 0:5b88d5760320 635 /* remember slot number to be destroyed later by caller */
kenjiArai 0:5b88d5760320 636 *slot = key;
kenjiArai 0:5b88d5760320 637
kenjiArai 0:5b88d5760320 638 /* make PK context wrap the key slot */
kenjiArai 0:5b88d5760320 639 mbedtls_pk_free( pk );
kenjiArai 0:5b88d5760320 640 mbedtls_pk_init( pk );
kenjiArai 0:5b88d5760320 641
kenjiArai 0:5b88d5760320 642 return( mbedtls_pk_setup_opaque( pk, key ) );
kenjiArai 0:5b88d5760320 643 #endif /* MBEDTLS_ECP_C */
kenjiArai 0:5b88d5760320 644 }
kenjiArai 0:5b88d5760320 645 #endif /* MBEDTLS_USE_PSA_CRYPTO */
kenjiArai 0:5b88d5760320 646 #endif /* MBEDTLS_PK_C */