~bibledit/bibledit/client

« back to all changes in this revision

Viewing changes to mbedtls2/pk_wrap.c

  • Committer: Teus Benschop
  • Date: 2024-08-17 17:08:44 UTC
  • Revision ID: teusjannette@gmail.com-20240817170844-0qf789ywtms3hyz7
new upstream version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#pragma clang diagnostic ignored "-Wunknown-warning-option"
 
2
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
3
#pragma clang diagnostic ignored "-Wsign-conversion"
 
4
 
 
5
#pragma GCC diagnostic ignored "-Wconversion"
 
6
 
 
7
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
8
#pragma clang diagnostic ignored "-Wsign-conversion"
 
9
 
 
10
#pragma GCC diagnostic ignored "-Wconversion"
 
11
 
 
12
#pragma clang diagnostic ignored "-Wimplicit-int-conversion"
 
13
#pragma clang diagnostic ignored "-Wsign-conversion"
 
14
/*
 
15
 *  Public Key abstraction layer: wrapper functions
 
16
 *
 
17
 *  Copyright The Mbed TLS Contributors
 
18
 *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
 
19
 *
 
20
 *  This file is provided under the Apache License 2.0, or the
 
21
 *  GNU General Public License v2.0 or later.
 
22
 *
 
23
 *  **********
 
24
 *  Apache License 2.0:
 
25
 *
 
26
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 
27
 *  not use this file except in compliance with the License.
 
28
 *  You may obtain a copy of the License at
 
29
 *
 
30
 *  http://www.apache.org/licenses/LICENSE-2.0
 
31
 *
 
32
 *  Unless required by applicable law or agreed to in writing, software
 
33
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 
34
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
35
 *  See the License for the specific language governing permissions and
 
36
 *  limitations under the License.
 
37
 *
 
38
 *  **********
 
39
 *
 
40
 *  **********
 
41
 *  GNU General Public License v2.0 or later:
 
42
 *
 
43
 *  This program is free software; you can redistribute it and/or modify
 
44
 *  it under the terms of the GNU General Public License as published by
 
45
 *  the Free Software Foundation; either version 2 of the License, or
 
46
 *  (at your option) any later version.
 
47
 *
 
48
 *  This program is distributed in the hope that it will be useful,
 
49
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
50
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
51
 *  GNU General Public License for more details.
 
52
 *
 
53
 *  You should have received a copy of the GNU General Public License along
 
54
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 
55
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
56
 *
 
57
 *  **********
 
58
 */
 
59
 
 
60
#if !defined(MBEDTLS_CONFIG_FILE)
 
61
#include "mbedtls/config.h"
 
62
#else
 
63
#include MBEDTLS_CONFIG_FILE
 
64
#endif
 
65
 
 
66
#if defined(MBEDTLS_PK_C)
 
67
#include "mbedtls/pk_internal.h"
 
68
 
 
69
/* Even if RSA not activated, for the sake of RSA-alt */
 
70
#include "mbedtls/rsa.h"
 
71
 
 
72
#include <string.h>
 
73
 
 
74
#if defined(MBEDTLS_ECP_C)
 
75
#include "mbedtls/ecp.h"
 
76
#endif
 
77
 
 
78
#if defined(MBEDTLS_ECDSA_C)
 
79
#include "mbedtls/ecdsa.h"
 
80
#endif
 
81
 
 
82
#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
 
83
#include "mbedtls/platform_util.h"
 
84
#endif
 
85
 
 
86
#if defined(MBEDTLS_PLATFORM_C)
 
87
#include "mbedtls/platform.h"
 
88
#else
 
89
#include <stdlib.h>
 
90
#define mbedtls_calloc    calloc
 
91
#define mbedtls_free       free
 
92
#endif
 
93
 
 
94
#include <limits.h>
 
95
#include <stdint.h>
 
96
 
 
97
#if defined(MBEDTLS_RSA_C)
 
98
static int rsa_can_do( mbedtls_pk_type_t type )
 
99
{
 
100
    return( type == MBEDTLS_PK_RSA ||
 
101
            type == MBEDTLS_PK_RSASSA_PSS );
 
102
}
 
103
 
 
104
static size_t rsa_get_bitlen( const void *ctx )
 
105
{
 
106
    const mbedtls_rsa_context * rsa = (const mbedtls_rsa_context *) ctx;
 
107
    return( 8 * mbedtls_rsa_get_len( rsa ) );
 
108
}
 
109
 
 
110
static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
111
                   const unsigned char *hash, size_t hash_len,
 
112
                   const unsigned char *sig, size_t sig_len )
 
113
{
 
114
    int ret;
 
115
    mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
 
116
    size_t rsa_len = mbedtls_rsa_get_len( rsa );
 
117
 
 
118
#if SIZE_MAX > UINT_MAX
 
119
    if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
 
120
        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
121
#endif /* SIZE_MAX > UINT_MAX */
 
122
 
 
123
    if( sig_len < rsa_len )
 
124
        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
 
125
 
 
126
    if( ( ret = mbedtls_rsa_pkcs1_verify( rsa, NULL, NULL,
 
127
                                  MBEDTLS_RSA_PUBLIC, md_alg,
 
128
                                  (unsigned int) hash_len, hash, sig ) ) != 0 )
 
129
        return( ret );
 
130
 
 
131
    /* The buffer contains a valid signature followed by extra data.
 
132
     * We have a special error code for that so that so that callers can
 
133
     * use mbedtls_pk_verify() to check "Does the buffer start with a
 
134
     * valid signature?" and not just "Does the buffer contain a valid
 
135
     * signature?". */
 
136
    if( sig_len > rsa_len )
 
137
        return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
 
138
 
 
139
    return( 0 );
 
140
}
 
141
 
 
142
static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
143
                   const unsigned char *hash, size_t hash_len,
 
144
                   unsigned char *sig, size_t *sig_len,
 
145
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
146
{
 
147
    mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
 
148
 
 
149
#if SIZE_MAX > UINT_MAX
 
150
    if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
 
151
        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
152
#endif /* SIZE_MAX > UINT_MAX */
 
153
 
 
154
    *sig_len = mbedtls_rsa_get_len( rsa );
 
155
 
 
156
    return( mbedtls_rsa_pkcs1_sign( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
 
157
                md_alg, (unsigned int) hash_len, hash, sig ) );
 
158
}
 
159
 
 
160
static int rsa_decrypt_wrap( void *ctx,
 
161
                    const unsigned char *input, size_t ilen,
 
162
                    unsigned char *output, size_t *olen, size_t osize,
 
163
                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
164
{
 
165
    mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
 
166
 
 
167
    if( ilen != mbedtls_rsa_get_len( rsa ) )
 
168
        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
 
169
 
 
170
    return( mbedtls_rsa_pkcs1_decrypt( rsa, f_rng, p_rng,
 
171
                MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
 
172
}
 
173
 
 
174
static int rsa_encrypt_wrap( void *ctx,
 
175
                    const unsigned char *input, size_t ilen,
 
176
                    unsigned char *output, size_t *olen, size_t osize,
 
177
                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
178
{
 
179
    mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
 
180
    *olen = mbedtls_rsa_get_len( rsa );
 
181
 
 
182
    if( *olen > osize )
 
183
        return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
 
184
 
 
185
    return( mbedtls_rsa_pkcs1_encrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PUBLIC,
 
186
                                       ilen, input, output ) );
 
187
}
 
188
 
 
189
static int rsa_check_pair_wrap( const void *pub, const void *prv )
 
190
{
 
191
    return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub,
 
192
                                (const mbedtls_rsa_context *) prv ) );
 
193
}
 
194
 
 
195
static void *rsa_alloc_wrap( void )
 
196
{
 
197
    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) );
 
198
 
 
199
    if( ctx != NULL )
 
200
        mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 );
 
201
 
 
202
    return( ctx );
 
203
}
 
204
 
 
205
static void rsa_free_wrap( void *ctx )
 
206
{
 
207
    mbedtls_rsa_free( (mbedtls_rsa_context *) ctx );
 
208
    mbedtls_free( ctx );
 
209
}
 
210
 
 
211
static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items )
 
212
{
 
213
    items->type = MBEDTLS_PK_DEBUG_MPI;
 
214
    items->name = "rsa.N";
 
215
    items->value = &( ((mbedtls_rsa_context *) ctx)->N );
 
216
 
 
217
    items++;
 
218
 
 
219
    items->type = MBEDTLS_PK_DEBUG_MPI;
 
220
    items->name = "rsa.E";
 
221
    items->value = &( ((mbedtls_rsa_context *) ctx)->E );
 
222
}
 
223
 
 
224
const mbedtls_pk_info_t mbedtls_rsa_info = {
 
225
    MBEDTLS_PK_RSA,
 
226
    "RSA",
 
227
    rsa_get_bitlen,
 
228
    rsa_can_do,
 
229
    rsa_verify_wrap,
 
230
    rsa_sign_wrap,
 
231
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
232
    NULL,
 
233
    NULL,
 
234
#endif
 
235
    rsa_decrypt_wrap,
 
236
    rsa_encrypt_wrap,
 
237
    rsa_check_pair_wrap,
 
238
    rsa_alloc_wrap,
 
239
    rsa_free_wrap,
 
240
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
241
    NULL,
 
242
    NULL,
 
243
#endif
 
244
    rsa_debug,
 
245
};
 
246
#endif /* MBEDTLS_RSA_C */
 
247
 
 
248
#if defined(MBEDTLS_ECP_C)
 
249
/*
 
250
 * Generic EC key
 
251
 */
 
252
static int eckey_can_do( mbedtls_pk_type_t type )
 
253
{
 
254
    return( type == MBEDTLS_PK_ECKEY ||
 
255
            type == MBEDTLS_PK_ECKEY_DH ||
 
256
            type == MBEDTLS_PK_ECDSA );
 
257
}
 
258
 
 
259
static size_t eckey_get_bitlen( const void *ctx )
 
260
{
 
261
    return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits );
 
262
}
 
263
 
 
264
#if defined(MBEDTLS_ECDSA_C)
 
265
/* Forward declarations */
 
266
static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
267
                       const unsigned char *hash, size_t hash_len,
 
268
                       const unsigned char *sig, size_t sig_len );
 
269
 
 
270
static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
271
                   const unsigned char *hash, size_t hash_len,
 
272
                   unsigned char *sig, size_t *sig_len,
 
273
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
 
274
 
 
275
static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
276
                       const unsigned char *hash, size_t hash_len,
 
277
                       const unsigned char *sig, size_t sig_len )
 
278
{
 
279
    int ret;
 
280
    mbedtls_ecdsa_context ecdsa;
 
281
 
 
282
    mbedtls_ecdsa_init( &ecdsa );
 
283
 
 
284
    if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
 
285
        ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len );
 
286
 
 
287
    mbedtls_ecdsa_free( &ecdsa );
 
288
 
 
289
    return( ret );
 
290
}
 
291
 
 
292
static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
293
                   const unsigned char *hash, size_t hash_len,
 
294
                   unsigned char *sig, size_t *sig_len,
 
295
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
296
{
 
297
    int ret;
 
298
    mbedtls_ecdsa_context ecdsa;
 
299
 
 
300
    mbedtls_ecdsa_init( &ecdsa );
 
301
 
 
302
    if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
 
303
        ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len,
 
304
                               f_rng, p_rng );
 
305
 
 
306
    mbedtls_ecdsa_free( &ecdsa );
 
307
 
 
308
    return( ret );
 
309
}
 
310
 
 
311
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
312
/* Forward declarations */
 
313
static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
314
                       const unsigned char *hash, size_t hash_len,
 
315
                       const unsigned char *sig, size_t sig_len,
 
316
                       void *rs_ctx );
 
317
 
 
318
static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
319
                   const unsigned char *hash, size_t hash_len,
 
320
                   unsigned char *sig, size_t *sig_len,
 
321
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
 
322
                   void *rs_ctx );
 
323
 
 
324
/*
 
325
 * Restart context for ECDSA operations with ECKEY context
 
326
 *
 
327
 * We need to store an actual ECDSA context, as we need to pass the same to
 
328
 * the underlying ecdsa function, so we can't create it on the fly every time.
 
329
 */
 
330
typedef struct
 
331
{
 
332
    mbedtls_ecdsa_restart_ctx ecdsa_rs;
 
333
    mbedtls_ecdsa_context ecdsa_ctx;
 
334
} eckey_restart_ctx;
 
335
 
 
336
static void *eckey_rs_alloc( void )
 
337
{
 
338
    eckey_restart_ctx *rs_ctx;
 
339
 
 
340
    void *ctx = mbedtls_calloc( 1, sizeof( eckey_restart_ctx ) );
 
341
 
 
342
    if( ctx != NULL )
 
343
    {
 
344
        rs_ctx = ctx;
 
345
        mbedtls_ecdsa_restart_init( &rs_ctx->ecdsa_rs );
 
346
        mbedtls_ecdsa_init( &rs_ctx->ecdsa_ctx );
 
347
    }
 
348
 
 
349
    return( ctx );
 
350
}
 
351
 
 
352
static void eckey_rs_free( void *ctx )
 
353
{
 
354
    eckey_restart_ctx *rs_ctx;
 
355
 
 
356
    if( ctx == NULL)
 
357
        return;
 
358
 
 
359
    rs_ctx = ctx;
 
360
    mbedtls_ecdsa_restart_free( &rs_ctx->ecdsa_rs );
 
361
    mbedtls_ecdsa_free( &rs_ctx->ecdsa_ctx );
 
362
 
 
363
    mbedtls_free( ctx );
 
364
}
 
365
 
 
366
static int eckey_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
367
                       const unsigned char *hash, size_t hash_len,
 
368
                       const unsigned char *sig, size_t sig_len,
 
369
                       void *rs_ctx )
 
370
{
 
371
    int ret;
 
372
    eckey_restart_ctx *rs = rs_ctx;
 
373
 
 
374
    /* Should never happen */
 
375
    if( rs == NULL )
 
376
        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
377
 
 
378
    /* set up our own sub-context if needed (that is, on first run) */
 
379
    if( rs->ecdsa_ctx.grp.pbits == 0 )
 
380
        MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) );
 
381
 
 
382
    MBEDTLS_MPI_CHK( ecdsa_verify_rs_wrap( &rs->ecdsa_ctx,
 
383
                                           md_alg, hash, hash_len,
 
384
                                           sig, sig_len, &rs->ecdsa_rs ) );
 
385
 
 
386
cleanup:
 
387
    return( ret );
 
388
}
 
389
 
 
390
static int eckey_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
391
                   const unsigned char *hash, size_t hash_len,
 
392
                   unsigned char *sig, size_t *sig_len,
 
393
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
 
394
                       void *rs_ctx )
 
395
{
 
396
    int ret;
 
397
    eckey_restart_ctx *rs = rs_ctx;
 
398
 
 
399
    /* Should never happen */
 
400
    if( rs == NULL )
 
401
        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
402
 
 
403
    /* set up our own sub-context if needed (that is, on first run) */
 
404
    if( rs->ecdsa_ctx.grp.pbits == 0 )
 
405
        MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) );
 
406
 
 
407
    MBEDTLS_MPI_CHK( ecdsa_sign_rs_wrap( &rs->ecdsa_ctx, md_alg,
 
408
                                         hash, hash_len, sig, sig_len,
 
409
                                         f_rng, p_rng, &rs->ecdsa_rs ) );
 
410
 
 
411
cleanup:
 
412
    return( ret );
 
413
}
 
414
#endif /* MBEDTLS_ECP_RESTARTABLE */
 
415
#endif /* MBEDTLS_ECDSA_C */
 
416
 
 
417
static int eckey_check_pair( const void *pub, const void *prv )
 
418
{
 
419
    return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub,
 
420
                                (const mbedtls_ecp_keypair *) prv ) );
 
421
}
 
422
 
 
423
static void *eckey_alloc_wrap( void )
 
424
{
 
425
    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );
 
426
 
 
427
    if( ctx != NULL )
 
428
        mbedtls_ecp_keypair_init( ctx );
 
429
 
 
430
    return( ctx );
 
431
}
 
432
 
 
433
static void eckey_free_wrap( void *ctx )
 
434
{
 
435
    mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx );
 
436
    mbedtls_free( ctx );
 
437
}
 
438
 
 
439
static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items )
 
440
{
 
441
    items->type = MBEDTLS_PK_DEBUG_ECP;
 
442
    items->name = "eckey.Q";
 
443
    items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q );
 
444
}
 
445
 
 
446
const mbedtls_pk_info_t mbedtls_eckey_info = {
 
447
    MBEDTLS_PK_ECKEY,
 
448
    "EC",
 
449
    eckey_get_bitlen,
 
450
    eckey_can_do,
 
451
#if defined(MBEDTLS_ECDSA_C)
 
452
    eckey_verify_wrap,
 
453
    eckey_sign_wrap,
 
454
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
455
    eckey_verify_rs_wrap,
 
456
    eckey_sign_rs_wrap,
 
457
#endif
 
458
#else /* MBEDTLS_ECDSA_C */
 
459
    NULL,
 
460
    NULL,
 
461
#endif /* MBEDTLS_ECDSA_C */
 
462
    NULL,
 
463
    NULL,
 
464
    eckey_check_pair,
 
465
    eckey_alloc_wrap,
 
466
    eckey_free_wrap,
 
467
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
468
    eckey_rs_alloc,
 
469
    eckey_rs_free,
 
470
#endif
 
471
    eckey_debug,
 
472
};
 
473
 
 
474
/*
 
475
 * EC key restricted to ECDH
 
476
 */
 
477
static int eckeydh_can_do( mbedtls_pk_type_t type )
 
478
{
 
479
    return( type == MBEDTLS_PK_ECKEY ||
 
480
            type == MBEDTLS_PK_ECKEY_DH );
 
481
}
 
482
 
 
483
const mbedtls_pk_info_t mbedtls_eckeydh_info = {
 
484
    MBEDTLS_PK_ECKEY_DH,
 
485
    "EC_DH",
 
486
    eckey_get_bitlen,         /* Same underlying key structure */
 
487
    eckeydh_can_do,
 
488
    NULL,
 
489
    NULL,
 
490
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
491
    NULL,
 
492
    NULL,
 
493
#endif
 
494
    NULL,
 
495
    NULL,
 
496
    eckey_check_pair,
 
497
    eckey_alloc_wrap,       /* Same underlying key structure */
 
498
    eckey_free_wrap,        /* Same underlying key structure */
 
499
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
500
    NULL,
 
501
    NULL,
 
502
#endif
 
503
    eckey_debug,            /* Same underlying key structure */
 
504
};
 
505
#endif /* MBEDTLS_ECP_C */
 
506
 
 
507
#if defined(MBEDTLS_ECDSA_C)
 
508
static int ecdsa_can_do( mbedtls_pk_type_t type )
 
509
{
 
510
    return( type == MBEDTLS_PK_ECDSA );
 
511
}
 
512
 
 
513
static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
514
                       const unsigned char *hash, size_t hash_len,
 
515
                       const unsigned char *sig, size_t sig_len )
 
516
{
 
517
    int ret;
 
518
    ((void) md_alg);
 
519
 
 
520
    ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx,
 
521
                                hash, hash_len, sig, sig_len );
 
522
 
 
523
    if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
 
524
        return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
 
525
 
 
526
    return( ret );
 
527
}
 
528
 
 
529
static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
530
                   const unsigned char *hash, size_t hash_len,
 
531
                   unsigned char *sig, size_t *sig_len,
 
532
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
533
{
 
534
    return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx,
 
535
                md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) );
 
536
}
 
537
 
 
538
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
539
static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
540
                       const unsigned char *hash, size_t hash_len,
 
541
                       const unsigned char *sig, size_t sig_len,
 
542
                       void *rs_ctx )
 
543
{
 
544
    int ret;
 
545
    ((void) md_alg);
 
546
 
 
547
    ret = mbedtls_ecdsa_read_signature_restartable(
 
548
            (mbedtls_ecdsa_context *) ctx,
 
549
            hash, hash_len, sig, sig_len,
 
550
            (mbedtls_ecdsa_restart_ctx *) rs_ctx );
 
551
 
 
552
    if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
 
553
        return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
 
554
 
 
555
    return( ret );
 
556
}
 
557
 
 
558
static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
559
                   const unsigned char *hash, size_t hash_len,
 
560
                   unsigned char *sig, size_t *sig_len,
 
561
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
 
562
                   void *rs_ctx )
 
563
{
 
564
    return( mbedtls_ecdsa_write_signature_restartable(
 
565
                (mbedtls_ecdsa_context *) ctx,
 
566
                md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng,
 
567
                (mbedtls_ecdsa_restart_ctx *) rs_ctx ) );
 
568
 
 
569
}
 
570
#endif /* MBEDTLS_ECP_RESTARTABLE */
 
571
 
 
572
static void *ecdsa_alloc_wrap( void )
 
573
{
 
574
    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) );
 
575
 
 
576
    if( ctx != NULL )
 
577
        mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx );
 
578
 
 
579
    return( ctx );
 
580
}
 
581
 
 
582
static void ecdsa_free_wrap( void *ctx )
 
583
{
 
584
    mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx );
 
585
    mbedtls_free( ctx );
 
586
}
 
587
 
 
588
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
589
static void *ecdsa_rs_alloc( void )
 
590
{
 
591
    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_restart_ctx ) );
 
592
 
 
593
    if( ctx != NULL )
 
594
        mbedtls_ecdsa_restart_init( ctx );
 
595
 
 
596
    return( ctx );
 
597
}
 
598
 
 
599
static void ecdsa_rs_free( void *ctx )
 
600
{
 
601
    mbedtls_ecdsa_restart_free( ctx );
 
602
    mbedtls_free( ctx );
 
603
}
 
604
#endif /* MBEDTLS_ECP_RESTARTABLE */
 
605
 
 
606
const mbedtls_pk_info_t mbedtls_ecdsa_info = {
 
607
    MBEDTLS_PK_ECDSA,
 
608
    "ECDSA",
 
609
    eckey_get_bitlen,     /* Compatible key structures */
 
610
    ecdsa_can_do,
 
611
    ecdsa_verify_wrap,
 
612
    ecdsa_sign_wrap,
 
613
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
614
    ecdsa_verify_rs_wrap,
 
615
    ecdsa_sign_rs_wrap,
 
616
#endif
 
617
    NULL,
 
618
    NULL,
 
619
    eckey_check_pair,   /* Compatible key structures */
 
620
    ecdsa_alloc_wrap,
 
621
    ecdsa_free_wrap,
 
622
#if defined(MBEDTLS_ECP_RESTARTABLE)
 
623
    ecdsa_rs_alloc,
 
624
    ecdsa_rs_free,
 
625
#endif
 
626
    eckey_debug,        /* Compatible key structures */
 
627
};
 
628
#endif /* MBEDTLS_ECDSA_C */
 
629
 
 
630
#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
 
631
/*
 
632
 * Support for alternative RSA-private implementations
 
633
 */
 
634
 
 
635
static int rsa_alt_can_do( mbedtls_pk_type_t type )
 
636
{
 
637
    return( type == MBEDTLS_PK_RSA );
 
638
}
 
639
 
 
640
static size_t rsa_alt_get_bitlen( const void *ctx )
 
641
{
 
642
    const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx;
 
643
 
 
644
    return( 8 * rsa_alt->key_len_func( rsa_alt->key ) );
 
645
}
 
646
 
 
647
static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
 
648
                   const unsigned char *hash, size_t hash_len,
 
649
                   unsigned char *sig, size_t *sig_len,
 
650
                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
651
{
 
652
    mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
 
653
 
 
654
#if SIZE_MAX > UINT_MAX
 
655
    if( UINT_MAX < hash_len )
 
656
        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
657
#endif /* SIZE_MAX > UINT_MAX */
 
658
 
 
659
    *sig_len = rsa_alt->key_len_func( rsa_alt->key );
 
660
 
 
661
    return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
 
662
                md_alg, (unsigned int) hash_len, hash, sig ) );
 
663
}
 
664
 
 
665
static int rsa_alt_decrypt_wrap( void *ctx,
 
666
                    const unsigned char *input, size_t ilen,
 
667
                    unsigned char *output, size_t *olen, size_t osize,
 
668
                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
 
669
{
 
670
    mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
 
671
 
 
672
    ((void) f_rng);
 
673
    ((void) p_rng);
 
674
 
 
675
    if( ilen != rsa_alt->key_len_func( rsa_alt->key ) )
 
676
        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
 
677
 
 
678
    return( rsa_alt->decrypt_func( rsa_alt->key,
 
679
                MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
 
680
}
 
681
 
 
682
#if defined(MBEDTLS_RSA_C)
 
683
static int rsa_alt_check_pair( const void *pub, const void *prv )
 
684
{
 
685
    unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
 
686
    unsigned char hash[32];
 
687
    size_t sig_len = 0;
 
688
    int ret;
 
689
 
 
690
    if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) )
 
691
        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
 
692
 
 
693
    memset( hash, 0x2a, sizeof( hash ) );
 
694
 
 
695
    if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE,
 
696
                                   hash, sizeof( hash ),
 
697
                                   sig, &sig_len, NULL, NULL ) ) != 0 )
 
698
    {
 
699
        return( ret );
 
700
    }
 
701
 
 
702
    if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE,
 
703
                         hash, sizeof( hash ), sig, sig_len ) != 0 )
 
704
    {
 
705
        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
 
706
    }
 
707
 
 
708
    return( 0 );
 
709
}
 
710
#endif /* MBEDTLS_RSA_C */
 
711
 
 
712
static void *rsa_alt_alloc_wrap( void )
 
713
{
 
714
    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) );
 
715
 
 
716
    if( ctx != NULL )
 
717
        memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) );
 
718
 
 
719
    return( ctx );
 
720
}
 
721
 
 
722
static void rsa_alt_free_wrap( void *ctx )
 
723
{
 
724
    mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) );
 
725
    mbedtls_free( ctx );
 
726
}
 
727
 
 
728
const mbedtls_pk_info_t mbedtls_rsa_alt_info = {
 
729
    MBEDTLS_PK_RSA_ALT,
 
730
    "RSA-alt",
 
731
    rsa_alt_get_bitlen,
 
732
    rsa_alt_can_do,
 
733
    NULL,
 
734
    rsa_alt_sign_wrap,
 
735
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
736
    NULL,
 
737
    NULL,
 
738
#endif
 
739
    rsa_alt_decrypt_wrap,
 
740
    NULL,
 
741
#if defined(MBEDTLS_RSA_C)
 
742
    rsa_alt_check_pair,
 
743
#else
 
744
    NULL,
 
745
#endif
 
746
    rsa_alt_alloc_wrap,
 
747
    rsa_alt_free_wrap,
 
748
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
 
749
    NULL,
 
750
    NULL,
 
751
#endif
 
752
    NULL,
 
753
};
 
754
 
 
755
#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
 
756
 
 
757
#endif /* MBEDTLS_PK_C */