Coverage Report

Created: 2026-04-01 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-openssl-api/wolfcrypt/src/evp.c
Line
Count
Source
1
/* evp.c
2
 *
3
 * Copyright (C) 2006-2026 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
#if !defined(WOLFSSL_EVP_INCLUDED)
25
    #ifndef WOLFSSL_IGNORE_FILE_WARN
26
        #warning evp.c does not need to be compiled separately from ssl.c
27
    #endif
28
#elif defined(WOLFCRYPT_ONLY)
29
#else
30
31
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
32
    defined(HAVE_CURL)
33
34
#if !defined(HAVE_PKCS7) && \
35
      ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \
36
       (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST))
37
    #include <wolfssl/wolfcrypt/aes.h>
38
#endif
39
40
#include <wolfssl/openssl/ecdsa.h>
41
#include <wolfssl/openssl/evp.h>
42
#include <wolfssl/openssl/kdf.h>
43
#include <wolfssl/wolfcrypt/wolfmath.h>
44
45
static const struct s_ent {
46
    const enum wc_HashType macType;
47
    const int nid;
48
    const char *name;
49
} md_tbl[] = {
50
#ifndef NO_MD4
51
    {WC_HASH_TYPE_MD4, WC_NID_md4, WC_SN_md4},
52
#endif /* NO_MD4 */
53
54
#ifndef NO_MD5
55
    {WC_HASH_TYPE_MD5, WC_NID_md5, WC_SN_md5},
56
#endif /* NO_MD5 */
57
58
#ifndef NO_SHA
59
    {WC_HASH_TYPE_SHA, WC_NID_sha1, WC_SN_sha1},
60
    {WC_HASH_TYPE_SHA, WC_NID_sha1, "SHA"}, /* Leave for backwards compatibility */
61
#endif /* NO_SHA */
62
63
#ifdef WOLFSSL_SHA224
64
    {WC_HASH_TYPE_SHA224, WC_NID_sha224, WC_SN_sha224},
65
#endif /* WOLFSSL_SHA224 */
66
#ifndef NO_SHA256
67
    {WC_HASH_TYPE_SHA256, WC_NID_sha256, WC_SN_sha256},
68
#endif
69
70
#ifdef WOLFSSL_SHA384
71
    {WC_HASH_TYPE_SHA384, WC_NID_sha384, WC_SN_sha384},
72
#endif /* WOLFSSL_SHA384 */
73
74
#ifdef WOLFSSL_SHA512
75
    {WC_HASH_TYPE_SHA512, WC_NID_sha512, WC_SN_sha512},
76
#endif /* WOLFSSL_SHA512 */
77
78
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
79
    {WC_HASH_TYPE_SHA512_224, WC_NID_sha512_224, WC_SN_sha512_224},
80
#endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */
81
82
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
83
    {WC_HASH_TYPE_SHA512_256, WC_NID_sha512_256, WC_SN_sha512_256},
84
#endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */
85
86
#ifndef WOLFSSL_NOSHA3_224
87
    {WC_HASH_TYPE_SHA3_224, WC_NID_sha3_224, WC_SN_sha3_224},
88
#endif
89
#ifndef WOLFSSL_NOSHA3_256
90
    {WC_HASH_TYPE_SHA3_256, WC_NID_sha3_256, WC_SN_sha3_256},
91
#endif
92
#ifndef WOLFSSL_NOSHA3_384
93
    {WC_HASH_TYPE_SHA3_384, WC_NID_sha3_384, WC_SN_sha3_384},
94
#endif
95
#ifndef WOLFSSL_NOSHA3_512
96
    {WC_HASH_TYPE_SHA3_512, WC_NID_sha3_512, WC_SN_sha3_512},
97
#endif
98
#ifdef WOLFSSL_SM3
99
    {WC_HASH_TYPE_SM3, WC_NID_sm3, WC_SN_sm3},
100
#endif /* WOLFSSL_SHA512 */
101
#ifdef HAVE_BLAKE2
102
    {WC_HASH_TYPE_BLAKE2B, WC_NID_blake2b512, WC_SN_blake2b512},
103
#endif
104
#ifdef HAVE_BLAKE2S
105
    {WC_HASH_TYPE_BLAKE2S, WC_NID_blake2s256, WC_SN_blake2s256},
106
#endif
107
#ifdef WOLFSSL_SHAKE128
108
    {WC_HASH_TYPE_SHAKE128, WC_NID_shake128, WC_SN_shake128},
109
#endif
110
#ifdef WOLFSSL_SHAKE256
111
    {WC_HASH_TYPE_SHAKE256, WC_NID_shake256, WC_SN_shake256},
112
#endif
113
    {WC_HASH_TYPE_NONE, 0, NULL}
114
};
115
#endif /* OPENSSL_EXTRA || HAVE_CURL */
116
117
#if defined(OPENSSL_EXTRA)
118
119
#ifndef NO_AES
120
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
121
    #ifdef WOLFSSL_AES_128
122
        static const char EVP_AES_128_CBC[] = "AES-128-CBC";
123
    #endif
124
    #ifdef WOLFSSL_AES_192
125
        static const char EVP_AES_192_CBC[] = "AES-192-CBC";
126
    #endif
127
    #ifdef WOLFSSL_AES_256
128
        static const char EVP_AES_256_CBC[] = "AES-256-CBC";
129
    #endif
130
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
131
132
    #ifdef WOLFSSL_AES_OFB
133
    #ifdef WOLFSSL_AES_128
134
        static const char EVP_AES_128_OFB[] = "AES-128-OFB";
135
    #endif
136
    #ifdef WOLFSSL_AES_192
137
        static const char EVP_AES_192_OFB[] = "AES-192-OFB";
138
    #endif
139
    #ifdef WOLFSSL_AES_256
140
        static const char EVP_AES_256_OFB[] = "AES-256-OFB";
141
    #endif
142
    #endif /* WOLFSSL_AES_OFB */
143
144
    #if defined(WOLFSSL_AES_XTS) && \
145
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
146
    #ifdef WOLFSSL_AES_128
147
        static const char EVP_AES_128_XTS[] = "AES-128-XTS";
148
    #endif
149
    #ifdef WOLFSSL_AES_256
150
        static const char EVP_AES_256_XTS[] = "AES-256-XTS";
151
    #endif
152
    #endif /* WOLFSSL_AES_XTS &&
153
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
154
155
    #ifdef WOLFSSL_AES_CFB
156
    #ifndef WOLFSSL_NO_AES_CFB_1_8
157
    #ifdef WOLFSSL_AES_128
158
        static const char EVP_AES_128_CFB1[] = "AES-128-CFB1";
159
    #endif
160
    #ifdef WOLFSSL_AES_192
161
        static const char EVP_AES_192_CFB1[] = "AES-192-CFB1";
162
    #endif
163
    #ifdef WOLFSSL_AES_256
164
        static const char EVP_AES_256_CFB1[] = "AES-256-CFB1";
165
    #endif
166
167
    #ifdef WOLFSSL_AES_128
168
        static const char EVP_AES_128_CFB8[] = "AES-128-CFB8";
169
    #endif
170
    #ifdef WOLFSSL_AES_192
171
        static const char EVP_AES_192_CFB8[] = "AES-192-CFB8";
172
    #endif
173
    #ifdef WOLFSSL_AES_256
174
        static const char EVP_AES_256_CFB8[] = "AES-256-CFB8";
175
    #endif
176
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
177
178
    #ifdef WOLFSSL_AES_128
179
        static const char EVP_AES_128_CFB128[] = "AES-128-CFB128";
180
    #endif
181
    #ifdef WOLFSSL_AES_192
182
        static const char EVP_AES_192_CFB128[] = "AES-192-CFB128";
183
    #endif
184
    #ifdef WOLFSSL_AES_256
185
        static const char EVP_AES_256_CFB128[] = "AES-256-CFB128";
186
    #endif
187
    #endif /* WOLFSSL_AES_CFB */
188
189
    #ifdef HAVE_AESGCM
190
        #ifdef WOLFSSL_AES_128
191
            static const char EVP_AES_128_GCM[] = "AES-128-GCM";
192
        #endif
193
        #ifdef WOLFSSL_AES_192
194
            static const char EVP_AES_192_GCM[] = "AES-192-GCM";
195
        #endif
196
        #ifdef WOLFSSL_AES_256
197
            static const char EVP_AES_256_GCM[] = "AES-256-GCM";
198
        #endif
199
    #endif /* HAVE_AESGCM */
200
201
    #ifdef HAVE_AESCCM
202
        #ifdef WOLFSSL_AES_128
203
            static const char EVP_AES_128_CCM[] = "AES-128-CCM";
204
        #endif
205
        #ifdef WOLFSSL_AES_192
206
            static const char EVP_AES_192_CCM[] = "AES-192-CCM";
207
        #endif
208
        #ifdef WOLFSSL_AES_256
209
            static const char EVP_AES_256_CCM[] = "AES-256-CCM";
210
        #endif
211
    #endif /* HAVE_AESCCM */
212
213
    #ifdef WOLFSSL_AES_COUNTER
214
    #ifdef WOLFSSL_AES_128
215
        static const char EVP_AES_128_CTR[] = "AES-128-CTR";
216
    #endif
217
    #ifdef WOLFSSL_AES_192
218
        static const char EVP_AES_192_CTR[] = "AES-192-CTR";
219
    #endif
220
    #ifdef WOLFSSL_AES_256
221
        static const char EVP_AES_256_CTR[] = "AES-256-CTR";
222
    #endif
223
    #endif
224
225
    #ifdef HAVE_AES_ECB
226
    #ifdef WOLFSSL_AES_128
227
        static const char EVP_AES_128_ECB[] = "AES-128-ECB";
228
    #endif
229
    #ifdef WOLFSSL_AES_192
230
        static const char EVP_AES_192_ECB[] = "AES-192-ECB";
231
    #endif
232
    #ifdef WOLFSSL_AES_256
233
        static const char EVP_AES_256_ECB[] = "AES-256-ECB";
234
    #endif
235
    #endif
236
#endif
237
238
#ifdef HAVE_ARIA
239
    #include <wolfssl/wolfcrypt/port/aria/aria-crypt.h>
240
    static const char EVP_ARIA_128_GCM[] = "ARIA-128-GCM";
241
    static const char EVP_ARIA_192_GCM[] = "ARIA-192-GCM";
242
    static const char EVP_ARIA_256_GCM[] = "ARIA-256-GCM";
243
#endif
244
245
#ifndef NO_DES3
246
    static const char EVP_DES_CBC[] = "DES-CBC";
247
    static const char EVP_DES_ECB[] = "DES-ECB";
248
249
    static const char EVP_DES_EDE3_CBC[] = "DES-EDE3-CBC";
250
    static const char EVP_DES_EDE3_ECB[] = "DES-EDE3-ECB";
251
#endif
252
253
#ifndef NO_RC4
254
    static const char EVP_ARC4[] = "ARC4";
255
#endif
256
257
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
258
    static const char EVP_CHACHA20_POLY1305[] = "CHACHA20-POLY1305";
259
#endif
260
261
#ifdef HAVE_CHACHA
262
    static const char EVP_CHACHA20[] = "CHACHA20";
263
#endif
264
265
#ifdef WOLFSSL_SM4_ECB
266
    static const char EVP_SM4_ECB[] = "SM4-ECB";
267
#endif /* WOLFSSL_SM4_ECB */
268
#ifdef WOLFSSL_SM4_CBC
269
    static const char EVP_SM4_CBC[] = "SM4-CBC";
270
#endif /* WOLFSSL_SM4_CBC */
271
#ifdef WOLFSSL_SM4_CTR
272
    static const char EVP_SM4_CTR[] = "SM4-CTR";
273
#endif /* WOLFSSL_SM4_CTR */
274
#ifdef WOLFSSL_SM4_GCM
275
    static const char EVP_SM4_GCM[] = "SM4-GCM";
276
#endif /* WOLFSSL_SM4_GCM */
277
#ifdef WOLFSSL_SM4_CCM
278
    static const char EVP_SM4_CCM[] = "SM4-CCM";
279
#endif /* WOLFSSL_SM4_CCM */
280
281
static const char EVP_NULL[] = "NULL";
282
283
static const struct pkey_type_name_ent {
284
    int type;
285
    const char *name;
286
} pkey_type_names[] = {
287
    { WC_EVP_PKEY_RSA,     "RSA" },
288
    { WC_EVP_PKEY_EC,      "EC" },
289
    { WC_EVP_PKEY_DH,      "DH" },
290
    { WC_EVP_PKEY_DSA,     "DSA" }
291
};
292
293
0
static int pkey_type_by_name(const char *name) {
294
0
    unsigned int i;
295
0
    if (name == NULL)
296
0
        return WC_EVP_PKEY_NONE;
297
0
    for (i = 0; i < XELEM_CNT(pkey_type_names); ++i) {
298
0
        if (XSTRCMP(name, pkey_type_names[i].name) == 0)
299
0
            return pkey_type_names[i].type;
300
0
    }
301
0
    return WC_EVP_PKEY_NONE;
302
0
}
303
304
0
int wolfSSL_EVP_PKEY_is_a(const WOLFSSL_EVP_PKEY *pkey, const char *name) {
305
0
    int type;
306
307
0
    if (pkey == NULL)
308
0
        return WOLFSSL_FAILURE;
309
310
0
    type = pkey_type_by_name(name);
311
0
    if (type == WC_EVP_PKEY_NONE)
312
0
        return WOLFSSL_FAILURE;
313
314
0
    return (pkey->type == type) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
315
0
}
316
317
746k
#define EVP_CIPHER_TYPE_MATCHES(x, y) (XSTRCMP(x,y) == 0)
318
319
#define WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX  80
320
0
#define WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE 15
321
322
static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher);
323
324
static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md);
325
326
/* Getter function for cipher key length
327
 *
328
 * c  WOLFSSL_EVP_CIPHER structure to get key length from
329
 *
330
 * NOTE: OpenSSL_add_all_ciphers() should be called first before using this
331
 *       function
332
 *
333
 * Returns size of key in bytes
334
 */
335
int wolfSSL_EVP_Cipher_key_length(const WOLFSSL_EVP_CIPHER* c)
336
4.94k
{
337
4.94k
    WOLFSSL_ENTER("wolfSSL_EVP_Cipher_key_length");
338
339
4.94k
    if (c == NULL) {
340
0
        return 0;
341
0
    }
342
343
4.94k
    switch (cipherType(c)) {
344
0
#if !defined(NO_AES)
345
0
  #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
346
323
      case WC_AES_128_CBC_TYPE: return 16;
347
138
      case WC_AES_192_CBC_TYPE: return 24;
348
140
      case WC_AES_256_CBC_TYPE: return 32;
349
0
  #endif
350
0
  #if defined(WOLFSSL_AES_CFB)
351
165
      case WC_AES_128_CFB1_TYPE: return 16;
352
48
      case WC_AES_192_CFB1_TYPE: return 24;
353
155
      case WC_AES_256_CFB1_TYPE: return 32;
354
160
      case WC_AES_128_CFB8_TYPE: return 16;
355
126
      case WC_AES_192_CFB8_TYPE: return 24;
356
125
      case WC_AES_256_CFB8_TYPE: return 32;
357
0
      case WC_AES_128_CFB128_TYPE: return 16;
358
0
      case WC_AES_192_CFB128_TYPE: return 24;
359
0
      case WC_AES_256_CFB128_TYPE: return 32;
360
0
  #endif
361
0
  #if defined(WOLFSSL_AES_OFB)
362
163
      case WC_AES_128_OFB_TYPE: return 16;
363
124
      case WC_AES_192_OFB_TYPE: return 24;
364
276
      case WC_AES_256_OFB_TYPE: return 32;
365
0
  #endif
366
0
  #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
367
      /* Two keys for XTS. */
368
354
      case WC_AES_128_XTS_TYPE: return 16 * 2;
369
95
      case WC_AES_256_XTS_TYPE: return 32 * 2;
370
0
  #endif
371
0
  #if defined(HAVE_AESGCM)
372
456
      case WC_AES_128_GCM_TYPE: return 16;
373
80
      case WC_AES_192_GCM_TYPE: return 24;
374
454
      case WC_AES_256_GCM_TYPE: return 32;
375
0
  #endif
376
0
  #if defined(HAVE_AESCCM)
377
0
      case WC_AES_128_CCM_TYPE: return 16;
378
0
      case WC_AES_192_CCM_TYPE: return 24;
379
0
      case WC_AES_256_CCM_TYPE: return 32;
380
0
  #endif
381
0
  #if defined(WOLFSSL_AES_COUNTER)
382
60
      case WC_AES_128_CTR_TYPE: return 16;
383
377
      case WC_AES_192_CTR_TYPE: return 24;
384
45
      case WC_AES_256_CTR_TYPE: return 32;
385
0
  #endif
386
0
  #if defined(HAVE_AES_ECB)
387
43
      case WC_AES_128_ECB_TYPE: return 16;
388
50
      case WC_AES_192_ECB_TYPE: return 24;
389
58
      case WC_AES_256_ECB_TYPE: return 32;
390
0
  #endif
391
0
#endif /* !NO_AES */
392
0
  #ifndef NO_DES3
393
209
      case WC_DES_CBC_TYPE:      return 8;
394
215
      case WC_DES_EDE3_CBC_TYPE: return 24;
395
439
      case WC_DES_ECB_TYPE:      return 8;
396
0
      case WC_DES_EDE3_ECB_TYPE: return 24;
397
0
  #endif
398
0
  #ifndef NO_RC4
399
63
      case WC_ARC4_TYPE:         return 16;
400
0
  #endif
401
0
  #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
402
0
      case WC_CHACHA20_POLY1305_TYPE: return 32;
403
0
  #endif
404
0
  #ifdef HAVE_CHACHA
405
0
      case WC_CHACHA20_TYPE: return CHACHA_MAX_KEY_SZ;
406
0
  #endif
407
0
  #ifdef WOLFSSL_SM4_ECB
408
0
      case WC_SM4_ECB_TYPE:      return 16;
409
0
  #endif
410
0
  #ifdef WOLFSSL_SM4_CBC
411
0
      case WC_SM4_CBC_TYPE:      return 16;
412
0
  #endif
413
0
  #ifdef WOLFSSL_SM4_CTR
414
0
      case WC_SM4_CTR_TYPE:      return 16;
415
0
  #endif
416
0
  #ifdef WOLFSSL_SM4_GCM
417
0
      case WC_SM4_GCM_TYPE:      return 16;
418
0
  #endif
419
0
  #ifdef WOLFSSL_SM4_CCM
420
0
      case WC_SM4_CCM_TYPE:      return 16;
421
0
  #endif
422
0
      default:
423
0
          return 0;
424
4.94k
      }
425
4.94k
}
426
427
428
int  wolfSSL_EVP_EncryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
429
                                        const WOLFSSL_EVP_CIPHER* type,
430
                                        const unsigned char* key,
431
                                        const unsigned char* iv)
432
0
{
433
0
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
434
0
}
435
436
int  wolfSSL_EVP_EncryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
437
                                        const WOLFSSL_EVP_CIPHER* type,
438
                                        WOLFSSL_ENGINE *impl,
439
                                        const unsigned char* key,
440
                                        const unsigned char* iv)
441
4.75k
{
442
4.75k
    (void) impl;
443
4.75k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
444
4.75k
}
445
446
int  wolfSSL_EVP_DecryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
447
                                        const WOLFSSL_EVP_CIPHER* type,
448
                                        const unsigned char* key,
449
                                        const unsigned char* iv)
450
0
{
451
0
    WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
452
0
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
453
0
}
454
455
int  wolfSSL_EVP_DecryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
456
                                        const WOLFSSL_EVP_CIPHER* type,
457
                                        WOLFSSL_ENGINE *impl,
458
                                        const unsigned char* key,
459
                                        const unsigned char* iv)
460
4.74k
{
461
4.74k
    (void) impl;
462
4.74k
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptInit");
463
4.74k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
464
4.74k
}
465
466
467
WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void)
468
8.15k
{
469
8.15k
    WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof(*ctx),
470
8.15k
                                                 NULL, DYNAMIC_TYPE_TMP_BUFFER);
471
8.15k
    if (ctx) {
472
8.15k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new");
473
8.15k
        wolfSSL_EVP_CIPHER_CTX_init(ctx);
474
8.15k
    }
475
8.15k
    return ctx;
476
8.15k
}
477
478
void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx)
479
8.15k
{
480
8.15k
    if (ctx) {
481
8.15k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_free");
482
8.15k
        wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
483
8.15k
        XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
484
8.15k
    }
485
8.15k
}
486
487
int wolfSSL_EVP_CIPHER_CTX_reset(WOLFSSL_EVP_CIPHER_CTX *ctx)
488
0
{
489
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
490
491
0
    if (ctx != NULL) {
492
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_reset");
493
0
        wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
494
0
        ret = WOLFSSL_SUCCESS;
495
0
    }
496
497
0
    return ret;
498
0
}
499
500
unsigned long wolfSSL_EVP_CIPHER_CTX_mode(const WOLFSSL_EVP_CIPHER_CTX *ctx)
501
0
{
502
0
  if (ctx == NULL) return 0;
503
0
  return ctx->flags & WOLFSSL_EVP_CIPH_MODE;
504
0
}
505
506
unsigned long wolfSSL_EVP_CIPHER_CTX_flags(const WOLFSSL_EVP_CIPHER_CTX *ctx)
507
0
{
508
0
    if (ctx == NULL) return 0;
509
0
    return ctx->flags;
510
0
}
511
512
int  wolfSSL_EVP_EncryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
513
                                   unsigned char *out, int *outl)
514
0
{
515
0
    if (ctx && ctx->enc) {
516
0
        WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal");
517
0
        return wolfSSL_EVP_CipherFinal(ctx, out, outl);
518
0
    }
519
0
    else
520
0
        return WOLFSSL_FAILURE;
521
0
}
522
523
524
int  wolfSSL_EVP_CipherInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
525
                                    const WOLFSSL_EVP_CIPHER* type,
526
                                    WOLFSSL_ENGINE *impl,
527
                                    const unsigned char* key,
528
                                    const unsigned char* iv,
529
                                    int enc)
530
0
{
531
0
    (void)impl;
532
0
    return wolfSSL_EVP_CipherInit(ctx, type, key, iv, enc);
533
0
}
534
535
int  wolfSSL_EVP_EncryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
536
                                   unsigned char *out, int *outl)
537
0
{
538
0
    if (ctx && ctx->enc) {
539
0
        WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal_ex");
540
0
        return wolfSSL_EVP_CipherFinal(ctx, out, outl);
541
0
    }
542
0
    else
543
0
        return WOLFSSL_FAILURE;
544
0
}
545
546
int  wolfSSL_EVP_DecryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
547
                                   unsigned char *out, int *outl)
548
0
{
549
0
    if (ctx && !ctx->enc) {
550
0
        WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal");
551
0
        return wolfSSL_EVP_CipherFinal(ctx, out, outl);
552
0
    }
553
0
    else {
554
0
        return WOLFSSL_FAILURE;
555
0
    }
556
0
}
557
558
int  wolfSSL_EVP_DecryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
559
                                   unsigned char *out, int *outl)
560
0
{
561
0
    if (ctx && !ctx->enc) {
562
0
        WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_ex");
563
0
        return wolfSSL_EVP_CipherFinal(ctx, out, outl);
564
0
    }
565
0
    else {
566
0
        return WOLFSSL_FAILURE;
567
0
    }
568
0
}
569
570
#ifdef DEBUG_WOLFSSL_EVP
571
#define PRINT_BUF(b, sz) { int _i; for(_i=0; _i<(sz); _i++) { \
572
  printf("%02x(%c),", (b)[_i], (b)[_i]); if ((_i+1)%8==0)printf("\n");}}
573
#else
574
10.3k
#define PRINT_BUF(b, sz) WC_DO_NOTHING
575
#endif
576
577
static int fillBuff(WOLFSSL_EVP_CIPHER_CTX *ctx, const unsigned char *in, int sz)
578
1.64k
{
579
1.64k
    if (sz > 0) {
580
1.64k
        int fill;
581
582
1.64k
        if ((sz+ctx->bufUsed) > ctx->block_size) {
583
306
            fill = ctx->block_size - ctx->bufUsed;
584
1.34k
        } else {
585
1.34k
            fill = sz;
586
1.34k
        }
587
1.64k
        XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, (size_t)fill);
588
1.64k
        ctx->bufUsed += fill;
589
1.64k
        return fill;
590
1.64k
    } else return 0;
591
1.64k
}
592
593
static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx,
594
                                   unsigned char *out,
595
                                   const unsigned char *in, int inLen)
596
4.97k
{
597
4.97k
    int ret = 0;
598
4.97k
    word32 inl = (word32)inLen;
599
600
4.97k
    switch (ctx->cipherType) {
601
0
#if !defined(NO_AES)
602
0
    #if defined(HAVE_AES_CBC)
603
187
        case WC_AES_128_CBC_TYPE:
604
272
        case WC_AES_192_CBC_TYPE:
605
336
        case WC_AES_256_CBC_TYPE:
606
336
            if (ctx->enc)
607
164
                ret = wc_AesCbcEncrypt(&ctx->cipher.aes, out, in, inl);
608
172
            else
609
172
                ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl);
610
336
            break;
611
0
    #endif
612
0
    #if defined(WOLFSSL_AES_COUNTER)
613
114
        case WC_AES_128_CTR_TYPE:
614
747
        case WC_AES_192_CTR_TYPE:
615
807
        case WC_AES_256_CTR_TYPE:
616
807
            ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
617
807
            break;
618
0
    #endif
619
0
    #if defined(HAVE_AES_ECB)
620
69
        case WC_AES_128_ECB_TYPE:
621
115
        case WC_AES_192_ECB_TYPE:
622
231
        case WC_AES_256_ECB_TYPE:
623
231
            if (ctx->enc)
624
183
                ret = wc_AesEcbEncrypt(&ctx->cipher.aes, out, in, inl);
625
48
            else
626
48
                ret = wc_AesEcbDecrypt(&ctx->cipher.aes, out, in, inl);
627
231
            break;
628
0
    #endif
629
0
    #if defined(WOLFSSL_AES_OFB)
630
295
        case WC_AES_128_OFB_TYPE:
631
492
        case WC_AES_192_OFB_TYPE:
632
899
        case WC_AES_256_OFB_TYPE:
633
899
            if (ctx->enc)
634
632
                ret = wc_AesOfbEncrypt(&ctx->cipher.aes, out, in, inl);
635
267
            else
636
267
                ret = wc_AesOfbDecrypt(&ctx->cipher.aes, out, in, inl);
637
899
            break;
638
0
    #endif
639
0
    #if defined(WOLFSSL_AES_CFB)
640
0
    #if !defined(WOLFSSL_NO_AES_CFB_1_8)
641
154
        case WC_AES_128_CFB1_TYPE:
642
204
        case WC_AES_192_CFB1_TYPE:
643
436
        case WC_AES_256_CFB1_TYPE:
644
436
            if (ctx->enc)
645
297
                ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, out, in,
646
297
                        inl * WOLFSSL_BIT_SIZE);
647
139
            else
648
139
                ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, out, in,
649
139
                        inl * WOLFSSL_BIT_SIZE);
650
436
            break;
651
652
242
        case WC_AES_128_CFB8_TYPE:
653
371
        case WC_AES_192_CFB8_TYPE:
654
437
        case WC_AES_256_CFB8_TYPE:
655
437
            if (ctx->enc)
656
244
                ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, out, in, inl);
657
193
            else
658
193
                ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, out, in, inl);
659
437
            break;
660
0
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
661
662
0
        case WC_AES_128_CFB128_TYPE:
663
0
        case WC_AES_192_CFB128_TYPE:
664
0
        case WC_AES_256_CFB128_TYPE:
665
0
            if (ctx->enc)
666
0
                ret = wc_AesCfbEncrypt(&ctx->cipher.aes, out, in, inl);
667
0
            else
668
0
                ret = wc_AesCfbDecrypt(&ctx->cipher.aes, out, in, inl);
669
0
            break;
670
0
    #endif
671
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
672
350
    case WC_AES_128_XTS_TYPE:
673
440
    case WC_AES_256_XTS_TYPE:
674
440
        if (ctx->enc)
675
208
            ret = wc_AesXtsEncrypt(&ctx->cipher.xts, out, in, inl,
676
208
                    ctx->iv, (word32)ctx->ivSz);
677
232
        else
678
232
            ret = wc_AesXtsDecrypt(&ctx->cipher.xts, out, in, inl,
679
232
                    ctx->iv, (word32)ctx->ivSz);
680
440
        break;
681
0
#endif
682
0
#endif /* !NO_AES */
683
0
    #ifndef NO_DES3
684
345
        case WC_DES_CBC_TYPE:
685
345
            if (ctx->enc)
686
232
                ret = wc_Des_CbcEncrypt(&ctx->cipher.des, out, in, inl);
687
113
            else
688
113
                ret = wc_Des_CbcDecrypt(&ctx->cipher.des, out, in, inl);
689
345
            break;
690
440
        case WC_DES_EDE3_CBC_TYPE:
691
440
            if (ctx->enc)
692
334
                ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, out, in, inl);
693
106
            else
694
106
                ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, out, in, inl);
695
440
            break;
696
0
        #if defined(WOLFSSL_DES_ECB)
697
550
        case WC_DES_ECB_TYPE:
698
550
            ret = wc_Des_EcbEncrypt(&ctx->cipher.des, out, in, inl);
699
550
            break;
700
0
        case WC_DES_EDE3_ECB_TYPE:
701
0
            ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, out, in, inl);
702
0
            break;
703
0
        #endif
704
0
    #endif
705
0
    #ifndef NO_RC4
706
49
        case WC_ARC4_TYPE:
707
49
            wc_Arc4Process(&ctx->cipher.arc4, out, in, inl);
708
49
            break;
709
0
    #endif
710
0
#if defined(WOLFSSL_SM4_ECB)
711
0
        case WC_SM4_ECB_TYPE:
712
0
            if (ctx->enc)
713
0
                wc_Sm4EcbEncrypt(&ctx->cipher.sm4, out, in, inl);
714
0
            else
715
0
                wc_Sm4EcbDecrypt(&ctx->cipher.sm4, out, in, inl);
716
0
            break;
717
0
#endif
718
0
#if defined(WOLFSSL_SM4_CBC)
719
0
        case WC_SM4_CBC_TYPE:
720
0
            if (ctx->enc)
721
0
                wc_Sm4CbcEncrypt(&ctx->cipher.sm4, out, in, inl);
722
0
            else
723
0
                wc_Sm4CbcDecrypt(&ctx->cipher.sm4, out, in, inl);
724
0
            break;
725
0
#endif
726
0
#if defined(WOLFSSL_SM4_CTR)
727
0
        case WC_SM4_CTR_TYPE:
728
0
            wc_Sm4CtrEncrypt(&ctx->cipher.sm4, out, in, inl);
729
0
            break;
730
0
#endif
731
732
0
        default:
733
0
            ret = WOLFSSL_FAILURE;
734
4.97k
    }
735
736
4.97k
    (void)in;
737
4.97k
    (void)inl;
738
4.97k
    (void)out;
739
740
4.97k
    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
741
4.97k
}
742
743
#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
744
#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
745
static int wolfSSL_EVP_CipherUpdate_GCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
746
0
        const unsigned char *in, int inl) {
747
0
    if (in && inl > 0) {
748
0
        byte* tmp;
749
0
        if (inl > INT_MAX - ctx->authInSz) {
750
0
            WOLFSSL_MSG("AuthIn overflow");
751
0
            return BAD_FUNC_ARG;
752
0
        }
753
    #ifdef WOLFSSL_NO_REALLOC
754
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
755
                DYNAMIC_TYPE_OPENSSL);
756
        if (tmp != NULL) {
757
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
758
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
759
            ctx->authIn = NULL;
760
        }
761
    #else
762
0
        tmp = (byte*)XREALLOC(ctx->authIn,
763
0
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
764
0
    #endif
765
0
        if (tmp) {
766
0
            ctx->authIn = tmp;
767
0
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
768
0
            ctx->authInSz += inl;
769
0
        }
770
0
        else {
771
0
            WOLFSSL_MSG("realloc error");
772
0
            return MEMORY_E;
773
0
        }
774
0
    }
775
0
    return 0;
776
0
}
777
#endif /* WOLFSSL_AESGCM_STREAM */
778
779
static int wolfSSL_EVP_CipherUpdate_GCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
780
                                   unsigned char *out, int *outl,
781
                                   const unsigned char *in, int inLen)
782
9.05k
{
783
9.05k
    word32 inl = (word32)inLen;
784
785
9.05k
#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
786
9.05k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
787
9.05k
    if (ctx->cipherType == WC_SM4_GCM_TYPE)
788
0
#endif
789
0
    {
790
0
        int ret = 0;
791
792
0
        *outl = inl;
793
0
        if (out) {
794
            /* Buffer input for one-shot API */
795
0
            if (inl > 0) {
796
0
                byte* tmp;
797
0
                if ((int)inl > INT_MAX - ctx->authBufferLen) {
798
0
                    return MEMORY_E;
799
0
                }
800
            #ifdef WOLFSSL_NO_REALLOC
801
                tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL,
802
                        DYNAMIC_TYPE_OPENSSL);
803
                if (tmp != NULL) {
804
                    XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
805
                    XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
806
                    ctx->authBuffer = NULL;
807
                }
808
            #else
809
0
                tmp = (byte*)XREALLOC(ctx->authBuffer,
810
0
                        (size_t)(ctx->authBufferLen + inl), NULL,
811
0
                        DYNAMIC_TYPE_OPENSSL);
812
0
            #endif
813
0
                if (tmp) {
814
0
                    XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
815
0
                    ctx->authBufferLen += inl;
816
0
                    ctx->authBuffer = tmp;
817
0
                    *outl = 0;
818
0
                }
819
0
                else {
820
0
                    ret = MEMORY_E;
821
0
                }
822
0
            }
823
0
        }
824
0
        else {
825
0
            ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, in, inl);
826
0
        }
827
828
0
        if (ret != 0) {
829
0
            *outl = 0;
830
0
            return WOLFSSL_FAILURE;
831
0
        }
832
833
0
        return WOLFSSL_SUCCESS;
834
0
    }
835
9.05k
#endif
836
9.05k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
837
9.05k
    else
838
9.05k
#endif
839
9.05k
#if defined(WOLFSSL_AESGCM_STREAM)
840
9.05k
    {
841
9.05k
        int ret;
842
843
        /* When out is NULL then this is AAD. */
844
9.05k
        if (out == NULL) {
845
1.53k
            if (ctx->enc) {
846
63
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
847
63
                    in, inl);
848
63
            }
849
1.47k
            else {
850
1.47k
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
851
1.47k
                    in, inl);
852
1.47k
            }
853
1.53k
        }
854
        /* When out is not NULL then this is plaintext/cipher text. */
855
7.52k
        else {
856
7.52k
            if (ctx->enc) {
857
7.20k
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl,
858
7.20k
                    NULL, 0);
859
7.20k
            }
860
318
            else {
861
318
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl,
862
318
                    NULL, 0);
863
318
            }
864
7.52k
        }
865
9.05k
        *outl = (int)inl;
866
9.05k
        if (ret == 0) {
867
9.05k
            ret = WOLFSSL_SUCCESS;
868
9.05k
        }
869
0
        else {
870
0
            ret = WOLFSSL_FAILURE;
871
0
        }
872
9.05k
        return ret;
873
9.05k
    }
874
9.05k
#endif /* WOLFSSL_AESGCM_STREAM */
875
9.05k
}
876
#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM */
877
878
#if defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_CCM)
879
static int wolfSSL_EVP_CipherUpdate_CCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
880
0
        const unsigned char *in, int inl) {
881
0
    if (in && inl > 0) {
882
0
        byte* tmp;
883
0
        if (inl > INT_MAX - ctx->authInSz) {
884
0
            WOLFSSL_MSG("AuthIn overflow");
885
0
            return BAD_FUNC_ARG;
886
0
        }
887
    #ifdef WOLFSSL_NO_REALLOC
888
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
889
                DYNAMIC_TYPE_OPENSSL);
890
        if (tmp != NULL) {
891
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
892
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
893
            ctx->authIn = NULL;
894
        }
895
    #else
896
0
        tmp = (byte*)XREALLOC(ctx->authIn,
897
0
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
898
0
    #endif
899
0
        if (tmp) {
900
0
            ctx->authIn = tmp;
901
0
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
902
0
            ctx->authInSz += inl;
903
0
        }
904
0
        else {
905
0
            WOLFSSL_MSG("realloc error");
906
0
            return MEMORY_E;
907
0
        }
908
0
    }
909
0
    return 0;
910
0
}
911
912
static int wolfSSL_EVP_CipherUpdate_CCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
913
                                   unsigned char *out, int *outl,
914
                                   const unsigned char *in, int inl)
915
0
{
916
0
    int ret = 0;
917
918
0
    *outl = inl;
919
0
    if (out) {
920
        /* Buffer input for one-shot API */
921
0
        if (inl > 0) {
922
0
            byte* tmp;
923
0
            if (inl > INT_MAX - ctx->authBufferLen) {
924
0
                return MEMORY_E;
925
0
            }
926
        #ifdef WOLFSSL_NO_REALLOC
927
            tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL,
928
                    DYNAMIC_TYPE_OPENSSL);
929
            if (tmp != NULL) {
930
                XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
931
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
932
                ctx->authBuffer = NULL;
933
            }
934
        #else
935
0
            tmp = (byte*)XREALLOC(ctx->authBuffer,
936
0
                    (size_t)(ctx->authBufferLen + inl), NULL,
937
0
                    DYNAMIC_TYPE_OPENSSL);
938
0
        #endif
939
0
            if (tmp) {
940
0
                XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
941
0
                ctx->authBufferLen += inl;
942
0
                ctx->authBuffer = tmp;
943
0
                *outl = 0;
944
0
            }
945
0
            else {
946
0
                ret = MEMORY_E;
947
0
            }
948
0
        }
949
0
    }
950
0
    else {
951
0
        ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, in, inl);
952
0
    }
953
954
0
    if (ret != 0) {
955
0
        *outl = 0;
956
0
        return WOLFSSL_FAILURE;
957
0
    }
958
959
0
    return WOLFSSL_SUCCESS;
960
0
}
961
#endif /* HAVE_AESCCM || WOLFSSL_SM4_CCM */
962
963
#if defined(HAVE_ARIA)
964
static int wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
965
        const unsigned char *in, int inl)
966
{
967
    if (in && inl > 0) {
968
        byte* tmp;
969
        if (inl > INT_MAX - ctx->authInSz) {
970
            WOLFSSL_MSG("AuthIn overflow");
971
            return BAD_FUNC_ARG;
972
        }
973
    #ifdef WOLFSSL_NO_REALLOC
974
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
975
                DYNAMIC_TYPE_OPENSSL);
976
        if (tmp != NULL) {
977
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
978
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
979
            ctx->authIn = NULL;
980
        }
981
    #else
982
        tmp = (byte*)XREALLOC(ctx->authIn,
983
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
984
    #endif
985
        if (tmp) {
986
            ctx->authIn = tmp;
987
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
988
            ctx->authInSz += inl;
989
        }
990
        else {
991
            WOLFSSL_MSG("realloc error");
992
            return MEMORY_E;
993
        }
994
    }
995
    return 0;
996
}
997
998
static int wolfSSL_EVP_CipherUpdate_AriaGCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
999
                                   unsigned char *out, int *outl,
1000
                                   const unsigned char *in, int inl)
1001
{
1002
    int ret = 0;
1003
1004
    *outl = inl;
1005
    if (out) {
1006
        /* Buffer input for one-shot API */
1007
        if (inl > 0) {
1008
            byte* tmp;
1009
            int size = ctx->authBufferLen + inl;
1010
            if (ctx->enc == 0) { /* Append extra space for the tag */
1011
                size = WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(size);
1012
            }
1013
        #ifdef WOLFSSL_NO_REALLOC
1014
            tmp = (byte*)XMALLOC((size_t)size, NULL,
1015
                DYNAMIC_TYPE_OPENSSL);
1016
            if (tmp != NULL) {
1017
                XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
1018
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1019
                ctx->authBuffer = NULL;
1020
            }
1021
        #else
1022
            tmp = (byte*)XREALLOC(ctx->authBuffer, (size_t)size, NULL,
1023
                DYNAMIC_TYPE_OPENSSL);
1024
        #endif
1025
            if (tmp) {
1026
                XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
1027
                ctx->authBufferLen += inl;
1028
                ctx->authBuffer = tmp;
1029
                *outl = 0;
1030
            }
1031
            else {
1032
                ret = MEMORY_E;
1033
            }
1034
        }
1035
    }
1036
    else {
1037
        ret = wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(ctx, in, inl);
1038
    }
1039
1040
    if (ret != 0) {
1041
        *outl = 0;
1042
        return WOLFSSL_FAILURE;
1043
    }
1044
1045
    return WOLFSSL_SUCCESS;
1046
}
1047
#endif /* HAVE_ARIA */
1048
1049
1050
/* returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
1051
int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx,
1052
                                   unsigned char *out, int *outl,
1053
                                   const unsigned char *in, int inl)
1054
28.3k
{
1055
28.3k
    int blocks;
1056
1057
28.3k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherUpdate");
1058
28.3k
    if ((ctx == NULL) || (outl == NULL)) {
1059
0
        WOLFSSL_MSG("Bad argument");
1060
0
        return WOLFSSL_FAILURE;
1061
0
    }
1062
1063
28.3k
    *outl = 0;
1064
1065
28.3k
    if ((inl == 0) && (in == NULL)) {
1066
        /* Nothing to do in this case. Just return. */
1067
385
        return WOLFSSL_SUCCESS;
1068
385
    }
1069
1070
27.9k
    if ((inl < 0) || (in == NULL)) {
1071
0
        WOLFSSL_MSG("Bad argument");
1072
0
        return WOLFSSL_FAILURE;
1073
0
    }
1074
1075
27.9k
    switch (ctx->cipherType) {
1076
0
        case WC_NULL_CIPHER_TYPE:
1077
0
            if (out == NULL) {
1078
0
                WOLFSSL_MSG("Bad argument");
1079
0
                return WOLFSSL_FAILURE;
1080
0
            }
1081
0
            XMEMMOVE(out, in, inl);
1082
0
            *outl = inl;
1083
0
            return WOLFSSL_SUCCESS;
1084
0
#if !defined(NO_AES) && defined(HAVE_AESGCM)
1085
5.05k
        case WC_AES_128_GCM_TYPE:
1086
5.74k
        case WC_AES_192_GCM_TYPE:
1087
9.05k
        case WC_AES_256_GCM_TYPE:
1088
            /* if out == NULL, in/inl contains the additional auth data */
1089
9.05k
            return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
1090
0
#endif /* !defined(NO_AES) && defined(HAVE_AESGCM) */
1091
0
#if !defined(NO_AES) && defined(HAVE_AESCCM)
1092
0
        case WC_AES_128_CCM_TYPE:
1093
0
        case WC_AES_192_CCM_TYPE:
1094
0
        case WC_AES_256_CCM_TYPE:
1095
            /* if out == NULL, in/inl contains the
1096
             * additional auth data */
1097
0
            return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
1098
0
#endif /* !defined(NO_AES) && defined(HAVE_AESCCM) */
1099
#if defined(HAVE_ARIA)
1100
        case WC_ARIA_128_GCM_TYPE:
1101
        case WC_ARIA_192_GCM_TYPE:
1102
        case WC_ARIA_256_GCM_TYPE:
1103
            /* if out == NULL, in/inl contains the additional auth data */
1104
            return wolfSSL_EVP_CipherUpdate_AriaGCM(ctx, out, outl, in, inl);
1105
#endif /* defined(HAVE_ARIA) */
1106
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
1107
0
        case WC_CHACHA20_POLY1305_TYPE:
1108
0
            if (out == NULL) {
1109
0
                if (wc_ChaCha20Poly1305_UpdateAad(&ctx->cipher.chachaPoly, in,
1110
0
                                                  (word32)inl) != 0) {
1111
0
                    WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateAad failed");
1112
0
                    return WOLFSSL_FAILURE;
1113
0
                }
1114
0
                else {
1115
0
                    *outl = inl;
1116
0
                    return WOLFSSL_SUCCESS;
1117
0
                }
1118
0
            }
1119
0
            else {
1120
0
                if (wc_ChaCha20Poly1305_UpdateData(&ctx->cipher.chachaPoly, in,
1121
0
                                                   out, (word32)inl) != 0) {
1122
0
                    WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateData failed");
1123
0
                    return WOLFSSL_FAILURE;
1124
0
                }
1125
0
                else {
1126
0
                    *outl = inl;
1127
0
                    return WOLFSSL_SUCCESS;
1128
0
                }
1129
0
            }
1130
0
#endif
1131
0
#ifdef HAVE_CHACHA
1132
0
        case WC_CHACHA20_TYPE:
1133
0
            if (wc_Chacha_Process(&ctx->cipher.chacha, out, in, (word32)inl) !=
1134
0
                    0) {
1135
0
                WOLFSSL_MSG("wc_ChaCha_Process failed");
1136
0
                return WOLFSSL_FAILURE;
1137
0
            }
1138
0
            *outl = inl;
1139
0
            return WOLFSSL_SUCCESS;
1140
0
#endif
1141
0
#ifdef WOLFSSL_SM4_GCM
1142
0
        case WC_SM4_GCM_TYPE:
1143
            /* if out == NULL, in/inl contains the additional auth data */
1144
0
            return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
1145
0
#endif
1146
0
#ifdef WOLFSSL_SM4_CCM
1147
0
        case WC_SM4_CCM_TYPE:
1148
            /* if out == NULL, in/inl contains the
1149
             * additional auth data */
1150
0
            return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
1151
0
#endif
1152
18.8k
        default:
1153
            /* fall-through */
1154
18.8k
            break;
1155
27.9k
    }
1156
1157
18.8k
    if (out == NULL) {
1158
1
        return WOLFSSL_FAILURE;
1159
1
    }
1160
1161
    /* if(inl == 0)wolfSSL_EVP_CipherUpdate_GCM to get tag */
1162
18.8k
    if (inl == 0) {
1163
13.6k
        return WOLFSSL_SUCCESS;
1164
13.6k
    }
1165
5.25k
    if (ctx->bufUsed > 0) { /* concatenate them if there is anything */
1166
911
        int fill = fillBuff(ctx, in, inl);
1167
911
        inl -= fill;
1168
911
        in  += fill;
1169
911
    }
1170
1171
    /* check if the buff is full, and if so flash it out */
1172
5.25k
    if (ctx->bufUsed == ctx->block_size) {
1173
471
        byte* output = out;
1174
1175
        /* During decryption we save the last block to check padding on Final.
1176
         * Update the last block stored if one has already been stored */
1177
471
        if (ctx->enc == 0) {
1178
0
            if (ctx->lastUsed == 1) {
1179
0
                XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
1180
0
                *outl+= ctx->block_size;
1181
0
                out  += ctx->block_size;
1182
0
            }
1183
0
            output = ctx->lastBlock; /* redirect output to last block buffer */
1184
0
            ctx->lastUsed = 1;
1185
0
        }
1186
1187
471
        PRINT_BUF(ctx->buf, ctx->block_size);
1188
471
        if (evpCipherBlock(ctx, output, ctx->buf, ctx->block_size) == 0) {
1189
0
            return WOLFSSL_FAILURE;
1190
0
        }
1191
471
        PRINT_BUF(out, ctx->block_size);
1192
471
        ctx->bufUsed = 0;
1193
1194
        /* if doing encryption update the new output block, decryption will
1195
         * always have the last block saved for when Final is called */
1196
471
        if ((ctx->enc != 0)) {
1197
471
            *outl+= ctx->block_size;
1198
471
            out  += ctx->block_size;
1199
471
        }
1200
471
    }
1201
1202
5.25k
    blocks = inl / ctx->block_size;
1203
5.25k
    if (blocks > 0) {
1204
        /* During decryption we save the last block to check padding on Final.
1205
         * Update the last block stored if one has already been stored */
1206
4.25k
        if ((ctx->enc == 0) && (ctx->lastUsed == 1)) {
1207
0
            PRINT_BUF(ctx->lastBlock, ctx->block_size);
1208
0
            XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
1209
0
            *outl += ctx->block_size;
1210
0
            out += ctx->block_size;
1211
0
            ctx->lastUsed = 0;
1212
0
        }
1213
1214
        /* process blocks */
1215
4.25k
        if (evpCipherBlock(ctx, out, in, blocks * ctx->block_size) == 0) {
1216
11
            return WOLFSSL_FAILURE;
1217
11
        }
1218
4.24k
        PRINT_BUF(in, ctx->block_size*blocks);
1219
4.24k
        PRINT_BUF(out,ctx->block_size*blocks);
1220
4.24k
        inl  -= ctx->block_size * blocks;
1221
4.24k
        in   += ctx->block_size * blocks;
1222
4.24k
        if (ctx->enc == 0) {
1223
1.69k
            if ((ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) ||
1224
1.46k
                    (ctx->block_size == 1)) {
1225
1.29k
                ctx->lastUsed = 0;
1226
1.29k
                *outl += ctx->block_size * blocks;
1227
1.29k
            } else {
1228
                /* in the case of decryption and padding, store the last block
1229
                 * here in order to verify the padding when Final is called */
1230
391
                if (inl == 0) { /* if not 0 then we know leftovers are checked*/
1231
388
                    ctx->lastUsed = 1;
1232
388
                    blocks = blocks - 1; /* save last block to check padding in
1233
                                          * EVP_CipherFinal call */
1234
388
                    XMEMCPY(ctx->lastBlock, &out[ctx->block_size * blocks],
1235
388
                            (size_t)ctx->block_size);
1236
388
                }
1237
391
                *outl += ctx->block_size * blocks;
1238
391
            }
1239
2.55k
        } else {
1240
2.55k
            *outl += ctx->block_size * blocks;
1241
2.55k
        }
1242
4.24k
    }
1243
1244
1245
5.24k
    if (inl > 0) {
1246
        /* put fraction into buff */
1247
738
        fillBuff(ctx, in, inl);
1248
        /* no increase of outl */
1249
738
    }
1250
5.24k
    (void)out; /* silence warning in case not read */
1251
1252
5.24k
    return WOLFSSL_SUCCESS;
1253
5.25k
}
1254
1255
static void padBlock(WOLFSSL_EVP_CIPHER_CTX *ctx)
1256
246
{
1257
246
    int i;
1258
1.53k
    for (i = ctx->bufUsed; i < ctx->block_size; i++)
1259
1.29k
        ctx->buf[i] = (byte)(ctx->block_size - ctx->bufUsed);
1260
246
}
1261
1262
static int checkPad(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *buff)
1263
388
{
1264
388
    int i;
1265
388
    int n;
1266
388
    byte mask = 0;
1267
388
    n = buff[ctx->block_size-1];
1268
    /* Encode invalid n into mask constant-time instead of early-returning,
1269
     * so the loop always runs and timing does not reveal padding length. */
1270
388
    mask |= ctMaskEq(n, 0) | ctMaskGT(n, ctx->block_size);
1271
4.86k
    for (i = 0; i < ctx->block_size; i++) {
1272
4.48k
        byte in_padding = ctMaskLT(i, n);
1273
4.48k
        mask |= ctMaskSel(in_padding,
1274
4.48k
                    ctMaskNotEq(buff[ctx->block_size - 1 - i], n), 0);
1275
4.48k
    }
1276
388
    return ctMaskSelInt(ctMaskEq(mask, 0), ctx->block_size - n, -1);
1277
388
}
1278
1279
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1280
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1281
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1282
static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
1283
0
{
1284
0
    int i;
1285
0
    for (i = (int)ctrSz-1; i >= 0; i--) {
1286
0
        if (++ctr[i])
1287
0
            break;
1288
0
    }
1289
0
}
1290
#endif
1291
1292
int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out,
1293
                            int *outl)
1294
4.16k
{
1295
4.16k
    int ret = WOLFSSL_SUCCESS;
1296
1297
4.16k
    if (!ctx || !outl)
1298
0
        return WOLFSSL_FAILURE;
1299
1300
4.16k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal");
1301
4.16k
    switch (ctx->cipherType) {
1302
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1303
0
    || FIPS_VERSION_GE(2,0))
1304
437
        case WC_AES_128_GCM_TYPE:
1305
509
        case WC_AES_192_GCM_TYPE:
1306
914
        case WC_AES_256_GCM_TYPE:
1307
#ifndef WOLFSSL_AESGCM_STREAM
1308
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1309
             || (ctx->authBufferLen == 0)) {
1310
                if (ctx->enc)
1311
                    ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out,
1312
                            ctx->authBuffer, ctx->authBufferLen,
1313
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1314
                            ctx->authIn, ctx->authInSz);
1315
                else
1316
                    ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out,
1317
                            ctx->authBuffer, ctx->authBufferLen,
1318
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1319
                            ctx->authIn, ctx->authInSz);
1320
1321
                if (ret == 0) {
1322
                    ret = WOLFSSL_SUCCESS;
1323
                    *outl = ctx->authBufferLen;
1324
                }
1325
                else {
1326
                    ret = WOLFSSL_FAILURE;
1327
                    *outl = 0;
1328
                }
1329
1330
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1331
                ctx->authBuffer = NULL;
1332
                ctx->authBufferLen = 0;
1333
1334
                if (ctx->authIncIv) {
1335
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1336
                    ctx->authIncIv = 0;
1337
                }
1338
            }
1339
            else {
1340
                *outl = 0;
1341
            }
1342
#else
1343
            /* No data to return - all handled in Update. */
1344
914
            *outl = 0;
1345
914
            if (ctx->enc) {
1346
519
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, ctx->authTag,
1347
519
                    (word32)ctx->authTagSz);
1348
519
            }
1349
395
            else {
1350
395
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, ctx->authTag,
1351
395
                    (word32)ctx->authTagSz);
1352
395
                if (ctx->authIncIv) {
1353
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1354
0
                }
1355
395
            }
1356
1357
914
            if (ret == 0)
1358
762
                ret = WOLFSSL_SUCCESS;
1359
152
            else
1360
152
                ret = WOLFSSL_FAILURE;
1361
1362
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
1363
914
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
1364
914
                              (byte*)ctx->cipher.aes.reg,
1365
914
                              (word32)ctx->ivSz) != 0)
1366
0
            {
1367
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
1368
0
                ret = WOLFSSL_FAILURE;
1369
0
            }
1370
914
#endif /* WOLFSSL_AESGCM_STREAM */
1371
914
            if (ret == WOLFSSL_SUCCESS) {
1372
762
                if (ctx->authIncIv) {
1373
0
                    ctx->authIncIv = 0;
1374
0
                }
1375
762
                else {
1376
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1377
762
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1378
762
                }
1379
762
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1380
0
                    ret = WOLFSSL_FAILURE;
1381
0
                }
1382
762
            }
1383
914
            break;
1384
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1385
        * HAVE_FIPS_VERSION >= 2 */
1386
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1387
0
    || FIPS_VERSION_GE(2,0))
1388
0
        case WC_AES_128_CCM_TYPE:
1389
0
        case WC_AES_192_CCM_TYPE:
1390
0
        case WC_AES_256_CCM_TYPE:
1391
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1392
0
             || (ctx->authBufferLen == 0)) {
1393
0
                if (ctx->enc) {
1394
0
                    ret = wc_AesCcmEncrypt(&ctx->cipher.aes, out,
1395
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1396
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1397
0
                        (word32)ctx->authTagSz, ctx->authIn,
1398
0
                        (word32)ctx->authInSz);
1399
0
                }
1400
0
                else {
1401
0
                    ret = wc_AesCcmDecrypt(&ctx->cipher.aes, out,
1402
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1403
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1404
0
                        (word32)ctx->authTagSz, ctx->authIn,
1405
0
                        (word32)ctx->authInSz);
1406
0
                }
1407
1408
0
                if (ret == 0) {
1409
0
                    ret = WOLFSSL_SUCCESS;
1410
0
                    *outl = ctx->authBufferLen;
1411
0
                }
1412
0
                else {
1413
0
                    ret = WOLFSSL_FAILURE;
1414
0
                    *outl = 0;
1415
0
                }
1416
1417
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1418
0
                ctx->authBuffer = NULL;
1419
0
                ctx->authBufferLen = 0;
1420
1421
0
                if (ctx->authIncIv) {
1422
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1423
0
                    ctx->authIncIv = 0;
1424
0
                }
1425
0
            }
1426
0
            else {
1427
0
                *outl = 0;
1428
0
            }
1429
0
            if (ret == WOLFSSL_SUCCESS) {
1430
0
                if (ctx->authIncIv) {
1431
0
                    ctx->authIncIv = 0;
1432
0
                }
1433
0
                else {
1434
                    /* Clear IV, since IV reuse is not recommended
1435
                     * for AES CCM. */
1436
0
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1437
0
                }
1438
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1439
0
                    ret = WOLFSSL_FAILURE;
1440
0
                }
1441
0
            }
1442
0
            break;
1443
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1444
        * HAVE_FIPS_VERSION >= 2 */
1445
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1446
    || FIPS_VERSION_GE(2,0))
1447
        case WC_ARIA_128_GCM_TYPE:
1448
        case WC_ARIA_192_GCM_TYPE:
1449
        case WC_ARIA_256_GCM_TYPE:
1450
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1451
             || (ctx->authBufferLen == 0)) {
1452
                if (ctx->enc)
1453
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, out,
1454
                            ctx->authBuffer, ctx->authBufferLen,
1455
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1456
                            ctx->authTag, ctx->authTagSz);
1457
                else
1458
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, out,
1459
                            ctx->authBuffer, ctx->authBufferLen,
1460
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1461
                            ctx->authTag, ctx->authTagSz);
1462
1463
                if (ret == 0) {
1464
                    ret = WOLFSSL_SUCCESS;
1465
                    *outl = ctx->authBufferLen;
1466
                }
1467
                else {
1468
                    ret = WOLFSSL_FAILURE;
1469
                    *outl = 0;
1470
                }
1471
1472
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1473
                ctx->authBuffer = NULL;
1474
                ctx->authBufferLen = 0;
1475
1476
                if (ctx->authIncIv) {
1477
                    IncCtr((byte*)ctx->cipher.aria.nonce,
1478
                           ctx->cipher.aria.nonceSz);
1479
                    ctx->authIncIv = 0;
1480
                }
1481
            }
1482
            else {
1483
                *outl = 0;
1484
            }
1485
            if (ret == WOLFSSL_SUCCESS) {
1486
                if (ctx->authIncIv) {
1487
                    ctx->authIncIv = 0;
1488
                }
1489
                else {
1490
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1491
                    XMEMSET(ctx->iv, 0, ARIA_BLOCK_SIZE);
1492
                }
1493
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1494
                    ret = WOLFSSL_FAILURE;
1495
                }
1496
            }
1497
            break;
1498
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1499
        * HAVE_FIPS_VERSION >= 2 */
1500
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
1501
0
        case WC_CHACHA20_POLY1305_TYPE:
1502
0
            if (wc_ChaCha20Poly1305_Final(&ctx->cipher.chachaPoly,
1503
0
                                          ctx->authTag) != 0) {
1504
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Final failed");
1505
0
                return WOLFSSL_FAILURE;
1506
0
            }
1507
0
            else {
1508
0
                *outl = 0;
1509
0
                return WOLFSSL_SUCCESS;
1510
0
            }
1511
0
            break;
1512
0
#endif
1513
0
#ifdef WOLFSSL_SM4_GCM
1514
0
        case WC_SM4_GCM_TYPE:
1515
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1516
0
                     (ctx->authBufferLen == 0)) {
1517
0
                if (ctx->enc)
1518
0
                    ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, out,
1519
0
                            ctx->authBuffer, ctx->authBufferLen,
1520
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1521
0
                            ctx->authIn, ctx->authInSz);
1522
0
                else
1523
0
                    ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, out,
1524
0
                            ctx->authBuffer, ctx->authBufferLen,
1525
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1526
0
                            ctx->authIn, ctx->authInSz);
1527
1528
0
                if (ret == 0) {
1529
0
                    ret = WOLFSSL_SUCCESS;
1530
0
                    *outl = ctx->authBufferLen;
1531
0
                }
1532
0
                else {
1533
0
                    ret = WOLFSSL_FAILURE;
1534
0
                    *outl = 0;
1535
0
                }
1536
1537
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1538
0
                ctx->authBuffer = NULL;
1539
0
                ctx->authBufferLen = 0;
1540
1541
0
                if (ctx->authIncIv) {
1542
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1543
0
                    ctx->authIncIv = 0;
1544
0
                }
1545
0
            }
1546
0
            else {
1547
0
                *outl = 0;
1548
0
            }
1549
0
            if (ret == WOLFSSL_SUCCESS) {
1550
0
                if (ctx->authIncIv) {
1551
0
                    ctx->authIncIv = 0;
1552
0
                }
1553
0
                else {
1554
                    /* Clear IV, since IV reuse is not recommended for SM4 GCM.
1555
                     */
1556
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1557
0
                }
1558
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1559
0
                    ret = WOLFSSL_FAILURE;
1560
0
                }
1561
0
            }
1562
0
            break;
1563
0
#endif
1564
0
#ifdef WOLFSSL_SM4_CCM
1565
0
        case WC_SM4_CCM_TYPE:
1566
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1567
0
                    (ctx->authBufferLen == 0)) {
1568
0
                if (ctx->enc)
1569
0
                    ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, out,
1570
0
                            ctx->authBuffer, ctx->authBufferLen,
1571
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1572
0
                            ctx->authIn, ctx->authInSz);
1573
0
                else
1574
0
                    ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, out,
1575
0
                            ctx->authBuffer, ctx->authBufferLen,
1576
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1577
0
                            ctx->authIn, ctx->authInSz);
1578
1579
0
                if (ret == 0) {
1580
0
                    ret = WOLFSSL_SUCCESS;
1581
0
                    *outl = ctx->authBufferLen;
1582
0
                }
1583
0
                else {
1584
0
                    ret = WOLFSSL_FAILURE;
1585
0
                    *outl = 0;
1586
0
                }
1587
1588
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1589
0
                ctx->authBuffer = NULL;
1590
0
                ctx->authBufferLen = 0;
1591
1592
0
                if (ctx->authIncIv) {
1593
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1594
0
                    ctx->authIncIv = 0;
1595
0
                }
1596
0
            }
1597
0
            else {
1598
0
                *outl = 0;
1599
0
            }
1600
0
            if (ret == WOLFSSL_SUCCESS) {
1601
0
                if (ctx->authIncIv) {
1602
0
                    ctx->authIncIv = 0;
1603
0
                }
1604
0
                else {
1605
                    /* Clear IV, since IV reuse is not recommended
1606
                     * for SM4 CCM. */
1607
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1608
0
                }
1609
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1610
0
                    ret = WOLFSSL_FAILURE;
1611
0
                }
1612
0
            }
1613
0
            break;
1614
0
#endif
1615
3.24k
        default:
1616
3.24k
            if (!out)
1617
0
                return WOLFSSL_FAILURE;
1618
1619
3.24k
            if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) {
1620
546
                if (ctx->bufUsed != 0) return WOLFSSL_FAILURE;
1621
444
                *outl = 0;
1622
444
            }
1623
2.70k
            else if (ctx->enc) {
1624
1.20k
                if (ctx->block_size == 1) {
1625
957
                    *outl = 0;
1626
957
                }
1627
246
                else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) {
1628
246
                    padBlock(ctx);
1629
246
                    PRINT_BUF(ctx->buf, ctx->block_size);
1630
246
                    if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) {
1631
0
                        WOLFSSL_MSG("Final Cipher Block failed");
1632
0
                        ret = WOLFSSL_FAILURE;
1633
0
                    }
1634
246
                    else {
1635
246
                        PRINT_BUF(out, ctx->block_size);
1636
246
                        *outl = ctx->block_size;
1637
246
                    }
1638
246
                }
1639
1.20k
            }
1640
1.49k
            else {
1641
1.49k
                if (ctx->block_size == 1) {
1642
1.08k
                    *outl = 0;
1643
1.08k
                }
1644
419
                else if ((ctx->bufUsed % ctx->block_size) != 0) {
1645
21
                    *outl = 0;
1646
                    /* not enough padding for decrypt */
1647
21
                    WOLFSSL_MSG("Final Cipher Block not enough padding");
1648
21
                    ret = WOLFSSL_FAILURE;
1649
21
                }
1650
398
                else if (ctx->lastUsed) {
1651
388
                    int fl;
1652
388
                    PRINT_BUF(ctx->lastBlock, ctx->block_size);
1653
388
                    if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) {
1654
333
                        XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1655
333
                        *outl = fl;
1656
333
                        if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1657
                            /* return error in cases where the block length is
1658
                             * incorrect */
1659
0
                            WOLFSSL_MSG("Final Cipher Block bad length");
1660
0
                            ret = WOLFSSL_FAILURE;
1661
0
                        }
1662
333
                    }
1663
55
                    else {
1664
55
                        ret = WOLFSSL_FAILURE;
1665
55
                    }
1666
388
                }
1667
10
                else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1668
                    /* return error in cases where the block length is
1669
                     * incorrect */
1670
10
                    ret = WOLFSSL_FAILURE;
1671
10
                }
1672
1.49k
            }
1673
3.14k
            break;
1674
4.16k
    }
1675
1676
4.06k
    if (ret == WOLFSSL_SUCCESS) {
1677
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1678
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1679
3.82k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1680
3.82k
            || FIPS_VERSION_GE(2,0))
1681
3.82k
        byte tmp = 0;
1682
1683
        /*
1684
         * This flag needs to retain its value between wolfSSL_EVP_CipherFinal
1685
         * calls. wolfSSL_EVP_CipherInit will clear it, so we save and restore
1686
         * it here.
1687
         */
1688
3.82k
        if (FALSE
1689
3.82k
        #ifdef HAVE_AESGCM
1690
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1691
3.48k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1692
3.45k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1693
3.06k
        #endif
1694
3.06k
        #ifdef HAVE_AESCCM
1695
3.06k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1696
3.06k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1697
3.06k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1698
3.06k
        #endif
1699
3.06k
        #ifdef WOLFSSL_SM4_GCM
1700
3.06k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1701
3.06k
        #endif
1702
3.06k
        #ifdef WOLFSSL_SM4_CCM
1703
3.06k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1704
3.82k
        #endif
1705
3.82k
            ) {
1706
762
            tmp = ctx->authIvGenEnable;
1707
762
        }
1708
3.82k
#endif
1709
1710
        /* reset cipher state after final */
1711
3.82k
        ret = wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1);
1712
1713
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1714
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1715
3.82k
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1716
3.82k
        if (FALSE
1717
3.82k
        #ifdef HAVE_AESGCM
1718
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1719
3.48k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1720
3.45k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1721
3.06k
        #endif
1722
3.06k
        #ifdef HAVE_AESCCM
1723
3.06k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1724
3.06k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1725
3.06k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1726
3.06k
        #endif
1727
3.06k
        #ifdef WOLFSSL_SM4_GCM
1728
3.06k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1729
3.06k
        #endif
1730
3.06k
        #ifdef WOLFSSL_SM4_CCM
1731
3.06k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1732
3.82k
        #endif
1733
3.82k
            ) {
1734
762
            ctx->authIvGenEnable = (tmp == 1);
1735
762
        }
1736
3.82k
#endif
1737
3.82k
    }
1738
1739
4.06k
    return ret;
1740
4.16k
}
1741
1742
1743
#ifdef WOLFSSL_EVP_DECRYPT_LEGACY
1744
/* This is a version of DecryptFinal to work with data encrypted with
1745
 * wolfSSL_EVP_EncryptFinal() with the broken padding. (pre-v3.12.0)
1746
 * Only call this after wolfSSL_EVP_CipherFinal() fails on a decrypt.
1747
 * Note, you don't know if the padding is good or bad with the old
1748
 * encrypt, but it is likely to be or bad. It will update the output
1749
 * length with the block_size so the last block is still captured. */
1750
int  wolfSSL_EVP_DecryptFinal_legacy(WOLFSSL_EVP_CIPHER_CTX *ctx,
1751
        unsigned char *out, int *outl)
1752
{
1753
    int fl;
1754
    if (ctx == NULL || out == NULL || outl == NULL)
1755
        return WOLFSSL_FAILURE;
1756
1757
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_legacy");
1758
    if (ctx->block_size == 1) {
1759
        *outl = 0;
1760
        return WOLFSSL_SUCCESS;
1761
    }
1762
    if ((ctx->bufUsed % ctx->block_size) != 0) {
1763
        *outl = 0;
1764
        /* not enough padding for decrypt */
1765
        return WOLFSSL_FAILURE;
1766
    }
1767
    /* The original behavior of CipherFinal() was like it is now,
1768
     * but checkPad would return 0 in case of a bad pad. It would
1769
     * treat the pad as 0, and leave the data in the output buffer,
1770
     * and not try to copy anything. This converts checkPad's -1 error
1771
     * code to block_size.
1772
     */
1773
    if (ctx->lastUsed) {
1774
        PRINT_BUF(ctx->lastBlock, ctx->block_size);
1775
        if ((fl = checkPad(ctx, ctx->lastBlock)) < 0) {
1776
            fl = ctx->block_size;
1777
        }
1778
        else {
1779
            XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1780
        }
1781
        *outl = fl;
1782
    }
1783
    /* return error in cases where the block length is incorrect */
1784
    if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1785
        return WOLFSSL_FAILURE;
1786
    }
1787
1788
    return WOLFSSL_SUCCESS;
1789
}
1790
#endif
1791
1792
int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx)
1793
241
{
1794
241
    if (ctx == NULL) return WOLFSSL_FAILURE;
1795
241
    switch (ctx->cipherType) {
1796
0
#if !defined(NO_AES) || !defined(NO_DES3) || defined(WOLFSSL_SM4)
1797
0
#if !defined(NO_AES)
1798
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1799
155
    case WC_AES_128_CBC_TYPE:
1800
213
    case WC_AES_192_CBC_TYPE:
1801
241
    case WC_AES_256_CBC_TYPE:
1802
241
#endif
1803
241
#if defined(HAVE_AESGCM)
1804
241
    case WC_AES_128_GCM_TYPE:
1805
241
    case WC_AES_192_GCM_TYPE:
1806
241
    case WC_AES_256_GCM_TYPE:
1807
241
#endif
1808
241
#if defined(HAVE_AESCCM)
1809
241
    case WC_AES_128_CCM_TYPE:
1810
241
    case WC_AES_192_CCM_TYPE:
1811
241
    case WC_AES_256_CCM_TYPE:
1812
241
#endif
1813
241
#if defined(WOLFSSL_AES_COUNTER)
1814
241
    case WC_AES_128_CTR_TYPE:
1815
241
    case WC_AES_192_CTR_TYPE:
1816
241
    case WC_AES_256_CTR_TYPE:
1817
241
#endif
1818
241
#if defined(WOLFSSL_AES_CFB)
1819
241
    case WC_AES_128_CFB1_TYPE:
1820
241
    case WC_AES_192_CFB1_TYPE:
1821
241
    case WC_AES_256_CFB1_TYPE:
1822
241
    case WC_AES_128_CFB8_TYPE:
1823
241
    case WC_AES_192_CFB8_TYPE:
1824
241
    case WC_AES_256_CFB8_TYPE:
1825
241
    case WC_AES_128_CFB128_TYPE:
1826
241
    case WC_AES_192_CFB128_TYPE:
1827
241
    case WC_AES_256_CFB128_TYPE:
1828
241
#endif
1829
241
#if defined(WOLFSSL_AES_OFB)
1830
241
    case WC_AES_128_OFB_TYPE:
1831
241
    case WC_AES_192_OFB_TYPE:
1832
241
    case WC_AES_256_OFB_TYPE:
1833
241
#endif
1834
241
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1835
241
    case WC_AES_128_XTS_TYPE:
1836
241
    case WC_AES_256_XTS_TYPE:
1837
241
#endif
1838
#if defined(HAVE_ARIA)
1839
    case WC_ARIA_128_GCM_TYPE:
1840
    case WC_ARIA_192_GCM_TYPE:
1841
    case WC_ARIA_256_GCM_TYPE:
1842
#endif
1843
1844
241
    case WC_AES_128_ECB_TYPE:
1845
241
    case WC_AES_192_ECB_TYPE:
1846
241
    case WC_AES_256_ECB_TYPE:
1847
241
#endif /* !NO_AES */
1848
241
#ifndef NO_DES3
1849
241
    case WC_DES_CBC_TYPE:
1850
241
    case WC_DES_ECB_TYPE:
1851
241
    case WC_DES_EDE3_CBC_TYPE:
1852
241
    case WC_DES_EDE3_ECB_TYPE:
1853
241
#endif
1854
241
#ifdef WOLFSSL_SM4_ECB
1855
241
    case WC_SM4_ECB_TYPE:
1856
241
#endif
1857
241
#ifdef WOLFSSL_SM4_CBC
1858
241
    case WC_SM4_CBC_TYPE:
1859
241
#endif
1860
241
#ifdef WOLFSSL_SM4_CTR
1861
241
    case WC_SM4_CTR_TYPE:
1862
241
#endif
1863
241
#ifdef WOLFSSL_SM4_GCM
1864
241
    case WC_SM4_GCM_TYPE:
1865
241
#endif
1866
241
#ifdef WOLFSSL_SM4_CCM
1867
241
    case WC_SM4_CCM_TYPE:
1868
241
#endif
1869
241
        return ctx->block_size;
1870
0
#endif /* !NO_AES || !NO_DES3 || WOLFSSL_SM4 */
1871
0
    default:
1872
0
        return 0;
1873
241
    }
1874
241
}
1875
1876
static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher)
1877
37.1k
{
1878
37.1k
    if (cipher == NULL) return 0; /* dummy for #ifdef */
1879
37.1k
#ifndef NO_DES3
1880
37.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_CBC))
1881
1.31k
        return WC_DES_CBC_TYPE;
1882
35.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_CBC))
1883
906
        return WC_DES_EDE3_CBC_TYPE;
1884
34.8k
#if !defined(NO_DES3)
1885
34.8k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_ECB))
1886
5.78k
        return WC_DES_ECB_TYPE;
1887
29.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_ECB))
1888
0
        return WC_DES_EDE3_ECB_TYPE;
1889
29.1k
#endif /* NO_DES3 && HAVE_AES_ECB */
1890
29.1k
#endif
1891
29.1k
#if !defined(NO_AES)
1892
29.1k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1893
29.1k
    #ifdef WOLFSSL_AES_128
1894
29.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CBC))
1895
695
        return WC_AES_128_CBC_TYPE;
1896
28.4k
    #endif
1897
28.4k
    #ifdef WOLFSSL_AES_192
1898
28.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CBC))
1899
549
        return WC_AES_192_CBC_TYPE;
1900
27.8k
    #endif
1901
27.8k
    #ifdef WOLFSSL_AES_256
1902
27.8k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CBC))
1903
543
        return WC_AES_256_CBC_TYPE;
1904
27.3k
    #endif
1905
27.3k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
1906
27.3k
#if defined(HAVE_AESGCM)
1907
27.3k
    #ifdef WOLFSSL_AES_128
1908
27.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_GCM))
1909
5.28k
        return WC_AES_128_GCM_TYPE;
1910
22.0k
    #endif
1911
22.0k
    #ifdef WOLFSSL_AES_192
1912
22.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_GCM))
1913
945
        return WC_AES_192_GCM_TYPE;
1914
21.0k
    #endif
1915
21.0k
    #ifdef WOLFSSL_AES_256
1916
21.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_GCM))
1917
4.42k
        return WC_AES_256_GCM_TYPE;
1918
16.6k
    #endif
1919
16.6k
#endif /* HAVE_AESGCM */
1920
16.6k
#if defined(HAVE_AESCCM)
1921
16.6k
    #ifdef WOLFSSL_AES_128
1922
16.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CCM))
1923
0
        return WC_AES_128_CCM_TYPE;
1924
16.6k
    #endif
1925
16.6k
    #ifdef WOLFSSL_AES_192
1926
16.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CCM))
1927
0
        return WC_AES_192_CCM_TYPE;
1928
16.6k
    #endif
1929
16.6k
    #ifdef WOLFSSL_AES_256
1930
16.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CCM))
1931
0
        return WC_AES_256_CCM_TYPE;
1932
16.6k
    #endif
1933
16.6k
#endif /* HAVE_AESCCM */
1934
16.6k
#if defined(WOLFSSL_AES_COUNTER)
1935
16.6k
    #ifdef WOLFSSL_AES_128
1936
16.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CTR))
1937
477
        return WC_AES_128_CTR_TYPE;
1938
16.1k
    #endif
1939
16.1k
    #ifdef WOLFSSL_AES_192
1940
16.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CTR))
1941
2.96k
        return WC_AES_192_CTR_TYPE;
1942
13.2k
    #endif
1943
13.2k
    #ifdef WOLFSSL_AES_256
1944
13.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CTR))
1945
332
        return WC_AES_256_CTR_TYPE;
1946
12.8k
    #endif
1947
12.8k
#endif /* HAVE_AES_CBC */
1948
12.8k
#if defined(HAVE_AES_ECB)
1949
12.8k
    #ifdef WOLFSSL_AES_128
1950
12.8k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_ECB))
1951
386
        return WC_AES_128_ECB_TYPE;
1952
12.4k
    #endif
1953
12.4k
    #ifdef WOLFSSL_AES_192
1954
12.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_ECB))
1955
264
        return WC_AES_192_ECB_TYPE;
1956
12.2k
    #endif
1957
12.2k
    #ifdef WOLFSSL_AES_256
1958
12.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_ECB))
1959
670
        return WC_AES_256_ECB_TYPE;
1960
11.5k
    #endif
1961
11.5k
#endif /*HAVE_AES_CBC */
1962
11.5k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1963
11.5k
    #ifdef WOLFSSL_AES_128
1964
11.5k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_XTS))
1965
1.10k
        return WC_AES_128_XTS_TYPE;
1966
10.4k
    #endif
1967
10.4k
    #ifdef WOLFSSL_AES_256
1968
10.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_XTS))
1969
275
        return WC_AES_256_XTS_TYPE;
1970
10.1k
    #endif
1971
10.1k
#endif /* WOLFSSL_AES_XTS */
1972
10.1k
#if defined(WOLFSSL_AES_CFB)
1973
10.1k
#ifndef WOLFSSL_NO_AES_CFB_1_8
1974
10.1k
    #ifdef WOLFSSL_AES_128
1975
10.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB1))
1976
870
        return WC_AES_128_CFB1_TYPE;
1977
9.30k
    #endif
1978
9.30k
    #ifdef WOLFSSL_AES_192
1979
9.30k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB1))
1980
426
        return WC_AES_192_CFB1_TYPE;
1981
8.88k
    #endif
1982
8.88k
    #ifdef WOLFSSL_AES_256
1983
8.88k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB1))
1984
1.47k
        return WC_AES_256_CFB1_TYPE;
1985
7.40k
    #endif
1986
7.40k
    #ifdef WOLFSSL_AES_128
1987
7.40k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB8))
1988
1.36k
        return WC_AES_128_CFB8_TYPE;
1989
6.04k
    #endif
1990
6.04k
    #ifdef WOLFSSL_AES_192
1991
6.04k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB8))
1992
613
        return WC_AES_192_CFB8_TYPE;
1993
5.43k
    #endif
1994
5.43k
    #ifdef WOLFSSL_AES_256
1995
5.43k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB8))
1996
271
        return WC_AES_256_CFB8_TYPE;
1997
5.16k
    #endif
1998
5.16k
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
1999
5.16k
    #ifdef WOLFSSL_AES_128
2000
5.16k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB128))
2001
0
        return WC_AES_128_CFB128_TYPE;
2002
5.16k
    #endif
2003
5.16k
    #ifdef WOLFSSL_AES_192
2004
5.16k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB128))
2005
0
        return WC_AES_192_CFB128_TYPE;
2006
5.16k
    #endif
2007
5.16k
    #ifdef WOLFSSL_AES_256
2008
5.16k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB128))
2009
0
        return WC_AES_256_CFB128_TYPE;
2010
5.16k
    #endif
2011
5.16k
#endif /*HAVE_AES_CBC */
2012
5.16k
#if defined(WOLFSSL_AES_OFB)
2013
5.16k
    #ifdef WOLFSSL_AES_128
2014
5.16k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_OFB))
2015
1.29k
      return WC_AES_128_OFB_TYPE;
2016
3.87k
    #endif
2017
3.87k
    #ifdef WOLFSSL_AES_192
2018
3.87k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_OFB))
2019
1.22k
      return WC_AES_192_OFB_TYPE;
2020
2.64k
    #endif
2021
2.64k
    #ifdef WOLFSSL_AES_256
2022
2.64k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_OFB))
2023
2.27k
      return WC_AES_256_OFB_TYPE;
2024
370
    #endif
2025
370
#endif
2026
370
#endif /* !NO_AES */
2027
#if defined(HAVE_ARIA)
2028
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_128_GCM))
2029
        return WC_ARIA_128_GCM_TYPE;
2030
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_192_GCM))
2031
        return WC_ARIA_192_GCM_TYPE;
2032
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_256_GCM))
2033
        return WC_ARIA_256_GCM_TYPE;
2034
#endif /* HAVE_ARIA */
2035
2036
370
#ifndef NO_RC4
2037
370
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARC4))
2038
370
      return WC_ARC4_TYPE;
2039
0
#endif
2040
2041
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2042
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20_POLY1305))
2043
0
        return WC_CHACHA20_POLY1305_TYPE;
2044
0
#endif
2045
2046
0
#ifdef HAVE_CHACHA
2047
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20))
2048
0
        return WC_CHACHA20_TYPE;
2049
0
#endif
2050
2051
0
#ifdef WOLFSSL_SM4_ECB
2052
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_ECB))
2053
0
        return WC_SM4_ECB_TYPE;
2054
0
#endif
2055
0
#ifdef WOLFSSL_SM4_CBC
2056
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CBC))
2057
0
        return WC_SM4_CBC_TYPE;
2058
0
#endif
2059
0
#ifdef WOLFSSL_SM4_CTR
2060
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CTR))
2061
0
        return WC_SM4_CTR_TYPE;
2062
0
#endif
2063
0
#ifdef WOLFSSL_SM4_GCM
2064
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_GCM))
2065
0
        return WC_SM4_GCM_TYPE;
2066
0
#endif
2067
0
#ifdef WOLFSSL_SM4_CCM
2068
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CCM))
2069
0
        return WC_SM4_CCM_TYPE;
2070
0
#endif
2071
2072
0
      else return 0;
2073
37.1k
}
2074
2075
/* Getter function for cipher type string
2076
 *
2077
 * cipherType  cipherType enum value to get string for
2078
 *
2079
 * Returns string representation of the cipher type or NULL if not found
2080
 */
2081
const char* wolfSSL_EVP_CIPHER_type_string(unsigned int cipherType)
2082
0
{
2083
0
    WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_type_string");
2084
2085
0
    switch (cipherType) {
2086
0
#ifndef NO_DES3
2087
0
        case WC_DES_CBC_TYPE:           return EVP_DES_CBC;
2088
0
        case WC_DES_EDE3_CBC_TYPE:      return EVP_DES_EDE3_CBC;
2089
0
        case WC_DES_ECB_TYPE:           return EVP_DES_ECB;
2090
0
        case WC_DES_EDE3_ECB_TYPE:      return EVP_DES_EDE3_ECB;
2091
0
#endif
2092
0
#if !defined(NO_AES)
2093
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2094
0
        #ifdef WOLFSSL_AES_128
2095
0
        case WC_AES_128_CBC_TYPE:       return EVP_AES_128_CBC;
2096
0
        #endif
2097
0
        #ifdef WOLFSSL_AES_192
2098
0
        case WC_AES_192_CBC_TYPE:       return EVP_AES_192_CBC;
2099
0
        #endif
2100
0
        #ifdef WOLFSSL_AES_256
2101
0
        case WC_AES_256_CBC_TYPE:       return EVP_AES_256_CBC;
2102
0
        #endif
2103
0
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
2104
0
    #if defined(WOLFSSL_AES_CFB)
2105
0
        #ifndef WOLFSSL_NO_AES_CFB_1_8
2106
0
            #ifdef WOLFSSL_AES_128
2107
0
            case WC_AES_128_CFB1_TYPE:      return EVP_AES_128_CFB1;
2108
0
            #endif
2109
0
            #ifdef WOLFSSL_AES_192
2110
0
            case WC_AES_192_CFB1_TYPE:      return EVP_AES_192_CFB1;
2111
0
            #endif
2112
0
            #ifdef WOLFSSL_AES_256
2113
0
            case WC_AES_256_CFB1_TYPE:      return EVP_AES_256_CFB1;
2114
0
            #endif
2115
0
            #ifdef WOLFSSL_AES_128
2116
0
            case WC_AES_128_CFB8_TYPE:      return EVP_AES_128_CFB8;
2117
0
            #endif
2118
0
            #ifdef WOLFSSL_AES_192
2119
0
            case WC_AES_192_CFB8_TYPE:      return EVP_AES_192_CFB8;
2120
0
            #endif
2121
0
            #ifdef WOLFSSL_AES_256
2122
0
            case WC_AES_256_CFB8_TYPE:      return EVP_AES_256_CFB8;
2123
0
            #endif
2124
0
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
2125
0
        #ifdef WOLFSSL_AES_128
2126
0
        case WC_AES_128_CFB128_TYPE:    return EVP_AES_128_CFB128;
2127
0
        #endif
2128
0
        #ifdef WOLFSSL_AES_192
2129
0
        case WC_AES_192_CFB128_TYPE:    return EVP_AES_192_CFB128;
2130
0
        #endif
2131
0
        #ifdef WOLFSSL_AES_256
2132
0
        case WC_AES_256_CFB128_TYPE:    return EVP_AES_256_CFB128;
2133
0
        #endif
2134
0
    #endif /* WOLFSSL_AES_CFB */
2135
0
    #if defined(WOLFSSL_AES_OFB)
2136
0
        #ifdef WOLFSSL_AES_128
2137
0
        case WC_AES_128_OFB_TYPE:       return EVP_AES_128_OFB;
2138
0
        #endif
2139
0
        #ifdef WOLFSSL_AES_192
2140
0
        case WC_AES_192_OFB_TYPE:       return EVP_AES_192_OFB;
2141
0
        #endif
2142
0
        #ifdef WOLFSSL_AES_256
2143
0
        case WC_AES_256_OFB_TYPE:       return EVP_AES_256_OFB;
2144
0
        #endif
2145
0
    #endif /* WOLFSSL_AES_OFB */
2146
0
    #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2147
0
        #ifdef WOLFSSL_AES_128
2148
0
        case WC_AES_128_XTS_TYPE:       return EVP_AES_128_XTS;
2149
0
        #endif
2150
0
        #ifdef WOLFSSL_AES_256
2151
0
        case WC_AES_256_XTS_TYPE:       return EVP_AES_256_XTS;
2152
0
        #endif
2153
0
    #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
2154
0
    #if defined(HAVE_AESGCM)
2155
0
        #ifdef WOLFSSL_AES_128
2156
0
        case WC_AES_128_GCM_TYPE:       return EVP_AES_128_GCM;
2157
0
        #endif
2158
0
        #ifdef WOLFSSL_AES_192
2159
0
        case WC_AES_192_GCM_TYPE:       return EVP_AES_192_GCM;
2160
0
        #endif
2161
0
        #ifdef WOLFSSL_AES_256
2162
0
        case WC_AES_256_GCM_TYPE:       return EVP_AES_256_GCM;
2163
0
        #endif
2164
0
    #endif /* HAVE_AESGCM */
2165
0
    #if defined(HAVE_AESCCM)
2166
0
        #ifdef WOLFSSL_AES_128
2167
0
        case WC_AES_128_CCM_TYPE:       return EVP_AES_128_CCM;
2168
0
        #endif
2169
0
        #ifdef WOLFSSL_AES_192
2170
0
        case WC_AES_192_CCM_TYPE:       return EVP_AES_192_CCM;
2171
0
        #endif
2172
0
        #ifdef WOLFSSL_AES_256
2173
0
        case WC_AES_256_CCM_TYPE:       return EVP_AES_256_CCM;
2174
0
        #endif
2175
0
    #endif /* HAVE_AESCCM */
2176
0
    #if defined(WOLFSSL_AES_COUNTER)
2177
0
        #ifdef WOLFSSL_AES_128
2178
0
        case WC_AES_128_CTR_TYPE:       return EVP_AES_128_CTR;
2179
0
        #endif
2180
0
        #ifdef WOLFSSL_AES_192
2181
0
        case WC_AES_192_CTR_TYPE:       return EVP_AES_192_CTR;
2182
0
        #endif
2183
0
        #ifdef WOLFSSL_AES_256
2184
0
        case WC_AES_256_CTR_TYPE:       return EVP_AES_256_CTR;
2185
0
        #endif
2186
0
    #endif /* WOLFSSL_AES_COUNTER */
2187
0
    #if defined(HAVE_AES_ECB)
2188
0
        #ifdef WOLFSSL_AES_128
2189
0
        case WC_AES_128_ECB_TYPE:       return EVP_AES_128_ECB;
2190
0
        #endif
2191
0
        #ifdef WOLFSSL_AES_192
2192
0
        case WC_AES_192_ECB_TYPE:       return EVP_AES_192_ECB;
2193
0
        #endif
2194
0
        #ifdef WOLFSSL_AES_256
2195
0
        case WC_AES_256_ECB_TYPE:       return EVP_AES_256_ECB;
2196
0
        #endif
2197
0
    #endif /* HAVE_AES_ECB */
2198
0
#endif /* !NO_AES */
2199
#if defined(HAVE_ARIA)
2200
        case WC_ARIA_128_GCM_TYPE:      return EVP_ARIA_128_GCM;
2201
        case WC_ARIA_192_GCM_TYPE:      return EVP_ARIA_192_GCM;
2202
        case WC_ARIA_256_GCM_TYPE:      return EVP_ARIA_256_GCM;
2203
#endif /* HAVE_ARIA */
2204
0
#ifndef NO_RC4
2205
0
        case WC_ARC4_TYPE:              return EVP_ARC4;
2206
0
#endif
2207
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2208
0
        case WC_CHACHA20_POLY1305_TYPE: return EVP_CHACHA20_POLY1305;
2209
0
#endif
2210
0
#ifdef HAVE_CHACHA
2211
0
        case WC_CHACHA20_TYPE:          return EVP_CHACHA20;
2212
0
#endif
2213
0
#ifdef WOLFSSL_SM4_ECB
2214
0
        case WC_SM4_ECB_TYPE:           return EVP_SM4_ECB;
2215
0
#endif
2216
0
#ifdef WOLFSSL_SM4_CBC
2217
0
        case WC_SM4_CBC_TYPE:           return EVP_SM4_CBC;
2218
0
#endif
2219
0
#ifdef WOLFSSL_SM4_CTR
2220
0
        case WC_SM4_CTR_TYPE:           return EVP_SM4_CTR;
2221
0
#endif
2222
0
#ifdef WOLFSSL_SM4_GCM
2223
0
        case WC_SM4_GCM_TYPE:           return EVP_SM4_GCM;
2224
0
#endif
2225
0
#ifdef WOLFSSL_SM4_CCM
2226
0
        case WC_SM4_CCM_TYPE:           return EVP_SM4_CCM;
2227
0
#endif
2228
0
        case WC_NULL_CIPHER_TYPE:       return EVP_NULL;
2229
0
        default:
2230
0
            return NULL;
2231
0
    }
2232
0
}
2233
2234
int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher)
2235
30.9k
{
2236
30.9k
    if (cipher == NULL)
2237
0
        return WOLFSSL_FAILURE;
2238
2239
30.9k
    switch (cipherType(cipher)) {
2240
0
#if !defined(NO_AES)
2241
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2242
372
        case WC_AES_128_CBC_TYPE:
2243
783
        case WC_AES_192_CBC_TYPE:
2244
1.18k
        case WC_AES_256_CBC_TYPE:
2245
1.18k
            return WC_AES_BLOCK_SIZE;
2246
0
    #endif
2247
0
    #if defined(HAVE_AESGCM)
2248
4.29k
        case WC_AES_128_GCM_TYPE:
2249
5.05k
        case WC_AES_192_GCM_TYPE:
2250
8.61k
        case WC_AES_256_GCM_TYPE:
2251
8.61k
            return 1;
2252
0
    #endif
2253
0
    #if defined(HAVE_AESCCM)
2254
0
        case WC_AES_128_CCM_TYPE:
2255
0
        case WC_AES_192_CCM_TYPE:
2256
0
        case WC_AES_256_CCM_TYPE:
2257
0
            return 1;
2258
0
    #endif
2259
0
    #if defined(WOLFSSL_AES_COUNTER)
2260
414
        case WC_AES_128_CTR_TYPE:
2261
2.98k
        case WC_AES_192_CTR_TYPE:
2262
3.27k
        case WC_AES_256_CTR_TYPE:
2263
3.27k
            return 1;
2264
0
    #endif
2265
0
    #if defined(HAVE_AES_ECB)
2266
343
        case WC_AES_128_ECB_TYPE:
2267
555
        case WC_AES_192_ECB_TYPE:
2268
1.16k
        case WC_AES_256_ECB_TYPE:
2269
1.16k
            return WC_AES_BLOCK_SIZE;
2270
0
    #endif
2271
0
    #if defined(WOLFSSL_AES_CFB)
2272
692
        case WC_AES_128_CFB1_TYPE:
2273
1.07k
        case WC_AES_192_CFB1_TYPE:
2274
2.38k
        case WC_AES_256_CFB1_TYPE:
2275
3.58k
        case WC_AES_128_CFB8_TYPE:
2276
4.06k
        case WC_AES_192_CFB8_TYPE:
2277
4.20k
        case WC_AES_256_CFB8_TYPE:
2278
4.20k
        case WC_AES_128_CFB128_TYPE:
2279
4.20k
        case WC_AES_192_CFB128_TYPE:
2280
4.20k
        case WC_AES_256_CFB128_TYPE:
2281
4.20k
            return 1;
2282
0
    #endif
2283
0
    #if defined(WOLFSSL_AES_OFB)
2284
1.10k
        case WC_AES_128_OFB_TYPE:
2285
2.20k
        case WC_AES_192_OFB_TYPE:
2286
4.20k
        case WC_AES_256_OFB_TYPE:
2287
4.20k
            return 1;
2288
0
    #endif
2289
0
    #if defined(WOLFSSL_AES_XTS) && \
2290
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2291
702
        case WC_AES_128_XTS_TYPE:
2292
876
        case WC_AES_256_XTS_TYPE:
2293
876
            return 1;
2294
0
    #endif
2295
0
  #endif /* NO_AES */
2296
2297
0
  #ifndef NO_RC4
2298
307
        case WC_ARC4_TYPE:
2299
307
            return 1;
2300
0
  #endif
2301
#if defined(HAVE_ARIA)
2302
    case WC_ARIA_128_GCM_TYPE:
2303
    case WC_ARIA_192_GCM_TYPE:
2304
    case WC_ARIA_256_GCM_TYPE:
2305
        return 1;
2306
#endif
2307
2308
0
#ifndef NO_DES3
2309
1.10k
        case WC_DES_CBC_TYPE: return 8;
2310
688
        case WC_DES_EDE3_CBC_TYPE: return 8;
2311
5.34k
        case WC_DES_ECB_TYPE: return 8;
2312
0
        case WC_DES_EDE3_ECB_TYPE: return 8;
2313
0
#endif
2314
2315
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2316
0
        case WC_CHACHA20_POLY1305_TYPE:
2317
0
            return 1;
2318
0
#endif
2319
2320
0
#ifdef HAVE_CHACHA
2321
0
        case WC_CHACHA20_TYPE:
2322
0
            return 1;
2323
0
#endif
2324
2325
0
#ifdef WOLFSSL_SM4_ECB
2326
0
       case WC_SM4_ECB_TYPE:
2327
0
            return SM4_BLOCK_SIZE;
2328
0
#endif
2329
0
#ifdef WOLFSSL_SM4_CBC
2330
0
       case WC_SM4_CBC_TYPE:
2331
0
            return SM4_BLOCK_SIZE;
2332
0
#endif
2333
0
#ifdef WOLFSSL_SM4_CTR
2334
0
       case WC_SM4_CTR_TYPE:
2335
0
            return 1;
2336
0
#endif
2337
0
#ifdef WOLFSSL_SM4_GCM
2338
0
       case WC_SM4_GCM_TYPE:
2339
0
            return 1;
2340
0
#endif
2341
0
#ifdef WOLFSSL_SM4_CCM
2342
0
       case WC_SM4_CCM_TYPE:
2343
0
            return 1;
2344
0
#endif
2345
2346
0
        default:
2347
0
            return 0;
2348
30.9k
    }
2349
30.9k
}
2350
2351
unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2352
1.19k
{
2353
1.19k
    switch (cipherType(cipher)) {
2354
0
#if !defined(NO_AES)
2355
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2356
0
        case WC_AES_128_CBC_TYPE:
2357
0
        case WC_AES_192_CBC_TYPE:
2358
0
        case WC_AES_256_CBC_TYPE:
2359
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2360
0
    #endif
2361
0
    #if defined(HAVE_AESGCM)
2362
531
        case WC_AES_128_GCM_TYPE:
2363
636
        case WC_AES_192_GCM_TYPE:
2364
1.04k
        case WC_AES_256_GCM_TYPE:
2365
1.04k
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2366
1.04k
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2367
0
    #endif
2368
0
    #if defined(HAVE_AESCCM)
2369
0
        case WC_AES_128_CCM_TYPE:
2370
0
        case WC_AES_192_CCM_TYPE:
2371
0
        case WC_AES_256_CCM_TYPE:
2372
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2373
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2374
0
    #endif
2375
0
    #if defined(WOLFSSL_AES_COUNTER)
2376
3
        case WC_AES_128_CTR_TYPE:
2377
22
        case WC_AES_192_CTR_TYPE:
2378
25
        case WC_AES_256_CTR_TYPE:
2379
25
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2380
0
    #endif
2381
0
    #if defined(WOLFSSL_AES_CFB)
2382
13
        case WC_AES_128_CFB1_TYPE:
2383
13
        case WC_AES_192_CFB1_TYPE:
2384
19
        case WC_AES_256_CFB1_TYPE:
2385
19
        case WC_AES_128_CFB8_TYPE:
2386
24
        case WC_AES_192_CFB8_TYPE:
2387
32
        case WC_AES_256_CFB8_TYPE:
2388
32
        case WC_AES_128_CFB128_TYPE:
2389
32
        case WC_AES_192_CFB128_TYPE:
2390
32
        case WC_AES_256_CFB128_TYPE:
2391
32
            return WOLFSSL_EVP_CIPH_CFB_MODE;
2392
0
    #endif
2393
0
    #if defined(WOLFSSL_AES_OFB)
2394
25
        case WC_AES_128_OFB_TYPE:
2395
25
        case WC_AES_192_OFB_TYPE:
2396
25
        case WC_AES_256_OFB_TYPE:
2397
25
            return WOLFSSL_EVP_CIPH_OFB_MODE;
2398
0
    #endif
2399
0
    #if defined(WOLFSSL_AES_XTS) && \
2400
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2401
50
        case WC_AES_128_XTS_TYPE:
2402
56
        case WC_AES_256_XTS_TYPE:
2403
56
            return WOLFSSL_EVP_CIPH_XTS_MODE;
2404
0
    #endif
2405
0
        case WC_AES_128_ECB_TYPE:
2406
2
        case WC_AES_192_ECB_TYPE:
2407
2
        case WC_AES_256_ECB_TYPE:
2408
2
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2409
0
#endif /* !NO_AES */
2410
    #if defined(HAVE_ARIA)
2411
        case WC_ARIA_128_GCM_TYPE:
2412
        case WC_ARIA_192_GCM_TYPE:
2413
        case WC_ARIA_256_GCM_TYPE:
2414
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2415
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2416
    #endif
2417
0
    #ifndef NO_DES3
2418
1
        case WC_DES_CBC_TYPE:
2419
4
        case WC_DES_EDE3_CBC_TYPE:
2420
4
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2421
0
        case WC_DES_ECB_TYPE:
2422
0
        case WC_DES_EDE3_ECB_TYPE:
2423
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2424
0
    #endif
2425
0
    #ifndef NO_RC4
2426
0
        case WC_ARC4_TYPE:
2427
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2428
0
    #endif
2429
0
    #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2430
0
        case WC_CHACHA20_POLY1305_TYPE:
2431
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER |
2432
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2433
0
    #endif
2434
0
    #ifdef HAVE_CHACHA
2435
0
        case WC_CHACHA20_TYPE:
2436
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2437
0
    #endif
2438
0
    #ifdef WOLFSSL_SM4_ECB
2439
0
        case WC_SM4_ECB_TYPE:
2440
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2441
0
    #endif
2442
0
    #ifdef WOLFSSL_SM4_CBC
2443
0
        case WC_SM4_CBC_TYPE:
2444
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2445
0
    #endif
2446
0
    #ifdef WOLFSSL_SM4_CTR
2447
0
        case WC_SM4_CTR_TYPE:
2448
0
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2449
0
    #endif
2450
0
    #ifdef WOLFSSL_SM4_GCM
2451
0
        case WC_SM4_GCM_TYPE:
2452
0
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2453
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2454
0
    #endif
2455
0
    #ifdef WOLFSSL_SM4_CCM
2456
0
        case WC_SM4_CCM_TYPE:
2457
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2458
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2459
0
    #endif
2460
0
        default:
2461
0
            return 0;
2462
1.19k
    }
2463
1.19k
}
2464
2465
unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2466
0
{
2467
0
    if (cipher == NULL)
2468
0
        return 0;
2469
0
    return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE;
2470
0
}
2471
2472
void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2473
0
{
2474
0
    if (ctx != NULL) {
2475
0
        ctx->flags |= (unsigned long)flags;
2476
0
    }
2477
0
}
2478
2479
void wolfSSL_EVP_CIPHER_CTX_clear_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2480
0
{
2481
0
    if (ctx != NULL) {
2482
0
        ctx->flags &= (unsigned long)~flags;
2483
0
    }
2484
0
}
2485
2486
unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher)
2487
1.19k
{
2488
1.19k
    if (cipher == NULL)
2489
0
        return 0;
2490
1.19k
    return WOLFSSL_CIPHER_mode(cipher);
2491
1.19k
}
2492
2493
int  wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx,
2494
    int padding)
2495
564
{
2496
564
    if (ctx == NULL)
2497
0
        return WOLFSSL_FAILURE;
2498
564
    if (padding) {
2499
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_NO_PADDING;
2500
0
    }
2501
564
    else {
2502
564
        ctx->flags |=  WOLFSSL_EVP_CIPH_NO_PADDING;
2503
564
    }
2504
564
    return 1;
2505
564
}
2506
2507
int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest)
2508
0
{
2509
    /* nothing to do */
2510
0
    if (digest == NULL)
2511
0
        return WOLFSSL_FAILURE;
2512
0
    return WOLFSSL_SUCCESS;
2513
0
}
2514
2515
2516
/* Frees the WOLFSSL_EVP_PKEY_CTX passed in.
2517
 *
2518
 * return WOLFSSL_SUCCESS on success
2519
 */
2520
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2521
void wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2522
#else
2523
int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2524
#endif
2525
1.26k
{
2526
1.26k
    if (ctx == NULL)
2527
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2528
        return;
2529
#else
2530
102
        return 0;
2531
1.16k
#endif
2532
1.16k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_free");
2533
1.16k
    if (ctx->pkey != NULL)
2534
1.16k
        wolfSSL_EVP_PKEY_free(ctx->pkey);
2535
1.16k
    if (ctx->peerKey != NULL)
2536
0
        wolfSSL_EVP_PKEY_free(ctx->peerKey);
2537
1.16k
    XFREE(ctx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
2538
1.16k
#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
2539
1.16k
    return WOLFSSL_SUCCESS;
2540
1.26k
#endif
2541
1.26k
}
2542
2543
2544
/* Creates a new WOLFSSL_EVP_PKEY_CTX structure.
2545
 *
2546
 * pkey  key structure to use with new WOLFSSL_EVP_PKEY_CTX
2547
 * e     engine to use. It should be NULL at this time.
2548
 *
2549
 * return the new structure on success and NULL if failed.
2550
 */
2551
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_ENGINE *e)
2552
1.16k
{
2553
1.16k
    WOLFSSL_EVP_PKEY_CTX* ctx;
2554
2555
1.16k
    if (pkey == NULL) return 0;
2556
1.16k
    if (e != NULL) return 0;
2557
1.16k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new");
2558
2559
1.16k
    ctx = (WOLFSSL_EVP_PKEY_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY_CTX), NULL,
2560
1.16k
            DYNAMIC_TYPE_PUBLIC_KEY);
2561
1.16k
    if (ctx == NULL) return NULL;
2562
1.16k
    XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_PKEY_CTX));
2563
1.16k
    ctx->pkey = pkey;
2564
1.16k
#ifndef NO_RSA
2565
1.16k
    ctx->padding = WC_RSA_PKCS1_PADDING;
2566
1.16k
    ctx->md = NULL;
2567
1.16k
    ctx->mgf1_md = NULL;
2568
1.16k
    ctx->saltlen = 0;
2569
1.16k
#endif
2570
1.16k
#ifdef HAVE_ECC
2571
1.16k
    if (pkey->ecc && pkey->ecc->group) {
2572
        /* set curve NID from pkey if available */
2573
0
        ctx->curveNID = pkey->ecc->group->curve_nid;
2574
0
    }
2575
1.16k
    else {
2576
1.16k
        ctx->curveNID = ECC_CURVE_DEF;
2577
1.16k
    }
2578
1.16k
#endif
2579
1.16k
    if (wolfSSL_EVP_PKEY_up_ref(pkey) != WOLFSSL_SUCCESS) {
2580
0
        WOLFSSL_MSG("Couldn't increase key reference count");
2581
0
    }
2582
1.16k
    return ctx;
2583
1.16k
}
2584
2585
2586
/* Sets the type of RSA padding to use.
2587
 *
2588
 * ctx     structure to set padding in.
2589
 * padding RSA padding type
2590
 *
2591
 * returns WOLFSSL_SUCCESS on success.
2592
 */
2593
int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, int padding)
2594
0
{
2595
0
    if (ctx == NULL) return 0;
2596
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_padding");
2597
0
    ctx->padding = padding;
2598
0
    return WOLFSSL_SUCCESS;
2599
0
}
2600
2601
/* Sets the message digest type for RSA padding to use.
2602
 *
2603
 * ctx  structure to set padding in.
2604
 * md   Message digest
2605
 *
2606
 * returns WOLFSSL_SUCCESS on success.
2607
 */
2608
int wolfSSL_EVP_PKEY_CTX_set_signature_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2609
    const WOLFSSL_EVP_MD* md)
2610
0
{
2611
0
    if (ctx == NULL) return 0;
2612
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_signature_md");
2613
0
#ifndef NO_RSA
2614
0
    ctx->md = md;
2615
#else
2616
    (void)md;
2617
#endif
2618
0
    return WOLFSSL_SUCCESS;
2619
0
}
2620
2621
int wolfSSL_EVP_PKEY_CTX_set_rsa_oaep_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2622
    const WOLFSSL_EVP_MD *md)
2623
0
{
2624
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_OAEP_PADDING);
2625
0
    return wolfSSL_EVP_PKEY_CTX_set_signature_md(ctx, md);
2626
0
}
2627
2628
int wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen(WOLFSSL_EVP_PKEY_CTX *ctx,
2629
                                             int saltlen)
2630
0
{
2631
0
    if (ctx == NULL) return 0;
2632
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen");
2633
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_PSS_PADDING);
2634
0
#ifndef NO_RSA
2635
0
    ctx->saltlen = saltlen;
2636
#else
2637
    (void)saltlen;
2638
#endif
2639
0
    return WOLFSSL_SUCCESS;
2640
0
}
2641
2642
int wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2643
                                         const WOLFSSL_EVP_MD *md)
2644
0
{
2645
0
    if (ctx == NULL) return 0;
2646
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md");
2647
0
#ifndef NO_RSA
2648
    /* Hash digest algorithm used with Mask Generation Function 1 (MGF1) for
2649
     * RSA-PSS and RSA-OAEP. */
2650
0
    ctx->mgf1_md = md;
2651
#else
2652
    (void)md;
2653
#endif
2654
0
    return WOLFSSL_SUCCESS;
2655
0
}
2656
2657
/* create a PKEY context and return it */
2658
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new_id(int id, WOLFSSL_ENGINE *e)
2659
674
{
2660
674
    WOLFSSL_EVP_PKEY* pkey;
2661
674
    WOLFSSL_EVP_PKEY_CTX* ctx = NULL;
2662
2663
674
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new_id");
2664
2665
674
    pkey = wolfSSL_EVP_PKEY_new_ex(NULL);
2666
674
    if (pkey) {
2667
674
        pkey->type = id;
2668
674
        ctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
2669
        /* wolfSSL_EVP_PKEY_CTX_new calls wolfSSL_EVP_PKEY_up_ref so we need
2670
         * to always call wolfSSL_EVP_PKEY_free (either to free it if an
2671
         * error occurred in the previous function or to decrease the reference
2672
         * count so that pkey is actually free'd when wolfSSL_EVP_PKEY_CTX_free
2673
         * is called) */
2674
674
        wolfSSL_EVP_PKEY_free(pkey);
2675
674
    }
2676
674
    return ctx;
2677
674
}
2678
2679
/* Returns WOLFSSL_SUCCESS or error */
2680
int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits)
2681
0
{
2682
0
    if (ctx) {
2683
0
        ctx->nbits = bits;
2684
0
    }
2685
0
    return WOLFSSL_SUCCESS;
2686
0
}
2687
2688
2689
int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx)
2690
674
{
2691
674
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_init");
2692
2693
674
    if (!ctx) {
2694
0
        return WOLFSSL_FAILURE;
2695
0
    }
2696
674
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2697
674
    ctx->op = WC_EVP_PKEY_OP_DERIVE;
2698
674
    ctx->padding = 0;
2699
674
    ctx->nbits = 0;
2700
674
    return WOLFSSL_SUCCESS;
2701
674
}
2702
2703
int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer)
2704
0
{
2705
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_set_peer");
2706
2707
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE) {
2708
0
        return WOLFSSL_FAILURE;
2709
0
    }
2710
0
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2711
0
    ctx->peerKey = peer;
2712
0
    if (!wolfSSL_EVP_PKEY_up_ref(peer)) {
2713
0
        ctx->peerKey = NULL;
2714
0
        return WOLFSSL_FAILURE;
2715
0
    }
2716
0
    return WOLFSSL_SUCCESS;
2717
0
}
2718
2719
#ifndef NO_WOLFSSL_STUB
2720
int wolfSSL_EVP_PKEY_CTX_ctrl_str(WOLFSSL_EVP_PKEY_CTX *ctx,
2721
                          const char *name, const char *value)
2722
0
{
2723
0
    WOLFSSL_STUB("wolfSSL_EVP_PKEY_CTX_ctrl_str");
2724
0
    (void)ctx;
2725
0
    (void)name;
2726
0
    (void)value;
2727
0
    return WOLFSSL_FAILURE;
2728
0
}
2729
#endif /* NO_WOLFSSL_STUB */
2730
2731
#if (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || defined(HAVE_ECC) || \
2732
    defined(HAVE_HKDF)
2733
int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
2734
553
{
2735
553
    int len;
2736
553
#ifdef HAVE_HKDF
2737
553
    enum wc_HashType hkdfHashType;
2738
553
#endif
2739
2740
553
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive");
2741
2742
553
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE || !ctx->pkey || (!ctx->peerKey
2743
553
        && ctx->pkey->type != WC_EVP_PKEY_HKDF) || !keylen || (ctx->pkey->type
2744
553
        != WC_EVP_PKEY_HKDF && ctx->pkey->type != ctx->peerKey->type)) {
2745
0
        return WOLFSSL_FAILURE;
2746
0
    }
2747
553
    switch (ctx->pkey->type) {
2748
0
#ifndef NO_DH
2749
0
    case WC_EVP_PKEY_DH:
2750
        /* Use DH */
2751
0
        if (!ctx->pkey->dh || !ctx->peerKey->dh) {
2752
0
            return WOLFSSL_FAILURE;
2753
0
        }
2754
        /* set internal peer key if not done */
2755
0
        if (!ctx->peerKey->dh->inSet) {
2756
0
            if (SetDhInternal(ctx->peerKey->dh) != WOLFSSL_SUCCESS) {
2757
0
                WOLFSSL_MSG("SetDhInternal failed");
2758
0
                return WOLFSSL_FAILURE;
2759
0
            }
2760
0
        }
2761
0
        if (!ctx->peerKey->dh->pub_key) {
2762
0
            WOLFSSL_MSG("SetDhInternal failed, pub_key is NULL");
2763
0
            return WOLFSSL_FAILURE;
2764
0
        }
2765
0
        if ((len = wolfSSL_DH_size(ctx->pkey->dh)) <= 0) {
2766
0
            return WOLFSSL_FAILURE;
2767
0
        }
2768
0
        if (key) {
2769
0
            if (*keylen < (size_t)len) {
2770
0
                return WOLFSSL_FAILURE;
2771
0
            }
2772
            /* computed DH agreement can be less than DH size if leading zeros */
2773
0
            if (wolfSSL_DH_compute_key(key, ctx->peerKey->dh->pub_key,
2774
0
                                       ctx->pkey->dh) <= 0) {
2775
0
                return WOLFSSL_FAILURE;
2776
0
            }
2777
0
        }
2778
0
        *keylen = (size_t)len;
2779
0
        break;
2780
0
#endif
2781
0
#if defined(HAVE_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
2782
0
    case WC_EVP_PKEY_EC:
2783
        /* Use ECDH */
2784
0
        if (!ctx->pkey->ecc || !ctx->peerKey->ecc) {
2785
0
            return WOLFSSL_FAILURE;
2786
0
        }
2787
        /* set internal key if not done */
2788
0
        if (!ctx->pkey->ecc->inSet) {
2789
0
            if (SetECKeyInternal(ctx->pkey->ecc) != WOLFSSL_SUCCESS) {
2790
0
                WOLFSSL_MSG("SetECKeyInternal failed");
2791
0
                return WOLFSSL_FAILURE;
2792
0
            }
2793
0
        }
2794
0
        if (!ctx->peerKey->ecc->exSet || !ctx->peerKey->ecc->pub_key->internal) {
2795
0
            if (SetECKeyExternal(ctx->peerKey->ecc) != WOLFSSL_SUCCESS) {
2796
0
                WOLFSSL_MSG("SetECKeyExternal failed");
2797
0
                return WOLFSSL_FAILURE;
2798
0
            }
2799
0
        }
2800
0
        if (!(len = wc_ecc_size((ecc_key*)ctx->pkey->ecc->internal))) {
2801
0
            return WOLFSSL_FAILURE;
2802
0
        }
2803
0
        if (key) {
2804
0
            word32 len32 = (word32)len;
2805
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2806
0
    && (!defined(HAVE_FIPS) || \
2807
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2808
2809
0
            WC_RNG rng;
2810
0
            if (wc_InitRng(&rng) != MP_OKAY) {
2811
0
                WOLFSSL_MSG("Init RNG failed");
2812
0
                return WOLFSSL_FAILURE;
2813
0
            }
2814
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = &rng;
2815
0
#endif
2816
0
            if (*keylen < len32) {
2817
0
                WOLFSSL_MSG("buffer too short");
2818
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2819
0
    && (!defined(HAVE_FIPS) || \
2820
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2821
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2822
0
                wc_FreeRng(&rng);
2823
0
#endif
2824
0
                return WOLFSSL_FAILURE;
2825
0
            }
2826
0
            if (wc_ecc_shared_secret((ecc_key*)ctx->pkey->ecc->internal,
2827
0
                    (ecc_key*)ctx->peerKey->ecc->internal, key, &len32)
2828
0
                    != MP_OKAY) {
2829
0
                WOLFSSL_MSG("wc_ecc_shared_secret failed");
2830
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2831
0
    && (!defined(HAVE_FIPS) || \
2832
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2833
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2834
0
                wc_FreeRng(&rng);
2835
0
#endif
2836
0
                return WOLFSSL_FAILURE;
2837
0
            }
2838
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2839
0
    && (!defined(HAVE_FIPS) || \
2840
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2841
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2842
0
            wc_FreeRng(&rng);
2843
0
#endif
2844
0
            len = (int)len32;
2845
0
        }
2846
0
        *keylen = (size_t)len;
2847
0
        break;
2848
0
#endif
2849
0
#ifdef HAVE_HKDF
2850
553
    case WC_EVP_PKEY_HKDF:
2851
553
        (void)len;
2852
2853
553
        hkdfHashType = EvpMd2MacType(ctx->pkey->hkdfMd);
2854
553
        if (hkdfHashType == WC_HASH_TYPE_NONE) {
2855
0
            WOLFSSL_MSG("Invalid hash type for HKDF.");
2856
0
            return WOLFSSL_FAILURE;
2857
0
        }
2858
553
        if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) {
2859
553
            if (wc_HKDF((int)hkdfHashType, ctx->pkey->hkdfKey, ctx->pkey->hkdfKeySz,
2860
553
                        ctx->pkey->hkdfSalt, ctx->pkey->hkdfSaltSz,
2861
553
                        ctx->pkey->hkdfInfo, ctx->pkey->hkdfInfoSz, key,
2862
553
                        (word32)*keylen) != 0) {
2863
215
                WOLFSSL_MSG("wc_HKDF failed.");
2864
215
                return WOLFSSL_FAILURE;
2865
215
            }
2866
553
        }
2867
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) {
2868
0
            if (wc_HKDF_Extract((int)hkdfHashType, ctx->pkey->hkdfSalt,
2869
0
                                ctx->pkey->hkdfSaltSz, ctx->pkey->hkdfKey,
2870
0
                                ctx->pkey->hkdfKeySz, key) != 0) {
2871
0
                WOLFSSL_MSG("wc_HKDF_Extract failed.");
2872
0
                return WOLFSSL_FAILURE;
2873
0
            }
2874
0
            else {
2875
0
                int hkdfHashSz = wolfSSL_EVP_MD_size(ctx->pkey->hkdfMd);
2876
0
                if (hkdfHashSz <= 0) {
2877
0
                    WOLFSSL_MSG("Failed to get block size for HKDF hash.");
2878
0
                    return WOLFSSL_FAILURE;
2879
0
                }
2880
                /* Length of extract only is always the length of the hash. */
2881
0
                *keylen = (size_t)hkdfHashSz;
2882
0
            }
2883
0
        }
2884
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
2885
0
            if (wc_HKDF_Expand((int)hkdfHashType, ctx->pkey->hkdfKey,
2886
0
                               ctx->pkey->hkdfKeySz, ctx->pkey->hkdfInfo,
2887
0
                               ctx->pkey->hkdfInfoSz, key,
2888
0
                               (word32)*keylen) != 0) {
2889
0
                WOLFSSL_MSG("wc_HKDF_Expand failed.");
2890
0
                return WOLFSSL_FAILURE;
2891
0
            }
2892
0
        }
2893
0
        else {
2894
0
            WOLFSSL_MSG("Invalid HKDF mode.");
2895
0
            return WOLFSSL_FAILURE;
2896
0
        }
2897
338
        break;
2898
338
#endif /* HAVE_HKDF */
2899
338
    default:
2900
0
        WOLFSSL_MSG("Unknown key type");
2901
0
        return WOLFSSL_FAILURE;
2902
553
    }
2903
338
    return WOLFSSL_SUCCESS;
2904
553
}
2905
#endif /* (!NO_DH && WOLFSSL_DH_EXTRA) || HAVE_ECC || HAVE_HKDF */
2906
2907
#ifdef HAVE_HKDF
2908
int wolfSSL_EVP_PKEY_CTX_set_hkdf_md(WOLFSSL_EVP_PKEY_CTX* ctx,
2909
                                     const WOLFSSL_EVP_MD* md)
2910
674
{
2911
674
    int ret = WOLFSSL_SUCCESS;
2912
2913
674
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_hkdf_md");
2914
2915
674
    if (ctx == NULL || ctx->pkey == NULL || md == NULL) {
2916
0
        WOLFSSL_MSG("Bad argument.");
2917
0
        ret = WOLFSSL_FAILURE;
2918
0
    }
2919
2920
674
    if (ret == WOLFSSL_SUCCESS) {
2921
674
        ctx->pkey->hkdfMd = md;
2922
674
    }
2923
2924
674
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set_hkdf_md", ret);
2925
2926
674
    return ret;
2927
674
}
2928
2929
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt(WOLFSSL_EVP_PKEY_CTX* ctx,
2930
                                        const byte* salt, int saltSz)
2931
553
{
2932
553
    int ret = WOLFSSL_SUCCESS;
2933
2934
553
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt");
2935
2936
553
    if (ctx == NULL || ctx->pkey == NULL || saltSz < 0) {
2937
0
        WOLFSSL_MSG("Bad argument.");
2938
0
        ret = WOLFSSL_FAILURE;
2939
0
    }
2940
553
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2941
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2942
0
        ret = WOLFSSL_FAILURE;
2943
0
    }
2944
2945
553
    if (ret == WOLFSSL_SUCCESS && salt != NULL && saltSz > 0) {
2946
343
        XFREE(ctx->pkey->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
2947
343
        ctx->pkey->hkdfSalt = (byte*)XMALLOC((size_t)saltSz, NULL,
2948
343
            DYNAMIC_TYPE_SALT);
2949
343
        if (ctx->pkey->hkdfSalt == NULL) {
2950
0
            WOLFSSL_MSG("Failed to allocate HKDF salt buffer.");
2951
0
            ret = WOLFSSL_FAILURE;
2952
0
        }
2953
343
        else {
2954
343
            XMEMCPY(ctx->pkey->hkdfSalt, salt, (size_t)saltSz);
2955
343
            ctx->pkey->hkdfSaltSz = (word32)saltSz;
2956
343
        }
2957
343
    }
2958
2959
553
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt", ret);
2960
2961
553
    return ret;
2962
553
}
2963
2964
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_key(WOLFSSL_EVP_PKEY_CTX* ctx,
2965
                                       const byte* key, int keySz)
2966
674
{
2967
674
    int ret = WOLFSSL_SUCCESS;
2968
2969
674
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key");
2970
2971
674
    if (ctx == NULL || ctx->pkey == NULL || key == NULL || keySz <= 0) {
2972
121
        WOLFSSL_MSG("Bad argument.");
2973
121
        ret = WOLFSSL_FAILURE;
2974
121
    }
2975
674
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2976
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2977
0
        ret = WOLFSSL_FAILURE;
2978
0
    }
2979
2980
674
    if (ret == WOLFSSL_SUCCESS) {
2981
553
        XFREE(ctx->pkey->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
2982
553
        ctx->pkey->hkdfKey = (byte*)XMALLOC((size_t)keySz, NULL,
2983
553
            DYNAMIC_TYPE_KEY);
2984
553
        if (ctx->pkey->hkdfKey == NULL) {
2985
0
            WOLFSSL_MSG("Failed to allocate HKDF key buffer.");
2986
0
            ret = WOLFSSL_FAILURE;
2987
0
        }
2988
553
        else {
2989
553
            XMEMCPY(ctx->pkey->hkdfKey, key, (size_t)keySz);
2990
553
            ctx->pkey->hkdfKeySz = (word32)keySz;
2991
553
        }
2992
553
    }
2993
2994
674
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key", ret);
2995
2996
674
    return ret;
2997
674
}
2998
2999
int wolfSSL_EVP_PKEY_CTX_add1_hkdf_info(WOLFSSL_EVP_PKEY_CTX* ctx,
3000
                                        const byte* info, int infoSz)
3001
553
{
3002
553
    int ret = WOLFSSL_SUCCESS;
3003
3004
553
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info");
3005
3006
553
    if (ctx == NULL || ctx->pkey == NULL || infoSz < 0) {
3007
0
        WOLFSSL_MSG("Bad argument.");
3008
0
        ret = WOLFSSL_FAILURE;
3009
0
    }
3010
553
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
3011
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
3012
0
        ret = WOLFSSL_FAILURE;
3013
0
    }
3014
3015
553
    if (ret == WOLFSSL_SUCCESS && info != NULL && infoSz > 0) {
3016
207
        unsigned char* p;
3017
        /* If there's already info in the buffer, append. */
3018
    #ifdef WOLFSSL_NO_REALLOC
3019
        p = (byte*)XMALLOC((size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3020
            DYNAMIC_TYPE_INFO);
3021
        if (p != NULL) {
3022
            XMEMCPY(p, ctx->pkey->hkdfInfo, (size_t)ctx->pkey->hkdfInfoSz);
3023
            XFREE(ctx->pkey->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
3024
            ctx->pkey->hkdfInfo = NULL;
3025
        }
3026
    #else
3027
207
        p = (byte*)XREALLOC(ctx->pkey->hkdfInfo,
3028
207
            (size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3029
207
            DYNAMIC_TYPE_INFO);
3030
207
    #endif
3031
207
        if (p == NULL) {
3032
0
            WOLFSSL_MSG("Failed to reallocate larger HKDF info buffer.");
3033
0
            ret = WOLFSSL_FAILURE;
3034
0
        }
3035
207
        else {
3036
207
            ctx->pkey->hkdfInfo = p;
3037
207
            XMEMCPY(ctx->pkey->hkdfInfo + ctx->pkey->hkdfInfoSz, info,
3038
207
                    (size_t)infoSz);
3039
207
            ctx->pkey->hkdfInfoSz += (word32)infoSz;
3040
207
        }
3041
207
    }
3042
3043
553
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info", ret);
3044
3045
553
    return ret;
3046
553
}
3047
3048
int wolfSSL_EVP_PKEY_CTX_hkdf_mode(WOLFSSL_EVP_PKEY_CTX* ctx, int mode)
3049
0
{
3050
0
    int ret = WOLFSSL_SUCCESS;
3051
3052
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_hkdf_mode");
3053
3054
0
    if (ctx == NULL || ctx->pkey == NULL) {
3055
0
        WOLFSSL_MSG("Bad argument.");
3056
0
        ret = WOLFSSL_FAILURE;
3057
0
    }
3058
3059
0
    if (ret == WOLFSSL_SUCCESS &&
3060
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND &&
3061
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY &&
3062
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY)
3063
0
    {
3064
0
        WOLFSSL_MSG("Invalid HKDF mode.");
3065
0
        ret = WOLFSSL_FAILURE;
3066
0
    }
3067
3068
0
    if (ret == WOLFSSL_SUCCESS) {
3069
0
        ctx->pkey->hkdfMode = mode;
3070
0
    }
3071
3072
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_hkdf_mode", ret);
3073
3074
0
    return ret;
3075
0
}
3076
#endif /* HAVE_HKDF */
3077
3078
/* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer.
3079
 *
3080
 * ctx    EVP_PKEY context of operation.
3081
 * out    Decrypted output buffer. If NULL, puts the maximum output buffer size
3082
          in outLen and returns success.
3083
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3084
 *        the size of out. On output holds the length of actual decryption.
3085
 * in     Encrypted input buffer.
3086
 * inLen  Length of encrypted data.
3087
 *
3088
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3089
 */
3090
int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3091
                     unsigned char *out, size_t *outLen,
3092
                     const unsigned char *in, size_t inLen)
3093
0
{
3094
0
    int len = 0;
3095
3096
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt");
3097
3098
0
    if (ctx == NULL || ctx->pkey == NULL) {
3099
0
        WOLFSSL_MSG("Bad parameter.");
3100
0
        return 0;
3101
0
    }
3102
3103
0
    if (ctx->op != WC_EVP_PKEY_OP_DECRYPT) {
3104
0
        WOLFSSL_MSG("ctx->op must be set to WC_EVP_PKEY_OP_DECRYPT. Use "
3105
0
            "wolfSSL_EVP_PKEY_decrypt_init.");
3106
0
        return WOLFSSL_FAILURE;
3107
0
    }
3108
3109
0
    (void)out;
3110
0
    (void)outLen;
3111
0
    (void)in;
3112
0
    (void)inLen;
3113
0
    (void)len;
3114
3115
0
    switch (ctx->pkey->type) {
3116
0
#if !defined(NO_RSA)
3117
0
    case WC_EVP_PKEY_RSA:
3118
0
        if (out == NULL) {
3119
0
            if (ctx->pkey->rsa == NULL) {
3120
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3121
0
                return WOLFSSL_FAILURE;
3122
0
            }
3123
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3124
0
            if (len <= 0) {
3125
0
                WOLFSSL_MSG("Error getting RSA size.");
3126
0
                return WOLFSSL_FAILURE;
3127
0
            }
3128
0
            if (outLen == NULL) {
3129
0
                WOLFSSL_MSG("outLen is NULL.");
3130
0
                return WOLFSSL_FAILURE;
3131
0
            }
3132
3133
0
            *outLen = (size_t)len;
3134
0
            return WOLFSSL_SUCCESS;
3135
0
        }
3136
3137
0
        len = wolfSSL_RSA_private_decrypt((int)inLen, (unsigned char*)in, out,
3138
0
              ctx->pkey->rsa, ctx->padding);
3139
0
        if (len < 0) break;
3140
0
        else {
3141
0
            *outLen = (size_t)len;
3142
0
            return WOLFSSL_SUCCESS;
3143
0
        }
3144
0
#endif /* NO_RSA */
3145
3146
0
    case WC_EVP_PKEY_EC:
3147
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented.");
3148
0
        FALL_THROUGH;
3149
0
    default:
3150
0
        break;
3151
0
    }
3152
3153
0
    return WOLFSSL_FAILURE;
3154
0
}
3155
3156
3157
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure for decryption
3158
 *
3159
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with decryption
3160
 *
3161
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3162
 */
3163
int wolfSSL_EVP_PKEY_decrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3164
0
{
3165
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt_init");
3166
0
    if (ctx == NULL || ctx->pkey == NULL) return WOLFSSL_FAILURE;
3167
0
    switch (ctx->pkey->type) {
3168
0
    case WC_EVP_PKEY_RSA:
3169
0
        ctx->op = WC_EVP_PKEY_OP_DECRYPT;
3170
0
        return WOLFSSL_SUCCESS;
3171
0
    case WC_EVP_PKEY_EC:
3172
0
        WOLFSSL_MSG("not implemented");
3173
0
        FALL_THROUGH;
3174
0
    default:
3175
0
        break;
3176
0
    }
3177
0
    return WOLFSSL_FAILURE;
3178
0
}
3179
3180
3181
/* Uses the WOLFSSL_EVP_PKEY_CTX to encrypt a buffer.
3182
 *
3183
 * ctx    EVP_PKEY context of operation.
3184
 * out    Encrypted output buffer. If NULL, puts the maximum output buffer size
3185
 *        in outlen and returns success.
3186
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3187
 *        the size of out. On output holds the length of actual encryption.
3188
 * in     Plaintext input buffer.
3189
 * inLen  Length of plaintext.
3190
 *
3191
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3192
 */
3193
int wolfSSL_EVP_PKEY_encrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3194
                     unsigned char *out, size_t *outLen,
3195
                     const unsigned char *in, size_t inLen)
3196
0
{
3197
0
    int len = 0;
3198
3199
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt");
3200
3201
0
    if (ctx == NULL || ctx->pkey == NULL) {
3202
0
        WOLFSSL_MSG("Bad parameter.");
3203
0
        return 0;
3204
0
    }
3205
3206
0
    if (ctx->op != WC_EVP_PKEY_OP_ENCRYPT) {
3207
0
        WOLFSSL_MSG("ctx->op must be set to WC_EVP_PKEY_OP_ENCRYPT. Use "
3208
0
            "wolfSSL_EVP_PKEY_encrypt_init.");
3209
0
        return WOLFSSL_FAILURE;
3210
0
    }
3211
3212
0
    (void)out;
3213
0
    (void)outLen;
3214
0
    (void)in;
3215
0
    (void)inLen;
3216
0
    (void)len;
3217
3218
0
    switch (ctx->pkey->type) {
3219
0
#if !defined(NO_RSA)
3220
0
    case WC_EVP_PKEY_RSA:
3221
0
        if (out == NULL) {
3222
0
            if (ctx->pkey->rsa == NULL) {
3223
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3224
0
                return WOLFSSL_FAILURE;
3225
0
            }
3226
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3227
0
            if (len <= 0) {
3228
0
                WOLFSSL_MSG("Error getting RSA size.");
3229
0
                return WOLFSSL_FAILURE;
3230
0
            }
3231
0
            if (outLen == NULL) {
3232
0
                WOLFSSL_MSG("outLen is NULL.");
3233
0
                return WOLFSSL_FAILURE;
3234
0
            }
3235
3236
0
            *outLen = (size_t)len;
3237
0
            return WOLFSSL_SUCCESS;
3238
0
        }
3239
3240
0
        len = wolfSSL_RSA_public_encrypt((int)inLen, (unsigned char *)in, out,
3241
0
                  ctx->pkey->rsa, ctx->padding);
3242
0
        if (len < 0)
3243
0
            break;
3244
0
        else {
3245
0
            *outLen = (size_t)len;
3246
0
            return WOLFSSL_SUCCESS;
3247
0
        }
3248
0
#endif /* NO_RSA */
3249
3250
0
    case WC_EVP_PKEY_EC:
3251
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented");
3252
0
        FALL_THROUGH;
3253
0
    default:
3254
0
        break;
3255
0
    }
3256
3257
0
    return WOLFSSL_FAILURE;
3258
0
}
3259
3260
3261
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure to encrypt data
3262
 *
3263
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with encryption
3264
 *
3265
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3266
 */
3267
int wolfSSL_EVP_PKEY_encrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3268
0
{
3269
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt_init");
3270
0
    if (ctx == NULL || ctx->pkey == NULL) return WOLFSSL_FAILURE;
3271
3272
0
    switch (ctx->pkey->type) {
3273
0
    case WC_EVP_PKEY_RSA:
3274
0
        ctx->op = WC_EVP_PKEY_OP_ENCRYPT;
3275
0
        return WOLFSSL_SUCCESS;
3276
0
    case WC_EVP_PKEY_EC:
3277
0
        WOLFSSL_MSG("not implemented");
3278
0
        FALL_THROUGH;
3279
0
    default:
3280
0
        break;
3281
0
    }
3282
0
    return WOLFSSL_FAILURE;
3283
0
}
3284
/******************************************************************************
3285
* wolfSSL_EVP_PKEY_sign_init -  initializes a public key algorithm context for
3286
* a signing operation.
3287
*
3288
* RETURNS:
3289
* returns WOLFSSL_SUCCESS on success, otherwise returns -2
3290
*/
3291
int wolfSSL_EVP_PKEY_sign_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3292
0
{
3293
0
    int ret = -2;
3294
3295
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign_init");
3296
0
    if (!ctx  || !ctx->pkey)
3297
0
        return ret;
3298
3299
0
    switch (ctx->pkey->type) {
3300
0
#if !defined(NO_RSA)
3301
0
        case WC_EVP_PKEY_RSA:
3302
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3303
0
            ret = WOLFSSL_SUCCESS;
3304
0
            break;
3305
0
#endif /* NO_RSA */
3306
3307
#ifndef NO_DSA
3308
        case WC_EVP_PKEY_DSA:
3309
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3310
            ret = WOLFSSL_SUCCESS;
3311
            break;
3312
#endif /* NO_DSA */
3313
3314
0
#ifdef HAVE_ECC
3315
0
        case WC_EVP_PKEY_EC:
3316
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3317
0
            ret = WOLFSSL_SUCCESS;
3318
0
            break;
3319
0
#endif /* HAVE_ECC */
3320
3321
0
        default:
3322
0
            ret = -2;
3323
0
    }
3324
0
    return ret;
3325
0
}
3326
/******************************************************************************
3327
* wolfSSL_EVP_PKEY_sign - performs a public key signing operation using ctx
3328
* The data to be signed should be hashed since the function does not hash the data.
3329
*
3330
* RETURNS:
3331
* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
3332
*/
3333
3334
int wolfSSL_EVP_PKEY_sign(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *sig,
3335
                        size_t *siglen, const unsigned char *tbs, size_t tbslen)
3336
0
{
3337
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign");
3338
3339
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_SIGN || !ctx->pkey || !siglen)
3340
0
        return WOLFSSL_FAILURE;
3341
3342
0
    (void)sig;
3343
0
    (void)siglen;
3344
0
    (void)tbs;
3345
0
    (void)tbslen;
3346
3347
0
    switch (ctx->pkey->type) {
3348
0
#ifndef NO_RSA
3349
0
    case WC_EVP_PKEY_RSA: {
3350
0
        unsigned int usiglen = (unsigned int)*siglen;
3351
0
        if (!sig) {
3352
0
            int len;
3353
0
            if (!ctx->pkey->rsa)
3354
0
                return WOLFSSL_FAILURE;
3355
0
            len = wc_RsaEncryptSize((RsaKey*)ctx->pkey->rsa->internal);
3356
0
            if (len < 0)
3357
0
                return WOLFSSL_FAILURE;
3358
0
            *siglen = (size_t)len;
3359
0
            return WOLFSSL_SUCCESS;
3360
0
        }
3361
3362
0
        if (wolfSSL_RSA_sign_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3363
0
            (unsigned int)tbslen, sig, &usiglen, ctx->pkey->rsa, 1,
3364
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen
3365
0
        ) != WOLFSSL_SUCCESS) {
3366
0
            return WOLFSSL_FAILURE;
3367
0
        }
3368
0
        *siglen = (size_t)usiglen;
3369
0
        return WOLFSSL_SUCCESS;
3370
0
    }
3371
0
#endif /* !NO_RSA */
3372
3373
#ifndef NO_DSA
3374
    case WC_EVP_PKEY_DSA: {
3375
        int bytes;
3376
        int ret;
3377
        if (!ctx->pkey->dsa)
3378
            return WOLFSSL_FAILURE;
3379
        bytes = wolfSSL_BN_num_bytes(ctx->pkey->dsa->q);
3380
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3381
            return WOLFSSL_FAILURE;
3382
        bytes *= 2;
3383
        if (!sig) {
3384
            *siglen = (size_t)bytes;
3385
            return WOLFSSL_SUCCESS;
3386
        }
3387
        if ((int)*siglen < bytes)
3388
            return WOLFSSL_FAILURE;
3389
        ret = wolfSSL_DSA_do_sign(tbs, sig, ctx->pkey->dsa);
3390
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
3391
        if (ret != WOLFSSL_SUCCESS)
3392
            return ret;
3393
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3394
            return WOLFSSL_FAILURE;
3395
        *siglen = (size_t)bytes;
3396
        return WOLFSSL_SUCCESS;
3397
    }
3398
#endif /* NO_DSA */
3399
3400
0
#ifdef HAVE_ECC
3401
0
    case WC_EVP_PKEY_EC: {
3402
0
        int ret;
3403
0
        WOLFSSL_ECDSA_SIG *ecdsaSig;
3404
0
        if (!sig) {
3405
0
            WOLFSSL_EC_KEY *key = ctx->pkey->ecc;
3406
0
            ecc_key* eckey;
3407
0
            if (!key)
3408
0
                return WOLFSSL_FAILURE;
3409
            /* set internal key if not done */
3410
0
            if (key->inSet == 0 && SetECKeyInternal(key) != WOLFSSL_SUCCESS)
3411
0
                return WOLFSSL_FAILURE;
3412
0
            eckey = (ecc_key*)ctx->pkey->ecc->internal;
3413
0
            if (!eckey)
3414
0
                return WOLFSSL_FAILURE;
3415
0
            ret = wc_ecc_sig_size(eckey);
3416
0
            if (ret == 0)
3417
0
                return WOLFSSL_FAILURE;
3418
0
            *siglen = (size_t)ret;
3419
0
            return WOLFSSL_SUCCESS;
3420
0
        }
3421
0
        ecdsaSig = wolfSSL_ECDSA_do_sign(tbs, (int)tbslen, ctx->pkey->ecc);
3422
0
        if (ecdsaSig == NULL)
3423
0
            return WOLFSSL_FAILURE;
3424
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
3425
0
        if (ret == 0 || ret > (int)*siglen) {
3426
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
3427
0
            return WOLFSSL_FAILURE;
3428
0
        }
3429
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
3430
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3431
0
        if (ret == 0)
3432
0
            return WOLFSSL_FAILURE;
3433
0
        *siglen = (size_t)ret;
3434
0
        return WOLFSSL_SUCCESS;
3435
0
    }
3436
0
#endif /* HAVE_ECC */
3437
3438
0
    default:
3439
0
        break;
3440
0
    }
3441
0
    return WOLFSSL_FAILURE;
3442
0
}
3443
3444
/******************************************************************************
3445
* wolfSSL_EVP_PKEY_verify_init - initializes a public key algorithm context for
3446
* a verification operation.
3447
*
3448
* RETURNS:
3449
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3450
* a return value of -2 indicates the operation is not supported by the public
3451
* key algorithm.
3452
*/
3453
3454
int wolfSSL_EVP_PKEY_verify_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3455
0
{
3456
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify_init");
3457
3458
0
    if (!ctx || !ctx->pkey)
3459
0
        return WOLFSSL_FAILURE;
3460
3461
0
    switch (ctx->pkey->type) {
3462
0
#if !defined(NO_RSA)
3463
0
        case WC_EVP_PKEY_RSA:
3464
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3465
0
            return WOLFSSL_SUCCESS;
3466
0
#endif /* NO_RSA */
3467
3468
#ifndef NO_DSA
3469
        case WC_EVP_PKEY_DSA:
3470
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3471
            return WOLFSSL_SUCCESS;
3472
#endif /* NO_DSA */
3473
3474
0
#ifdef HAVE_ECC
3475
0
        case WC_EVP_PKEY_EC:
3476
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3477
0
            return WOLFSSL_SUCCESS;
3478
0
#endif /* HAVE_ECC */
3479
3480
0
        default:
3481
0
            return -2;
3482
0
    }
3483
0
}
3484
3485
/******************************************************************************
3486
* wolfSSL_EVP_PKEY_verify - verifies a signature using ctx
3487
*
3488
* RETURNS:
3489
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3490
* a return value of -2 indicates the operation is not supported by the public
3491
* key algorithm.
3492
*/
3493
3494
int wolfSSL_EVP_PKEY_verify(WOLFSSL_EVP_PKEY_CTX *ctx, const unsigned char *sig,
3495
                            size_t siglen, const unsigned char *tbs,
3496
                            size_t tbslen)
3497
0
{
3498
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify");
3499
3500
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_VERIFY || !ctx->pkey)
3501
0
        return WOLFSSL_FAILURE;
3502
3503
0
    switch (ctx->pkey->type) {
3504
0
#ifndef NO_RSA
3505
0
    case WC_EVP_PKEY_RSA:
3506
0
        return wolfSSL_RSA_verify_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3507
0
            (unsigned int)tbslen, sig, (unsigned int)siglen, ctx->pkey->rsa,
3508
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen);
3509
0
#endif /* !NO_RSA */
3510
3511
#ifndef NO_DSA
3512
     case WC_EVP_PKEY_DSA: {
3513
        int dsacheck = 0;
3514
        if (wolfSSL_DSA_do_verify(tbs, (unsigned char *)sig, ctx->pkey->dsa,
3515
            &dsacheck) != WOLFSSL_SUCCESS || dsacheck != 1)
3516
            return WOLFSSL_FAILURE;
3517
        return WOLFSSL_SUCCESS;
3518
     }
3519
#endif /* NO_DSA */
3520
3521
0
#ifdef HAVE_ECC
3522
0
    case WC_EVP_PKEY_EC: {
3523
0
        int ret;
3524
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
3525
0
            NULL, (const unsigned char **)&sig, (long)siglen);
3526
0
        if (ecdsaSig == NULL)
3527
0
            return WOLFSSL_FAILURE;
3528
0
        ret = wolfSSL_ECDSA_do_verify(tbs, (int)tbslen, ecdsaSig,
3529
0
            ctx->pkey->ecc);
3530
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3531
0
        return ret;
3532
0
    }
3533
0
#endif /* HAVE_ECC */
3534
3535
0
    default:
3536
0
        return -2;
3537
0
    }
3538
0
}
3539
3540
/* Get the size in bits for WOLFSSL_EVP_PKEY key
3541
 *
3542
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3543
 *
3544
 * returns the size in bits of key on success
3545
 */
3546
int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey)
3547
0
{
3548
0
    int ret = 0;
3549
3550
0
    if (pkey == NULL)
3551
0
        return 0;
3552
3553
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
3554
3555
0
    switch (pkey->type) {
3556
0
#ifndef NO_RSA
3557
0
    case WC_EVP_PKEY_RSA:
3558
0
        ret = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3559
0
        break;
3560
0
#endif /* !NO_RSA */
3561
3562
#ifndef NO_DSA
3563
    case WC_EVP_PKEY_DSA:
3564
        if (pkey->dsa == NULL ||
3565
                (!pkey->dsa->exSet &&
3566
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3567
            break;
3568
        ret = wolfSSL_BN_num_bytes(pkey->dsa->p);
3569
        break;
3570
#endif
3571
3572
0
#ifdef HAVE_ECC
3573
0
    case WC_EVP_PKEY_EC:
3574
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3575
0
            WOLFSSL_MSG("No ECC key has been set");
3576
0
            break;
3577
0
        }
3578
0
        ret = wc_ecc_size((ecc_key*)(pkey->ecc->internal));
3579
0
        break;
3580
0
#endif /* HAVE_ECC */
3581
3582
0
    default:
3583
0
        break;
3584
0
    }
3585
0
    return ret > 0 ? ret * 8 : 0;
3586
0
}
3587
3588
3589
int wolfSSL_EVP_PKEY_paramgen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3590
0
{
3591
0
    (void)ctx;
3592
0
    return WOLFSSL_SUCCESS;
3593
0
}
3594
3595
int wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(WOLFSSL_EVP_PKEY_CTX *ctx,
3596
        int nid)
3597
0
{
3598
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid");
3599
0
#ifdef HAVE_ECC
3600
0
    if (ctx != NULL && ctx->pkey != NULL && ctx->pkey->type == WC_EVP_PKEY_EC) {
3601
0
        ctx->curveNID = nid;
3602
0
        return WOLFSSL_SUCCESS;
3603
0
    }
3604
0
    else
3605
0
#endif
3606
0
    {
3607
#ifndef HAVE_ECC
3608
        (void)ctx;
3609
        (void)nid;
3610
        WOLFSSL_MSG("Support not compiled in");
3611
#else
3612
0
        WOLFSSL_MSG("Bad parameter");
3613
0
#endif
3614
0
        return WOLFSSL_FAILURE;
3615
0
    }
3616
0
}
3617
3618
int wolfSSL_EVP_PKEY_paramgen(WOLFSSL_EVP_PKEY_CTX* ctx,
3619
                              WOLFSSL_EVP_PKEY** pkey)
3620
0
{
3621
0
    int ret = WOLFSSL_SUCCESS;
3622
0
    int ownPkey = 0;
3623
3624
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_paramgen");
3625
3626
0
    if (ctx == NULL || pkey == NULL) {
3627
0
        WOLFSSL_MSG("Bad parameter");
3628
0
        ret = WOLFSSL_FAILURE;
3629
0
    }
3630
3631
0
    if (ret == WOLFSSL_SUCCESS && *pkey == NULL) {
3632
        /* Only ECC is supported currently. */
3633
0
        if (ctx->pkey == NULL || ctx->pkey->type != WC_EVP_PKEY_EC) {
3634
0
            WOLFSSL_MSG("Key not set or key type not supported.");
3635
0
            ret = WOLFSSL_FAILURE;
3636
0
        }
3637
0
        else {
3638
0
            *pkey = wolfSSL_EVP_PKEY_new();
3639
0
            if (*pkey == NULL) {
3640
0
                WOLFSSL_MSG("Failed to create WOLFSSL_EVP_PKEY.");
3641
0
                ret = WOLFSSL_FAILURE;
3642
0
            }
3643
0
            else {
3644
0
                (*pkey)->type = ctx->pkey->type;
3645
0
                ownPkey = 1;
3646
0
            }
3647
0
        }
3648
0
    }
3649
0
    if (ret == WOLFSSL_SUCCESS) {
3650
0
        switch ((*pkey)->type) {
3651
0
        #ifdef HAVE_ECC
3652
            /* For ECC parameter generation we just need to set the group, which
3653
             * wolfSSL_EC_KEY_new_by_curve_name will do. */
3654
0
            case WC_EVP_PKEY_EC:
3655
0
                (*pkey)->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3656
0
                if ((*pkey)->ecc == NULL) {
3657
0
                    WOLFSSL_MSG("Failed to create WOLFSSL_EC_KEY.");
3658
0
                    ret = WOLFSSL_FAILURE;
3659
0
                }
3660
0
                else {
3661
0
                    (*pkey)->ownEcc = 1;
3662
0
                }
3663
0
                break;
3664
0
        #endif
3665
0
            default:
3666
0
                ret = WOLFSSL_FAILURE;
3667
0
                break;
3668
0
        }
3669
0
    }
3670
3671
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3672
0
        wolfSSL_EVP_PKEY_free(*pkey);
3673
0
        *pkey = NULL;
3674
0
    }
3675
3676
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_paramgen", ret);
3677
3678
0
    return ret;
3679
0
}
3680
3681
/* wolfSSL only supports writing out named curves so no need to store the flag.
3682
 * In short, it is preferred to write out the name of the curve chosen instead
3683
 * of the explicit parameters.
3684
 * The difference is nicely explained and illustrated in section
3685
 * "ECDH and Named Curves" of
3686
 * https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman */
3687
int wolfSSL_EVP_PKEY_CTX_set_ec_param_enc(WOLFSSL_EVP_PKEY_CTX *ctx,
3688
        int flag)
3689
0
{
3690
0
    (void)ctx;
3691
0
    (void)flag;
3692
0
    return WOLFSSL_SUCCESS;
3693
0
}
3694
3695
int wolfSSL_EVP_PKEY_keygen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3696
0
{
3697
0
    (void)ctx;
3698
0
    return WOLFSSL_SUCCESS;
3699
0
}
3700
3701
int wolfSSL_EVP_PKEY_keygen(WOLFSSL_EVP_PKEY_CTX *ctx,
3702
  WOLFSSL_EVP_PKEY **ppkey)
3703
0
{
3704
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
3705
0
    int ownPkey = 0;
3706
0
    WOLFSSL_EVP_PKEY* pkey;
3707
3708
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_keygen");
3709
3710
0
    if (ctx == NULL || ppkey == NULL) {
3711
0
        return WOLFSSL_FAILURE;
3712
0
    }
3713
3714
0
    pkey = *ppkey;
3715
0
    if (pkey == NULL) {
3716
0
        if (ctx->pkey == NULL ||
3717
0
                (ctx->pkey->type != WC_EVP_PKEY_EC &&
3718
0
                 ctx->pkey->type != WC_EVP_PKEY_RSA &&
3719
0
                 ctx->pkey->type != WC_EVP_PKEY_DH)) {
3720
0
            WOLFSSL_MSG("Key not set or key type not supported");
3721
0
            return WOLFSSL_FAILURE;
3722
0
        }
3723
0
        pkey = wolfSSL_EVP_PKEY_new();
3724
0
        if (pkey == NULL) {
3725
0
            return MEMORY_E;
3726
0
        }
3727
0
        ownPkey = 1;
3728
0
        pkey->type = ctx->pkey->type;
3729
0
    }
3730
3731
0
    switch (pkey->type) {
3732
0
#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
3733
0
        case WC_EVP_PKEY_RSA:
3734
0
            pkey->rsa = wolfSSL_RSA_generate_key(ctx->nbits, WC_RSA_EXPONENT,
3735
0
                NULL, NULL);
3736
0
            if (pkey->rsa) {
3737
0
                pkey->ownRsa = 1;
3738
0
                pkey->pkey_sz = wolfSSL_i2d_RSAPrivateKey(pkey->rsa,
3739
0
                        (unsigned char**)&pkey->pkey.ptr);
3740
0
                ret = WOLFSSL_SUCCESS;
3741
0
            }
3742
0
            break;
3743
0
#endif
3744
0
#ifdef HAVE_ECC
3745
0
        case WC_EVP_PKEY_EC:
3746
            /* pkey->ecc may not be NULL, if, for example, it was populated by a
3747
             * prior call to wolfSSL_EVP_PKEY_paramgen. */
3748
0
            if (pkey->ecc == NULL) {
3749
0
                pkey->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3750
0
            }
3751
0
            if (pkey->ecc) {
3752
0
                ret = wolfSSL_EC_KEY_generate_key(pkey->ecc);
3753
0
                if (ret == WOLFSSL_SUCCESS) {
3754
0
                    pkey->ownEcc = 1;
3755
0
                }
3756
0
            }
3757
0
            break;
3758
0
#endif
3759
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
3760
0
        case WC_EVP_PKEY_DH:
3761
0
            pkey->dh = wolfSSL_DH_new();
3762
0
            if (pkey->dh) {
3763
0
                pkey->ownDh = 1;
3764
                /* load DH params from CTX */
3765
0
                ret = wolfSSL_DH_LoadDer(pkey->dh,
3766
0
                        (const unsigned char*)ctx->pkey->pkey.ptr,
3767
0
                        ctx->pkey->pkey_sz);
3768
0
                if (ret == WOLFSSL_SUCCESS) {
3769
0
                    ret = wolfSSL_DH_generate_key(pkey->dh);
3770
0
                }
3771
0
                if (ret == WOLFSSL_SUCCESS) {
3772
                    /* copy private/public key from external to internal */
3773
0
                    ret = SetDhInternal(pkey->dh);
3774
0
                }
3775
0
            }
3776
0
            break;
3777
0
#endif
3778
0
        default:
3779
0
            break;
3780
0
    }
3781
3782
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3783
0
        wolfSSL_EVP_PKEY_free(pkey);
3784
0
        pkey = NULL;
3785
0
    }
3786
3787
0
    *ppkey = pkey;
3788
3789
0
    return ret;
3790
0
}
3791
3792
/* Get the maximum suitable size for the operations that can be done with pkey
3793
 *
3794
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3795
 *
3796
 * returns the recommended size of buffers
3797
 */
3798
int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
3799
0
{
3800
0
    if (pkey == NULL) return 0;
3801
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_size");
3802
3803
0
    switch (pkey->type) {
3804
0
#ifndef NO_RSA
3805
0
    case WC_EVP_PKEY_RSA:
3806
0
        return (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3807
0
#endif /* !NO_RSA */
3808
3809
#ifndef NO_DSA
3810
    case WC_EVP_PKEY_DSA:
3811
        if (pkey->dsa == NULL ||
3812
                (!pkey->dsa->exSet &&
3813
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3814
            return WOLFSSL_FAILURE;
3815
        return wolfSSL_BN_num_bytes(pkey->dsa->p);
3816
#endif
3817
3818
0
#ifdef HAVE_ECC
3819
0
    case WC_EVP_PKEY_EC:
3820
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3821
0
            WOLFSSL_MSG("No ECC key has been set");
3822
0
            break;
3823
0
        }
3824
0
        return wc_ecc_sig_size((ecc_key*)(pkey->ecc->internal));
3825
0
#endif /* HAVE_ECC */
3826
3827
0
    default:
3828
0
        break;
3829
0
    }
3830
0
    return 0;
3831
0
}
3832
3833
3834
int wolfSSL_EVP_PKEY_copy_parameters(WOLFSSL_EVP_PKEY *to,
3835
        const WOLFSSL_EVP_PKEY *from)
3836
0
{
3837
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_copy_parameters");
3838
3839
0
    if (!to || !from) {
3840
0
        WOLFSSL_MSG("Bad parameter");
3841
0
        return WOLFSSL_FAILURE;
3842
0
    }
3843
3844
0
    if (to->type == WC_EVP_PKEY_NONE) {
3845
0
        to->type = from->type;
3846
0
    }
3847
0
    else if (to->type != from->type) {
3848
0
        WOLFSSL_MSG("Different key types");
3849
0
        return WOLFSSL_FAILURE;
3850
0
    }
3851
3852
0
    switch(from->type) {
3853
0
#ifdef HAVE_ECC
3854
0
    case WC_EVP_PKEY_EC:
3855
0
        if (from->ecc) {
3856
0
            if (!to->ecc) {
3857
0
                if ((to->ecc = wolfSSL_EC_KEY_new()) == NULL) {
3858
0
                    WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
3859
0
                    return WOLFSSL_FAILURE;
3860
0
                }
3861
0
                to->ownEcc = 1;
3862
0
            }
3863
0
            to->ecc->group->curve_idx = from->ecc->group->curve_idx;
3864
0
            to->ecc->group->curve_nid = from->ecc->group->curve_nid;
3865
0
            to->ecc->group->curve_oid = from->ecc->group->curve_oid;
3866
0
        }
3867
0
        else {
3868
0
            WOLFSSL_MSG("Missing ECC struct");
3869
0
            return WOLFSSL_FAILURE;
3870
0
        }
3871
0
        break;
3872
0
#endif
3873
#ifndef NO_DSA
3874
    case WC_EVP_PKEY_DSA:
3875
        if (from->dsa) {
3876
            WOLFSSL_BIGNUM* cpy;
3877
            if (!to->dsa) {
3878
                if ((to->dsa = wolfSSL_DSA_new()) == NULL) {
3879
                    WOLFSSL_MSG("wolfSSL_DSA_new error");
3880
                    return WOLFSSL_FAILURE;
3881
                }
3882
                to->ownDsa = 1;
3883
            }
3884
3885
            /* free existing BIGNUMs if needed before copying over new */
3886
            wolfSSL_BN_free(to->dsa->p);
3887
            wolfSSL_BN_free(to->dsa->g);
3888
            wolfSSL_BN_free(to->dsa->q);
3889
            to->dsa->p = NULL;
3890
            to->dsa->g = NULL;
3891
            to->dsa->q = NULL;
3892
3893
            if (!(cpy = wolfSSL_BN_dup(from->dsa->p))) {
3894
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3895
                return WOLFSSL_FAILURE;
3896
            }
3897
            to->dsa->p = cpy;
3898
            if (!(cpy = wolfSSL_BN_dup(from->dsa->q))) {
3899
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3900
                return WOLFSSL_FAILURE;
3901
            }
3902
            to->dsa->q = cpy;
3903
            if (!(cpy = wolfSSL_BN_dup(from->dsa->g))) {
3904
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3905
                return WOLFSSL_FAILURE;
3906
            }
3907
            to->dsa->g = cpy;
3908
        }
3909
        else {
3910
            WOLFSSL_MSG("Missing DSA struct");
3911
            return WOLFSSL_FAILURE;
3912
        }
3913
        break;
3914
#endif
3915
0
#ifndef NO_DH
3916
0
    case WC_EVP_PKEY_DH:
3917
0
        if (from->dh) {
3918
0
            WOLFSSL_BIGNUM* cpy;
3919
0
            if (!to->dh) {
3920
0
                if ((to->dh = wolfSSL_DH_new()) == NULL) {
3921
0
                    WOLFSSL_MSG("wolfSSL_DH_new error");
3922
0
                    return WOLFSSL_FAILURE;
3923
0
                }
3924
0
                to->ownDh = 1;
3925
0
            }
3926
3927
            /* free existing BIGNUMs if needed before copying over new */
3928
0
            wolfSSL_BN_free(to->dh->p);
3929
0
            wolfSSL_BN_free(to->dh->g);
3930
0
            wolfSSL_BN_free(to->dh->q);
3931
0
            to->dh->p = NULL;
3932
0
            to->dh->g = NULL;
3933
0
            to->dh->q = NULL;
3934
3935
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->p))) {
3936
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH p");
3937
0
                return WOLFSSL_FAILURE;
3938
0
            }
3939
0
            to->dh->p = cpy;
3940
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->g))) {
3941
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH g");
3942
0
                return WOLFSSL_FAILURE;
3943
0
            }
3944
0
            to->dh->g = cpy;
3945
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->q))) {
3946
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH q");
3947
0
                return WOLFSSL_FAILURE;
3948
0
            }
3949
0
            to->dh->q = cpy;
3950
0
        }
3951
0
        else {
3952
0
            WOLFSSL_MSG("Missing DH struct");
3953
0
            return WOLFSSL_FAILURE;
3954
0
        }
3955
0
        break;
3956
0
#endif
3957
0
#ifndef NO_RSA
3958
0
    case WC_EVP_PKEY_RSA:
3959
0
#endif
3960
0
    default:
3961
0
        WOLFSSL_MSG("Copy parameters not available for this key type");
3962
0
        return WOLFSSL_FAILURE;
3963
0
    }
3964
3965
0
    return WOLFSSL_SUCCESS;
3966
0
}
3967
3968
#ifndef NO_WOLFSSL_STUB
3969
int wolfSSL_EVP_PKEY_missing_parameters(WOLFSSL_EVP_PKEY *pkey)
3970
0
{
3971
0
    (void)pkey;
3972
    /* not using missing params callback and returning zero to indicate success */
3973
0
    return 0;
3974
0
}
3975
#endif
3976
3977
/* wolfSSL_EVP_PKEY_cmp
3978
 * returns 0 on success, -1 on failure.
3979
 *
3980
 * This behavior is different from openssl.
3981
 *  EVP_PKEY_cmp returns:
3982
 *    1 : two keys match
3983
 *    0 : do not match
3984
 *    -1: key types are different
3985
 *    -2: the operation is not supported
3986
 * If you want this function behave the same as openSSL,
3987
 * define WOLFSSL_ERROR_CODE_OPENSSL so that WS_RETURN_CODE translates return
3988
 * codes to match OpenSSL equivalent behavior.
3989
 */
3990
int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
3991
0
{
3992
0
    int ret = -1; /* failure */
3993
3994
0
    if (a == NULL || b == NULL)
3995
0
        return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3996
3997
    /* check its the same type of key */
3998
0
    if (a->type != b->type)
3999
0
        return WS_RETURN_CODE(ret, -1);
4000
4001
    /* get size based on key type */
4002
0
    switch (a->type) {
4003
0
#ifndef NO_RSA
4004
0
    case WC_EVP_PKEY_RSA:
4005
0
        if (wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa)) <= 0 ||
4006
0
                wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa)) <= 0) {
4007
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4008
0
        }
4009
4010
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->n,
4011
0
                   &((RsaKey*)b->rsa->internal)->n) != MP_EQ) {
4012
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4013
0
        }
4014
4015
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->e,
4016
0
                   &((RsaKey*)b->rsa->internal)->e) != MP_EQ) {
4017
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4018
0
        }
4019
0
        break;
4020
0
#endif /* !NO_RSA */
4021
0
#ifdef HAVE_ECC
4022
0
    case WC_EVP_PKEY_EC:
4023
0
        if (a->ecc == NULL || a->ecc->internal == NULL ||
4024
0
            b->ecc == NULL || b->ecc->internal == NULL ||
4025
0
            wc_ecc_size((ecc_key*)a->ecc->internal) <= 0 ||
4026
0
            wc_ecc_size((ecc_key*)b->ecc->internal) <= 0 ||
4027
0
            a->ecc->group == NULL || b->ecc->group == NULL) {
4028
0
            return ret;
4029
0
        }
4030
4031
        /* check curve */
4032
0
        if (a->ecc->group->curve_idx != b->ecc->group->curve_idx) {
4033
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4034
0
        }
4035
4036
0
        if (wc_ecc_cmp_point(&((ecc_key*)a->ecc->internal)->pubkey,
4037
0
                             &((ecc_key*)b->ecc->internal)->pubkey) != 0) {
4038
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4039
0
        }
4040
0
        break;
4041
0
#endif /* HAVE_ECC */
4042
0
    default:
4043
0
        return WS_RETURN_CODE(ret, -2);
4044
0
    } /* switch (a->type) */
4045
4046
0
#if defined(WOLFSSL_ERROR_CODE_OPENSSL)
4047
0
    ret = 1; /* the keys match */
4048
#else
4049
    ret = 0; /* success */
4050
#endif
4051
0
    return ret;
4052
0
}
4053
4054
/**
4055
 * validate DH algorithm parameters
4056
 * @param dh_key  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4057
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4058
 */
4059
static int DH_param_check(WOLFSSL_DH* dh_key)
4060
0
{
4061
0
    int ret = WOLFSSL_SUCCESS;
4062
0
    WOLFSSL_BIGNUM *num1 = NULL;
4063
0
    WOLFSSL_BIGNUM *num2 = NULL;
4064
4065
0
    WOLFSSL_ENTER("DH_param_check");
4066
4067
0
    num1 = wolfSSL_BN_new();
4068
0
    num2 = wolfSSL_BN_new();
4069
0
    if (num1 == NULL || num2 == NULL) {
4070
0
        WOLFSSL_MSG("failed to assign big number");
4071
0
        ret = WOLFSSL_FAILURE;
4072
0
    }
4073
4074
    /* prime check */
4075
0
    if (ret == WOLFSSL_SUCCESS &&
4076
0
        wolfSSL_BN_is_odd(dh_key->p) == 0){
4077
0
        WOLFSSL_MSG("dh_key->p is not prime");
4078
0
        ret = WOLFSSL_FAILURE;
4079
0
    } /* TODO safe prime check. need BN_rshift1 */
4080
4081
    /* generator check */
4082
0
    if (ret == WOLFSSL_SUCCESS &&
4083
0
       (wolfSSL_BN_is_one(dh_key->g) ||
4084
0
        wolfSSL_BN_is_negative(dh_key->g) ||
4085
0
        wolfSSL_BN_is_zero(dh_key->g))) {
4086
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4087
0
        ret = WOLFSSL_FAILURE;
4088
0
    }
4089
4090
0
    if (ret == WOLFSSL_SUCCESS &&
4091
0
        wolfSSL_BN_cmp(dh_key->p, dh_key->g) <= 0) {
4092
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4093
0
        ret = WOLFSSL_FAILURE;
4094
0
    }
4095
4096
0
    if (ret == WOLFSSL_SUCCESS &&
4097
0
        dh_key->q != NULL)
4098
0
    {
4099
0
        if (ret == WOLFSSL_SUCCESS &&
4100
0
            wolfSSL_BN_mod_exp(num1, dh_key->g, dh_key->q, dh_key->p, NULL)
4101
0
               == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
4102
0
        {
4103
0
            WOLFSSL_MSG("BN_mod_exp failed");
4104
0
            ret = WOLFSSL_FAILURE;
4105
0
        }
4106
0
        else
4107
0
            if (ret == WOLFSSL_SUCCESS &&
4108
0
                wolfSSL_BN_is_one(num1) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4109
0
                WOLFSSL_MSG("dh_key->g is not suitable generator");
4110
0
                ret = WOLFSSL_FAILURE;
4111
0
            }
4112
0
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
4113
        /* test if the number q is prime. */
4114
0
        if (ret == WOLFSSL_SUCCESS &&
4115
0
            (wolfSSL_BN_is_prime_ex(dh_key->q, 64, NULL, NULL) <= 0)) {
4116
0
            WOLFSSL_MSG("dh_key->q is not prime or error during check.");
4117
0
            ret = WOLFSSL_FAILURE;
4118
0
        } /* else TODO check q div q - 1. need BN_div */
4119
0
#endif
4120
0
    }
4121
4122
    /* clean up */
4123
0
    wolfSSL_BN_free(num1);
4124
0
    wolfSSL_BN_free(num2);
4125
4126
0
    WOLFSSL_LEAVE("DH_param_check", WOLFSSL_SUCCESS);
4127
0
    return ret;
4128
0
}
4129
/**
4130
 * validate the algorithm parameters
4131
 * @param ctx  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4132
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4133
 */
4134
int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx)
4135
0
{
4136
0
    int type;
4137
0
    int ret;
4138
0
    WOLFSSL_DH* dh_key = NULL;
4139
4140
    /* sanity check */
4141
0
    if (ctx == NULL) {
4142
0
        return WOLFSSL_FAILURE;
4143
0
    }
4144
4145
0
    type = wolfSSL_EVP_PKEY_type(wolfSSL_EVP_PKEY_base_id(ctx->pkey));
4146
0
    switch (type) {
4147
0
        #if !defined(NO_RSA)
4148
0
            case WC_EVP_PKEY_RSA:
4149
0
                WOLFSSL_MSG("WC_EVP_PKEY_RSA not yet implemented");
4150
0
                return WOLFSSL_FAILURE;
4151
0
        #endif
4152
0
        #if defined(HAVE_ECC)
4153
0
            case WC_EVP_PKEY_EC:
4154
0
                WOLFSSL_MSG("WC_EVP_PKEY_EC not yet implemented");
4155
0
                return WOLFSSL_FAILURE;
4156
0
        #endif
4157
        #if !defined(NO_DSA)
4158
            case WC_EVP_PKEY_DSA:
4159
                WOLFSSL_MSG("WC_EVP_PKEY_DSA not yet implemented");
4160
                return WOLFSSL_FAILURE;
4161
        #endif
4162
0
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
4163
0
        #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
4164
0
            case WC_EVP_PKEY_DH:
4165
0
                dh_key = wolfSSL_EVP_PKEY_get1_DH(ctx->pkey);
4166
0
                if (dh_key != NULL) {
4167
0
                    ret = DH_param_check(dh_key);
4168
0
                    wolfSSL_DH_free(dh_key);
4169
0
                }
4170
0
                else
4171
0
                    ret = WOLFSSL_FAILURE;
4172
0
            return ret;
4173
0
        #endif
4174
0
        #endif
4175
0
        default:
4176
0
            WOLFSSL_MSG("Unknown PKEY type");
4177
0
            break;
4178
0
    }
4179
4180
0
    (void)ret;
4181
0
    (void)DH_param_check;
4182
0
    (void)dh_key;
4183
0
    return WOLFSSL_FAILURE;
4184
0
}
4185
4186
/* Initialize structure for signing
4187
 *
4188
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4189
 * type is the type of message digest to use
4190
 *
4191
 * returns WOLFSSL_SUCCESS on success
4192
 */
4193
int wolfSSL_EVP_SignInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4194
0
{
4195
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4196
0
    WOLFSSL_ENTER("EVP_SignInit");
4197
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4198
0
}
4199
4200
int wolfSSL_EVP_SignInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
4201
                                     const WOLFSSL_EVP_MD* type,
4202
                                     WOLFSSL_ENGINE *impl)
4203
0
{
4204
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4205
0
    WOLFSSL_ENTER("EVP_SignInit");
4206
0
    return wolfSSL_EVP_DigestInit_ex(ctx,type,impl);
4207
0
}
4208
4209
4210
/* Update structure with data for signing
4211
 *
4212
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4213
 * data buffer holding data to update with for sign
4214
 * len  length of data buffer
4215
 *
4216
 * returns WOLFSSL_SUCCESS on success
4217
 */
4218
int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4219
0
{
4220
0
    if (ctx == NULL) return 0;
4221
0
    WOLFSSL_ENTER("EVP_SignUpdate(");
4222
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4223
0
}
4224
static const WOLFSSL_EVP_MD* wolfSSL_macType2EVP_md(enum wc_HashType type)
4225
0
{
4226
0
    const struct s_ent *ent ;
4227
4228
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
4229
0
        if (ent->macType == type) {
4230
0
            return ent->name;
4231
0
        }
4232
0
    }
4233
0
    return NULL;
4234
0
}
4235
4236
/* Finalize structure for signing
4237
 *
4238
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4239
 * sigret buffer to hold resulting signature
4240
 * siglen length of sigret buffer
4241
 * pkey   key to sign with
4242
 *
4243
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4244
 */
4245
int wolfSSL_EVP_SignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sigret,
4246
                  unsigned int *siglen, WOLFSSL_EVP_PKEY *pkey)
4247
0
{
4248
0
    unsigned int mdsize;
4249
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4250
0
    int ret;
4251
0
    (void)sigret;
4252
0
    (void)siglen;
4253
4254
0
    WOLFSSL_ENTER("EVP_SignFinal");
4255
0
    if (ctx == NULL || sigret == NULL || siglen == NULL || pkey == NULL)
4256
0
        return WOLFSSL_FAILURE;
4257
4258
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4259
0
    if (ret <= 0)
4260
0
        return ret;
4261
4262
0
    switch (pkey->type) {
4263
0
#if !defined(NO_RSA)
4264
0
    case WC_EVP_PKEY_RSA: {
4265
0
        int nid;
4266
0
        const WOLFSSL_EVP_MD *ctxmd;
4267
4268
0
        ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4269
0
        if (ctxmd == NULL)
4270
0
            return WOLFSSL_FAILURE;
4271
4272
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4273
0
        if (nid < 0)
4274
0
            return WOLFSSL_FAILURE;
4275
0
        return wolfSSL_RSA_sign(nid, md, mdsize, sigret,
4276
0
                                siglen, pkey->rsa);
4277
0
    }
4278
0
#endif /* NO_RSA */
4279
#ifndef NO_DSA
4280
    case WC_EVP_PKEY_DSA: {
4281
        int bytes;
4282
        ret = wolfSSL_DSA_do_sign(md, sigret, pkey->dsa);
4283
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
4284
        if (ret != WOLFSSL_SUCCESS)
4285
            return ret;
4286
        bytes = wolfSSL_BN_num_bytes(pkey->dsa->q);
4287
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE) ||
4288
            (int)*siglen < bytes * 2)
4289
        {
4290
            return WOLFSSL_FAILURE;
4291
        }
4292
        *siglen = (unsigned int)(bytes * 2);
4293
        return WOLFSSL_SUCCESS;
4294
    }
4295
#endif
4296
0
#ifdef HAVE_ECC
4297
0
    case WC_EVP_PKEY_EC: {
4298
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_ECDSA_do_sign(md, (int)mdsize,
4299
0
                pkey->ecc);
4300
0
        if (ecdsaSig == NULL)
4301
0
            return WOLFSSL_FAILURE;
4302
        /* get signature length only */
4303
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4304
0
        if (ret <= 0 || ret > (int)*siglen) {
4305
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4306
0
            return WOLFSSL_FAILURE;
4307
0
        }
4308
        /* perform validation of signature */
4309
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sigret);
4310
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4311
0
        if (ret <= 0 || ret > (int)*siglen)
4312
0
            return WOLFSSL_FAILURE;
4313
0
        *siglen = (unsigned int)ret;
4314
0
        return WOLFSSL_SUCCESS;
4315
0
    }
4316
0
#endif
4317
0
    default:
4318
0
        break;
4319
0
    }
4320
0
    return WOLFSSL_FAILURE;
4321
0
}
4322
4323
4324
/* Initialize structure for verifying signature
4325
 *
4326
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4327
 * type is the type of message digest to use
4328
 *
4329
 * returns WOLFSSL_SUCCESS on success
4330
 */
4331
int wolfSSL_EVP_VerifyInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4332
0
{
4333
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4334
0
    WOLFSSL_ENTER("EVP_VerifyInit");
4335
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4336
0
}
4337
4338
4339
/* Update structure for verifying signature
4340
 *
4341
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4342
 * data buffer holding data to update with for verify
4343
 * len  length of data buffer
4344
 *
4345
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4346
 */
4347
int wolfSSL_EVP_VerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4348
0
{
4349
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4350
0
    WOLFSSL_ENTER("EVP_VerifyUpdate");
4351
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4352
0
}
4353
4354
4355
/* Finalize structure for verifying signature
4356
 *
4357
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4358
 * sig    buffer holding signature
4359
 * siglen length of sig buffer
4360
 * pkey   key to verify with
4361
 *
4362
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4363
 */
4364
int wolfSSL_EVP_VerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4365
        const unsigned char*sig, unsigned int siglen, WOLFSSL_EVP_PKEY *pkey)
4366
0
{
4367
0
    int ret;
4368
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4369
0
    unsigned int mdsize;
4370
4371
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4372
0
    WOLFSSL_ENTER("EVP_VerifyFinal");
4373
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4374
0
    if (ret <= 0)
4375
0
        return ret;
4376
4377
0
    (void)sig;
4378
0
    (void)siglen;
4379
4380
0
    switch (pkey->type) {
4381
0
#if !defined(NO_RSA)
4382
0
    case WC_EVP_PKEY_RSA: {
4383
0
        int nid;
4384
0
        const WOLFSSL_EVP_MD *ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4385
0
        if (ctxmd == NULL) break;
4386
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4387
0
        if (nid < 0) break;
4388
0
        return wolfSSL_RSA_verify(nid, md, mdsize, sig,
4389
0
                (unsigned int)siglen, pkey->rsa);
4390
0
    }
4391
0
#endif /* NO_RSA */
4392
0
#ifdef HAVE_ECC
4393
0
    case WC_EVP_PKEY_EC: {
4394
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
4395
0
            NULL, (const unsigned char **)&sig, (long)siglen);
4396
0
        if (ecdsaSig == NULL)
4397
0
            return WOLFSSL_FAILURE;
4398
0
        ret = wolfSSL_ECDSA_do_verify(md, (int)mdsize, ecdsaSig,
4399
0
            pkey->ecc);
4400
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4401
0
        return ret;
4402
0
    }
4403
0
#endif
4404
0
    case WC_EVP_PKEY_DSA:
4405
0
        WOLFSSL_MSG("not implemented");
4406
0
        FALL_THROUGH;
4407
0
    default:
4408
0
        break;
4409
0
    }
4410
0
    return WOLFSSL_FAILURE;
4411
0
}
4412
4413
int wolfSSL_EVP_add_cipher(const WOLFSSL_EVP_CIPHER *cipher)
4414
0
{
4415
    /* nothing to do */
4416
0
    if (cipher == NULL)
4417
0
        return WOLFSSL_FAILURE;
4418
0
    return WOLFSSL_SUCCESS;
4419
0
}
4420
4421
4422
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_mac_key(int type, WOLFSSL_ENGINE* e,
4423
                                          const unsigned char* key, int keylen)
4424
522
{
4425
522
    WOLFSSL_EVP_PKEY* pkey;
4426
4427
522
    (void)e;
4428
4429
522
    if (type != WC_EVP_PKEY_HMAC || (key == NULL && keylen != 0))
4430
0
        return NULL;
4431
4432
522
    pkey = wolfSSL_EVP_PKEY_new();
4433
522
    if (pkey != NULL) {
4434
522
        pkey->pkey.ptr = (char*)XMALLOC((size_t)keylen, NULL,
4435
522
            DYNAMIC_TYPE_PUBLIC_KEY);
4436
522
        if (pkey->pkey.ptr == NULL && keylen > 0) {
4437
0
            wolfSSL_EVP_PKEY_free(pkey);
4438
0
            pkey = NULL;
4439
0
        }
4440
522
        else {
4441
522
            if (keylen) {
4442
350
                XMEMCPY(pkey->pkey.ptr, key, (size_t)keylen);
4443
350
            }
4444
522
            pkey->pkey_sz = keylen;
4445
522
            pkey->type = pkey->save_type = type;
4446
522
        }
4447
522
    }
4448
4449
522
    return pkey;
4450
522
}
4451
4452
4453
#if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT)
4454
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_CMAC_key(WOLFSSL_ENGINE* e,
4455
        const unsigned char* priv, size_t len, const WOLFSSL_EVP_CIPHER *cipher)
4456
0
{
4457
0
    WOLFSSL_EVP_PKEY* pkey;
4458
0
    WOLFSSL_CMAC_CTX* ctx;
4459
0
    int ret = 0;
4460
4461
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_CMAC_key");
4462
4463
0
    if (priv == NULL || len == 0 || cipher == NULL) {
4464
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", BAD_FUNC_ARG);
4465
0
        return NULL;
4466
0
    }
4467
4468
0
    ctx = wolfSSL_CMAC_CTX_new();
4469
0
    if (ctx == NULL) {
4470
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4471
0
        return NULL;
4472
0
    }
4473
4474
0
    ret = wolfSSL_CMAC_Init(ctx, priv, len, cipher, e);
4475
0
    if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4476
0
        wolfSSL_CMAC_CTX_free(ctx);
4477
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4478
0
        return NULL;
4479
0
    }
4480
4481
0
    pkey = wolfSSL_EVP_PKEY_new();
4482
0
    if (pkey != NULL) {
4483
0
        pkey->pkey.ptr = (char*)XMALLOC((size_t)len, NULL,
4484
0
            DYNAMIC_TYPE_PUBLIC_KEY);
4485
0
        if (pkey->pkey.ptr == NULL && len > 0) {
4486
0
            wolfSSL_EVP_PKEY_free(pkey);
4487
0
            pkey = NULL;
4488
0
            wolfSSL_CMAC_CTX_free(ctx);
4489
0
        }
4490
0
        else {
4491
0
            if (len) {
4492
0
                XMEMCPY(pkey->pkey.ptr, priv, (size_t)len);
4493
0
            }
4494
0
            pkey->pkey_sz = (int)len;
4495
0
            pkey->type = pkey->save_type = WC_EVP_PKEY_CMAC;
4496
0
            pkey->cmacCtx = ctx;
4497
0
        }
4498
0
    }
4499
0
    else {
4500
0
        wolfSSL_CMAC_CTX_free(ctx);
4501
0
    }
4502
4503
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4504
0
    return pkey;
4505
0
}
4506
#endif /* defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) */
4507
4508
const unsigned char* wolfSSL_EVP_PKEY_get0_hmac(const WOLFSSL_EVP_PKEY* pkey,
4509
                                                size_t* len)
4510
487
{
4511
487
    if (pkey == NULL || len == NULL)
4512
0
        return NULL;
4513
4514
487
    *len = (size_t)pkey->pkey_sz;
4515
4516
487
    return (const unsigned char*)pkey->pkey.ptr;
4517
487
}
4518
4519
static int wolfssl_evp_md_to_hash_type(const WOLFSSL_EVP_MD *type,
4520
    int* hashType)
4521
628
{
4522
628
    int ret = 0;
4523
4524
628
#ifndef NO_SHA256
4525
628
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
4526
67
        *hashType = WC_SHA256;
4527
67
    }
4528
561
    else
4529
561
#endif
4530
561
#ifndef NO_SHA
4531
561
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
4532
100
        *hashType = WC_SHA;
4533
100
    }
4534
461
    else
4535
461
#endif /* NO_SHA */
4536
461
#ifdef WOLFSSL_SHA224
4537
461
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
4538
156
        *hashType = WC_SHA224;
4539
156
    }
4540
305
    else
4541
305
#endif
4542
305
#ifdef WOLFSSL_SHA384
4543
305
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
4544
74
        *hashType = WC_SHA384;
4545
74
    }
4546
231
    else
4547
231
#endif
4548
231
#ifdef WOLFSSL_SHA512
4549
231
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
4550
114
        *hashType = WC_SHA512;
4551
114
    }
4552
117
    else
4553
117
#endif
4554
117
#ifdef WOLFSSL_SHA3
4555
117
    #ifndef WOLFSSL_NOSHA3_224
4556
117
        if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
4557
0
            *hashType = WC_SHA3_224;
4558
0
        }
4559
117
        else
4560
117
    #endif
4561
117
    #ifndef WOLFSSL_NOSHA3_256
4562
117
        if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
4563
0
            *hashType = WC_SHA3_256;
4564
0
        }
4565
117
        else
4566
117
    #endif
4567
117
    #ifndef WOLFSSL_NOSHA3_384
4568
117
        if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
4569
0
            *hashType = WC_SHA3_384;
4570
0
        }
4571
117
        else
4572
117
    #endif
4573
117
    #ifndef WOLFSSL_NOSHA3_512
4574
117
        if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
4575
0
            *hashType = WC_SHA3_512;
4576
0
        }
4577
117
        else
4578
117
    #endif
4579
117
#endif
4580
117
#ifdef WOLFSSL_SM3
4581
117
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
4582
0
        *hashType = WC_SM3;
4583
0
    }
4584
117
    else
4585
117
#endif
4586
117
#ifndef NO_MD5
4587
117
    if (XSTRCMP(type, WC_SN_md5) == 0) {
4588
72
        *hashType = WC_MD5;
4589
72
    }
4590
45
    else
4591
45
#endif
4592
45
    {
4593
45
        ret = BAD_FUNC_ARG;
4594
45
    }
4595
4596
628
    return ret;
4597
628
}
4598
4599
/* Initialize an EVP_DigestSign/Verify operation.
4600
 * Initialize a digest for RSA and ECC keys, or HMAC for HMAC key.
4601
 */
4602
static int wolfSSL_evp_digest_pk_init(WOLFSSL_EVP_MD_CTX *ctx,
4603
                                      WOLFSSL_EVP_PKEY_CTX **pctx,
4604
                                      const WOLFSSL_EVP_MD *type,
4605
                                      WOLFSSL_ENGINE *e,
4606
                                      WOLFSSL_EVP_PKEY *pkey)
4607
522
{
4608
522
    if (!type) {
4609
0
        int default_digest;
4610
0
        if (wolfSSL_EVP_PKEY_get_default_digest_nid(pkey, &default_digest)
4611
0
                != WOLFSSL_SUCCESS) {
4612
0
            WOLFSSL_MSG("Could not get default digest");
4613
0
            return WOLFSSL_FAILURE;
4614
0
        }
4615
0
        type = wolfSSL_EVP_get_digestbynid(default_digest);
4616
0
        if (type == NULL) {
4617
0
            return WOLFSSL_FAILURE;
4618
0
        }
4619
0
    }
4620
4621
522
    if (pkey->type == WC_EVP_PKEY_HMAC) {
4622
522
        int hashType;
4623
522
        int ret;
4624
522
        size_t keySz = 0;
4625
522
        const unsigned char* key;
4626
4627
522
        ret = wolfssl_evp_md_to_hash_type(type, &hashType);
4628
522
        if (ret != 0) {
4629
35
             return ret;
4630
35
        }
4631
4632
487
        key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz);
4633
487
        if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0)
4634
0
            return WOLFSSL_FAILURE;
4635
4636
487
        if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0)
4637
0
            return WOLFSSL_FAILURE;
4638
4639
487
        ctx->isHMAC = 1;
4640
487
    }
4641
0
    else if (wolfSSL_EVP_DigestInit(ctx, type) != 1)
4642
0
            return WOLFSSL_FAILURE;
4643
4644
487
    if (ctx->pctx == NULL) {
4645
487
        ctx->pctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
4646
487
        if (ctx->pctx == NULL)
4647
0
            return WOLFSSL_FAILURE;
4648
487
    }
4649
487
    if (pctx != NULL)
4650
0
        *pctx = ctx->pctx;
4651
487
    return WOLFSSL_SUCCESS;
4652
487
}
4653
4654
/* Update an EVP_DigestSign/Verify operation.
4655
 * Update a digest for RSA and ECC keys, or HMAC for HMAC key.
4656
 */
4657
static int wolfssl_evp_digest_pk_update(WOLFSSL_EVP_MD_CTX *ctx,
4658
                                        const void *d, unsigned int cnt)
4659
5.26k
{
4660
5.26k
    if (ctx->isHMAC) {
4661
5.26k
        if (wc_HmacUpdate(&ctx->hash.hmac, (const byte *)d, cnt) != 0)
4662
0
            return WOLFSSL_FAILURE;
4663
4664
5.26k
        return WOLFSSL_SUCCESS;
4665
5.26k
    }
4666
0
    else
4667
0
        return wolfSSL_EVP_DigestUpdate(ctx, d, cnt);
4668
5.26k
}
4669
4670
/* Finalize an EVP_DigestSign/Verify operation - common part only.
4671
 * Finalize a digest for RSA and ECC keys, or HMAC for HMAC key.
4672
 * Copies the digest so that you can keep updating.
4673
 */
4674
static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx,
4675
                                       unsigned char *md, unsigned int* mdlen)
4676
303
{
4677
303
    int  ret;
4678
4679
303
    if (ctx->isHMAC) {
4680
303
#ifdef WOLFSSL_SMALL_STACK
4681
303
        Hmac *hmacCopy = (Hmac *)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_OPENSSL);
4682
303
        if (hmacCopy == NULL)
4683
0
            return WOLFSSL_FAILURE;
4684
#else
4685
        Hmac hmacCopy[1];
4686
#endif
4687
303
        ret = wolfSSL_HmacCopy(hmacCopy, &ctx->hash.hmac);
4688
303
        if (ret == WOLFSSL_SUCCESS)
4689
303
            ret = wc_HmacFinal(hmacCopy, md) == 0;
4690
303
        wc_HmacFree(hmacCopy);
4691
303
        WC_FREE_VAR_EX(hmacCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4692
303
        return ret;
4693
303
    }
4694
0
    else {
4695
0
#ifdef WOLFSSL_SMALL_STACK
4696
0
        WOLFSSL_EVP_MD_CTX *ctxCopy = (WOLFSSL_EVP_MD_CTX *)XMALLOC(sizeof(WOLFSSL_EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
4697
0
        if (ctxCopy == NULL)
4698
0
            return WOLFSSL_FAILURE;
4699
#else
4700
        WOLFSSL_EVP_MD_CTX ctxCopy[1];
4701
#endif
4702
0
        wolfSSL_EVP_MD_CTX_init(ctxCopy);
4703
4704
0
        ret = wolfSSL_EVP_MD_CTX_copy_ex(ctxCopy, ctx);
4705
0
        if (ret == WOLFSSL_SUCCESS)
4706
0
            ret = wolfSSL_EVP_DigestFinal(ctxCopy, md, mdlen);
4707
0
        wolfSSL_EVP_MD_CTX_cleanup(ctxCopy);
4708
0
        WC_FREE_VAR_EX(ctxCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4709
0
        return ret;
4710
0
    }
4711
303
}
4712
4713
/* Get the length of the mac based on the digest algorithm. */
4714
static unsigned int wolfssl_mac_len(unsigned char macType)
4715
399
{
4716
399
    unsigned int hashLen;
4717
4718
399
    switch (macType) {
4719
0
    #ifndef NO_MD5
4720
38
        case WC_MD5:
4721
38
            hashLen = WC_MD5_DIGEST_SIZE;
4722
38
            break;
4723
0
    #endif /* !NO_MD5 */
4724
4725
0
    #ifndef NO_SHA
4726
94
        case WC_SHA:
4727
94
            hashLen = WC_SHA_DIGEST_SIZE;
4728
94
            break;
4729
0
    #endif /* !NO_SHA */
4730
4731
0
    #ifdef WOLFSSL_SHA224
4732
70
        case WC_SHA224:
4733
70
            hashLen = WC_SHA224_DIGEST_SIZE;
4734
70
            break;
4735
0
    #endif /* WOLFSSL_SHA224 */
4736
4737
0
    #ifndef NO_SHA256
4738
67
        case WC_SHA256:
4739
67
            hashLen = WC_SHA256_DIGEST_SIZE;
4740
67
            break;
4741
0
    #endif /* !NO_SHA256 */
4742
4743
0
    #ifdef WOLFSSL_SHA384
4744
18
        case WC_SHA384:
4745
18
            hashLen = WC_SHA384_DIGEST_SIZE;
4746
18
            break;
4747
0
    #endif /* WOLFSSL_SHA384 */
4748
0
    #ifdef WOLFSSL_SHA512
4749
112
        case WC_SHA512:
4750
112
            hashLen = WC_SHA512_DIGEST_SIZE;
4751
112
            break;
4752
0
    #endif /* WOLFSSL_SHA512 */
4753
4754
0
    #ifdef HAVE_BLAKE2
4755
0
        case BLAKE2B_ID:
4756
0
            hashLen = BLAKE2B_OUTBYTES;
4757
0
            break;
4758
0
    #endif /* HAVE_BLAKE2 */
4759
4760
0
    #ifdef WOLFSSL_SHA3
4761
0
        #ifndef WOLFSSL_NOSHA3_224
4762
0
        case WC_SHA3_224:
4763
0
            hashLen = WC_SHA3_224_DIGEST_SIZE;
4764
0
            break;
4765
0
        #endif
4766
0
        #ifndef WOLFSSL_NOSHA3_256
4767
0
        case WC_SHA3_256:
4768
0
            hashLen = WC_SHA3_256_DIGEST_SIZE;
4769
0
            break;
4770
0
        #endif
4771
0
        #ifndef WOLFSSL_NOSHA3_384
4772
0
        case WC_SHA3_384:
4773
0
            hashLen = WC_SHA3_384_DIGEST_SIZE;
4774
0
            break;
4775
0
        #endif
4776
0
        #ifndef WOLFSSL_NOSHA3_512
4777
0
        case WC_SHA3_512:
4778
0
            hashLen = WC_SHA3_512_DIGEST_SIZE;
4779
0
            break;
4780
0
        #endif
4781
0
    #endif
4782
4783
0
    #ifdef WOLFSSL_SM3
4784
0
        case WC_SM3:
4785
0
            hashLen = WC_SM3_DIGEST_SIZE;
4786
0
            break;
4787
0
    #endif /* WOLFSSL_SM3 */
4788
4789
0
        default:
4790
0
            hashLen = 0;
4791
399
    }
4792
4793
399
    return hashLen;
4794
399
}
4795
4796
int wolfSSL_EVP_DigestSignInit(WOLFSSL_EVP_MD_CTX *ctx,
4797
                               WOLFSSL_EVP_PKEY_CTX **pctx,
4798
                               const WOLFSSL_EVP_MD *type,
4799
                               WOLFSSL_ENGINE *e,
4800
                               WOLFSSL_EVP_PKEY *pkey)
4801
522
{
4802
522
    WOLFSSL_ENTER("EVP_DigestSignInit");
4803
4804
522
    if (ctx == NULL || pkey == NULL)
4805
0
        return WOLFSSL_FAILURE;
4806
4807
522
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4808
522
}
4809
4810
4811
int wolfSSL_EVP_DigestSignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4812
                                 unsigned int cnt)
4813
5.44k
{
4814
5.44k
    WOLFSSL_ENTER("EVP_DigestSignUpdate");
4815
4816
5.44k
    if (ctx == NULL || d == NULL)
4817
184
        return WOLFSSL_FAILURE;
4818
4819
5.26k
    return wolfssl_evp_digest_pk_update(ctx, d, cnt);
4820
5.44k
}
4821
4822
int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig,
4823
                                size_t *siglen)
4824
303
{
4825
303
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4826
303
    unsigned int  hashLen;
4827
303
    int           ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
4828
4829
303
    WOLFSSL_ENTER("EVP_DigestSignFinal");
4830
4831
303
    if (ctx == NULL || siglen == NULL)
4832
0
        return WOLFSSL_FAILURE;
4833
4834
    /* Return the maximum size of the signature when sig is NULL. */
4835
303
    if (ctx->isHMAC) {
4836
303
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4837
4838
303
        if (sig == NULL) {
4839
0
            *siglen = hashLen;
4840
0
            return WOLFSSL_SUCCESS;
4841
0
        }
4842
303
    }
4843
0
#ifndef NO_RSA
4844
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_RSA) {
4845
0
        if (sig == NULL) {
4846
0
            *siglen = (size_t)wolfSSL_RSA_size(ctx->pctx->pkey->rsa);
4847
0
            return WOLFSSL_SUCCESS;
4848
0
        }
4849
0
    }
4850
0
#endif /* !NO_RSA */
4851
0
#ifdef HAVE_ECC
4852
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_EC) {
4853
0
        if (sig == NULL) {
4854
            /* SEQ + INT + INT */
4855
0
            *siglen = (size_t)ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx].
4856
0
                size * 2 + 8;
4857
0
            return WOLFSSL_SUCCESS;
4858
0
        }
4859
0
    }
4860
303
#endif
4861
4862
303
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4863
0
        return WOLFSSL_FAILURE;
4864
4865
303
    if (ctx->isHMAC) {
4866
        /* Copy the HMAC result as signature. */
4867
303
        if ((unsigned int)(*siglen) > hashLen)
4868
303
            *siglen = hashLen;
4869
        /* May be a truncated signature. */
4870
4871
303
        XMEMCPY(sig, digest, (size_t)*siglen);
4872
303
        ret = WOLFSSL_SUCCESS;
4873
303
    }
4874
0
    else {
4875
        /* Sign the digest. */
4876
0
        switch (ctx->pctx->pkey->type) {
4877
0
    #if !defined(NO_RSA)
4878
0
        case WC_EVP_PKEY_RSA: {
4879
0
            unsigned int sigSz = (unsigned int)*siglen;
4880
0
            int nid;
4881
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4882
0
            if (md == NULL)
4883
0
                break;
4884
0
            nid = wolfSSL_EVP_MD_type(md);
4885
0
            if (nid < 0)
4886
0
                break;
4887
0
            ret = wolfSSL_RSA_sign_generic_padding(nid, digest, hashLen,
4888
0
                    sig, &sigSz, ctx->pctx->pkey->rsa, 1, ctx->pctx->padding);
4889
0
            if (ret >= 0)
4890
0
                *siglen = sigSz;
4891
0
            break;
4892
0
        }
4893
0
    #endif /* NO_RSA */
4894
4895
0
    #ifdef HAVE_ECC
4896
0
        case WC_EVP_PKEY_EC: {
4897
0
            int len;
4898
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
4899
0
            ecdsaSig = wolfSSL_ECDSA_do_sign(digest, (int)hashLen,
4900
0
                                             ctx->pctx->pkey->ecc);
4901
0
            if (ecdsaSig == NULL)
4902
0
                break;
4903
0
            len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4904
0
            if (len > 0 && (size_t)len <= *siglen)
4905
0
                len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
4906
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4907
0
            if (len == 0)
4908
0
                break;
4909
0
            *siglen = (size_t)len;
4910
0
            ret = WOLFSSL_SUCCESS;
4911
0
            break;
4912
0
        }
4913
0
    #endif
4914
0
        default:
4915
0
            break;
4916
0
        }
4917
0
    }
4918
4919
303
    ForceZero(digest, sizeof(digest));
4920
303
    return ret;
4921
303
}
4922
4923
int wolfSSL_EVP_DigestVerifyInit(WOLFSSL_EVP_MD_CTX *ctx,
4924
                                 WOLFSSL_EVP_PKEY_CTX **pctx,
4925
                                 const WOLFSSL_EVP_MD *type,
4926
                                 WOLFSSL_ENGINE *e,
4927
                                 WOLFSSL_EVP_PKEY *pkey)
4928
0
{
4929
0
    WOLFSSL_ENTER("EVP_DigestVerifyInit");
4930
4931
0
    if (ctx == NULL || type == NULL || pkey == NULL)
4932
0
        return WOLFSSL_FAILURE;
4933
4934
0
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4935
0
}
4936
4937
4938
int wolfSSL_EVP_DigestVerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4939
                                   size_t cnt)
4940
0
{
4941
0
    WOLFSSL_ENTER("EVP_DigestVerifyUpdate");
4942
4943
0
    if (ctx == NULL || d == NULL)
4944
0
        return WOLFSSL_FAILURE;
4945
4946
0
    return wolfssl_evp_digest_pk_update(ctx, d, (unsigned int)cnt);
4947
0
}
4948
4949
4950
int wolfSSL_EVP_DigestVerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4951
                                  const unsigned char *sig, size_t siglen)
4952
0
{
4953
0
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4954
0
    unsigned int  hashLen;
4955
4956
0
    WOLFSSL_ENTER("EVP_DigestVerifyFinal");
4957
4958
0
    if (ctx == NULL || sig == NULL)
4959
0
        return WOLFSSL_FAILURE;
4960
4961
0
    if (ctx->isHMAC) {
4962
4963
0
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4964
4965
0
        if (siglen > hashLen || siglen > INT_MAX)
4966
0
            return WOLFSSL_FAILURE;
4967
        /* May be a truncated signature. */
4968
0
    }
4969
4970
0
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4971
0
        return WOLFSSL_FAILURE;
4972
4973
0
    if (ctx->isHMAC) {
4974
        /* Check HMAC result matches the signature. */
4975
0
        if (ConstantCompare(sig, digest, (int)siglen) == 0)
4976
0
            return WOLFSSL_SUCCESS;
4977
0
        return WOLFSSL_FAILURE;
4978
0
    }
4979
0
    else {
4980
        /* Verify the signature with the digest. */
4981
0
        switch (ctx->pctx->pkey->type) {
4982
0
    #if !defined(NO_RSA)
4983
0
        case WC_EVP_PKEY_RSA: {
4984
0
            int nid;
4985
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4986
0
            if (md == NULL)
4987
0
                return WOLFSSL_FAILURE;
4988
0
            nid = wolfSSL_EVP_MD_type(md);
4989
0
            if (nid < 0)
4990
0
                return WOLFSSL_FAILURE;
4991
0
            return wolfSSL_RSA_verify_ex(nid, digest, hashLen, sig,
4992
0
                                      (unsigned int)siglen,
4993
0
                                      ctx->pctx->pkey->rsa, ctx->pctx->padding);
4994
0
        }
4995
0
    #endif /* NO_RSA */
4996
4997
0
    #ifdef HAVE_ECC
4998
0
        case WC_EVP_PKEY_EC: {
4999
0
            int ret;
5000
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
5001
0
            ecdsaSig = wolfSSL_d2i_ECDSA_SIG(NULL, &sig, (long)siglen);
5002
0
            if (ecdsaSig == NULL)
5003
0
                return WOLFSSL_FAILURE;
5004
0
            ret = wolfSSL_ECDSA_do_verify(digest, (int)hashLen, ecdsaSig,
5005
0
                                          ctx->pctx->pkey->ecc);
5006
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
5007
0
            return ret;
5008
0
        }
5009
0
    #endif
5010
0
        default:
5011
0
            break;
5012
0
        }
5013
0
    }
5014
5015
0
    return WOLFSSL_FAILURE;
5016
0
}
5017
5018
5019
#ifdef WOLFSSL_APACHE_HTTPD
5020
#if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32)
5021
    #include <termios.h>
5022
#endif
5023
5024
#ifndef XGETPASSWD
5025
    static int XGETPASSWD(char* buf, int bufSz) {
5026
        int ret = WOLFSSL_SUCCESS;
5027
5028
        /* turn off echo for passwords */
5029
    #ifdef USE_WINDOWS_API
5030
        DWORD originalTerm;
5031
        DWORD newTerm;
5032
        CONSOLE_SCREEN_BUFFER_INFO screenOrig;
5033
        HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
5034
        if (GetConsoleMode(stdinHandle, &originalTerm) == 0) {
5035
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5036
            return WOLFSSL_FAILURE;
5037
        }
5038
        newTerm = originalTerm;
5039
        newTerm &= ~ENABLE_ECHO_INPUT;
5040
        if (SetConsoleMode(stdinHandle, newTerm) == 0) {
5041
            WOLFSSL_MSG("Couldn't turn off echo");
5042
            return WOLFSSL_FAILURE;
5043
        }
5044
    #else
5045
        struct termios originalTerm;
5046
        struct termios newTerm;
5047
        if (tcgetattr(STDIN_FILENO, &originalTerm) != 0) {
5048
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5049
            return WOLFSSL_FAILURE;
5050
        }
5051
        XMEMCPY(&newTerm, &originalTerm, sizeof(struct termios));
5052
5053
        newTerm.c_lflag &= ~ECHO;
5054
        newTerm.c_lflag |= (ICANON | ECHONL);
5055
        if (tcsetattr(STDIN_FILENO, TCSANOW, &newTerm) != 0) {
5056
            WOLFSSL_MSG("Couldn't turn off echo");
5057
            return WOLFSSL_FAILURE;
5058
        }
5059
    #endif
5060
5061
        if (XFGETS(buf, bufSz, stdin) == NULL) {
5062
            ret = WOLFSSL_FAILURE;
5063
        }
5064
5065
        /* restore default echo */
5066
    #ifdef USE_WINDOWS_API
5067
        if (SetConsoleMode(stdinHandle, originalTerm) == 0) {
5068
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5069
            return WOLFSSL_FAILURE;
5070
        }
5071
    #else
5072
        if (tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm) != 0) {
5073
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5074
            return WOLFSSL_FAILURE;
5075
        }
5076
    #endif
5077
        return ret;
5078
    }
5079
#endif
5080
5081
/* returns 0 on success and -2 or -1 on failure */
5082
int wolfSSL_EVP_read_pw_string(char* buf, int bufSz, const char* banner, int v)
5083
{
5084
    printf("%s", banner);
5085
    if (XGETPASSWD(buf, bufSz) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
5086
        return -1;
5087
    }
5088
    (void)v; /* fgets always sanity checks size of input vs buffer */
5089
    return 0;
5090
}
5091
#endif /* WOLFSSL_APACHE_HTTPD */
5092
5093
#if !defined(NO_PWDBASED) && !defined(NO_SHA) && !defined(NO_HMAC)
5094
int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
5095
                                               const unsigned char *salt,
5096
                                               int saltlen, int iter,
5097
                                               int keylen, unsigned char *out)
5098
0
{
5099
0
    const char *nostring = "";
5100
0
    int ret = 0;
5101
5102
0
    if (pass == NULL) {
5103
0
        passlen = 0;
5104
0
        pass = nostring;
5105
0
    }
5106
0
    else if (passlen == -1) {
5107
0
        passlen = (int)XSTRLEN(pass);
5108
0
    }
5109
5110
0
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5111
0
                    iter, keylen, WC_SHA);
5112
0
    if (ret == 0)
5113
0
        return WOLFSSL_SUCCESS;
5114
0
    else
5115
0
        return WOLFSSL_FAILURE;
5116
0
}
5117
#endif /* !NO_PWDBASED !NO_SHA*/
5118
5119
#if !defined(NO_PWDBASED) && !defined(NO_HMAC)
5120
int wolfSSL_PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
5121
                                           const unsigned char *salt,
5122
                                           int saltlen, int iter,
5123
                                           const WOLFSSL_EVP_MD *digest,
5124
                                           int keylen, unsigned char *out)
5125
484
{
5126
484
    const char *nostring = "";
5127
484
    int ret = 0;
5128
484
    enum wc_HashType pbkdf2HashType;
5129
5130
484
    if (pass == NULL) {
5131
260
        passlen = 0;
5132
260
        pass = nostring;
5133
260
    } else if (passlen == -1) {
5134
0
        passlen = (int)XSTRLEN(pass);
5135
0
    }
5136
5137
484
    pbkdf2HashType = EvpMd2MacType(digest);
5138
5139
484
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5140
484
                    iter, keylen, pbkdf2HashType);
5141
484
    if (ret == 0)
5142
413
        return WOLFSSL_SUCCESS;
5143
71
    else
5144
71
        return WOLFSSL_FAILURE;
5145
484
}
5146
#endif /* !NO_PWDBASED */
5147
5148
5149
#if defined(HAVE_SCRYPT) && defined(HAVE_PBKDF2) && !defined(NO_PWDBASED) && \
5150
                                                    !defined(NO_SHA256)
5151
/**
5152
 * Derives a key from the specified password and the salt using SCRYPT
5153
 * algorithm.
5154
 *
5155
 * Parameters:
5156
 * - pass      :password data. no need to be null-terminated. NULL is accepted.
5157
 * - passlen   :length of the password. Must be 0 when pass is NULL.
5158
 * - salt      :salt. NULL is accepted.
5159
 * - saltlen   :length of the salt. Must be 0 when salt is NULL.
5160
 * - N         :cost parameter. Must be grater or equal to 2 and be a power of 2.
5161
 * - r         :block size. Must 1 or greater.
5162
 * - p         :parallelism
5163
 * - maxmem    :maximum size of buffer used for calculation in definition,
5164
 *              Not referred in this implementation.
5165
 * - key       :derived key.
5166
 * - keylen    :length of the derived key
5167
 *
5168
 * Returns:
5169
 *   1 on success, otherwise 0.
5170
 */
5171
int wolfSSL_EVP_PBE_scrypt(const char *pass, size_t passlen,
5172
                            const unsigned char *salt, size_t saltlen,
5173
                            word64 N, word64 r, word64 p,
5174
                            word64 maxmem, unsigned char *key, size_t keylen)
5175
0
{
5176
0
    int ret;
5177
0
    int exp = 0;
5178
5179
0
    (void)maxmem;
5180
5181
0
    WOLFSSL_ENTER("wolfSSL_EVP_PBE_scrypt");
5182
5183
0
    if (r > INT32_MAX || p > INT32_MAX) {
5184
0
        WOLFSSL_MSG("Doesn't support greater than 32 bit values of r and p");
5185
0
        return WOLFSSL_FAILURE;
5186
0
    }
5187
    /* N must be a power of 2 and > 2.
5188
       if (N & (N-1)) is zero, it means N is a power of 2.
5189
     */
5190
0
    if (N < 2 || (N & (N-1)) || r <= 0 || p <= 0)
5191
0
        return WOLFSSL_FAILURE;
5192
5193
0
    if (key == NULL)
5194
0
        return WOLFSSL_SUCCESS;
5195
5196
    /* get exponent of power of 2. Confirmed N is power of 2. */
5197
0
    while (N != 1) {
5198
0
        N >>= 1;
5199
0
        exp++;
5200
0
    }
5201
5202
0
    ret = wc_scrypt(key, (const byte*)pass, (int)passlen, salt, (int)saltlen,
5203
0
                                            exp, (int)r, (int)p, (int)keylen);
5204
5205
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PBE_scrypt", ret);
5206
5207
0
    if (ret == 0)
5208
0
        return WOLFSSL_SUCCESS;
5209
0
    else
5210
0
        return WOLFSSL_FAILURE;
5211
0
}
5212
#endif /* HAVE_SCRYPT && HAVE_PBKDF2 && !NO_PWDBASED && !NO_SHA */
5213
5214
static const struct cipher{
5215
        unsigned char type;
5216
        const char *name;
5217
        int nid;
5218
} cipher_tbl[] = {
5219
5220
#ifndef NO_AES
5221
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5222
    #ifdef WOLFSSL_AES_128
5223
    {WC_AES_128_CBC_TYPE, EVP_AES_128_CBC, WC_NID_aes_128_cbc},
5224
    #endif
5225
    #ifdef WOLFSSL_AES_192
5226
    {WC_AES_192_CBC_TYPE, EVP_AES_192_CBC, WC_NID_aes_192_cbc},
5227
    #endif
5228
    #ifdef WOLFSSL_AES_256
5229
    {WC_AES_256_CBC_TYPE, EVP_AES_256_CBC, WC_NID_aes_256_cbc},
5230
    #endif
5231
    #endif
5232
5233
    #ifdef WOLFSSL_AES_CFB
5234
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5235
    #ifdef WOLFSSL_AES_128
5236
    {WC_AES_128_CFB1_TYPE, EVP_AES_128_CFB1, WC_NID_aes_128_cfb1},
5237
    #endif
5238
    #ifdef WOLFSSL_AES_192
5239
    {WC_AES_192_CFB1_TYPE, EVP_AES_192_CFB1, WC_NID_aes_192_cfb1},
5240
    #endif
5241
    #ifdef WOLFSSL_AES_256
5242
    {WC_AES_256_CFB1_TYPE, EVP_AES_256_CFB1, WC_NID_aes_256_cfb1},
5243
    #endif
5244
5245
    #ifdef WOLFSSL_AES_128
5246
    {WC_AES_128_CFB8_TYPE, EVP_AES_128_CFB8, WC_NID_aes_128_cfb8},
5247
    #endif
5248
    #ifdef WOLFSSL_AES_192
5249
    {WC_AES_192_CFB8_TYPE, EVP_AES_192_CFB8, WC_NID_aes_192_cfb8},
5250
    #endif
5251
    #ifdef WOLFSSL_AES_256
5252
    {WC_AES_256_CFB8_TYPE, EVP_AES_256_CFB8, WC_NID_aes_256_cfb8},
5253
    #endif
5254
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5255
5256
    #ifdef WOLFSSL_AES_128
5257
    {WC_AES_128_CFB128_TYPE, EVP_AES_128_CFB128, WC_NID_aes_128_cfb128},
5258
    #endif
5259
    #ifdef WOLFSSL_AES_192
5260
    {WC_AES_192_CFB128_TYPE, EVP_AES_192_CFB128, WC_NID_aes_192_cfb128},
5261
    #endif
5262
    #ifdef WOLFSSL_AES_256
5263
    {WC_AES_256_CFB128_TYPE, EVP_AES_256_CFB128, WC_NID_aes_256_cfb128},
5264
    #endif
5265
    #endif /* WOLFSSL_AES_CFB */
5266
5267
    #ifdef WOLFSSL_AES_OFB
5268
    #ifdef WOLFSSL_AES_128
5269
    {WC_AES_128_OFB_TYPE, EVP_AES_128_OFB, WC_NID_aes_128_ofb},
5270
    #endif
5271
    #ifdef WOLFSSL_AES_192
5272
    {WC_AES_192_OFB_TYPE, EVP_AES_192_OFB, WC_NID_aes_192_ofb},
5273
    #endif
5274
    #ifdef WOLFSSL_AES_256
5275
    {WC_AES_256_OFB_TYPE, EVP_AES_256_OFB, WC_NID_aes_256_ofb},
5276
    #endif
5277
    #endif
5278
5279
    #if defined(WOLFSSL_AES_XTS) && \
5280
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
5281
    #ifdef WOLFSSL_AES_128
5282
    {WC_AES_128_XTS_TYPE, EVP_AES_128_XTS, WC_NID_aes_128_xts},
5283
    #endif
5284
    #ifdef WOLFSSL_AES_256
5285
    {WC_AES_256_XTS_TYPE, EVP_AES_256_XTS, WC_NID_aes_256_xts},
5286
    #endif
5287
    #endif
5288
5289
    #ifdef HAVE_AESGCM
5290
    #ifdef WOLFSSL_AES_128
5291
    {WC_AES_128_GCM_TYPE, EVP_AES_128_GCM, WC_NID_aes_128_gcm},
5292
    #endif
5293
    #ifdef WOLFSSL_AES_192
5294
    {WC_AES_192_GCM_TYPE, EVP_AES_192_GCM, WC_NID_aes_192_gcm},
5295
    #endif
5296
    #ifdef WOLFSSL_AES_256
5297
    {WC_AES_256_GCM_TYPE, EVP_AES_256_GCM, WC_NID_aes_256_gcm},
5298
    #endif
5299
    #endif
5300
5301
    #ifdef HAVE_AESCCM
5302
    #ifdef WOLFSSL_AES_128
5303
    {WC_AES_128_CCM_TYPE, EVP_AES_128_CCM, WC_NID_aes_128_ccm},
5304
    #endif
5305
    #ifdef WOLFSSL_AES_192
5306
    {WC_AES_192_CCM_TYPE, EVP_AES_192_CCM, WC_NID_aes_192_ccm},
5307
    #endif
5308
    #ifdef WOLFSSL_AES_256
5309
    {WC_AES_256_CCM_TYPE, EVP_AES_256_CCM, WC_NID_aes_256_ccm},
5310
    #endif
5311
    #endif
5312
5313
    #ifdef WOLFSSL_AES_COUNTER
5314
    #ifdef WOLFSSL_AES_128
5315
        {WC_AES_128_CTR_TYPE, EVP_AES_128_CTR, WC_NID_aes_128_ctr},
5316
    #endif
5317
    #ifdef WOLFSSL_AES_192
5318
        {WC_AES_192_CTR_TYPE, EVP_AES_192_CTR, WC_NID_aes_192_ctr},
5319
    #endif
5320
    #ifdef WOLFSSL_AES_256
5321
        {WC_AES_256_CTR_TYPE, EVP_AES_256_CTR, WC_NID_aes_256_ctr},
5322
    #endif
5323
    #endif
5324
5325
    #ifdef HAVE_AES_ECB
5326
    #ifdef WOLFSSL_AES_128
5327
        {WC_AES_128_ECB_TYPE, EVP_AES_128_ECB, WC_NID_aes_128_ecb},
5328
    #endif
5329
    #ifdef WOLFSSL_AES_192
5330
        {WC_AES_192_ECB_TYPE, EVP_AES_192_ECB, WC_NID_aes_192_ecb},
5331
    #endif
5332
    #ifdef WOLFSSL_AES_256
5333
        {WC_AES_256_ECB_TYPE, EVP_AES_256_ECB, WC_NID_aes_256_ecb},
5334
    #endif
5335
    #endif
5336
#endif
5337
5338
#ifdef HAVE_ARIA
5339
    {WC_ARIA_128_GCM_TYPE, EVP_ARIA_128_GCM, WC_NID_aria_128_gcm},
5340
    {WC_ARIA_192_GCM_TYPE, EVP_ARIA_192_GCM, WC_NID_aria_192_gcm},
5341
    {WC_ARIA_256_GCM_TYPE, EVP_ARIA_256_GCM, WC_NID_aria_256_gcm},
5342
#endif
5343
5344
#ifndef NO_DES3
5345
    {WC_DES_CBC_TYPE, EVP_DES_CBC, WC_NID_des_cbc},
5346
    {WC_DES_ECB_TYPE, EVP_DES_ECB, WC_NID_des_ecb},
5347
5348
    {WC_DES_EDE3_CBC_TYPE, EVP_DES_EDE3_CBC, WC_NID_des_ede3_cbc},
5349
    {WC_DES_EDE3_ECB_TYPE, EVP_DES_EDE3_ECB, WC_NID_des_ede3_ecb},
5350
#endif
5351
5352
#ifndef NO_RC4
5353
    {WC_ARC4_TYPE, EVP_ARC4, WC_NID_undef},
5354
#endif
5355
5356
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5357
    {WC_CHACHA20_POLY1305_TYPE, EVP_CHACHA20_POLY1305, WC_NID_chacha20_poly1305},
5358
#endif
5359
5360
#ifdef HAVE_CHACHA
5361
    {WC_CHACHA20_TYPE, EVP_CHACHA20, WC_NID_chacha20},
5362
#endif
5363
5364
#ifdef WOLFSSL_SM4_ECB
5365
    {WC_SM4_ECB_TYPE, EVP_SM4_ECB, WC_NID_sm4_ecb},
5366
#endif
5367
#ifdef WOLFSSL_SM4_CBC
5368
    {WC_SM4_CBC_TYPE, EVP_SM4_CBC, WC_NID_sm4_cbc},
5369
#endif
5370
#ifdef WOLFSSL_SM4_CTR
5371
    {WC_SM4_CTR_TYPE, EVP_SM4_CTR, WC_NID_sm4_ctr},
5372
#endif
5373
#ifdef WOLFSSL_SM4_GCM
5374
    {WC_SM4_GCM_TYPE, EVP_SM4_GCM, WC_NID_sm4_gcm},
5375
#endif
5376
#ifdef WOLFSSL_SM4_CCM
5377
    {WC_SM4_CCM_TYPE, EVP_SM4_CCM, WC_NID_sm4_ccm},
5378
#endif
5379
5380
    { 0, NULL, 0}
5381
};
5382
5383
/* returns cipher using provided ctx type */
5384
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_CIPHER_CTX_cipher(
5385
    const WOLFSSL_EVP_CIPHER_CTX *ctx)
5386
0
{
5387
0
    const struct cipher* c;
5388
5389
0
    if (!ctx || !ctx->cipherType) {
5390
0
        return NULL;
5391
0
    }
5392
5393
0
    for (c = cipher_tbl; c->type != 0; c++) {
5394
0
        if (ctx->cipherType == c->type) {
5395
0
            return wolfSSL_EVP_get_cipherbyname(c->name);
5396
0
        }
5397
0
    }
5398
5399
0
    return NULL;
5400
0
}
5401
5402
int wolfSSL_EVP_CIPHER_nid(const WOLFSSL_EVP_CIPHER *cipher)
5403
0
{
5404
0
    const struct cipher* c;
5405
5406
0
    if (!cipher) {
5407
0
        return 0;
5408
0
    }
5409
5410
0
    for (c = cipher_tbl; c->type != 0; c++) {
5411
0
        if (XSTRCMP(cipher, c->name) == 0) {
5412
0
            return c->nid;
5413
0
        }
5414
0
    }
5415
5416
0
    return 0;
5417
0
}
5418
5419
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbyname(const char *name)
5420
0
{
5421
0
    const struct alias {
5422
0
        const char *name;
5423
0
        const char *alias;
5424
0
    } cipher_alias_tbl[] = {
5425
0
#ifndef NO_DES3
5426
0
        {EVP_DES_CBC, "des"},
5427
0
        {EVP_DES_ECB, "des-ecb"},
5428
0
        {EVP_DES_EDE3_CBC, "des3"},
5429
0
        {EVP_DES_EDE3_CBC, "3des"},
5430
0
        {EVP_DES_EDE3_ECB, "des-ede3"},
5431
0
        {EVP_DES_EDE3_ECB, "des-ede3-ecb"},
5432
0
#endif
5433
0
#ifndef NO_AES
5434
0
    #ifdef HAVE_AES_CBC
5435
0
        #ifdef WOLFSSL_AES_128
5436
0
            {EVP_AES_128_CBC, "aes128-cbc"},
5437
0
            {EVP_AES_128_CBC, "aes128"},
5438
0
        #endif
5439
0
        #ifdef WOLFSSL_AES_192
5440
0
            {EVP_AES_192_CBC, "aes192-cbc"},
5441
0
            {EVP_AES_192_CBC, "aes192"},
5442
0
        #endif
5443
0
        #ifdef WOLFSSL_AES_256
5444
0
            {EVP_AES_256_CBC, "aes256-cbc"},
5445
0
            {EVP_AES_256_CBC, "aes256"},
5446
0
        #endif
5447
0
    #endif
5448
0
    #ifdef HAVE_AES_ECB
5449
0
        #ifdef WOLFSSL_AES_128
5450
0
            {EVP_AES_128_ECB, "aes128-ecb"},
5451
0
        #endif
5452
0
        #ifdef WOLFSSL_AES_192
5453
0
            {EVP_AES_192_ECB, "aes192-ecb"},
5454
0
        #endif
5455
0
        #ifdef WOLFSSL_AES_256
5456
0
            {EVP_AES_256_ECB, "aes256-ecb"},
5457
0
        #endif
5458
0
    #endif
5459
0
    #ifdef HAVE_AESGCM
5460
0
        #ifdef WOLFSSL_AES_128
5461
0
            {EVP_AES_128_GCM, "aes-128-gcm"},
5462
0
            {EVP_AES_128_GCM, "id-aes128-GCM"},
5463
0
        #endif
5464
0
        #ifdef WOLFSSL_AES_192
5465
0
            {EVP_AES_192_GCM, "aes-192-gcm"},
5466
0
            {EVP_AES_192_GCM, "id-aes192-GCM"},
5467
0
        #endif
5468
0
        #ifdef WOLFSSL_AES_256
5469
0
            {EVP_AES_256_GCM, "aes-256-gcm"},
5470
0
            {EVP_AES_256_GCM, "id-aes256-GCM"},
5471
0
        #endif
5472
0
    #endif
5473
0
    #ifdef HAVE_AESCCM
5474
0
        #ifdef WOLFSSL_AES_128
5475
0
            {EVP_AES_128_CCM, "aes-128-ccm"},
5476
0
            {EVP_AES_128_CCM, "id-aes128-CCM"},
5477
0
        #endif
5478
0
        #ifdef WOLFSSL_AES_192
5479
0
            {EVP_AES_192_CCM, "aes-192-ccm"},
5480
0
            {EVP_AES_192_CCM, "id-aes192-CCM"},
5481
0
        #endif
5482
0
        #ifdef WOLFSSL_AES_256
5483
0
            {EVP_AES_256_CCM, "aes-256-ccm"},
5484
0
            {EVP_AES_256_CCM, "id-aes256-CCM"},
5485
0
        #endif
5486
0
    #endif
5487
0
#endif
5488
#ifdef HAVE_ARIA
5489
        {EVP_ARIA_128_GCM, "aria-128-gcm"},
5490
        {EVP_ARIA_128_GCM, "id-aria128-GCM"},
5491
        {EVP_ARIA_192_GCM, "aria-192-gcm"},
5492
        {EVP_ARIA_192_GCM, "id-aria192-GCM"},
5493
        {EVP_ARIA_256_GCM, "aria-256-gcm"},
5494
        {EVP_ARIA_256_GCM, "id-aria256-GCM"},
5495
#endif
5496
0
#ifdef WOLFSSL_SM4_ECB
5497
0
        {EVP_SM4_ECB, "sm4-ecb"},
5498
0
#endif
5499
0
#ifdef WOLFSSL_SM4_CBC
5500
0
        {EVP_SM4_CBC, "sm4"},
5501
0
        {EVP_SM4_CBC, "sm4-cbc"},
5502
0
#endif
5503
0
#ifdef WOLFSSL_SM4_CTR
5504
0
        {EVP_SM4_CTR, "sm4-ctr"},
5505
0
#endif
5506
0
#ifdef WOLFSSL_SM4_GCM
5507
0
        {EVP_SM4_GCM, "sm4-gcm"},
5508
0
#endif
5509
0
#ifdef WOLFSSL_SM4_CCM
5510
0
        {EVP_SM4_CCM, "sm4-ccm"},
5511
0
#endif
5512
0
#ifndef NO_RC4
5513
0
        {EVP_ARC4, "RC4"},
5514
0
#endif
5515
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5516
0
        {EVP_CHACHA20_POLY1305, "chacha20-poly1305"},
5517
0
#endif
5518
0
#ifdef HAVE_CHACHA
5519
0
        {EVP_CHACHA20, "chacha20"},
5520
0
#endif
5521
0
        { NULL, NULL}
5522
0
    };
5523
5524
0
    const struct cipher *ent;
5525
0
    const struct alias  *al;
5526
5527
0
    WOLFSSL_ENTER("EVP_get_cipherbyname");
5528
5529
0
    for (al = cipher_alias_tbl; al->name != NULL; al++) {
5530
        /* Accept any case alternative version of an alias. */
5531
0
        if (XSTRCASECMP(name, al->alias) == 0) {
5532
0
            name = al->name;
5533
0
            break;
5534
0
        }
5535
0
    }
5536
5537
0
    for (ent = cipher_tbl; ent->name != NULL; ent++) {
5538
        /* Accept any case alternative version of name. */
5539
0
        if (XSTRCASECMP(name, ent->name) == 0) {
5540
0
            return (WOLFSSL_EVP_CIPHER *)ent->name;
5541
0
        }
5542
0
    }
5543
5544
0
    return NULL;
5545
0
}
5546
5547
/*
5548
 * return an EVP_CIPHER structure when cipher NID is passed.
5549
 *
5550
 * id  cipher NID
5551
 *
5552
 * return WOLFSSL_EVP_CIPHER
5553
*/
5554
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbynid(int id)
5555
0
{
5556
0
    WOLFSSL_ENTER("EVP_get_cipherbynid");
5557
5558
0
    switch(id) {
5559
5560
0
#ifndef NO_AES
5561
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5562
0
        #ifdef WOLFSSL_AES_128
5563
0
        case WC_NID_aes_128_cbc:
5564
0
            return wolfSSL_EVP_aes_128_cbc();
5565
0
        #endif
5566
0
        #ifdef WOLFSSL_AES_192
5567
0
        case WC_NID_aes_192_cbc:
5568
0
            return wolfSSL_EVP_aes_192_cbc();
5569
0
        #endif
5570
0
        #ifdef WOLFSSL_AES_256
5571
0
        case WC_NID_aes_256_cbc:
5572
0
            return wolfSSL_EVP_aes_256_cbc();
5573
0
        #endif
5574
0
    #endif
5575
0
    #ifdef WOLFSSL_AES_COUNTER
5576
0
        #ifdef WOLFSSL_AES_128
5577
0
        case WC_NID_aes_128_ctr:
5578
0
            return wolfSSL_EVP_aes_128_ctr();
5579
0
        #endif
5580
0
        #ifdef WOLFSSL_AES_192
5581
0
        case WC_NID_aes_192_ctr:
5582
0
            return wolfSSL_EVP_aes_192_ctr();
5583
0
        #endif
5584
0
        #ifdef WOLFSSL_AES_256
5585
0
        case WC_NID_aes_256_ctr:
5586
0
            return wolfSSL_EVP_aes_256_ctr();
5587
0
        #endif
5588
0
    #endif /* WOLFSSL_AES_COUNTER */
5589
0
    #ifdef HAVE_AES_ECB
5590
0
        #ifdef WOLFSSL_AES_128
5591
0
        case WC_NID_aes_128_ecb:
5592
0
            return wolfSSL_EVP_aes_128_ecb();
5593
0
        #endif
5594
0
        #ifdef WOLFSSL_AES_192
5595
0
        case WC_NID_aes_192_ecb:
5596
0
            return wolfSSL_EVP_aes_192_ecb();
5597
0
        #endif
5598
0
        #ifdef WOLFSSL_AES_256
5599
0
        case WC_NID_aes_256_ecb:
5600
0
            return wolfSSL_EVP_aes_256_ecb();
5601
0
        #endif
5602
0
    #endif /* HAVE_AES_ECB */
5603
0
    #ifdef HAVE_AESGCM
5604
0
        #ifdef WOLFSSL_AES_128
5605
0
        case WC_NID_aes_128_gcm:
5606
0
            return wolfSSL_EVP_aes_128_gcm();
5607
0
        #endif
5608
0
        #ifdef WOLFSSL_AES_192
5609
0
        case WC_NID_aes_192_gcm:
5610
0
            return wolfSSL_EVP_aes_192_gcm();
5611
0
        #endif
5612
0
        #ifdef WOLFSSL_AES_256
5613
0
        case WC_NID_aes_256_gcm:
5614
0
            return wolfSSL_EVP_aes_256_gcm();
5615
0
        #endif
5616
0
    #endif
5617
0
    #ifdef HAVE_AESCCM
5618
0
        #ifdef WOLFSSL_AES_128
5619
0
        case WC_NID_aes_128_ccm:
5620
0
            return wolfSSL_EVP_aes_128_ccm();
5621
0
        #endif
5622
0
        #ifdef WOLFSSL_AES_192
5623
0
        case WC_NID_aes_192_ccm:
5624
0
            return wolfSSL_EVP_aes_192_ccm();
5625
0
        #endif
5626
0
        #ifdef WOLFSSL_AES_256
5627
0
        case WC_NID_aes_256_ccm:
5628
0
            return wolfSSL_EVP_aes_256_ccm();
5629
0
        #endif
5630
0
    #endif
5631
0
#endif
5632
5633
#ifdef HAVE_ARIA
5634
    case WC_NID_aria_128_gcm:
5635
        return wolfSSL_EVP_aria_128_gcm();
5636
    case WC_NID_aria_192_gcm:
5637
        return wolfSSL_EVP_aria_192_gcm();
5638
    case WC_NID_aria_256_gcm:
5639
        return wolfSSL_EVP_aria_256_gcm();
5640
#endif
5641
5642
0
#ifndef NO_DES3
5643
0
        case WC_NID_des_cbc:
5644
0
            return wolfSSL_EVP_des_cbc();
5645
0
#ifdef WOLFSSL_DES_ECB
5646
0
        case WC_NID_des_ecb:
5647
0
            return wolfSSL_EVP_des_ecb();
5648
0
#endif
5649
0
        case WC_NID_des_ede3_cbc:
5650
0
            return wolfSSL_EVP_des_ede3_cbc();
5651
0
#ifdef WOLFSSL_DES_ECB
5652
0
        case WC_NID_des_ede3_ecb:
5653
0
            return wolfSSL_EVP_des_ede3_ecb();
5654
0
#endif
5655
0
#endif /*NO_DES3*/
5656
5657
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5658
0
        case WC_NID_chacha20_poly1305:
5659
0
            return wolfSSL_EVP_chacha20_poly1305();
5660
0
#endif
5661
5662
0
#ifdef HAVE_CHACHA
5663
0
        case WC_NID_chacha20:
5664
0
            return wolfSSL_EVP_chacha20();
5665
0
#endif
5666
5667
0
#ifdef WOLFSSL_SM4_ECB
5668
0
        case WC_NID_sm4_ecb:
5669
0
            return wolfSSL_EVP_sm4_ecb();
5670
0
#endif
5671
0
#ifdef WOLFSSL_SM4_CBC
5672
0
        case WC_NID_sm4_cbc:
5673
0
            return wolfSSL_EVP_sm4_cbc();
5674
0
#endif
5675
0
#ifdef WOLFSSL_SM4_CTR
5676
0
        case WC_NID_sm4_ctr:
5677
0
            return wolfSSL_EVP_sm4_ctr();
5678
0
#endif
5679
0
#ifdef WOLFSSL_SM4_GCM
5680
0
        case WC_NID_sm4_gcm:
5681
0
            return wolfSSL_EVP_sm4_gcm();
5682
0
#endif
5683
0
#ifdef WOLFSSL_SM4_CCM
5684
0
        case WC_NID_sm4_ccm:
5685
0
            return wolfSSL_EVP_sm4_ccm();
5686
0
#endif
5687
5688
0
        default:
5689
0
            WOLFSSL_MSG("Bad cipher id value");
5690
0
    }
5691
5692
0
    return NULL;
5693
0
}
5694
5695
void wolfSSL_EVP_init(void)
5696
16
{
5697
    /* Does nothing. */
5698
16
}
5699
5700
    /* returns WOLFSSL_SUCCESS on success */
5701
    int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5702
0
    {
5703
0
        return wolfSSL_EVP_MD_CTX_copy_ex(out, in);
5704
0
    }
5705
    /* Deep copy of EVP_MD hasher
5706
     * return WOLFSSL_SUCCESS on success */
5707
    static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des,
5708
            const WOLFSSL_EVP_MD_CTX* src)
5709
0
    {
5710
0
        if (src->isHMAC) {
5711
0
            return wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac);
5712
0
        }
5713
0
        else {
5714
0
            int ret;
5715
5716
0
            switch (src->macType) {
5717
0
                case WC_HASH_TYPE_MD5:
5718
0
            #ifndef NO_MD5
5719
0
                    ret = wc_Md5Copy((wc_Md5*)&src->hash.digest,
5720
0
                            (wc_Md5*)&des->hash.digest);
5721
            #else
5722
                    ret = NOT_COMPILED_IN;
5723
            #endif /* !NO_MD5 */
5724
0
                    break;
5725
0
                case WC_HASH_TYPE_SHA:
5726
0
            #ifndef NO_SHA
5727
0
                    ret = wc_ShaCopy((wc_Sha*)&src->hash.digest,
5728
0
                            (wc_Sha*)&des->hash.digest);
5729
            #else
5730
                    ret = NOT_COMPILED_IN;
5731
            #endif /* !NO_SHA */
5732
0
                    break;
5733
0
                case WC_HASH_TYPE_SHA224:
5734
0
            #ifdef WOLFSSL_SHA224
5735
0
                    ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest,
5736
0
                            (wc_Sha224*)&des->hash.digest);
5737
            #else
5738
                    ret = NOT_COMPILED_IN;
5739
            #endif /* WOLFSSL_SHA224 */
5740
0
                    break;
5741
0
                case WC_HASH_TYPE_SHA256:
5742
0
            #ifndef NO_SHA256
5743
0
                    ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest,
5744
0
                            (wc_Sha256*)&des->hash.digest);
5745
            #else
5746
                    ret = NOT_COMPILED_IN;
5747
            #endif /* !NO_SHA256 */
5748
0
                    break;
5749
0
                case WC_HASH_TYPE_SHA384:
5750
0
            #ifdef WOLFSSL_SHA384
5751
0
                    ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest,
5752
0
                            (wc_Sha384*)&des->hash.digest);
5753
            #else
5754
                    ret = NOT_COMPILED_IN;
5755
            #endif /* WOLFSSL_SHA384 */
5756
0
                    break;
5757
0
                case WC_HASH_TYPE_SHA512:
5758
0
            #ifdef WOLFSSL_SHA512
5759
0
                    ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest,
5760
0
                        (wc_Sha512*)&des->hash.digest);
5761
            #else
5762
                    ret = NOT_COMPILED_IN;
5763
            #endif /* WOLFSSL_SHA512 */
5764
0
                    break;
5765
0
                case WC_HASH_TYPE_SHA512_224:
5766
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5767
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
5768
0
                    ret = wc_Sha512_224Copy((wc_Sha512*)&src->hash.digest,
5769
0
                        (wc_Sha512*)&des->hash.digest);
5770
            #else
5771
                    ret = NOT_COMPILED_IN;
5772
            #endif
5773
0
                    break;
5774
0
                case WC_HASH_TYPE_SHA512_256:
5775
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5776
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
5777
0
                    ret = wc_Sha512_256Copy((wc_Sha512*)&src->hash.digest,
5778
0
                        (wc_Sha512*)&des->hash.digest);
5779
            #else
5780
                    ret = NOT_COMPILED_IN;
5781
            #endif
5782
0
                    break;
5783
0
                case WC_HASH_TYPE_SHA3_224:
5784
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
5785
0
                    ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest,
5786
0
                            (wc_Sha3*)&des->hash.digest);
5787
            #else
5788
                    ret = NOT_COMPILED_IN;
5789
            #endif
5790
0
                    break;
5791
0
                case WC_HASH_TYPE_SHA3_256:
5792
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
5793
0
                    ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest,
5794
0
                            (wc_Sha3*)&des->hash.digest);
5795
            #else
5796
                    ret = NOT_COMPILED_IN;
5797
            #endif
5798
0
                    break;
5799
0
                case WC_HASH_TYPE_SHA3_384:
5800
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
5801
0
                    ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest,
5802
0
                            (wc_Sha3*)&des->hash.digest);
5803
            #else
5804
                    ret = NOT_COMPILED_IN;
5805
            #endif
5806
0
                    break;
5807
0
                case WC_HASH_TYPE_SHA3_512:
5808
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
5809
0
                    ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest,
5810
0
                        (wc_Sha3*)&des->hash.digest);
5811
            #else
5812
                    ret = NOT_COMPILED_IN;
5813
            #endif
5814
0
                    break;
5815
0
                case WC_HASH_TYPE_SM3:
5816
0
            #ifdef WOLFSSL_SM3
5817
0
                    ret = wc_Sm3Copy(&src->hash.digest.sm3,
5818
0
                        &des->hash.digest.sm3);
5819
            #else
5820
                    ret = NOT_COMPILED_IN;
5821
            #endif
5822
0
                    break;
5823
0
                case WC_HASH_TYPE_SHAKE128:
5824
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
5825
0
                    ret = wc_Shake128_Copy((wc_Shake*)&src->hash.digest.shake,
5826
0
                            (wc_Shake*)&des->hash.digest.shake);
5827
            #else
5828
                    ret = NOT_COMPILED_IN;
5829
            #endif
5830
0
                    break;
5831
0
                case WC_HASH_TYPE_SHAKE256:
5832
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
5833
0
                    ret = wc_Shake256_Copy((wc_Shake*)&src->hash.digest.shake,
5834
0
                            (wc_Shake*)&des->hash.digest.shake);
5835
            #else
5836
                    ret = NOT_COMPILED_IN;
5837
            #endif
5838
0
                    break;
5839
0
                case WC_HASH_TYPE_NONE:
5840
0
                case WC_HASH_TYPE_MD2:
5841
0
                case WC_HASH_TYPE_MD4:
5842
0
                case WC_HASH_TYPE_MD5_SHA:
5843
0
                case WC_HASH_TYPE_BLAKE2B:
5844
0
                case WC_HASH_TYPE_BLAKE2S:
5845
0
                default:
5846
0
                    ret = BAD_FUNC_ARG;
5847
0
                    break;
5848
0
            }
5849
0
            return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
5850
0
        }
5851
0
    }
5852
5853
    /* copies structure in to the structure out
5854
     *
5855
     * returns WOLFSSL_SUCCESS on success */
5856
    int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5857
0
    {
5858
0
        if ((out == NULL) || (in == NULL)) return WOLFSSL_FAILURE;
5859
0
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_copy_ex");
5860
0
        wolfSSL_EVP_MD_CTX_cleanup(out);
5861
0
        XMEMCPY(out, in, sizeof(WOLFSSL_EVP_MD_CTX));
5862
0
        if (in->pctx != NULL) {
5863
0
            out->pctx = wolfSSL_EVP_PKEY_CTX_new(in->pctx->pkey, NULL);
5864
0
            if (out->pctx == NULL)
5865
0
                return WOLFSSL_FAILURE;
5866
0
        }
5867
        /* Zero hash context after shallow copy to prevent shared sub-pointers
5868
         * with src. The hash Copy function will perform the proper deep copy. */
5869
0
        XMEMSET(&out->hash, 0, sizeof(out->hash));
5870
0
        return wolfSSL_EVP_MD_Copy_Hasher(out, (WOLFSSL_EVP_MD_CTX*)in);
5871
0
    }
5872
    #ifndef NO_AES
5873
5874
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5875
    #ifdef WOLFSSL_AES_128
5876
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void)
5877
330
    {
5878
330
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cbc");
5879
330
        return EVP_AES_128_CBC;
5880
330
    }
5881
    #endif /* WOLFSSL_AES_128 */
5882
5883
5884
    #ifdef WOLFSSL_AES_192
5885
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void)
5886
145
    {
5887
145
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cbc");
5888
145
        return EVP_AES_192_CBC;
5889
145
    }
5890
    #endif /* WOLFSSL_AES_192 */
5891
5892
5893
    #ifdef WOLFSSL_AES_256
5894
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void)
5895
144
    {
5896
144
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cbc");
5897
144
        return EVP_AES_256_CBC;
5898
144
    }
5899
    #endif /* WOLFSSL_AES_256 */
5900
    #endif /* HAVE_AES_CBC */
5901
5902
    #ifdef WOLFSSL_AES_CFB
5903
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5904
    #ifdef WOLFSSL_AES_128
5905
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void)
5906
184
    {
5907
184
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1");
5908
184
        return EVP_AES_128_CFB1;
5909
184
    }
5910
    #endif /* WOLFSSL_AES_128 */
5911
5912
    #ifdef WOLFSSL_AES_192
5913
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void)
5914
51
    {
5915
51
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1");
5916
51
        return EVP_AES_192_CFB1;
5917
51
    }
5918
    #endif /* WOLFSSL_AES_192 */
5919
5920
    #ifdef WOLFSSL_AES_256
5921
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void)
5922
171
    {
5923
171
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1");
5924
171
        return EVP_AES_256_CFB1;
5925
171
    }
5926
    #endif /* WOLFSSL_AES_256 */
5927
5928
    #ifdef WOLFSSL_AES_128
5929
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void)
5930
188
    {
5931
188
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8");
5932
188
        return EVP_AES_128_CFB8;
5933
188
    }
5934
    #endif /* WOLFSSL_AES_128 */
5935
5936
    #ifdef WOLFSSL_AES_192
5937
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void)
5938
144
    {
5939
144
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8");
5940
144
        return EVP_AES_192_CFB8;
5941
144
    }
5942
    #endif /* WOLFSSL_AES_192 */
5943
5944
    #ifdef WOLFSSL_AES_256
5945
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void)
5946
150
    {
5947
150
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8");
5948
150
        return EVP_AES_256_CFB8;
5949
150
    }
5950
    #endif /* WOLFSSL_AES_256 */
5951
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5952
5953
    #ifdef WOLFSSL_AES_128
5954
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void)
5955
0
    {
5956
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128");
5957
0
        return EVP_AES_128_CFB128;
5958
0
    }
5959
    #endif /* WOLFSSL_AES_128 */
5960
5961
    #ifdef WOLFSSL_AES_192
5962
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void)
5963
0
    {
5964
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128");
5965
0
        return EVP_AES_192_CFB128;
5966
0
    }
5967
    #endif /* WOLFSSL_AES_192 */
5968
5969
    #ifdef WOLFSSL_AES_256
5970
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void)
5971
0
    {
5972
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128");
5973
0
        return EVP_AES_256_CFB128;
5974
0
    }
5975
    #endif /* WOLFSSL_AES_256 */
5976
    #endif /* WOLFSSL_AES_CFB */
5977
5978
    #ifdef WOLFSSL_AES_OFB
5979
    #ifdef WOLFSSL_AES_128
5980
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void)
5981
203
    {
5982
203
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb");
5983
203
        return EVP_AES_128_OFB;
5984
203
    }
5985
    #endif /* WOLFSSL_AES_128 */
5986
5987
    #ifdef WOLFSSL_AES_192
5988
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void)
5989
128
    {
5990
128
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb");
5991
128
        return EVP_AES_192_OFB;
5992
128
    }
5993
    #endif /* WOLFSSL_AES_192 */
5994
5995
    #ifdef WOLFSSL_AES_256
5996
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void)
5997
289
    {
5998
289
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb");
5999
289
        return EVP_AES_256_OFB;
6000
289
    }
6001
    #endif /* WOLFSSL_AES_256 */
6002
    #endif /* WOLFSSL_AES_OFB */
6003
6004
    #if defined(WOLFSSL_AES_XTS) && \
6005
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
6006
    #ifdef WOLFSSL_AES_128
6007
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void)
6008
432
    {
6009
432
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts");
6010
432
        return EVP_AES_128_XTS;
6011
432
    }
6012
    #endif /* WOLFSSL_AES_128 */
6013
6014
    #ifdef WOLFSSL_AES_256
6015
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void)
6016
108
    {
6017
108
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts");
6018
108
        return EVP_AES_256_XTS;
6019
108
    }
6020
    #endif /* WOLFSSL_AES_256 */
6021
    #endif /* WOLFSSL_AES_XTS &&
6022
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
6023
6024
    #ifdef HAVE_AESGCM
6025
    #ifdef WOLFSSL_AES_128
6026
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void)
6027
535
    {
6028
535
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_gcm");
6029
535
        return EVP_AES_128_GCM;
6030
535
    }
6031
    #endif /* WOLFSSL_GCM_128 */
6032
6033
    #ifdef WOLFSSL_AES_192
6034
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void)
6035
180
    {
6036
180
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_gcm");
6037
180
        return EVP_AES_192_GCM;
6038
180
    }
6039
    #endif /* WOLFSSL_AES_192 */
6040
6041
    #ifdef WOLFSSL_AES_256
6042
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_gcm(void)
6043
459
    {
6044
459
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_gcm");
6045
459
        return EVP_AES_256_GCM;
6046
459
    }
6047
    #endif /* WOLFSSL_AES_256 */
6048
    #endif /* HAVE_AESGCM */
6049
6050
    #ifdef HAVE_AESCCM
6051
    #ifdef WOLFSSL_AES_128
6052
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ccm(void)
6053
0
    {
6054
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ccm");
6055
0
        return EVP_AES_128_CCM;
6056
0
    }
6057
    #endif /* WOLFSSL_CCM_128 */
6058
6059
    #ifdef WOLFSSL_AES_192
6060
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ccm(void)
6061
0
    {
6062
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ccm");
6063
0
        return EVP_AES_192_CCM;
6064
0
    }
6065
    #endif /* WOLFSSL_AES_192 */
6066
6067
    #ifdef WOLFSSL_AES_256
6068
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ccm(void)
6069
0
    {
6070
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ccm");
6071
0
        return EVP_AES_256_CCM;
6072
0
    }
6073
    #endif /* WOLFSSL_AES_256 */
6074
    #endif /* HAVE_AESCCM */
6075
6076
    #ifdef WOLFSSL_AES_COUNTER
6077
    #ifdef WOLFSSL_AES_128
6078
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void)
6079
81
    {
6080
81
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ctr");
6081
81
        return EVP_AES_128_CTR;
6082
81
    }
6083
    #endif /* WOLFSSL_AES_2128 */
6084
6085
    #ifdef WOLFSSL_AES_192
6086
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void)
6087
409
    {
6088
409
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ctr");
6089
409
        return EVP_AES_192_CTR;
6090
409
    }
6091
    #endif /* WOLFSSL_AES_192 */
6092
6093
6094
    #ifdef WOLFSSL_AES_256
6095
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void)
6096
83
    {
6097
83
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ctr");
6098
83
        return EVP_AES_256_CTR;
6099
83
    }
6100
    #endif /* WOLFSSL_AES_256 */
6101
    #endif /* WOLFSSL_AES_COUNTER */
6102
6103
    #ifdef HAVE_AES_ECB
6104
    #ifdef WOLFSSL_AES_128
6105
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void)
6106
101
    {
6107
101
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ecb");
6108
101
        return EVP_AES_128_ECB;
6109
101
    }
6110
    #endif /* WOLFSSL_AES_128 */
6111
6112
6113
    #ifdef WOLFSSL_AES_192
6114
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void)
6115
121
    {
6116
121
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ecb");
6117
121
        return EVP_AES_192_ECB;
6118
121
    }
6119
    #endif /* WOLFSSL_AES_192*/
6120
6121
6122
    #ifdef WOLFSSL_AES_256
6123
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void)
6124
64
    {
6125
64
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ecb");
6126
64
        return EVP_AES_256_ECB;
6127
64
    }
6128
    #endif /* WOLFSSL_AES_256 */
6129
    #endif /* HAVE_AES_ECB */
6130
    #endif /* NO_AES */
6131
6132
#ifdef HAVE_ARIA
6133
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void)
6134
    {
6135
        WOLFSSL_ENTER("wolfSSL_EVP_aria_128_gcm");
6136
        return EVP_ARIA_128_GCM;
6137
    }
6138
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void)
6139
    {
6140
        WOLFSSL_ENTER("wolfSSL_EVP_aria_192_gcm");
6141
        return EVP_ARIA_192_GCM;
6142
    }
6143
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void)
6144
    {
6145
        WOLFSSL_ENTER("wolfSSL_EVP_aria_256_gcm");
6146
        return EVP_ARIA_256_GCM;
6147
    }
6148
#endif /* HAVE_ARIA */
6149
6150
#ifndef NO_DES3
6151
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void)
6152
225
    {
6153
225
        WOLFSSL_ENTER("wolfSSL_EVP_des_cbc");
6154
225
        return EVP_DES_CBC;
6155
225
    }
6156
#ifdef WOLFSSL_DES_ECB
6157
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void)
6158
448
    {
6159
448
        WOLFSSL_ENTER("wolfSSL_EVP_des_ecb");
6160
448
        return EVP_DES_ECB;
6161
448
    }
6162
#endif
6163
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void)
6164
248
    {
6165
248
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_cbc");
6166
248
        return EVP_DES_EDE3_CBC;
6167
248
    }
6168
#ifdef WOLFSSL_DES_ECB
6169
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void)
6170
0
    {
6171
0
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_ecb");
6172
0
        return EVP_DES_EDE3_ECB;
6173
0
    }
6174
#endif
6175
#endif /* NO_DES3 */
6176
6177
#ifndef NO_RC4
6178
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void)
6179
65
    {
6180
65
        WOLFSSL_ENTER("wolfSSL_EVP_rc4");
6181
65
        return EVP_ARC4;
6182
65
    }
6183
#endif
6184
6185
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6186
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20_poly1305(void)
6187
0
    {
6188
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20_poly1305");
6189
0
        return EVP_CHACHA20_POLY1305;
6190
0
    }
6191
#endif
6192
6193
#ifdef HAVE_CHACHA
6194
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20(void)
6195
0
    {
6196
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20");
6197
0
        return EVP_CHACHA20;
6198
0
    }
6199
#endif
6200
6201
#ifdef WOLFSSL_SM4_ECB
6202
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void)
6203
0
    {
6204
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ecb");
6205
0
        return EVP_SM4_ECB;
6206
0
    }
6207
#endif
6208
#ifdef WOLFSSL_SM4_CBC
6209
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void)
6210
0
    {
6211
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_cbc");
6212
0
        return EVP_SM4_CBC;
6213
0
    }
6214
#endif
6215
#ifdef WOLFSSL_SM4_CTR
6216
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void)
6217
0
    {
6218
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ctr");
6219
0
        return EVP_SM4_CTR;
6220
0
    }
6221
#endif
6222
#ifdef WOLFSSL_SM4_GCM
6223
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void)
6224
0
    {
6225
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_gcm");
6226
0
        return EVP_SM4_GCM;
6227
0
    }
6228
#endif
6229
#ifdef WOLFSSL_SM4_CCM
6230
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void)
6231
0
    {
6232
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ccm");
6233
0
        return EVP_SM4_CCM;
6234
0
    }
6235
#endif
6236
6237
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void)
6238
0
    {
6239
0
        WOLFSSL_ENTER("wolfSSL_EVP_enc_null");
6240
0
        return EVP_NULL;
6241
0
    }
6242
    void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx)
6243
8.15k
    {
6244
8.15k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_init");
6245
8.15k
        if (ctx) {
6246
8.15k
            XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_CIPHER_CTX));
6247
8.15k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;   /* not yet initialized */
6248
8.15k
            ctx->keyLen     = 0;
6249
8.15k
            ctx->enc        = 1;      /* start in encrypt mode */
6250
8.15k
        }
6251
8.15k
    }
6252
6253
    /* This function allows cipher specific parameters to be
6254
    determined and set. */
6255
    int wolfSSL_EVP_CIPHER_CTX_ctrl(WOLFSSL_EVP_CIPHER_CTX *ctx, int type, \
6256
                                    int arg, void *ptr)
6257
778
    {
6258
778
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6259
778
#if defined(HAVE_AESGCM) || (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6260
778
#ifndef WC_NO_RNG
6261
778
        WC_RNG rng;
6262
778
#endif
6263
778
#endif
6264
778
        if (ctx == NULL)
6265
0
            return WOLFSSL_FAILURE;
6266
6267
778
        (void)arg;
6268
778
        (void)ptr;
6269
6270
778
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_ctrl");
6271
6272
778
        switch(type) {
6273
0
            case WOLFSSL_EVP_CTRL_INIT:
6274
0
                wolfSSL_EVP_CIPHER_CTX_init(ctx);
6275
0
                if(ctx)
6276
0
                    ret = WOLFSSL_SUCCESS;
6277
0
                break;
6278
0
            case WOLFSSL_EVP_CTRL_SET_KEY_LENGTH:
6279
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg);
6280
0
                break;
6281
0
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6282
0
        defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \
6283
0
        (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6284
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IVLEN:
6285
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6286
0
                    break;
6287
0
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6288
0
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6289
0
                    if (arg != CHACHA20_POLY1305_AEAD_IV_SIZE) {
6290
0
                        break;
6291
0
                    }
6292
0
                }
6293
0
                else
6294
0
            #endif /* HAVE_CHACHA && HAVE_POLY1305 */
6295
0
            #if defined(WOLFSSL_SM4_GCM)
6296
0
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6297
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6298
0
                        break;
6299
0
                    }
6300
0
                }
6301
0
                else
6302
0
            #endif
6303
0
            #if defined(WOLFSSL_SM4_CCM)
6304
0
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6305
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6306
0
                        break;
6307
0
                    }
6308
0
                }
6309
0
                else
6310
0
            #endif
6311
0
                {
6312
0
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6313
0
                        break;
6314
0
                }
6315
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg);
6316
0
                break;
6317
6318
0
#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) || \
6319
0
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6320
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IV_FIXED:
6321
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6322
0
                    break;
6323
0
                if (arg == -1) {
6324
                    /* arg == -1 copies ctx->ivSz from ptr */
6325
0
                    ret = wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, (byte*)ptr, ctx->ivSz);
6326
0
                }
6327
0
#ifndef WC_NO_RNG
6328
0
                else {
6329
                    /*
6330
                     * Fixed field must be at least 4 bytes and invocation
6331
                     * field at least 8.
6332
                     */
6333
0
                    if ((arg < 4) || (ctx->ivSz - arg) < 8) {
6334
0
                        WOLFSSL_MSG("Fixed field or invocation field too short");
6335
0
                        break;
6336
0
                    }
6337
                    /* arg is 4...(ctx->ivSz - 8) */
6338
0
                    XMEMCPY(ctx->iv, ptr, (size_t)arg);
6339
0
                    if (wc_InitRng(&rng) != 0) {
6340
0
                        WOLFSSL_MSG("wc_InitRng failed");
6341
0
                        break;
6342
0
                    }
6343
0
                    if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg,
6344
0
                            (word32)(ctx->ivSz - arg)) == 0) {
6345
0
                        ret = WOLFSSL_SUCCESS;
6346
0
                    } else {
6347
                        /* rng is freed immediately after if block so no need
6348
                         * to do it here
6349
                         */
6350
0
                        WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
6351
0
                    }
6352
0
                    if (wc_FreeRng(&rng) != 0) {
6353
0
                        WOLFSSL_MSG("wc_FreeRng failed");
6354
0
                        ret = WOLFSSL_FAILURE;
6355
0
                        break;
6356
0
                    }
6357
0
                }
6358
0
            #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
6359
0
                if (ret == WOLFSSL_SUCCESS) {
6360
                    /*
6361
                     * OpenSSL requires that a EVP_CTRL_AEAD_SET_IV_FIXED
6362
                     * command be issued before a EVP_CTRL_GCM_IV_GEN command.
6363
                     * This flag is used to enforce that.
6364
                     */
6365
0
                    ctx->authIvGenEnable = 1;
6366
0
                }
6367
0
            #endif
6368
0
#endif /* !WC_NO_RNG */
6369
0
                break;
6370
0
#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM || (HAVE_CHACHA && HAVE_POLY1305) */
6371
0
#if (defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)) && !defined(_WIN32) && \
6372
0
    !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0))
6373
            /*
6374
             * Using EVP_CTRL_GCM_IV_GEN is a way to do AES-GCM encrypt/decrypt
6375
             * multiple times with EVP_Cipher without having to call
6376
             * EVP_CipherInit between each iteration. The IV is incremented for
6377
             * each subsequent EVP_Cipher call to prevent IV reuse.
6378
             */
6379
0
            case WOLFSSL_EVP_CTRL_GCM_IV_GEN:
6380
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6381
0
                    break;
6382
0
                if (!ctx->authIvGenEnable) {
6383
0
                    WOLFSSL_MSG("Must use EVP_CTRL_AEAD_SET_IV_FIXED before "
6384
0
                                "EVP_CTRL_GCM_IV_GEN");
6385
0
                    break;
6386
0
                }
6387
0
                if (ctx->cipher.aes.keylen == 0 || ctx->ivSz == 0) {
6388
0
                    WOLFSSL_MSG("Key or IV not set");
6389
0
                    break;
6390
0
                }
6391
0
                if (ptr == NULL) {
6392
0
                    WOLFSSL_MSG("Destination buffer for IV bytes NULL.");
6393
0
                    break;
6394
0
                }
6395
0
                if (arg <= 0 || arg > ctx->ivSz) {
6396
0
                    XMEMCPY(ptr, ctx->iv, (size_t)ctx->ivSz);
6397
0
                }
6398
0
                else {
6399
                    /*
6400
                     * Copy the last "arg" bytes of ctx->iv into the buffer at
6401
                     * "ptr." Not sure why OpenSSL does this, but it does.
6402
                     */
6403
0
                    XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, (size_t)arg);
6404
0
                }
6405
6406
                /*
6407
                 * The gcmIncIV flag indicates that the IV should be incremented
6408
                 * after the next cipher operation.
6409
                 */
6410
0
                ctx->authIncIv = 1;
6411
0
                ret = WOLFSSL_SUCCESS;
6412
0
                break;
6413
0
#endif /* (HAVE_AESGCM || WOLFSSL_SM4_GCM) && !_WIN32 && !HAVE_SELFTEST &&
6414
        * !HAVE_FIPS || FIPS_VERSION >= 2)*/
6415
286
            case WOLFSSL_EVP_CTRL_AEAD_SET_TAG:
6416
286
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6417
0
                    break;
6418
286
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6419
286
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6420
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6421
0
                        break;
6422
0
                    }
6423
0
                    ctx->authTagSz = arg;
6424
0
                    ret = WOLFSSL_SUCCESS;
6425
0
                    if (ptr != NULL) {
6426
0
                        XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6427
0
                    }
6428
0
                    break;
6429
0
                }
6430
286
                else
6431
286
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6432
286
#if defined(WOLFSSL_SM4_GCM)
6433
286
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6434
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6435
0
                        break;
6436
0
                    }
6437
6438
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6439
0
                    ctx->authTagSz = arg;
6440
0
                    ret = WOLFSSL_SUCCESS;
6441
0
                    break;
6442
0
                }
6443
286
                else
6444
286
#endif
6445
286
#if defined(WOLFSSL_SM4_CCM)
6446
286
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6447
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6448
0
                        break;
6449
0
                    }
6450
6451
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6452
0
                    ctx->authTagSz = arg;
6453
0
                    ret = WOLFSSL_SUCCESS;
6454
0
                    break;
6455
0
                }
6456
286
                else
6457
286
#endif
6458
286
                {
6459
286
                    if(arg <= 0 || arg > 16 || (ptr == NULL))
6460
30
                        break;
6461
6462
256
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6463
256
                    ctx->authTagSz = arg;
6464
256
                    ret = WOLFSSL_SUCCESS;
6465
256
                    break;
6466
286
                }
6467
492
            case WOLFSSL_EVP_CTRL_AEAD_GET_TAG:
6468
492
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6469
0
                    break;
6470
6471
492
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6472
492
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6473
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6474
0
                        break;
6475
0
                    }
6476
0
                }
6477
492
                else
6478
492
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6479
492
#if defined(WOLFSSL_SM4_GCM)
6480
492
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6481
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6482
0
                        break;
6483
0
                    }
6484
0
                }
6485
492
                else
6486
492
#endif
6487
492
#if defined(WOLFSSL_SM4_CCM)
6488
492
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6489
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6490
0
                        break;
6491
0
                    }
6492
0
                }
6493
492
                else
6494
492
#endif
6495
492
                {
6496
492
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6497
249
                        break;
6498
492
                }
6499
6500
243
                if (ptr != NULL) {
6501
243
                    XMEMCPY(ptr, ctx->authTag, (size_t)arg);
6502
243
                    ret = WOLFSSL_SUCCESS;
6503
243
                }
6504
243
                break;
6505
0
#endif /* HAVE_AESGCM || HAVE_AESCCM || WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM ||
6506
        * HAVE_ARIA || (HAVE_CHACHA && HAVE_POLY1305) */
6507
0
            default:
6508
0
                WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled");
6509
0
                break;
6510
778
        }
6511
778
        return ret;
6512
778
    }
6513
6514
    /* WOLFSSL_SUCCESS on ok */
6515
    static int wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(
6516
        WOLFSSL_EVP_CIPHER_CTX* ctx)
6517
9.22k
    {
6518
9.22k
        int ret = WOLFSSL_SUCCESS;
6519
9.22k
        if (ctx) {
6520
9.22k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
6521
9.22k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
6522
9.22k
            switch (ctx->cipherType) {
6523
0
#if (defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM)) || \
6524
0
    defined(HAVE_AESCCM) || \
6525
0
    defined(HAVE_AES_CBC) || \
6526
0
    defined(WOLFSSL_AES_COUNTER) || \
6527
0
    defined(HAVE_AES_ECB) || \
6528
0
    defined(WOLFSSL_AES_CFB) || \
6529
0
    defined(WOLFSSL_AES_OFB) || \
6530
0
    defined(WOLFSSL_AES_XTS)
6531
6532
0
    #if defined(HAVE_AESGCM)
6533
535
                case WC_AES_128_GCM_TYPE:
6534
713
                case WC_AES_192_GCM_TYPE:
6535
1.17k
                case WC_AES_256_GCM_TYPE:
6536
1.17k
    #endif /* HAVE_AESGCM */
6537
1.17k
    #if defined(HAVE_AESCCM)
6538
1.17k
                case WC_AES_128_CCM_TYPE:
6539
1.17k
                case WC_AES_192_CCM_TYPE:
6540
1.17k
                case WC_AES_256_CCM_TYPE:
6541
1.17k
    #endif /* HAVE_AESCCM */
6542
1.17k
    #ifdef HAVE_AES_CBC
6543
1.50k
                case WC_AES_128_CBC_TYPE:
6544
1.61k
                case WC_AES_192_CBC_TYPE:
6545
1.72k
                case WC_AES_256_CBC_TYPE:
6546
1.72k
    #endif
6547
1.72k
    #ifdef WOLFSSL_AES_COUNTER
6548
1.79k
                case WC_AES_128_CTR_TYPE:
6549
2.18k
                case WC_AES_192_CTR_TYPE:
6550
2.24k
                case WC_AES_256_CTR_TYPE:
6551
2.24k
    #endif
6552
2.24k
    #ifdef HAVE_AES_ECB
6553
2.31k
                case WC_AES_128_ECB_TYPE:
6554
2.37k
                case WC_AES_192_ECB_TYPE:
6555
2.43k
                case WC_AES_256_ECB_TYPE:
6556
2.43k
    #endif
6557
2.43k
    #ifdef WOLFSSL_AES_CFB
6558
2.61k
                case WC_AES_128_CFB1_TYPE:
6559
2.66k
                case WC_AES_192_CFB1_TYPE:
6560
2.82k
                case WC_AES_256_CFB1_TYPE:
6561
3.01k
                case WC_AES_128_CFB8_TYPE:
6562
3.14k
                case WC_AES_192_CFB8_TYPE:
6563
3.28k
                case WC_AES_256_CFB8_TYPE:
6564
3.28k
                case WC_AES_128_CFB128_TYPE:
6565
3.28k
                case WC_AES_192_CFB128_TYPE:
6566
3.28k
                case WC_AES_256_CFB128_TYPE:
6567
3.28k
    #endif
6568
3.28k
    #ifdef WOLFSSL_AES_OFB
6569
3.46k
                case WC_AES_128_OFB_TYPE:
6570
3.59k
                case WC_AES_192_OFB_TYPE:
6571
3.87k
                case WC_AES_256_OFB_TYPE:
6572
3.87k
    #endif
6573
3.87k
                    wc_AesFree(&ctx->cipher.aes);
6574
3.87k
                    ctx->flags &=
6575
3.87k
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6576
3.87k
                    break;
6577
0
    #if defined(WOLFSSL_AES_XTS) && \
6578
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
6579
380
                case WC_AES_128_XTS_TYPE:
6580
479
                case WC_AES_256_XTS_TYPE:
6581
479
                    wc_AesXtsFree(&ctx->cipher.xts);
6582
479
                    ctx->flags &=
6583
479
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6584
479
                    break;
6585
9.22k
    #endif
6586
9.22k
#endif /* AES */
6587
    #ifdef HAVE_ARIA
6588
                case WC_ARIA_128_GCM_TYPE:
6589
                case WC_ARIA_192_GCM_TYPE:
6590
                case WC_ARIA_256_GCM_TYPE:
6591
                    {
6592
                        int result = wc_AriaFreeCrypt(&ctx->cipher.aria);
6593
                        if (result != 0) {
6594
                            WOLFSSL_MSG("wc_AriaFreeCrypt failure");
6595
                            ret = result;
6596
                        }
6597
                    }
6598
                    break;
6599
    #endif
6600
9.22k
            }
6601
6602
9.22k
#endif /* not FIPS or FIPS v2+ */
6603
6604
9.22k
#ifdef WOLFSSL_SM4
6605
9.22k
            switch (ctx->cipherType) {
6606
0
    #ifdef WOLFSSL_SM4_ECB
6607
0
                case WC_SM4_ECB_TYPE:
6608
0
    #endif
6609
0
    #ifdef WOLFSSL_SM4_CBC
6610
0
                case WC_SM4_CBC_TYPE:
6611
0
    #endif
6612
0
    #ifdef WOLFSSL_SM4_CTR
6613
0
                case WC_SM4_CTR_TYPE:
6614
0
    #endif
6615
0
    #ifdef WOLFSSL_SM4_GCM
6616
0
                case WC_SM4_GCM_TYPE:
6617
0
    #endif
6618
0
    #ifdef WOLFSSL_SM4_CCM
6619
0
                case WC_SM4_CCM_TYPE:
6620
0
    #endif
6621
0
                    wc_Sm4Free(&ctx->cipher.sm4);
6622
9.22k
            }
6623
9.22k
#endif
6624
9.22k
        }
6625
9.22k
        return ret;
6626
9.22k
    }
6627
6628
    int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx)
6629
9.22k
    {
6630
9.22k
        int ret = WOLFSSL_SUCCESS;
6631
9.22k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup");
6632
9.22k
        if (ctx) {
6633
9.22k
            wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(ctx);
6634
9.22k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;  /* not yet initialized  */
6635
9.22k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6636
9.22k
            if (ctx->key) {
6637
0
                ForceZero(ctx->key, (word32)ctx->keyLen);
6638
0
                XFREE(ctx->key, NULL, DYNAMIC_TYPE_OPENSSL);
6639
0
                ctx->key = NULL;
6640
0
            }
6641
9.22k
#endif
6642
9.22k
            ctx->keyLen     = 0;
6643
9.22k
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6644
9.22k
    defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
6645
9.22k
            XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
6646
9.22k
            ctx->authBuffer = NULL;
6647
9.22k
            ctx->authBufferLen = 0;
6648
9.22k
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6649
9.22k
            ctx->authIn = NULL;
6650
9.22k
            ctx->authInSz = 0;
6651
9.22k
            ctx->authIvGenEnable = 0;
6652
9.22k
            ctx->authIncIv = 0;
6653
9.22k
#endif
6654
9.22k
        }
6655
6656
9.22k
        return ret;
6657
9.22k
    }
6658
6659
    /* Permanent stub for Qt compilation. */
6660
    #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB)
6661
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc2_cbc(void)
6662
    {
6663
        WOLFSSL_ENTER("wolfSSL_EVP_rc2_cbc");
6664
        WOLFSSL_STUB("EVP_rc2_cbc");
6665
        return NULL;
6666
    }
6667
    #endif
6668
6669
#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
6670
6671
    int wolfSSL_EVP_BytesToKey(const WOLFSSL_EVP_CIPHER* type,
6672
                       const WOLFSSL_EVP_MD* md, const byte* salt,
6673
                       const byte* data, int sz, int count, byte* key, byte* iv)
6674
0
    {
6675
0
        int ret;
6676
0
        int hashType = WC_HASH_TYPE_NONE;
6677
0
        WC_DECLARE_VAR(info, EncryptedInfo, 1, 0);
6678
6679
0
    #ifdef WOLFSSL_SMALL_STACK
6680
0
        info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
6681
0
                                       DYNAMIC_TYPE_ENCRYPTEDINFO);
6682
0
        if (info == NULL) {
6683
0
            WOLFSSL_MSG("malloc failed");
6684
0
            return WOLFSSL_FAILURE;
6685
0
        }
6686
0
    #endif
6687
6688
0
        XMEMSET(info, 0, sizeof(EncryptedInfo));
6689
6690
0
        ret = wc_EncryptedInfoGet(info, type);
6691
0
        if (ret < 0)
6692
0
            goto end;
6693
6694
0
        if (data == NULL) {
6695
0
            ret = (int)info->keySz;
6696
0
            goto end;
6697
0
        }
6698
6699
0
        ret = wolfSSL_EVP_get_hashinfo(md, &hashType, NULL);
6700
0
        if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
6701
0
            goto end;
6702
6703
0
        ret = wc_PBKDF1_ex(key, (int)info->keySz, iv, (int)info->ivSz, data, sz,
6704
0
                           salt, EVP_SALT_SIZE, count, hashType, NULL);
6705
0
        if (ret == 0)
6706
0
            ret = (int)info->keySz;
6707
6708
0
    end:
6709
0
        WC_FREE_VAR_EX(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
6710
0
        if (ret < 0)
6711
0
            return 0; /* failure - for compatibility */
6712
6713
0
        return ret;
6714
0
    }
6715
6716
#endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
6717
6718
6719
#ifndef NO_AES
6720
#if defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_192) || \
6721
    defined(WOLFSSL_AES_256)
6722
    #define AES_SIZE_ANY
6723
#endif
6724
6725
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \
6726
    defined(HAVE_AES_ECB) || defined(WOLFSSL_AES_CFB) || \
6727
    defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_DIRECT)
6728
    #define AES_SET_KEY
6729
#endif
6730
6731
#if defined(AES_SIZE_ANY) && defined(AES_SET_KEY)
6732
    static int   AesSetKey_ex(Aes* aes, const byte* key, word32 len,
6733
                              const byte* iv, int dir, int direct)
6734
2.35k
    {
6735
2.35k
        int ret;
6736
        /* wc_AesSetKey clear aes.reg if iv == NULL.
6737
           Keep IV for openSSL compatibility */
6738
2.35k
        if (iv == NULL)
6739
1.59k
            XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, WC_AES_BLOCK_SIZE);
6740
2.35k
        if (direct) {
6741
606
        #if defined(WOLFSSL_AES_DIRECT)
6742
606
            ret = wc_AesSetKeyDirect(aes, key, len, iv, dir);
6743
        #else
6744
            ret = NOT_COMPILED_IN;
6745
        #endif
6746
606
        }
6747
1.74k
        else {
6748
1.74k
            ret = wc_AesSetKey(aes, key, len, iv, dir);
6749
1.74k
        }
6750
2.35k
        if (iv == NULL)
6751
1.59k
            XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, WC_AES_BLOCK_SIZE);
6752
2.35k
        return ret;
6753
2.35k
    }
6754
#endif /* AES_ANY_SIZE && AES_SET_KEY */
6755
#endif /* NO_AES */
6756
6757
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6758
    || FIPS_VERSION_GE(2,0))
6759
    static int EvpCipherInitAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6760
                                   const WOLFSSL_EVP_CIPHER* type,
6761
                                   const byte* key, const byte* iv, int enc)
6762
2.91k
    {
6763
2.91k
        int ret = WOLFSSL_SUCCESS;
6764
6765
2.91k
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6766
2.91k
        ctx->authIn = NULL;
6767
2.91k
        ctx->authInSz = 0;
6768
6769
2.91k
        ctx->block_size = WC_AES_BLOCK_SIZE;
6770
2.91k
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6771
2.91k
        if (ctx->ivSz == 0) {
6772
1.17k
            ctx->ivSz = GCM_NONCE_MID_SZ;
6773
1.17k
        }
6774
2.91k
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6775
2.91k
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
6776
2.91k
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6777
2.91k
        if (enc == 0 || enc == 1) {
6778
2.15k
            ctx->enc = enc ? 1 : 0;
6779
2.15k
        }
6780
6781
2.91k
    #ifdef WOLFSSL_AES_128
6782
2.91k
        if (ctx->cipherType == WC_AES_128_GCM_TYPE ||
6783
2.12k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))) {
6784
1.32k
            WOLFSSL_MSG("EVP_AES_128_GCM");
6785
1.32k
            ctx->cipherType = WC_AES_128_GCM_TYPE;
6786
1.32k
            ctx->keyLen = AES_128_KEY_SIZE;
6787
1.32k
        }
6788
2.91k
    #endif
6789
2.91k
    #ifdef WOLFSSL_AES_192
6790
2.91k
        if (ctx->cipherType == WC_AES_192_GCM_TYPE ||
6791
2.81k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))) {
6792
284
            WOLFSSL_MSG("EVP_AES_192_GCM");
6793
284
            ctx->cipherType = WC_AES_192_GCM_TYPE;
6794
284
            ctx->keyLen = AES_192_KEY_SIZE;
6795
284
        }
6796
2.91k
    #endif
6797
2.91k
    #ifdef WOLFSSL_AES_256
6798
2.91k
        if (ctx->cipherType == WC_AES_256_GCM_TYPE ||
6799
2.06k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))) {
6800
1.30k
            WOLFSSL_MSG("EVP_AES_256_GCM");
6801
1.30k
            ctx->cipherType = WC_AES_256_GCM_TYPE;
6802
1.30k
            ctx->keyLen = AES_256_KEY_SIZE;
6803
1.30k
        }
6804
2.91k
    #endif
6805
6806
2.91k
        if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
6807
1.17k
            if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
6808
0
                ret = WOLFSSL_FAILURE;
6809
1.17k
            else
6810
1.17k
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6811
1.17k
        }
6812
6813
    #ifndef WOLFSSL_AESGCM_STREAM
6814
        if (ret == WOLFSSL_SUCCESS && key &&
6815
            wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) {
6816
            WOLFSSL_MSG("wc_AesGcmSetKey() failed");
6817
            ret = WOLFSSL_FAILURE;
6818
        }
6819
    #endif /* !WOLFSSL_AESGCM_STREAM */
6820
2.91k
        if (ret == WOLFSSL_SUCCESS && iv &&
6821
1.74k
            wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
6822
0
            WOLFSSL_MSG("wc_AesGcmSetExtIV() failed");
6823
0
            ret = WOLFSSL_FAILURE;
6824
0
        }
6825
2.91k
    #ifdef WOLFSSL_AESGCM_STREAM
6826
        /*
6827
         * Initialize with key and IV if available. wc_AesGcmInit will fail
6828
         * if called with IV only and no key has been set.
6829
         */
6830
2.91k
        if (ret == WOLFSSL_SUCCESS &&
6831
2.91k
            (key || (iv && ctx->cipher.aes.gcmKeySet)) &&
6832
1.74k
            wc_AesGcmInit(&ctx->cipher.aes, key,
6833
1.74k
                          (key == NULL) ? 0 : (word32)ctx->keyLen, iv,
6834
1.74k
                          (iv == NULL) ? 0 : (word32)ctx->ivSz) != 0) {
6835
0
            WOLFSSL_MSG("wc_AesGcmInit() failed");
6836
0
            ret = WOLFSSL_FAILURE;
6837
0
        }
6838
2.91k
    #endif /* WOLFSSL_AESGCM_STREAM */
6839
6840
        /*
6841
         * OpenSSL clears this flag, which permits subsequent use of
6842
         * EVP_CTRL_GCM_IV_GEN, when EVP_CipherInit is called with no key.
6843
         * If a key is provided, the flag retains its value.
6844
         */
6845
2.91k
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
6846
1.93k
            ctx->authIvGenEnable = 0;
6847
1.93k
        }
6848
6849
2.91k
        return ret;
6850
2.91k
    }
6851
6852
    static int EvpCipherAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
6853
                               const byte* src, word32 len)
6854
0
    {
6855
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6856
6857
    #ifndef WOLFSSL_AESGCM_STREAM
6858
        /* No destination means only AAD. */
6859
        if (src != NULL && dst == NULL) {
6860
            ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
6861
        }
6862
        else if (src != NULL && dst != NULL) {
6863
            if (ctx->enc) {
6864
                ret = wc_AesGcmEncrypt(&ctx->cipher.aes, dst, src,
6865
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6866
                        ctx->authTagSz, ctx->authIn,
6867
                        ctx->authInSz);
6868
            }
6869
            else {
6870
                ret = wc_AesGcmDecrypt(&ctx->cipher.aes, dst, src,
6871
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6872
                        ctx->authTagSz, ctx->authIn,
6873
                        ctx->authInSz);
6874
            }
6875
            if (ctx->authIncIv) {
6876
                IncCtr((byte*)ctx->cipher.aes.reg,
6877
                       ctx->cipher.aes.nonceSz);
6878
                ctx->authIncIv = 0;
6879
            }
6880
        }
6881
    #else
6882
        /*
6883
         * No need to call wc_AesGcmInit. Should have been called by
6884
         * wolfSSL_EVP_CipherInit.
6885
         */
6886
        /* NULL dst and non-NULL src means only AAD. */
6887
0
        if (src != NULL && dst == NULL) {
6888
0
            if (ctx->enc) {
6889
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL,
6890
0
                    NULL, 0, src, len);
6891
0
            }
6892
0
            else {
6893
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL,
6894
0
                    NULL, 0, src, len);
6895
0
            }
6896
0
        }
6897
        /* Only plain/cipher text. */
6898
0
        else if (src != NULL && dst != NULL) {
6899
0
            if (ctx->enc) {
6900
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, dst, src,
6901
0
                    len, NULL, 0);
6902
0
            }
6903
0
            else {
6904
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, dst, src,
6905
0
                    len, NULL, 0);
6906
0
            }
6907
0
        }
6908
        /*
6909
         * src == NULL is analogous to other "final"-type functions
6910
         * (e.g. EVP_CipherFinal). Calculates tag on encrypt
6911
         * and checks tag on decrypt.
6912
         */
6913
0
        else {
6914
0
            if (ctx->enc) {
6915
                /* Calculate authentication tag. */
6916
0
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes,
6917
0
                    ctx->authTag, (word32)ctx->authTagSz);
6918
                /*
6919
                 * wc_AesGcmEncryptFinal increments the IV in
6920
                 * ctx->cipher.aes.reg, so we don't call IncCtr here.
6921
                 */
6922
0
            }
6923
0
            else {
6924
                /* Calculate authentication tag and compare. */
6925
0
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes,
6926
0
                    ctx->authTag, (word32)ctx->authTagSz);
6927
0
                if (ctx->authIncIv) {
6928
0
                    IncCtr((byte*)ctx->cipher.aes.reg,
6929
0
                           ctx->cipher.aes.nonceSz);
6930
0
                }
6931
0
            }
6932
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
6933
0
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
6934
0
                              (byte*)ctx->cipher.aes.reg,
6935
0
                              (word32)ctx->ivSz) != 0) {
6936
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
6937
0
                return WOLFSSL_FAILURE;
6938
0
            }
6939
0
            ctx->authIncIv = 0;
6940
0
        }
6941
0
    #endif /* WOLFSSL_AESGCM_STREAM */
6942
0
        if (src == NULL) {
6943
            /*
6944
             * Clear any leftover AAD on final (final is when src is
6945
             * NULL).
6946
             */
6947
0
            if (ctx->authIn != NULL) {
6948
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
6949
0
            }
6950
0
            ctx->authInSz = 0;
6951
0
        }
6952
0
        if (ret == 0) {
6953
0
            ret = (int)len;
6954
0
        }
6955
6956
0
        return ret;
6957
0
    }
6958
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
6959
        * HAVE_FIPS_VERSION >= 2 */
6960
6961
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
6962
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6963
    || FIPS_VERSION_GE(2,0))
6964
    static int EvpCipherInitAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6965
                                   const WOLFSSL_EVP_CIPHER* type,
6966
                                   const byte* key, const byte* iv, int enc)
6967
0
    {
6968
0
        int ret = WOLFSSL_SUCCESS;
6969
6970
0
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6971
0
        ctx->authIn = NULL;
6972
0
        ctx->authInSz = 0;
6973
6974
0
        ctx->block_size = WC_AES_BLOCK_SIZE;
6975
0
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6976
0
        if (ctx->ivSz == 0) {
6977
0
            ctx->ivSz = GCM_NONCE_MID_SZ;
6978
0
        }
6979
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6980
0
        ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
6981
0
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6982
0
        if (enc == 0 || enc == 1) {
6983
0
            ctx->enc = enc ? 1 : 0;
6984
0
        }
6985
6986
0
    #ifdef WOLFSSL_AES_128
6987
0
        if (ctx->cipherType == WC_AES_128_CCM_TYPE ||
6988
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))) {
6989
0
            WOLFSSL_MSG("EVP_AES_128_CCM");
6990
0
            ctx->cipherType = WC_AES_128_CCM_TYPE;
6991
0
            ctx->keyLen = AES_128_KEY_SIZE;
6992
0
        }
6993
0
    #endif
6994
0
    #ifdef WOLFSSL_AES_192
6995
0
        if (ctx->cipherType == WC_AES_192_CCM_TYPE ||
6996
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))) {
6997
0
            WOLFSSL_MSG("EVP_AES_192_CCM");
6998
0
            ctx->cipherType = WC_AES_192_CCM_TYPE;
6999
0
            ctx->keyLen = AES_192_KEY_SIZE;
7000
0
        }
7001
0
    #endif
7002
0
    #ifdef WOLFSSL_AES_256
7003
0
        if (ctx->cipherType == WC_AES_256_CCM_TYPE ||
7004
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))) {
7005
0
            WOLFSSL_MSG("EVP_AES_256_CCM");
7006
0
            ctx->cipherType = WC_AES_256_CCM_TYPE;
7007
0
            ctx->keyLen = AES_256_KEY_SIZE;
7008
0
        }
7009
0
    #endif
7010
7011
0
        if (ret == WOLFSSL_SUCCESS) {
7012
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7013
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) {
7014
0
                    WOLFSSL_MSG("wc_AesInit() failed");
7015
0
                    ret = WOLFSSL_FAILURE;
7016
0
                } else
7017
0
                    ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7018
0
            }
7019
0
        }
7020
7021
0
        if (ret == WOLFSSL_SUCCESS && key &&
7022
0
            wc_AesCcmSetKey(&ctx->cipher.aes, key, (word32)ctx->keyLen)) {
7023
0
            WOLFSSL_MSG("wc_AesCcmSetKey() failed");
7024
0
            ret = WOLFSSL_FAILURE;
7025
0
        }
7026
0
        if (ret == WOLFSSL_SUCCESS && iv &&
7027
0
            wc_AesCcmSetNonce(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
7028
0
            WOLFSSL_MSG("wc_AesCcmSetNonce() failed");
7029
0
            ret = WOLFSSL_FAILURE;
7030
0
        }
7031
7032
        /*
7033
         * OpenSSL clears this flag, which permits subsequent use of
7034
         * EVP_CTRL_CCM_IV_GEN, when EVP_CipherInit is called with no key.
7035
         * If a key is provided, the flag retains its value.
7036
         */
7037
0
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
7038
0
            ctx->authIvGenEnable = 0;
7039
0
        }
7040
7041
0
        return ret;
7042
0
    }
7043
7044
    static int EvpCipherAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
7045
                               const byte* src, word32 len)
7046
0
    {
7047
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
7048
7049
        /* No destination means only AAD. */
7050
0
        if (src != NULL && dst == NULL) {
7051
0
            ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, (int)len);
7052
0
        }
7053
0
        else if (src != NULL && dst != NULL) {
7054
0
            if (ctx->enc) {
7055
0
                ret = wc_AesCcmEncrypt(&ctx->cipher.aes, dst, src,
7056
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7057
0
                        (word32)ctx->authTagSz, ctx->authIn,
7058
0
                        (word32)ctx->authInSz);
7059
0
            }
7060
0
            else {
7061
0
                ret = wc_AesCcmDecrypt(&ctx->cipher.aes, dst, src,
7062
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7063
0
                        (word32)ctx->authTagSz, ctx->authIn,
7064
0
                        (word32)ctx->authInSz);
7065
0
            }
7066
0
            if (ctx->authIncIv) {
7067
0
                IncCtr((byte*)ctx->cipher.aes.reg,
7068
0
                       ctx->cipher.aes.nonceSz);
7069
0
                ctx->authIncIv = 0;
7070
0
            }
7071
0
        }
7072
0
        if (src == NULL) {
7073
            /*
7074
             * Clear any leftover AAD on final (final is when src is
7075
             * NULL).
7076
             */
7077
0
            if (ctx->authIn != NULL) {
7078
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
7079
0
            }
7080
0
            ctx->authInSz = 0;
7081
0
        }
7082
0
        if (ret == 0) {
7083
0
            ret = (int)len;
7084
0
        }
7085
7086
0
        return ret;
7087
0
    }
7088
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7089
        * HAVE_FIPS_VERSION >= 2 */
7090
7091
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7092
    || FIPS_VERSION_GE(2,0))
7093
    static int EvpCipherInitAriaGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
7094
                                    const WOLFSSL_EVP_CIPHER* type,
7095
                                    const byte* key, const byte* iv, int enc)
7096
    {
7097
        int ret = WOLFSSL_SUCCESS;
7098
7099
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7100
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))) {
7101
            WOLFSSL_MSG("EVP_ARIA_128_GCM");
7102
            ctx->cipherType = WC_ARIA_128_GCM_TYPE;
7103
            ctx->keyLen = ARIA_128_KEY_SIZE;
7104
        } else if (ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7105
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))) {
7106
            WOLFSSL_MSG("EVP_ARIA_192_GCM");
7107
            ctx->cipherType = WC_ARIA_192_GCM_TYPE;
7108
            ctx->keyLen = ARIA_192_KEY_SIZE;
7109
        } else if (ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7110
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))) {
7111
            WOLFSSL_MSG("EVP_ARIA_256_GCM");
7112
            ctx->cipherType = WC_ARIA_256_GCM_TYPE;
7113
            ctx->keyLen = ARIA_256_KEY_SIZE;
7114
        } else {
7115
            WOLFSSL_MSG("Unrecognized cipher type");
7116
            return WOLFSSL_FAILURE;
7117
        }
7118
7119
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
7120
        ctx->authIn = NULL;
7121
        ctx->authInSz = 0;
7122
7123
        ctx->block_size = WC_AES_BLOCK_SIZE;
7124
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
7125
        if (ctx->ivSz == 0) {
7126
            ctx->ivSz = GCM_NONCE_MID_SZ;
7127
        }
7128
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7129
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
7130
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
7131
        if (enc == 0 || enc == 1) {
7132
            ctx->enc = enc ? 1 : 0;
7133
        }
7134
7135
        switch(ctx->cipherType) {
7136
            case WC_ARIA_128_GCM_TYPE:
7137
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_128BITKEY);
7138
                break;
7139
            case WC_ARIA_192_GCM_TYPE:
7140
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_192BITKEY);
7141
                break;
7142
            case WC_ARIA_256_GCM_TYPE:
7143
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_256BITKEY);
7144
                break;
7145
            default:
7146
                WOLFSSL_MSG("Unimplemented cipherType");
7147
                return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */
7148
        }
7149
        if (ret != 0) {
7150
            WOLFSSL_MSG(MC_GetErrorString(ret));
7151
            WOLFSSL_MSG(MC_GetError(ctx->cipher.aria.hSession));
7152
            return WOLFSSL_FAILURE;
7153
        }
7154
7155
        if (key && wc_AriaSetKey(&ctx->cipher.aria, (byte *)key)) {
7156
            WOLFSSL_MSG("wc_AriaSetKey() failed");
7157
            return WOLFSSL_FAILURE;
7158
        }
7159
        if (iv && wc_AriaGcmSetExtIV(&ctx->cipher.aria, iv, ctx->ivSz)) {
7160
            WOLFSSL_MSG("wc_AriaGcmSetIV() failed");
7161
            return WOLFSSL_FAILURE;
7162
        }
7163
7164
        return WOLFSSL_SUCCESS;
7165
    }
7166
#endif /* HAVE_ARIA && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7167
        * HAVE_FIPS_VERSION >= 2 */
7168
7169
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
7170
    int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
7171
                               const WOLFSSL_EVP_CIPHER* type, const byte* key,
7172
                               const byte* iv, int enc)
7173
13.5k
    {
7174
13.5k
        int ret = 0;
7175
13.5k
        (void)key;
7176
13.5k
        (void)iv;
7177
13.5k
        (void)enc;
7178
7179
13.5k
        WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
7180
13.5k
        if (ctx == NULL) {
7181
0
            WOLFSSL_MSG("no ctx");
7182
0
            return WOLFSSL_FAILURE;
7183
0
        }
7184
7185
13.5k
        if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
7186
0
            WOLFSSL_MSG("no type set");
7187
0
            return WOLFSSL_FAILURE;
7188
0
        }
7189
13.5k
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
7190
            /* only first EVP_CipherInit invoke. ctx->cipherType is set below */
7191
5.30k
            XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
7192
5.30k
            ctx->flags   = 0;
7193
5.30k
        }
7194
7195
        /* always clear buffer state */
7196
13.5k
        ctx->bufUsed = 0;
7197
13.5k
        ctx->lastUsed = 0;
7198
7199
13.5k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
7200
13.5k
        if (!iv && ctx->ivSz) {
7201
2.23k
            iv = ctx->iv;
7202
2.23k
        }
7203
13.5k
#endif
7204
7205
13.5k
#ifndef NO_AES
7206
13.5k
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
7207
13.5k
        #ifdef WOLFSSL_AES_128
7208
13.5k
        if (ctx->cipherType == WC_AES_128_CBC_TYPE ||
7209
13.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CBC))) {
7210
600
            WOLFSSL_MSG("EVP_AES_128_CBC");
7211
600
            ctx->cipherType = WC_AES_128_CBC_TYPE;
7212
600
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7213
600
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7214
600
            ctx->keyLen     = 16;
7215
600
            ctx->block_size = WC_AES_BLOCK_SIZE;
7216
600
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7217
600
            if (enc == 0 || enc == 1)
7218
496
                ctx->enc = enc ? 1 : 0;
7219
600
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7220
329
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7221
0
                    return WOLFSSL_FAILURE;
7222
329
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7223
329
            }
7224
600
            if (key) {
7225
322
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7226
322
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7227
322
                if (ret != 0)
7228
0
                    return WOLFSSL_FAILURE;
7229
322
            }
7230
600
            if (iv && key == NULL) {
7231
104
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7232
104
                if (ret != 0)
7233
0
                    return WOLFSSL_FAILURE;
7234
104
            }
7235
600
        }
7236
13.5k
        #endif /* WOLFSSL_AES_128 */
7237
13.5k
        #ifdef WOLFSSL_AES_192
7238
13.5k
        if (ctx->cipherType == WC_AES_192_CBC_TYPE ||
7239
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CBC))) {
7240
195
            WOLFSSL_MSG("EVP_AES_192_CBC");
7241
195
            ctx->cipherType = WC_AES_192_CBC_TYPE;
7242
195
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7243
195
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7244
195
            ctx->keyLen     = 24;
7245
195
            ctx->block_size = WC_AES_BLOCK_SIZE;
7246
195
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7247
195
            if (enc == 0 || enc == 1)
7248
153
                ctx->enc = enc ? 1 : 0;
7249
195
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7250
109
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7251
0
                    return WOLFSSL_FAILURE;
7252
109
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7253
109
            }
7254
195
            if (key) {
7255
102
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7256
102
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7257
102
                if (ret != 0)
7258
0
                    return WOLFSSL_FAILURE;
7259
102
            }
7260
195
            if (iv && key == NULL) {
7261
42
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7262
42
                if (ret != 0)
7263
0
                    return WOLFSSL_FAILURE;
7264
42
            }
7265
195
        }
7266
13.5k
        #endif /* WOLFSSL_AES_192 */
7267
13.5k
        #ifdef WOLFSSL_AES_256
7268
13.5k
        if (ctx->cipherType == WC_AES_256_CBC_TYPE ||
7269
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CBC))) {
7270
221
            WOLFSSL_MSG("EVP_AES_256_CBC");
7271
221
            ctx->cipherType = WC_AES_256_CBC_TYPE;
7272
221
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7273
221
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7274
221
            ctx->keyLen     = 32;
7275
221
            ctx->block_size = WC_AES_BLOCK_SIZE;
7276
221
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7277
221
            if (enc == 0 || enc == 1)
7278
179
                ctx->enc = enc ? 1 : 0;
7279
221
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7280
110
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7281
0
                    return WOLFSSL_FAILURE;
7282
110
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7283
110
            }
7284
221
            if (key) {
7285
97
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7286
97
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7287
97
                if (ret != 0){
7288
0
                    WOLFSSL_MSG("AesSetKey() failed");
7289
0
                    return WOLFSSL_FAILURE;
7290
0
                }
7291
97
            }
7292
221
            if (iv && key == NULL) {
7293
42
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7294
42
                if (ret != 0){
7295
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7296
0
                    return WOLFSSL_FAILURE;
7297
0
                }
7298
42
            }
7299
221
        }
7300
13.5k
        #endif /* WOLFSSL_AES_256 */
7301
13.5k
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
7302
13.5k
    #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7303
13.5k
        || FIPS_VERSION_GE(2,0))
7304
13.5k
        if (FALSE
7305
13.5k
        #ifdef WOLFSSL_AES_128
7306
13.5k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
7307
12.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))
7308
12.2k
        #endif
7309
12.2k
        #ifdef WOLFSSL_AES_192
7310
12.2k
            || ctx->cipherType == WC_AES_192_GCM_TYPE ||
7311
12.1k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))
7312
11.9k
        #endif
7313
11.9k
        #ifdef WOLFSSL_AES_256
7314
11.9k
            || ctx->cipherType == WC_AES_256_GCM_TYPE ||
7315
11.0k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))
7316
13.5k
        #endif
7317
13.5k
          ) {
7318
2.91k
            if (EvpCipherInitAesGCM(ctx, type, key, iv, enc)
7319
2.91k
                != WOLFSSL_SUCCESS) {
7320
0
                return WOLFSSL_FAILURE;
7321
0
            }
7322
2.91k
        }
7323
13.5k
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7324
            * HAVE_FIPS_VERSION >= 2 */
7325
13.5k
    #if defined(HAVE_AESCCM) && \
7326
13.5k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7327
13.5k
            || FIPS_VERSION_GE(2,0))
7328
13.5k
        if (FALSE
7329
13.5k
        #ifdef WOLFSSL_AES_128
7330
13.5k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
7331
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))
7332
13.5k
        #endif
7333
13.5k
        #ifdef WOLFSSL_AES_192
7334
13.5k
            || ctx->cipherType == WC_AES_192_CCM_TYPE ||
7335
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))
7336
13.5k
        #endif
7337
13.5k
        #ifdef WOLFSSL_AES_256
7338
13.5k
            || ctx->cipherType == WC_AES_256_CCM_TYPE ||
7339
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))
7340
13.5k
        #endif
7341
13.5k
          )
7342
0
        {
7343
0
            if (EvpCipherInitAesCCM(ctx, type, key, iv, enc)
7344
0
                != WOLFSSL_SUCCESS) {
7345
0
                return WOLFSSL_FAILURE;
7346
0
            }
7347
0
        }
7348
13.5k
    #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7349
            * HAVE_FIPS_VERSION >= 2 */
7350
13.5k
#ifdef WOLFSSL_AES_COUNTER
7351
13.5k
        #ifdef WOLFSSL_AES_128
7352
13.5k
        if (ctx->cipherType == WC_AES_128_CTR_TYPE ||
7353
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CTR))) {
7354
188
            WOLFSSL_MSG("EVP_AES_128_CTR");
7355
188
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7356
188
            ctx->cipherType = WC_AES_128_CTR_TYPE;
7357
188
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7358
188
            ctx->keyLen     = 16;
7359
188
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7360
188
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7361
188
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7362
188
            ctx->cipher.aes.left = 0;
7363
188
#endif
7364
188
            if (enc == 0 || enc == 1)
7365
135
                ctx->enc = enc ? 1 : 0;
7366
188
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7367
76
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7368
0
                    return WOLFSSL_FAILURE;
7369
76
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7370
76
            }
7371
188
            if (key) {
7372
59
                ret =  AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7373
59
                    iv, AES_ENCRYPTION, 1);
7374
59
                if (ret != 0)
7375
0
                    return WOLFSSL_FAILURE;
7376
59
            }
7377
188
            if (iv && key == NULL) {
7378
53
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7379
53
                if (ret != 0)
7380
0
                    return WOLFSSL_FAILURE;
7381
53
            }
7382
188
        }
7383
13.5k
        #endif /* WOLFSSL_AES_128 */
7384
13.5k
        #ifdef WOLFSSL_AES_192
7385
13.5k
        if (ctx->cipherType == WC_AES_192_CTR_TYPE ||
7386
12.8k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CTR))) {
7387
1.13k
            WOLFSSL_MSG("EVP_AES_192_CTR");
7388
1.13k
            ctx->cipherType = WC_AES_192_CTR_TYPE;
7389
1.13k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7390
1.13k
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7391
1.13k
            ctx->keyLen     = 24;
7392
1.13k
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7393
1.13k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7394
1.13k
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7395
1.13k
            ctx->cipher.aes.left = 0;
7396
1.13k
#endif
7397
1.13k
            if (enc == 0 || enc == 1)
7398
761
                ctx->enc = enc ? 1 : 0;
7399
1.13k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7400
385
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7401
0
                    return WOLFSSL_FAILURE;
7402
385
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7403
385
            }
7404
1.13k
            if (key) {
7405
376
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7406
376
                    iv, AES_ENCRYPTION, 1);
7407
376
                if (ret != 0)
7408
0
                    return WOLFSSL_FAILURE;
7409
376
            }
7410
1.13k
            if (iv && key == NULL) {
7411
372
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7412
372
                if (ret != 0)
7413
0
                    return WOLFSSL_FAILURE;
7414
372
            }
7415
1.13k
        }
7416
13.5k
        #endif /* WOLFSSL_AES_192 */
7417
13.5k
        #ifdef WOLFSSL_AES_256
7418
13.5k
        if (ctx->cipherType == WC_AES_256_CTR_TYPE ||
7419
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CTR))) {
7420
143
            WOLFSSL_MSG("EVP_AES_256_CTR");
7421
143
            ctx->cipherType = WC_AES_256_CTR_TYPE;
7422
143
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7423
143
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7424
143
            ctx->keyLen     = 32;
7425
143
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7426
143
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7427
143
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7428
143
            ctx->cipher.aes.left = 0;
7429
143
#endif
7430
143
            if (enc == 0 || enc == 1)
7431
106
                ctx->enc = enc ? 1 : 0;
7432
143
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7433
61
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7434
0
                    return WOLFSSL_FAILURE;
7435
61
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7436
61
            }
7437
143
            if (key) {
7438
45
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7439
45
                    iv, AES_ENCRYPTION, 1);
7440
45
                if (ret != 0)
7441
0
                    return WOLFSSL_FAILURE;
7442
45
            }
7443
143
            if (iv && key == NULL) {
7444
37
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7445
37
                if (ret != 0)
7446
0
                    return WOLFSSL_FAILURE;
7447
37
            }
7448
143
        }
7449
13.5k
        #endif /* WOLFSSL_AES_256 */
7450
13.5k
#endif /* WOLFSSL_AES_COUNTER */
7451
13.5k
    #ifdef HAVE_AES_ECB
7452
13.5k
        #ifdef WOLFSSL_AES_128
7453
13.5k
        if (ctx->cipherType == WC_AES_128_ECB_TYPE ||
7454
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_ECB))) {
7455
129
            WOLFSSL_MSG("EVP_AES_128_ECB");
7456
129
            ctx->cipherType = WC_AES_128_ECB_TYPE;
7457
129
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7458
129
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7459
129
            ctx->keyLen     = 16;
7460
129
            ctx->block_size = WC_AES_BLOCK_SIZE;
7461
129
            if (enc == 0 || enc == 1)
7462
113
                ctx->enc = enc ? 1 : 0;
7463
129
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7464
73
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7465
0
                    return WOLFSSL_FAILURE;
7466
73
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7467
73
            }
7468
129
            if (key) {
7469
40
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7470
40
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7471
40
            }
7472
129
            if (ret != 0)
7473
0
                return WOLFSSL_FAILURE;
7474
129
        }
7475
13.5k
        #endif /* WOLFSSL_AES_128 */
7476
13.5k
        #ifdef WOLFSSL_AES_192
7477
13.5k
        if (ctx->cipherType == WC_AES_192_ECB_TYPE ||
7478
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_ECB))) {
7479
153
            WOLFSSL_MSG("EVP_AES_192_ECB");
7480
153
            ctx->cipherType = WC_AES_192_ECB_TYPE;
7481
153
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7482
153
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7483
153
            ctx->keyLen     = 24;
7484
153
            ctx->block_size = WC_AES_BLOCK_SIZE;
7485
153
            if (enc == 0 || enc == 1)
7486
111
                ctx->enc = enc ? 1 : 0;
7487
153
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7488
62
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7489
0
                    return WOLFSSL_FAILURE;
7490
62
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7491
62
            }
7492
153
            if (key) {
7493
49
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7494
49
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7495
49
            }
7496
153
            if (ret != 0)
7497
0
                return WOLFSSL_FAILURE;
7498
153
        }
7499
13.5k
        #endif /* WOLFSSL_AES_192 */
7500
13.5k
        #ifdef WOLFSSL_AES_256
7501
13.5k
        if (ctx->cipherType == WC_AES_256_ECB_TYPE ||
7502
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_ECB))) {
7503
114
            WOLFSSL_MSG("EVP_AES_256_ECB");
7504
114
            ctx->cipherType = WC_AES_256_ECB_TYPE;
7505
114
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7506
114
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7507
114
            ctx->keyLen     = 32;
7508
114
            ctx->block_size = WC_AES_BLOCK_SIZE;
7509
114
            if (enc == 0 || enc == 1)
7510
99
                ctx->enc = enc ? 1 : 0;
7511
114
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7512
62
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7513
0
                    return WOLFSSL_FAILURE;
7514
62
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7515
62
            }
7516
114
            if (key) {
7517
37
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7518
37
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7519
37
            }
7520
114
            if (ret != 0)
7521
0
                return WOLFSSL_FAILURE;
7522
114
        }
7523
13.5k
        #endif /* WOLFSSL_AES_256 */
7524
13.5k
    #endif /* HAVE_AES_ECB */
7525
13.5k
    #ifdef WOLFSSL_AES_CFB
7526
13.5k
    #ifndef WOLFSSL_NO_AES_CFB_1_8
7527
13.5k
        #ifdef WOLFSSL_AES_128
7528
13.5k
        if (ctx->cipherType == WC_AES_128_CFB1_TYPE ||
7529
13.3k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB1))) {
7530
427
            WOLFSSL_MSG("EVP_AES_128_CFB1");
7531
427
            ctx->cipherType = WC_AES_128_CFB1_TYPE;
7532
427
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7533
427
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7534
427
            ctx->keyLen     = 16;
7535
427
            ctx->block_size = 1;
7536
427
            if (enc == 0 || enc == 1)
7537
324
                ctx->enc = enc ? 1 : 0;
7538
427
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7539
171
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7540
0
                    return WOLFSSL_FAILURE;
7541
171
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7542
171
            }
7543
427
            if (key) {
7544
153
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7545
153
                    iv, AES_ENCRYPTION, 0);
7546
153
                if (ret != 0)
7547
0
                    return WOLFSSL_FAILURE;
7548
153
            }
7549
427
            if (iv && key == NULL) {
7550
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7551
0
                if (ret != 0)
7552
0
                    return WOLFSSL_FAILURE;
7553
0
            }
7554
427
        }
7555
13.5k
        #endif /* WOLFSSL_AES_128 */
7556
13.5k
        #ifdef WOLFSSL_AES_192
7557
13.5k
        if (ctx->cipherType == WC_AES_192_CFB1_TYPE ||
7558
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB1))) {
7559
122
            WOLFSSL_MSG("EVP_AES_192_CFB1");
7560
122
            ctx->cipherType = WC_AES_192_CFB1_TYPE;
7561
122
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7562
122
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7563
122
            ctx->keyLen     = 24;
7564
122
            ctx->block_size = 1;
7565
122
            if (enc == 0 || enc == 1)
7566
90
                ctx->enc = enc ? 1 : 0;
7567
122
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7568
50
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7569
0
                    return WOLFSSL_FAILURE;
7570
50
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7571
50
            }
7572
122
            if (key) {
7573
40
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7574
40
                    iv, AES_ENCRYPTION, 0);
7575
40
                if (ret != 0)
7576
0
                    return WOLFSSL_FAILURE;
7577
40
            }
7578
122
            if (iv && key == NULL) {
7579
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7580
0
                if (ret != 0)
7581
0
                    return WOLFSSL_FAILURE;
7582
0
            }
7583
122
        }
7584
13.5k
        #endif /* WOLFSSL_AES_192 */
7585
13.5k
        #ifdef WOLFSSL_AES_256
7586
13.5k
        if (ctx->cipherType == WC_AES_256_CFB1_TYPE ||
7587
13.2k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB1))) {
7588
458
            WOLFSSL_MSG("EVP_AES_256_CFB1");
7589
458
            ctx->cipherType = WC_AES_256_CFB1_TYPE;
7590
458
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7591
458
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7592
458
            ctx->keyLen     = 32;
7593
458
            ctx->block_size = 1;
7594
458
            if (enc == 0 || enc == 1)
7595
318
                ctx->enc = enc ? 1 : 0;
7596
458
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7597
165
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7598
0
                    return WOLFSSL_FAILURE;
7599
165
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7600
165
            }
7601
458
            if (key) {
7602
153
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7603
153
                    iv, AES_ENCRYPTION, 0);
7604
153
                if (ret != 0){
7605
0
                    WOLFSSL_MSG("AesSetKey() failed");
7606
0
                    return WOLFSSL_FAILURE;
7607
0
                }
7608
153
            }
7609
458
            if (iv && key == NULL) {
7610
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7611
0
                if (ret != 0){
7612
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7613
0
                    return WOLFSSL_FAILURE;
7614
0
                }
7615
0
            }
7616
458
        }
7617
13.5k
        #endif /* WOLFSSL_AES_256 */
7618
13.5k
        #ifdef WOLFSSL_AES_128
7619
13.5k
        if (ctx->cipherType == WC_AES_128_CFB8_TYPE ||
7620
13.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB8))) {
7621
501
            WOLFSSL_MSG("EVP_AES_128_CFB8");
7622
501
            ctx->cipherType = WC_AES_128_CFB8_TYPE;
7623
501
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7624
501
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7625
501
            ctx->keyLen     = 16;
7626
501
            ctx->block_size = 1;
7627
501
            if (enc == 0 || enc == 1)
7628
346
                ctx->enc = enc ? 1 : 0;
7629
501
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7630
187
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7631
0
                    return WOLFSSL_FAILURE;
7632
187
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7633
187
            }
7634
501
            if (key) {
7635
159
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7636
159
                    iv, AES_ENCRYPTION, 0);
7637
159
                if (ret != 0)
7638
0
                    return WOLFSSL_FAILURE;
7639
159
            }
7640
501
            if (iv && key == NULL) {
7641
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7642
0
                if (ret != 0)
7643
0
                    return WOLFSSL_FAILURE;
7644
0
            }
7645
501
        }
7646
13.5k
        #endif /* WOLFSSL_AES_128 */
7647
13.5k
        #ifdef WOLFSSL_AES_192
7648
13.5k
        if (ctx->cipherType == WC_AES_192_CFB8_TYPE ||
7649
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB8))) {
7650
364
            WOLFSSL_MSG("EVP_AES_192_CFB8");
7651
364
            ctx->cipherType = WC_AES_192_CFB8_TYPE;
7652
364
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7653
364
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7654
364
            ctx->keyLen     = 24;
7655
364
            ctx->block_size = 1;
7656
364
            if (enc == 0 || enc == 1)
7657
249
                ctx->enc = enc ? 1 : 0;
7658
364
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7659
130
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7660
0
                    return WOLFSSL_FAILURE;
7661
130
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7662
130
            }
7663
364
            if (key) {
7664
119
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7665
119
                    iv, AES_ENCRYPTION, 0);
7666
119
                if (ret != 0)
7667
0
                    return WOLFSSL_FAILURE;
7668
119
            }
7669
364
            if (iv && key == NULL) {
7670
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7671
0
                if (ret != 0)
7672
0
                    return WOLFSSL_FAILURE;
7673
0
            }
7674
364
        }
7675
13.5k
        #endif /* WOLFSSL_AES_192 */
7676
13.5k
        #ifdef WOLFSSL_AES_256
7677
13.5k
        if (ctx->cipherType == WC_AES_256_CFB8_TYPE ||
7678
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB8))) {
7679
255
            WOLFSSL_MSG("EVP_AES_256_CFB8");
7680
255
            ctx->cipherType = WC_AES_256_CFB8_TYPE;
7681
255
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7682
255
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7683
255
            ctx->keyLen     = 32;
7684
255
            ctx->block_size = 1;
7685
255
            if (enc == 0 || enc == 1)
7686
202
                ctx->enc = enc ? 1 : 0;
7687
255
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7688
142
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7689
0
                    return WOLFSSL_FAILURE;
7690
142
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7691
142
            }
7692
255
            if (key) {
7693
60
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7694
60
                    iv, AES_ENCRYPTION, 0);
7695
60
                if (ret != 0){
7696
0
                    WOLFSSL_MSG("AesSetKey() failed");
7697
0
                    return WOLFSSL_FAILURE;
7698
0
                }
7699
60
            }
7700
255
            if (iv && key == NULL) {
7701
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7702
0
                if (ret != 0){
7703
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7704
0
                    return WOLFSSL_FAILURE;
7705
0
                }
7706
0
            }
7707
255
        }
7708
13.5k
        #endif /* WOLFSSL_AES_256 */
7709
13.5k
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
7710
13.5k
        #ifdef WOLFSSL_AES_128
7711
13.5k
        if (ctx->cipherType == WC_AES_128_CFB128_TYPE ||
7712
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB128))) {
7713
0
            WOLFSSL_MSG("EVP_AES_128_CFB128");
7714
0
            ctx->cipherType = WC_AES_128_CFB128_TYPE;
7715
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7716
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7717
0
            ctx->keyLen     = 16;
7718
0
            ctx->block_size = 1;
7719
0
            if (enc == 0 || enc == 1)
7720
0
                ctx->enc = enc ? 1 : 0;
7721
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7722
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7723
0
                    return WOLFSSL_FAILURE;
7724
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7725
0
            }
7726
0
            if (key) {
7727
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7728
0
                    iv, AES_ENCRYPTION, 0);
7729
0
                if (ret != 0)
7730
0
                    return WOLFSSL_FAILURE;
7731
0
            }
7732
0
            if (iv && key == NULL) {
7733
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7734
0
                if (ret != 0)
7735
0
                    return WOLFSSL_FAILURE;
7736
0
            }
7737
0
        }
7738
13.5k
        #endif /* WOLFSSL_AES_128 */
7739
13.5k
        #ifdef WOLFSSL_AES_192
7740
13.5k
        if (ctx->cipherType == WC_AES_192_CFB128_TYPE ||
7741
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB128))) {
7742
0
            WOLFSSL_MSG("EVP_AES_192_CFB128");
7743
0
            ctx->cipherType = WC_AES_192_CFB128_TYPE;
7744
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7745
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7746
0
            ctx->keyLen     = 24;
7747
0
            ctx->block_size = 1;
7748
0
            if (enc == 0 || enc == 1)
7749
0
                ctx->enc = enc ? 1 : 0;
7750
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7751
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7752
0
                    return WOLFSSL_FAILURE;
7753
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7754
0
            }
7755
0
            if (key) {
7756
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7757
0
                    iv, AES_ENCRYPTION, 0);
7758
0
                if (ret != 0)
7759
0
                    return WOLFSSL_FAILURE;
7760
0
            }
7761
0
            if (iv && key == NULL) {
7762
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7763
0
                if (ret != 0)
7764
0
                    return WOLFSSL_FAILURE;
7765
0
            }
7766
0
        }
7767
13.5k
        #endif /* WOLFSSL_AES_192 */
7768
13.5k
        #ifdef WOLFSSL_AES_256
7769
13.5k
        if (ctx->cipherType == WC_AES_256_CFB128_TYPE ||
7770
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB128))) {
7771
0
            WOLFSSL_MSG("EVP_AES_256_CFB128");
7772
0
            ctx->cipherType = WC_AES_256_CFB128_TYPE;
7773
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7774
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7775
0
            ctx->keyLen     = 32;
7776
0
            ctx->block_size = 1;
7777
0
            if (enc == 0 || enc == 1)
7778
0
                ctx->enc = enc ? 1 : 0;
7779
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7780
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7781
0
                    return WOLFSSL_FAILURE;
7782
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7783
0
            }
7784
0
            if (key) {
7785
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7786
0
                    iv, AES_ENCRYPTION, 0);
7787
0
                if (ret != 0){
7788
0
                    WOLFSSL_MSG("AesSetKey() failed");
7789
0
                    return WOLFSSL_FAILURE;
7790
0
                }
7791
0
            }
7792
0
            if (iv && key == NULL) {
7793
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7794
0
                if (ret != 0){
7795
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7796
0
                    return WOLFSSL_FAILURE;
7797
0
                }
7798
0
            }
7799
0
        }
7800
13.5k
        #endif /* WOLFSSL_AES_256 */
7801
13.5k
    #endif /* WOLFSSL_AES_CFB */
7802
13.5k
    #ifdef WOLFSSL_AES_OFB
7803
13.5k
        #ifdef WOLFSSL_AES_128
7804
13.5k
        if (ctx->cipherType == WC_AES_128_OFB_TYPE ||
7805
13.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_OFB))) {
7806
493
            WOLFSSL_MSG("EVP_AES_128_OFB");
7807
493
            ctx->cipherType = WC_AES_128_OFB_TYPE;
7808
493
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7809
493
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7810
493
            ctx->keyLen     = 16;
7811
493
            ctx->block_size = 1;
7812
493
            if (enc == 0 || enc == 1)
7813
338
                ctx->enc = enc ? 1 : 0;
7814
493
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7815
178
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7816
0
                    return WOLFSSL_FAILURE;
7817
178
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7818
178
            }
7819
493
            if (key) {
7820
160
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7821
160
                    iv, AES_ENCRYPTION, 0);
7822
160
                if (ret != 0)
7823
0
                    return WOLFSSL_FAILURE;
7824
160
            }
7825
493
            if (iv && key == NULL) {
7826
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7827
0
                if (ret != 0)
7828
0
                    return WOLFSSL_FAILURE;
7829
0
            }
7830
493
        }
7831
13.5k
        #endif /* WOLFSSL_AES_128 */
7832
13.5k
        #ifdef WOLFSSL_AES_192
7833
13.5k
        if (ctx->cipherType == WC_AES_192_OFB_TYPE ||
7834
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_OFB))) {
7835
354
            WOLFSSL_MSG("EVP_AES_192_OFB");
7836
354
            ctx->cipherType = WC_AES_192_OFB_TYPE;
7837
354
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7838
354
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7839
354
            ctx->keyLen     = 24;
7840
354
            ctx->block_size = 1;
7841
354
            if (enc == 0 || enc == 1)
7842
243
                ctx->enc = enc ? 1 : 0;
7843
354
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7844
128
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7845
0
                    return WOLFSSL_FAILURE;
7846
128
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7847
128
            }
7848
354
            if (key) {
7849
115
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7850
115
                    iv, AES_ENCRYPTION, 0);
7851
115
                if (ret != 0)
7852
0
                    return WOLFSSL_FAILURE;
7853
115
            }
7854
354
            if (iv && key == NULL) {
7855
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7856
0
                if (ret != 0)
7857
0
                    return WOLFSSL_FAILURE;
7858
0
            }
7859
354
        }
7860
13.5k
        #endif /* WOLFSSL_AES_192 */
7861
13.5k
        #ifdef WOLFSSL_AES_256
7862
13.5k
        if (ctx->cipherType == WC_AES_256_OFB_TYPE ||
7863
13.0k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_OFB))) {
7864
816
            WOLFSSL_MSG("EVP_AES_256_OFB");
7865
816
            ctx->cipherType = WC_AES_256_OFB_TYPE;
7866
816
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7867
816
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7868
816
            ctx->keyLen     = 32;
7869
816
            ctx->block_size = 1;
7870
816
            if (enc == 0 || enc == 1)
7871
551
                ctx->enc = enc ? 1 : 0;
7872
816
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7873
283
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7874
0
                    return WOLFSSL_FAILURE;
7875
283
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7876
283
            }
7877
816
            if (key) {
7878
268
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7879
268
                    iv, AES_ENCRYPTION, 0);
7880
268
                if (ret != 0){
7881
0
                    WOLFSSL_MSG("AesSetKey() failed");
7882
0
                    return WOLFSSL_FAILURE;
7883
0
                }
7884
268
            }
7885
816
            if (iv && key == NULL) {
7886
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7887
0
                if (ret != 0){
7888
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7889
0
                    return WOLFSSL_FAILURE;
7890
0
                }
7891
0
            }
7892
816
        }
7893
13.5k
        #endif /* WOLFSSL_AES_256 */
7894
13.5k
    #endif /* WOLFSSL_AES_OFB */
7895
13.5k
        #if defined(WOLFSSL_AES_XTS) && \
7896
13.5k
            (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
7897
13.5k
        #ifdef WOLFSSL_AES_128
7898
13.5k
        if (ctx->cipherType == WC_AES_128_XTS_TYPE ||
7899
12.8k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_XTS))) {
7900
1.08k
            WOLFSSL_MSG("EVP_AES_128_XTS");
7901
1.08k
            ctx->cipherType = WC_AES_128_XTS_TYPE;
7902
1.08k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7903
1.08k
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7904
1.08k
            ctx->keyLen     = 32;
7905
1.08k
            ctx->block_size = 1;
7906
1.08k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7907
7908
1.08k
            if (iv != NULL) {
7909
702
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7910
354
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7911
702
            }
7912
380
            else
7913
380
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7914
7915
1.08k
            if (enc == 0 || enc == 1)
7916
734
                ctx->enc = enc ? 1 : 0;
7917
7918
1.08k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7919
380
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7920
380
                if (ret != 0) {
7921
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7922
0
                    return WOLFSSL_FAILURE;
7923
0
                }
7924
380
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7925
380
            }
7926
7927
1.08k
            if (key) {
7928
354
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7929
354
                    (word32)ctx->keyLen,
7930
354
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7931
354
                if (ret != 0) {
7932
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7933
0
                    return WOLFSSL_FAILURE;
7934
0
                }
7935
354
            }
7936
1.08k
        }
7937
13.5k
        #endif /* WOLFSSL_AES_128 */
7938
13.5k
        #ifdef WOLFSSL_AES_256
7939
13.5k
        if (ctx->cipherType == WC_AES_256_XTS_TYPE ||
7940
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_XTS))) {
7941
273
            WOLFSSL_MSG("EVP_AES_256_XTS");
7942
273
            ctx->cipherType = WC_AES_256_XTS_TYPE;
7943
273
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7944
273
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7945
273
            ctx->keyLen     = 64;
7946
273
            ctx->block_size = 1;
7947
273
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7948
7949
273
            if (iv != NULL) {
7950
174
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7951
93
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7952
174
            }
7953
99
            else
7954
99
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7955
7956
273
            if (enc == 0 || enc == 1)
7957
192
                ctx->enc = enc ? 1 : 0;
7958
7959
273
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7960
99
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7961
99
                if (ret != 0) {
7962
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7963
0
                    return WOLFSSL_FAILURE;
7964
0
                }
7965
99
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7966
99
            }
7967
7968
273
            if (key) {
7969
93
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7970
93
                    (word32)ctx->keyLen,
7971
93
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7972
93
                if (ret != 0) {
7973
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7974
0
                    return WOLFSSL_FAILURE;
7975
0
                }
7976
93
            }
7977
273
        }
7978
13.5k
        #endif /* WOLFSSL_AES_256 */
7979
13.5k
    #endif /* WOLFSSL_AES_XTS &&
7980
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
7981
13.5k
#endif /* NO_AES */
7982
    #if defined(HAVE_ARIA)
7983
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7984
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))
7985
            || ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7986
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))
7987
            || ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7988
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))
7989
          ) {
7990
            if (EvpCipherInitAriaGCM(ctx, type, key, iv, enc)
7991
                != WOLFSSL_SUCCESS) {
7992
                return WOLFSSL_FAILURE;
7993
            }
7994
        }
7995
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7996
            * HAVE_FIPS_VERSION >= 2 */
7997
7998
7999
13.5k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
8000
13.5k
        if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE ||
8001
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20_POLY1305))) {
8002
0
            WOLFSSL_MSG("EVP_CHACHA20_POLY1305");
8003
0
            ctx->cipherType = WC_CHACHA20_POLY1305_TYPE;
8004
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8005
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8006
0
            ctx->keyLen     = CHACHA20_POLY1305_AEAD_KEYSIZE;
8007
0
            ctx->block_size = CHACHA_CHUNK_BYTES;
8008
0
            ctx->authTagSz  = CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE;
8009
0
            ctx->ivSz       = CHACHA20_POLY1305_AEAD_IV_SIZE;
8010
0
            if (enc == 0 || enc == 1) {
8011
0
                ctx->enc    = (byte) enc;
8012
0
            }
8013
8014
            /* wolfSSL_EVP_CipherInit() may be called multiple times to
8015
             * set key or iv alone. A common use case is to set key
8016
             * and then init with another iv again and again after
8017
             * update/finals. We need to preserve the key for those calls
8018
             * since wc_ChaCha20Poly1305_Init() does not. */
8019
0
            if (key != NULL) {
8020
0
                if (!ctx->key) {
8021
0
                    ctx->key = (byte*)XMALLOC((size_t)ctx->keyLen, NULL,
8022
0
                                              DYNAMIC_TYPE_OPENSSL);
8023
0
                    if (!ctx->key) {
8024
0
                        return MEMORY_E;
8025
0
                    }
8026
0
                }
8027
0
                XMEMCPY(ctx->key, key, (size_t)ctx->keyLen);
8028
0
            }
8029
0
            if ((ctx->key != NULL && iv != NULL) && wc_ChaCha20Poly1305_Init(
8030
0
                    &ctx->cipher.chachaPoly, ctx->key, iv, ctx->enc) != 0) {
8031
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Init() failed");
8032
0
                return WOLFSSL_FAILURE;
8033
0
            }
8034
0
        }
8035
13.5k
#endif
8036
13.5k
#ifdef HAVE_CHACHA
8037
13.5k
        if (ctx->cipherType == WC_CHACHA20_TYPE ||
8038
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20))) {
8039
0
            WOLFSSL_MSG("EVP_CHACHA20");
8040
0
            ctx->cipherType = WC_CHACHA20_TYPE;
8041
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8042
0
            ctx->keyLen     = CHACHA_MAX_KEY_SZ;
8043
0
            ctx->block_size = 1;
8044
0
            ctx->ivSz       = WOLFSSL_EVP_CHACHA_IV_BYTES;
8045
0
            if (enc == 0 || enc == 1) {
8046
0
                ctx->enc    = (byte) enc;
8047
0
            }
8048
0
            if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, key,
8049
0
                    (word32)ctx->keyLen) != 0) {
8050
0
                WOLFSSL_MSG("wc_Chacha_SetKey() failed");
8051
0
                return WOLFSSL_FAILURE;
8052
0
            }
8053
0
            if (iv != NULL) {
8054
                /* a bit silly. chacha takes an iv+counter and internally
8055
                 * combines them to a new iv. EVP is given exactly *one* iv,
8056
                 * so to pass it into chacha, we have to revert that first.
8057
                 * The counter comes first in little-endian */
8058
0
                word32 counter = (word32)iv[0] + (word32)(iv[1] << 8) +
8059
0
                    (word32)(iv[2] << 16) + (word32)(iv[3] << 24);
8060
0
                if (wc_Chacha_SetIV(&ctx->cipher.chacha,
8061
0
                                    iv + sizeof(counter), counter) != 0) {
8062
8063
0
                    WOLFSSL_MSG("wc_Chacha_SetIV() failed");
8064
0
                    return WOLFSSL_FAILURE;
8065
0
                }
8066
0
            }
8067
0
        }
8068
13.5k
#endif
8069
13.5k
#ifdef WOLFSSL_SM4_ECB
8070
13.5k
        if (ctx->cipherType == WC_SM4_ECB_TYPE ||
8071
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_ECB))) {
8072
0
            WOLFSSL_MSG("EVP_SM4_ECB");
8073
0
            ctx->cipherType = WC_SM4_ECB_TYPE;
8074
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8075
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8076
0
            ctx->keyLen     = SM4_KEY_SIZE;
8077
0
            ctx->block_size = SM4_BLOCK_SIZE;
8078
0
            if (enc == 0 || enc == 1)
8079
0
                ctx->enc = enc ? 1 : 0;
8080
0
            if (key) {
8081
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8082
0
            }
8083
0
            if (ret != 0) {
8084
0
                return WOLFSSL_FAILURE;
8085
0
            }
8086
0
        }
8087
13.5k
#endif
8088
13.5k
#ifdef WOLFSSL_SM4_CBC
8089
13.5k
        if (ctx->cipherType == WC_SM4_CBC_TYPE ||
8090
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CBC))) {
8091
0
            WOLFSSL_MSG("EVP_SM4_CBC");
8092
0
            ctx->cipherType = WC_SM4_CBC_TYPE;
8093
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8094
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8095
0
            ctx->keyLen     = SM4_KEY_SIZE;
8096
0
            ctx->block_size = SM4_BLOCK_SIZE;
8097
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8098
0
            if (enc == 0 || enc == 1)
8099
0
                ctx->enc = enc ? 1 : 0;
8100
0
            if (key != NULL) {
8101
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8102
0
                if (ret != 0) {
8103
0
                    return WOLFSSL_FAILURE;
8104
0
                }
8105
0
            }
8106
0
            if (iv != NULL) {
8107
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8108
0
                if (ret != 0) {
8109
0
                    return WOLFSSL_FAILURE;
8110
0
                }
8111
0
            }
8112
0
        }
8113
13.5k
#endif
8114
13.5k
#ifdef WOLFSSL_SM4_CTR
8115
13.5k
        if (ctx->cipherType == WC_SM4_CTR_TYPE ||
8116
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CTR))) {
8117
0
            WOLFSSL_MSG("EVP_SM4_CTR");
8118
0
            ctx->cipherType = WC_SM4_CTR_TYPE;
8119
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8120
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
8121
0
            ctx->keyLen     = SM4_KEY_SIZE;
8122
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8123
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8124
0
            if (enc == 0 || enc == 1)
8125
0
                ctx->enc = enc ? 1 : 0;
8126
0
            if (key != NULL) {
8127
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8128
0
                if (ret != 0) {
8129
0
                    return WOLFSSL_FAILURE;
8130
0
                }
8131
0
            }
8132
0
            if (iv != NULL) {
8133
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8134
0
                if (ret != 0) {
8135
0
                    return WOLFSSL_FAILURE;
8136
0
                }
8137
0
            }
8138
0
        }
8139
13.5k
#endif
8140
13.5k
#ifdef WOLFSSL_SM4_GCM
8141
13.5k
        if (ctx->cipherType == WC_SM4_GCM_TYPE ||
8142
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_GCM))) {
8143
0
            WOLFSSL_MSG("EVP_SM4_GCM");
8144
0
            ctx->cipherType = WC_SM4_GCM_TYPE;
8145
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8146
0
            ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
8147
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8148
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8149
0
            ctx->keyLen     = SM4_KEY_SIZE;
8150
0
            if (ctx->ivSz == 0) {
8151
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8152
0
            }
8153
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8154
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8155
0
            ctx->authIn = NULL;
8156
0
            ctx->authInSz = 0;
8157
0
            if (enc == 0 || enc == 1)
8158
0
                ctx->enc = enc ? 1 : 0;
8159
0
            if (key != NULL) {
8160
0
                ret = wc_Sm4GcmSetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8161
0
                if (ret != 0) {
8162
0
                    return WOLFSSL_FAILURE;
8163
0
                }
8164
0
            }
8165
0
            if (iv != NULL) {
8166
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8167
0
            }
8168
0
        }
8169
13.5k
#endif
8170
13.5k
#ifdef WOLFSSL_SM4_CCM
8171
13.5k
        if (ctx->cipherType == WC_SM4_CCM_TYPE ||
8172
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CCM))) {
8173
0
            WOLFSSL_MSG("EVP_SM4_CCM");
8174
0
            ctx->cipherType = WC_SM4_CCM_TYPE;
8175
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8176
0
            ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
8177
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8178
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8179
0
            ctx->keyLen     = SM4_KEY_SIZE;
8180
0
            if (ctx->ivSz == 0) {
8181
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8182
0
            }
8183
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8184
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8185
0
            ctx->authIn = NULL;
8186
0
            ctx->authInSz = 0;
8187
0
            if (enc == 0 || enc == 1)
8188
0
                ctx->enc = enc ? 1 : 0;
8189
0
            if (key != NULL) {
8190
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8191
0
                if (ret != 0) {
8192
0
                    return WOLFSSL_FAILURE;
8193
0
                }
8194
0
            }
8195
0
            if (iv != NULL) {
8196
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8197
0
            }
8198
0
        }
8199
13.5k
#endif
8200
13.5k
#ifndef NO_DES3
8201
13.5k
        if (ctx->cipherType == WC_DES_CBC_TYPE ||
8202
13.1k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_CBC))) {
8203
609
            WOLFSSL_MSG("EVP_DES_CBC");
8204
609
            ctx->cipherType = WC_DES_CBC_TYPE;
8205
609
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8206
609
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8207
609
            ctx->keyLen     = 8;
8208
609
            ctx->block_size = DES_BLOCK_SIZE;
8209
609
            ctx->ivSz       = DES_BLOCK_SIZE;
8210
609
            if (enc == 0 || enc == 1)
8211
424
                ctx->enc = enc ? 1 : 0;
8212
609
            if (key) {
8213
209
                ret = wc_Des_SetKey(&ctx->cipher.des, key, iv,
8214
209
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8215
209
                if (ret != 0)
8216
0
                    return WOLFSSL_FAILURE;
8217
209
            }
8218
8219
609
            if (iv && key == NULL)
8220
185
                wc_Des_SetIV(&ctx->cipher.des, iv);
8221
609
        }
8222
12.9k
#ifdef WOLFSSL_DES_ECB
8223
12.9k
        else if (ctx->cipherType == WC_DES_ECB_TYPE ||
8224
12.1k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_ECB))) {
8225
1.25k
            WOLFSSL_MSG("EVP_DES_ECB");
8226
1.25k
            ctx->cipherType = WC_DES_ECB_TYPE;
8227
1.25k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8228
1.25k
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8229
1.25k
            ctx->keyLen     = 8;
8230
1.25k
            ctx->block_size = DES_BLOCK_SIZE;
8231
1.25k
            if (enc == 0 || enc == 1)
8232
886
                ctx->enc = enc ? 1 : 0;
8233
1.25k
            if (key) {
8234
438
                WOLFSSL_MSG("Des_SetKey");
8235
438
                ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL,
8236
438
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8237
438
                if (ret != 0)
8238
0
                    return WOLFSSL_FAILURE;
8239
438
            }
8240
1.25k
        }
8241
11.6k
#endif
8242
11.6k
        else if (ctx->cipherType == WC_DES_EDE3_CBC_TYPE ||
8243
11.2k
                 (type &&
8244
4.64k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_CBC))) {
8245
647
            WOLFSSL_MSG("EVP_DES_EDE3_CBC");
8246
647
            ctx->cipherType = WC_DES_EDE3_CBC_TYPE;
8247
647
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8248
647
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8249
647
            ctx->keyLen     = 24;
8250
647
            ctx->block_size = DES_BLOCK_SIZE;
8251
647
            ctx->ivSz       = DES_BLOCK_SIZE;
8252
647
            if (enc == 0 || enc == 1)
8253
441
                ctx->enc = enc ? 1 : 0;
8254
647
            if (key) {
8255
215
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv,
8256
215
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8257
215
                if (ret != 0)
8258
0
                    return WOLFSSL_FAILURE;
8259
215
            }
8260
8261
647
            if (iv && key == NULL) {
8262
206
                ret = wc_Des3_SetIV(&ctx->cipher.des3, iv);
8263
206
                if (ret != 0)
8264
0
                    return WOLFSSL_FAILURE;
8265
206
            }
8266
647
        }
8267
11.0k
        else if (ctx->cipherType == WC_DES_EDE3_ECB_TYPE ||
8268
11.0k
                 (type &&
8269
4.41k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_ECB))) {
8270
0
            WOLFSSL_MSG("EVP_DES_EDE3_ECB");
8271
0
            ctx->cipherType = WC_DES_EDE3_ECB_TYPE;
8272
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8273
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8274
0
            ctx->keyLen     = 24;
8275
0
            ctx->block_size = DES_BLOCK_SIZE;
8276
0
            if (enc == 0 || enc == 1)
8277
0
                ctx->enc = enc ? 1 : 0;
8278
0
            if (key) {
8279
0
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL,
8280
0
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8281
0
                if (ret != 0)
8282
0
                    return WOLFSSL_FAILURE;
8283
0
            }
8284
0
        }
8285
13.5k
#endif /* NO_DES3 */
8286
13.5k
#ifndef NO_RC4
8287
13.5k
        if (ctx->cipherType == WC_ARC4_TYPE ||
8288
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARC4))) {
8289
105
            WOLFSSL_MSG("ARC4");
8290
105
            ctx->cipherType = WC_ARC4_TYPE;
8291
105
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8292
105
            ctx->flags     |= WOLFSSL_EVP_CIPH_STREAM_CIPHER;
8293
105
            ctx->block_size = 1;
8294
105
            if (ctx->keyLen == 0)  /* user may have already set */
8295
65
                ctx->keyLen = 16;  /* default to 128 */
8296
105
            if (key)
8297
23
                wc_Arc4SetKey(&ctx->cipher.arc4, key, (word32)ctx->keyLen);
8298
105
        }
8299
13.5k
#endif /* NO_RC4 */
8300
13.5k
        if (ctx->cipherType == WC_NULL_CIPHER_TYPE ||
8301
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_NULL))) {
8302
0
            WOLFSSL_MSG("NULL cipher");
8303
0
            ctx->cipherType = WC_NULL_CIPHER_TYPE;
8304
0
            ctx->keyLen = 0;
8305
0
            ctx->block_size = 16;
8306
0
        }
8307
13.5k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8308
13.5k
        if (iv && iv != ctx->iv) {
8309
2.61k
            if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8310
0
                return WOLFSSL_FAILURE;
8311
0
            }
8312
2.61k
        }
8313
13.5k
#endif
8314
13.5k
        (void)ret; /* remove warning. If execution reaches this point, ret=0 */
8315
13.5k
        return WOLFSSL_SUCCESS;
8316
13.5k
    }
8317
8318
8319
    int wolfSSL_EVP_CIPHER_CTX_nid(const WOLFSSL_EVP_CIPHER_CTX *ctx)
8320
0
    {
8321
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_nid");
8322
0
        if (ctx == NULL) {
8323
0
            WOLFSSL_ERROR_MSG("Bad parameters");
8324
0
            return WC_NID_undef;
8325
0
        }
8326
8327
0
        switch (ctx->cipherType) {
8328
0
#ifndef NO_AES
8329
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
8330
0
            case WC_AES_128_CBC_TYPE :
8331
0
                return WC_NID_aes_128_cbc;
8332
0
            case WC_AES_192_CBC_TYPE :
8333
0
                return WC_NID_aes_192_cbc;
8334
0
            case WC_AES_256_CBC_TYPE :
8335
0
                return WC_NID_aes_256_cbc;
8336
0
#endif
8337
0
#ifdef HAVE_AESGCM
8338
0
            case WC_AES_128_GCM_TYPE :
8339
0
                return WC_NID_aes_128_gcm;
8340
0
            case WC_AES_192_GCM_TYPE :
8341
0
                return WC_NID_aes_192_gcm;
8342
0
            case WC_AES_256_GCM_TYPE :
8343
0
                return WC_NID_aes_256_gcm;
8344
0
#endif
8345
0
#ifdef HAVE_AESCCM
8346
0
            case WC_AES_128_CCM_TYPE :
8347
0
                return WC_NID_aes_128_ccm;
8348
0
            case WC_AES_192_CCM_TYPE :
8349
0
                return WC_NID_aes_192_ccm;
8350
0
            case WC_AES_256_CCM_TYPE :
8351
0
                return WC_NID_aes_256_ccm;
8352
0
#endif
8353
0
#ifdef HAVE_AES_ECB
8354
0
            case WC_AES_128_ECB_TYPE :
8355
0
                return WC_NID_aes_128_ecb;
8356
0
            case WC_AES_192_ECB_TYPE :
8357
0
                return WC_NID_aes_192_ecb;
8358
0
            case WC_AES_256_ECB_TYPE :
8359
0
                return WC_NID_aes_256_ecb;
8360
0
#endif
8361
0
#ifdef WOLFSSL_AES_COUNTER
8362
0
            case WC_AES_128_CTR_TYPE :
8363
0
                return WC_NID_aes_128_ctr;
8364
0
            case WC_AES_192_CTR_TYPE :
8365
0
                return WC_NID_aes_192_ctr;
8366
0
            case WC_AES_256_CTR_TYPE :
8367
0
                return WC_NID_aes_256_ctr;
8368
0
#endif
8369
8370
0
#endif /* NO_AES */
8371
8372
#ifdef HAVE_ARIA
8373
            case WC_ARIA_128_GCM_TYPE :
8374
                return WC_NID_aria_128_gcm;
8375
            case WC_ARIA_192_GCM_TYPE :
8376
                return WC_NID_aria_192_gcm;
8377
            case WC_ARIA_256_GCM_TYPE :
8378
                return WC_NID_aria_256_gcm;
8379
#endif
8380
8381
0
#ifndef NO_DES3
8382
0
            case WC_DES_CBC_TYPE :
8383
0
                return WC_NID_des_cbc;
8384
8385
0
            case WC_DES_EDE3_CBC_TYPE :
8386
0
                return WC_NID_des_ede3_cbc;
8387
0
#endif
8388
0
#ifdef WOLFSSL_DES_ECB
8389
0
            case WC_DES_ECB_TYPE :
8390
0
                return WC_NID_des_ecb;
8391
0
            case WC_DES_EDE3_ECB_TYPE :
8392
0
                return WC_NID_des_ede3_ecb;
8393
0
#endif
8394
8395
0
            case WC_ARC4_TYPE :
8396
0
                return WC_NID_rc4;
8397
8398
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
8399
0
            case WC_CHACHA20_POLY1305_TYPE:
8400
0
                return WC_NID_chacha20_poly1305;
8401
0
#endif
8402
8403
0
#ifdef HAVE_CHACHA
8404
0
            case WC_CHACHA20_TYPE:
8405
0
                return WC_NID_chacha20;
8406
0
#endif
8407
8408
0
#ifdef WOLFSSL_SM4_ECB
8409
0
            case WC_SM4_ECB_TYPE:
8410
0
                return WC_NID_sm4_ecb;
8411
0
#endif
8412
8413
0
#ifdef WOLFSSL_SM4_CBC
8414
0
            case WC_SM4_CBC_TYPE:
8415
0
                return WC_NID_sm4_cbc;
8416
0
#endif
8417
8418
0
#ifdef WOLFSSL_SM4_CTR
8419
0
            case WC_SM4_CTR_TYPE:
8420
0
                return WC_NID_sm4_ctr;
8421
0
#endif
8422
8423
0
#ifdef WOLFSSL_SM4_GCM
8424
0
            case WC_SM4_GCM_TYPE:
8425
0
                return WC_NID_sm4_gcm;
8426
0
#endif
8427
8428
0
#ifdef WOLFSSL_SM4_CCM
8429
0
            case WC_SM4_CCM_TYPE:
8430
0
                return WC_NID_sm4_ccm;
8431
0
#endif
8432
8433
0
            case WC_NULL_CIPHER_TYPE :
8434
0
                WOLFSSL_ERROR_MSG("Null cipher has no NID");
8435
0
                FALL_THROUGH;
8436
0
            default:
8437
0
                return WC_NID_undef;
8438
0
        }
8439
0
    }
8440
8441
    /* WOLFSSL_SUCCESS on ok */
8442
    int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx)
8443
0
    {
8444
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_key_length");
8445
0
        if (ctx)
8446
0
            return ctx->keyLen;
8447
0
        else
8448
0
            return WOLFSSL_FAILURE;
8449
0
    }
8450
8451
    /* WOLFSSL_SUCCESS on ok */
8452
    int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8453
                                             int keylen)
8454
0
    {
8455
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_key_length");
8456
0
        if (ctx)
8457
0
            ctx->keyLen = keylen;
8458
0
        else
8459
0
            return WOLFSSL_FAILURE;
8460
8461
0
        return WOLFSSL_SUCCESS;
8462
0
    }
8463
8464
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8465
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8466
    int wolfSSL_EVP_CIPHER_CTX_set_iv_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8467
                                             int ivLen)
8468
0
    {
8469
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length");
8470
0
        if (ctx == NULL) {
8471
0
            return WOLFSSL_FAILURE;
8472
0
        }
8473
8474
0
        if (ivLen < 0 || ivLen > (int) sizeof(ctx->iv)) {
8475
0
            return WOLFSSL_FAILURE;
8476
0
        }
8477
8478
0
        ctx->ivSz = ivLen;
8479
8480
0
        return WOLFSSL_SUCCESS;
8481
0
    }
8482
#endif
8483
8484
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
8485
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
8486
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8487
    int wolfSSL_EVP_CIPHER_CTX_set_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8488
                                             int ivLen)
8489
0
    {
8490
0
        int expectedIvLen;
8491
8492
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv");
8493
0
        if (!ctx || !iv || !ivLen) {
8494
0
            return WOLFSSL_FAILURE;
8495
0
        }
8496
8497
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8498
8499
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8500
0
            WOLFSSL_MSG("Wrong ivLen value");
8501
0
            return WOLFSSL_FAILURE;
8502
0
        }
8503
8504
0
        return wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, -1);
8505
0
    }
8506
#endif
8507
8508
#if !defined(NO_AES) || !defined(NO_DES3)
8509
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8510
    int wolfSSL_EVP_CIPHER_CTX_get_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8511
                                      int ivLen)
8512
0
    {
8513
0
        int expectedIvLen;
8514
8515
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_get_iv");
8516
8517
0
        if (ctx == NULL || iv == NULL || ivLen == 0) {
8518
0
            WOLFSSL_MSG("Bad parameter");
8519
0
            return WOLFSSL_FAILURE;
8520
0
        }
8521
8522
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8523
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8524
0
            WOLFSSL_MSG("Wrong ivLen value");
8525
0
            return WOLFSSL_FAILURE;
8526
0
        }
8527
8528
0
        XMEMCPY(iv, ctx->iv, (size_t)ivLen);
8529
8530
0
        return WOLFSSL_SUCCESS;
8531
0
    }
8532
#endif /* !NO_AES || !NO_DES3 */
8533
8534
    static int IsCipherTypeAEAD(unsigned int type)
8535
0
    {
8536
0
        switch (type) {
8537
0
            case WC_AES_128_GCM_TYPE:
8538
0
            case WC_AES_192_GCM_TYPE:
8539
0
            case WC_AES_256_GCM_TYPE:
8540
0
            case WC_AES_128_CCM_TYPE:
8541
0
            case WC_AES_192_CCM_TYPE:
8542
0
            case WC_AES_256_CCM_TYPE:
8543
0
            case WC_ARIA_128_GCM_TYPE:
8544
0
            case WC_ARIA_192_GCM_TYPE:
8545
0
            case WC_ARIA_256_GCM_TYPE:
8546
0
            case WC_SM4_GCM_TYPE:
8547
0
            case WC_SM4_CCM_TYPE:
8548
0
                return 1;
8549
0
            default:
8550
0
                return 0;
8551
0
        }
8552
0
    }
8553
8554
    /* Return length on ok */
8555
    int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
8556
                           const byte* src, word32 len)
8557
0
    {
8558
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
8559
8560
0
        WOLFSSL_ENTER("wolfSSL_EVP_Cipher");
8561
8562
0
        if (ctx == NULL) {
8563
0
            WOLFSSL_MSG("Bad argument.");
8564
0
            return WOLFSSL_FATAL_ERROR;
8565
0
        }
8566
8567
0
        if (!IsCipherTypeAEAD(ctx->cipherType)) {
8568
            /* No-op for non-AEAD ciphers */
8569
0
            if (src == NULL && dst == NULL && len == 0)
8570
0
                return 0;
8571
0
            if (src == NULL || dst == NULL) {
8572
0
                WOLFSSL_MSG("Bad argument.");
8573
0
                return WOLFSSL_FATAL_ERROR;
8574
0
            }
8575
0
        }
8576
8577
0
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
8578
0
            WOLFSSL_MSG("Cipher operation not initialized. Call "
8579
0
                        "wolfSSL_EVP_CipherInit.");
8580
0
            return WOLFSSL_FATAL_ERROR;
8581
0
        }
8582
8583
0
        switch (ctx->cipherType) {
8584
8585
0
#ifndef NO_AES
8586
0
#ifdef HAVE_AES_CBC
8587
0
            case WC_AES_128_CBC_TYPE :
8588
0
            case WC_AES_192_CBC_TYPE :
8589
0
            case WC_AES_256_CBC_TYPE :
8590
0
                WOLFSSL_MSG("AES CBC");
8591
0
                if (ctx->enc)
8592
0
                    ret = wc_AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
8593
0
                else
8594
0
                    ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
8595
0
                if (ret == 0)
8596
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8597
0
                break;
8598
0
#endif /* HAVE_AES_CBC */
8599
8600
0
#ifdef WOLFSSL_AES_CFB
8601
0
#if !defined(WOLFSSL_NO_AES_CFB_1_8)
8602
0
            case WC_AES_128_CFB1_TYPE:
8603
0
            case WC_AES_192_CFB1_TYPE:
8604
0
            case WC_AES_256_CFB1_TYPE:
8605
0
                WOLFSSL_MSG("AES CFB1");
8606
0
                if (ctx->enc)
8607
0
                    ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, dst, src, len);
8608
0
                else
8609
0
                    ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len);
8610
0
                if (ret == 0)
8611
0
                    ret = (int)len;
8612
0
                break;
8613
0
            case WC_AES_128_CFB8_TYPE:
8614
0
            case WC_AES_192_CFB8_TYPE:
8615
0
            case WC_AES_256_CFB8_TYPE:
8616
0
                WOLFSSL_MSG("AES CFB8");
8617
0
                if (ctx->enc)
8618
0
                    ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, dst, src, len);
8619
0
                else
8620
0
                    ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len);
8621
0
                if (ret == 0)
8622
0
                    ret = (int)len;
8623
0
                break;
8624
0
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
8625
0
            case WC_AES_128_CFB128_TYPE:
8626
0
            case WC_AES_192_CFB128_TYPE:
8627
0
            case WC_AES_256_CFB128_TYPE:
8628
0
                WOLFSSL_MSG("AES CFB128");
8629
0
                if (ctx->enc)
8630
0
                    ret = wc_AesCfbEncrypt(&ctx->cipher.aes, dst, src, len);
8631
0
                else
8632
0
                    ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len);
8633
0
                if (ret == 0)
8634
0
                    ret = (int)len;
8635
0
                break;
8636
0
#endif /* WOLFSSL_AES_CFB */
8637
0
#if defined(WOLFSSL_AES_OFB)
8638
0
            case WC_AES_128_OFB_TYPE:
8639
0
            case WC_AES_192_OFB_TYPE:
8640
0
            case WC_AES_256_OFB_TYPE:
8641
0
                WOLFSSL_MSG("AES OFB");
8642
0
                if (ctx->enc)
8643
0
                    ret = wc_AesOfbEncrypt(&ctx->cipher.aes, dst, src, len);
8644
0
                else
8645
0
                    ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len);
8646
0
                if (ret == 0)
8647
0
                    ret = (int)len;
8648
0
                break;
8649
0
#endif /* WOLFSSL_AES_OFB */
8650
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
8651
0
            case WC_AES_128_XTS_TYPE:
8652
0
            case WC_AES_256_XTS_TYPE:
8653
0
                WOLFSSL_MSG("AES XTS");
8654
0
                if (ctx->enc)
8655
0
                    ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len,
8656
0
                            ctx->iv, (word32)ctx->ivSz);
8657
0
                else
8658
0
                    ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len,
8659
0
                            ctx->iv, (word32)ctx->ivSz);
8660
0
                if (ret == 0)
8661
0
                    ret = (int)len;
8662
0
                break;
8663
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
8664
8665
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8666
0
    || FIPS_VERSION_GE(2,0))
8667
0
            case WC_AES_128_GCM_TYPE :
8668
0
            case WC_AES_192_GCM_TYPE :
8669
0
            case WC_AES_256_GCM_TYPE :
8670
0
                WOLFSSL_MSG("AES GCM");
8671
0
                ret = EvpCipherAesGCM(ctx, dst, src, len);
8672
0
                break;
8673
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8674
        * HAVE_FIPS_VERSION >= 2 */
8675
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8676
0
    || FIPS_VERSION_GE(2,0))
8677
0
            case WC_AES_128_CCM_TYPE :
8678
0
            case WC_AES_192_CCM_TYPE :
8679
0
            case WC_AES_256_CCM_TYPE :
8680
0
                WOLFSSL_MSG("AES CCM");
8681
0
                ret = EvpCipherAesCCM(ctx, dst, src, len);
8682
0
                break;
8683
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8684
        * HAVE_FIPS_VERSION >= 2 */
8685
0
#ifdef HAVE_AES_ECB
8686
0
            case WC_AES_128_ECB_TYPE :
8687
0
            case WC_AES_192_ECB_TYPE :
8688
0
            case WC_AES_256_ECB_TYPE :
8689
0
                WOLFSSL_MSG("AES ECB");
8690
0
                if (ctx->enc)
8691
0
                    ret = wc_AesEcbEncrypt(&ctx->cipher.aes, dst, src, len);
8692
0
                else
8693
0
                    ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len);
8694
0
                if (ret == 0)
8695
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8696
0
                break;
8697
0
#endif
8698
0
#ifdef WOLFSSL_AES_COUNTER
8699
0
            case WC_AES_128_CTR_TYPE :
8700
0
            case WC_AES_192_CTR_TYPE :
8701
0
            case WC_AES_256_CTR_TYPE :
8702
0
                WOLFSSL_MSG("AES CTR");
8703
0
                ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
8704
0
                if (ret == 0)
8705
0
                    ret = (int)len;
8706
0
                break;
8707
0
#endif /* WOLFSSL_AES_COUNTER */
8708
0
#endif /* NO_AES */
8709
8710
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8711
    || FIPS_VERSION_GE(2,0))
8712
            case WC_ARIA_128_GCM_TYPE :
8713
            case WC_ARIA_192_GCM_TYPE :
8714
            case WC_ARIA_256_GCM_TYPE :
8715
                WOLFSSL_MSG("ARIA GCM");
8716
                if (ctx->enc) {
8717
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, dst, src, len,
8718
                                         ctx->iv, ctx->ivSz, NULL, 0,
8719
                                         ctx->authTag, ctx->authTagSz);
8720
                }
8721
                else {
8722
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, dst, src, len,
8723
                                         ctx->iv, ctx->ivSz, NULL, 0,
8724
                                         ctx->authTag, ctx->authTagSz);
8725
                }
8726
                break;
8727
#endif /* HAVE_ARIA&& ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8728
        * HAVE_FIPS_VERSION >= 2 */
8729
8730
0
#ifndef NO_DES3
8731
0
            case WC_DES_CBC_TYPE :
8732
0
                WOLFSSL_MSG("DES CBC");
8733
0
                if (ctx->enc)
8734
0
                    wc_Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
8735
0
                else
8736
0
                    wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
8737
0
                if (ret == 0)
8738
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8739
0
                break;
8740
0
            case WC_DES_EDE3_CBC_TYPE :
8741
0
                WOLFSSL_MSG("DES3 CBC");
8742
0
                if (ctx->enc)
8743
0
                    ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
8744
0
                else
8745
0
                    ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
8746
0
                if (ret == 0)
8747
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8748
0
                break;
8749
0
#ifdef WOLFSSL_DES_ECB
8750
0
            case WC_DES_ECB_TYPE :
8751
0
                WOLFSSL_MSG("DES ECB");
8752
0
                ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len);
8753
0
                if (ret == 0)
8754
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8755
0
                break;
8756
0
            case WC_DES_EDE3_ECB_TYPE :
8757
0
                WOLFSSL_MSG("DES3 ECB");
8758
0
                ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len);
8759
0
                if (ret == 0)
8760
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8761
0
                break;
8762
0
#endif
8763
0
#endif /* !NO_DES3 */
8764
8765
0
#ifndef NO_RC4
8766
0
            case WC_ARC4_TYPE :
8767
0
                WOLFSSL_MSG("ARC4");
8768
0
                wc_Arc4Process(&ctx->cipher.arc4, dst, src, len);
8769
0
                if (ret == 0)
8770
0
                    ret = (int)len;
8771
0
                break;
8772
0
#endif
8773
8774
            /* TODO: Chacha??? */
8775
8776
0
#ifdef WOLFSSL_SM4_ECB
8777
0
            case WC_SM4_ECB_TYPE :
8778
0
                WOLFSSL_MSG("Sm4 ECB");
8779
0
                if (ctx->enc)
8780
0
                    ret = wc_Sm4EcbEncrypt(&ctx->cipher.sm4, dst, src, len);
8781
0
                else
8782
0
                    ret = wc_Sm4EcbDecrypt(&ctx->cipher.sm4, dst, src, len);
8783
0
                if (ret == 0)
8784
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8785
0
                break;
8786
0
#endif
8787
0
#ifdef WOLFSSL_SM4_CBC
8788
0
            case WC_SM4_CBC_TYPE :
8789
0
                WOLFSSL_MSG("Sm4 CBC");
8790
0
                if (ctx->enc)
8791
0
                    ret = wc_Sm4CbcEncrypt(&ctx->cipher.sm4, dst, src, len);
8792
0
                else
8793
0
                    ret = wc_Sm4CbcDecrypt(&ctx->cipher.sm4, dst, src, len);
8794
0
                if (ret == 0)
8795
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8796
0
                break;
8797
0
#endif
8798
0
#ifdef WOLFSSL_SM4_CTR
8799
0
            case WC_SM4_CTR_TYPE :
8800
0
                WOLFSSL_MSG("AES CTR");
8801
0
                ret = wc_Sm4CtrEncrypt(&ctx->cipher.sm4, dst, src, len);
8802
0
                if (ret == 0)
8803
0
                    ret = (int)len;
8804
0
                break;
8805
0
#endif
8806
0
#ifdef WOLFSSL_SM4_GCM
8807
0
            case WC_SM4_GCM_TYPE :
8808
0
                WOLFSSL_MSG("SM4 GCM");
8809
                /* No destination means only AAD. */
8810
0
                if (src != NULL && dst == NULL) {
8811
0
                    ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
8812
0
                }
8813
0
                else if (src != NULL && dst != NULL) {
8814
0
                    if (ctx->enc) {
8815
0
                        ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, dst, src,
8816
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8817
0
                                ctx->authTagSz, ctx->authIn,
8818
0
                                ctx->authInSz);
8819
0
                    }
8820
0
                    else {
8821
0
                        ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, dst, src,
8822
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8823
0
                                ctx->authTagSz, ctx->authIn,
8824
0
                                ctx->authInSz);
8825
0
                    }
8826
0
                    if (ctx->authIncIv) {
8827
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8828
0
                               ctx->cipher.sm4.nonceSz);
8829
0
                        ctx->authIncIv = 0;
8830
0
                    }
8831
0
                }
8832
0
                break;
8833
0
#endif
8834
0
#ifdef WOLFSSL_SM4_CCM
8835
0
            case WC_SM4_CCM_TYPE :
8836
0
                WOLFSSL_MSG("SM4 CCM");
8837
                /* No destination means only AAD. */
8838
0
                if (src != NULL && dst == NULL) {
8839
0
                    ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len);
8840
0
                }
8841
0
                else if (src != NULL && dst != NULL) {
8842
0
                    if (ctx->enc) {
8843
0
                        ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, dst, src,
8844
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8845
0
                                ctx->authTagSz, ctx->authIn,
8846
0
                                ctx->authInSz);
8847
0
                    }
8848
0
                    else {
8849
0
                        ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, dst, src,
8850
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8851
0
                                ctx->authTagSz, ctx->authIn,
8852
0
                                ctx->authInSz);
8853
0
                    }
8854
0
                    if (ctx->authIncIv) {
8855
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8856
0
                               ctx->cipher.sm4.nonceSz);
8857
0
                        ctx->authIncIv = 0;
8858
0
                    }
8859
0
                }
8860
0
                if (src == NULL) {
8861
                    /*
8862
                     * Clear any leftover AAD on final (final is when src is
8863
                     * NULL).
8864
                     */
8865
0
                    if (ctx->authIn != NULL) {
8866
0
                        XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
8867
0
                    }
8868
0
                    ctx->authInSz = 0;
8869
0
                }
8870
0
                if (ret == 0) {
8871
0
                    ret = (int)len;
8872
0
                }
8873
0
                break;
8874
0
#endif
8875
8876
0
            case WC_NULL_CIPHER_TYPE :
8877
0
                WOLFSSL_MSG("NULL CIPHER");
8878
0
                XMEMCPY(dst, src, (size_t)len);
8879
0
                ret = (int)len;
8880
0
                break;
8881
8882
0
            default: {
8883
0
                WOLFSSL_MSG("bad type");
8884
0
                return WOLFSSL_FATAL_ERROR;
8885
0
            }
8886
0
        }
8887
8888
0
        if (ret < 0) {
8889
0
            if (ret == WC_NO_ERR_TRACE(AES_GCM_AUTH_E)) {
8890
0
                WOLFSSL_MSG("wolfSSL_EVP_Cipher failure: bad AES-GCM tag.");
8891
0
            }
8892
0
            WOLFSSL_MSG("wolfSSL_EVP_Cipher failure");
8893
0
            return WOLFSSL_FATAL_ERROR;
8894
0
        }
8895
8896
0
        if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8897
0
            return WOLFSSL_FATAL_ERROR;
8898
0
        }
8899
8900
0
        WOLFSSL_MSG("wolfSSL_EVP_Cipher success");
8901
0
        return ret;
8902
0
    }
8903
8904
static void clearEVPPkeyKeys(WOLFSSL_EVP_PKEY *pkey)
8905
0
{
8906
0
    if(pkey == NULL)
8907
0
        return;
8908
0
    WOLFSSL_ENTER("clearEVPPkeyKeys");
8909
0
#ifndef NO_RSA
8910
0
    if (pkey->rsa != NULL && pkey->ownRsa == 1) {
8911
0
        wolfSSL_RSA_free(pkey->rsa);
8912
0
        pkey->rsa = NULL;
8913
0
    }
8914
0
    pkey->ownRsa = 0;
8915
0
#endif
8916
#ifndef NO_DSA
8917
    if (pkey->dsa != NULL && pkey->ownDsa == 1) {
8918
        wolfSSL_DSA_free(pkey->dsa);
8919
        pkey->dsa = NULL;
8920
    }
8921
    pkey->ownDsa = 0;
8922
#endif
8923
0
#ifndef NO_DH
8924
0
    if (pkey->dh != NULL && pkey->ownDh == 1) {
8925
0
        wolfSSL_DH_free(pkey->dh);
8926
0
        pkey->dh = NULL;
8927
0
    }
8928
0
    pkey->ownDh = 0;
8929
0
#endif
8930
0
#ifdef HAVE_ECC
8931
0
    if (pkey->ecc != NULL && pkey->ownEcc == 1) {
8932
0
        wolfSSL_EC_KEY_free(pkey->ecc);
8933
0
        pkey->ecc = NULL;
8934
0
    }
8935
0
    pkey->ownEcc = 0;
8936
0
#endif
8937
0
}
8938
8939
#ifndef NO_RSA
8940
#ifdef WOLFSSL_KEY_TO_DER
8941
static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey)
8942
0
{
8943
0
    int ret = 0;
8944
0
    int derSz = 0;
8945
0
    word32 pkcs8Sz = 0;
8946
0
    byte* derBuf = NULL;
8947
0
    RsaKey* rsa = NULL;
8948
0
    WOLFSSL_RSA *key = NULL;
8949
8950
0
    if (pkey == NULL || pkey->rsa == NULL || pkey->rsa->internal == NULL) {
8951
0
        WOLFSSL_MSG("bad parameter");
8952
0
        return WOLFSSL_FAILURE;
8953
0
    }
8954
8955
0
    key = pkey->rsa;
8956
0
    rsa = (RsaKey*)pkey->rsa->internal;
8957
8958
    /* Get DER size */
8959
0
    if (rsa->type == RSA_PRIVATE) {
8960
0
        ret = wc_RsaKeyToDer(rsa, NULL, 0);
8961
0
        if (ret > 0) {
8962
0
            derSz = ret;
8963
0
        #ifdef HAVE_PKCS8
8964
0
            if (key->pkcs8HeaderSz) {
8965
0
                ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, (word32)derSz,
8966
0
                    RSAk, NULL, 0);
8967
0
                if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
8968
0
                    ret = 0;
8969
0
            }
8970
0
        #endif
8971
0
        }
8972
0
    }
8973
0
    else {
8974
0
        ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
8975
0
        if (ret > 0)
8976
0
            derSz = ret;
8977
0
    }
8978
8979
0
    if (derSz == 0 || ret < 0) {
8980
0
        WOLFSSL_MSG("Error getting RSA DER size");
8981
0
        return WOLFSSL_FAILURE;
8982
0
    }
8983
8984
#ifdef WOLFSSL_NO_REALLOC
8985
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER);
8986
    if (derBuf != NULL) {
8987
        XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
8988
        XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_DER);
8989
        pkey->pkey.ptr = NULL;
8990
    }
8991
#else
8992
0
    derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz,
8993
0
            pkey->heap, DYNAMIC_TYPE_DER);
8994
0
#endif
8995
0
    if (derBuf == NULL) {
8996
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer malloc failed");
8997
0
        return WOLFSSL_FAILURE;
8998
0
    }
8999
9000
    /* Old pointer is invalid from this point on */
9001
0
    pkey->pkey.ptr = (char*)derBuf;
9002
9003
0
    if (rsa->type == RSA_PRIVATE) {
9004
0
        ret = wc_RsaKeyToDer(rsa, derBuf, (word32)derSz);
9005
0
        if (ret > 0) {
9006
0
            derSz = ret;
9007
0
        #ifdef HAVE_PKCS8
9008
0
            if (key->pkcs8HeaderSz) {
9009
0
                byte* keyBuf = derBuf;
9010
0
                int keySz = derSz;
9011
0
                word32 sz = pkcs8Sz;
9012
                /* Need new buffer for PKCS8 since we can't
9013
                 * do this in-place */
9014
0
                derBuf = (byte*)XMALLOC((size_t)pkcs8Sz, pkey->heap,
9015
0
                    DYNAMIC_TYPE_DER);
9016
0
                if (derBuf != NULL) {
9017
0
                    ret = wc_CreatePKCS8Key(derBuf, &sz, keyBuf, (word32)keySz,
9018
0
                        RSAk, NULL, 0);
9019
0
                    XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
9020
0
                    pkey->pkey.ptr = (char*)derBuf;
9021
0
                }
9022
0
                else {
9023
0
                    ret = MEMORY_E;
9024
0
                }
9025
0
                derSz = (int)sz;
9026
0
            }
9027
0
        #endif
9028
0
        }
9029
0
    }
9030
0
    else {
9031
        /* Public key to DER */
9032
0
        ret = wc_RsaKeyToPublicDer(rsa, derBuf, (word32)derSz);
9033
0
        if (ret > 0)
9034
0
            derSz = ret;
9035
0
    }
9036
9037
0
    if (ret < 0) {
9038
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9039
0
        return WOLFSSL_FAILURE;
9040
0
    }
9041
0
    else {
9042
0
        pkey->pkey_sz = derSz;
9043
0
        return WOLFSSL_SUCCESS;
9044
0
    }
9045
0
}
9046
#endif /* WOLFSSL_KEY_TO_DER */
9047
9048
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey)
9049
0
{
9050
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get0_RSA");
9051
9052
0
    if (pkey == NULL)
9053
0
        return NULL;
9054
9055
0
    return pkey->rsa;
9056
0
}
9057
9058
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* pkey)
9059
0
{
9060
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
9061
9062
0
    if (pkey == NULL || pkey->rsa == NULL)
9063
0
        return NULL;
9064
9065
0
    if (wolfSSL_RSA_up_ref(pkey->rsa) != WOLFSSL_SUCCESS)
9066
0
        return NULL;
9067
9068
0
    return pkey->rsa;
9069
0
}
9070
9071
/* with set1 functions the pkey struct does not own the RSA structure
9072
 *
9073
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9074
 */
9075
int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
9076
0
{
9077
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA");
9078
0
    if (pkey == NULL || key == NULL)
9079
0
        return WOLFSSL_FAILURE;
9080
9081
0
    if (wolfSSL_RSA_up_ref(key) != WOLFSSL_SUCCESS) {
9082
0
        WOLFSSL_MSG("wolfSSL_RSA_up_ref failed");
9083
0
        return WOLFSSL_FAILURE;
9084
0
    }
9085
9086
0
    clearEVPPkeyKeys(pkey);
9087
0
    pkey->rsa    = key;
9088
0
    pkey->ownRsa = 1; /* pkey does not own RSA but needs to call free on it */
9089
0
    pkey->type   = WC_EVP_PKEY_RSA;
9090
0
    pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9091
0
    if (key->inSet == 0) {
9092
0
        if (SetRsaInternal(key) != WOLFSSL_SUCCESS) {
9093
0
            WOLFSSL_MSG("SetRsaInternal failed");
9094
0
            return WOLFSSL_FAILURE;
9095
0
        }
9096
0
    }
9097
9098
0
#ifdef WOLFSSL_KEY_TO_DER
9099
0
    if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) {
9100
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9101
0
        return WOLFSSL_FAILURE;
9102
0
    }
9103
0
#endif
9104
9105
0
#ifdef WC_RSA_BLINDING
9106
0
    if (key->ownRng == 0) {
9107
0
        if (wc_RsaSetRNG((RsaKey*)pkey->rsa->internal, &pkey->rng) != 0) {
9108
0
            WOLFSSL_MSG("Error setting RSA rng");
9109
0
            return WOLFSSL_FAILURE;
9110
0
        }
9111
0
    }
9112
0
#endif
9113
0
    return WOLFSSL_SUCCESS;
9114
0
}
9115
#endif /* !NO_RSA */
9116
9117
#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN)
9118
/* with set1 functions the pkey struct does not own the DSA structure
9119
 *
9120
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9121
 */
9122
int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key)
9123
{
9124
    int derMax = 0;
9125
    int derSz  = 0;
9126
    DsaKey* dsa  = NULL;
9127
    byte* derBuf = NULL;
9128
9129
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DSA");
9130
9131
    if((pkey == NULL) || (key == NULL))return WOLFSSL_FAILURE;
9132
    clearEVPPkeyKeys(pkey);
9133
    pkey->dsa    = key;
9134
    pkey->ownDsa = 0; /* pkey does not own DSA */
9135
    pkey->type   = WC_EVP_PKEY_DSA;
9136
    if (key->inSet == 0) {
9137
        if (SetDsaInternal(key) != WOLFSSL_SUCCESS) {
9138
            WOLFSSL_MSG("SetDsaInternal failed");
9139
            return WOLFSSL_FAILURE;
9140
        }
9141
    }
9142
    dsa = (DsaKey*)key->internal;
9143
9144
    /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
9145
    derMax = 4 * wolfSSL_BN_num_bytes(key->g) + WC_AES_BLOCK_SIZE;
9146
9147
    derBuf = (byte*)XMALLOC((size_t)derMax, pkey->heap,
9148
        DYNAMIC_TYPE_TMP_BUFFER);
9149
    if (derBuf == NULL) {
9150
        WOLFSSL_MSG("malloc failed");
9151
        return WOLFSSL_FAILURE;
9152
    }
9153
9154
    if (dsa->type == DSA_PRIVATE) {
9155
        /* Private key to DER */
9156
        derSz = wc_DsaKeyToDer(dsa, derBuf, (word32)derMax);
9157
    }
9158
    else {
9159
        /* Public key to DER */
9160
        derSz = wc_DsaKeyToPublicDer(dsa, derBuf, (word32)derMax);
9161
    }
9162
9163
    if (derSz < 0) {
9164
        if (dsa->type == DSA_PRIVATE) {
9165
            WOLFSSL_MSG("wc_DsaKeyToDer failed");
9166
        }
9167
        else {
9168
            WOLFSSL_MSG("wc_DsaKeyToPublicDer failed");
9169
        }
9170
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9171
        return WOLFSSL_FAILURE;
9172
    }
9173
9174
    pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, pkey->heap,
9175
        DYNAMIC_TYPE_DER);
9176
    if (pkey->pkey.ptr == NULL) {
9177
        WOLFSSL_MSG("key malloc failed");
9178
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9179
        return WOLFSSL_FAILURE;
9180
    }
9181
    pkey->pkey_sz = derSz;
9182
    XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz);
9183
    XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9184
9185
    return WOLFSSL_SUCCESS;
9186
}
9187
9188
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey)
9189
{
9190
    if (!pkey) {
9191
        return NULL;
9192
    }
9193
    return pkey->dsa;
9194
}
9195
9196
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key)
9197
{
9198
    WOLFSSL_DSA* local;
9199
9200
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DSA");
9201
9202
    if (key == NULL) {
9203
        WOLFSSL_MSG("Bad function argument");
9204
        return NULL;
9205
    }
9206
9207
    local = wolfSSL_DSA_new();
9208
    if (local == NULL) {
9209
        WOLFSSL_MSG("Error creating a new WOLFSSL_DSA structure");
9210
        return NULL;
9211
    }
9212
9213
    if (key->type == WC_EVP_PKEY_DSA) {
9214
        if (wolfSSL_DSA_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9215
                    key->pkey_sz) != WOLFSSL_SUCCESS) {
9216
            /* now try public key */
9217
            if (wolfSSL_DSA_LoadDer_ex(local,
9218
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9219
                        WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9220
                wolfSSL_DSA_free(local);
9221
                local = NULL;
9222
            }
9223
        }
9224
    }
9225
    else {
9226
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DSA key");
9227
        wolfSSL_DSA_free(local);
9228
        local = NULL;
9229
    }
9230
    return local;
9231
}
9232
#endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */
9233
9234
#ifdef HAVE_ECC
9235
WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey)
9236
0
{
9237
0
    WOLFSSL_EC_KEY *eckey = NULL;
9238
0
    if (pkey && pkey->type == WC_EVP_PKEY_EC) {
9239
0
#ifdef HAVE_ECC
9240
0
        eckey = pkey->ecc;
9241
0
#endif
9242
0
    }
9243
0
    return eckey;
9244
0
}
9245
9246
WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key)
9247
0
{
9248
0
    WOLFSSL_EC_KEY* local = NULL;
9249
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY");
9250
9251
0
    if (key == NULL || key->type != WC_EVP_PKEY_EC) {
9252
0
        return NULL;
9253
0
    }
9254
0
    if (key->type == WC_EVP_PKEY_EC) {
9255
0
        if (key->ecc != NULL) {
9256
0
            if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) {
9257
0
                return NULL;
9258
0
            }
9259
0
            local = key->ecc;
9260
0
        }
9261
0
        else {
9262
0
            key->ecc = local = wolfSSL_EC_KEY_new();
9263
0
            if (local == NULL) {
9264
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure");
9265
0
                return NULL;
9266
0
            }
9267
0
            if (wolfSSL_EC_KEY_LoadDer(local,
9268
0
                        (const unsigned char*)key->pkey.ptr,
9269
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9270
                /* now try public key */
9271
0
                if (wolfSSL_EC_KEY_LoadDer_ex(local,
9272
0
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9273
0
                        WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9274
9275
0
                    wolfSSL_EC_KEY_free(local);
9276
0
                    local = NULL;
9277
0
                }
9278
0
            }
9279
0
        }
9280
0
    }
9281
0
    else {
9282
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key");
9283
0
    }
9284
9285
0
    return local;
9286
0
}
9287
#endif /* HAVE_ECC */
9288
9289
#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
9290
#if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
9291
/* with set1 functions the pkey struct does not own the DH structure
9292
 * Build the following DH Key format from the passed in WOLFSSL_DH
9293
 * then store in WOLFSSL_EVP_PKEY in DER format.
9294
 *
9295
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9296
 */
9297
int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
9298
0
{
9299
0
    byte havePublic = 0, havePrivate = 0;
9300
0
    int ret;
9301
0
    word32 derSz = 0;
9302
0
    byte* derBuf = NULL;
9303
0
    DhKey* dhkey = NULL;
9304
9305
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH");
9306
9307
0
    if (pkey == NULL || key == NULL)
9308
0
        return WOLFSSL_FAILURE;
9309
9310
0
    clearEVPPkeyKeys(pkey);
9311
9312
0
    if (wolfSSL_DH_up_ref(key) != WOLFSSL_SUCCESS) {
9313
0
        WOLFSSL_MSG("Failed to increase dh key ref count");
9314
0
        return WOLFSSL_FAILURE;
9315
0
    }
9316
9317
0
    pkey->dh    = key;
9318
0
    pkey->ownDh = 1; /* pkey does not own DH but needs to call free on it */
9319
0
    pkey->type  = WC_EVP_PKEY_DH;
9320
0
    if (key->inSet == 0) {
9321
0
        if (SetDhInternal(key) != WOLFSSL_SUCCESS) {
9322
0
            WOLFSSL_MSG("SetDhInternal failed");
9323
0
            return WOLFSSL_FAILURE;
9324
0
        }
9325
0
    }
9326
9327
0
    dhkey = (DhKey*)key->internal;
9328
9329
0
    havePublic  = mp_unsigned_bin_size(&dhkey->pub)  > 0;
9330
0
    havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0;
9331
9332
    /* Get size of DER buffer only */
9333
0
    if (havePublic && !havePrivate) {
9334
0
        ret = wc_DhPubKeyToDer(dhkey, NULL, &derSz);
9335
0
    } else if (havePrivate) {
9336
0
        ret = wc_DhPrivKeyToDer(dhkey, NULL, &derSz);
9337
0
    } else {
9338
0
        ret = wc_DhParamsToDer(dhkey,NULL,&derSz);
9339
0
    }
9340
9341
0
    if (derSz == 0 || ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9342
0
       WOLFSSL_MSG("Failed to get size of DH Key");
9343
0
       return WOLFSSL_FAILURE;
9344
0
    }
9345
9346
0
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9347
0
    if (derBuf == NULL) {
9348
0
        WOLFSSL_MSG("malloc failed");
9349
0
        return WOLFSSL_FAILURE;
9350
0
    }
9351
9352
    /* Fill DER buffer */
9353
0
    if (havePublic && !havePrivate) {
9354
0
        ret = wc_DhPubKeyToDer(dhkey, derBuf, &derSz);
9355
0
    } else if (havePrivate) {
9356
0
        ret = wc_DhPrivKeyToDer(dhkey, derBuf, &derSz);
9357
0
    } else {
9358
0
        ret = wc_DhParamsToDer(dhkey,derBuf,&derSz);
9359
0
    }
9360
9361
0
    if (ret <= 0) {
9362
0
        WOLFSSL_MSG("Failed to export DH Key");
9363
0
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9364
0
        return WOLFSSL_FAILURE;
9365
0
    }
9366
9367
    /* Store DH key into pkey (DER format) */
9368
0
    pkey->pkey.ptr = (char*)derBuf;
9369
0
    pkey->pkey_sz = (int)derSz;
9370
9371
0
    return WOLFSSL_SUCCESS;
9372
0
}
9373
9374
WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key)
9375
0
{
9376
0
    if (!key) {
9377
0
        return NULL;
9378
0
    }
9379
0
    return key->dh;
9380
0
}
9381
9382
WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key)
9383
0
{
9384
0
    WOLFSSL_DH* local = NULL;
9385
9386
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DH");
9387
9388
0
    if (key == NULL || key->dh == NULL) {
9389
0
        WOLFSSL_MSG("Bad function argument");
9390
0
        return NULL;
9391
0
    }
9392
9393
0
    if (key->type == WC_EVP_PKEY_DH) {
9394
        /* if key->dh already exists copy instead of re-importing from DER */
9395
0
        if (key->dh != NULL) {
9396
0
            if (wolfSSL_DH_up_ref(key->dh) != WOLFSSL_SUCCESS) {
9397
0
                return NULL;
9398
0
            }
9399
0
            local = key->dh;
9400
0
        }
9401
0
        else {
9402
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
9403
0
    (HAVE_FIPS_VERSION>2)))
9404
0
            local = wolfSSL_DH_new();
9405
0
            if (local == NULL) {
9406
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure");
9407
0
                return NULL;
9408
0
            }
9409
0
            if (wolfSSL_DH_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9410
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9411
0
                wolfSSL_DH_free(local);
9412
0
                WOLFSSL_MSG("Error wolfSSL_DH_LoadDer");
9413
0
                local = NULL;
9414
0
            }
9415
#else
9416
            WOLFSSL_MSG("EVP_PKEY does not hold DH struct");
9417
            return NULL;
9418
#endif
9419
0
        }
9420
0
    }
9421
0
    else {
9422
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DH key");
9423
0
        wolfSSL_DH_free(local);
9424
0
        return NULL;
9425
0
    }
9426
9427
0
    return local;
9428
0
}
9429
#endif /* NO_DH && WOLFSSL_DH_EXTRA && NO_FILESYSTEM */
9430
9431
int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key)
9432
0
{
9433
0
    int ret;
9434
9435
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_assign");
9436
9437
    /* pkey and key checked if NULL in subsequent assign functions */
9438
0
    switch(type) {
9439
0
    #ifndef NO_RSA
9440
0
        case WC_EVP_PKEY_RSA:
9441
0
            ret = wolfSSL_EVP_PKEY_assign_RSA(pkey, (WOLFSSL_RSA*)key);
9442
0
            break;
9443
0
    #endif
9444
    #ifndef NO_DSA
9445
        case WC_EVP_PKEY_DSA:
9446
            ret = wolfSSL_EVP_PKEY_assign_DSA(pkey, (WOLFSSL_DSA*)key);
9447
            break;
9448
    #endif
9449
0
    #ifdef HAVE_ECC
9450
0
        case WC_EVP_PKEY_EC:
9451
0
            ret = wolfSSL_EVP_PKEY_assign_EC_KEY(pkey, (WOLFSSL_EC_KEY*)key);
9452
0
            break;
9453
0
    #endif
9454
0
    #ifndef NO_DH
9455
0
         case WC_EVP_PKEY_DH:
9456
0
            ret = wolfSSL_EVP_PKEY_assign_DH(pkey, (WOLFSSL_DH*)key);
9457
0
            break;
9458
0
    #endif
9459
0
        default:
9460
0
            WOLFSSL_MSG("Unknown EVP_PKEY type in wolfSSL_EVP_PKEY_assign.");
9461
0
            ret = WOLFSSL_FAILURE;
9462
0
    }
9463
9464
0
    return ret;
9465
0
}
9466
#endif /* WOLFSSL_QT || OPENSSL_ALL */
9467
9468
#if defined(HAVE_ECC)
9469
/* try and populate public pkey_sz and pkey.ptr */
9470
static int ECC_populate_EVP_PKEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
9471
0
{
9472
0
    int derSz = 0;
9473
0
    byte* derBuf = NULL;
9474
0
    ecc_key* ecc;
9475
9476
0
    if (pkey == NULL || key == NULL || key->internal == NULL)
9477
0
        return WOLFSSL_FAILURE;
9478
9479
0
    ecc = (ecc_key*)key->internal;
9480
0
    if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) {
9481
0
#ifdef HAVE_PKCS8
9482
0
        if (key->pkcs8HeaderSz) {
9483
            /* when key has pkcs8 header the pkey should too */
9484
0
            if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9485
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9486
0
                    DYNAMIC_TYPE_OPENSSL);
9487
0
                if (derBuf) {
9488
0
                    if (wc_EccKeyToPKCS8(ecc, derBuf, (word32*)&derSz) >= 0) {
9489
0
                        if (pkey->pkey.ptr) {
9490
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9491
0
                        }
9492
0
                        pkey->pkey_sz = (int)derSz;
9493
0
                        pkey->pkey.ptr = (char*)derBuf;
9494
0
                        pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9495
0
                        return WOLFSSL_SUCCESS;
9496
0
                    }
9497
0
                    else {
9498
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9499
0
                        derBuf = NULL;
9500
0
                    }
9501
0
                }
9502
0
            }
9503
0
        }
9504
0
        else
9505
0
#endif /* HAVE_PKCS8 */
9506
0
        {
9507
0
            if (ecc->type == ECC_PRIVATEKEY_ONLY) {
9508
0
                if (wc_ecc_make_pub(ecc, NULL) != MP_OKAY) {
9509
0
                    return WOLFSSL_FAILURE;
9510
0
                }
9511
0
            }
9512
9513
            /* if not, the pkey will be traditional ecc key */
9514
0
            if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) {
9515
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9516
0
                    DYNAMIC_TYPE_OPENSSL);
9517
0
                if (derBuf) {
9518
0
                    if (wc_EccKeyToDer(ecc, derBuf, (word32)derSz) >= 0) {
9519
0
                        if (pkey->pkey.ptr) {
9520
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9521
0
                        }
9522
0
                        pkey->pkey_sz = (int)derSz;
9523
0
                        pkey->pkey.ptr = (char*)derBuf;
9524
0
                        return WOLFSSL_SUCCESS;
9525
0
                    }
9526
0
                    else {
9527
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9528
0
                        derBuf = NULL;
9529
0
                    }
9530
0
                }
9531
0
            }
9532
0
        }
9533
0
    }
9534
0
    else if (ecc->type == ECC_PUBLICKEY) {
9535
0
        if ((derSz = wc_EccPublicKeyDerSize(ecc, 1)) > 0) {
9536
        #ifdef WOLFSSL_NO_REALLOC
9537
            derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9538
            if (derBuf != NULL) {
9539
                XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
9540
                XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9541
                pkey->pkey.ptr = NULL;
9542
            }
9543
        #else
9544
0
            derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, pkey->heap,
9545
0
                    DYNAMIC_TYPE_OPENSSL);
9546
0
        #endif
9547
0
            if (derBuf != NULL) {
9548
0
                pkey->pkey.ptr = (char*)derBuf;
9549
0
                if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, (word32)derSz,
9550
0
                        1)) < 0) {
9551
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
9552
0
                    derBuf = NULL;
9553
0
                }
9554
0
            }
9555
0
        }
9556
0
    }
9557
0
    if (derBuf != NULL) {
9558
0
        pkey->pkey_sz = (int)derSz;
9559
0
        return WOLFSSL_SUCCESS;
9560
0
    }
9561
0
    else {
9562
0
        return WOLFSSL_FAILURE;
9563
0
    }
9564
0
}
9565
9566
int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
9567
0
{
9568
0
#ifdef HAVE_ECC
9569
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY");
9570
0
    if (pkey == NULL || key == NULL)
9571
0
        return WOLFSSL_FAILURE;
9572
0
    clearEVPPkeyKeys(pkey);
9573
0
    if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) {
9574
0
        WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed");
9575
0
        return WOLFSSL_FAILURE;
9576
0
    }
9577
0
    pkey->ecc    = key;
9578
0
    pkey->ownEcc = 1; /* pkey needs to call free on key */
9579
0
    pkey->type   = WC_EVP_PKEY_EC;
9580
0
    return ECC_populate_EVP_PKEY(pkey, key);
9581
#else
9582
    (void)pkey;
9583
    (void)key;
9584
    return WOLFSSL_FAILURE;
9585
#endif /* HAVE_ECC */
9586
0
}
9587
9588
void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9589
0
{
9590
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE");
9591
9592
0
    if (ctx) {
9593
0
        switch (ctx->cipherType) {
9594
0
            case WC_ARC4_TYPE:
9595
0
                WOLFSSL_MSG("returning arc4 state");
9596
0
                return (void*)&ctx->cipher.arc4.x;
9597
9598
0
            default:
9599
0
                WOLFSSL_MSG("bad x state type");
9600
0
                return 0;
9601
0
        }
9602
0
    }
9603
9604
0
    return NULL;
9605
0
}
9606
int wolfSSL_EVP_PKEY_assign_EC_KEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY* key)
9607
0
{
9608
0
    int ret;
9609
9610
0
    if (pkey == NULL || key == NULL)
9611
0
        return WOLFSSL_FAILURE;
9612
9613
    /* try and populate public pkey_sz and pkey.ptr */
9614
0
    ret = ECC_populate_EVP_PKEY(pkey, key);
9615
0
    if (ret == WOLFSSL_SUCCESS) { /* take ownership of key if can be used */
9616
0
        clearEVPPkeyKeys(pkey); /* clear out any previous keys */
9617
9618
0
        pkey->type = WC_EVP_PKEY_EC;
9619
0
        pkey->ecc = key;
9620
0
        pkey->ownEcc = 1;
9621
0
    }
9622
0
    return ret;
9623
0
}
9624
#endif /* HAVE_ECC */
9625
9626
#ifndef NO_WOLFSSL_STUB
9627
const WOLFSSL_EVP_MD* wolfSSL_EVP_ripemd160(void)
9628
1
{
9629
1
    WOLFSSL_MSG("wolfSSL_ripemd160");
9630
1
    WOLFSSL_STUB("EVP_ripemd160");
9631
1
    return NULL;
9632
1
}
9633
#endif
9634
9635
9636
int wolfSSL_EVP_MD_pkey_type(const WOLFSSL_EVP_MD* type)
9637
0
{
9638
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
9639
9640
0
    WOLFSSL_ENTER("wolfSSL_EVP_MD_pkey_type");
9641
9642
0
    if (type != NULL) {
9643
0
        if (XSTRCMP(type, WC_SN_md5) == 0) {
9644
0
            ret = WC_NID_md5WithRSAEncryption;
9645
0
        }
9646
0
        else if (XSTRCMP(type, WC_SN_sha1) == 0) {
9647
0
            ret = WC_NID_sha1WithRSAEncryption;
9648
0
        }
9649
0
        else if (XSTRCMP(type, WC_SN_sha224) == 0) {
9650
0
            ret = WC_NID_sha224WithRSAEncryption;
9651
0
        }
9652
0
        else if (XSTRCMP(type, WC_SN_sha256) == 0) {
9653
0
            ret = WC_NID_sha256WithRSAEncryption;
9654
0
        }
9655
0
        else if (XSTRCMP(type, WC_SN_sha384) == 0) {
9656
0
            ret = WC_NID_sha384WithRSAEncryption;
9657
0
        }
9658
0
        else if (XSTRCMP(type, WC_SN_sha512) == 0) {
9659
0
            ret = WC_NID_sha512WithRSAEncryption;
9660
0
        }
9661
0
    }
9662
0
    else {
9663
0
        ret = WOLFSSL_FAILURE;
9664
0
    }
9665
9666
0
    WOLFSSL_LEAVE("wolfSSL_EVP_MD_pkey_type", ret);
9667
9668
0
    return ret;
9669
0
}
9670
9671
9672
9673
int wolfSSL_EVP_CIPHER_CTX_iv_length(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9674
0
{
9675
0
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_CTX_iv_length");
9676
9677
0
    if (ctx == NULL) {
9678
0
        WOLFSSL_MSG("No context");
9679
0
        return 0;
9680
0
    }
9681
9682
0
    switch (ctx->cipherType) {
9683
9684
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9685
0
        case WC_AES_128_CBC_TYPE :
9686
0
        case WC_AES_192_CBC_TYPE :
9687
0
        case WC_AES_256_CBC_TYPE :
9688
0
            WOLFSSL_MSG("AES CBC");
9689
0
            return WC_AES_BLOCK_SIZE;
9690
0
#endif
9691
0
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9692
0
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9693
0
#ifdef HAVE_AESGCM
9694
0
        case WC_AES_128_GCM_TYPE :
9695
0
        case WC_AES_192_GCM_TYPE :
9696
0
        case WC_AES_256_GCM_TYPE :
9697
0
            WOLFSSL_MSG("AES GCM");
9698
0
            if (ctx->ivSz != 0) {
9699
0
                return ctx->ivSz;
9700
0
            }
9701
0
            return GCM_NONCE_MID_SZ;
9702
0
#endif
9703
0
#ifdef HAVE_AESCCM
9704
0
        case WC_AES_128_CCM_TYPE :
9705
0
        case WC_AES_192_CCM_TYPE :
9706
0
        case WC_AES_256_CCM_TYPE :
9707
0
            WOLFSSL_MSG("AES CCM");
9708
0
            if (ctx->ivSz != 0) {
9709
0
                return ctx->ivSz;
9710
0
            }
9711
0
            return CCM_NONCE_MIN_SZ;
9712
0
#endif
9713
0
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9714
0
#ifdef WOLFSSL_AES_COUNTER
9715
0
        case WC_AES_128_CTR_TYPE :
9716
0
        case WC_AES_192_CTR_TYPE :
9717
0
        case WC_AES_256_CTR_TYPE :
9718
0
            WOLFSSL_MSG("AES CTR");
9719
0
            return WC_AES_BLOCK_SIZE;
9720
0
#endif
9721
0
#ifndef NO_DES3
9722
0
        case WC_DES_CBC_TYPE :
9723
0
            WOLFSSL_MSG("DES CBC");
9724
0
            return DES_BLOCK_SIZE;
9725
9726
0
        case WC_DES_EDE3_CBC_TYPE :
9727
0
            WOLFSSL_MSG("DES EDE3 CBC");
9728
0
            return DES_BLOCK_SIZE;
9729
0
#endif
9730
0
#ifndef NO_RC4
9731
0
        case WC_ARC4_TYPE :
9732
0
            WOLFSSL_MSG("ARC4");
9733
0
            return 0;
9734
0
#endif
9735
0
#ifdef WOLFSSL_AES_CFB
9736
0
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9737
0
        case WC_AES_128_CFB1_TYPE:
9738
0
        case WC_AES_192_CFB1_TYPE:
9739
0
        case WC_AES_256_CFB1_TYPE:
9740
0
            WOLFSSL_MSG("AES CFB1");
9741
0
            return WC_AES_BLOCK_SIZE;
9742
0
        case WC_AES_128_CFB8_TYPE:
9743
0
        case WC_AES_192_CFB8_TYPE:
9744
0
        case WC_AES_256_CFB8_TYPE:
9745
0
            WOLFSSL_MSG("AES CFB8");
9746
0
            return WC_AES_BLOCK_SIZE;
9747
0
#endif /* !HAVE_SELFTEST && !HAVE_FIPS */
9748
0
        case WC_AES_128_CFB128_TYPE:
9749
0
        case WC_AES_192_CFB128_TYPE:
9750
0
        case WC_AES_256_CFB128_TYPE:
9751
0
            WOLFSSL_MSG("AES CFB128");
9752
0
            return WC_AES_BLOCK_SIZE;
9753
0
#endif /* WOLFSSL_AES_CFB */
9754
0
#if defined(WOLFSSL_AES_OFB)
9755
0
        case WC_AES_128_OFB_TYPE:
9756
0
        case WC_AES_192_OFB_TYPE:
9757
0
        case WC_AES_256_OFB_TYPE:
9758
0
            WOLFSSL_MSG("AES OFB");
9759
0
            return WC_AES_BLOCK_SIZE;
9760
0
#endif /* WOLFSSL_AES_OFB */
9761
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9762
0
        case WC_AES_128_XTS_TYPE:
9763
0
        case WC_AES_256_XTS_TYPE:
9764
0
            WOLFSSL_MSG("AES XTS");
9765
0
            return WC_AES_BLOCK_SIZE;
9766
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9767
#ifdef HAVE_ARIA
9768
        case WC_ARIA_128_GCM_TYPE :
9769
        case WC_ARIA_192_GCM_TYPE :
9770
        case WC_ARIA_256_GCM_TYPE :
9771
            WOLFSSL_MSG("ARIA GCM");
9772
            if (ctx->ivSz != 0) {
9773
                return ctx->ivSz;
9774
            }
9775
            return GCM_NONCE_MID_SZ;
9776
#endif
9777
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9778
0
        case WC_CHACHA20_POLY1305_TYPE:
9779
0
            WOLFSSL_MSG("CHACHA20 POLY1305");
9780
0
            return CHACHA20_POLY1305_AEAD_IV_SIZE;
9781
0
#endif /* HAVE_CHACHA HAVE_POLY1305 */
9782
0
#ifdef HAVE_CHACHA
9783
0
        case WC_CHACHA20_TYPE:
9784
0
            WOLFSSL_MSG("CHACHA20");
9785
0
            return WOLFSSL_EVP_CHACHA_IV_BYTES;
9786
0
#endif /* HAVE_CHACHA */
9787
0
#ifdef WOLFSSL_SM4_CBC
9788
0
        case WC_SM4_CBC_TYPE :
9789
0
            WOLFSSL_MSG("SM4 CBC");
9790
0
            return SM4_BLOCK_SIZE;
9791
0
#endif
9792
0
#ifdef WOLFSSL_SM4_CTR
9793
0
        case WC_SM4_CTR_TYPE :
9794
0
            WOLFSSL_MSG("SM4 CTR");
9795
0
            return SM4_BLOCK_SIZE;
9796
0
#endif
9797
0
#ifdef WOLFSSL_SM4_GCM
9798
0
        case WC_SM4_GCM_TYPE :
9799
0
            WOLFSSL_MSG("SM4 GCM");
9800
0
            if (ctx->ivSz != 0) {
9801
0
                return ctx->ivSz;
9802
0
            }
9803
0
            return GCM_NONCE_MID_SZ;
9804
0
#endif
9805
0
#ifdef WOLFSSL_SM4_CCM
9806
0
        case WC_SM4_CCM_TYPE :
9807
0
            WOLFSSL_MSG("SM4 CCM");
9808
0
            if (ctx->ivSz != 0) {
9809
0
                return ctx->ivSz;
9810
0
            }
9811
0
            return CCM_NONCE_MIN_SZ;
9812
0
#endif
9813
9814
0
        case WC_NULL_CIPHER_TYPE :
9815
0
            WOLFSSL_MSG("NULL");
9816
0
            return 0;
9817
9818
0
        default: {
9819
0
            WOLFSSL_MSG("bad type");
9820
0
        }
9821
0
    }
9822
0
    return 0;
9823
0
}
9824
9825
int wolfSSL_EVP_CIPHER_iv_length(const WOLFSSL_EVP_CIPHER* cipher)
9826
5.06k
{
9827
5.06k
    const char *name = (const char *)cipher;
9828
5.06k
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_iv_length");
9829
9830
5.06k
#ifndef NO_AES
9831
5.06k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9832
5.06k
    #ifdef WOLFSSL_AES_128
9833
5.06k
    if (XSTRCMP(name, EVP_AES_128_CBC) == 0)
9834
174
        return WC_AES_BLOCK_SIZE;
9835
4.89k
    #endif
9836
4.89k
    #ifdef WOLFSSL_AES_192
9837
4.89k
    if (XSTRCMP(name, EVP_AES_192_CBC) == 0)
9838
51
        return WC_AES_BLOCK_SIZE;
9839
4.84k
    #endif
9840
4.84k
    #ifdef WOLFSSL_AES_256
9841
4.84k
    if (XSTRCMP(name, EVP_AES_256_CBC) == 0)
9842
82
        return WC_AES_BLOCK_SIZE;
9843
4.75k
    #endif
9844
4.75k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
9845
4.75k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9846
4.75k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9847
4.75k
#ifdef HAVE_AESGCM
9848
4.75k
    #ifdef WOLFSSL_AES_128
9849
4.75k
    if (XSTRCMP(name, EVP_AES_128_GCM) == 0)
9850
535
        return GCM_NONCE_MID_SZ;
9851
4.22k
    #endif
9852
4.22k
    #ifdef WOLFSSL_AES_192
9853
4.22k
    if (XSTRCMP(name, EVP_AES_192_GCM) == 0)
9854
178
        return GCM_NONCE_MID_SZ;
9855
4.04k
    #endif
9856
4.04k
    #ifdef WOLFSSL_AES_256
9857
4.04k
    if (XSTRCMP(name, EVP_AES_256_GCM) == 0)
9858
459
        return GCM_NONCE_MID_SZ;
9859
3.58k
    #endif
9860
3.58k
#endif /* HAVE_AESGCM */
9861
3.58k
#ifdef HAVE_AESCCM
9862
3.58k
    #ifdef WOLFSSL_AES_128
9863
3.58k
    if (XSTRCMP(name, EVP_AES_128_CCM) == 0)
9864
0
        return CCM_NONCE_MIN_SZ;
9865
3.58k
    #endif
9866
3.58k
    #ifdef WOLFSSL_AES_192
9867
3.58k
    if (XSTRCMP(name, EVP_AES_192_CCM) == 0)
9868
0
        return CCM_NONCE_MIN_SZ;
9869
3.58k
    #endif
9870
3.58k
    #ifdef WOLFSSL_AES_256
9871
3.58k
    if (XSTRCMP(name, EVP_AES_256_CCM) == 0)
9872
0
        return CCM_NONCE_MIN_SZ;
9873
3.58k
    #endif
9874
3.58k
#endif /* HAVE_AESCCM */
9875
3.58k
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9876
3.58k
#ifdef WOLFSSL_AES_COUNTER
9877
3.58k
    #ifdef WOLFSSL_AES_128
9878
3.58k
    if (XSTRCMP(name, EVP_AES_128_CTR) == 0)
9879
76
        return WC_AES_BLOCK_SIZE;
9880
3.51k
    #endif
9881
3.51k
    #ifdef WOLFSSL_AES_192
9882
3.51k
    if (XSTRCMP(name, EVP_AES_192_CTR) == 0)
9883
385
        return WC_AES_BLOCK_SIZE;
9884
3.12k
    #endif
9885
3.12k
    #ifdef WOLFSSL_AES_256
9886
3.12k
    if (XSTRCMP(name, EVP_AES_256_CTR) == 0)
9887
61
        return WC_AES_BLOCK_SIZE;
9888
3.06k
    #endif
9889
3.06k
#endif
9890
3.06k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9891
3.06k
    #ifdef WOLFSSL_AES_128
9892
3.06k
    if (XSTRCMP(name, EVP_AES_128_XTS) == 0)
9893
380
        return WC_AES_BLOCK_SIZE;
9894
2.68k
    #endif /* WOLFSSL_AES_128 */
9895
9896
2.68k
    #ifdef WOLFSSL_AES_256
9897
2.68k
    if (XSTRCMP(name, EVP_AES_256_XTS) == 0)
9898
99
        return WC_AES_BLOCK_SIZE;
9899
2.58k
    #endif /* WOLFSSL_AES_256 */
9900
2.58k
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9901
9902
2.58k
#endif
9903
#ifdef HAVE_ARIA
9904
    if (XSTRCMP(name, EVP_ARIA_128_GCM) == 0)
9905
        return GCM_NONCE_MID_SZ;
9906
    if (XSTRCMP(name, EVP_ARIA_192_GCM) == 0)
9907
        return GCM_NONCE_MID_SZ;
9908
    if (XSTRCMP(name, EVP_ARIA_256_GCM) == 0)
9909
        return GCM_NONCE_MID_SZ;
9910
#endif /* HAVE_ARIA */
9911
9912
2.58k
#ifndef NO_DES3
9913
2.58k
    if ((XSTRCMP(name, EVP_DES_CBC) == 0) ||
9914
2.37k
           (XSTRCMP(name, EVP_DES_EDE3_CBC) == 0)) {
9915
441
        return DES_BLOCK_SIZE;
9916
441
    }
9917
2.14k
#endif
9918
9919
2.14k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9920
2.14k
    if (XSTRCMP(name, EVP_CHACHA20_POLY1305) == 0)
9921
0
        return CHACHA20_POLY1305_AEAD_IV_SIZE;
9922
2.14k
#endif
9923
9924
2.14k
#ifdef HAVE_CHACHA
9925
2.14k
    if (XSTRCMP(name, EVP_CHACHA20) == 0)
9926
0
        return WOLFSSL_EVP_CHACHA_IV_BYTES;
9927
2.14k
#endif
9928
9929
2.14k
#ifdef WOLFSSL_SM4_CBC
9930
2.14k
    if (XSTRCMP(name, EVP_SM4_CBC) == 0)
9931
0
        return SM4_BLOCK_SIZE;
9932
2.14k
#endif
9933
2.14k
#ifdef WOLFSSL_SM4_CTR
9934
2.14k
    if (XSTRCMP(name, EVP_SM4_CTR) == 0)
9935
0
        return SM4_BLOCK_SIZE;
9936
2.14k
#endif
9937
2.14k
#ifdef WOLFSSL_SM4_GCM
9938
2.14k
    if (XSTRCMP(name, EVP_SM4_GCM) == 0)
9939
0
        return GCM_NONCE_MID_SZ;
9940
2.14k
#endif
9941
2.14k
#ifdef WOLFSSL_SM4_CCM
9942
2.14k
    if (XSTRCMP(name, EVP_SM4_CCM) == 0)
9943
0
        return CCM_NONCE_MIN_SZ;
9944
2.14k
#endif
9945
9946
2.14k
    (void)name;
9947
9948
2.14k
    return 0;
9949
2.14k
}
9950
9951
9952
int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9953
0
{
9954
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE_LEN");
9955
9956
0
    if (ctx) {
9957
0
        switch (ctx->cipherType) {
9958
0
            case WC_ARC4_TYPE:
9959
0
                WOLFSSL_MSG("returning arc4 state size");
9960
0
                return sizeof(Arc4);
9961
9962
0
            default:
9963
0
                WOLFSSL_MSG("bad x state type");
9964
0
                return 0;
9965
0
        }
9966
0
    }
9967
9968
0
    return 0;
9969
0
}
9970
9971
9972
/* return of pkey->type which will be WC_EVP_PKEY_RSA for example.
9973
 *
9974
 * type  type of EVP_PKEY
9975
 *
9976
 * returns type or if type is not found then WC_NID_undef
9977
 */
9978
int wolfSSL_EVP_PKEY_type(int type)
9979
0
{
9980
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_type");
9981
9982
0
    switch (type) {
9983
0
        case WC_EVP_PKEY_RSA:
9984
0
            return WC_EVP_PKEY_RSA;
9985
0
        case WC_EVP_PKEY_DSA:
9986
0
            return WC_EVP_PKEY_DSA;
9987
0
        case WC_EVP_PKEY_EC:
9988
0
            return WC_EVP_PKEY_EC;
9989
0
        case WC_EVP_PKEY_DH:
9990
0
            return WC_EVP_PKEY_DH;
9991
0
        default:
9992
0
            return WC_NID_undef;
9993
0
    }
9994
0
}
9995
9996
9997
int wolfSSL_EVP_PKEY_id(const WOLFSSL_EVP_PKEY *pkey)
9998
0
{
9999
0
    if (pkey != NULL)
10000
0
        return pkey->type;
10001
0
    return 0;
10002
0
}
10003
10004
10005
int wolfSSL_EVP_PKEY_base_id(const WOLFSSL_EVP_PKEY *pkey)
10006
0
{
10007
0
    if (pkey == NULL)
10008
0
        return WC_NID_undef;
10009
0
    return wolfSSL_EVP_PKEY_type(pkey->type);
10010
0
}
10011
10012
int wolfSSL_EVP_PKEY_get_default_digest_nid(WOLFSSL_EVP_PKEY *pkey, int *pnid)
10013
0
{
10014
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get_default_digest_nid");
10015
10016
0
    if (!pkey || !pnid) {
10017
0
        WOLFSSL_MSG("Bad parameter");
10018
0
        return WOLFSSL_FAILURE;
10019
0
    }
10020
10021
0
    switch (pkey->type) {
10022
0
    case WC_EVP_PKEY_HMAC:
10023
#ifndef NO_DSA
10024
    case WC_EVP_PKEY_DSA:
10025
#endif
10026
0
#ifndef NO_RSA
10027
0
    case WC_EVP_PKEY_RSA:
10028
0
#endif
10029
0
#ifdef HAVE_ECC
10030
0
    case WC_EVP_PKEY_EC:
10031
0
#endif
10032
0
        *pnid = WC_NID_sha256;
10033
0
        return WOLFSSL_SUCCESS;
10034
0
    default:
10035
0
        return WOLFSSL_FAILURE;
10036
0
    }
10037
0
}
10038
10039
#if defined(OPENSSL_ALL) || defined(WOLFSSL_WPAS_SMALL)
10040
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKCS82PKEY(const WOLFSSL_PKCS8_PRIV_KEY_INFO* p8)
10041
0
{
10042
0
    if (p8 == NULL || p8->pkey.ptr == NULL) {
10043
0
        return NULL;
10044
0
    }
10045
10046
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&p8->pkey.ptr,
10047
0
        p8->pkey_sz);
10048
0
}
10049
10050
/* in wolf PKCS8_PRIV_KEY_INFO and WOLFSSL_EVP_PKEY are same type */
10051
/* this function just casts and returns pointer */
10052
WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_EVP_PKEY2PKCS8(const WOLFSSL_EVP_PKEY* pkey)
10053
0
{
10054
0
    if (pkey == NULL || pkey->pkey.ptr == NULL) {
10055
0
        return NULL;
10056
0
    }
10057
10058
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&pkey->pkey.ptr,
10059
0
        pkey->pkey_sz);
10060
0
}
10061
#endif
10062
10063
/* increments ref count of WOLFSSL_EVP_PKEY. Return 1 on success, 0 on error */
10064
int wolfSSL_EVP_PKEY_up_ref(WOLFSSL_EVP_PKEY* pkey)
10065
1.16k
{
10066
1.16k
    if (pkey) {
10067
1.16k
        int ret;
10068
1.16k
        wolfSSL_RefInc(&pkey->ref, &ret);
10069
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
10070
        if (ret != 0) {
10071
            WOLFSSL_MSG("Failed to lock pkey mutex");
10072
        }
10073
    #else
10074
1.16k
        (void)ret;
10075
1.16k
    #endif
10076
10077
1.16k
        return WOLFSSL_SUCCESS;
10078
1.16k
    }
10079
10080
0
    return WOLFSSL_FAILURE;
10081
1.16k
}
10082
10083
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
10084
int wolfSSL_EVP_PKEY_assign_RSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_RSA* key)
10085
0
{
10086
0
    if (pkey == NULL || key == NULL)
10087
0
        return WOLFSSL_FAILURE;
10088
10089
0
    clearEVPPkeyKeys(pkey);
10090
0
    pkey->type = WC_EVP_PKEY_RSA;
10091
0
    pkey->rsa = key;
10092
0
    pkey->ownRsa = 1;
10093
10094
    /* try and populate pkey_sz and pkey.ptr */
10095
0
    if (key->internal) {
10096
0
        RsaKey* rsa = (RsaKey*)key->internal;
10097
0
        int ret = wc_RsaKeyToDer(rsa, NULL, 0);
10098
0
        if (ret > 0) {
10099
0
            word32 derSz = (word32)ret;
10100
0
            byte* derBuf = (byte*)XMALLOC((size_t)derSz, NULL,
10101
0
                DYNAMIC_TYPE_TMP_BUFFER);
10102
0
            if (derBuf != NULL) {
10103
0
                ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
10104
0
                if (ret >= 0) {
10105
0
                    pkey->pkey_sz = ret;
10106
0
                    pkey->pkey.ptr = (char*)derBuf;
10107
0
                }
10108
0
                else { /* failure - okay to ignore */
10109
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
10110
0
                    derBuf = NULL;
10111
0
                }
10112
0
            }
10113
0
        }
10114
0
    }
10115
10116
0
    return WOLFSSL_SUCCESS;
10117
0
}
10118
#endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
10119
10120
#ifndef NO_DSA
10121
int wolfSSL_EVP_PKEY_assign_DSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DSA* key)
10122
{
10123
    if (pkey == NULL || key == NULL)
10124
        return WOLFSSL_FAILURE;
10125
10126
    clearEVPPkeyKeys(pkey);
10127
    pkey->type = WC_EVP_PKEY_DSA;
10128
    pkey->dsa = key;
10129
    pkey->ownDsa = 1;
10130
10131
    return WOLFSSL_SUCCESS;
10132
}
10133
#endif /* !NO_DSA */
10134
10135
#ifndef NO_DH
10136
int wolfSSL_EVP_PKEY_assign_DH(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DH* key)
10137
0
{
10138
0
    if (pkey == NULL || key == NULL)
10139
0
        return WOLFSSL_FAILURE;
10140
10141
0
    clearEVPPkeyKeys(pkey);
10142
0
    pkey->type = WC_EVP_PKEY_DH;
10143
0
    pkey->dh = key;
10144
0
    pkey->ownDh = 1;
10145
10146
0
    return WOLFSSL_SUCCESS;
10147
0
}
10148
#endif /* !NO_DH */
10149
#endif /* OPENSSL_EXTRA */
10150
10151
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
10152
/* EVP Digest functions used with cURL build too */
10153
10154
static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md)
10155
35.8k
{
10156
35.8k
    if (md != NULL) {
10157
35.8k
        const struct s_ent *ent;
10158
175k
        for (ent = md_tbl; ent->name != NULL; ent++) {
10159
175k
            if (XSTRCMP((const char *)md, ent->name) == 0) {
10160
35.8k
                return ent->macType;
10161
35.8k
            }
10162
175k
        }
10163
35.8k
    }
10164
0
    return WC_HASH_TYPE_NONE;
10165
35.8k
}
10166
10167
int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
10168
                                     const WOLFSSL_EVP_MD* type,
10169
                                     WOLFSSL_ENGINE *impl)
10170
750
{
10171
750
    (void) impl;
10172
750
    WOLFSSL_ENTER("wolfSSL_EVP_DigestInit_ex");
10173
750
    return wolfSSL_EVP_DigestInit(ctx, type);
10174
750
}
10175
10176
/* this function makes the assumption that out buffer is big enough for digest*/
10177
int wolfSSL_EVP_Digest(const unsigned char* in, int inSz, unsigned char* out,
10178
                              unsigned int* outSz, const WOLFSSL_EVP_MD* evp,
10179
                              WOLFSSL_ENGINE* eng)
10180
0
{
10181
0
    int err;
10182
0
    int hashType = WC_HASH_TYPE_NONE;
10183
0
    int hashSz;
10184
10185
0
    WOLFSSL_ENTER("wolfSSL_EVP_Digest");
10186
0
    if (in == NULL || out == NULL || evp == NULL) {
10187
0
        WOLFSSL_MSG("Null argument passed in");
10188
0
        return WOLFSSL_FAILURE;
10189
0
    }
10190
10191
0
    err = wolfSSL_EVP_get_hashinfo(evp, &hashType, &hashSz);
10192
0
    if (err != WOLFSSL_SUCCESS)
10193
0
        return err;
10194
10195
0
    if (wc_Hash((enum wc_HashType)hashType, in, (word32)inSz, out,
10196
0
            (word32)hashSz) != 0) {
10197
0
        return WOLFSSL_FAILURE;
10198
0
    }
10199
10200
0
    if (outSz != NULL)
10201
0
        *outSz = (unsigned int)hashSz;
10202
10203
0
    (void)eng;
10204
0
    return WOLFSSL_SUCCESS;
10205
0
}
10206
10207
static const struct alias {
10208
            const char *name;
10209
            const char *alias;
10210
} digest_alias_tbl[] =
10211
{
10212
    {WC_SN_md4, "md4"},
10213
    {WC_SN_md5, "md5"},
10214
    {WC_SN_sha1, "sha1"},
10215
    {WC_SN_sha1, "SHA"},
10216
    {WC_SN_sha224, "sha224"},
10217
    {WC_SN_sha256, "sha256"},
10218
    {WC_SN_sha384, "sha384"},
10219
    {WC_SN_sha512, "sha512"},
10220
    {WC_SN_sha512_224, "sha512_224"},
10221
    {WC_SN_sha3_224, "sha3_224"},
10222
    {WC_SN_sha3_256, "sha3_256"},
10223
    {WC_SN_sha3_384, "sha3_384"},
10224
    {WC_SN_sha3_512, "sha3_512"},
10225
    {WC_SN_sm3, "sm3"},
10226
    {WC_SN_blake2b512, "blake2b512"},
10227
    {WC_SN_blake2s256, "blake2s256"},
10228
    {WC_SN_shake128, "shake128"},
10229
    {WC_SN_shake256, "shake256"},
10230
    { NULL, NULL}
10231
};
10232
10233
const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name)
10234
7
{
10235
7
    const struct alias  *al;
10236
7
    const struct s_ent *ent;
10237
10238
133
    for (al = digest_alias_tbl; al->name != NULL; al++) {
10239
126
        if(XSTRCMP(name, al->alias) == 0) {
10240
0
            name = al->name;
10241
0
            break;
10242
0
        }
10243
126
    }
10244
10245
32
    for (ent = md_tbl; ent->name != NULL; ent++) {
10246
32
        if(XSTRCMP(name, ent->name) == 0) {
10247
7
            return (WOLFSSL_EVP_MD *)ent->name;
10248
7
        }
10249
32
    }
10250
0
    return NULL;
10251
7
}
10252
10253
/* Returns the NID of the WOLFSSL_EVP_MD passed in.
10254
 *
10255
 * type - pointer to WOLFSSL_EVP_MD for which to return NID value
10256
 *
10257
 * Returns NID on success, or WC_NID_undef if none exists.
10258
 */
10259
int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type)
10260
0
{
10261
0
    const struct s_ent *ent ;
10262
0
    WOLFSSL_ENTER("EVP_MD_type");
10263
10264
0
    if (type == NULL) {
10265
0
        WOLFSSL_MSG("MD type arg is NULL");
10266
0
        return WC_NID_undef;
10267
0
    }
10268
10269
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
10270
0
        if (XSTRCMP((const char *)type, ent->name) == 0) {
10271
0
            return ent->nid;
10272
0
        }
10273
0
    }
10274
0
    return WC_NID_undef;
10275
0
}
10276
10277
#ifndef NO_MD4
10278
10279
    /* return a pointer to MD4 EVP type */
10280
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void)
10281
1
    {
10282
1
        WOLFSSL_ENTER("EVP_md4");
10283
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md4);
10284
1
    }
10285
10286
#endif /* !NO_MD4 */
10287
10288
10289
#ifndef NO_MD5
10290
10291
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void)
10292
1
    {
10293
1
        WOLFSSL_ENTER("EVP_md5");
10294
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md5);
10295
1
    }
10296
10297
#endif /* !NO_MD5 */
10298
10299
#ifdef HAVE_BLAKE2
10300
    /* return EVP_MD
10301
     * @param none
10302
     * @return "blake2b512"
10303
     */
10304
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2b512(void)
10305
0
    {
10306
0
        WOLFSSL_ENTER("wolfSSL_EVP_blake2b512");
10307
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_blake2b512);
10308
0
    }
10309
10310
#endif
10311
10312
#ifdef HAVE_BLAKE2S
10313
    /* return EVP_MD
10314
     * @param none
10315
     * @return "blake2s256"
10316
     */
10317
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2s256(void)
10318
0
    {
10319
0
        WOLFSSL_ENTER("EVP_blake2s256");
10320
0
        return wolfSSL_EVP_get_digestbyname("BLAKE2s256");
10321
0
    }
10322
10323
#endif
10324
10325
10326
#ifndef NO_WOLFSSL_STUB
10327
    void wolfSSL_EVP_set_pw_prompt(const char *prompt)
10328
0
    {
10329
0
        (void)prompt;
10330
0
        WOLFSSL_STUB("EVP_set_pw_prompt");
10331
0
    }
10332
#endif
10333
10334
#ifndef NO_WOLFSSL_STUB
10335
    const WOLFSSL_EVP_MD* wolfSSL_EVP_mdc2(void)
10336
1
    {
10337
1
        WOLFSSL_STUB("EVP_mdc2");
10338
1
        return NULL;
10339
1
    }
10340
#endif
10341
10342
#ifndef NO_SHA
10343
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void)
10344
1
    {
10345
1
        WOLFSSL_ENTER("EVP_sha1");
10346
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha1);
10347
1
    }
10348
#endif /* NO_SHA */
10349
10350
#ifdef WOLFSSL_SHA224
10351
10352
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void)
10353
1
    {
10354
1
        WOLFSSL_ENTER("EVP_sha224");
10355
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha224);
10356
1
    }
10357
10358
#endif /* WOLFSSL_SHA224 */
10359
10360
10361
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void)
10362
1
    {
10363
1
        WOLFSSL_ENTER("EVP_sha256");
10364
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha256);
10365
1
    }
10366
10367
#ifdef WOLFSSL_SHA384
10368
10369
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void)
10370
1
    {
10371
1
        WOLFSSL_ENTER("EVP_sha384");
10372
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha384);
10373
1
    }
10374
10375
#endif /* WOLFSSL_SHA384 */
10376
10377
#ifdef WOLFSSL_SHA512
10378
10379
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void)
10380
1
    {
10381
1
        WOLFSSL_ENTER("EVP_sha512");
10382
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512);
10383
1
    }
10384
10385
#ifndef WOLFSSL_NOSHA512_224
10386
10387
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_224(void)
10388
0
    {
10389
0
        WOLFSSL_ENTER("EVP_sha512_224");
10390
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_224);
10391
0
    }
10392
10393
#endif /* !WOLFSSL_NOSHA512_224 */
10394
10395
#ifndef WOLFSSL_NOSHA512_256
10396
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_256(void)
10397
0
    {
10398
0
        WOLFSSL_ENTER("EVP_sha512_256");
10399
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_256);
10400
0
    }
10401
10402
#endif /* !WOLFSSL_NOSHA512_224 */
10403
10404
#endif /* WOLFSSL_SHA512 */
10405
10406
#ifdef WOLFSSL_SHA3
10407
#ifndef WOLFSSL_NOSHA3_224
10408
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_224(void)
10409
0
    {
10410
0
        WOLFSSL_ENTER("EVP_sha3_224");
10411
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_224);
10412
0
    }
10413
#endif /* WOLFSSL_NOSHA3_224 */
10414
10415
10416
#ifndef WOLFSSL_NOSHA3_256
10417
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_256(void)
10418
0
    {
10419
0
        WOLFSSL_ENTER("EVP_sha3_256");
10420
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_256);
10421
0
    }
10422
#endif /* WOLFSSL_NOSHA3_256 */
10423
10424
#ifndef WOLFSSL_NOSHA3_384
10425
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void)
10426
0
    {
10427
0
        WOLFSSL_ENTER("EVP_sha3_384");
10428
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_384);
10429
0
    }
10430
#endif /* WOLFSSL_NOSHA3_384 */
10431
10432
#ifndef WOLFSSL_NOSHA3_512
10433
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void)
10434
0
    {
10435
0
        WOLFSSL_ENTER("EVP_sha3_512");
10436
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_512);
10437
0
    }
10438
#endif /* WOLFSSL_NOSHA3_512 */
10439
10440
#ifdef WOLFSSL_SHAKE128
10441
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake128(void)
10442
0
    {
10443
0
        WOLFSSL_ENTER("EVP_shake128");
10444
0
        return wolfSSL_EVP_get_digestbyname("SHAKE128");
10445
0
    }
10446
#endif /* WOLFSSL_SHAKE128 */
10447
10448
#ifdef WOLFSSL_SHAKE256
10449
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake256(void)
10450
0
    {
10451
0
        WOLFSSL_ENTER("EVP_shake256");
10452
0
        return wolfSSL_EVP_get_digestbyname("SHAKE256");
10453
0
    }
10454
#endif /* WOLFSSL_SHAKE256 */
10455
10456
#endif /* WOLFSSL_SHA3 */
10457
10458
#ifdef WOLFSSL_SM3
10459
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void)
10460
0
    {
10461
0
        WOLFSSL_ENTER("EVP_sm3");
10462
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sm3);
10463
0
    }
10464
#endif /* WOLFSSL_SM3 */
10465
10466
10467
    WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void)
10468
1.72k
    {
10469
1.72k
        WOLFSSL_EVP_MD_CTX* ctx;
10470
1.72k
        WOLFSSL_ENTER("EVP_MD_CTX_new");
10471
1.72k
        ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof(*ctx), NULL,
10472
1.72k
                                                       DYNAMIC_TYPE_OPENSSL);
10473
1.72k
        if (ctx){
10474
1.72k
            wolfSSL_EVP_MD_CTX_init(ctx);
10475
1.72k
        }
10476
1.72k
        return ctx;
10477
1.72k
    }
10478
10479
    void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX *ctx)
10480
1.72k
    {
10481
1.72k
        if (ctx) {
10482
1.72k
            WOLFSSL_ENTER("EVP_MD_CTX_free");
10483
1.72k
            wolfSSL_EVP_MD_CTX_cleanup(ctx);
10484
1.72k
            XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
10485
1.72k
        }
10486
1.72k
    }
10487
10488
    /* returns the NID of message digest used by the ctx */
10489
    int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx)
10490
0
    {
10491
0
        WOLFSSL_ENTER("EVP_MD_CTX_type");
10492
10493
0
        if (ctx) {
10494
0
            const struct s_ent *ent;
10495
10496
0
            if (ctx->isHMAC) {
10497
0
                return WC_NID_hmac;
10498
0
            }
10499
10500
0
            for(ent = md_tbl; ent->name != NULL; ent++) {
10501
0
                if (ctx->macType == ent->macType) {
10502
0
                    return ent->nid;
10503
0
                }
10504
0
            }
10505
            /* Return whatever we got */
10506
0
            return ctx->macType;
10507
0
        }
10508
0
        return 0;
10509
0
    }
10510
10511
10512
    /* returns digest size */
10513
0
    int wolfSSL_EVP_MD_CTX_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10514
0
        return(wolfSSL_EVP_MD_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10515
0
    }
10516
    /* returns block size */
10517
0
    int wolfSSL_EVP_MD_CTX_block_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10518
0
        return(wolfSSL_EVP_MD_block_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10519
0
    }
10520
10521
    void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx)
10522
2.47k
    {
10523
2.47k
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_init");
10524
2.47k
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_MD_CTX));
10525
2.47k
    }
10526
10527
    const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx)
10528
34.0k
    {
10529
34.0k
        const struct s_ent *ent;
10530
34.0k
        if (ctx == NULL)
10531
0
            return NULL;
10532
34.0k
        WOLFSSL_ENTER("EVP_MD_CTX_md");
10533
34.0k
        if (ctx->isHMAC) {
10534
0
            return "HMAC";
10535
0
        }
10536
166k
        for(ent = md_tbl; ent->name != NULL; ent++) {
10537
166k
            if(ctx->macType == ent->macType) {
10538
34.0k
                return (const WOLFSSL_EVP_MD *)ent->name;
10539
34.0k
            }
10540
166k
        }
10541
0
        return (WOLFSSL_EVP_MD *)NULL;
10542
34.0k
    }
10543
10544
    /* return alias name if has
10545
     * @param n message digest type name
10546
     * @return alias name, otherwise NULL
10547
     */
10548
    static const char* getMdAliasName(const char* n)
10549
0
    {
10550
10551
0
        const char* aliasnm = NULL;
10552
0
        const struct alias  *al;
10553
10554
0
        for (al = digest_alias_tbl; al->name != NULL; al++)
10555
0
            if(XSTRCMP(n, al->name) == 0) {
10556
0
                aliasnm = al->alias;
10557
0
                break;
10558
0
            }
10559
10560
0
        return aliasnm;
10561
0
    }
10562
10563
10564
    struct do_all_md {
10565
        void *arg;
10566
        void (*fn) (const WOLFSSL_EVP_MD *m,
10567
                    const char* from, const char* to, void *arg);
10568
    };
10569
10570
    /* do all md algorithm
10571
     * @param nm a pointer to WOLFSSL_OBJ_NAME
10572
     * @param arg arguments to pass to the callback
10573
     * @return none
10574
     */
10575
    static void md_do_all_func(const WOLFSSL_OBJ_NAME* nm, void* arg)
10576
0
    {
10577
0
        struct do_all_md *md = (struct do_all_md*)arg;
10578
10579
        /* sanity check */
10580
0
        if (md == NULL || nm == NULL || md->fn == NULL ||
10581
0
            nm->type != WOLFSSL_OBJ_NAME_TYPE_MD_METH)
10582
0
            return;
10583
10584
0
        if (nm->alias)
10585
0
            md->fn(NULL, nm->name, nm->data, md->arg);
10586
0
        else
10587
0
            md->fn((const WOLFSSL_EVP_MD *)nm->data, nm->name, NULL, md->arg);
10588
0
    }
10589
10590
    /* call md_do_all function to do all md algorithm via a callback function
10591
     * @param fn a callback function to be called with all 'md'
10592
     * @param args arguments to pass to the callback
10593
     * @return none
10594
     */
10595
    void wolfSSL_EVP_MD_do_all(void (*fn) (const WOLFSSL_EVP_MD *m,
10596
                 const char* from, const char* to, void* xx), void* args)
10597
0
    {
10598
0
        struct do_all_md md;
10599
10600
0
        md.fn = fn;
10601
0
        md.arg = args;
10602
10603
0
        wolfSSL_OBJ_NAME_do_all(WOLFSSL_OBJ_NAME_TYPE_MD_METH,
10604
0
                        md_do_all_func, &md);
10605
0
    }
10606
10607
    /* call "fn" based on OBJ_NAME type
10608
     * @param type OBJ_NAME type
10609
     * @param fn a callback function
10610
     * @param args arguments to pass to the callback
10611
     * @return none
10612
     */
10613
    void wolfSSL_OBJ_NAME_do_all(int type,
10614
                void (*fn)(const WOLFSSL_OBJ_NAME*, void* arg), void* arg)
10615
0
    {
10616
0
        WOLFSSL_OBJ_NAME objnm;
10617
10618
        /* sanity check */
10619
0
        if (!fn)
10620
0
            return;
10621
10622
0
        switch(type) {
10623
0
            case WOLFSSL_OBJ_NAME_TYPE_MD_METH:
10624
0
                {
10625
0
                    const struct s_ent *ent;
10626
                    /* loop all md */
10627
0
                    for (ent = md_tbl; ent->name != NULL; ent++){
10628
0
                        XMEMSET(&objnm, 0, sizeof(objnm));
10629
10630
                        /* populate objnm with info about the md */
10631
0
                        objnm.type = WOLFSSL_OBJ_NAME_TYPE_MD_METH;
10632
0
                        objnm.name = ent->name;
10633
0
                        objnm.data = (const char*)
10634
0
                                wolfSSL_EVP_get_digestbyname(ent->name);
10635
0
                        fn(&objnm, arg);
10636
10637
                        /* check if the md has alias and also call fn with it */
10638
0
                        objnm.name = getMdAliasName(ent->name);
10639
0
                        if (objnm.name != NULL) {
10640
0
                            objnm.alias |= WOLFSSL_OBJ_NAME_ALIAS;
10641
0
                            objnm.data = ent->name;
10642
0
                            fn(&objnm, arg);
10643
0
                        }
10644
0
                    }
10645
0
                }
10646
0
                break;
10647
0
            case WOLFSSL_OBJ_NAME_TYPE_CIPHER_METH:
10648
0
            case WOLFSSL_OBJ_NAME_TYPE_PKEY_METH:
10649
0
            case WOLFSSL_OBJ_NAME_TYPE_COMP_METH:
10650
0
            case WOLFSSL_OBJ_NAME_TYPE_NUM:
10651
0
                WOLFSSL_MSG("not implemented");
10652
0
                FALL_THROUGH;
10653
0
            case WOLFSSL_OBJ_NAME_TYPE_UNDEF:
10654
0
            default:
10655
0
                break;
10656
0
        }
10657
0
    }
10658
10659
    int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx)
10660
1.72k
    {
10661
1.72k
        int ret = WOLFSSL_SUCCESS;
10662
1.72k
        WOLFSSL_ENTER("wolfSSL_EVP_MD_CTX_cleanup");
10663
1.72k
    #ifdef OPENSSL_EXTRA
10664
1.72k
        if (ctx->pctx != NULL)
10665
487
            wolfSSL_EVP_PKEY_CTX_free(ctx->pctx);
10666
1.72k
    #endif
10667
10668
1.72k
        if (ctx->isHMAC) {
10669
487
            wc_HmacFree(&ctx->hash.hmac);
10670
487
        }
10671
1.23k
        else {
10672
1.23k
            switch (ctx->macType) {
10673
79
                case WC_HASH_TYPE_MD5:
10674
79
            #ifndef NO_MD5
10675
79
                    wc_Md5Free((wc_Md5*)&ctx->hash.digest);
10676
79
            #endif /* !NO_MD5 */
10677
79
                    break;
10678
86
                case WC_HASH_TYPE_SHA:
10679
86
            #ifndef NO_SHA
10680
86
                    wc_ShaFree((wc_Sha*)&ctx->hash.digest);
10681
86
            #endif /* !NO_SHA */
10682
86
                    break;
10683
90
                case WC_HASH_TYPE_SHA224:
10684
90
            #ifdef WOLFSSL_SHA224
10685
90
                    wc_Sha224Free((wc_Sha224*)&ctx->hash.digest);
10686
90
            #endif /* WOLFSSL_SHA224 */
10687
90
                    break;
10688
135
                case WC_HASH_TYPE_SHA256:
10689
135
            #ifndef NO_SHA256
10690
135
                    wc_Sha256Free((wc_Sha256*)&ctx->hash.digest);
10691
135
            #endif /* !NO_SHA256 */
10692
135
                    break;
10693
84
                case WC_HASH_TYPE_SHA384:
10694
84
            #ifdef WOLFSSL_SHA384
10695
84
                    wc_Sha384Free((wc_Sha384*)&ctx->hash.digest);
10696
84
            #endif /* WOLFSSL_SHA384 */
10697
84
                    break;
10698
126
                case WC_HASH_TYPE_SHA512:
10699
126
            #ifdef WOLFSSL_SHA512
10700
126
                    wc_Sha512Free((wc_Sha512*)&ctx->hash.digest);
10701
126
            #endif /* WOLFSSL_SHA512 */
10702
126
                    break;
10703
0
                case WC_HASH_TYPE_SHA512_224:
10704
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10705
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10706
0
                    wc_Sha512_224Free((wc_Sha512*)&ctx->hash.digest);
10707
0
            #endif
10708
0
                    break;
10709
0
                case WC_HASH_TYPE_SHA512_256:
10710
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10711
0
                 defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10712
0
                    wc_Sha512_256Free((wc_Sha512*)&ctx->hash.digest);
10713
0
            #endif
10714
0
                    break;
10715
0
                case WC_HASH_TYPE_SHA3_224:
10716
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
10717
0
                    wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest);
10718
0
            #endif
10719
0
                    break;
10720
0
                case WC_HASH_TYPE_SHA3_256:
10721
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
10722
0
                    wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest);
10723
0
            #endif
10724
0
                    break;
10725
0
                case WC_HASH_TYPE_SHA3_384:
10726
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
10727
0
                    wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest);
10728
0
            #endif
10729
0
                    break;
10730
0
                case WC_HASH_TYPE_SHA3_512:
10731
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
10732
0
                    wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest);
10733
0
            #endif
10734
0
                    break;
10735
0
                case WC_HASH_TYPE_SM3:
10736
0
            #ifdef WOLFSSL_SM3
10737
0
                    wc_Sm3Free(&ctx->hash.digest.sm3);
10738
0
            #endif
10739
0
                    break;
10740
487
                case WC_HASH_TYPE_NONE:
10741
                    /* Not an error since an unused struct could be free'd or
10742
                     * reset. */
10743
487
                    break;
10744
0
                case WC_HASH_TYPE_SHAKE128:
10745
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
10746
0
                    wc_Shake128_Free(&ctx->hash.digest.shake);
10747
0
            #endif
10748
0
                    break;
10749
0
                case WC_HASH_TYPE_SHAKE256:
10750
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
10751
0
                    wc_Shake256_Free(&ctx->hash.digest.shake);
10752
0
            #endif
10753
0
                    break;
10754
0
                case WC_HASH_TYPE_MD2:
10755
150
                case WC_HASH_TYPE_MD4:
10756
150
                case WC_HASH_TYPE_MD5_SHA:
10757
150
                case WC_HASH_TYPE_BLAKE2B:
10758
150
                case WC_HASH_TYPE_BLAKE2S:
10759
150
                default:
10760
150
                    ret = WOLFSSL_FAILURE;
10761
150
                    break;
10762
1.23k
            }
10763
1.23k
        }
10764
1.72k
        ForceZero(ctx, sizeof(*ctx));
10765
1.72k
        ctx->macType = WC_HASH_TYPE_NONE;
10766
1.72k
        return ret;
10767
1.72k
    }
10768
10769
    /* WOLFSSL_SUCCESS on ok */
10770
    int wolfSSL_EVP_DigestInit(WOLFSSL_EVP_MD_CTX* ctx,
10771
                               const WOLFSSL_EVP_MD* md)
10772
750
    {
10773
750
        int ret = WOLFSSL_SUCCESS;
10774
    #ifdef WOLFSSL_ASYNC_CRYPT
10775
        wc_static_assert(WC_ASYNC_DEV_SIZE >= sizeof(WC_ASYNC_DEV));
10776
    #endif
10777
10778
750
        WOLFSSL_ENTER("EVP_DigestInit");
10779
10780
750
        if (ctx == NULL) {
10781
0
            return WOLFSSL_FAILURE;
10782
0
        }
10783
10784
750
        wolfSSL_EVP_MD_CTX_init(ctx);
10785
10786
        /* Set to 0 if no match */
10787
750
        ctx->macType = EvpMd2MacType(md);
10788
750
        if (md == NULL) {
10789
0
             XMEMSET(&ctx->hash.digest, 0, sizeof(WOLFSSL_Hasher));
10790
0
        } else
10791
750
    #ifndef NO_SHA
10792
750
        if ((XSTRCMP(md, "SHA") == 0) || (XSTRCMP(md, WC_SN_sha1) == 0)) {
10793
86
             ret = wolfSSL_SHA_Init(&(ctx->hash.digest.sha));
10794
86
        } else
10795
664
    #endif
10796
664
    #ifndef NO_SHA256
10797
664
        if (XSTRCMP(md, WC_SN_sha256) == 0) {
10798
135
             ret = wolfSSL_SHA256_Init(&(ctx->hash.digest.sha256));
10799
135
        } else
10800
529
    #endif
10801
529
    #ifdef WOLFSSL_SHA224
10802
529
        if (XSTRCMP(md, WC_SN_sha224) == 0) {
10803
90
             ret = wolfSSL_SHA224_Init(&(ctx->hash.digest.sha224));
10804
90
        } else
10805
439
    #endif
10806
439
    #ifdef WOLFSSL_SHA384
10807
439
        if (XSTRCMP(md, WC_SN_sha384) == 0) {
10808
84
             ret = wolfSSL_SHA384_Init(&(ctx->hash.digest.sha384));
10809
84
        } else
10810
355
    #endif
10811
355
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10812
355
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10813
355
        if (XSTRCMP(md, WC_SN_sha512_224) == 0) {
10814
0
             ret = wolfSSL_SHA512_224_Init(&(ctx->hash.digest.sha512));
10815
0
        } else
10816
355
    #endif
10817
355
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10818
355
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10819
355
        if (XSTRCMP(md, WC_SN_sha512_256) == 0) {
10820
0
             ret = wolfSSL_SHA512_256_Init(&(ctx->hash.digest.sha512));
10821
0
        } else
10822
355
    #endif
10823
355
    #ifdef WOLFSSL_SHA512
10824
355
        if (XSTRCMP(md, WC_SN_sha512) == 0) {
10825
126
             ret = wolfSSL_SHA512_Init(&(ctx->hash.digest.sha512));
10826
126
        } else
10827
229
    #endif
10828
229
    #ifndef NO_MD4
10829
229
        if (XSTRCMP(md, WC_SN_md4) == 0) {
10830
150
            wolfSSL_MD4_Init(&(ctx->hash.digest.md4));
10831
150
        } else
10832
79
    #endif
10833
79
    #ifndef NO_MD5
10834
79
        if (XSTRCMP(md, WC_SN_md5) == 0) {
10835
79
            ret = wolfSSL_MD5_Init(&(ctx->hash.digest.md5));
10836
79
        } else
10837
0
    #endif
10838
0
#ifdef WOLFSSL_SHA3
10839
0
    #ifndef WOLFSSL_NOSHA3_224
10840
0
        if (XSTRCMP(md, WC_SN_sha3_224) == 0) {
10841
0
             ret = wolfSSL_SHA3_224_Init(&(ctx->hash.digest.sha3_224));
10842
0
        } else
10843
0
    #endif
10844
0
    #ifndef WOLFSSL_NOSHA3_256
10845
0
        if (XSTRCMP(md, WC_SN_sha3_256) == 0) {
10846
0
             ret = wolfSSL_SHA3_256_Init(&(ctx->hash.digest.sha3_256));
10847
0
        } else
10848
0
    #endif
10849
0
    #ifndef WOLFSSL_NOSHA3_384
10850
0
        if (XSTRCMP(md, WC_SN_sha3_384) == 0) {
10851
0
             ret = wolfSSL_SHA3_384_Init(&(ctx->hash.digest.sha3_384));
10852
0
        } else
10853
0
    #endif
10854
0
    #ifndef WOLFSSL_NOSHA3_512
10855
0
        if (XSTRCMP(md, WC_SN_sha3_512) == 0) {
10856
0
             ret = wolfSSL_SHA3_512_Init(&(ctx->hash.digest.sha3_512));
10857
0
        } else
10858
0
    #endif
10859
0
    #ifdef WOLFSSL_SHAKE128
10860
0
        if (XSTRCMP(md, WC_SN_shake128) == 0) {
10861
0
            if (wc_InitShake128(&(ctx->hash.digest.shake), NULL,
10862
0
                INVALID_DEVID) != 0) {
10863
0
                ret = WOLFSSL_FAILURE;
10864
0
            }
10865
0
        } else
10866
0
    #endif
10867
0
    #ifdef WOLFSSL_SHAKE256
10868
0
        if (XSTRCMP(md, WC_SN_shake256) == 0) {
10869
0
            if (wc_InitShake256(&(ctx->hash.digest.shake), NULL,
10870
0
                INVALID_DEVID) != 0) {
10871
0
                ret = WOLFSSL_FAILURE;
10872
0
            }
10873
0
        } else
10874
0
    #endif
10875
0
#endif
10876
0
    #ifdef WOLFSSL_SM3
10877
0
        if (XSTRCMP(md, WC_SN_sm3) == 0) {
10878
0
             ret = wc_InitSm3(&ctx->hash.digest.sm3, NULL, INVALID_DEVID);
10879
0
             if (ret == 0) {
10880
0
                ret = WOLFSSL_SUCCESS;
10881
0
             }
10882
0
             else {
10883
0
                ret = WOLFSSL_FAILURE;
10884
0
             }
10885
0
        } else
10886
0
    #endif
10887
0
    #ifdef HAVE_BLAKE2
10888
0
        if (XSTRCMP(md, WC_SN_blake2b512) == 0) {
10889
0
            if (wc_InitBlake2b(&ctx->hash.digest.blake2b,
10890
0
                    WC_BLAKE2B_DIGEST_SIZE) != 0) {
10891
0
                ret = WOLFSSL_FAILURE;
10892
0
            }
10893
0
        } else
10894
0
    #endif
10895
0
    #ifdef HAVE_BLAKE2S
10896
0
        if (XSTRCMP(md, WC_SN_blake2s256) == 0) {
10897
0
            if (wc_InitBlake2s(&ctx->hash.digest.blake2s,
10898
0
                    WC_BLAKE2S_DIGEST_SIZE) != 0) {
10899
0
                ret = WOLFSSL_FAILURE;
10900
0
            }
10901
0
        } else
10902
0
    #endif
10903
0
        {
10904
0
             ctx->macType = WC_HASH_TYPE_NONE;
10905
0
             return WOLFSSL_FAILURE;
10906
0
        }
10907
10908
750
        return ret;
10909
750
    }
10910
10911
    /* WOLFSSL_SUCCESS on ok, WOLFSSL_FAILURE on failure */
10912
    int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data,
10913
                                size_t sz)
10914
33.2k
    {
10915
33.2k
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
10916
33.2k
        enum wc_HashType macType;
10917
10918
33.2k
        WOLFSSL_ENTER("EVP_DigestUpdate");
10919
10920
33.2k
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
10921
33.2k
        switch (macType) {
10922
6.30k
            case WC_HASH_TYPE_MD4:
10923
6.30k
        #ifndef NO_MD4
10924
6.30k
                wolfSSL_MD4_Update((WOLFSSL_MD4_CTX*)&ctx->hash, data,
10925
6.30k
                                  (unsigned long)sz);
10926
6.30k
                ret = WOLFSSL_SUCCESS;
10927
6.30k
        #endif
10928
6.30k
                break;
10929
1.87k
            case WC_HASH_TYPE_MD5:
10930
1.87k
        #ifndef NO_MD5
10931
1.87k
                ret = wolfSSL_MD5_Update((WOLFSSL_MD5_CTX*)&ctx->hash, data,
10932
1.87k
                                  (unsigned long)sz);
10933
1.87k
        #endif
10934
1.87k
                break;
10935
4.78k
            case WC_HASH_TYPE_SHA:
10936
4.78k
        #ifndef NO_SHA
10937
4.78k
                ret = wolfSSL_SHA_Update((WOLFSSL_SHA_CTX*)&ctx->hash, data,
10938
4.78k
                                  (unsigned long)sz);
10939
4.78k
        #endif
10940
4.78k
                break;
10941
4.24k
            case WC_HASH_TYPE_SHA224:
10942
4.24k
        #ifdef WOLFSSL_SHA224
10943
4.24k
                ret = wolfSSL_SHA224_Update((WOLFSSL_SHA224_CTX*)&ctx->hash, data,
10944
4.24k
                                     (unsigned long)sz);
10945
4.24k
        #endif
10946
4.24k
                break;
10947
1.49k
            case WC_HASH_TYPE_SHA256:
10948
1.49k
        #ifndef NO_SHA256
10949
1.49k
                ret = wolfSSL_SHA256_Update((WOLFSSL_SHA256_CTX*)&ctx->hash, data,
10950
1.49k
                                     (unsigned long)sz);
10951
1.49k
        #endif /* !NO_SHA256 */
10952
1.49k
                break;
10953
7.77k
            case WC_HASH_TYPE_SHA384:
10954
7.77k
        #ifdef WOLFSSL_SHA384
10955
7.77k
                ret = wolfSSL_SHA384_Update((WOLFSSL_SHA384_CTX*)&ctx->hash, data,
10956
7.77k
                                     (unsigned long)sz);
10957
7.77k
        #endif
10958
7.77k
                break;
10959
6.81k
            case WC_HASH_TYPE_SHA512:
10960
6.81k
        #ifdef WOLFSSL_SHA512
10961
6.81k
                ret = wolfSSL_SHA512_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10962
6.81k
                                     (unsigned long)sz);
10963
6.81k
        #endif /* WOLFSSL_SHA512 */
10964
6.81k
                break;
10965
10966
0
            case WC_HASH_TYPE_SHA512_224:
10967
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10968
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10969
0
                ret = wolfSSL_SHA512_224_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10970
0
                                     (unsigned long)sz);
10971
        #else
10972
                ret = NOT_COMPILED_IN;
10973
        #endif
10974
0
                break;
10975
10976
0
            case WC_HASH_TYPE_SHA512_256:
10977
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10978
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10979
0
                ret = wolfSSL_SHA512_256_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10980
0
                                     (unsigned long)sz);
10981
        #else
10982
                ret = NOT_COMPILED_IN;
10983
        #endif /* WOLFSSL_SHA512 */
10984
0
                break;
10985
10986
0
            case WC_HASH_TYPE_SHA3_224:
10987
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
10988
0
                ret = wolfSSL_SHA3_224_Update((WOLFSSL_SHA3_224_CTX*)&ctx->hash, data,
10989
0
                                     (unsigned long)sz);
10990
0
        #endif
10991
0
                break;
10992
0
            case WC_HASH_TYPE_SHA3_256:
10993
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
10994
0
                ret = wolfSSL_SHA3_256_Update((WOLFSSL_SHA3_256_CTX*)&ctx->hash, data,
10995
0
                                     (unsigned long)sz);
10996
0
        #endif
10997
0
                break;
10998
0
            case WC_HASH_TYPE_SHA3_384:
10999
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
11000
0
                ret = wolfSSL_SHA3_384_Update((WOLFSSL_SHA3_384_CTX*)&ctx->hash, data,
11001
0
                                     (unsigned long)sz);
11002
0
        #endif
11003
0
                break;
11004
0
            case WC_HASH_TYPE_SHA3_512:
11005
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
11006
0
                ret = wolfSSL_SHA3_512_Update((WOLFSSL_SHA3_512_CTX*)&ctx->hash, data,
11007
0
                                     (unsigned long)sz);
11008
0
        #endif
11009
0
                break;
11010
0
            case WC_HASH_TYPE_SM3:
11011
0
        #ifdef WOLFSSL_SM3
11012
0
                ret = wc_Sm3Update(&ctx->hash.digest.sm3, data, (word32)sz);
11013
0
                if (ret == 0) {
11014
0
                    ret = WOLFSSL_SUCCESS;
11015
0
                }
11016
0
                else {
11017
0
                    ret = WOLFSSL_FAILURE;
11018
0
                }
11019
        #else
11020
                ret = NOT_COMPILED_IN;
11021
        #endif
11022
0
                break;
11023
0
            case WC_HASH_TYPE_SHAKE128:
11024
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11025
0
                if (wc_Shake128_Update(&ctx->hash.digest.shake,
11026
0
                        (const byte*)data, (word32)sz) == 0) {
11027
11028
0
                    ret = WOLFSSL_SUCCESS;
11029
0
                }
11030
        #else
11031
                ret = NOT_COMPILED_IN;
11032
        #endif
11033
0
                break;
11034
0
            case WC_HASH_TYPE_SHAKE256:
11035
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11036
0
                if (wc_Shake256_Update(&ctx->hash.digest.shake,
11037
0
                        (const byte*)data, (word32)sz) == 0) {
11038
0
                    ret = WOLFSSL_SUCCESS;
11039
0
                }
11040
        #else
11041
                ret = NOT_COMPILED_IN;
11042
        #endif
11043
0
                break;
11044
0
        #ifdef HAVE_BLAKE2
11045
0
            case WC_HASH_TYPE_BLAKE2B:
11046
0
                if (wc_Blake2bUpdate(&ctx->hash.digest.blake2b,
11047
0
                        (const byte*)data, (word32)sz) == 0) {
11048
0
                    ret = WOLFSSL_SUCCESS;
11049
0
                }
11050
0
                break;
11051
0
        #endif
11052
0
        #ifdef HAVE_BLAKE2S
11053
0
            case WC_HASH_TYPE_BLAKE2S:
11054
0
                if (wc_Blake2sUpdate(&ctx->hash.digest.blake2s,
11055
0
                        (const byte*)data, (word32)sz) == 0) {
11056
0
                    ret = WOLFSSL_SUCCESS;
11057
0
                }
11058
0
                break;
11059
0
        #endif
11060
0
            case WC_HASH_TYPE_NONE:
11061
0
            case WC_HASH_TYPE_MD2:
11062
0
            case WC_HASH_TYPE_MD5_SHA:
11063
        #ifndef HAVE_BLAKE2
11064
            case WC_HASH_TYPE_BLAKE2B:
11065
        #endif
11066
        #ifndef HAVE_BLAKE2S
11067
            case WC_HASH_TYPE_BLAKE2S:
11068
        #endif
11069
0
            default:
11070
0
                return WOLFSSL_FAILURE;
11071
33.2k
        }
11072
11073
33.2k
        return ret;
11074
33.2k
    }
11075
11076
    /* WOLFSSL_SUCCESS on ok */
11077
    static int wolfSSL_EVP_DigestFinal_Common(WOLFSSL_EVP_MD_CTX* ctx,
11078
            unsigned char* md, unsigned int* s, enum wc_HashType macType)
11079
750
    {
11080
750
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11081
11082
750
        switch (macType) {
11083
150
            case WC_HASH_TYPE_MD4:
11084
150
        #ifndef NO_MD4
11085
150
                wolfSSL_MD4_Final(md, (WOLFSSL_MD4_CTX*)&ctx->hash);
11086
150
                if (s) *s = WC_MD4_DIGEST_SIZE;
11087
150
                ret = WOLFSSL_SUCCESS;
11088
150
        #endif
11089
150
                break;
11090
79
            case WC_HASH_TYPE_MD5:
11091
79
        #ifndef NO_MD5
11092
79
                ret = wolfSSL_MD5_Final(md, (WOLFSSL_MD5_CTX*)&ctx->hash);
11093
79
                if (s) *s = WC_MD5_DIGEST_SIZE;
11094
79
        #endif
11095
79
                break;
11096
86
            case WC_HASH_TYPE_SHA:
11097
86
        #ifndef NO_SHA
11098
86
                ret = wolfSSL_SHA_Final(md, (WOLFSSL_SHA_CTX*)&ctx->hash);
11099
86
                if (s) *s = WC_SHA_DIGEST_SIZE;
11100
86
        #endif
11101
86
                break;
11102
90
            case WC_HASH_TYPE_SHA224:
11103
90
        #ifdef WOLFSSL_SHA224
11104
90
                ret = wolfSSL_SHA224_Final(md, (WOLFSSL_SHA224_CTX*)&ctx->hash);
11105
90
                if (s) *s = WC_SHA224_DIGEST_SIZE;
11106
90
        #endif
11107
90
                break;
11108
135
            case WC_HASH_TYPE_SHA256:
11109
135
        #ifndef NO_SHA256
11110
135
                ret = wolfSSL_SHA256_Final(md, (WOLFSSL_SHA256_CTX*)&ctx->hash);
11111
135
                if (s) *s = WC_SHA256_DIGEST_SIZE;
11112
135
        #endif /* !NO_SHA256 */
11113
135
                break;
11114
84
            case WC_HASH_TYPE_SHA384:
11115
84
        #ifdef WOLFSSL_SHA384
11116
84
                ret = wolfSSL_SHA384_Final(md, (WOLFSSL_SHA384_CTX*)&ctx->hash);
11117
84
                if (s) *s = WC_SHA384_DIGEST_SIZE;
11118
84
        #endif
11119
84
                break;
11120
126
            case WC_HASH_TYPE_SHA512:
11121
126
        #ifdef WOLFSSL_SHA512
11122
126
                ret = wolfSSL_SHA512_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11123
126
                if (s) *s = WC_SHA512_DIGEST_SIZE;
11124
126
        #endif /* WOLFSSL_SHA512 */
11125
126
                break;
11126
0
            case WC_HASH_TYPE_SHA512_224:
11127
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11128
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
11129
0
                ret = wolfSSL_SHA512_224_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11130
0
                if (s) *s = WC_SHA512_224_DIGEST_SIZE;
11131
        #else
11132
                ret = NOT_COMPILED_IN;
11133
        #endif
11134
0
                break;
11135
0
            case WC_HASH_TYPE_SHA512_256:
11136
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11137
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
11138
0
                ret = wolfSSL_SHA512_256_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11139
0
                if (s) *s = WC_SHA512_256_DIGEST_SIZE;
11140
        #else
11141
                ret = NOT_COMPILED_IN;
11142
        #endif
11143
0
                break;
11144
0
            case WC_HASH_TYPE_SHA3_224:
11145
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
11146
0
                ret = wolfSSL_SHA3_224_Final(md, (WOLFSSL_SHA3_224_CTX*)&ctx->hash);
11147
0
                if (s) *s = WC_SHA3_224_DIGEST_SIZE;
11148
0
        #endif
11149
0
                break;
11150
0
            case WC_HASH_TYPE_SHA3_256:
11151
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
11152
0
                ret = wolfSSL_SHA3_256_Final(md, (WOLFSSL_SHA3_256_CTX*)&ctx->hash);
11153
0
                if (s) *s = WC_SHA3_256_DIGEST_SIZE;
11154
0
        #endif
11155
0
                break;
11156
0
            case WC_HASH_TYPE_SHA3_384:
11157
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
11158
0
                ret = wolfSSL_SHA3_384_Final(md, (WOLFSSL_SHA3_384_CTX*)&ctx->hash);
11159
0
                if (s) *s = WC_SHA3_384_DIGEST_SIZE;
11160
0
        #endif
11161
0
                break;
11162
0
            case WC_HASH_TYPE_SHA3_512:
11163
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
11164
0
                ret = wolfSSL_SHA3_512_Final(md, (WOLFSSL_SHA3_512_CTX*)&ctx->hash);
11165
0
                if (s) *s = WC_SHA3_512_DIGEST_SIZE;
11166
0
        #endif
11167
0
                break;
11168
0
            case WC_HASH_TYPE_SM3:
11169
0
        #ifdef WOLFSSL_SM3
11170
0
                ret = wc_Sm3Final(&ctx->hash.digest.sm3, md);
11171
0
                if (ret == 0) {
11172
0
                    ret = WOLFSSL_SUCCESS;
11173
0
                }
11174
0
                else {
11175
0
                    ret = WOLFSSL_FAILURE;
11176
0
                }
11177
0
                if (s) *s = WC_SM3_DIGEST_SIZE;
11178
        #else
11179
                ret = NOT_COMPILED_IN;
11180
        #endif
11181
0
                break;
11182
0
            case WC_HASH_TYPE_SHAKE128:
11183
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11184
0
                if (wc_Shake128_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11185
0
                    ret = WOLFSSL_SUCCESS;
11186
0
                }
11187
        #else
11188
                ret = NOT_COMPILED_IN;
11189
        #endif
11190
0
                break;
11191
0
            case WC_HASH_TYPE_SHAKE256:
11192
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11193
0
                if (wc_Shake256_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11194
0
                    ret = WOLFSSL_SUCCESS;
11195
0
                }
11196
        #else
11197
                ret = NOT_COMPILED_IN;
11198
        #endif
11199
0
                break;
11200
0
            case WC_HASH_TYPE_BLAKE2B:
11201
0
        #ifdef HAVE_BLAKE2
11202
0
                if (wc_Blake2bFinal(&ctx->hash.digest.blake2b, md,
11203
0
                        WC_BLAKE2B_DIGEST_SIZE) == 0) {
11204
0
                    if (s) *s = WC_BLAKE2B_DIGEST_SIZE;
11205
0
                    ret = WOLFSSL_SUCCESS;
11206
0
                }
11207
        #else
11208
                ret = NOT_COMPILED_IN;
11209
        #endif
11210
0
                break;
11211
0
            case WC_HASH_TYPE_BLAKE2S:
11212
0
        #ifdef HAVE_BLAKE2S
11213
0
                if (wc_Blake2sFinal(&ctx->hash.digest.blake2s, md,
11214
0
                        WC_BLAKE2S_DIGEST_SIZE) == 0) {
11215
0
                    if (s) *s = WC_BLAKE2S_DIGEST_SIZE;
11216
0
                    ret = WOLFSSL_SUCCESS;
11217
0
                }
11218
        #else
11219
                ret = NOT_COMPILED_IN;
11220
        #endif
11221
0
                break;
11222
0
            case WC_HASH_TYPE_NONE:
11223
0
            case WC_HASH_TYPE_MD2:
11224
0
            case WC_HASH_TYPE_MD5_SHA:
11225
0
            default:
11226
0
                return WOLFSSL_FAILURE;
11227
750
        }
11228
11229
750
        return ret;
11230
750
    }
11231
11232
    int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11233
                               unsigned int* s)
11234
750
    {
11235
750
        enum wc_HashType macType;
11236
11237
750
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinal");
11238
750
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11239
750
        switch (macType) {
11240
150
            case WC_HASH_TYPE_MD4:
11241
229
            case WC_HASH_TYPE_MD5:
11242
315
            case WC_HASH_TYPE_SHA:
11243
405
            case WC_HASH_TYPE_SHA224:
11244
540
            case WC_HASH_TYPE_SHA256:
11245
624
            case WC_HASH_TYPE_SHA384:
11246
750
            case WC_HASH_TYPE_SHA512:
11247
750
            case WC_HASH_TYPE_SHA512_224:
11248
750
            case WC_HASH_TYPE_SHA512_256:
11249
750
            case WC_HASH_TYPE_SHA3_224:
11250
750
            case WC_HASH_TYPE_SHA3_256:
11251
750
            case WC_HASH_TYPE_SHA3_384:
11252
750
            case WC_HASH_TYPE_SHA3_512:
11253
750
            case WC_HASH_TYPE_SM3:
11254
750
            case WC_HASH_TYPE_BLAKE2B:
11255
750
            case WC_HASH_TYPE_BLAKE2S:
11256
750
            case WC_HASH_TYPE_NONE:
11257
750
            case WC_HASH_TYPE_MD2:
11258
750
            case WC_HASH_TYPE_MD5_SHA:
11259
750
                break;
11260
11261
0
            case WC_HASH_TYPE_SHAKE128:
11262
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11263
0
                *s = 16; /* if mixing up XOF with plain digest 128 bit is
11264
                          * default for SHAKE128 */
11265
        #else
11266
                return WOLFSSL_FAILURE;
11267
        #endif
11268
0
                break;
11269
0
            case WC_HASH_TYPE_SHAKE256:
11270
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11271
0
                *s = 32; /* if mixing up XOF with plain digest 256 bit is
11272
                          * default for SHAKE256 */
11273
        #else
11274
                return WOLFSSL_FAILURE;
11275
        #endif
11276
0
                break;
11277
0
            default:
11278
0
                return WOLFSSL_FAILURE;
11279
750
        }
11280
750
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, s, macType);
11281
750
    }
11282
11283
    /* WOLFSSL_SUCCESS on ok */
11284
    int wolfSSL_EVP_DigestFinal_ex(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11285
                                   unsigned int* s)
11286
750
    {
11287
750
        WOLFSSL_ENTER("EVP_DigestFinal_ex");
11288
750
        return wolfSSL_EVP_DigestFinal(ctx, md, s);
11289
750
    }
11290
11291
11292
    /* XOF stands for extendable-output functions. This is used for algos such
11293
     * as SHAKE256.
11294
     *
11295
     * returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on fail */
11296
    int wolfSSL_EVP_DigestFinalXOF(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *md,
11297
        size_t sz)
11298
0
    {
11299
0
        unsigned int len;
11300
0
        enum wc_HashType macType;
11301
11302
0
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinalXOF");
11303
0
        len = (unsigned int)sz;
11304
11305
0
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11306
0
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, &len, macType);
11307
0
    }
11308
11309
11310
    unsigned long wolfSSL_EVP_MD_flags(const WOLFSSL_EVP_MD *md)
11311
0
    {
11312
0
        enum wc_HashType macType;
11313
11314
0
        macType = EvpMd2MacType(md);
11315
0
        switch ((int)macType) {
11316
0
            case WC_HASH_TYPE_BLAKE2B:
11317
0
            case WC_HASH_TYPE_BLAKE2S:
11318
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11319
0
            case WC_HASH_TYPE_SHAKE128:
11320
0
        #endif
11321
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11322
0
            case WC_HASH_TYPE_SHAKE256:
11323
0
        #endif
11324
0
                return WOLFSSL_EVP_MD_FLAG_XOF;
11325
0
            default:
11326
0
                return 0;
11327
0
        }
11328
0
    }
11329
11330
11331
    void wolfSSL_EVP_cleanup(void)
11332
0
    {
11333
        /* nothing to do here */
11334
0
    }
11335
11336
const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id)
11337
0
{
11338
0
    WOLFSSL_MSG("wolfSSL_get_digestbynid");
11339
11340
0
    switch(id) {
11341
0
#ifndef NO_MD4
11342
0
        case WC_NID_md4:
11343
0
            return wolfSSL_EVP_md4();
11344
0
#endif
11345
0
#ifndef NO_MD5
11346
0
        case WC_NID_md5:
11347
0
            return wolfSSL_EVP_md5();
11348
0
#endif
11349
0
#ifndef NO_SHA
11350
0
        case WC_NID_sha1:
11351
0
            return wolfSSL_EVP_sha1();
11352
0
#endif
11353
0
#ifdef WOLFSSL_SHA224
11354
0
        case WC_NID_sha224:
11355
0
            return wolfSSL_EVP_sha224();
11356
0
#endif
11357
0
#ifndef NO_SHA256
11358
0
        case WC_NID_sha256:
11359
0
            return wolfSSL_EVP_sha256();
11360
0
#endif
11361
0
#ifdef WOLFSSL_SHA384
11362
0
        case WC_NID_sha384:
11363
0
            return wolfSSL_EVP_sha384();
11364
0
#endif
11365
0
#ifdef WOLFSSL_SHA512
11366
0
        case WC_NID_sha512:
11367
0
            return wolfSSL_EVP_sha512();
11368
0
#endif
11369
0
#ifdef WOLFSSL_SM3
11370
0
        case WC_NID_sm3:
11371
0
            return wolfSSL_EVP_sm3();
11372
0
#endif
11373
0
#ifdef WOLFSSL_SHAKE128
11374
0
        case WC_NID_shake128:
11375
0
            return wolfSSL_EVP_shake128();
11376
0
#endif
11377
0
#ifdef WOLFSSL_SHAKE256
11378
0
        case WC_NID_shake256:
11379
0
            return wolfSSL_EVP_shake256();
11380
0
#endif
11381
0
        default:
11382
0
            WOLFSSL_MSG("Bad digest id value");
11383
0
    }
11384
11385
0
    return NULL;
11386
0
}
11387
int wolfSSL_EVP_MD_block_size(const WOLFSSL_EVP_MD* type)
11388
0
{
11389
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_block_size");
11390
11391
0
    if (type == NULL) {
11392
0
        WOLFSSL_MSG("No md type arg");
11393
0
        return WOLFSSL_FAILURE;
11394
0
    }
11395
11396
0
#ifndef NO_SHA
11397
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11398
0
        return WC_SHA_BLOCK_SIZE;
11399
0
    } else
11400
0
#endif
11401
0
#ifndef NO_SHA256
11402
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11403
0
        return WC_SHA256_BLOCK_SIZE;
11404
0
    } else
11405
0
#endif
11406
0
#ifndef NO_MD4
11407
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11408
0
        return WC_MD4_BLOCK_SIZE;
11409
0
    } else
11410
0
#endif
11411
0
#ifndef NO_MD5
11412
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11413
0
        return WC_MD5_BLOCK_SIZE;
11414
0
    } else
11415
0
#endif
11416
0
#ifdef WOLFSSL_SHA224
11417
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11418
0
        return WC_SHA224_BLOCK_SIZE;
11419
0
    } else
11420
0
#endif
11421
0
#ifdef WOLFSSL_SHA384
11422
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11423
0
        return WC_SHA384_BLOCK_SIZE;
11424
0
    } else
11425
0
#endif
11426
0
#ifdef WOLFSSL_SHA512
11427
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11428
0
        return WC_SHA512_BLOCK_SIZE;
11429
0
    } else
11430
0
#endif
11431
0
#ifdef WOLFSSL_SHA3
11432
0
#ifndef WOLFSSL_NOSHA3_224
11433
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11434
0
        return WC_SHA3_224_BLOCK_SIZE;
11435
0
    } else
11436
0
#endif
11437
0
#ifndef WOLFSSL_NOSHA3_256
11438
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11439
0
        return WC_SHA3_256_BLOCK_SIZE;
11440
0
    } else
11441
0
#endif
11442
0
#ifndef WOLFSSL_NOSHA3_384
11443
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11444
0
        return WC_SHA3_384_BLOCK_SIZE;
11445
0
    } else
11446
0
#endif
11447
0
#ifndef WOLFSSL_NOSHA3_512
11448
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11449
0
        return WC_SHA3_512_BLOCK_SIZE;
11450
0
    } else
11451
0
#endif
11452
0
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11453
0
    if (XSTRCMP(type, WC_SN_shake128) == 0) {
11454
0
        return WC_SHA3_128_BLOCK_SIZE;
11455
0
    } else
11456
0
#endif
11457
0
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11458
0
    if (XSTRCMP(type, WC_SN_shake256) == 0) {
11459
0
        return WC_SHA3_256_BLOCK_SIZE;
11460
0
    } else
11461
0
#endif
11462
0
#endif /* WOLFSSL_SHA3 */
11463
0
#ifdef WOLFSSL_SM3
11464
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11465
0
        return WC_SM3_BLOCK_SIZE;
11466
0
    } else
11467
0
#endif
11468
11469
0
    return WOLFSSL_FAILURE;
11470
0
}
11471
11472
int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type)
11473
0
{
11474
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_size");
11475
11476
0
    if (type == NULL) {
11477
0
        WOLFSSL_MSG("No md type arg");
11478
0
        return WOLFSSL_FAILURE;
11479
0
    }
11480
11481
0
#ifndef NO_SHA
11482
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11483
0
        return WC_SHA_DIGEST_SIZE;
11484
0
    } else
11485
0
#endif
11486
0
#ifndef NO_SHA256
11487
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11488
0
        return WC_SHA256_DIGEST_SIZE;
11489
0
    } else
11490
0
#endif
11491
0
#ifndef NO_MD4
11492
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11493
0
        return WC_MD4_DIGEST_SIZE;
11494
0
    } else
11495
0
#endif
11496
0
#ifndef NO_MD5
11497
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11498
0
        return WC_MD5_DIGEST_SIZE;
11499
0
    } else
11500
0
#endif
11501
0
#ifdef WOLFSSL_SHA224
11502
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11503
0
        return WC_SHA224_DIGEST_SIZE;
11504
0
    } else
11505
0
#endif
11506
0
#ifdef WOLFSSL_SHA384
11507
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11508
0
        return WC_SHA384_DIGEST_SIZE;
11509
0
    } else
11510
0
#endif
11511
0
#ifdef WOLFSSL_SHA512
11512
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11513
0
        return WC_SHA512_DIGEST_SIZE;
11514
0
    } else
11515
0
#ifndef WOLFSSL_NOSHA512_224
11516
0
    if (XSTRCMP(type, WC_SN_sha512_224) == 0) {
11517
0
        return WC_SHA512_224_DIGEST_SIZE;
11518
0
    } else
11519
0
#endif
11520
0
#ifndef WOLFSSL_NOSHA512_256
11521
0
    if (XSTRCMP(type, WC_SN_sha512_256) == 0) {
11522
0
        return WC_SHA512_256_DIGEST_SIZE;
11523
0
    } else
11524
0
#endif
11525
0
#endif
11526
0
#ifdef WOLFSSL_SHA3
11527
0
#ifndef WOLFSSL_NOSHA3_224
11528
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11529
0
        return WC_SHA3_224_DIGEST_SIZE;
11530
0
    } else
11531
0
#endif
11532
0
#ifndef WOLFSSL_NOSHA3_256
11533
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11534
0
        return WC_SHA3_256_DIGEST_SIZE;
11535
0
    } else
11536
0
#endif
11537
0
#ifndef WOLFSSL_NOSHA3_384
11538
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11539
0
        return WC_SHA3_384_DIGEST_SIZE;
11540
0
    } else
11541
0
#endif
11542
0
#ifndef WOLFSSL_NOSHA3_512
11543
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11544
0
        return WC_SHA3_512_DIGEST_SIZE;
11545
0
    } else
11546
0
#endif
11547
0
#endif /* WOLFSSL_SHA3 */
11548
0
#ifdef WOLFSSL_SM3
11549
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11550
0
        return WC_SM3_DIGEST_SIZE;
11551
0
    }
11552
0
#endif
11553
11554
0
    return WOLFSSL_FAILURE;
11555
0
}
11556
11557
#endif /* OPENSSL_EXTRA  || HAVE_CURL */
11558
11559
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
11560
/* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the
11561
 * subset of X509 API */
11562
11563
2.00k
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new(void){
11564
2.00k
    return wolfSSL_EVP_PKEY_new_ex(NULL);
11565
2.00k
}
11566
11567
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap)
11568
2.68k
{
11569
2.68k
    WOLFSSL_EVP_PKEY* pkey;
11570
2.68k
    int ret;
11571
2.68k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_ex");
11572
2.68k
    pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap,
11573
2.68k
            DYNAMIC_TYPE_PUBLIC_KEY);
11574
2.68k
    if (pkey != NULL) {
11575
2.68k
        XMEMSET(pkey, 0, sizeof(WOLFSSL_EVP_PKEY));
11576
2.68k
        pkey->heap = heap;
11577
2.68k
        pkey->type = WOLFSSL_EVP_PKEY_DEFAULT;
11578
11579
2.68k
#ifndef HAVE_FIPS
11580
2.68k
        ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID);
11581
#else
11582
        ret = wc_InitRng(&pkey->rng);
11583
#endif
11584
2.68k
        if (ret != 0){
11585
            /* Free directly since mutex for ref count not set yet */
11586
0
            XFREE(pkey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
11587
0
            WOLFSSL_MSG("Issue initializing RNG");
11588
0
            return NULL;
11589
0
        }
11590
11591
2.68k
        wolfSSL_RefInit(&pkey->ref, &ret);
11592
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11593
        if (ret != 0){
11594
            wolfSSL_EVP_PKEY_free(pkey);
11595
            WOLFSSL_MSG("Issue initializing mutex");
11596
            return NULL;
11597
        }
11598
    #else
11599
2.68k
        (void)ret;
11600
2.68k
    #endif
11601
2.68k
    }
11602
0
    else {
11603
0
        WOLFSSL_MSG("memory failure");
11604
0
    }
11605
11606
2.68k
    return pkey;
11607
2.68k
}
11608
11609
void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
11610
3.22k
{
11611
3.22k
    int doFree = 0;
11612
3.22k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free");
11613
3.22k
    if (key != NULL) {
11614
2.35k
        int ret;
11615
2.35k
        wolfSSL_RefDec(&key->ref, &doFree, &ret);
11616
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11617
        if (ret != 0) {
11618
            WOLFSSL_MSG("Couldn't lock pkey mutex");
11619
        }
11620
    #else
11621
2.35k
        (void)ret;
11622
2.35k
    #endif
11623
11624
2.35k
        if (doFree) {
11625
1.19k
            wc_FreeRng(&key->rng);
11626
11627
1.19k
            if (key->pkey.ptr != NULL) {
11628
522
                XFREE(key->pkey.ptr, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11629
522
                key->pkey.ptr = NULL;
11630
522
            }
11631
1.19k
            switch(key->type)
11632
1.19k
            {
11633
0
                #ifndef NO_RSA
11634
0
                case WC_EVP_PKEY_RSA:
11635
0
                    if (key->rsa != NULL && key->ownRsa == 1) {
11636
0
                        wolfSSL_RSA_free(key->rsa);
11637
0
                        key->rsa = NULL;
11638
0
                    }
11639
0
                    break;
11640
0
                #endif /* NO_RSA */
11641
11642
0
                #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
11643
0
                case WC_EVP_PKEY_EC:
11644
0
                    if (key->ecc != NULL && key->ownEcc == 1) {
11645
0
                        wolfSSL_EC_KEY_free(key->ecc);
11646
0
                        key->ecc = NULL;
11647
0
                    }
11648
0
                    break;
11649
0
                #endif /* HAVE_ECC && OPENSSL_EXTRA */
11650
11651
                #ifndef NO_DSA
11652
                case WC_EVP_PKEY_DSA:
11653
                    if (key->dsa != NULL && key->ownDsa == 1) {
11654
                        wolfSSL_DSA_free(key->dsa);
11655
                        key->dsa = NULL;
11656
                    }
11657
                    break;
11658
                #endif /* NO_DSA */
11659
11660
0
                #if !defined(NO_DH) && (defined(WOLFSSL_QT) || \
11661
0
                       defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL))
11662
0
                case WC_EVP_PKEY_DH:
11663
0
                    if (key->dh != NULL && key->ownDh == 1) {
11664
0
                        wolfSSL_DH_free(key->dh);
11665
0
                        key->dh = NULL;
11666
0
                    }
11667
0
                    break;
11668
0
                #endif /* ! NO_DH ... */
11669
11670
0
                #ifdef HAVE_HKDF
11671
674
                case WC_EVP_PKEY_HKDF:
11672
674
                    XFREE(key->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
11673
674
                    key->hkdfSalt = NULL;
11674
674
                    XFREE(key->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
11675
674
                    key->hkdfKey = NULL;
11676
674
                    XFREE(key->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
11677
674
                    key->hkdfInfo = NULL;
11678
674
                    key->hkdfSaltSz = 0;
11679
674
                    key->hkdfKeySz = 0;
11680
674
                    key->hkdfInfoSz = 0;
11681
674
                    break;
11682
0
                #endif /* HAVE_HKDF */
11683
11684
0
                #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
11685
0
                    defined(WOLFSSL_AES_DIRECT)
11686
0
                case WC_EVP_PKEY_CMAC:
11687
0
                    if (key->cmacCtx != NULL) {
11688
0
                        wolfSSL_CMAC_CTX_free(key->cmacCtx);
11689
0
                        key->cmacCtx = NULL;
11690
0
                    }
11691
0
                    break;
11692
0
                #endif /* defined(WOLFSSL_CMAC) ... */
11693
11694
522
                default:
11695
522
                    break;
11696
1.19k
            }
11697
11698
1.19k
            wolfSSL_RefFree(&key->ref);
11699
1.19k
            XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11700
1.19k
        }
11701
2.35k
    }
11702
3.22k
}
11703
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
11704
11705
/* Indent writes white spaces of the number specified by "indents"
11706
 * to the BIO. The number of white spaces is limited from 0 to
11707
 * EVP_PKEY_PRINT_INDENT_MAX.
11708
 * returns the amount written to BIO.
11709
 */
11710
static int Indent(WOLFSSL_BIO* out, int indents)
11711
0
{
11712
0
    int i;
11713
0
    char space = ' ';
11714
0
    if (out == NULL) {
11715
0
        return 0;
11716
0
    }
11717
0
    if (indents > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11718
0
        indents = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11719
0
    }
11720
0
    for (i = 0; i < indents; i++) {
11721
0
        if (wolfSSL_BIO_write(out, &space, 1) < 0) {
11722
0
            break;
11723
0
        }
11724
0
    }
11725
0
    return indents -i;
11726
0
}
11727
/* PrintHexWithColon dump byte-data specified by "input" to the "out".
11728
 * Each line has leading white spaces( "indent" gives the number ) plus
11729
 * four spaces, then hex coded 15 byte data with separator ":" follow.
11730
 * Each line looks like:
11731
 * "    00:e6:ab: --- 9f:ef:"
11732
 * Parameters:
11733
 * out     bio to output dump data
11734
 * input   buffer holding data to dump
11735
 * inlen   input data size
11736
 * indent  the number of spaces for indent
11737
 * blower  true if lower case uses
11738
 * Returns 1 on success, 0 on failure.
11739
 */
11740
static int PrintHexWithColon(WOLFSSL_BIO* out, const byte* input,
11741
    int inlen, int indent, byte blower)
11742
0
{
11743
0
#ifdef WOLFSSL_SMALL_STACK
11744
0
    byte*  buff = NULL;
11745
#else
11746
    byte   buff[WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX] = { 0 };
11747
#endif /* WOLFSSL_SMALL_STACK */
11748
0
    int    ret = WOLFSSL_SUCCESS;
11749
0
    word32 in = 0;
11750
0
    word32 i;
11751
0
    int    idx;
11752
0
    const  byte* data;
11753
0
    word32 outSz;
11754
0
    byte   outHex[3];
11755
11756
0
    if (!out || !input || inlen <= 0) {
11757
0
        return WOLFSSL_FAILURE;
11758
0
    }
11759
11760
0
    if (indent < 0) {
11761
0
        indent = 0;
11762
0
    }
11763
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11764
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11765
0
    }
11766
11767
0
    data = input;
11768
11769
0
#ifdef WOLFSSL_SMALL_STACK
11770
0
    buff = (byte*)XMALLOC(WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX, NULL,
11771
0
        DYNAMIC_TYPE_TMP_BUFFER);
11772
0
    if (!buff) {
11773
0
        return WOLFSSL_FAILURE;
11774
0
    }
11775
0
#endif
11776
11777
    /* print pub element */
11778
0
    idx = 0;
11779
11780
0
    for (in = 0; in < (word32)inlen && ret == WOLFSSL_SUCCESS; in +=
11781
0
             WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE ) {
11782
0
        if (Indent(out, indent) < 0) {
11783
0
            ret = WOLFSSL_FAILURE;
11784
0
            break;
11785
0
        }
11786
0
        for (i = 0; (i < WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE) &&
11787
0
                                        (in + i < (word32)inlen); i++) {
11788
11789
0
            if (ret == WOLFSSL_SUCCESS) {
11790
0
                outSz = sizeof(outHex);
11791
0
                ret = Base16_Encode((const byte*)&data[in + i], 1,
11792
0
                                                    outHex, &outSz) == 0;
11793
0
            }
11794
0
            if (ret == WOLFSSL_SUCCESS) {
11795
0
                if (blower) {
11796
0
                    outHex[0] = (byte)XTOLOWER(outHex[0]);
11797
0
                    outHex[1] = (byte)XTOLOWER(outHex[1]);
11798
0
                }
11799
0
                XMEMCPY(buff + idx, outHex, 2);
11800
0
                idx += 2;
11801
11802
0
                if (in + i != (word32)inlen -1) {
11803
0
                    XMEMSET(buff + idx, ':', 1);
11804
0
                    idx += 1;
11805
0
                }
11806
0
            }
11807
0
        }
11808
0
        if (ret == WOLFSSL_SUCCESS) {
11809
0
            ret = wolfSSL_BIO_write(out, buff, idx) > 0;
11810
0
        }
11811
0
        if (ret == WOLFSSL_SUCCESS) {
11812
0
            ret = wolfSSL_BIO_write(out, "\n", 1) > 0;
11813
0
        }
11814
0
        if (ret == WOLFSSL_SUCCESS) {
11815
0
            XMEMSET(buff, 0, WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX);
11816
0
            idx = 0;
11817
0
        }
11818
0
    }
11819
0
    WC_FREE_VAR_EX(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11820
0
    return ret;
11821
0
}
11822
#if !defined(NO_RSA)
11823
/* PrintPubKeyRSA is a helper function for wolfSSL_EVP_PKEY_print_public
11824
 * to parse a DER format RSA public key specified in the second parameter.
11825
 * Parameters:
11826
 * out     bio to output dump data
11827
 * pkey    buffer holding public key data
11828
 * pkeySz  public key data size
11829
 * indent  the number of spaces for indent
11830
 * bitlen  bit size of the given key
11831
 * pctx    context(not used)
11832
 * Returns 1 on success, 0 on failure.
11833
*/
11834
static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11835
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11836
0
{
11837
0
    byte   buff[8] = { 0 };
11838
0
    int    res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11839
0
    word32 inOutIdx = 0;
11840
0
    word32 nSz;             /* size of modulus */
11841
0
    word32 eSz;             /* size of public exponent */
11842
0
    const byte*  n   = NULL;
11843
0
    const byte*  e   = NULL; /* pointer to modulus/exponent */
11844
0
    word32 i;
11845
0
    unsigned long exponent = 0;
11846
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
11847
0
    char line[32] = { 0 };
11848
11849
0
    (void)pctx;
11850
11851
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
11852
0
        return WOLFSSL_FAILURE);
11853
11854
0
    if( mp_init(a) != 0) {
11855
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11856
0
        return WOLFSSL_FAILURE;
11857
0
    }
11858
0
    if (indent < 0) {
11859
0
        indent = 0;
11860
0
    }
11861
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11862
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11863
0
    }
11864
11865
0
    do {
11866
0
        int idx;
11867
0
        int wsz;
11868
11869
        /* parse key to get modulus and exponent */
11870
0
        if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, (word32)pkeySz,
11871
0
                                                &n, &nSz, &e, &eSz) != 0) {
11872
0
            break;
11873
0
        }
11874
11875
        /* print out public key elements */
11876
0
        idx = 0;
11877
0
        XMEMSET(buff, 0, sizeof(buff));
11878
0
        Indent(out, indent);
11879
0
        XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
11880
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11881
0
            break;
11882
0
        }
11883
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
11884
0
            break;
11885
0
        }
11886
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11887
0
            break;
11888
0
        }
11889
0
        wsz = (int)XSTRLEN((const char*)buff);
11890
11891
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11892
0
            break;
11893
0
        }
11894
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
11895
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11896
0
            break;
11897
0
        }
11898
        /* print Modulus */
11899
0
        Indent(out, indent);
11900
0
        XSTRNCPY(line, "Modulus:\n", sizeof(line));
11901
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11902
0
            break;
11903
0
        }
11904
11905
        /* print modulus with leading zero if exists */
11906
0
        if (*n & 0x80 && *(n-1) == 0) {
11907
0
            n--;
11908
0
            nSz++;
11909
0
        }
11910
11911
0
        if (PrintHexWithColon(out, n, (int)nSz,
11912
0
                    indent + 4, 1/* lower case */) != WOLFSSL_SUCCESS) {
11913
0
            break;
11914
0
        }
11915
        /* print public Exponent */
11916
0
        idx = 0;
11917
0
        Indent(out, indent);
11918
0
        XSTRNCPY(line, "Exponent: ", sizeof(line));
11919
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11920
0
            break;
11921
0
        }
11922
0
        for (i = 0; i < eSz; i++) {
11923
0
            exponent <<= 8;
11924
0
            exponent += e[i];
11925
0
        }
11926
11927
0
        XMEMSET(buff, 0, sizeof(buff));
11928
0
        if (mp_set_int(a, exponent) != 0) {
11929
0
            break;
11930
0
        }
11931
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11932
0
            break;
11933
0
        }
11934
0
        wsz = (int)XSTRLEN((const char*)buff);
11935
11936
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11937
0
            break;
11938
0
        }
11939
0
        XSTRNCPY(line, " (0x", sizeof(line));
11940
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11941
0
            break;
11942
0
        }
11943
0
        XMEMSET(buff, 0, sizeof(buff));
11944
0
        if (mp_tohex(a, (char*)buff) != 0) {
11945
0
            break;
11946
0
        }
11947
0
        if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((char*)buff)) <= 0) {
11948
0
            break;
11949
0
        }
11950
0
        XSTRNCPY(line, ")\n", sizeof(line));
11951
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11952
0
            break;
11953
0
        }
11954
11955
0
        res = WOLFSSL_SUCCESS;
11956
0
    } while (0);
11957
11958
0
    mp_free(a);
11959
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11960
0
    return res;
11961
0
}
11962
#endif /* !NO_RSA */
11963
11964
#if defined(HAVE_ECC)
11965
/* PrintPubKeyEC is a helper function for wolfSSL_EVP_PKEY_print_public
11966
 * to parse a DER format ECC public key specified in the second parameter.
11967
 * Parameters:
11968
 * out     bio to output dump data
11969
 * pkey    buffer holding public key data
11970
 * pkeySz  public key data size
11971
 * indent  the number of spaces for indent
11972
 * bitlen  bit size of the given key
11973
 * pctx    context(not used)
11974
 * Returns 1 on success, 0 on failure.
11975
*/
11976
static int PrintPubKeyEC(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11977
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11978
0
{
11979
0
    byte*   pub = NULL;
11980
0
    word32  pubSz = 0;
11981
0
    byte    buff[8] = { 0 };
11982
0
    int     res = WOLFSSL_SUCCESS;
11983
0
    word32  inOutIdx = 0;
11984
0
    int     curveId = 0;
11985
0
    const byte* curveOID = NULL;
11986
0
    word32  oidSz = 0;
11987
0
    const char* OIDName = NULL;
11988
0
    const char* nistCurveName = NULL;
11989
0
    int idx = 0;
11990
0
    int wsz = 0;
11991
0
#ifdef WOLFSSL_SMALL_STACK
11992
0
    mp_int* a = NULL;
11993
0
    ecc_key* key = NULL;
11994
#else
11995
    mp_int  a[1];
11996
    ecc_key key[1];
11997
#endif
11998
0
    char line[32] = { 0 };
11999
0
    (void)pctx;
12000
12001
0
#ifdef WOLFSSL_SMALL_STACK
12002
0
    a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
12003
0
    if (a == NULL) {
12004
0
        WOLFSSL_MSG("Failed to allocate memory for mp_int");
12005
0
        return WOLFSSL_FAILURE;
12006
0
    }
12007
0
    XMEMSET(a, 0, sizeof(mp_int));
12008
12009
0
    key = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
12010
0
    if (key == NULL) {
12011
0
        WOLFSSL_MSG("Failed to allocate memory for ecc_key");
12012
0
        XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
12013
0
        return WOLFSSL_FAILURE;
12014
0
    }
12015
0
#endif
12016
12017
0
    if (mp_init(a) != 0) {
12018
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12019
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12020
0
        return WOLFSSL_FAILURE;
12021
0
    }
12022
12023
0
    if (wc_ecc_init(key) != 0) {
12024
        /* Return early so we don't have to remember if init succeeded
12025
         * or not. */
12026
0
        mp_free(a);
12027
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12028
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12029
0
        return WOLFSSL_FAILURE;
12030
0
    }
12031
12032
0
    if (indent < 0) {
12033
0
        indent = 0;
12034
0
    }
12035
0
    else if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12036
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12037
0
    }
12038
12039
0
    if (res == WOLFSSL_SUCCESS) {
12040
0
        res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, (word32)pkeySz) == 0;
12041
0
    }
12042
12043
0
    if (res == WOLFSSL_SUCCESS) {
12044
0
        curveId = wc_ecc_get_oid(key->dp->oidSum, &curveOID, &oidSz);
12045
0
        res = curveId > 0 && oidSz > 0;
12046
0
    }
12047
12048
    /* get NIST curve name */
12049
0
    if (res == WOLFSSL_SUCCESS) {
12050
0
        int nid = EccEnumToNID(curveId);
12051
0
        if (nid != -1) {
12052
            /* look up object name and nist curve name*/
12053
0
            OIDName = wolfSSL_OBJ_nid2sn(nid);
12054
0
            nistCurveName = wolfSSL_EC_curve_nid2nist(nid);
12055
0
            res = (nistCurveName != NULL) && (OIDName != NULL);
12056
0
        }
12057
0
        else {
12058
0
            res = WOLFSSL_FAILURE;
12059
0
        }
12060
0
    }
12061
0
    if (res == WOLFSSL_SUCCESS) {
12062
0
        pub = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
12063
0
        if (pub != NULL) {
12064
0
            pubSz = ECC_BUFSIZE;
12065
0
            XMEMSET(pub, 0, ECC_BUFSIZE);
12066
12067
0
            PRIVATE_KEY_UNLOCK();
12068
0
            res = wc_ecc_export_x963(key, pub, &pubSz) == 0;
12069
0
            PRIVATE_KEY_LOCK();
12070
0
        }
12071
0
        else {
12072
0
            res = WOLFSSL_FAILURE;
12073
0
        }
12074
0
    }
12075
0
    if (res == WOLFSSL_SUCCESS) {
12076
0
        idx = 0;
12077
0
        res = Indent(out, indent) >= 0;
12078
0
    }
12079
0
    if (res == WOLFSSL_SUCCESS) {
12080
0
        XSTRNCPY(line, "Public-Key: (", sizeof(line));
12081
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12082
0
    }
12083
0
    if (res == WOLFSSL_SUCCESS) {
12084
0
        res = mp_set_int(a, (unsigned long)bitlen) == 0;
12085
0
    }
12086
0
    if (res == WOLFSSL_SUCCESS) {
12087
0
        res = mp_todecimal(a, (char*)buff) == 0;
12088
0
    }
12089
0
    if (res == WOLFSSL_SUCCESS) {
12090
0
        wsz = (int)XSTRLEN((const char*)buff);
12091
0
    }
12092
0
    if (res == WOLFSSL_SUCCESS) {
12093
0
        res = wolfSSL_BIO_write(out, buff + idx, wsz) >= 0;
12094
0
    }
12095
0
    if (res == WOLFSSL_SUCCESS) {
12096
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
12097
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12098
0
    }
12099
0
    if (res == WOLFSSL_SUCCESS) {
12100
0
        res = Indent(out, indent) >= 0;
12101
0
    }
12102
0
    if (res == WOLFSSL_SUCCESS) {
12103
        /* print pub element */
12104
0
        XSTRNCPY(line, "pub:\n", sizeof(line));
12105
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12106
0
    }
12107
0
    if (res == WOLFSSL_SUCCESS) {
12108
        /* upper case */
12109
0
        res = PrintHexWithColon(out, pub, (int)pubSz, indent + 4, 0);
12110
0
    }
12111
0
    if (res == WOLFSSL_SUCCESS) {
12112
0
        res = Indent(out, indent) >= 0;
12113
0
    }
12114
0
    if (res == WOLFSSL_SUCCESS) {
12115
        /* print OID in name */
12116
0
        XSTRNCPY(line, "ASN1 OID: ", sizeof(line));
12117
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12118
0
    }
12119
0
    if (res == WOLFSSL_SUCCESS) {
12120
0
        res = wolfSSL_BIO_write(out, OIDName, (int)XSTRLEN(OIDName)) > 0;
12121
0
    }
12122
0
    if (res == WOLFSSL_SUCCESS) {
12123
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12124
0
    }
12125
0
    if (res == WOLFSSL_SUCCESS) {
12126
0
        res = Indent(out, indent) >= 0;
12127
0
    }
12128
0
    if (res == WOLFSSL_SUCCESS) {
12129
        /* print NIST curve name */
12130
0
        XSTRNCPY(line, "NIST CURVE: ", sizeof(line));
12131
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12132
0
    }
12133
0
    if (res == WOLFSSL_SUCCESS) {
12134
0
        res = wolfSSL_BIO_write(out, nistCurveName,
12135
0
            (int)XSTRLEN(nistCurveName)) > 0;
12136
0
    }
12137
0
    if (res == WOLFSSL_SUCCESS) {
12138
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12139
0
    }
12140
12141
0
    XFREE(pub, NULL, DYNAMIC_TYPE_ECC_BUFFER);
12142
0
    pub = NULL;
12143
12144
0
    wc_ecc_free(key);
12145
0
    mp_free(a);
12146
12147
0
    WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12148
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12149
12150
0
    return res;
12151
0
}
12152
#endif /* HAVE_ECC */
12153
12154
#if !defined(NO_DSA)
12155
/* PrintPubKeyDSA is a helper function for wolfSSL_EVP_PKEY_print_public
12156
 * to parse a DER format DSA public key specified in the second parameter.
12157
 * Parameters:
12158
 * out     bio to output dump data
12159
 * pkey    buffer holding public key data
12160
 * pkeySz  public key data size
12161
 * indent  the number of spaces for indent
12162
 * bitlen  bit size of the given key
12163
 * pctx    context(not used)
12164
 * Returns 1 on success, 0 on failure.
12165
*/
12166
static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12167
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12168
{
12169
12170
    byte    buff[8] = { 0 };
12171
    int     length;
12172
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12173
    word32  inOutIdx = 0;
12174
    word32  oid;
12175
    byte    tagFound;
12176
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12177
    char line[32] = { 0 };
12178
12179
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12180
        return WOLFSSL_FAILURE);
12181
12182
    if( mp_init(a) != 0) {
12183
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12184
        return WOLFSSL_FAILURE;
12185
    }
12186
12187
    inOutIdx = 0;
12188
    (void)pctx;
12189
12190
    if (indent < 0) {
12191
        indent = 0;
12192
    }
12193
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12194
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12195
    }
12196
12197
    do {
12198
        byte *p = NULL, * q = NULL, * g = NULL, * y = NULL;
12199
        int pSz, qSz, gSz, ySz;
12200
        int idx;
12201
        int wsz;
12202
12203
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12204
            break;
12205
        }
12206
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12207
            break;
12208
        }
12209
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) !=
12210
                0) {
12211
            break;
12212
        }
12213
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12214
            break;
12215
        }
12216
        /* find P */
12217
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12218
            break;
12219
        }
12220
        if (tagFound != ASN_INTEGER) {
12221
            break;
12222
        }
12223
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12224
            break;
12225
        }
12226
        p   = (byte*)(pkey + inOutIdx);
12227
        pSz = length;
12228
12229
        if (bitlen == 0) {
12230
            if (*p == 0) {
12231
                bitlen = (pSz - 1) * 8;    /* remove leading zero */
12232
            }
12233
            else {
12234
                bitlen = pSz * 8;
12235
            }
12236
        }
12237
12238
        inOutIdx += (word32)length;
12239
        /* find Q */
12240
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12241
            break;
12242
        }
12243
        if (tagFound != ASN_INTEGER) {
12244
            break;
12245
        }
12246
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12247
            break;
12248
        }
12249
        q = (byte*)(pkey + inOutIdx);
12250
        qSz = length;
12251
        inOutIdx += (word32)length;
12252
12253
        /* find G */
12254
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12255
            break;
12256
        }
12257
        if (tagFound != ASN_INTEGER) {
12258
            break;
12259
        }
12260
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12261
            break;
12262
        }
12263
        g = (byte*)(pkey + inOutIdx);
12264
        gSz = length;
12265
        inOutIdx += (word32)length;
12266
        /* find Y */
12267
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12268
            break;
12269
        }
12270
        if (tagFound != ASN_BIT_STRING) {
12271
            break;
12272
        }
12273
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12274
            break;
12275
        }
12276
        inOutIdx++;     /* skip the first byte( unused byte number)*/
12277
12278
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12279
            break;
12280
        }
12281
        if (tagFound != ASN_INTEGER) {
12282
            break;
12283
        }
12284
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12285
            break;
12286
        }
12287
        y = (byte*)(pkey + inOutIdx);
12288
        ySz = length;
12289
12290
        idx = 0;
12291
        XMEMSET(buff, 0, sizeof(buff));
12292
        Indent(out, indent);
12293
        XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
12294
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12295
            break;
12296
        }
12297
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12298
            break;
12299
        }
12300
        if (mp_todecimal(a, (char*)buff) != 0) {
12301
            break;
12302
        }
12303
        wsz = (int)XSTRLEN((const char*)buff);
12304
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12305
            break;
12306
        }
12307
        XSTRNCPY(line, " bit)\n", sizeof(line));
12308
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12309
            break;
12310
        }
12311
        /* print pub element */
12312
        Indent(out, indent);
12313
        XSTRNCPY(line, "pub:\n", sizeof(line));
12314
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12315
            break;
12316
        }
12317
        if (PrintHexWithColon(out, y, ySz, indent + 4, 0/* upper case */)
12318
                                                        != WOLFSSL_SUCCESS) {
12319
            break;
12320
        }
12321
        /* print P element */
12322
        Indent(out, indent);
12323
        XSTRNCPY(line, "P:\n", sizeof(line));
12324
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12325
            break;
12326
        }
12327
        if (PrintHexWithColon(out, p, pSz, indent + 4, 0/* upper case */)
12328
                                                        != WOLFSSL_SUCCESS) {
12329
            break;
12330
        }
12331
        /* print Q element */
12332
        Indent(out, indent);
12333
        XSTRNCPY(line, "Q:\n", sizeof(line));
12334
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12335
            break;
12336
        }
12337
        if (PrintHexWithColon(out, q, qSz, indent + 4, 0/* upper case */)
12338
                                                         != WOLFSSL_SUCCESS) {
12339
            break;
12340
        }
12341
        /* print G element */
12342
        Indent(out, indent);
12343
        XSTRNCPY(line, "G:\n", sizeof(line));
12344
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12345
            break;
12346
        }
12347
        if (PrintHexWithColon(out, g, gSz, indent + 4, 0/* upper case */)
12348
                                                        != WOLFSSL_SUCCESS) {
12349
            break;
12350
        }
12351
12352
        res = WOLFSSL_SUCCESS;
12353
    } while (0);
12354
12355
    mp_free(a);
12356
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12357
    return res;
12358
}
12359
#endif /* !NO_DSA */
12360
12361
#if defined(WOLFSSL_DH_EXTRA)
12362
/* PrintPubKeyDH is a helper function for wolfSSL_EVP_PKEY_print_public
12363
 * to parse a DER format DH public key specified in the second parameter.
12364
 * Parameters:
12365
 * out     bio to output dump data
12366
 * pkey    buffer holding public key data
12367
 * pkeySz  public key data size
12368
 * indent  the number of spaces for indent
12369
 * bitlen  bit size of the given key
12370
 * pctx    context(not used)
12371
 * Returns 1 on success, 0 on failure.
12372
*/
12373
static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12374
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12375
0
{
12376
12377
0
    byte    buff[8] = { 0 };
12378
0
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12379
0
    word32  length;
12380
0
    word32  inOutIdx;
12381
0
    word32  oid;
12382
0
    byte    tagFound;
12383
0
    byte*   prime = NULL;
12384
0
    byte    generator;
12385
0
    byte*   publicKey = NULL;
12386
0
    word32  outSz;
12387
0
    byte    outHex[3];
12388
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12389
0
    char line[32] = { 0 };
12390
12391
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12392
0
        return WOLFSSL_FAILURE);
12393
12394
0
    if( mp_init(a) != 0) {
12395
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12396
0
        return WOLFSSL_FAILURE;
12397
0
    }
12398
12399
0
    inOutIdx = 0;
12400
0
    (void)pctx;
12401
12402
0
    if (indent < 0) {
12403
0
        indent = 0;
12404
0
    }
12405
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12406
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12407
0
    }
12408
12409
0
    do {
12410
0
        int primeSz;
12411
0
        int publicKeySz;
12412
0
        int idx;
12413
0
        int wsz;
12414
12415
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12416
0
            break;
12417
0
        }
12418
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12419
0
            break;
12420
0
        }
12421
0
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) <
12422
0
                0) {
12423
0
            break;
12424
0
        }
12425
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12426
0
            break;
12427
0
        }
12428
        /* get prime element */
12429
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12430
0
            break;
12431
0
        }
12432
0
        if (tagFound != ASN_INTEGER) {
12433
0
            break;
12434
0
        }
12435
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12436
0
            break;
12437
0
        }
12438
0
        prime     = (byte*)(pkey + inOutIdx);
12439
0
        primeSz   = (int)length;
12440
0
        inOutIdx += length;
12441
12442
        /* get generator element */
12443
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12444
0
            break;
12445
0
        }
12446
0
        if (tagFound != ASN_INTEGER) {
12447
0
            break;
12448
0
        }
12449
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12450
0
            break;
12451
0
        }
12452
0
        if (length != 1) {
12453
0
            break;
12454
0
        }
12455
0
        generator = *(pkey + inOutIdx);
12456
0
        inOutIdx += length;
12457
12458
        /* get public-key element */
12459
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12460
0
            break;
12461
0
        }
12462
0
        if (tagFound != ASN_BIT_STRING) {
12463
0
            break;
12464
0
        }
12465
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12466
0
            break;
12467
0
        }
12468
0
        inOutIdx ++;
12469
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12470
0
            break;
12471
0
        }
12472
0
        if (tagFound != ASN_INTEGER) {
12473
0
            break;
12474
0
        }
12475
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12476
0
            break;
12477
0
        }
12478
0
        publicKeySz = (int)length;
12479
0
        publicKey = (byte*)(pkey + inOutIdx);
12480
12481
0
        if (bitlen == 0) {
12482
0
            if (*publicKey == 0) {
12483
0
                bitlen = (publicKeySz - 1) * 8;
12484
0
            }
12485
0
            else {
12486
0
                bitlen = publicKeySz * 8;
12487
0
            }
12488
0
        }
12489
12490
        /* print elements */
12491
0
        idx = 0;
12492
0
        Indent(out, indent);
12493
0
        XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
12494
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12495
0
            break;
12496
0
        }
12497
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12498
0
            break;
12499
0
        }
12500
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12501
0
            break;
12502
0
        }
12503
0
        wsz = (int)XSTRLEN((const char*)buff);
12504
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12505
0
            break;
12506
0
        }
12507
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
12508
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12509
0
            break;
12510
0
        }
12511
0
        Indent(out, indent);
12512
0
        XSTRNCPY(line, "public-key:\n", sizeof(line));
12513
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12514
0
            break;
12515
0
        }
12516
0
        if (PrintHexWithColon(out, publicKey,
12517
0
                                publicKeySz, indent + 4, 0/* upper case */)
12518
0
                                                    != WOLFSSL_SUCCESS) {
12519
0
            break;
12520
0
        }
12521
0
        Indent(out, indent);
12522
0
        XSTRNCPY(line, "prime:\n", sizeof(line));
12523
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12524
0
            break;
12525
0
        }
12526
0
        if (PrintHexWithColon(out, prime, primeSz,
12527
0
                                            indent + 4, 0/* upper case */)
12528
0
                != WOLFSSL_SUCCESS) {
12529
0
            break;
12530
0
        }
12531
0
        idx = 0;
12532
0
        XMEMSET(buff, 0, sizeof(buff));
12533
0
        Indent(out, indent);
12534
0
        XSTRNCPY(line, "generator: ", sizeof(line));
12535
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12536
0
            break;
12537
0
        }
12538
0
        if (mp_set_int(a, generator) != 0) {
12539
0
            break;
12540
0
        }
12541
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12542
0
            break;
12543
0
        }
12544
0
        wsz = (int)XSTRLEN((const char*)buff);
12545
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12546
0
            break;
12547
0
        }
12548
0
        XSTRNCPY(line, " (0x", sizeof(line));
12549
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12550
0
            break;
12551
0
        }
12552
0
        idx = 0;
12553
0
        XMEMSET(buff, 0, sizeof(buff));
12554
0
        outSz = sizeof(outHex);
12555
0
        if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
12556
0
            break;
12557
0
        }
12558
0
        if (idx + 2 < (int)sizeof(buff) ) {
12559
0
            XMEMCPY(buff + idx, outHex, 2);
12560
0
            idx += 2;
12561
0
        }
12562
0
        if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
12563
0
            break;
12564
0
        }
12565
0
        XSTRNCPY(line, ")\n", sizeof(line));
12566
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12567
0
            break;
12568
0
        }
12569
12570
0
        res = WOLFSSL_SUCCESS;
12571
0
    } while (0);
12572
12573
0
    mp_free(a);
12574
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12575
0
    return res;
12576
0
}
12577
#endif /* WOLFSSL_DH_EXTRA */
12578
12579
/* wolfSSL_EVP_PKEY_print_public parses the specified key then
12580
 * outputs public key info in human readable format to the specified BIO.
12581
 * White spaces of the same number which 'indent" gives, will be added to
12582
 * each line to output and ignores pctx parameter.
12583
 * Parameters:
12584
 * out     bio to output dump data
12585
 * pkey    buffer holding public key data
12586
 * indent  the number of spaces for indent
12587
 * pctx    context(not used)
12588
 * Returns 1 on success, 0 or negative on error, -2 means specified key
12589
 * algo is not supported.
12590
 * Can handle RSA, ECC, DSA and DH public keys.
12591
 */
12592
int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
12593
    const WOLFSSL_EVP_PKEY* pkey, int indent, WOLFSSL_ASN1_PCTX* pctx)
12594
0
{
12595
0
    int res;
12596
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12597
0
    defined(WOLFSSL_DH_EXTRA)
12598
0
    int keybits;    /* bit length of the key */
12599
0
#endif
12600
12601
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_print_public");
12602
12603
0
    if (pkey == NULL || out == NULL) {
12604
0
        return 0;
12605
0
    }
12606
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12607
0
    defined(WOLFSSL_DH_EXTRA)
12608
0
    if (indent < 0) {
12609
0
        indent = 0;
12610
0
    }
12611
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12612
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12613
0
    }
12614
0
#endif
12615
12616
0
    switch (pkey->type) {
12617
0
        case WC_EVP_PKEY_RSA:
12618
12619
0
#if !defined(NO_RSA)
12620
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12621
0
            res     = PrintPubKeyRSA(
12622
0
                        out,
12623
0
                        (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
12624
0
                        pkey->pkey_sz,           /* raw pkey size */
12625
0
                        indent,                  /* indent size */
12626
0
                        keybits,                 /* bit length of the key */
12627
0
                        pctx);                   /* not used */
12628
#else
12629
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12630
#endif
12631
0
            break;
12632
12633
0
        case WC_EVP_PKEY_EC:
12634
12635
0
#if defined(HAVE_ECC)
12636
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12637
0
            res     = PrintPubKeyEC(
12638
0
                        out,
12639
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12640
0
                        pkey->pkey_sz,            /* raw pkey size */
12641
0
                        indent,                   /* indent size */
12642
0
                        keybits,                  /* bit length of the key */
12643
0
                        pctx);                    /* not used */
12644
#else
12645
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12646
#endif
12647
0
            break;
12648
12649
0
        case WC_EVP_PKEY_DSA:
12650
12651
#if !defined(NO_DSA)
12652
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12653
            res     = PrintPubKeyDSA(
12654
                        out,
12655
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12656
                        pkey->pkey_sz,            /* raw pkey size */
12657
                        indent,                   /* indent size */
12658
                        keybits,                  /* bit length of the key */
12659
                        pctx);                    /* not used */
12660
#else
12661
0
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12662
0
#endif
12663
0
            break;
12664
12665
0
        case WC_EVP_PKEY_DH:
12666
12667
0
#if defined(WOLFSSL_DH_EXTRA)
12668
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12669
0
            res     = PrintPubKeyDH(
12670
0
                        out,
12671
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12672
0
                        pkey->pkey_sz,            /* raw pkey size */
12673
0
                        indent,                   /* indent size */
12674
0
                        keybits,                  /* bit length of the key */
12675
0
                        pctx);                    /* not used */
12676
#else
12677
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12678
#endif
12679
0
            break;
12680
12681
0
        default:
12682
0
            res = WOLFSSL_UNKNOWN;      /* not supported algo */
12683
0
            break;
12684
0
    }
12685
0
    return res;
12686
0
}
12687
#endif /* OPENSSL_EXTRA && !NO_BIO */
12688
12689
int wolfSSL_EVP_get_hashinfo(const WOLFSSL_EVP_MD* evp,
12690
    int* pHash, int* pHashSz)
12691
0
{
12692
0
    enum wc_HashType hash = WC_HASH_TYPE_NONE;
12693
0
    int hashSz;
12694
12695
0
    if (XSTRLEN(evp) < 3) {
12696
        /* do not try comparing strings if size is too small */
12697
0
        return WOLFSSL_FAILURE;
12698
0
    }
12699
12700
0
#ifndef NO_SHA
12701
0
    if ((XSTRCMP("SHA", evp) == 0) || (XSTRCMP(WC_SN_sha1, evp) == 0)) {
12702
0
        hash = WC_HASH_TYPE_SHA;
12703
0
    } else
12704
0
#endif
12705
0
#ifdef WOLFSSL_SHA224
12706
0
    if (XSTRCMP(WC_SN_sha224, evp) == 0) {
12707
0
        hash = WC_HASH_TYPE_SHA224;
12708
0
    } else
12709
0
#endif
12710
0
#ifndef NO_SHA256
12711
0
    if (XSTRCMP(WC_SN_sha256, evp) == 0) {
12712
0
        hash = WC_HASH_TYPE_SHA256;
12713
0
    } else
12714
0
#endif
12715
0
#ifdef WOLFSSL_SHA384
12716
0
    if (XSTRCMP(WC_SN_sha384, evp) == 0) {
12717
0
        hash = WC_HASH_TYPE_SHA384;
12718
0
    } else
12719
0
#endif
12720
0
#ifdef WOLFSSL_SHA512
12721
0
    if (XSTRCMP(WC_SN_sha512, evp) == 0) {
12722
0
        hash = WC_HASH_TYPE_SHA512;
12723
0
    } else
12724
0
#ifndef WOLFSSL_NOSHA512_224
12725
0
    if (XSTRCMP(WC_SN_sha512_224, evp) == 0) {
12726
0
        hash = WC_HASH_TYPE_SHA512_224;
12727
0
    } else
12728
0
#endif
12729
0
#ifndef WOLFSSL_NOSHA512_256
12730
0
    if (XSTRCMP(WC_SN_sha512_256, evp) == 0) {
12731
0
        hash = WC_HASH_TYPE_SHA512_256;
12732
0
    } else
12733
0
#endif
12734
0
#endif
12735
0
#ifdef WOLFSSL_SHA3
12736
0
#ifndef WOLFSSL_NOSHA3_224
12737
0
    if (XSTRCMP(WC_SN_sha3_224, evp) == 0) {
12738
0
        hash = WC_HASH_TYPE_SHA3_224;
12739
0
    } else
12740
0
#endif
12741
0
#ifndef WOLFSSL_NOSHA3_256
12742
0
    if (XSTRCMP(WC_SN_sha3_256, evp) == 0) {
12743
0
        hash = WC_HASH_TYPE_SHA3_256;
12744
0
    } else
12745
0
#endif
12746
0
#ifndef WOLFSSL_NOSHA3_384
12747
0
    if (XSTRCMP(WC_SN_sha3_384, evp) == 0) {
12748
0
        hash = WC_HASH_TYPE_SHA3_384;
12749
0
    } else
12750
0
#endif
12751
0
#ifndef WOLFSSL_NOSHA3_512
12752
0
    if (XSTRCMP(WC_SN_sha3_512, evp) == 0) {
12753
0
        hash = WC_HASH_TYPE_SHA3_512;
12754
0
    } else
12755
0
#endif
12756
0
#endif /* WOLFSSL_SHA3 */
12757
0
#ifdef WOLFSSL_SM3
12758
0
    if (XSTRCMP(WC_SN_sm3, evp) == 0) {
12759
0
        hash = WC_HASH_TYPE_SM3;
12760
0
    } else
12761
0
#endif
12762
0
#ifdef WOLFSSL_MD2
12763
0
    if (XSTRCMP("MD2", evp) == 0) {
12764
0
        hash = WC_HASH_TYPE_MD2;
12765
0
    } else
12766
0
#endif
12767
0
#ifndef NO_MD4
12768
0
    if (XSTRCMP(WC_SN_md4, evp) == 0) {
12769
0
        hash = WC_HASH_TYPE_MD4;
12770
0
    } else
12771
0
#endif
12772
0
#ifndef NO_MD5
12773
0
    if (XSTRCMP(WC_SN_md5, evp) == 0) {
12774
0
        hash = WC_HASH_TYPE_MD5;
12775
0
    } else
12776
0
#endif
12777
0
    {
12778
0
        if (XSTRNCMP("SHA", evp, 3) == 0) {
12779
0
            WOLFSSL_MSG("Unknown SHA hash");
12780
0
        }
12781
0
        return WOLFSSL_FAILURE;
12782
0
    }
12783
12784
0
    if (pHash)
12785
0
        *pHash = hash;
12786
12787
0
    hashSz = wc_HashGetDigestSize(hash);
12788
0
    if (pHashSz)
12789
0
        *pHashSz = hashSz;
12790
12791
0
    if (hashSz < 0) {
12792
0
        return WOLFSSL_FAILURE;
12793
0
    }
12794
12795
0
    return WOLFSSL_SUCCESS;
12796
0
}
12797
12798
/* Base64 encoding APIs */
12799
#if defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)
12800
12801
/*  wolfSSL_EVP_ENCODE_CTX_new allocates WOLFSSL_EVP_ENCODE_CTX
12802
 *  Returns WOLFSSL_EVP_ENCODE_CTX structure on success, NULL on failure.
12803
 */
12804
struct WOLFSSL_EVP_ENCODE_CTX* wolfSSL_EVP_ENCODE_CTX_new(void)
12805
0
{
12806
0
    WOLFSSL_EVP_ENCODE_CTX* ctx = NULL;
12807
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_new");
12808
0
    ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_ENCODE_CTX),
12809
0
             NULL, DYNAMIC_TYPE_OPENSSL );
12810
12811
0
    if (ctx != NULL) {
12812
0
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_ENCODE_CTX) );
12813
0
        ctx->heap = NULL;
12814
0
        return ctx;
12815
0
    }
12816
0
    return NULL;
12817
0
}
12818
/*  wolfSSL_EVP_ENCODE_CTX_free frees specified WOLFSSL_EVP_ENCODE_CTX struct.
12819
 */
12820
void wolfSSL_EVP_ENCODE_CTX_free(WOLFSSL_EVP_ENCODE_CTX* ctx)
12821
0
{
12822
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_free");
12823
0
    if (ctx != NULL) {
12824
0
        XFREE(ctx, ctx->heap, DYNAMIC_TYPE_OPENSSL);
12825
0
    }
12826
0
}
12827
#endif /* WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE */
12828
#if defined(WOLFSSL_BASE64_ENCODE)
12829
12830
/* Assume that out has enough space */
12831
int wolfSSL_EVP_EncodeBlock(unsigned char *out, const unsigned char *in,
12832
                            int inLen)
12833
0
{
12834
0
    word32 ret = (word32)-1;
12835
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeBlock");
12836
12837
0
    if (out == NULL || in == NULL)
12838
0
        return WOLFSSL_FATAL_ERROR;
12839
12840
0
    if (Base64_Encode_NoNl(in, (word32)inLen, out, &ret) == 0)
12841
0
        return (int)ret;
12842
0
    else
12843
0
        return WOLFSSL_FATAL_ERROR;
12844
0
}
12845
12846
/* Assume that out has enough space */
12847
int wolfSSL_EVP_DecodeBlock(unsigned char *out, const unsigned char *in,
12848
                            int inLen)
12849
0
{
12850
0
    word32 ret = (word32)-1;
12851
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeBlock");
12852
12853
0
    if (out == NULL || in == NULL)
12854
0
        return WOLFSSL_FATAL_ERROR;
12855
12856
0
    if (Base64_Decode(in, (word32)inLen, out, &ret) == 0)
12857
0
        return (int)ret;
12858
0
    else
12859
0
        return WOLFSSL_FATAL_ERROR;
12860
12861
0
}
12862
12863
/*  wolfSSL_EVP_EncodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX object
12864
 *  for the subsequent wolfSSL_EVP_EncodeUpdate.
12865
 */
12866
void wolfSSL_EVP_EncodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
12867
0
{
12868
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeInit");
12869
12870
    /* clean up ctx */
12871
0
    if (ctx != NULL) {
12872
0
        ctx->remaining = 0;
12873
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12874
0
    }
12875
0
}
12876
/*  wolfSSL_EVP_EncodeUpdate encodes the input data in 48-byte units
12877
 *  and outputs it to out. If less than 48 bytes of data remain, save it in
12878
 *  ctx. The data given in the subsequent wolfSSL_EVP_EncodeUpdate
12879
 *  is combined with the data stored in CTX and used for encoding.
12880
 *  Returns 1 on success, 0 on error.
12881
 */
12882
int  wolfSSL_EVP_EncodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
12883
            unsigned char* out, int* outl, const unsigned char* in, int inl)
12884
0
{
12885
0
    int res;
12886
0
    word32 outsz = 0;
12887
12888
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeUpdate");
12889
12890
0
    if (ctx == NULL || out == NULL || in == NULL || outl == NULL)
12891
0
        return 0;
12892
12893
0
    *outl = 0;
12894
12895
    /* if the remaining data exists in the ctx, add input data to them
12896
     * to create a block(48bytes) for encoding
12897
     */
12898
0
    if (ctx->remaining > 0 && inl > 0) {
12899
0
        int cpysz = (int)min(
12900
0
            (word32)(BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
12901
0
        XMEMCPY(ctx->data + ctx->remaining, in, (size_t)cpysz);
12902
0
        ctx->remaining += cpysz;
12903
0
        in             += cpysz;
12904
0
        inl            -= cpysz;
12905
12906
        /* check if a block for encoding exists in ctx.data, if so encode it */
12907
0
        if (ctx->remaining >= BASE64_ENCODE_BLOCK_SIZE) {
12908
            /* Base64_Encode asks the out buff size via the 4th param*/
12909
0
            outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;
12910
0
            res = Base64_Encode(ctx->data, BASE64_ENCODE_BLOCK_SIZE, out,
12911
0
                &outsz);
12912
0
            if (res == 0) {
12913
0
                ctx->remaining = 0;
12914
0
                *outl = (int)outsz;
12915
0
            }
12916
0
            else
12917
0
                return 0;   /* return with error */
12918
0
        }
12919
0
        else {
12920
            /* could not create a block */
12921
0
            *outl = 0;
12922
0
            return  1;
12923
0
        }
12924
0
    }
12925
    /* Here, there is no data left in ctx, so try processing the data of
12926
     * the specified input data.
12927
     */
12928
12929
0
    while (inl >= BASE64_ENCODE_BLOCK_SIZE) {
12930
0
        outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;/* 64 byte and one for LF*/
12931
0
        res = Base64_Encode(in, BASE64_ENCODE_BLOCK_SIZE,out,&outsz);
12932
0
        if (res == 0) {
12933
0
            in    += BASE64_ENCODE_BLOCK_SIZE;
12934
0
            inl   -= BASE64_ENCODE_BLOCK_SIZE;
12935
0
            out   += outsz;
12936
0
            *outl += (int)outsz;
12937
0
        }
12938
0
        else {
12939
0
            *outl = 0;
12940
0
            return  0;
12941
0
        }
12942
0
    }
12943
12944
    /* if remaining data exists, copy them into ctx for the next call*/
12945
0
    if (inl > 0) {
12946
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12947
0
        XMEMCPY(ctx->data, in, (size_t)inl);
12948
0
        ctx->remaining = inl;
12949
0
    }
12950
12951
0
    return 1;   /* returns 1 on success, 0 on error */
12952
0
}
12953
/*  wolfSSL_EVP_EncodeFinal encodes data in ctx and outputs to out.
12954
 */
12955
void wolfSSL_EVP_EncodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
12956
                unsigned char* out, int* outl)
12957
0
{
12958
0
    word32 outsz = 0;
12959
0
    int res;
12960
12961
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeFinal");
12962
12963
0
    if (outl == NULL)
12964
0
        return;
12965
12966
0
    if (ctx == NULL || out == NULL) {
12967
0
        *outl = 0;
12968
0
        return;
12969
0
    }
12970
0
    if (ctx->remaining >= BASE64_ENCODE_RESULT_BLOCK_SIZE) {
12971
0
        *outl = 0;
12972
0
        return;
12973
0
    }
12974
    /* process remaining data in ctx */
12975
0
    outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; /* 64 byte and one for LF*/
12976
0
    res = Base64_Encode(ctx->data, (word32)ctx->remaining, out, &outsz);
12977
0
    if (res == 0)
12978
0
        *outl = (int)outsz;
12979
0
    else
12980
0
        *outl = 0;
12981
12982
0
    ctx->remaining = 0;
12983
0
    XMEMSET(ctx->data, 0, sizeof(ctx->data));
12984
12985
0
    return;
12986
0
}
12987
#endif /* WOLFSSL_BASE64_ENCODE */
12988
#if defined(WOLFSSL_BASE64_DECODE)
12989
12990
/*  wolfSSL_EVP_DecodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX struct
12991
 *  for subsequent wolfSSL_EVP_DecodeUpdate.
12992
 */
12993
void wolfSSL_EVP_DecodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
12994
0
{
12995
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeInit");
12996
    /* clean up ctx */
12997
0
    if (ctx != NULL) {
12998
0
        ctx->remaining = 0;
12999
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
13000
0
    }
13001
0
}
13002
/*  wolfSSL_EVP_DecodeUpdate encodes the input data in 4-byte units
13003
 *  and outputs it to out. If less than 4 bytes of data remain, save it in
13004
 *  ctx. The data given in the subsequent wolfSSL_EVP_DecodeUpdate
13005
 *  is combined with the data stored in CTX and used for decoding.
13006
 *  Returns 1 or 0 on success, -1 on error. Return value 0 indicates that
13007
 *  clients should call wolfSSL_EVP_DecodeFinal as next call.
13008
 */
13009
int  wolfSSL_EVP_DecodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
13010
            unsigned char* out, int* outl, const unsigned char* in, int inl)
13011
0
{
13012
0
    word32 outsz = 0;
13013
0
    word32 j = 0;
13014
0
    word32 inLen;
13015
0
    int    res;
13016
0
    int    pad = 0;
13017
0
    int    i;
13018
0
    unsigned char c;
13019
0
    int pad3 = 0;
13020
0
    int pad4 = 0;
13021
0
    byte e[4];
13022
13023
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeUpdate");
13024
13025
0
    if (outl == NULL)
13026
0
        return -1;
13027
13028
0
    if (ctx == NULL || out == NULL || in == NULL) {
13029
0
        *outl = 0;
13030
0
        return -1;
13031
0
    }
13032
13033
0
    if (inl == 0) {
13034
0
        *outl = 0;
13035
0
        return 1;
13036
0
    }
13037
13038
0
    inLen = (word32)inl;
13039
0
    *outl = 0;
13040
13041
    /* if the remaining data exist in the ctx, add input data to them to create
13042
    a block(4bytes) for decoding*/
13043
0
    if (ctx->remaining > 0 && inl > 0) {
13044
13045
0
        int cpySz = (int)min(
13046
0
            (word32)(BASE64_DECODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
13047
13048
0
        for ( i = 0; cpySz > 0 && inLen > 0; i++) {
13049
0
            if (Base64_SkipNewline(in, &inLen, &j) == WC_NO_ERR_TRACE(ASN_INPUT_E)) {
13050
0
                return -1;  /* detected an illegal char in input */
13051
0
            }
13052
0
            c = in[j++];
13053
13054
0
            if (c == '=')
13055
0
                pad = 1;
13056
13057
0
            *(ctx->data + ctx->remaining + i) = c;
13058
0
            inLen--;
13059
0
            cpySz--;
13060
0
        }
13061
13062
0
        outsz = sizeof(ctx->data);
13063
0
        res = Base64_Decode( ctx->data, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
13064
0
        if (res == 0) {
13065
0
            *outl += (int)outsz;
13066
0
            out   += outsz;
13067
13068
0
            ctx->remaining = 0;
13069
0
            XMEMSET(ctx->data, 0, sizeof(ctx->data));
13070
0
        }
13071
0
        else {
13072
0
            *outl = 0;
13073
0
            return -1;   /* return with error */
13074
0
        }
13075
0
    }
13076
13077
    /* Base64_Decode is not a streaming process, so it processes
13078
     * the input data and exits. If a line break or whitespace
13079
     * character is found in the input data, it will be skipped,
13080
     * but if the end point of the input data is reached as a result,
13081
     * Base64_Decode will stop processing there. The data cleansing is
13082
     * required before Base64_Decode so that the processing does not
13083
     * stop within 4 bytes, which is the unit of Base64 decoding processing.
13084
     * The logic that exists before calling Base64_Decode in a While Loop is
13085
     * a data cleansing process that removes line breaks and whitespace.
13086
     */
13087
0
    while (inLen > 3) {
13088
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13089
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13090
0
                break;
13091
0
            }
13092
0
            else {
13093
0
                *outl = 0;
13094
0
                return -1;
13095
0
            }
13096
0
        }
13097
0
        e[0] = in[j++];
13098
0
        if (e[0] == '\0') {
13099
0
            break;
13100
0
        }
13101
0
        inLen--;
13102
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13103
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13104
0
                break;
13105
0
            }
13106
0
            else {
13107
0
                *outl = 0;
13108
0
                return -1;
13109
0
            }
13110
0
        }
13111
0
        e[1] = in[j++];
13112
0
        inLen--;
13113
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13114
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13115
0
                break;
13116
0
            }
13117
0
            else {
13118
0
                *outl = 0;
13119
0
                return -1;
13120
0
            }
13121
0
        }
13122
0
        e[2] = in[j++];
13123
0
        inLen--;
13124
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13125
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13126
0
                break;
13127
0
            }
13128
0
            else {
13129
0
                *outl = 0;
13130
0
                return -1;
13131
0
            }
13132
0
        }
13133
0
        e[3] = in[j++];
13134
0
        inLen--;
13135
13136
0
        if (e[0] == '=')
13137
0
            pad = 1;
13138
0
        if (e[1] == '=')
13139
0
            pad = 1;
13140
0
        if (e[2] == '=') {
13141
0
            pad = 1;
13142
0
            pad3 = 1;
13143
0
        }
13144
0
        if (e[3] == '=') {
13145
0
            pad = 1;
13146
0
            pad4 = 1;
13147
0
        }
13148
0
        if (pad3 && !pad4) {
13149
0
            *outl = 0;
13150
0
            return -1;
13151
0
        }
13152
13153
        /* decode four bytes */
13154
0
        outsz = sizeof(ctx->data);
13155
0
        res = Base64_Decode( e, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
13156
0
        if (res < 0) {
13157
0
            *outl = 0;
13158
0
            return -1;
13159
0
        }
13160
13161
0
        *outl += (int)outsz;
13162
0
        out   += outsz;
13163
0
    }
13164
    /* copy left data to ctx */
13165
0
    if (inLen > 0) {
13166
13167
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
13168
13169
0
        i = 0;
13170
0
        while (inLen > 0) {
13171
0
            c = in[j++];
13172
0
            if (c== '\n' || c == '\r' || c == ' ') {
13173
0
                inLen--;
13174
0
                continue;
13175
0
            }
13176
0
            if (c == '=') {
13177
0
                pad = 1;
13178
0
            }
13179
0
            ctx->data[i++] = c;
13180
0
            ctx->remaining++;
13181
0
            inLen--;
13182
0
        }
13183
13184
0
        if (pad)
13185
0
            return 0;   /* indicates that clients should call DecodeFinal */
13186
0
        else
13187
0
            return 1;
13188
13189
0
    }
13190
    /* If the last data is '\n', remove it */
13191
0
    if (j > 0) {
13192
0
        c = in[j - 1];
13193
0
        if (c == '\n' && (j > 1)) {
13194
0
            c = (in[j - 2]);
13195
0
            if (c == '=')
13196
0
                return 0;
13197
0
            else
13198
0
                return 1;
13199
0
        } else if (c == '\n') {
13200
0
            return 1;
13201
0
        }
13202
0
        if (c == '=')
13203
0
            return 0;
13204
0
        else
13205
0
            return 1;
13206
0
    }
13207
13208
    /* j == 0 */
13209
0
    return 1;
13210
0
}
13211
/*  wolfSSL_EVP_DecodeFinal decode remaining data in ctx
13212
 *  to outputs to out.
13213
 *  Returns 1 on success, -1 on failure.
13214
 */
13215
int  wolfSSL_EVP_DecodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
13216
                unsigned char* out, int* outl)
13217
0
{
13218
0
    word32 outsz = 0;
13219
0
    word32 inLen;
13220
0
    word32 j = 0;
13221
13222
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeFinal");
13223
13224
0
    if (outl == NULL)
13225
0
        return -1;
13226
13227
0
    if (ctx == NULL || out == NULL ) {
13228
0
        *outl = 0;
13229
0
        return -1;
13230
0
    }
13231
13232
0
    if (ctx->remaining > 0) {
13233
0
        int res;
13234
13235
0
        inLen = (word32)ctx->remaining;
13236
0
        if ((res = Base64_SkipNewline(ctx->data, &inLen, &j)) != 0) {
13237
0
            *outl = 0;
13238
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13239
                /* means no valid data to decode in buffer */
13240
0
                return  1; /* returns as success with no output */
13241
0
            }
13242
0
            else
13243
0
                return -1;
13244
0
        }
13245
13246
13247
0
        outsz = (word32)ctx->remaining;
13248
0
        res = Base64_Decode(ctx->data, (word32)ctx->remaining, out, &outsz);
13249
0
        if (res == 0) {
13250
0
            *outl = (int)outsz;
13251
0
            return 1;
13252
0
        }
13253
0
        else {
13254
0
            *outl = 0;
13255
0
            return -1;
13256
0
        }
13257
0
    }
13258
0
    else {
13259
0
        *outl = 0;
13260
0
        return 1;
13261
0
    }
13262
0
}
13263
#endif /* WOLFSSL_BASE64_DECODE */
13264
13265
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13266
13267
#endif /* WOLFSSL_EVP_INCLUDED */