takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * Public Key abstraction layer: wrapper functions
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kadonotakashi 0:8fdf9a60065b 5 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 6 *
kadonotakashi 0:8fdf9a60065b 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kadonotakashi 0:8fdf9a60065b 8 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 9 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 12 *
kadonotakashi 0:8fdf9a60065b 13 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 16 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 17 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 18 *
kadonotakashi 0:8fdf9a60065b 19 * This file is part of mbed TLS (https://tls.mbed.org)
kadonotakashi 0:8fdf9a60065b 20 */
kadonotakashi 0:8fdf9a60065b 21
kadonotakashi 0:8fdf9a60065b 22 #if !defined(MBEDTLS_CONFIG_FILE)
kadonotakashi 0:8fdf9a60065b 23 #include "mbedtls/config.h"
kadonotakashi 0:8fdf9a60065b 24 #else
kadonotakashi 0:8fdf9a60065b 25 #include MBEDTLS_CONFIG_FILE
kadonotakashi 0:8fdf9a60065b 26 #endif
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 #if defined(MBEDTLS_PK_C)
kadonotakashi 0:8fdf9a60065b 29 #include "mbedtls/pk_internal.h"
kadonotakashi 0:8fdf9a60065b 30
kadonotakashi 0:8fdf9a60065b 31 /* Even if RSA not activated, for the sake of RSA-alt */
kadonotakashi 0:8fdf9a60065b 32 #include "mbedtls/rsa.h"
kadonotakashi 0:8fdf9a60065b 33
kadonotakashi 0:8fdf9a60065b 34 #include <string.h>
kadonotakashi 0:8fdf9a60065b 35
kadonotakashi 0:8fdf9a60065b 36 #if defined(MBEDTLS_ECP_C)
kadonotakashi 0:8fdf9a60065b 37 #include "mbedtls/ecp.h"
kadonotakashi 0:8fdf9a60065b 38 #endif
kadonotakashi 0:8fdf9a60065b 39
kadonotakashi 0:8fdf9a60065b 40 #if defined(MBEDTLS_ECDSA_C)
kadonotakashi 0:8fdf9a60065b 41 #include "mbedtls/ecdsa.h"
kadonotakashi 0:8fdf9a60065b 42 #endif
kadonotakashi 0:8fdf9a60065b 43
kadonotakashi 0:8fdf9a60065b 44 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
kadonotakashi 0:8fdf9a60065b 45 #include "mbedtls/platform_util.h"
kadonotakashi 0:8fdf9a60065b 46 #endif
kadonotakashi 0:8fdf9a60065b 47
kadonotakashi 0:8fdf9a60065b 48 #if defined(MBEDTLS_PLATFORM_C)
kadonotakashi 0:8fdf9a60065b 49 #include "mbedtls/platform.h"
kadonotakashi 0:8fdf9a60065b 50 #else
kadonotakashi 0:8fdf9a60065b 51 #include <stdlib.h>
kadonotakashi 0:8fdf9a60065b 52 #define mbedtls_calloc calloc
kadonotakashi 0:8fdf9a60065b 53 #define mbedtls_free free
kadonotakashi 0:8fdf9a60065b 54 #endif
kadonotakashi 0:8fdf9a60065b 55
kadonotakashi 0:8fdf9a60065b 56 #include <limits.h>
kadonotakashi 0:8fdf9a60065b 57 #include <stdint.h>
kadonotakashi 0:8fdf9a60065b 58
kadonotakashi 0:8fdf9a60065b 59 #if defined(MBEDTLS_RSA_C)
kadonotakashi 0:8fdf9a60065b 60 static int rsa_can_do( mbedtls_pk_type_t type )
kadonotakashi 0:8fdf9a60065b 61 {
kadonotakashi 0:8fdf9a60065b 62 return( type == MBEDTLS_PK_RSA ||
kadonotakashi 0:8fdf9a60065b 63 type == MBEDTLS_PK_RSASSA_PSS );
kadonotakashi 0:8fdf9a60065b 64 }
kadonotakashi 0:8fdf9a60065b 65
kadonotakashi 0:8fdf9a60065b 66 static size_t rsa_get_bitlen( const void *ctx )
kadonotakashi 0:8fdf9a60065b 67 {
kadonotakashi 0:8fdf9a60065b 68 const mbedtls_rsa_context * rsa = (const mbedtls_rsa_context *) ctx;
kadonotakashi 0:8fdf9a60065b 69 return( 8 * mbedtls_rsa_get_len( rsa ) );
kadonotakashi 0:8fdf9a60065b 70 }
kadonotakashi 0:8fdf9a60065b 71
kadonotakashi 0:8fdf9a60065b 72 static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 73 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 74 const unsigned char *sig, size_t sig_len )
kadonotakashi 0:8fdf9a60065b 75 {
kadonotakashi 0:8fdf9a60065b 76 int ret;
kadonotakashi 0:8fdf9a60065b 77 mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
kadonotakashi 0:8fdf9a60065b 78 size_t rsa_len = mbedtls_rsa_get_len( rsa );
kadonotakashi 0:8fdf9a60065b 79
kadonotakashi 0:8fdf9a60065b 80 #if SIZE_MAX > UINT_MAX
kadonotakashi 0:8fdf9a60065b 81 if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
kadonotakashi 0:8fdf9a60065b 82 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kadonotakashi 0:8fdf9a60065b 83 #endif /* SIZE_MAX > UINT_MAX */
kadonotakashi 0:8fdf9a60065b 84
kadonotakashi 0:8fdf9a60065b 85 if( sig_len < rsa_len )
kadonotakashi 0:8fdf9a60065b 86 return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
kadonotakashi 0:8fdf9a60065b 87
kadonotakashi 0:8fdf9a60065b 88 if( ( ret = mbedtls_rsa_pkcs1_verify( rsa, NULL, NULL,
kadonotakashi 0:8fdf9a60065b 89 MBEDTLS_RSA_PUBLIC, md_alg,
kadonotakashi 0:8fdf9a60065b 90 (unsigned int) hash_len, hash, sig ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 91 return( ret );
kadonotakashi 0:8fdf9a60065b 92
kadonotakashi 0:8fdf9a60065b 93 /* The buffer contains a valid signature followed by extra data.
kadonotakashi 0:8fdf9a60065b 94 * We have a special error code for that so that so that callers can
kadonotakashi 0:8fdf9a60065b 95 * use mbedtls_pk_verify() to check "Does the buffer start with a
kadonotakashi 0:8fdf9a60065b 96 * valid signature?" and not just "Does the buffer contain a valid
kadonotakashi 0:8fdf9a60065b 97 * signature?". */
kadonotakashi 0:8fdf9a60065b 98 if( sig_len > rsa_len )
kadonotakashi 0:8fdf9a60065b 99 return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
kadonotakashi 0:8fdf9a60065b 100
kadonotakashi 0:8fdf9a60065b 101 return( 0 );
kadonotakashi 0:8fdf9a60065b 102 }
kadonotakashi 0:8fdf9a60065b 103
kadonotakashi 0:8fdf9a60065b 104 static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 105 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 106 unsigned char *sig, size_t *sig_len,
kadonotakashi 0:8fdf9a60065b 107 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 108 {
kadonotakashi 0:8fdf9a60065b 109 mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
kadonotakashi 0:8fdf9a60065b 110
kadonotakashi 0:8fdf9a60065b 111 #if SIZE_MAX > UINT_MAX
kadonotakashi 0:8fdf9a60065b 112 if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
kadonotakashi 0:8fdf9a60065b 113 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kadonotakashi 0:8fdf9a60065b 114 #endif /* SIZE_MAX > UINT_MAX */
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 *sig_len = mbedtls_rsa_get_len( rsa );
kadonotakashi 0:8fdf9a60065b 117
kadonotakashi 0:8fdf9a60065b 118 return( mbedtls_rsa_pkcs1_sign( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
kadonotakashi 0:8fdf9a60065b 119 md_alg, (unsigned int) hash_len, hash, sig ) );
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 static int rsa_decrypt_wrap( void *ctx,
kadonotakashi 0:8fdf9a60065b 123 const unsigned char *input, size_t ilen,
kadonotakashi 0:8fdf9a60065b 124 unsigned char *output, size_t *olen, size_t osize,
kadonotakashi 0:8fdf9a60065b 125 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 126 {
kadonotakashi 0:8fdf9a60065b 127 mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
kadonotakashi 0:8fdf9a60065b 128
kadonotakashi 0:8fdf9a60065b 129 if( ilen != mbedtls_rsa_get_len( rsa ) )
kadonotakashi 0:8fdf9a60065b 130 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
kadonotakashi 0:8fdf9a60065b 131
kadonotakashi 0:8fdf9a60065b 132 return( mbedtls_rsa_pkcs1_decrypt( rsa, f_rng, p_rng,
kadonotakashi 0:8fdf9a60065b 133 MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
kadonotakashi 0:8fdf9a60065b 134 }
kadonotakashi 0:8fdf9a60065b 135
kadonotakashi 0:8fdf9a60065b 136 static int rsa_encrypt_wrap( void *ctx,
kadonotakashi 0:8fdf9a60065b 137 const unsigned char *input, size_t ilen,
kadonotakashi 0:8fdf9a60065b 138 unsigned char *output, size_t *olen, size_t osize,
kadonotakashi 0:8fdf9a60065b 139 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 140 {
kadonotakashi 0:8fdf9a60065b 141 mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
kadonotakashi 0:8fdf9a60065b 142 *olen = mbedtls_rsa_get_len( rsa );
kadonotakashi 0:8fdf9a60065b 143
kadonotakashi 0:8fdf9a60065b 144 if( *olen > osize )
kadonotakashi 0:8fdf9a60065b 145 return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
kadonotakashi 0:8fdf9a60065b 146
kadonotakashi 0:8fdf9a60065b 147 return( mbedtls_rsa_pkcs1_encrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PUBLIC,
kadonotakashi 0:8fdf9a60065b 148 ilen, input, output ) );
kadonotakashi 0:8fdf9a60065b 149 }
kadonotakashi 0:8fdf9a60065b 150
kadonotakashi 0:8fdf9a60065b 151 static int rsa_check_pair_wrap( const void *pub, const void *prv )
kadonotakashi 0:8fdf9a60065b 152 {
kadonotakashi 0:8fdf9a60065b 153 return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub,
kadonotakashi 0:8fdf9a60065b 154 (const mbedtls_rsa_context *) prv ) );
kadonotakashi 0:8fdf9a60065b 155 }
kadonotakashi 0:8fdf9a60065b 156
kadonotakashi 0:8fdf9a60065b 157 static void *rsa_alloc_wrap( void )
kadonotakashi 0:8fdf9a60065b 158 {
kadonotakashi 0:8fdf9a60065b 159 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) );
kadonotakashi 0:8fdf9a60065b 160
kadonotakashi 0:8fdf9a60065b 161 if( ctx != NULL )
kadonotakashi 0:8fdf9a60065b 162 mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 );
kadonotakashi 0:8fdf9a60065b 163
kadonotakashi 0:8fdf9a60065b 164 return( ctx );
kadonotakashi 0:8fdf9a60065b 165 }
kadonotakashi 0:8fdf9a60065b 166
kadonotakashi 0:8fdf9a60065b 167 static void rsa_free_wrap( void *ctx )
kadonotakashi 0:8fdf9a60065b 168 {
kadonotakashi 0:8fdf9a60065b 169 mbedtls_rsa_free( (mbedtls_rsa_context *) ctx );
kadonotakashi 0:8fdf9a60065b 170 mbedtls_free( ctx );
kadonotakashi 0:8fdf9a60065b 171 }
kadonotakashi 0:8fdf9a60065b 172
kadonotakashi 0:8fdf9a60065b 173 static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items )
kadonotakashi 0:8fdf9a60065b 174 {
kadonotakashi 0:8fdf9a60065b 175 items->type = MBEDTLS_PK_DEBUG_MPI;
kadonotakashi 0:8fdf9a60065b 176 items->name = "rsa.N";
kadonotakashi 0:8fdf9a60065b 177 items->value = &( ((mbedtls_rsa_context *) ctx)->N );
kadonotakashi 0:8fdf9a60065b 178
kadonotakashi 0:8fdf9a60065b 179 items++;
kadonotakashi 0:8fdf9a60065b 180
kadonotakashi 0:8fdf9a60065b 181 items->type = MBEDTLS_PK_DEBUG_MPI;
kadonotakashi 0:8fdf9a60065b 182 items->name = "rsa.E";
kadonotakashi 0:8fdf9a60065b 183 items->value = &( ((mbedtls_rsa_context *) ctx)->E );
kadonotakashi 0:8fdf9a60065b 184 }
kadonotakashi 0:8fdf9a60065b 185
kadonotakashi 0:8fdf9a60065b 186 const mbedtls_pk_info_t mbedtls_rsa_info = {
kadonotakashi 0:8fdf9a60065b 187 MBEDTLS_PK_RSA,
kadonotakashi 0:8fdf9a60065b 188 "RSA",
kadonotakashi 0:8fdf9a60065b 189 rsa_get_bitlen,
kadonotakashi 0:8fdf9a60065b 190 rsa_can_do,
kadonotakashi 0:8fdf9a60065b 191 rsa_verify_wrap,
kadonotakashi 0:8fdf9a60065b 192 rsa_sign_wrap,
kadonotakashi 0:8fdf9a60065b 193 rsa_decrypt_wrap,
kadonotakashi 0:8fdf9a60065b 194 rsa_encrypt_wrap,
kadonotakashi 0:8fdf9a60065b 195 rsa_check_pair_wrap,
kadonotakashi 0:8fdf9a60065b 196 rsa_alloc_wrap,
kadonotakashi 0:8fdf9a60065b 197 rsa_free_wrap,
kadonotakashi 0:8fdf9a60065b 198 rsa_debug,
kadonotakashi 0:8fdf9a60065b 199 };
kadonotakashi 0:8fdf9a60065b 200 #endif /* MBEDTLS_RSA_C */
kadonotakashi 0:8fdf9a60065b 201
kadonotakashi 0:8fdf9a60065b 202 #if defined(MBEDTLS_ECP_C)
kadonotakashi 0:8fdf9a60065b 203 /*
kadonotakashi 0:8fdf9a60065b 204 * Generic EC key
kadonotakashi 0:8fdf9a60065b 205 */
kadonotakashi 0:8fdf9a60065b 206 static int eckey_can_do( mbedtls_pk_type_t type )
kadonotakashi 0:8fdf9a60065b 207 {
kadonotakashi 0:8fdf9a60065b 208 return( type == MBEDTLS_PK_ECKEY ||
kadonotakashi 0:8fdf9a60065b 209 type == MBEDTLS_PK_ECKEY_DH ||
kadonotakashi 0:8fdf9a60065b 210 type == MBEDTLS_PK_ECDSA );
kadonotakashi 0:8fdf9a60065b 211 }
kadonotakashi 0:8fdf9a60065b 212
kadonotakashi 0:8fdf9a60065b 213 static size_t eckey_get_bitlen( const void *ctx )
kadonotakashi 0:8fdf9a60065b 214 {
kadonotakashi 0:8fdf9a60065b 215 return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits );
kadonotakashi 0:8fdf9a60065b 216 }
kadonotakashi 0:8fdf9a60065b 217
kadonotakashi 0:8fdf9a60065b 218 #if defined(MBEDTLS_ECDSA_C)
kadonotakashi 0:8fdf9a60065b 219 /* Forward declarations */
kadonotakashi 0:8fdf9a60065b 220 static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 221 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 222 const unsigned char *sig, size_t sig_len );
kadonotakashi 0:8fdf9a60065b 223
kadonotakashi 0:8fdf9a60065b 224 static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 225 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 226 unsigned char *sig, size_t *sig_len,
kadonotakashi 0:8fdf9a60065b 227 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
kadonotakashi 0:8fdf9a60065b 228
kadonotakashi 0:8fdf9a60065b 229 static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 230 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 231 const unsigned char *sig, size_t sig_len )
kadonotakashi 0:8fdf9a60065b 232 {
kadonotakashi 0:8fdf9a60065b 233 int ret;
kadonotakashi 0:8fdf9a60065b 234 mbedtls_ecdsa_context ecdsa;
kadonotakashi 0:8fdf9a60065b 235
kadonotakashi 0:8fdf9a60065b 236 mbedtls_ecdsa_init( &ecdsa );
kadonotakashi 0:8fdf9a60065b 237
kadonotakashi 0:8fdf9a60065b 238 if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
kadonotakashi 0:8fdf9a60065b 239 ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len );
kadonotakashi 0:8fdf9a60065b 240
kadonotakashi 0:8fdf9a60065b 241 mbedtls_ecdsa_free( &ecdsa );
kadonotakashi 0:8fdf9a60065b 242
kadonotakashi 0:8fdf9a60065b 243 return( ret );
kadonotakashi 0:8fdf9a60065b 244 }
kadonotakashi 0:8fdf9a60065b 245
kadonotakashi 0:8fdf9a60065b 246 static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 247 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 248 unsigned char *sig, size_t *sig_len,
kadonotakashi 0:8fdf9a60065b 249 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 250 {
kadonotakashi 0:8fdf9a60065b 251 int ret;
kadonotakashi 0:8fdf9a60065b 252 mbedtls_ecdsa_context ecdsa;
kadonotakashi 0:8fdf9a60065b 253
kadonotakashi 0:8fdf9a60065b 254 mbedtls_ecdsa_init( &ecdsa );
kadonotakashi 0:8fdf9a60065b 255
kadonotakashi 0:8fdf9a60065b 256 if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
kadonotakashi 0:8fdf9a60065b 257 ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len,
kadonotakashi 0:8fdf9a60065b 258 f_rng, p_rng );
kadonotakashi 0:8fdf9a60065b 259
kadonotakashi 0:8fdf9a60065b 260 mbedtls_ecdsa_free( &ecdsa );
kadonotakashi 0:8fdf9a60065b 261
kadonotakashi 0:8fdf9a60065b 262 return( ret );
kadonotakashi 0:8fdf9a60065b 263 }
kadonotakashi 0:8fdf9a60065b 264
kadonotakashi 0:8fdf9a60065b 265 #endif /* MBEDTLS_ECDSA_C */
kadonotakashi 0:8fdf9a60065b 266
kadonotakashi 0:8fdf9a60065b 267 static int eckey_check_pair( const void *pub, const void *prv )
kadonotakashi 0:8fdf9a60065b 268 {
kadonotakashi 0:8fdf9a60065b 269 return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub,
kadonotakashi 0:8fdf9a60065b 270 (const mbedtls_ecp_keypair *) prv ) );
kadonotakashi 0:8fdf9a60065b 271 }
kadonotakashi 0:8fdf9a60065b 272
kadonotakashi 0:8fdf9a60065b 273 static void *eckey_alloc_wrap( void )
kadonotakashi 0:8fdf9a60065b 274 {
kadonotakashi 0:8fdf9a60065b 275 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );
kadonotakashi 0:8fdf9a60065b 276
kadonotakashi 0:8fdf9a60065b 277 if( ctx != NULL )
kadonotakashi 0:8fdf9a60065b 278 mbedtls_ecp_keypair_init( ctx );
kadonotakashi 0:8fdf9a60065b 279
kadonotakashi 0:8fdf9a60065b 280 return( ctx );
kadonotakashi 0:8fdf9a60065b 281 }
kadonotakashi 0:8fdf9a60065b 282
kadonotakashi 0:8fdf9a60065b 283 static void eckey_free_wrap( void *ctx )
kadonotakashi 0:8fdf9a60065b 284 {
kadonotakashi 0:8fdf9a60065b 285 mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx );
kadonotakashi 0:8fdf9a60065b 286 mbedtls_free( ctx );
kadonotakashi 0:8fdf9a60065b 287 }
kadonotakashi 0:8fdf9a60065b 288
kadonotakashi 0:8fdf9a60065b 289 static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items )
kadonotakashi 0:8fdf9a60065b 290 {
kadonotakashi 0:8fdf9a60065b 291 items->type = MBEDTLS_PK_DEBUG_ECP;
kadonotakashi 0:8fdf9a60065b 292 items->name = "eckey.Q";
kadonotakashi 0:8fdf9a60065b 293 items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q );
kadonotakashi 0:8fdf9a60065b 294 }
kadonotakashi 0:8fdf9a60065b 295
kadonotakashi 0:8fdf9a60065b 296 const mbedtls_pk_info_t mbedtls_eckey_info = {
kadonotakashi 0:8fdf9a60065b 297 MBEDTLS_PK_ECKEY,
kadonotakashi 0:8fdf9a60065b 298 "EC",
kadonotakashi 0:8fdf9a60065b 299 eckey_get_bitlen,
kadonotakashi 0:8fdf9a60065b 300 eckey_can_do,
kadonotakashi 0:8fdf9a60065b 301 #if defined(MBEDTLS_ECDSA_C)
kadonotakashi 0:8fdf9a60065b 302 eckey_verify_wrap,
kadonotakashi 0:8fdf9a60065b 303 eckey_sign_wrap,
kadonotakashi 0:8fdf9a60065b 304 #else
kadonotakashi 0:8fdf9a60065b 305 NULL,
kadonotakashi 0:8fdf9a60065b 306 NULL,
kadonotakashi 0:8fdf9a60065b 307 #endif
kadonotakashi 0:8fdf9a60065b 308 NULL,
kadonotakashi 0:8fdf9a60065b 309 NULL,
kadonotakashi 0:8fdf9a60065b 310 eckey_check_pair,
kadonotakashi 0:8fdf9a60065b 311 eckey_alloc_wrap,
kadonotakashi 0:8fdf9a60065b 312 eckey_free_wrap,
kadonotakashi 0:8fdf9a60065b 313 eckey_debug,
kadonotakashi 0:8fdf9a60065b 314 };
kadonotakashi 0:8fdf9a60065b 315
kadonotakashi 0:8fdf9a60065b 316 /*
kadonotakashi 0:8fdf9a60065b 317 * EC key restricted to ECDH
kadonotakashi 0:8fdf9a60065b 318 */
kadonotakashi 0:8fdf9a60065b 319 static int eckeydh_can_do( mbedtls_pk_type_t type )
kadonotakashi 0:8fdf9a60065b 320 {
kadonotakashi 0:8fdf9a60065b 321 return( type == MBEDTLS_PK_ECKEY ||
kadonotakashi 0:8fdf9a60065b 322 type == MBEDTLS_PK_ECKEY_DH );
kadonotakashi 0:8fdf9a60065b 323 }
kadonotakashi 0:8fdf9a60065b 324
kadonotakashi 0:8fdf9a60065b 325 const mbedtls_pk_info_t mbedtls_eckeydh_info = {
kadonotakashi 0:8fdf9a60065b 326 MBEDTLS_PK_ECKEY_DH,
kadonotakashi 0:8fdf9a60065b 327 "EC_DH",
kadonotakashi 0:8fdf9a60065b 328 eckey_get_bitlen, /* Same underlying key structure */
kadonotakashi 0:8fdf9a60065b 329 eckeydh_can_do,
kadonotakashi 0:8fdf9a60065b 330 NULL,
kadonotakashi 0:8fdf9a60065b 331 NULL,
kadonotakashi 0:8fdf9a60065b 332 NULL,
kadonotakashi 0:8fdf9a60065b 333 NULL,
kadonotakashi 0:8fdf9a60065b 334 eckey_check_pair,
kadonotakashi 0:8fdf9a60065b 335 eckey_alloc_wrap, /* Same underlying key structure */
kadonotakashi 0:8fdf9a60065b 336 eckey_free_wrap, /* Same underlying key structure */
kadonotakashi 0:8fdf9a60065b 337 eckey_debug, /* Same underlying key structure */
kadonotakashi 0:8fdf9a60065b 338 };
kadonotakashi 0:8fdf9a60065b 339 #endif /* MBEDTLS_ECP_C */
kadonotakashi 0:8fdf9a60065b 340
kadonotakashi 0:8fdf9a60065b 341 #if defined(MBEDTLS_ECDSA_C)
kadonotakashi 0:8fdf9a60065b 342 static int ecdsa_can_do( mbedtls_pk_type_t type )
kadonotakashi 0:8fdf9a60065b 343 {
kadonotakashi 0:8fdf9a60065b 344 return( type == MBEDTLS_PK_ECDSA );
kadonotakashi 0:8fdf9a60065b 345 }
kadonotakashi 0:8fdf9a60065b 346
kadonotakashi 0:8fdf9a60065b 347 static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 348 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 349 const unsigned char *sig, size_t sig_len )
kadonotakashi 0:8fdf9a60065b 350 {
kadonotakashi 0:8fdf9a60065b 351 int ret;
kadonotakashi 0:8fdf9a60065b 352 ((void) md_alg);
kadonotakashi 0:8fdf9a60065b 353
kadonotakashi 0:8fdf9a60065b 354 ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx,
kadonotakashi 0:8fdf9a60065b 355 hash, hash_len, sig, sig_len );
kadonotakashi 0:8fdf9a60065b 356
kadonotakashi 0:8fdf9a60065b 357 if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
kadonotakashi 0:8fdf9a60065b 358 return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
kadonotakashi 0:8fdf9a60065b 359
kadonotakashi 0:8fdf9a60065b 360 return( ret );
kadonotakashi 0:8fdf9a60065b 361 }
kadonotakashi 0:8fdf9a60065b 362
kadonotakashi 0:8fdf9a60065b 363 static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 364 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 365 unsigned char *sig, size_t *sig_len,
kadonotakashi 0:8fdf9a60065b 366 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 367 {
kadonotakashi 0:8fdf9a60065b 368 return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx,
kadonotakashi 0:8fdf9a60065b 369 md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) );
kadonotakashi 0:8fdf9a60065b 370 }
kadonotakashi 0:8fdf9a60065b 371
kadonotakashi 0:8fdf9a60065b 372 static void *ecdsa_alloc_wrap( void )
kadonotakashi 0:8fdf9a60065b 373 {
kadonotakashi 0:8fdf9a60065b 374 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) );
kadonotakashi 0:8fdf9a60065b 375
kadonotakashi 0:8fdf9a60065b 376 if( ctx != NULL )
kadonotakashi 0:8fdf9a60065b 377 mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx );
kadonotakashi 0:8fdf9a60065b 378
kadonotakashi 0:8fdf9a60065b 379 return( ctx );
kadonotakashi 0:8fdf9a60065b 380 }
kadonotakashi 0:8fdf9a60065b 381
kadonotakashi 0:8fdf9a60065b 382 static void ecdsa_free_wrap( void *ctx )
kadonotakashi 0:8fdf9a60065b 383 {
kadonotakashi 0:8fdf9a60065b 384 mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx );
kadonotakashi 0:8fdf9a60065b 385 mbedtls_free( ctx );
kadonotakashi 0:8fdf9a60065b 386 }
kadonotakashi 0:8fdf9a60065b 387
kadonotakashi 0:8fdf9a60065b 388 const mbedtls_pk_info_t mbedtls_ecdsa_info = {
kadonotakashi 0:8fdf9a60065b 389 MBEDTLS_PK_ECDSA,
kadonotakashi 0:8fdf9a60065b 390 "ECDSA",
kadonotakashi 0:8fdf9a60065b 391 eckey_get_bitlen, /* Compatible key structures */
kadonotakashi 0:8fdf9a60065b 392 ecdsa_can_do,
kadonotakashi 0:8fdf9a60065b 393 ecdsa_verify_wrap,
kadonotakashi 0:8fdf9a60065b 394 ecdsa_sign_wrap,
kadonotakashi 0:8fdf9a60065b 395 NULL,
kadonotakashi 0:8fdf9a60065b 396 NULL,
kadonotakashi 0:8fdf9a60065b 397 eckey_check_pair, /* Compatible key structures */
kadonotakashi 0:8fdf9a60065b 398 ecdsa_alloc_wrap,
kadonotakashi 0:8fdf9a60065b 399 ecdsa_free_wrap,
kadonotakashi 0:8fdf9a60065b 400 eckey_debug, /* Compatible key structures */
kadonotakashi 0:8fdf9a60065b 401 };
kadonotakashi 0:8fdf9a60065b 402 #endif /* MBEDTLS_ECDSA_C */
kadonotakashi 0:8fdf9a60065b 403
kadonotakashi 0:8fdf9a60065b 404 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
kadonotakashi 0:8fdf9a60065b 405 /*
kadonotakashi 0:8fdf9a60065b 406 * Support for alternative RSA-private implementations
kadonotakashi 0:8fdf9a60065b 407 */
kadonotakashi 0:8fdf9a60065b 408
kadonotakashi 0:8fdf9a60065b 409 static int rsa_alt_can_do( mbedtls_pk_type_t type )
kadonotakashi 0:8fdf9a60065b 410 {
kadonotakashi 0:8fdf9a60065b 411 return( type == MBEDTLS_PK_RSA );
kadonotakashi 0:8fdf9a60065b 412 }
kadonotakashi 0:8fdf9a60065b 413
kadonotakashi 0:8fdf9a60065b 414 static size_t rsa_alt_get_bitlen( const void *ctx )
kadonotakashi 0:8fdf9a60065b 415 {
kadonotakashi 0:8fdf9a60065b 416 const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx;
kadonotakashi 0:8fdf9a60065b 417
kadonotakashi 0:8fdf9a60065b 418 return( 8 * rsa_alt->key_len_func( rsa_alt->key ) );
kadonotakashi 0:8fdf9a60065b 419 }
kadonotakashi 0:8fdf9a60065b 420
kadonotakashi 0:8fdf9a60065b 421 static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
kadonotakashi 0:8fdf9a60065b 422 const unsigned char *hash, size_t hash_len,
kadonotakashi 0:8fdf9a60065b 423 unsigned char *sig, size_t *sig_len,
kadonotakashi 0:8fdf9a60065b 424 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 425 {
kadonotakashi 0:8fdf9a60065b 426 mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
kadonotakashi 0:8fdf9a60065b 427
kadonotakashi 0:8fdf9a60065b 428 #if SIZE_MAX > UINT_MAX
kadonotakashi 0:8fdf9a60065b 429 if( UINT_MAX < hash_len )
kadonotakashi 0:8fdf9a60065b 430 return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
kadonotakashi 0:8fdf9a60065b 431 #endif /* SIZE_MAX > UINT_MAX */
kadonotakashi 0:8fdf9a60065b 432
kadonotakashi 0:8fdf9a60065b 433 *sig_len = rsa_alt->key_len_func( rsa_alt->key );
kadonotakashi 0:8fdf9a60065b 434
kadonotakashi 0:8fdf9a60065b 435 return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
kadonotakashi 0:8fdf9a60065b 436 md_alg, (unsigned int) hash_len, hash, sig ) );
kadonotakashi 0:8fdf9a60065b 437 }
kadonotakashi 0:8fdf9a60065b 438
kadonotakashi 0:8fdf9a60065b 439 static int rsa_alt_decrypt_wrap( void *ctx,
kadonotakashi 0:8fdf9a60065b 440 const unsigned char *input, size_t ilen,
kadonotakashi 0:8fdf9a60065b 441 unsigned char *output, size_t *olen, size_t osize,
kadonotakashi 0:8fdf9a60065b 442 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
kadonotakashi 0:8fdf9a60065b 443 {
kadonotakashi 0:8fdf9a60065b 444 mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
kadonotakashi 0:8fdf9a60065b 445
kadonotakashi 0:8fdf9a60065b 446 ((void) f_rng);
kadonotakashi 0:8fdf9a60065b 447 ((void) p_rng);
kadonotakashi 0:8fdf9a60065b 448
kadonotakashi 0:8fdf9a60065b 449 if( ilen != rsa_alt->key_len_func( rsa_alt->key ) )
kadonotakashi 0:8fdf9a60065b 450 return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
kadonotakashi 0:8fdf9a60065b 451
kadonotakashi 0:8fdf9a60065b 452 return( rsa_alt->decrypt_func( rsa_alt->key,
kadonotakashi 0:8fdf9a60065b 453 MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
kadonotakashi 0:8fdf9a60065b 454 }
kadonotakashi 0:8fdf9a60065b 455
kadonotakashi 0:8fdf9a60065b 456 #if defined(MBEDTLS_RSA_C)
kadonotakashi 0:8fdf9a60065b 457 static int rsa_alt_check_pair( const void *pub, const void *prv )
kadonotakashi 0:8fdf9a60065b 458 {
kadonotakashi 0:8fdf9a60065b 459 unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
kadonotakashi 0:8fdf9a60065b 460 unsigned char hash[32];
kadonotakashi 0:8fdf9a60065b 461 size_t sig_len = 0;
kadonotakashi 0:8fdf9a60065b 462 int ret;
kadonotakashi 0:8fdf9a60065b 463
kadonotakashi 0:8fdf9a60065b 464 if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) )
kadonotakashi 0:8fdf9a60065b 465 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
kadonotakashi 0:8fdf9a60065b 466
kadonotakashi 0:8fdf9a60065b 467 memset( hash, 0x2a, sizeof( hash ) );
kadonotakashi 0:8fdf9a60065b 468
kadonotakashi 0:8fdf9a60065b 469 if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE,
kadonotakashi 0:8fdf9a60065b 470 hash, sizeof( hash ),
kadonotakashi 0:8fdf9a60065b 471 sig, &sig_len, NULL, NULL ) ) != 0 )
kadonotakashi 0:8fdf9a60065b 472 {
kadonotakashi 0:8fdf9a60065b 473 return( ret );
kadonotakashi 0:8fdf9a60065b 474 }
kadonotakashi 0:8fdf9a60065b 475
kadonotakashi 0:8fdf9a60065b 476 if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE,
kadonotakashi 0:8fdf9a60065b 477 hash, sizeof( hash ), sig, sig_len ) != 0 )
kadonotakashi 0:8fdf9a60065b 478 {
kadonotakashi 0:8fdf9a60065b 479 return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
kadonotakashi 0:8fdf9a60065b 480 }
kadonotakashi 0:8fdf9a60065b 481
kadonotakashi 0:8fdf9a60065b 482 return( 0 );
kadonotakashi 0:8fdf9a60065b 483 }
kadonotakashi 0:8fdf9a60065b 484 #endif /* MBEDTLS_RSA_C */
kadonotakashi 0:8fdf9a60065b 485
kadonotakashi 0:8fdf9a60065b 486 static void *rsa_alt_alloc_wrap( void )
kadonotakashi 0:8fdf9a60065b 487 {
kadonotakashi 0:8fdf9a60065b 488 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) );
kadonotakashi 0:8fdf9a60065b 489
kadonotakashi 0:8fdf9a60065b 490 if( ctx != NULL )
kadonotakashi 0:8fdf9a60065b 491 memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) );
kadonotakashi 0:8fdf9a60065b 492
kadonotakashi 0:8fdf9a60065b 493 return( ctx );
kadonotakashi 0:8fdf9a60065b 494 }
kadonotakashi 0:8fdf9a60065b 495
kadonotakashi 0:8fdf9a60065b 496 static void rsa_alt_free_wrap( void *ctx )
kadonotakashi 0:8fdf9a60065b 497 {
kadonotakashi 0:8fdf9a60065b 498 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) );
kadonotakashi 0:8fdf9a60065b 499 mbedtls_free( ctx );
kadonotakashi 0:8fdf9a60065b 500 }
kadonotakashi 0:8fdf9a60065b 501
kadonotakashi 0:8fdf9a60065b 502 const mbedtls_pk_info_t mbedtls_rsa_alt_info = {
kadonotakashi 0:8fdf9a60065b 503 MBEDTLS_PK_RSA_ALT,
kadonotakashi 0:8fdf9a60065b 504 "RSA-alt",
kadonotakashi 0:8fdf9a60065b 505 rsa_alt_get_bitlen,
kadonotakashi 0:8fdf9a60065b 506 rsa_alt_can_do,
kadonotakashi 0:8fdf9a60065b 507 NULL,
kadonotakashi 0:8fdf9a60065b 508 rsa_alt_sign_wrap,
kadonotakashi 0:8fdf9a60065b 509 rsa_alt_decrypt_wrap,
kadonotakashi 0:8fdf9a60065b 510 NULL,
kadonotakashi 0:8fdf9a60065b 511 #if defined(MBEDTLS_RSA_C)
kadonotakashi 0:8fdf9a60065b 512 rsa_alt_check_pair,
kadonotakashi 0:8fdf9a60065b 513 #else
kadonotakashi 0:8fdf9a60065b 514 NULL,
kadonotakashi 0:8fdf9a60065b 515 #endif
kadonotakashi 0:8fdf9a60065b 516 rsa_alt_alloc_wrap,
kadonotakashi 0:8fdf9a60065b 517 rsa_alt_free_wrap,
kadonotakashi 0:8fdf9a60065b 518 NULL,
kadonotakashi 0:8fdf9a60065b 519 };
kadonotakashi 0:8fdf9a60065b 520
kadonotakashi 0:8fdf9a60065b 521 #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
kadonotakashi 0:8fdf9a60065b 522
kadonotakashi 0:8fdf9a60065b 523 #endif /* MBEDTLS_PK_C */