Coverage Report

Created: 2026-02-14 07:18

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-2025 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
756k
#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
5.03k
{
337
5.03k
    WOLFSSL_ENTER("wolfSSL_EVP_Cipher_key_length");
338
339
5.03k
    if (c == NULL) {
340
0
        return 0;
341
0
    }
342
343
5.03k
    switch (cipherType(c)) {
344
0
#if !defined(NO_AES)
345
0
  #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
346
395
      case WC_AES_128_CBC_TYPE: return 16;
347
137
      case WC_AES_192_CBC_TYPE: return 24;
348
143
      case WC_AES_256_CBC_TYPE: return 32;
349
0
  #endif
350
0
  #if defined(WOLFSSL_AES_CFB)
351
178
      case WC_AES_128_CFB1_TYPE: return 16;
352
49
      case WC_AES_192_CFB1_TYPE: return 24;
353
154
      case WC_AES_256_CFB1_TYPE: return 32;
354
137
      case WC_AES_128_CFB8_TYPE: return 16;
355
136
      case WC_AES_192_CFB8_TYPE: return 24;
356
100
      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
171
      case WC_AES_128_OFB_TYPE: return 16;
363
160
      case WC_AES_192_OFB_TYPE: return 24;
364
252
      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
344
      case WC_AES_128_XTS_TYPE: return 16 * 2;
369
98
      case WC_AES_256_XTS_TYPE: return 32 * 2;
370
0
  #endif
371
0
  #if defined(HAVE_AESGCM)
372
476
      case WC_AES_128_GCM_TYPE: return 16;
373
101
      case WC_AES_192_GCM_TYPE: return 24;
374
466
      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
62
      case WC_AES_128_CTR_TYPE: return 16;
383
385
      case WC_AES_192_CTR_TYPE: return 24;
384
48
      case WC_AES_256_CTR_TYPE: return 32;
385
0
  #endif
386
0
  #if defined(HAVE_AES_ECB)
387
45
      case WC_AES_128_ECB_TYPE: return 16;
388
54
      case WC_AES_192_ECB_TYPE: return 24;
389
57
      case WC_AES_256_ECB_TYPE: return 32;
390
0
  #endif
391
0
#endif /* !NO_AES */
392
0
  #ifndef NO_DES3
393
228
      case WC_DES_CBC_TYPE:      return 8;
394
163
      case WC_DES_EDE3_CBC_TYPE: return 24;
395
432
      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
5.03k
      }
425
5.03k
}
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.81k
{
442
4.81k
    (void) impl;
443
4.81k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
444
4.81k
}
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.84k
{
461
4.84k
    (void) impl;
462
4.84k
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptInit");
463
4.84k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
464
4.84k
}
465
466
467
WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void)
468
8.14k
{
469
8.14k
    WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof(*ctx),
470
8.14k
                                                 NULL, DYNAMIC_TYPE_TMP_BUFFER);
471
8.14k
    if (ctx) {
472
8.14k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new");
473
8.14k
        wolfSSL_EVP_CIPHER_CTX_init(ctx);
474
8.14k
    }
475
8.14k
    return ctx;
476
8.14k
}
477
478
void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx)
479
8.14k
{
480
8.14k
    if (ctx) {
481
8.14k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_free");
482
8.14k
        wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
483
8.14k
        XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
484
8.14k
    }
485
8.14k
}
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.59k
{
579
1.59k
    if (sz > 0) {
580
1.59k
        int fill;
581
582
1.59k
        if ((sz+ctx->bufUsed) > ctx->block_size) {
583
310
            fill = ctx->block_size - ctx->bufUsed;
584
1.28k
        } else {
585
1.28k
            fill = sz;
586
1.28k
        }
587
1.59k
        XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, (size_t)fill);
588
1.59k
        ctx->bufUsed += fill;
589
1.59k
        return fill;
590
1.59k
    } else return 0;
591
1.59k
}
592
593
static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx,
594
                                   unsigned char *out,
595
                                   const unsigned char *in, int inLen)
596
4.96k
{
597
4.96k
    int ret = 0;
598
4.96k
    word32 inl = (word32)inLen;
599
600
4.96k
    switch (ctx->cipherType) {
601
0
#if !defined(NO_AES)
602
0
    #if defined(HAVE_AES_CBC)
603
248
        case WC_AES_128_CBC_TYPE:
604
307
        case WC_AES_192_CBC_TYPE:
605
376
        case WC_AES_256_CBC_TYPE:
606
376
            if (ctx->enc)
607
157
                ret = wc_AesCbcEncrypt(&ctx->cipher.aes, out, in, inl);
608
219
            else
609
219
                ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl);
610
376
            break;
611
0
    #endif
612
0
    #if defined(WOLFSSL_AES_COUNTER)
613
122
        case WC_AES_128_CTR_TYPE:
614
766
        case WC_AES_192_CTR_TYPE:
615
825
        case WC_AES_256_CTR_TYPE:
616
825
            ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
617
825
            break;
618
0
    #endif
619
0
    #if defined(HAVE_AES_ECB)
620
65
        case WC_AES_128_ECB_TYPE:
621
146
        case WC_AES_192_ECB_TYPE:
622
293
        case WC_AES_256_ECB_TYPE:
623
293
            if (ctx->enc)
624
247
                ret = wc_AesEcbEncrypt(&ctx->cipher.aes, out, in, inl);
625
46
            else
626
46
                ret = wc_AesEcbDecrypt(&ctx->cipher.aes, out, in, inl);
627
293
            break;
628
0
    #endif
629
0
    #if defined(WOLFSSL_AES_OFB)
630
312
        case WC_AES_128_OFB_TYPE:
631
563
        case WC_AES_192_OFB_TYPE:
632
924
        case WC_AES_256_OFB_TYPE:
633
924
            if (ctx->enc)
634
646
                ret = wc_AesOfbEncrypt(&ctx->cipher.aes, out, in, inl);
635
278
            else
636
278
                ret = wc_AesOfbDecrypt(&ctx->cipher.aes, out, in, inl);
637
924
            break;
638
0
    #endif
639
0
    #if defined(WOLFSSL_AES_CFB)
640
0
    #if !defined(WOLFSSL_NO_AES_CFB_1_8)
641
162
        case WC_AES_128_CFB1_TYPE:
642
211
        case WC_AES_192_CFB1_TYPE:
643
451
        case WC_AES_256_CFB1_TYPE:
644
451
            if (ctx->enc)
645
302
                ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, out, in,
646
302
                        inl * WOLFSSL_BIT_SIZE);
647
149
            else
648
149
                ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, out, in,
649
149
                        inl * WOLFSSL_BIT_SIZE);
650
451
            break;
651
652
208
        case WC_AES_128_CFB8_TYPE:
653
347
        case WC_AES_192_CFB8_TYPE:
654
387
        case WC_AES_256_CFB8_TYPE:
655
387
            if (ctx->enc)
656
225
                ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, out, in, inl);
657
162
            else
658
162
                ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, out, in, inl);
659
387
            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
338
    case WC_AES_128_XTS_TYPE:
673
430
    case WC_AES_256_XTS_TYPE:
674
430
        if (ctx->enc)
675
206
            ret = wc_AesXtsEncrypt(&ctx->cipher.xts, out, in, inl,
676
206
                    ctx->iv, (word32)ctx->ivSz);
677
224
        else
678
224
            ret = wc_AesXtsDecrypt(&ctx->cipher.xts, out, in, inl,
679
224
                    ctx->iv, (word32)ctx->ivSz);
680
430
        break;
681
0
#endif
682
0
#endif /* !NO_AES */
683
0
    #ifndef NO_DES3
684
367
        case WC_DES_CBC_TYPE:
685
367
            if (ctx->enc)
686
245
                ret = wc_Des_CbcEncrypt(&ctx->cipher.des, out, in, inl);
687
122
            else
688
122
                ret = wc_Des_CbcDecrypt(&ctx->cipher.des, out, in, inl);
689
367
            break;
690
325
        case WC_DES_EDE3_CBC_TYPE:
691
325
            if (ctx->enc)
692
245
                ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, out, in, inl);
693
80
            else
694
80
                ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, out, in, inl);
695
325
            break;
696
0
        #if defined(WOLFSSL_DES_ECB)
697
533
        case WC_DES_ECB_TYPE:
698
533
            ret = wc_Des_EcbEncrypt(&ctx->cipher.des, out, in, inl);
699
533
            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.96k
    }
735
736
4.96k
    (void)in;
737
4.96k
    (void)inl;
738
4.96k
    (void)out;
739
740
4.96k
    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
741
4.96k
}
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
10.3k
{
783
10.3k
    word32 inl = (word32)inLen;
784
785
10.3k
#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
786
10.3k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
787
10.3k
    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
10.3k
#endif
836
10.3k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
837
10.3k
    else
838
10.3k
#endif
839
10.3k
#if defined(WOLFSSL_AESGCM_STREAM)
840
10.3k
    {
841
10.3k
        int ret;
842
843
        /* When out is NULL then this is AAD. */
844
10.3k
        if (out == NULL) {
845
1.33k
            if (ctx->enc) {
846
72
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
847
72
                    in, inl);
848
72
            }
849
1.25k
            else {
850
1.25k
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
851
1.25k
                    in, inl);
852
1.25k
            }
853
1.33k
        }
854
        /* When out is not NULL then this is plaintext/cipher text. */
855
9.01k
        else {
856
9.01k
            if (ctx->enc) {
857
8.67k
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl,
858
8.67k
                    NULL, 0);
859
8.67k
            }
860
344
            else {
861
344
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl,
862
344
                    NULL, 0);
863
344
            }
864
9.01k
        }
865
10.3k
        *outl = (int)inl;
866
10.3k
        if (ret == 0) {
867
10.3k
            ret = WOLFSSL_SUCCESS;
868
10.3k
        }
869
0
        else {
870
0
            ret = WOLFSSL_FAILURE;
871
0
        }
872
10.3k
        return ret;
873
10.3k
    }
874
10.3k
#endif /* WOLFSSL_AESGCM_STREAM */
875
10.3k
}
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
29.0k
{
1055
29.0k
    int blocks;
1056
1057
29.0k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherUpdate");
1058
29.0k
    if ((ctx == NULL) || (outl == NULL)) {
1059
0
        WOLFSSL_MSG("Bad argument");
1060
0
        return WOLFSSL_FAILURE;
1061
0
    }
1062
1063
29.0k
    *outl = 0;
1064
1065
29.0k
    if ((inl == 0) && (in == NULL)) {
1066
        /* Nothing to do in this case. Just return. */
1067
391
        return WOLFSSL_SUCCESS;
1068
391
    }
1069
1070
28.6k
    if ((inl < 0) || (in == NULL)) {
1071
0
        WOLFSSL_MSG("Bad argument");
1072
0
        return WOLFSSL_FAILURE;
1073
0
    }
1074
1075
28.6k
    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
4.97k
        case WC_AES_128_GCM_TYPE:
1086
6.79k
        case WC_AES_192_GCM_TYPE:
1087
10.3k
        case WC_AES_256_GCM_TYPE:
1088
            /* if out == NULL, in/inl contains the additional auth data */
1089
10.3k
            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.2k
        default:
1153
            /* fall-through */
1154
18.2k
            break;
1155
28.6k
    }
1156
1157
18.2k
    if (out == NULL) {
1158
1
        return WOLFSSL_FAILURE;
1159
1
    }
1160
1161
    /* if(inl == 0)wolfSSL_EVP_CipherUpdate_GCM to get tag */
1162
18.2k
    if (inl == 0) {
1163
13.0k
        return WOLFSSL_SUCCESS;
1164
13.0k
    }
1165
5.21k
    if (ctx->bufUsed > 0) { /* concatenate them if there is anything */
1166
882
        int fill = fillBuff(ctx, in, inl);
1167
882
        inl -= fill;
1168
882
        in  += fill;
1169
882
    }
1170
1171
    /* check if the buff is full, and if so flash it out */
1172
5.21k
    if (ctx->bufUsed == ctx->block_size) {
1173
464
        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
464
        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
464
        PRINT_BUF(ctx->buf, ctx->block_size);
1188
464
        if (evpCipherBlock(ctx, output, ctx->buf, ctx->block_size) == 0) {
1189
0
            return WOLFSSL_FAILURE;
1190
0
        }
1191
464
        PRINT_BUF(out, ctx->block_size);
1192
464
        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
464
        if ((ctx->enc != 0)) {
1197
464
            *outl+= ctx->block_size;
1198
464
            out  += ctx->block_size;
1199
464
        }
1200
464
    }
1201
1202
5.21k
    blocks = inl / ctx->block_size;
1203
5.21k
    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.27k
        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.27k
        if (evpCipherBlock(ctx, out, in, blocks * ctx->block_size) == 0) {
1216
13
            return WOLFSSL_FAILURE;
1217
13
        }
1218
4.25k
        PRINT_BUF(in, ctx->block_size*blocks);
1219
4.25k
        PRINT_BUF(out,ctx->block_size*blocks);
1220
4.25k
        inl  -= ctx->block_size * blocks;
1221
4.25k
        in   += ctx->block_size * blocks;
1222
4.25k
        if (ctx->enc == 0) {
1223
1.70k
            if ((ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) ||
1224
1.48k
                    (ctx->block_size == 1)) {
1225
1.28k
                ctx->lastUsed = 0;
1226
1.28k
                *outl += ctx->block_size * blocks;
1227
1.28k
            } 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
421
                if (inl == 0) { /* if not 0 then we know leftovers are checked*/
1231
417
                    ctx->lastUsed = 1;
1232
417
                    blocks = blocks - 1; /* save last block to check padding in
1233
                                          * EVP_CipherFinal call */
1234
417
                    XMEMCPY(ctx->lastBlock, &out[ctx->block_size * blocks],
1235
417
                            (size_t)ctx->block_size);
1236
417
                }
1237
421
                *outl += ctx->block_size * blocks;
1238
421
            }
1239
2.55k
        } else {
1240
2.55k
            *outl += ctx->block_size * blocks;
1241
2.55k
        }
1242
4.25k
    }
1243
1244
1245
5.20k
    if (inl > 0) {
1246
        /* put fraction into buff */
1247
712
        fillBuff(ctx, in, inl);
1248
        /* no increase of outl */
1249
712
    }
1250
5.20k
    (void)out; /* silence warning in case not read */
1251
1252
5.20k
    return WOLFSSL_SUCCESS;
1253
5.21k
}
1254
1255
static void padBlock(WOLFSSL_EVP_CIPHER_CTX *ctx)
1256
224
{
1257
224
    int i;
1258
1.45k
    for (i = ctx->bufUsed; i < ctx->block_size; i++)
1259
1.23k
        ctx->buf[i] = (byte)(ctx->block_size - ctx->bufUsed);
1260
224
}
1261
1262
static int checkPad(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *buff)
1263
417
{
1264
417
    int i;
1265
417
    int n;
1266
417
    n = buff[ctx->block_size-1];
1267
417
    if (n > ctx->block_size) return -1;
1268
1.72k
    for (i = 0; i < n; i++) {
1269
1.39k
        if (buff[ctx->block_size-i-1] != n)
1270
43
            return -1;
1271
1.39k
    }
1272
323
    return ctx->block_size - n;
1273
366
}
1274
1275
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1276
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1277
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1278
static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
1279
0
{
1280
0
    int i;
1281
0
    for (i = (int)ctrSz-1; i >= 0; i--) {
1282
0
        if (++ctr[i])
1283
0
            break;
1284
0
    }
1285
0
}
1286
#endif
1287
1288
int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out,
1289
                            int *outl)
1290
4.20k
{
1291
4.20k
    int ret = WOLFSSL_SUCCESS;
1292
1293
4.20k
    if (!ctx || !outl)
1294
0
        return WOLFSSL_FAILURE;
1295
1296
4.20k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal");
1297
4.20k
    switch (ctx->cipherType) {
1298
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1299
0
    || FIPS_VERSION_GE(2,0))
1300
450
        case WC_AES_128_GCM_TYPE:
1301
543
        case WC_AES_192_GCM_TYPE:
1302
958
        case WC_AES_256_GCM_TYPE:
1303
#ifndef WOLFSSL_AESGCM_STREAM
1304
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1305
             || (ctx->authBufferLen == 0)) {
1306
                if (ctx->enc)
1307
                    ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out,
1308
                            ctx->authBuffer, ctx->authBufferLen,
1309
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1310
                            ctx->authIn, ctx->authInSz);
1311
                else
1312
                    ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out,
1313
                            ctx->authBuffer, ctx->authBufferLen,
1314
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1315
                            ctx->authIn, ctx->authInSz);
1316
1317
                if (ret == 0) {
1318
                    ret = WOLFSSL_SUCCESS;
1319
                    *outl = ctx->authBufferLen;
1320
                }
1321
                else {
1322
                    ret = WOLFSSL_FAILURE;
1323
                    *outl = 0;
1324
                }
1325
1326
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1327
                ctx->authBuffer = NULL;
1328
                ctx->authBufferLen = 0;
1329
1330
                if (ctx->authIncIv) {
1331
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1332
                    ctx->authIncIv = 0;
1333
                }
1334
            }
1335
            else {
1336
                *outl = 0;
1337
            }
1338
#else
1339
            /* No data to return - all handled in Update. */
1340
958
            *outl = 0;
1341
958
            if (ctx->enc) {
1342
547
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, ctx->authTag,
1343
547
                    (word32)ctx->authTagSz);
1344
547
            }
1345
411
            else {
1346
411
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, ctx->authTag,
1347
411
                    (word32)ctx->authTagSz);
1348
411
                if (ctx->authIncIv) {
1349
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1350
0
                }
1351
411
            }
1352
1353
958
            if (ret == 0)
1354
803
                ret = WOLFSSL_SUCCESS;
1355
155
            else
1356
155
                ret = WOLFSSL_FAILURE;
1357
1358
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
1359
958
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
1360
958
                              (byte*)ctx->cipher.aes.reg,
1361
958
                              (word32)ctx->ivSz) != 0)
1362
0
            {
1363
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
1364
0
                ret = WOLFSSL_FAILURE;
1365
0
            }
1366
958
#endif /* WOLFSSL_AESGCM_STREAM */
1367
958
            if (ret == WOLFSSL_SUCCESS) {
1368
803
                if (ctx->authIncIv) {
1369
0
                    ctx->authIncIv = 0;
1370
0
                }
1371
803
                else {
1372
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1373
803
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1374
803
                }
1375
803
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1376
0
                    ret = WOLFSSL_FAILURE;
1377
0
                }
1378
803
            }
1379
958
            break;
1380
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1381
        * HAVE_FIPS_VERSION >= 2 */
1382
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1383
0
    || FIPS_VERSION_GE(2,0))
1384
0
        case WC_AES_128_CCM_TYPE:
1385
0
        case WC_AES_192_CCM_TYPE:
1386
0
        case WC_AES_256_CCM_TYPE:
1387
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1388
0
             || (ctx->authBufferLen == 0)) {
1389
0
                if (ctx->enc) {
1390
0
                    ret = wc_AesCcmEncrypt(&ctx->cipher.aes, out,
1391
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1392
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1393
0
                        (word32)ctx->authTagSz, ctx->authIn,
1394
0
                        (word32)ctx->authInSz);
1395
0
                }
1396
0
                else {
1397
0
                    ret = wc_AesCcmDecrypt(&ctx->cipher.aes, out,
1398
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1399
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1400
0
                        (word32)ctx->authTagSz, ctx->authIn,
1401
0
                        (word32)ctx->authInSz);
1402
0
                }
1403
1404
0
                if (ret == 0) {
1405
0
                    ret = WOLFSSL_SUCCESS;
1406
0
                    *outl = ctx->authBufferLen;
1407
0
                }
1408
0
                else {
1409
0
                    ret = WOLFSSL_FAILURE;
1410
0
                    *outl = 0;
1411
0
                }
1412
1413
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1414
0
                ctx->authBuffer = NULL;
1415
0
                ctx->authBufferLen = 0;
1416
1417
0
                if (ctx->authIncIv) {
1418
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1419
0
                    ctx->authIncIv = 0;
1420
0
                }
1421
0
            }
1422
0
            else {
1423
0
                *outl = 0;
1424
0
            }
1425
0
            if (ret == WOLFSSL_SUCCESS) {
1426
0
                if (ctx->authIncIv) {
1427
0
                    ctx->authIncIv = 0;
1428
0
                }
1429
0
                else {
1430
                    /* Clear IV, since IV reuse is not recommended
1431
                     * for AES CCM. */
1432
0
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1433
0
                }
1434
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1435
0
                    ret = WOLFSSL_FAILURE;
1436
0
                }
1437
0
            }
1438
0
            break;
1439
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1440
        * HAVE_FIPS_VERSION >= 2 */
1441
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1442
    || FIPS_VERSION_GE(2,0))
1443
        case WC_ARIA_128_GCM_TYPE:
1444
        case WC_ARIA_192_GCM_TYPE:
1445
        case WC_ARIA_256_GCM_TYPE:
1446
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1447
             || (ctx->authBufferLen == 0)) {
1448
                if (ctx->enc)
1449
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, out,
1450
                            ctx->authBuffer, ctx->authBufferLen,
1451
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1452
                            ctx->authTag, ctx->authTagSz);
1453
                else
1454
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, out,
1455
                            ctx->authBuffer, ctx->authBufferLen,
1456
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1457
                            ctx->authTag, ctx->authTagSz);
1458
1459
                if (ret == 0) {
1460
                    ret = WOLFSSL_SUCCESS;
1461
                    *outl = ctx->authBufferLen;
1462
                }
1463
                else {
1464
                    ret = WOLFSSL_FAILURE;
1465
                    *outl = 0;
1466
                }
1467
1468
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1469
                ctx->authBuffer = NULL;
1470
                ctx->authBufferLen = 0;
1471
1472
                if (ctx->authIncIv) {
1473
                    IncCtr((byte*)ctx->cipher.aria.nonce,
1474
                           ctx->cipher.aria.nonceSz);
1475
                    ctx->authIncIv = 0;
1476
                }
1477
            }
1478
            else {
1479
                *outl = 0;
1480
            }
1481
            if (ret == WOLFSSL_SUCCESS) {
1482
                if (ctx->authIncIv) {
1483
                    ctx->authIncIv = 0;
1484
                }
1485
                else {
1486
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1487
                    XMEMSET(ctx->iv, 0, ARIA_BLOCK_SIZE);
1488
                }
1489
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1490
                    ret = WOLFSSL_FAILURE;
1491
                }
1492
            }
1493
            break;
1494
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1495
        * HAVE_FIPS_VERSION >= 2 */
1496
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
1497
0
        case WC_CHACHA20_POLY1305_TYPE:
1498
0
            if (wc_ChaCha20Poly1305_Final(&ctx->cipher.chachaPoly,
1499
0
                                          ctx->authTag) != 0) {
1500
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Final failed");
1501
0
                return WOLFSSL_FAILURE;
1502
0
            }
1503
0
            else {
1504
0
                *outl = 0;
1505
0
                return WOLFSSL_SUCCESS;
1506
0
            }
1507
0
            break;
1508
0
#endif
1509
0
#ifdef WOLFSSL_SM4_GCM
1510
0
        case WC_SM4_GCM_TYPE:
1511
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1512
0
                     (ctx->authBufferLen == 0)) {
1513
0
                if (ctx->enc)
1514
0
                    ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, out,
1515
0
                            ctx->authBuffer, ctx->authBufferLen,
1516
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1517
0
                            ctx->authIn, ctx->authInSz);
1518
0
                else
1519
0
                    ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, out,
1520
0
                            ctx->authBuffer, ctx->authBufferLen,
1521
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1522
0
                            ctx->authIn, ctx->authInSz);
1523
1524
0
                if (ret == 0) {
1525
0
                    ret = WOLFSSL_SUCCESS;
1526
0
                    *outl = ctx->authBufferLen;
1527
0
                }
1528
0
                else {
1529
0
                    ret = WOLFSSL_FAILURE;
1530
0
                    *outl = 0;
1531
0
                }
1532
1533
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1534
0
                ctx->authBuffer = NULL;
1535
0
                ctx->authBufferLen = 0;
1536
1537
0
                if (ctx->authIncIv) {
1538
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1539
0
                    ctx->authIncIv = 0;
1540
0
                }
1541
0
            }
1542
0
            else {
1543
0
                *outl = 0;
1544
0
            }
1545
0
            if (ret == WOLFSSL_SUCCESS) {
1546
0
                if (ctx->authIncIv) {
1547
0
                    ctx->authIncIv = 0;
1548
0
                }
1549
0
                else {
1550
                    /* Clear IV, since IV reuse is not recommended for SM4 GCM.
1551
                     */
1552
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1553
0
                }
1554
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1555
0
                    ret = WOLFSSL_FAILURE;
1556
0
                }
1557
0
            }
1558
0
            break;
1559
0
#endif
1560
0
#ifdef WOLFSSL_SM4_CCM
1561
0
        case WC_SM4_CCM_TYPE:
1562
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1563
0
                    (ctx->authBufferLen == 0)) {
1564
0
                if (ctx->enc)
1565
0
                    ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, out,
1566
0
                            ctx->authBuffer, ctx->authBufferLen,
1567
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1568
0
                            ctx->authIn, ctx->authInSz);
1569
0
                else
1570
0
                    ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, out,
1571
0
                            ctx->authBuffer, ctx->authBufferLen,
1572
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1573
0
                            ctx->authIn, ctx->authInSz);
1574
1575
0
                if (ret == 0) {
1576
0
                    ret = WOLFSSL_SUCCESS;
1577
0
                    *outl = ctx->authBufferLen;
1578
0
                }
1579
0
                else {
1580
0
                    ret = WOLFSSL_FAILURE;
1581
0
                    *outl = 0;
1582
0
                }
1583
1584
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1585
0
                ctx->authBuffer = NULL;
1586
0
                ctx->authBufferLen = 0;
1587
1588
0
                if (ctx->authIncIv) {
1589
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1590
0
                    ctx->authIncIv = 0;
1591
0
                }
1592
0
            }
1593
0
            else {
1594
0
                *outl = 0;
1595
0
            }
1596
0
            if (ret == WOLFSSL_SUCCESS) {
1597
0
                if (ctx->authIncIv) {
1598
0
                    ctx->authIncIv = 0;
1599
0
                }
1600
0
                else {
1601
                    /* Clear IV, since IV reuse is not recommended
1602
                     * for SM4 CCM. */
1603
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1604
0
                }
1605
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1606
0
                    ret = WOLFSSL_FAILURE;
1607
0
                }
1608
0
            }
1609
0
            break;
1610
0
#endif
1611
3.24k
        default:
1612
3.24k
            if (!out)
1613
0
                return WOLFSSL_FAILURE;
1614
1615
3.24k
            if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) {
1616
536
                if (ctx->bufUsed != 0) return WOLFSSL_FAILURE;
1617
435
                *outl = 0;
1618
435
            }
1619
2.71k
            else if (ctx->enc) {
1620
1.19k
                if (ctx->block_size == 1) {
1621
973
                    *outl = 0;
1622
973
                }
1623
224
                else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) {
1624
224
                    padBlock(ctx);
1625
224
                    PRINT_BUF(ctx->buf, ctx->block_size);
1626
224
                    if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) {
1627
0
                        WOLFSSL_MSG("Final Cipher Block failed");
1628
0
                        ret = WOLFSSL_FAILURE;
1629
0
                    }
1630
224
                    else {
1631
224
                        PRINT_BUF(out, ctx->block_size);
1632
224
                        *outl = ctx->block_size;
1633
224
                    }
1634
224
                }
1635
1.19k
            }
1636
1.51k
            else {
1637
1.51k
                if (ctx->block_size == 1) {
1638
1.06k
                    *outl = 0;
1639
1.06k
                }
1640
449
                else if ((ctx->bufUsed % ctx->block_size) != 0) {
1641
22
                    *outl = 0;
1642
                    /* not enough padding for decrypt */
1643
22
                    WOLFSSL_MSG("Final Cipher Block not enough padding");
1644
22
                    ret = WOLFSSL_FAILURE;
1645
22
                }
1646
427
                else if (ctx->lastUsed) {
1647
417
                    int fl;
1648
417
                    PRINT_BUF(ctx->lastBlock, ctx->block_size);
1649
417
                    if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) {
1650
323
                        XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1651
323
                        *outl = fl;
1652
323
                        if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1653
                            /* return error in cases where the block length is
1654
                             * incorrect */
1655
0
                            WOLFSSL_MSG("Final Cipher Block bad length");
1656
0
                            ret = WOLFSSL_FAILURE;
1657
0
                        }
1658
323
                    }
1659
94
                    else {
1660
94
                        ret = WOLFSSL_FAILURE;
1661
94
                    }
1662
417
                }
1663
10
                else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1664
                    /* return error in cases where the block length is
1665
                     * incorrect */
1666
10
                    ret = WOLFSSL_FAILURE;
1667
10
                }
1668
1.51k
            }
1669
3.14k
            break;
1670
4.20k
    }
1671
1672
4.10k
    if (ret == WOLFSSL_SUCCESS) {
1673
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1674
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1675
3.82k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1676
3.82k
            || FIPS_VERSION_GE(2,0))
1677
3.82k
        byte tmp = 0;
1678
1679
        /*
1680
         * This flag needs to retain its value between wolfSSL_EVP_CipherFinal
1681
         * calls. wolfSSL_EVP_CipherInit will clear it, so we save and restore
1682
         * it here.
1683
         */
1684
3.82k
        if (FALSE
1685
3.82k
        #ifdef HAVE_AESGCM
1686
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1687
3.47k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1688
3.43k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1689
3.02k
        #endif
1690
3.02k
        #ifdef HAVE_AESCCM
1691
3.02k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1692
3.02k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1693
3.02k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1694
3.02k
        #endif
1695
3.02k
        #ifdef WOLFSSL_SM4_GCM
1696
3.02k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1697
3.02k
        #endif
1698
3.02k
        #ifdef WOLFSSL_SM4_CCM
1699
3.02k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1700
3.82k
        #endif
1701
3.82k
            ) {
1702
803
            tmp = ctx->authIvGenEnable;
1703
803
        }
1704
3.82k
#endif
1705
1706
        /* reset cipher state after final */
1707
3.82k
        ret = wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1);
1708
1709
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1710
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1711
3.82k
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1712
3.82k
        if (FALSE
1713
3.82k
        #ifdef HAVE_AESGCM
1714
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1715
3.47k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1716
3.43k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1717
3.02k
        #endif
1718
3.02k
        #ifdef HAVE_AESCCM
1719
3.02k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1720
3.02k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1721
3.02k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1722
3.02k
        #endif
1723
3.02k
        #ifdef WOLFSSL_SM4_GCM
1724
3.02k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1725
3.02k
        #endif
1726
3.02k
        #ifdef WOLFSSL_SM4_CCM
1727
3.02k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1728
3.82k
        #endif
1729
3.82k
            ) {
1730
803
            ctx->authIvGenEnable = (tmp == 1);
1731
803
        }
1732
3.82k
#endif
1733
3.82k
    }
1734
1735
4.10k
    return ret;
1736
4.20k
}
1737
1738
1739
#ifdef WOLFSSL_EVP_DECRYPT_LEGACY
1740
/* This is a version of DecryptFinal to work with data encrypted with
1741
 * wolfSSL_EVP_EncryptFinal() with the broken padding. (pre-v3.12.0)
1742
 * Only call this after wolfSSL_EVP_CipherFinal() fails on a decrypt.
1743
 * Note, you don't know if the padding is good or bad with the old
1744
 * encrypt, but it is likely to be or bad. It will update the output
1745
 * length with the block_size so the last block is still captured. */
1746
int  wolfSSL_EVP_DecryptFinal_legacy(WOLFSSL_EVP_CIPHER_CTX *ctx,
1747
        unsigned char *out, int *outl)
1748
{
1749
    int fl;
1750
    if (ctx == NULL || out == NULL || outl == NULL)
1751
        return WOLFSSL_FAILURE;
1752
1753
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_legacy");
1754
    if (ctx->block_size == 1) {
1755
        *outl = 0;
1756
        return WOLFSSL_SUCCESS;
1757
    }
1758
    if ((ctx->bufUsed % ctx->block_size) != 0) {
1759
        *outl = 0;
1760
        /* not enough padding for decrypt */
1761
        return WOLFSSL_FAILURE;
1762
    }
1763
    /* The original behavior of CipherFinal() was like it is now,
1764
     * but checkPad would return 0 in case of a bad pad. It would
1765
     * treat the pad as 0, and leave the data in the output buffer,
1766
     * and not try to copy anything. This converts checkPad's -1 error
1767
     * code to block_size.
1768
     */
1769
    if (ctx->lastUsed) {
1770
        PRINT_BUF(ctx->lastBlock, ctx->block_size);
1771
        if ((fl = checkPad(ctx, ctx->lastBlock)) < 0) {
1772
            fl = ctx->block_size;
1773
        }
1774
        else {
1775
            XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1776
        }
1777
        *outl = fl;
1778
    }
1779
    /* return error in cases where the block length is incorrect */
1780
    if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1781
        return WOLFSSL_FAILURE;
1782
    }
1783
1784
    return WOLFSSL_SUCCESS;
1785
}
1786
#endif
1787
1788
int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx)
1789
259
{
1790
259
    if (ctx == NULL) return WOLFSSL_FAILURE;
1791
259
    switch (ctx->cipherType) {
1792
0
#if !defined(NO_AES) || !defined(NO_DES3) || defined(WOLFSSL_SM4)
1793
0
#if !defined(NO_AES)
1794
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1795
170
    case WC_AES_128_CBC_TYPE:
1796
233
    case WC_AES_192_CBC_TYPE:
1797
259
    case WC_AES_256_CBC_TYPE:
1798
259
#endif
1799
259
#if defined(HAVE_AESGCM)
1800
259
    case WC_AES_128_GCM_TYPE:
1801
259
    case WC_AES_192_GCM_TYPE:
1802
259
    case WC_AES_256_GCM_TYPE:
1803
259
#endif
1804
259
#if defined(HAVE_AESCCM)
1805
259
    case WC_AES_128_CCM_TYPE:
1806
259
    case WC_AES_192_CCM_TYPE:
1807
259
    case WC_AES_256_CCM_TYPE:
1808
259
#endif
1809
259
#if defined(WOLFSSL_AES_COUNTER)
1810
259
    case WC_AES_128_CTR_TYPE:
1811
259
    case WC_AES_192_CTR_TYPE:
1812
259
    case WC_AES_256_CTR_TYPE:
1813
259
#endif
1814
259
#if defined(WOLFSSL_AES_CFB)
1815
259
    case WC_AES_128_CFB1_TYPE:
1816
259
    case WC_AES_192_CFB1_TYPE:
1817
259
    case WC_AES_256_CFB1_TYPE:
1818
259
    case WC_AES_128_CFB8_TYPE:
1819
259
    case WC_AES_192_CFB8_TYPE:
1820
259
    case WC_AES_256_CFB8_TYPE:
1821
259
    case WC_AES_128_CFB128_TYPE:
1822
259
    case WC_AES_192_CFB128_TYPE:
1823
259
    case WC_AES_256_CFB128_TYPE:
1824
259
#endif
1825
259
#if defined(WOLFSSL_AES_OFB)
1826
259
    case WC_AES_128_OFB_TYPE:
1827
259
    case WC_AES_192_OFB_TYPE:
1828
259
    case WC_AES_256_OFB_TYPE:
1829
259
#endif
1830
259
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1831
259
    case WC_AES_128_XTS_TYPE:
1832
259
    case WC_AES_256_XTS_TYPE:
1833
259
#endif
1834
#if defined(HAVE_ARIA)
1835
    case WC_ARIA_128_GCM_TYPE:
1836
    case WC_ARIA_192_GCM_TYPE:
1837
    case WC_ARIA_256_GCM_TYPE:
1838
#endif
1839
1840
259
    case WC_AES_128_ECB_TYPE:
1841
259
    case WC_AES_192_ECB_TYPE:
1842
259
    case WC_AES_256_ECB_TYPE:
1843
259
#endif /* !NO_AES */
1844
259
#ifndef NO_DES3
1845
259
    case WC_DES_CBC_TYPE:
1846
259
    case WC_DES_ECB_TYPE:
1847
259
    case WC_DES_EDE3_CBC_TYPE:
1848
259
    case WC_DES_EDE3_ECB_TYPE:
1849
259
#endif
1850
259
#ifdef WOLFSSL_SM4_ECB
1851
259
    case WC_SM4_ECB_TYPE:
1852
259
#endif
1853
259
#ifdef WOLFSSL_SM4_CBC
1854
259
    case WC_SM4_CBC_TYPE:
1855
259
#endif
1856
259
#ifdef WOLFSSL_SM4_CTR
1857
259
    case WC_SM4_CTR_TYPE:
1858
259
#endif
1859
259
#ifdef WOLFSSL_SM4_GCM
1860
259
    case WC_SM4_GCM_TYPE:
1861
259
#endif
1862
259
#ifdef WOLFSSL_SM4_CCM
1863
259
    case WC_SM4_CCM_TYPE:
1864
259
#endif
1865
259
        return ctx->block_size;
1866
0
#endif /* !NO_AES || !NO_DES3 || WOLFSSL_SM4 */
1867
0
    default:
1868
0
        return 0;
1869
259
    }
1870
259
}
1871
1872
static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher)
1873
38.1k
{
1874
38.1k
    if (cipher == NULL) return 0; /* dummy for #ifdef */
1875
38.1k
#ifndef NO_DES3
1876
38.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_CBC))
1877
1.28k
        return WC_DES_CBC_TYPE;
1878
36.9k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_CBC))
1879
674
        return WC_DES_EDE3_CBC_TYPE;
1880
36.2k
#if !defined(NO_DES3)
1881
36.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_ECB))
1882
5.46k
        return WC_DES_ECB_TYPE;
1883
30.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_ECB))
1884
0
        return WC_DES_EDE3_ECB_TYPE;
1885
30.7k
#endif /* NO_DES3 && HAVE_AES_ECB */
1886
30.7k
#endif
1887
30.7k
#if !defined(NO_AES)
1888
30.7k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1889
30.7k
    #ifdef WOLFSSL_AES_128
1890
30.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CBC))
1891
1.05k
        return WC_AES_128_CBC_TYPE;
1892
29.7k
    #endif
1893
29.7k
    #ifdef WOLFSSL_AES_192
1894
29.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CBC))
1895
393
        return WC_AES_192_CBC_TYPE;
1896
29.3k
    #endif
1897
29.3k
    #ifdef WOLFSSL_AES_256
1898
29.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CBC))
1899
726
        return WC_AES_256_CBC_TYPE;
1900
28.5k
    #endif
1901
28.5k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
1902
28.5k
#if defined(HAVE_AESGCM)
1903
28.5k
    #ifdef WOLFSSL_AES_128
1904
28.5k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_GCM))
1905
5.39k
        return WC_AES_128_GCM_TYPE;
1906
23.2k
    #endif
1907
23.2k
    #ifdef WOLFSSL_AES_192
1908
23.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_GCM))
1909
2.14k
        return WC_AES_192_GCM_TYPE;
1910
21.0k
    #endif
1911
21.0k
    #ifdef WOLFSSL_AES_256
1912
21.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_GCM))
1913
4.77k
        return WC_AES_256_GCM_TYPE;
1914
16.2k
    #endif
1915
16.2k
#endif /* HAVE_AESGCM */
1916
16.2k
#if defined(HAVE_AESCCM)
1917
16.2k
    #ifdef WOLFSSL_AES_128
1918
16.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CCM))
1919
0
        return WC_AES_128_CCM_TYPE;
1920
16.2k
    #endif
1921
16.2k
    #ifdef WOLFSSL_AES_192
1922
16.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CCM))
1923
0
        return WC_AES_192_CCM_TYPE;
1924
16.2k
    #endif
1925
16.2k
    #ifdef WOLFSSL_AES_256
1926
16.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CCM))
1927
0
        return WC_AES_256_CCM_TYPE;
1928
16.2k
    #endif
1929
16.2k
#endif /* HAVE_AESCCM */
1930
16.2k
#if defined(WOLFSSL_AES_COUNTER)
1931
16.2k
    #ifdef WOLFSSL_AES_128
1932
16.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CTR))
1933
500
        return WC_AES_128_CTR_TYPE;
1934
15.7k
    #endif
1935
15.7k
    #ifdef WOLFSSL_AES_192
1936
15.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CTR))
1937
3.03k
        return WC_AES_192_CTR_TYPE;
1938
12.7k
    #endif
1939
12.7k
    #ifdef WOLFSSL_AES_256
1940
12.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CTR))
1941
336
        return WC_AES_256_CTR_TYPE;
1942
12.4k
    #endif
1943
12.4k
#endif /* HAVE_AES_CBC */
1944
12.4k
#if defined(HAVE_AES_ECB)
1945
12.4k
    #ifdef WOLFSSL_AES_128
1946
12.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_ECB))
1947
457
        return WC_AES_128_ECB_TYPE;
1948
11.9k
    #endif
1949
11.9k
    #ifdef WOLFSSL_AES_192
1950
11.9k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_ECB))
1951
311
        return WC_AES_192_ECB_TYPE;
1952
11.6k
    #endif
1953
11.6k
    #ifdef WOLFSSL_AES_256
1954
11.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_ECB))
1955
655
        return WC_AES_256_ECB_TYPE;
1956
10.9k
    #endif
1957
10.9k
#endif /*HAVE_AES_CBC */
1958
10.9k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1959
10.9k
    #ifdef WOLFSSL_AES_128
1960
10.9k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_XTS))
1961
1.06k
        return WC_AES_128_XTS_TYPE;
1962
9.93k
    #endif
1963
9.93k
    #ifdef WOLFSSL_AES_256
1964
9.93k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_XTS))
1965
281
        return WC_AES_256_XTS_TYPE;
1966
9.65k
    #endif
1967
9.65k
#endif /* WOLFSSL_AES_XTS */
1968
9.65k
#if defined(WOLFSSL_AES_CFB)
1969
9.65k
#ifndef WOLFSSL_NO_AES_CFB_1_8
1970
9.65k
    #ifdef WOLFSSL_AES_128
1971
9.65k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB1))
1972
826
        return WC_AES_128_CFB1_TYPE;
1973
8.82k
    #endif
1974
8.82k
    #ifdef WOLFSSL_AES_192
1975
8.82k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB1))
1976
260
        return WC_AES_192_CFB1_TYPE;
1977
8.56k
    #endif
1978
8.56k
    #ifdef WOLFSSL_AES_256
1979
8.56k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB1))
1980
1.48k
        return WC_AES_256_CFB1_TYPE;
1981
7.08k
    #endif
1982
7.08k
    #ifdef WOLFSSL_AES_128
1983
7.08k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB8))
1984
1.16k
        return WC_AES_128_CFB8_TYPE;
1985
5.91k
    #endif
1986
5.91k
    #ifdef WOLFSSL_AES_192
1987
5.91k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB8))
1988
652
        return WC_AES_192_CFB8_TYPE;
1989
5.26k
    #endif
1990
5.26k
    #ifdef WOLFSSL_AES_256
1991
5.26k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB8))
1992
194
        return WC_AES_256_CFB8_TYPE;
1993
5.07k
    #endif
1994
5.07k
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
1995
5.07k
    #ifdef WOLFSSL_AES_128
1996
5.07k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB128))
1997
0
        return WC_AES_128_CFB128_TYPE;
1998
5.07k
    #endif
1999
5.07k
    #ifdef WOLFSSL_AES_192
2000
5.07k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB128))
2001
0
        return WC_AES_192_CFB128_TYPE;
2002
5.07k
    #endif
2003
5.07k
    #ifdef WOLFSSL_AES_256
2004
5.07k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB128))
2005
0
        return WC_AES_256_CFB128_TYPE;
2006
5.07k
    #endif
2007
5.07k
#endif /*HAVE_AES_CBC */
2008
5.07k
#if defined(WOLFSSL_AES_OFB)
2009
5.07k
    #ifdef WOLFSSL_AES_128
2010
5.07k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_OFB))
2011
1.32k
      return WC_AES_128_OFB_TYPE;
2012
3.74k
    #endif
2013
3.74k
    #ifdef WOLFSSL_AES_192
2014
3.74k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_OFB))
2015
1.39k
      return WC_AES_192_OFB_TYPE;
2016
2.35k
    #endif
2017
2.35k
    #ifdef WOLFSSL_AES_256
2018
2.35k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_OFB))
2019
1.98k
      return WC_AES_256_OFB_TYPE;
2020
370
    #endif
2021
370
#endif
2022
370
#endif /* !NO_AES */
2023
#if defined(HAVE_ARIA)
2024
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_128_GCM))
2025
        return WC_ARIA_128_GCM_TYPE;
2026
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_192_GCM))
2027
        return WC_ARIA_192_GCM_TYPE;
2028
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_256_GCM))
2029
        return WC_ARIA_256_GCM_TYPE;
2030
#endif /* HAVE_ARIA */
2031
2032
370
#ifndef NO_RC4
2033
370
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARC4))
2034
370
      return WC_ARC4_TYPE;
2035
0
#endif
2036
2037
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2038
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20_POLY1305))
2039
0
        return WC_CHACHA20_POLY1305_TYPE;
2040
0
#endif
2041
2042
0
#ifdef HAVE_CHACHA
2043
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20))
2044
0
        return WC_CHACHA20_TYPE;
2045
0
#endif
2046
2047
0
#ifdef WOLFSSL_SM4_ECB
2048
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_ECB))
2049
0
        return WC_SM4_ECB_TYPE;
2050
0
#endif
2051
0
#ifdef WOLFSSL_SM4_CBC
2052
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CBC))
2053
0
        return WC_SM4_CBC_TYPE;
2054
0
#endif
2055
0
#ifdef WOLFSSL_SM4_CTR
2056
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CTR))
2057
0
        return WC_SM4_CTR_TYPE;
2058
0
#endif
2059
0
#ifdef WOLFSSL_SM4_GCM
2060
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_GCM))
2061
0
        return WC_SM4_GCM_TYPE;
2062
0
#endif
2063
0
#ifdef WOLFSSL_SM4_CCM
2064
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CCM))
2065
0
        return WC_SM4_CCM_TYPE;
2066
0
#endif
2067
2068
0
      else return 0;
2069
38.1k
}
2070
2071
/* Getter function for cipher type string
2072
 *
2073
 * cipherType  cipherType enum value to get string for
2074
 *
2075
 * Returns string representation of the cipher type or NULL if not found
2076
 */
2077
const char* wolfSSL_EVP_CIPHER_type_string(unsigned int cipherType)
2078
0
{
2079
0
    WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_type_string");
2080
2081
0
    switch (cipherType) {
2082
0
#ifndef NO_DES3
2083
0
        case WC_DES_CBC_TYPE:           return EVP_DES_CBC;
2084
0
        case WC_DES_EDE3_CBC_TYPE:      return EVP_DES_EDE3_CBC;
2085
0
        case WC_DES_ECB_TYPE:           return EVP_DES_ECB;
2086
0
        case WC_DES_EDE3_ECB_TYPE:      return EVP_DES_EDE3_ECB;
2087
0
#endif
2088
0
#if !defined(NO_AES)
2089
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2090
0
        #ifdef WOLFSSL_AES_128
2091
0
        case WC_AES_128_CBC_TYPE:       return EVP_AES_128_CBC;
2092
0
        #endif
2093
0
        #ifdef WOLFSSL_AES_192
2094
0
        case WC_AES_192_CBC_TYPE:       return EVP_AES_192_CBC;
2095
0
        #endif
2096
0
        #ifdef WOLFSSL_AES_256
2097
0
        case WC_AES_256_CBC_TYPE:       return EVP_AES_256_CBC;
2098
0
        #endif
2099
0
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
2100
0
    #if defined(WOLFSSL_AES_CFB)
2101
0
        #ifndef WOLFSSL_NO_AES_CFB_1_8
2102
0
            #ifdef WOLFSSL_AES_128
2103
0
            case WC_AES_128_CFB1_TYPE:      return EVP_AES_128_CFB1;
2104
0
            #endif
2105
0
            #ifdef WOLFSSL_AES_192
2106
0
            case WC_AES_192_CFB1_TYPE:      return EVP_AES_192_CFB1;
2107
0
            #endif
2108
0
            #ifdef WOLFSSL_AES_256
2109
0
            case WC_AES_256_CFB1_TYPE:      return EVP_AES_256_CFB1;
2110
0
            #endif
2111
0
            #ifdef WOLFSSL_AES_128
2112
0
            case WC_AES_128_CFB8_TYPE:      return EVP_AES_128_CFB8;
2113
0
            #endif
2114
0
            #ifdef WOLFSSL_AES_192
2115
0
            case WC_AES_192_CFB8_TYPE:      return EVP_AES_192_CFB8;
2116
0
            #endif
2117
0
            #ifdef WOLFSSL_AES_256
2118
0
            case WC_AES_256_CFB8_TYPE:      return EVP_AES_256_CFB8;
2119
0
            #endif
2120
0
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
2121
0
        #ifdef WOLFSSL_AES_128
2122
0
        case WC_AES_128_CFB128_TYPE:    return EVP_AES_128_CFB128;
2123
0
        #endif
2124
0
        #ifdef WOLFSSL_AES_192
2125
0
        case WC_AES_192_CFB128_TYPE:    return EVP_AES_192_CFB128;
2126
0
        #endif
2127
0
        #ifdef WOLFSSL_AES_256
2128
0
        case WC_AES_256_CFB128_TYPE:    return EVP_AES_256_CFB128;
2129
0
        #endif
2130
0
    #endif /* WOLFSSL_AES_CFB */
2131
0
    #if defined(WOLFSSL_AES_OFB)
2132
0
        #ifdef WOLFSSL_AES_128
2133
0
        case WC_AES_128_OFB_TYPE:       return EVP_AES_128_OFB;
2134
0
        #endif
2135
0
        #ifdef WOLFSSL_AES_192
2136
0
        case WC_AES_192_OFB_TYPE:       return EVP_AES_192_OFB;
2137
0
        #endif
2138
0
        #ifdef WOLFSSL_AES_256
2139
0
        case WC_AES_256_OFB_TYPE:       return EVP_AES_256_OFB;
2140
0
        #endif
2141
0
    #endif /* WOLFSSL_AES_OFB */
2142
0
    #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2143
0
        #ifdef WOLFSSL_AES_128
2144
0
        case WC_AES_128_XTS_TYPE:       return EVP_AES_128_XTS;
2145
0
        #endif
2146
0
        #ifdef WOLFSSL_AES_256
2147
0
        case WC_AES_256_XTS_TYPE:       return EVP_AES_256_XTS;
2148
0
        #endif
2149
0
    #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
2150
0
    #if defined(HAVE_AESGCM)
2151
0
        #ifdef WOLFSSL_AES_128
2152
0
        case WC_AES_128_GCM_TYPE:       return EVP_AES_128_GCM;
2153
0
        #endif
2154
0
        #ifdef WOLFSSL_AES_192
2155
0
        case WC_AES_192_GCM_TYPE:       return EVP_AES_192_GCM;
2156
0
        #endif
2157
0
        #ifdef WOLFSSL_AES_256
2158
0
        case WC_AES_256_GCM_TYPE:       return EVP_AES_256_GCM;
2159
0
        #endif
2160
0
    #endif /* HAVE_AESGCM */
2161
0
    #if defined(HAVE_AESCCM)
2162
0
        #ifdef WOLFSSL_AES_128
2163
0
        case WC_AES_128_CCM_TYPE:       return EVP_AES_128_CCM;
2164
0
        #endif
2165
0
        #ifdef WOLFSSL_AES_192
2166
0
        case WC_AES_192_CCM_TYPE:       return EVP_AES_192_CCM;
2167
0
        #endif
2168
0
        #ifdef WOLFSSL_AES_256
2169
0
        case WC_AES_256_CCM_TYPE:       return EVP_AES_256_CCM;
2170
0
        #endif
2171
0
    #endif /* HAVE_AESCCM */
2172
0
    #if defined(WOLFSSL_AES_COUNTER)
2173
0
        #ifdef WOLFSSL_AES_128
2174
0
        case WC_AES_128_CTR_TYPE:       return EVP_AES_128_CTR;
2175
0
        #endif
2176
0
        #ifdef WOLFSSL_AES_192
2177
0
        case WC_AES_192_CTR_TYPE:       return EVP_AES_192_CTR;
2178
0
        #endif
2179
0
        #ifdef WOLFSSL_AES_256
2180
0
        case WC_AES_256_CTR_TYPE:       return EVP_AES_256_CTR;
2181
0
        #endif
2182
0
    #endif /* WOLFSSL_AES_COUNTER */
2183
0
    #if defined(HAVE_AES_ECB)
2184
0
        #ifdef WOLFSSL_AES_128
2185
0
        case WC_AES_128_ECB_TYPE:       return EVP_AES_128_ECB;
2186
0
        #endif
2187
0
        #ifdef WOLFSSL_AES_192
2188
0
        case WC_AES_192_ECB_TYPE:       return EVP_AES_192_ECB;
2189
0
        #endif
2190
0
        #ifdef WOLFSSL_AES_256
2191
0
        case WC_AES_256_ECB_TYPE:       return EVP_AES_256_ECB;
2192
0
        #endif
2193
0
    #endif /* HAVE_AES_ECB */
2194
0
#endif /* !NO_AES */
2195
#if defined(HAVE_ARIA)
2196
        case WC_ARIA_128_GCM_TYPE:      return EVP_ARIA_128_GCM;
2197
        case WC_ARIA_192_GCM_TYPE:      return EVP_ARIA_192_GCM;
2198
        case WC_ARIA_256_GCM_TYPE:      return EVP_ARIA_256_GCM;
2199
#endif /* HAVE_ARIA */
2200
0
#ifndef NO_RC4
2201
0
        case WC_ARC4_TYPE:              return EVP_ARC4;
2202
0
#endif
2203
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2204
0
        case WC_CHACHA20_POLY1305_TYPE: return EVP_CHACHA20_POLY1305;
2205
0
#endif
2206
0
#ifdef HAVE_CHACHA
2207
0
        case WC_CHACHA20_TYPE:          return EVP_CHACHA20;
2208
0
#endif
2209
0
#ifdef WOLFSSL_SM4_ECB
2210
0
        case WC_SM4_ECB_TYPE:           return EVP_SM4_ECB;
2211
0
#endif
2212
0
#ifdef WOLFSSL_SM4_CBC
2213
0
        case WC_SM4_CBC_TYPE:           return EVP_SM4_CBC;
2214
0
#endif
2215
0
#ifdef WOLFSSL_SM4_CTR
2216
0
        case WC_SM4_CTR_TYPE:           return EVP_SM4_CTR;
2217
0
#endif
2218
0
#ifdef WOLFSSL_SM4_GCM
2219
0
        case WC_SM4_GCM_TYPE:           return EVP_SM4_GCM;
2220
0
#endif
2221
0
#ifdef WOLFSSL_SM4_CCM
2222
0
        case WC_SM4_CCM_TYPE:           return EVP_SM4_CCM;
2223
0
#endif
2224
0
        case WC_NULL_CIPHER_TYPE:       return EVP_NULL;
2225
0
        default:
2226
0
            return NULL;
2227
0
    }
2228
0
}
2229
2230
int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher)
2231
31.9k
{
2232
31.9k
    if (cipher == NULL)
2233
0
        return WOLFSSL_FAILURE;
2234
2235
31.9k
    switch (cipherType(cipher)) {
2236
0
#if !defined(NO_AES)
2237
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2238
663
        case WC_AES_128_CBC_TYPE:
2239
919
        case WC_AES_192_CBC_TYPE:
2240
1.50k
        case WC_AES_256_CBC_TYPE:
2241
1.50k
            return WC_AES_BLOCK_SIZE;
2242
0
    #endif
2243
0
    #if defined(HAVE_AESGCM)
2244
4.36k
        case WC_AES_128_GCM_TYPE:
2245
6.27k
        case WC_AES_192_GCM_TYPE:
2246
10.1k
        case WC_AES_256_GCM_TYPE:
2247
10.1k
            return 1;
2248
0
    #endif
2249
0
    #if defined(HAVE_AESCCM)
2250
0
        case WC_AES_128_CCM_TYPE:
2251
0
        case WC_AES_192_CCM_TYPE:
2252
0
        case WC_AES_256_CCM_TYPE:
2253
0
            return 1;
2254
0
    #endif
2255
0
    #if defined(WOLFSSL_AES_COUNTER)
2256
437
        case WC_AES_128_CTR_TYPE:
2257
3.06k
        case WC_AES_192_CTR_TYPE:
2258
3.35k
        case WC_AES_256_CTR_TYPE:
2259
3.35k
            return 1;
2260
0
    #endif
2261
0
    #if defined(HAVE_AES_ECB)
2262
412
        case WC_AES_128_ECB_TYPE:
2263
667
        case WC_AES_192_ECB_TYPE:
2264
1.26k
        case WC_AES_256_ECB_TYPE:
2265
1.26k
            return WC_AES_BLOCK_SIZE;
2266
0
    #endif
2267
0
    #if defined(WOLFSSL_AES_CFB)
2268
636
        case WC_AES_128_CFB1_TYPE:
2269
847
        case WC_AES_192_CFB1_TYPE:
2270
2.17k
        case WC_AES_256_CFB1_TYPE:
2271
3.20k
        case WC_AES_128_CFB8_TYPE:
2272
3.71k
        case WC_AES_192_CFB8_TYPE:
2273
3.79k
        case WC_AES_256_CFB8_TYPE:
2274
3.79k
        case WC_AES_128_CFB128_TYPE:
2275
3.79k
        case WC_AES_192_CFB128_TYPE:
2276
3.79k
        case WC_AES_256_CFB128_TYPE:
2277
3.79k
            return 1;
2278
0
    #endif
2279
0
    #if defined(WOLFSSL_AES_OFB)
2280
1.12k
        case WC_AES_128_OFB_TYPE:
2281
2.36k
        case WC_AES_192_OFB_TYPE:
2282
4.09k
        case WC_AES_256_OFB_TYPE:
2283
4.09k
            return 1;
2284
0
    #endif
2285
0
    #if defined(WOLFSSL_AES_XTS) && \
2286
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2287
678
        case WC_AES_128_XTS_TYPE:
2288
854
        case WC_AES_256_XTS_TYPE:
2289
854
            return 1;
2290
0
    #endif
2291
0
  #endif /* NO_AES */
2292
2293
0
  #ifndef NO_RC4
2294
307
        case WC_ARC4_TYPE:
2295
307
            return 1;
2296
0
  #endif
2297
#if defined(HAVE_ARIA)
2298
    case WC_ARIA_128_GCM_TYPE:
2299
    case WC_ARIA_192_GCM_TYPE:
2300
    case WC_ARIA_256_GCM_TYPE:
2301
        return 1;
2302
#endif
2303
2304
0
#ifndef NO_DES3
2305
1.05k
        case WC_DES_CBC_TYPE: return 8;
2306
508
        case WC_DES_EDE3_CBC_TYPE: return 8;
2307
5.03k
        case WC_DES_ECB_TYPE: return 8;
2308
0
        case WC_DES_EDE3_ECB_TYPE: return 8;
2309
0
#endif
2310
2311
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2312
0
        case WC_CHACHA20_POLY1305_TYPE:
2313
0
            return 1;
2314
0
#endif
2315
2316
0
#ifdef HAVE_CHACHA
2317
0
        case WC_CHACHA20_TYPE:
2318
0
            return 1;
2319
0
#endif
2320
2321
0
#ifdef WOLFSSL_SM4_ECB
2322
0
       case WC_SM4_ECB_TYPE:
2323
0
            return SM4_BLOCK_SIZE;
2324
0
#endif
2325
0
#ifdef WOLFSSL_SM4_CBC
2326
0
       case WC_SM4_CBC_TYPE:
2327
0
            return SM4_BLOCK_SIZE;
2328
0
#endif
2329
0
#ifdef WOLFSSL_SM4_CTR
2330
0
       case WC_SM4_CTR_TYPE:
2331
0
            return 1;
2332
0
#endif
2333
0
#ifdef WOLFSSL_SM4_GCM
2334
0
       case WC_SM4_GCM_TYPE:
2335
0
            return 1;
2336
0
#endif
2337
0
#ifdef WOLFSSL_SM4_CCM
2338
0
       case WC_SM4_CCM_TYPE:
2339
0
            return 1;
2340
0
#endif
2341
2342
0
        default:
2343
0
            return 0;
2344
31.9k
    }
2345
31.9k
}
2346
2347
unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2348
1.25k
{
2349
1.25k
    switch (cipherType(cipher)) {
2350
0
#if !defined(NO_AES)
2351
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2352
0
        case WC_AES_128_CBC_TYPE:
2353
0
        case WC_AES_192_CBC_TYPE:
2354
0
        case WC_AES_256_CBC_TYPE:
2355
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2356
0
    #endif
2357
0
    #if defined(HAVE_AESGCM)
2358
553
        case WC_AES_128_GCM_TYPE:
2359
686
        case WC_AES_192_GCM_TYPE:
2360
1.12k
        case WC_AES_256_GCM_TYPE:
2361
1.12k
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2362
1.12k
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2363
0
    #endif
2364
0
    #if defined(HAVE_AESCCM)
2365
0
        case WC_AES_128_CCM_TYPE:
2366
0
        case WC_AES_192_CCM_TYPE:
2367
0
        case WC_AES_256_CCM_TYPE:
2368
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2369
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2370
0
    #endif
2371
0
    #if defined(WOLFSSL_AES_COUNTER)
2372
1
        case WC_AES_128_CTR_TYPE:
2373
18
        case WC_AES_192_CTR_TYPE:
2374
20
        case WC_AES_256_CTR_TYPE:
2375
20
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2376
0
    #endif
2377
0
    #if defined(WOLFSSL_AES_CFB)
2378
12
        case WC_AES_128_CFB1_TYPE:
2379
12
        case WC_AES_192_CFB1_TYPE:
2380
16
        case WC_AES_256_CFB1_TYPE:
2381
17
        case WC_AES_128_CFB8_TYPE:
2382
23
        case WC_AES_192_CFB8_TYPE:
2383
31
        case WC_AES_256_CFB8_TYPE:
2384
31
        case WC_AES_128_CFB128_TYPE:
2385
31
        case WC_AES_192_CFB128_TYPE:
2386
31
        case WC_AES_256_CFB128_TYPE:
2387
31
            return WOLFSSL_EVP_CIPH_CFB_MODE;
2388
0
    #endif
2389
0
    #if defined(WOLFSSL_AES_OFB)
2390
24
        case WC_AES_128_OFB_TYPE:
2391
24
        case WC_AES_192_OFB_TYPE:
2392
24
        case WC_AES_256_OFB_TYPE:
2393
24
            return WOLFSSL_EVP_CIPH_OFB_MODE;
2394
0
    #endif
2395
0
    #if defined(WOLFSSL_AES_XTS) && \
2396
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2397
40
        case WC_AES_128_XTS_TYPE:
2398
47
        case WC_AES_256_XTS_TYPE:
2399
47
            return WOLFSSL_EVP_CIPH_XTS_MODE;
2400
0
    #endif
2401
0
        case WC_AES_128_ECB_TYPE:
2402
2
        case WC_AES_192_ECB_TYPE:
2403
2
        case WC_AES_256_ECB_TYPE:
2404
2
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2405
0
#endif /* !NO_AES */
2406
    #if defined(HAVE_ARIA)
2407
        case WC_ARIA_128_GCM_TYPE:
2408
        case WC_ARIA_192_GCM_TYPE:
2409
        case WC_ARIA_256_GCM_TYPE:
2410
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2411
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2412
    #endif
2413
0
    #ifndef NO_DES3
2414
1
        case WC_DES_CBC_TYPE:
2415
4
        case WC_DES_EDE3_CBC_TYPE:
2416
4
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2417
0
        case WC_DES_ECB_TYPE:
2418
0
        case WC_DES_EDE3_ECB_TYPE:
2419
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2420
0
    #endif
2421
0
    #ifndef NO_RC4
2422
0
        case WC_ARC4_TYPE:
2423
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2424
0
    #endif
2425
0
    #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2426
0
        case WC_CHACHA20_POLY1305_TYPE:
2427
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER |
2428
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2429
0
    #endif
2430
0
    #ifdef HAVE_CHACHA
2431
0
        case WC_CHACHA20_TYPE:
2432
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2433
0
    #endif
2434
0
    #ifdef WOLFSSL_SM4_ECB
2435
0
        case WC_SM4_ECB_TYPE:
2436
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2437
0
    #endif
2438
0
    #ifdef WOLFSSL_SM4_CBC
2439
0
        case WC_SM4_CBC_TYPE:
2440
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2441
0
    #endif
2442
0
    #ifdef WOLFSSL_SM4_CTR
2443
0
        case WC_SM4_CTR_TYPE:
2444
0
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2445
0
    #endif
2446
0
    #ifdef WOLFSSL_SM4_GCM
2447
0
        case WC_SM4_GCM_TYPE:
2448
0
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2449
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2450
0
    #endif
2451
0
    #ifdef WOLFSSL_SM4_CCM
2452
0
        case WC_SM4_CCM_TYPE:
2453
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2454
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2455
0
    #endif
2456
0
        default:
2457
0
            return 0;
2458
1.25k
    }
2459
1.25k
}
2460
2461
unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2462
0
{
2463
0
    if (cipher == NULL)
2464
0
        return 0;
2465
0
    return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE;
2466
0
}
2467
2468
void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2469
0
{
2470
0
    if (ctx != NULL) {
2471
0
        ctx->flags |= (unsigned long)flags;
2472
0
    }
2473
0
}
2474
2475
void wolfSSL_EVP_CIPHER_CTX_clear_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2476
0
{
2477
0
    if (ctx != NULL) {
2478
0
        ctx->flags &= (unsigned long)~flags;
2479
0
    }
2480
0
}
2481
2482
unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher)
2483
1.25k
{
2484
1.25k
    if (cipher == NULL)
2485
0
        return 0;
2486
1.25k
    return WOLFSSL_CIPHER_mode(cipher);
2487
1.25k
}
2488
2489
int  wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx,
2490
    int padding)
2491
562
{
2492
562
    if (ctx == NULL)
2493
0
        return WOLFSSL_FAILURE;
2494
562
    if (padding) {
2495
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_NO_PADDING;
2496
0
    }
2497
562
    else {
2498
562
        ctx->flags |=  WOLFSSL_EVP_CIPH_NO_PADDING;
2499
562
    }
2500
562
    return 1;
2501
562
}
2502
2503
int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest)
2504
0
{
2505
    /* nothing to do */
2506
0
    if (digest == NULL)
2507
0
        return WOLFSSL_FAILURE;
2508
0
    return WOLFSSL_SUCCESS;
2509
0
}
2510
2511
2512
/* Frees the WOLFSSL_EVP_PKEY_CTX passed in.
2513
 *
2514
 * return WOLFSSL_SUCCESS on success
2515
 */
2516
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2517
void wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2518
#else
2519
int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2520
#endif
2521
1.35k
{
2522
1.35k
    if (ctx == NULL)
2523
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2524
        return;
2525
#else
2526
116
        return 0;
2527
1.23k
#endif
2528
1.23k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_free");
2529
1.23k
    if (ctx->pkey != NULL)
2530
1.23k
        wolfSSL_EVP_PKEY_free(ctx->pkey);
2531
1.23k
    if (ctx->peerKey != NULL)
2532
0
        wolfSSL_EVP_PKEY_free(ctx->peerKey);
2533
1.23k
    XFREE(ctx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
2534
1.23k
#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
2535
1.23k
    return WOLFSSL_SUCCESS;
2536
1.35k
#endif
2537
1.35k
}
2538
2539
2540
/* Creates a new WOLFSSL_EVP_PKEY_CTX structure.
2541
 *
2542
 * pkey  key structure to use with new WOLFSSL_EVP_PKEY_CTX
2543
 * e     engine to use. It should be NULL at this time.
2544
 *
2545
 * return the new structure on success and NULL if failed.
2546
 */
2547
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_ENGINE *e)
2548
1.23k
{
2549
1.23k
    WOLFSSL_EVP_PKEY_CTX* ctx;
2550
2551
1.23k
    if (pkey == NULL) return 0;
2552
1.23k
    if (e != NULL) return 0;
2553
1.23k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new");
2554
2555
1.23k
    ctx = (WOLFSSL_EVP_PKEY_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY_CTX), NULL,
2556
1.23k
            DYNAMIC_TYPE_PUBLIC_KEY);
2557
1.23k
    if (ctx == NULL) return NULL;
2558
1.23k
    XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_PKEY_CTX));
2559
1.23k
    ctx->pkey = pkey;
2560
1.23k
#ifndef NO_RSA
2561
1.23k
    ctx->padding = WC_RSA_PKCS1_PADDING;
2562
1.23k
    ctx->md = NULL;
2563
1.23k
    ctx->mgf1_md = NULL;
2564
1.23k
    ctx->saltlen = 0;
2565
1.23k
#endif
2566
1.23k
#ifdef HAVE_ECC
2567
1.23k
    if (pkey->ecc && pkey->ecc->group) {
2568
        /* set curve NID from pkey if available */
2569
0
        ctx->curveNID = pkey->ecc->group->curve_nid;
2570
0
    }
2571
1.23k
    else {
2572
1.23k
        ctx->curveNID = ECC_CURVE_DEF;
2573
1.23k
    }
2574
1.23k
#endif
2575
1.23k
    if (wolfSSL_EVP_PKEY_up_ref(pkey) != WOLFSSL_SUCCESS) {
2576
0
        WOLFSSL_MSG("Couldn't increase key reference count");
2577
0
    }
2578
1.23k
    return ctx;
2579
1.23k
}
2580
2581
2582
/* Sets the type of RSA padding to use.
2583
 *
2584
 * ctx     structure to set padding in.
2585
 * padding RSA padding type
2586
 *
2587
 * returns WOLFSSL_SUCCESS on success.
2588
 */
2589
int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, int padding)
2590
0
{
2591
0
    if (ctx == NULL) return 0;
2592
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_padding");
2593
0
    ctx->padding = padding;
2594
0
    return WOLFSSL_SUCCESS;
2595
0
}
2596
2597
/* Sets the message digest type for RSA padding to use.
2598
 *
2599
 * ctx  structure to set padding in.
2600
 * md   Message digest
2601
 *
2602
 * returns WOLFSSL_SUCCESS on success.
2603
 */
2604
int wolfSSL_EVP_PKEY_CTX_set_signature_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2605
    const WOLFSSL_EVP_MD* md)
2606
0
{
2607
0
    if (ctx == NULL) return 0;
2608
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_signature_md");
2609
0
#ifndef NO_RSA
2610
0
    ctx->md = md;
2611
#else
2612
    (void)md;
2613
#endif
2614
0
    return WOLFSSL_SUCCESS;
2615
0
}
2616
2617
int wolfSSL_EVP_PKEY_CTX_set_rsa_oaep_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2618
    const WOLFSSL_EVP_MD *md)
2619
0
{
2620
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_OAEP_PADDING);
2621
0
    return wolfSSL_EVP_PKEY_CTX_set_signature_md(ctx, md);
2622
0
}
2623
2624
int wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen(WOLFSSL_EVP_PKEY_CTX *ctx,
2625
                                             int saltlen)
2626
0
{
2627
0
    if (ctx == NULL) return 0;
2628
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen");
2629
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_PSS_PADDING);
2630
0
#ifndef NO_RSA
2631
0
    ctx->saltlen = saltlen;
2632
#else
2633
    (void)saltlen;
2634
#endif
2635
0
    return WOLFSSL_SUCCESS;
2636
0
}
2637
2638
int wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2639
                                         const WOLFSSL_EVP_MD *md)
2640
0
{
2641
0
    if (ctx == NULL) return 0;
2642
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md");
2643
0
#ifndef NO_RSA
2644
    /* Hash digest algorithm used with Mask Generation Function 1 (MGF1) for
2645
     * RSA-PSS and RSA-OAEP. */
2646
0
    ctx->mgf1_md = md;
2647
#else
2648
    (void)md;
2649
#endif
2650
0
    return WOLFSSL_SUCCESS;
2651
0
}
2652
2653
/* create a PKEY context and return it */
2654
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new_id(int id, WOLFSSL_ENGINE *e)
2655
754
{
2656
754
    WOLFSSL_EVP_PKEY* pkey;
2657
754
    WOLFSSL_EVP_PKEY_CTX* ctx = NULL;
2658
2659
754
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new_id");
2660
2661
754
    pkey = wolfSSL_EVP_PKEY_new_ex(NULL);
2662
754
    if (pkey) {
2663
754
        pkey->type = id;
2664
754
        ctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
2665
        /* wolfSSL_EVP_PKEY_CTX_new calls wolfSSL_EVP_PKEY_up_ref so we need
2666
         * to always call wolfSSL_EVP_PKEY_free (either to free it if an
2667
         * error occurred in the previous function or to decrease the reference
2668
         * count so that pkey is actually free'd when wolfSSL_EVP_PKEY_CTX_free
2669
         * is called) */
2670
754
        wolfSSL_EVP_PKEY_free(pkey);
2671
754
    }
2672
754
    return ctx;
2673
754
}
2674
2675
/* Returns WOLFSSL_SUCCESS or error */
2676
int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits)
2677
0
{
2678
0
    if (ctx) {
2679
0
        ctx->nbits = bits;
2680
0
    }
2681
0
    return WOLFSSL_SUCCESS;
2682
0
}
2683
2684
2685
int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx)
2686
754
{
2687
754
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_init");
2688
2689
754
    if (!ctx) {
2690
0
        return WOLFSSL_FAILURE;
2691
0
    }
2692
754
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2693
754
    ctx->op = WC_EVP_PKEY_OP_DERIVE;
2694
754
    ctx->padding = 0;
2695
754
    ctx->nbits = 0;
2696
754
    return WOLFSSL_SUCCESS;
2697
754
}
2698
2699
int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer)
2700
0
{
2701
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_set_peer");
2702
2703
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE) {
2704
0
        return WOLFSSL_FAILURE;
2705
0
    }
2706
0
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2707
0
    ctx->peerKey = peer;
2708
0
    if (!wolfSSL_EVP_PKEY_up_ref(peer)) {
2709
0
        ctx->peerKey = NULL;
2710
0
        return WOLFSSL_FAILURE;
2711
0
    }
2712
0
    return WOLFSSL_SUCCESS;
2713
0
}
2714
2715
#ifndef NO_WOLFSSL_STUB
2716
int wolfSSL_EVP_PKEY_CTX_ctrl_str(WOLFSSL_EVP_PKEY_CTX *ctx,
2717
                          const char *name, const char *value)
2718
0
{
2719
0
    WOLFSSL_STUB("wolfSSL_EVP_PKEY_CTX_ctrl_str");
2720
0
    (void)ctx;
2721
0
    (void)name;
2722
0
    (void)value;
2723
0
    return WOLFSSL_FAILURE;
2724
0
}
2725
#endif /* NO_WOLFSSL_STUB */
2726
2727
#if (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || defined(HAVE_ECC) || \
2728
    defined(HAVE_HKDF)
2729
int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
2730
611
{
2731
611
    int len;
2732
611
#ifdef HAVE_HKDF
2733
611
    enum wc_HashType hkdfHashType;
2734
611
#endif
2735
2736
611
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive");
2737
2738
611
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE || !ctx->pkey || (!ctx->peerKey
2739
611
        && ctx->pkey->type != WC_EVP_PKEY_HKDF) || !keylen || (ctx->pkey->type
2740
611
        != WC_EVP_PKEY_HKDF && ctx->pkey->type != ctx->peerKey->type)) {
2741
0
        return WOLFSSL_FAILURE;
2742
0
    }
2743
611
    switch (ctx->pkey->type) {
2744
0
#ifndef NO_DH
2745
0
    case WC_EVP_PKEY_DH:
2746
        /* Use DH */
2747
0
        if (!ctx->pkey->dh || !ctx->peerKey->dh) {
2748
0
            return WOLFSSL_FAILURE;
2749
0
        }
2750
        /* set internal peer key if not done */
2751
0
        if (!ctx->peerKey->dh->inSet) {
2752
0
            if (SetDhInternal(ctx->peerKey->dh) != WOLFSSL_SUCCESS) {
2753
0
                WOLFSSL_MSG("SetDhInternal failed");
2754
0
                return WOLFSSL_FAILURE;
2755
0
            }
2756
0
        }
2757
0
        if (!ctx->peerKey->dh->pub_key) {
2758
0
            WOLFSSL_MSG("SetDhInternal failed, pub_key is NULL");
2759
0
            return WOLFSSL_FAILURE;
2760
0
        }
2761
0
        if ((len = wolfSSL_DH_size(ctx->pkey->dh)) <= 0) {
2762
0
            return WOLFSSL_FAILURE;
2763
0
        }
2764
0
        if (key) {
2765
0
            if (*keylen < (size_t)len) {
2766
0
                return WOLFSSL_FAILURE;
2767
0
            }
2768
            /* computed DH agreement can be less than DH size if leading zeros */
2769
0
            if (wolfSSL_DH_compute_key(key, ctx->peerKey->dh->pub_key,
2770
0
                                       ctx->pkey->dh) <= 0) {
2771
0
                return WOLFSSL_FAILURE;
2772
0
            }
2773
0
        }
2774
0
        *keylen = (size_t)len;
2775
0
        break;
2776
0
#endif
2777
0
#if defined(HAVE_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
2778
0
    case WC_EVP_PKEY_EC:
2779
        /* Use ECDH */
2780
0
        if (!ctx->pkey->ecc || !ctx->peerKey->ecc) {
2781
0
            return WOLFSSL_FAILURE;
2782
0
        }
2783
        /* set internal key if not done */
2784
0
        if (!ctx->pkey->ecc->inSet) {
2785
0
            if (SetECKeyInternal(ctx->pkey->ecc) != WOLFSSL_SUCCESS) {
2786
0
                WOLFSSL_MSG("SetECKeyInternal failed");
2787
0
                return WOLFSSL_FAILURE;
2788
0
            }
2789
0
        }
2790
0
        if (!ctx->peerKey->ecc->exSet || !ctx->peerKey->ecc->pub_key->internal) {
2791
0
            if (SetECKeyExternal(ctx->peerKey->ecc) != WOLFSSL_SUCCESS) {
2792
0
                WOLFSSL_MSG("SetECKeyExternal failed");
2793
0
                return WOLFSSL_FAILURE;
2794
0
            }
2795
0
        }
2796
0
        if (!(len = wc_ecc_size((ecc_key*)ctx->pkey->ecc->internal))) {
2797
0
            return WOLFSSL_FAILURE;
2798
0
        }
2799
0
        if (key) {
2800
0
            word32 len32 = (word32)len;
2801
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2802
0
    && (!defined(HAVE_FIPS) || \
2803
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2804
2805
0
            WC_RNG rng;
2806
0
            if (wc_InitRng(&rng) != MP_OKAY) {
2807
0
                WOLFSSL_MSG("Init RNG failed");
2808
0
                return WOLFSSL_FAILURE;
2809
0
            }
2810
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = &rng;
2811
0
#endif
2812
0
            if (*keylen < len32) {
2813
0
                WOLFSSL_MSG("buffer too short");
2814
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2815
0
    && (!defined(HAVE_FIPS) || \
2816
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2817
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2818
0
                wc_FreeRng(&rng);
2819
0
#endif
2820
0
                return WOLFSSL_FAILURE;
2821
0
            }
2822
0
            if (wc_ecc_shared_secret((ecc_key*)ctx->pkey->ecc->internal,
2823
0
                    (ecc_key*)ctx->peerKey->ecc->internal, key, &len32)
2824
0
                    != MP_OKAY) {
2825
0
                WOLFSSL_MSG("wc_ecc_shared_secret failed");
2826
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2827
0
    && (!defined(HAVE_FIPS) || \
2828
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2829
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2830
0
                wc_FreeRng(&rng);
2831
0
#endif
2832
0
                return WOLFSSL_FAILURE;
2833
0
            }
2834
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2835
0
    && (!defined(HAVE_FIPS) || \
2836
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2837
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2838
0
            wc_FreeRng(&rng);
2839
0
#endif
2840
0
            len = (int)len32;
2841
0
        }
2842
0
        *keylen = (size_t)len;
2843
0
        break;
2844
0
#endif
2845
0
#ifdef HAVE_HKDF
2846
611
    case WC_EVP_PKEY_HKDF:
2847
611
        (void)len;
2848
2849
611
        hkdfHashType = EvpMd2MacType(ctx->pkey->hkdfMd);
2850
611
        if (hkdfHashType == WC_HASH_TYPE_NONE) {
2851
0
            WOLFSSL_MSG("Invalid hash type for HKDF.");
2852
0
            return WOLFSSL_FAILURE;
2853
0
        }
2854
611
        if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) {
2855
611
            if (wc_HKDF((int)hkdfHashType, ctx->pkey->hkdfKey, ctx->pkey->hkdfKeySz,
2856
611
                        ctx->pkey->hkdfSalt, ctx->pkey->hkdfSaltSz,
2857
611
                        ctx->pkey->hkdfInfo, ctx->pkey->hkdfInfoSz, key,
2858
611
                        (word32)*keylen) != 0) {
2859
229
                WOLFSSL_MSG("wc_HKDF failed.");
2860
229
                return WOLFSSL_FAILURE;
2861
229
            }
2862
611
        }
2863
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) {
2864
0
            if (wc_HKDF_Extract((int)hkdfHashType, ctx->pkey->hkdfSalt,
2865
0
                                ctx->pkey->hkdfSaltSz, ctx->pkey->hkdfKey,
2866
0
                                ctx->pkey->hkdfKeySz, key) != 0) {
2867
0
                WOLFSSL_MSG("wc_HKDF_Extract failed.");
2868
0
                return WOLFSSL_FAILURE;
2869
0
            }
2870
0
            else {
2871
0
                int hkdfHashSz = wolfSSL_EVP_MD_size(ctx->pkey->hkdfMd);
2872
0
                if (hkdfHashSz <= 0) {
2873
0
                    WOLFSSL_MSG("Failed to get block size for HKDF hash.");
2874
0
                    return WOLFSSL_FAILURE;
2875
0
                }
2876
                /* Length of extract only is always the length of the hash. */
2877
0
                *keylen = (size_t)hkdfHashSz;
2878
0
            }
2879
0
        }
2880
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
2881
0
            if (wc_HKDF_Expand((int)hkdfHashType, ctx->pkey->hkdfKey,
2882
0
                               ctx->pkey->hkdfKeySz, ctx->pkey->hkdfInfo,
2883
0
                               ctx->pkey->hkdfInfoSz, key,
2884
0
                               (word32)*keylen) != 0) {
2885
0
                WOLFSSL_MSG("wc_HKDF_Expand failed.");
2886
0
                return WOLFSSL_FAILURE;
2887
0
            }
2888
0
        }
2889
0
        else {
2890
0
            WOLFSSL_MSG("Invalid HKDF mode.");
2891
0
            return WOLFSSL_FAILURE;
2892
0
        }
2893
382
        break;
2894
382
#endif /* HAVE_HKDF */
2895
382
    default:
2896
0
        WOLFSSL_MSG("Unknown key type");
2897
0
        return WOLFSSL_FAILURE;
2898
611
    }
2899
382
    return WOLFSSL_SUCCESS;
2900
611
}
2901
#endif /* (!NO_DH && WOLFSSL_DH_EXTRA) || HAVE_ECC || HAVE_HKDF */
2902
2903
#ifdef HAVE_HKDF
2904
int wolfSSL_EVP_PKEY_CTX_set_hkdf_md(WOLFSSL_EVP_PKEY_CTX* ctx,
2905
                                     const WOLFSSL_EVP_MD* md)
2906
754
{
2907
754
    int ret = WOLFSSL_SUCCESS;
2908
2909
754
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_hkdf_md");
2910
2911
754
    if (ctx == NULL || ctx->pkey == NULL || md == NULL) {
2912
0
        WOLFSSL_MSG("Bad argument.");
2913
0
        ret = WOLFSSL_FAILURE;
2914
0
    }
2915
2916
754
    if (ret == WOLFSSL_SUCCESS) {
2917
754
        ctx->pkey->hkdfMd = md;
2918
754
    }
2919
2920
754
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set_hkdf_md", ret);
2921
2922
754
    return ret;
2923
754
}
2924
2925
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt(WOLFSSL_EVP_PKEY_CTX* ctx,
2926
                                        const byte* salt, int saltSz)
2927
611
{
2928
611
    int ret = WOLFSSL_SUCCESS;
2929
2930
611
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt");
2931
2932
611
    if (ctx == NULL || ctx->pkey == NULL || saltSz < 0) {
2933
0
        WOLFSSL_MSG("Bad argument.");
2934
0
        ret = WOLFSSL_FAILURE;
2935
0
    }
2936
611
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2937
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2938
0
        ret = WOLFSSL_FAILURE;
2939
0
    }
2940
2941
611
    if (ret == WOLFSSL_SUCCESS && salt != NULL && saltSz > 0) {
2942
383
        XFREE(ctx->pkey->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
2943
383
        ctx->pkey->hkdfSalt = (byte*)XMALLOC((size_t)saltSz, NULL,
2944
383
            DYNAMIC_TYPE_SALT);
2945
383
        if (ctx->pkey->hkdfSalt == NULL) {
2946
0
            WOLFSSL_MSG("Failed to allocate HKDF salt buffer.");
2947
0
            ret = WOLFSSL_FAILURE;
2948
0
        }
2949
383
        else {
2950
383
            XMEMCPY(ctx->pkey->hkdfSalt, salt, (size_t)saltSz);
2951
383
            ctx->pkey->hkdfSaltSz = (word32)saltSz;
2952
383
        }
2953
383
    }
2954
2955
611
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt", ret);
2956
2957
611
    return ret;
2958
611
}
2959
2960
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_key(WOLFSSL_EVP_PKEY_CTX* ctx,
2961
                                       const byte* key, int keySz)
2962
754
{
2963
754
    int ret = WOLFSSL_SUCCESS;
2964
2965
754
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key");
2966
2967
754
    if (ctx == NULL || ctx->pkey == NULL || key == NULL || keySz <= 0) {
2968
143
        WOLFSSL_MSG("Bad argument.");
2969
143
        ret = WOLFSSL_FAILURE;
2970
143
    }
2971
754
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2972
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2973
0
        ret = WOLFSSL_FAILURE;
2974
0
    }
2975
2976
754
    if (ret == WOLFSSL_SUCCESS) {
2977
611
        XFREE(ctx->pkey->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
2978
611
        ctx->pkey->hkdfKey = (byte*)XMALLOC((size_t)keySz, NULL,
2979
611
            DYNAMIC_TYPE_KEY);
2980
611
        if (ctx->pkey->hkdfKey == NULL) {
2981
0
            WOLFSSL_MSG("Failed to allocate HKDF key buffer.");
2982
0
            ret = WOLFSSL_FAILURE;
2983
0
        }
2984
611
        else {
2985
611
            XMEMCPY(ctx->pkey->hkdfKey, key, (size_t)keySz);
2986
611
            ctx->pkey->hkdfKeySz = (word32)keySz;
2987
611
        }
2988
611
    }
2989
2990
754
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key", ret);
2991
2992
754
    return ret;
2993
754
}
2994
2995
int wolfSSL_EVP_PKEY_CTX_add1_hkdf_info(WOLFSSL_EVP_PKEY_CTX* ctx,
2996
                                        const byte* info, int infoSz)
2997
611
{
2998
611
    int ret = WOLFSSL_SUCCESS;
2999
3000
611
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info");
3001
3002
611
    if (ctx == NULL || ctx->pkey == NULL || infoSz < 0) {
3003
0
        WOLFSSL_MSG("Bad argument.");
3004
0
        ret = WOLFSSL_FAILURE;
3005
0
    }
3006
611
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
3007
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
3008
0
        ret = WOLFSSL_FAILURE;
3009
0
    }
3010
3011
611
    if (ret == WOLFSSL_SUCCESS && info != NULL && infoSz > 0) {
3012
232
        unsigned char* p;
3013
        /* If there's already info in the buffer, append. */
3014
    #ifdef WOLFSSL_NO_REALLOC
3015
        p = (byte*)XMALLOC((size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3016
            DYNAMIC_TYPE_INFO);
3017
        if (p != NULL) {
3018
            XMEMCPY(p, ctx->pkey->hkdfInfo, (size_t)ctx->pkey->hkdfInfoSz);
3019
            XFREE(ctx->pkey->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
3020
            ctx->pkey->hkdfInfo = NULL;
3021
        }
3022
    #else
3023
232
        p = (byte*)XREALLOC(ctx->pkey->hkdfInfo,
3024
232
            (size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3025
232
            DYNAMIC_TYPE_INFO);
3026
232
    #endif
3027
232
        if (p == NULL) {
3028
0
            WOLFSSL_MSG("Failed to reallocate larger HKDF info buffer.");
3029
0
            ret = WOLFSSL_FAILURE;
3030
0
        }
3031
232
        else {
3032
232
            ctx->pkey->hkdfInfo = p;
3033
232
            XMEMCPY(ctx->pkey->hkdfInfo + ctx->pkey->hkdfInfoSz, info,
3034
232
                    (size_t)infoSz);
3035
232
            ctx->pkey->hkdfInfoSz += (word32)infoSz;
3036
232
        }
3037
232
    }
3038
3039
611
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info", ret);
3040
3041
611
    return ret;
3042
611
}
3043
3044
int wolfSSL_EVP_PKEY_CTX_hkdf_mode(WOLFSSL_EVP_PKEY_CTX* ctx, int mode)
3045
0
{
3046
0
    int ret = WOLFSSL_SUCCESS;
3047
3048
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_hkdf_mode");
3049
3050
0
    if (ctx == NULL || ctx->pkey == NULL) {
3051
0
        WOLFSSL_MSG("Bad argument.");
3052
0
        ret = WOLFSSL_FAILURE;
3053
0
    }
3054
3055
0
    if (ret == WOLFSSL_SUCCESS &&
3056
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND &&
3057
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY &&
3058
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY)
3059
0
    {
3060
0
        WOLFSSL_MSG("Invalid HKDF mode.");
3061
0
        ret = WOLFSSL_FAILURE;
3062
0
    }
3063
3064
0
    if (ret == WOLFSSL_SUCCESS) {
3065
0
        ctx->pkey->hkdfMode = mode;
3066
0
    }
3067
3068
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_hkdf_mode", ret);
3069
3070
0
    return ret;
3071
0
}
3072
#endif /* HAVE_HKDF */
3073
3074
/* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer.
3075
 *
3076
 * ctx    EVP_PKEY context of operation.
3077
 * out    Decrypted output buffer. If NULL, puts the maximum output buffer size
3078
          in outLen and returns success.
3079
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3080
 *        the size of out. On output holds the length of actual decryption.
3081
 * in     Encrypted input buffer.
3082
 * inLen  Length of encrypted data.
3083
 *
3084
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3085
 */
3086
int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3087
                     unsigned char *out, size_t *outLen,
3088
                     const unsigned char *in, size_t inLen)
3089
0
{
3090
0
    int len = 0;
3091
3092
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt");
3093
3094
0
    if (ctx == NULL || ctx->pkey == NULL) {
3095
0
        WOLFSSL_MSG("Bad parameter.");
3096
0
        return 0;
3097
0
    }
3098
3099
0
    (void)out;
3100
0
    (void)outLen;
3101
0
    (void)in;
3102
0
    (void)inLen;
3103
0
    (void)len;
3104
3105
0
    switch (ctx->pkey->type) {
3106
0
#if !defined(NO_RSA)
3107
0
    case WC_EVP_PKEY_RSA:
3108
0
        if (out == NULL) {
3109
0
            if (ctx->pkey->rsa == NULL) {
3110
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3111
0
                return WOLFSSL_FAILURE;
3112
0
            }
3113
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3114
0
            if (len <= 0) {
3115
0
                WOLFSSL_MSG("Error getting RSA size.");
3116
0
                return WOLFSSL_FAILURE;
3117
0
            }
3118
0
            if (outLen == NULL) {
3119
0
                WOLFSSL_MSG("outLen is NULL.");
3120
0
                return WOLFSSL_FAILURE;
3121
0
            }
3122
3123
0
            *outLen = (size_t)len;
3124
0
            return WOLFSSL_SUCCESS;
3125
0
        }
3126
3127
0
        len = wolfSSL_RSA_private_decrypt((int)inLen, (unsigned char*)in, out,
3128
0
              ctx->pkey->rsa, ctx->padding);
3129
0
        if (len < 0) break;
3130
0
        else {
3131
0
            *outLen = (size_t)len;
3132
0
            return WOLFSSL_SUCCESS;
3133
0
        }
3134
0
#endif /* NO_RSA */
3135
3136
0
    case WC_EVP_PKEY_EC:
3137
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented.");
3138
0
        FALL_THROUGH;
3139
0
    default:
3140
0
        break;
3141
0
    }
3142
3143
0
    return WOLFSSL_FAILURE;
3144
0
}
3145
3146
3147
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure for decryption
3148
 *
3149
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with decryption
3150
 *
3151
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3152
 */
3153
int wolfSSL_EVP_PKEY_decrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3154
0
{
3155
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
3156
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt_init");
3157
0
    switch (ctx->pkey->type) {
3158
0
    case WC_EVP_PKEY_RSA:
3159
0
        ctx->op = WC_EVP_PKEY_OP_DECRYPT;
3160
0
        return WOLFSSL_SUCCESS;
3161
0
    case WC_EVP_PKEY_EC:
3162
0
        WOLFSSL_MSG("not implemented");
3163
0
        FALL_THROUGH;
3164
0
    default:
3165
0
        break;
3166
0
    }
3167
0
    return WOLFSSL_FAILURE;
3168
0
}
3169
3170
3171
/* Uses the WOLFSSL_EVP_PKEY_CTX to encrypt a buffer.
3172
 *
3173
 * ctx    EVP_PKEY context of operation.
3174
 * out    Encrypted output buffer. If NULL, puts the maximum output buffer size
3175
 *        in outlen and returns success.
3176
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3177
 *        the size of out. On output holds the length of actual encryption.
3178
 * in     Plaintext input buffer.
3179
 * inLen  Length of plaintext.
3180
 *
3181
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3182
 */
3183
int wolfSSL_EVP_PKEY_encrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3184
                     unsigned char *out, size_t *outLen,
3185
                     const unsigned char *in, size_t inLen)
3186
0
{
3187
0
    int len = 0;
3188
3189
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt");
3190
3191
0
    if (ctx == NULL || ctx->pkey == NULL) {
3192
0
        WOLFSSL_MSG("Bad parameter.");
3193
0
        return 0;
3194
0
    }
3195
3196
0
    if (ctx->op != WC_EVP_PKEY_OP_ENCRYPT) {
3197
0
        WOLFSSL_MSG("ctx->op must be set to WC_EVP_PKEY_OP_ENCRYPT. Use "
3198
0
            "wolfSSL_EVP_PKEY_encrypt_init.");
3199
0
        return WOLFSSL_FAILURE;
3200
0
    }
3201
3202
0
    (void)out;
3203
0
    (void)outLen;
3204
0
    (void)in;
3205
0
    (void)inLen;
3206
0
    (void)len;
3207
3208
0
    switch (ctx->pkey->type) {
3209
0
#if !defined(NO_RSA)
3210
0
    case WC_EVP_PKEY_RSA:
3211
0
        if (out == NULL) {
3212
0
            if (ctx->pkey->rsa == NULL) {
3213
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3214
0
                return WOLFSSL_FAILURE;
3215
0
            }
3216
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3217
0
            if (len <= 0) {
3218
0
                WOLFSSL_MSG("Error getting RSA size.");
3219
0
                return WOLFSSL_FAILURE;
3220
0
            }
3221
0
            if (outLen == NULL) {
3222
0
                WOLFSSL_MSG("outLen is NULL.");
3223
0
                return WOLFSSL_FAILURE;
3224
0
            }
3225
3226
0
            *outLen = (size_t)len;
3227
0
            return WOLFSSL_SUCCESS;
3228
0
        }
3229
3230
0
        len = wolfSSL_RSA_public_encrypt((int)inLen, (unsigned char *)in, out,
3231
0
                  ctx->pkey->rsa, ctx->padding);
3232
0
        if (len < 0)
3233
0
            break;
3234
0
        else {
3235
0
            *outLen = (size_t)len;
3236
0
            return WOLFSSL_SUCCESS;
3237
0
        }
3238
0
#endif /* NO_RSA */
3239
3240
0
    case WC_EVP_PKEY_EC:
3241
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented");
3242
0
        FALL_THROUGH;
3243
0
    default:
3244
0
        break;
3245
0
    }
3246
3247
0
    return WOLFSSL_FAILURE;
3248
0
}
3249
3250
3251
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure to encrypt data
3252
 *
3253
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with encryption
3254
 *
3255
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3256
 */
3257
int wolfSSL_EVP_PKEY_encrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3258
0
{
3259
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
3260
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt_init");
3261
3262
0
    switch (ctx->pkey->type) {
3263
0
    case WC_EVP_PKEY_RSA:
3264
0
        ctx->op = WC_EVP_PKEY_OP_ENCRYPT;
3265
0
        return WOLFSSL_SUCCESS;
3266
0
    case WC_EVP_PKEY_EC:
3267
0
        WOLFSSL_MSG("not implemented");
3268
0
        FALL_THROUGH;
3269
0
    default:
3270
0
        break;
3271
0
    }
3272
0
    return WOLFSSL_FAILURE;
3273
0
}
3274
/******************************************************************************
3275
* wolfSSL_EVP_PKEY_sign_init -  initializes a public key algorithm context for
3276
* a signing operation.
3277
*
3278
* RETURNS:
3279
* returns WOLFSSL_SUCCESS on success, otherwise returns -2
3280
*/
3281
int wolfSSL_EVP_PKEY_sign_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3282
0
{
3283
0
    int ret = -2;
3284
3285
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign_init");
3286
0
    if (!ctx  || !ctx->pkey)
3287
0
        return ret;
3288
3289
0
    switch (ctx->pkey->type) {
3290
0
#if !defined(NO_RSA)
3291
0
        case WC_EVP_PKEY_RSA:
3292
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3293
0
            ret = WOLFSSL_SUCCESS;
3294
0
            break;
3295
0
#endif /* NO_RSA */
3296
3297
#ifndef NO_DSA
3298
        case WC_EVP_PKEY_DSA:
3299
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3300
            ret = WOLFSSL_SUCCESS;
3301
            break;
3302
#endif /* NO_DSA */
3303
3304
0
#ifdef HAVE_ECC
3305
0
        case WC_EVP_PKEY_EC:
3306
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3307
0
            ret = WOLFSSL_SUCCESS;
3308
0
            break;
3309
0
#endif /* HAVE_ECC */
3310
3311
0
        default:
3312
0
            ret = -2;
3313
0
    }
3314
0
    return ret;
3315
0
}
3316
/******************************************************************************
3317
* wolfSSL_EVP_PKEY_sign - performs a public key signing operation using ctx
3318
* The data to be signed should be hashed since the function does not hash the data.
3319
*
3320
* RETURNS:
3321
* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
3322
*/
3323
3324
int wolfSSL_EVP_PKEY_sign(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *sig,
3325
                        size_t *siglen, const unsigned char *tbs, size_t tbslen)
3326
0
{
3327
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign");
3328
3329
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_SIGN || !ctx->pkey || !siglen)
3330
0
        return WOLFSSL_FAILURE;
3331
3332
0
    (void)sig;
3333
0
    (void)siglen;
3334
0
    (void)tbs;
3335
0
    (void)tbslen;
3336
3337
0
    switch (ctx->pkey->type) {
3338
0
#ifndef NO_RSA
3339
0
    case WC_EVP_PKEY_RSA: {
3340
0
        unsigned int usiglen = (unsigned int)*siglen;
3341
0
        if (!sig) {
3342
0
            int len;
3343
0
            if (!ctx->pkey->rsa)
3344
0
                return WOLFSSL_FAILURE;
3345
0
            len = wc_RsaEncryptSize((RsaKey*)ctx->pkey->rsa->internal);
3346
0
            if (len < 0)
3347
0
                return WOLFSSL_FAILURE;
3348
0
            *siglen = (size_t)len;
3349
0
            return WOLFSSL_SUCCESS;
3350
0
        }
3351
3352
0
        if (wolfSSL_RSA_sign_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3353
0
            (unsigned int)tbslen, sig, &usiglen, ctx->pkey->rsa, 1,
3354
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen
3355
0
        ) != WOLFSSL_SUCCESS) {
3356
0
            return WOLFSSL_FAILURE;
3357
0
        }
3358
0
        *siglen = (size_t)usiglen;
3359
0
        return WOLFSSL_SUCCESS;
3360
0
    }
3361
0
#endif /* !NO_RSA */
3362
3363
#ifndef NO_DSA
3364
    case WC_EVP_PKEY_DSA: {
3365
        int bytes;
3366
        int ret;
3367
        if (!ctx->pkey->dsa)
3368
            return WOLFSSL_FAILURE;
3369
        bytes = wolfSSL_BN_num_bytes(ctx->pkey->dsa->q);
3370
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3371
            return WOLFSSL_FAILURE;
3372
        bytes *= 2;
3373
        if (!sig) {
3374
            *siglen = (size_t)bytes;
3375
            return WOLFSSL_SUCCESS;
3376
        }
3377
        if ((int)*siglen < bytes)
3378
            return WOLFSSL_FAILURE;
3379
        ret = wolfSSL_DSA_do_sign(tbs, sig, ctx->pkey->dsa);
3380
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
3381
        if (ret != WOLFSSL_SUCCESS)
3382
            return ret;
3383
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3384
            return WOLFSSL_FAILURE;
3385
        *siglen = (size_t)bytes;
3386
        return WOLFSSL_SUCCESS;
3387
    }
3388
#endif /* NO_DSA */
3389
3390
0
#ifdef HAVE_ECC
3391
0
    case WC_EVP_PKEY_EC: {
3392
0
        int ret;
3393
0
        WOLFSSL_ECDSA_SIG *ecdsaSig;
3394
0
        if (!sig) {
3395
0
            WOLFSSL_EC_KEY *key = ctx->pkey->ecc;
3396
0
            ecc_key* eckey;
3397
0
            if (!key)
3398
0
                return WOLFSSL_FAILURE;
3399
            /* set internal key if not done */
3400
0
            if (key->inSet == 0 && SetECKeyInternal(key) != WOLFSSL_SUCCESS)
3401
0
                return WOLFSSL_FAILURE;
3402
0
            eckey = (ecc_key*)ctx->pkey->ecc->internal;
3403
0
            if (!eckey)
3404
0
                return WOLFSSL_FAILURE;
3405
0
            ret = wc_ecc_sig_size(eckey);
3406
0
            if (ret == 0)
3407
0
                return WOLFSSL_FAILURE;
3408
0
            *siglen = (size_t)ret;
3409
0
            return WOLFSSL_SUCCESS;
3410
0
        }
3411
0
        ecdsaSig = wolfSSL_ECDSA_do_sign(tbs, (int)tbslen, ctx->pkey->ecc);
3412
0
        if (ecdsaSig == NULL)
3413
0
            return WOLFSSL_FAILURE;
3414
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
3415
0
        if (ret == 0 || ret > (int)*siglen) {
3416
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
3417
0
            return WOLFSSL_FAILURE;
3418
0
        }
3419
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
3420
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3421
0
        if (ret == 0)
3422
0
            return WOLFSSL_FAILURE;
3423
0
        *siglen = (size_t)ret;
3424
0
        return WOLFSSL_SUCCESS;
3425
0
    }
3426
0
#endif /* HAVE_ECC */
3427
3428
0
    default:
3429
0
        break;
3430
0
    }
3431
0
    return WOLFSSL_FAILURE;
3432
0
}
3433
3434
/******************************************************************************
3435
* wolfSSL_EVP_PKEY_verify_init - initializes a public key algorithm context for
3436
* a verification operation.
3437
*
3438
* RETURNS:
3439
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3440
* a return value of -2 indicates the operation is not supported by the public
3441
* key algorithm.
3442
*/
3443
3444
int wolfSSL_EVP_PKEY_verify_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3445
0
{
3446
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify_init");
3447
3448
0
    if (!ctx || !ctx->pkey)
3449
0
        return WOLFSSL_FAILURE;
3450
3451
0
    switch (ctx->pkey->type) {
3452
0
#if !defined(NO_RSA)
3453
0
        case WC_EVP_PKEY_RSA:
3454
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3455
0
            return WOLFSSL_SUCCESS;
3456
0
#endif /* NO_RSA */
3457
3458
#ifndef NO_DSA
3459
        case WC_EVP_PKEY_DSA:
3460
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3461
            return WOLFSSL_SUCCESS;
3462
#endif /* NO_DSA */
3463
3464
0
#ifdef HAVE_ECC
3465
0
        case WC_EVP_PKEY_EC:
3466
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3467
0
            return WOLFSSL_SUCCESS;
3468
0
#endif /* HAVE_ECC */
3469
3470
0
        default:
3471
0
            return -2;
3472
0
    }
3473
0
}
3474
3475
/******************************************************************************
3476
* wolfSSL_EVP_PKEY_verify - verifies a signature using ctx
3477
*
3478
* RETURNS:
3479
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3480
* a return value of -2 indicates the operation is not supported by the public
3481
* key algorithm.
3482
*/
3483
3484
int wolfSSL_EVP_PKEY_verify(WOLFSSL_EVP_PKEY_CTX *ctx, const unsigned char *sig,
3485
                            size_t siglen, const unsigned char *tbs,
3486
                            size_t tbslen)
3487
0
{
3488
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify");
3489
3490
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_VERIFY || !ctx->pkey)
3491
0
        return WOLFSSL_FAILURE;
3492
3493
0
    switch (ctx->pkey->type) {
3494
0
#ifndef NO_RSA
3495
0
    case WC_EVP_PKEY_RSA:
3496
0
        return wolfSSL_RSA_verify_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3497
0
            (unsigned int)tbslen, sig, (unsigned int)siglen, ctx->pkey->rsa,
3498
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen);
3499
0
#endif /* !NO_RSA */
3500
3501
#ifndef NO_DSA
3502
     case WC_EVP_PKEY_DSA: {
3503
        int dsacheck = 0;
3504
        if (wolfSSL_DSA_do_verify(tbs, (unsigned char *)sig, ctx->pkey->dsa,
3505
            &dsacheck) != WOLFSSL_SUCCESS || dsacheck != 1)
3506
            return WOLFSSL_FAILURE;
3507
        return WOLFSSL_SUCCESS;
3508
     }
3509
#endif /* NO_DSA */
3510
3511
0
#ifdef HAVE_ECC
3512
0
    case WC_EVP_PKEY_EC: {
3513
0
        int ret;
3514
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
3515
0
            NULL, (const unsigned char **)&sig, (long)siglen);
3516
0
        if (ecdsaSig == NULL)
3517
0
            return WOLFSSL_FAILURE;
3518
0
        ret = wolfSSL_ECDSA_do_verify(tbs, (int)tbslen, ecdsaSig,
3519
0
            ctx->pkey->ecc);
3520
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3521
0
        return ret;
3522
0
    }
3523
0
#endif /* HAVE_ECC */
3524
3525
0
    default:
3526
0
        return -2;
3527
0
    }
3528
0
}
3529
3530
/* Get the size in bits for WOLFSSL_EVP_PKEY key
3531
 *
3532
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3533
 *
3534
 * returns the size in bits of key on success
3535
 */
3536
int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey)
3537
0
{
3538
0
    int ret = 0;
3539
3540
0
    if (pkey == NULL)
3541
0
        return 0;
3542
3543
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
3544
3545
0
    switch (pkey->type) {
3546
0
#ifndef NO_RSA
3547
0
    case WC_EVP_PKEY_RSA:
3548
0
        ret = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3549
0
        break;
3550
0
#endif /* !NO_RSA */
3551
3552
#ifndef NO_DSA
3553
    case WC_EVP_PKEY_DSA:
3554
        if (pkey->dsa == NULL ||
3555
                (!pkey->dsa->exSet &&
3556
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3557
            break;
3558
        ret = wolfSSL_BN_num_bytes(pkey->dsa->p);
3559
        break;
3560
#endif
3561
3562
0
#ifdef HAVE_ECC
3563
0
    case WC_EVP_PKEY_EC:
3564
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3565
0
            WOLFSSL_MSG("No ECC key has been set");
3566
0
            break;
3567
0
        }
3568
0
        ret = wc_ecc_size((ecc_key*)(pkey->ecc->internal));
3569
0
        break;
3570
0
#endif /* HAVE_ECC */
3571
3572
0
    default:
3573
0
        break;
3574
0
    }
3575
0
    return ret > 0 ? ret * 8 : 0;
3576
0
}
3577
3578
3579
int wolfSSL_EVP_PKEY_paramgen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3580
0
{
3581
0
    (void)ctx;
3582
0
    return WOLFSSL_SUCCESS;
3583
0
}
3584
3585
int wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(WOLFSSL_EVP_PKEY_CTX *ctx,
3586
        int nid)
3587
0
{
3588
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid");
3589
0
#ifdef HAVE_ECC
3590
0
    if (ctx != NULL && ctx->pkey != NULL && ctx->pkey->type == WC_EVP_PKEY_EC) {
3591
0
        ctx->curveNID = nid;
3592
0
        return WOLFSSL_SUCCESS;
3593
0
    }
3594
0
    else
3595
0
#endif
3596
0
    {
3597
#ifndef HAVE_ECC
3598
        (void)ctx;
3599
        (void)nid;
3600
        WOLFSSL_MSG("Support not compiled in");
3601
#else
3602
0
        WOLFSSL_MSG("Bad parameter");
3603
0
#endif
3604
0
        return WOLFSSL_FAILURE;
3605
0
    }
3606
0
}
3607
3608
int wolfSSL_EVP_PKEY_paramgen(WOLFSSL_EVP_PKEY_CTX* ctx,
3609
                              WOLFSSL_EVP_PKEY** pkey)
3610
0
{
3611
0
    int ret = WOLFSSL_SUCCESS;
3612
0
    int ownPkey = 0;
3613
3614
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_paramgen");
3615
3616
0
    if (ctx == NULL || pkey == NULL) {
3617
0
        WOLFSSL_MSG("Bad parameter");
3618
0
        ret = WOLFSSL_FAILURE;
3619
0
    }
3620
3621
0
    if (ret == WOLFSSL_SUCCESS && *pkey == NULL) {
3622
        /* Only ECC is supported currently. */
3623
0
        if (ctx->pkey == NULL || ctx->pkey->type != WC_EVP_PKEY_EC) {
3624
0
            WOLFSSL_MSG("Key not set or key type not supported.");
3625
0
            ret = WOLFSSL_FAILURE;
3626
0
        }
3627
0
        else {
3628
0
            *pkey = wolfSSL_EVP_PKEY_new();
3629
0
            if (*pkey == NULL) {
3630
0
                WOLFSSL_MSG("Failed to create WOLFSSL_EVP_PKEY.");
3631
0
                ret = WOLFSSL_FAILURE;
3632
0
            }
3633
0
            else {
3634
0
                (*pkey)->type = ctx->pkey->type;
3635
0
                ownPkey = 1;
3636
0
            }
3637
0
        }
3638
0
    }
3639
0
    if (ret == WOLFSSL_SUCCESS) {
3640
0
        switch ((*pkey)->type) {
3641
0
        #ifdef HAVE_ECC
3642
            /* For ECC parameter generation we just need to set the group, which
3643
             * wolfSSL_EC_KEY_new_by_curve_name will do. */
3644
0
            case WC_EVP_PKEY_EC:
3645
0
                (*pkey)->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3646
0
                if ((*pkey)->ecc == NULL) {
3647
0
                    WOLFSSL_MSG("Failed to create WOLFSSL_EC_KEY.");
3648
0
                    ret = WOLFSSL_FAILURE;
3649
0
                }
3650
0
                else {
3651
0
                    (*pkey)->ownEcc = 1;
3652
0
                }
3653
0
                break;
3654
0
        #endif
3655
0
            default:
3656
0
                ret = WOLFSSL_FAILURE;
3657
0
                break;
3658
0
        }
3659
0
    }
3660
3661
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3662
0
        wolfSSL_EVP_PKEY_free(*pkey);
3663
0
        *pkey = NULL;
3664
0
    }
3665
3666
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_paramgen", ret);
3667
3668
0
    return ret;
3669
0
}
3670
3671
/* wolfSSL only supports writing out named curves so no need to store the flag.
3672
 * In short, it is preferred to write out the name of the curve chosen instead
3673
 * of the explicit parameters.
3674
 * The difference is nicely explained and illustrated in section
3675
 * "ECDH and Named Curves" of
3676
 * https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman */
3677
int wolfSSL_EVP_PKEY_CTX_set_ec_param_enc(WOLFSSL_EVP_PKEY_CTX *ctx,
3678
        int flag)
3679
0
{
3680
0
    (void)ctx;
3681
0
    (void)flag;
3682
0
    return WOLFSSL_SUCCESS;
3683
0
}
3684
3685
int wolfSSL_EVP_PKEY_keygen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3686
0
{
3687
0
    (void)ctx;
3688
0
    return WOLFSSL_SUCCESS;
3689
0
}
3690
3691
int wolfSSL_EVP_PKEY_keygen(WOLFSSL_EVP_PKEY_CTX *ctx,
3692
  WOLFSSL_EVP_PKEY **ppkey)
3693
0
{
3694
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
3695
0
    int ownPkey = 0;
3696
0
    WOLFSSL_EVP_PKEY* pkey;
3697
3698
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_keygen");
3699
3700
0
    if (ctx == NULL || ppkey == NULL) {
3701
0
        return WOLFSSL_FAILURE;
3702
0
    }
3703
3704
0
    pkey = *ppkey;
3705
0
    if (pkey == NULL) {
3706
0
        if (ctx->pkey == NULL ||
3707
0
                (ctx->pkey->type != WC_EVP_PKEY_EC &&
3708
0
                 ctx->pkey->type != WC_EVP_PKEY_RSA &&
3709
0
                 ctx->pkey->type != WC_EVP_PKEY_DH)) {
3710
0
            WOLFSSL_MSG("Key not set or key type not supported");
3711
0
            return WOLFSSL_FAILURE;
3712
0
        }
3713
0
        pkey = wolfSSL_EVP_PKEY_new();
3714
0
        if (pkey == NULL) {
3715
0
            return MEMORY_E;
3716
0
        }
3717
0
        ownPkey = 1;
3718
0
        pkey->type = ctx->pkey->type;
3719
0
    }
3720
3721
0
    switch (pkey->type) {
3722
0
#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
3723
0
        case WC_EVP_PKEY_RSA:
3724
0
            pkey->rsa = wolfSSL_RSA_generate_key(ctx->nbits, WC_RSA_EXPONENT,
3725
0
                NULL, NULL);
3726
0
            if (pkey->rsa) {
3727
0
                pkey->ownRsa = 1;
3728
0
                pkey->pkey_sz = wolfSSL_i2d_RSAPrivateKey(pkey->rsa,
3729
0
                        (unsigned char**)&pkey->pkey.ptr);
3730
0
                ret = WOLFSSL_SUCCESS;
3731
0
            }
3732
0
            break;
3733
0
#endif
3734
0
#ifdef HAVE_ECC
3735
0
        case WC_EVP_PKEY_EC:
3736
            /* pkey->ecc may not be NULL, if, for example, it was populated by a
3737
             * prior call to wolfSSL_EVP_PKEY_paramgen. */
3738
0
            if (pkey->ecc == NULL) {
3739
0
                pkey->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3740
0
            }
3741
0
            if (pkey->ecc) {
3742
0
                ret = wolfSSL_EC_KEY_generate_key(pkey->ecc);
3743
0
                if (ret == WOLFSSL_SUCCESS) {
3744
0
                    pkey->ownEcc = 1;
3745
0
                }
3746
0
            }
3747
0
            break;
3748
0
#endif
3749
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
3750
0
        case WC_EVP_PKEY_DH:
3751
0
            pkey->dh = wolfSSL_DH_new();
3752
0
            if (pkey->dh) {
3753
0
                pkey->ownDh = 1;
3754
                /* load DH params from CTX */
3755
0
                ret = wolfSSL_DH_LoadDer(pkey->dh,
3756
0
                        (const unsigned char*)ctx->pkey->pkey.ptr,
3757
0
                        ctx->pkey->pkey_sz);
3758
0
                if (ret == WOLFSSL_SUCCESS) {
3759
0
                    ret = wolfSSL_DH_generate_key(pkey->dh);
3760
0
                }
3761
0
                if (ret == WOLFSSL_SUCCESS) {
3762
                    /* copy private/public key from external to internal */
3763
0
                    ret = SetDhInternal(pkey->dh);
3764
0
                }
3765
0
            }
3766
0
            break;
3767
0
#endif
3768
0
        default:
3769
0
            break;
3770
0
    }
3771
3772
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3773
0
        wolfSSL_EVP_PKEY_free(pkey);
3774
0
        pkey = NULL;
3775
0
    }
3776
3777
0
    *ppkey = pkey;
3778
3779
0
    return ret;
3780
0
}
3781
3782
/* Get the maximum suitable size for the operations that can be done with pkey
3783
 *
3784
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3785
 *
3786
 * returns the recommended size of buffers
3787
 */
3788
int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
3789
0
{
3790
0
    if (pkey == NULL) return 0;
3791
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_size");
3792
3793
0
    switch (pkey->type) {
3794
0
#ifndef NO_RSA
3795
0
    case WC_EVP_PKEY_RSA:
3796
0
        return (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3797
0
#endif /* !NO_RSA */
3798
3799
#ifndef NO_DSA
3800
    case WC_EVP_PKEY_DSA:
3801
        if (pkey->dsa == NULL ||
3802
                (!pkey->dsa->exSet &&
3803
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3804
            return WOLFSSL_FAILURE;
3805
        return wolfSSL_BN_num_bytes(pkey->dsa->p);
3806
#endif
3807
3808
0
#ifdef HAVE_ECC
3809
0
    case WC_EVP_PKEY_EC:
3810
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3811
0
            WOLFSSL_MSG("No ECC key has been set");
3812
0
            break;
3813
0
        }
3814
0
        return wc_ecc_sig_size((ecc_key*)(pkey->ecc->internal));
3815
0
#endif /* HAVE_ECC */
3816
3817
0
    default:
3818
0
        break;
3819
0
    }
3820
0
    return 0;
3821
0
}
3822
3823
3824
int wolfSSL_EVP_PKEY_copy_parameters(WOLFSSL_EVP_PKEY *to,
3825
        const WOLFSSL_EVP_PKEY *from)
3826
0
{
3827
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_copy_parameters");
3828
3829
0
    if (!to || !from) {
3830
0
        WOLFSSL_MSG("Bad parameter");
3831
0
        return WOLFSSL_FAILURE;
3832
0
    }
3833
3834
0
    if (to->type == WC_EVP_PKEY_NONE) {
3835
0
        to->type = from->type;
3836
0
    }
3837
0
    else if (to->type != from->type) {
3838
0
        WOLFSSL_MSG("Different key types");
3839
0
        return WOLFSSL_FAILURE;
3840
0
    }
3841
3842
0
    switch(from->type) {
3843
0
#ifdef HAVE_ECC
3844
0
    case WC_EVP_PKEY_EC:
3845
0
        if (from->ecc) {
3846
0
            if (!to->ecc) {
3847
0
                if ((to->ecc = wolfSSL_EC_KEY_new()) == NULL) {
3848
0
                    WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
3849
0
                    return WOLFSSL_FAILURE;
3850
0
                }
3851
0
                to->ownEcc = 1;
3852
0
            }
3853
0
            to->ecc->group->curve_idx = from->ecc->group->curve_idx;
3854
0
            to->ecc->group->curve_nid = from->ecc->group->curve_nid;
3855
0
            to->ecc->group->curve_oid = from->ecc->group->curve_oid;
3856
0
        }
3857
0
        else {
3858
0
            WOLFSSL_MSG("Missing ECC struct");
3859
0
            return WOLFSSL_FAILURE;
3860
0
        }
3861
0
        break;
3862
0
#endif
3863
#ifndef NO_DSA
3864
    case WC_EVP_PKEY_DSA:
3865
        if (from->dsa) {
3866
            WOLFSSL_BIGNUM* cpy;
3867
            if (!to->dsa) {
3868
                if ((to->dsa = wolfSSL_DSA_new()) == NULL) {
3869
                    WOLFSSL_MSG("wolfSSL_DSA_new error");
3870
                    return WOLFSSL_FAILURE;
3871
                }
3872
                to->ownDsa = 1;
3873
            }
3874
3875
            /* free existing BIGNUMs if needed before copying over new */
3876
            wolfSSL_BN_free(to->dsa->p);
3877
            wolfSSL_BN_free(to->dsa->g);
3878
            wolfSSL_BN_free(to->dsa->q);
3879
            to->dsa->p = NULL;
3880
            to->dsa->g = NULL;
3881
            to->dsa->q = NULL;
3882
3883
            if (!(cpy = wolfSSL_BN_dup(from->dsa->p))) {
3884
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3885
                return WOLFSSL_FAILURE;
3886
            }
3887
            to->dsa->p = cpy;
3888
            if (!(cpy = wolfSSL_BN_dup(from->dsa->q))) {
3889
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3890
                return WOLFSSL_FAILURE;
3891
            }
3892
            to->dsa->q = cpy;
3893
            if (!(cpy = wolfSSL_BN_dup(from->dsa->g))) {
3894
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3895
                return WOLFSSL_FAILURE;
3896
            }
3897
            to->dsa->g = cpy;
3898
        }
3899
        else {
3900
            WOLFSSL_MSG("Missing DSA struct");
3901
            return WOLFSSL_FAILURE;
3902
        }
3903
        break;
3904
#endif
3905
0
#ifndef NO_DH
3906
0
    case WC_EVP_PKEY_DH:
3907
0
        if (from->dh) {
3908
0
            WOLFSSL_BIGNUM* cpy;
3909
0
            if (!to->dh) {
3910
0
                if ((to->dh = wolfSSL_DH_new()) == NULL) {
3911
0
                    WOLFSSL_MSG("wolfSSL_DH_new error");
3912
0
                    return WOLFSSL_FAILURE;
3913
0
                }
3914
0
                to->ownDh = 1;
3915
0
            }
3916
3917
            /* free existing BIGNUMs if needed before copying over new */
3918
0
            wolfSSL_BN_free(to->dh->p);
3919
0
            wolfSSL_BN_free(to->dh->g);
3920
0
            wolfSSL_BN_free(to->dh->q);
3921
0
            to->dh->p = NULL;
3922
0
            to->dh->g = NULL;
3923
0
            to->dh->q = NULL;
3924
3925
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->p))) {
3926
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH p");
3927
0
                return WOLFSSL_FAILURE;
3928
0
            }
3929
0
            to->dh->p = cpy;
3930
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->g))) {
3931
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH g");
3932
0
                return WOLFSSL_FAILURE;
3933
0
            }
3934
0
            to->dh->g = cpy;
3935
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->q))) {
3936
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH q");
3937
0
                return WOLFSSL_FAILURE;
3938
0
            }
3939
0
            to->dh->q = cpy;
3940
0
        }
3941
0
        else {
3942
0
            WOLFSSL_MSG("Missing DH struct");
3943
0
            return WOLFSSL_FAILURE;
3944
0
        }
3945
0
        break;
3946
0
#endif
3947
0
#ifndef NO_RSA
3948
0
    case WC_EVP_PKEY_RSA:
3949
0
#endif
3950
0
    default:
3951
0
        WOLFSSL_MSG("Copy parameters not available for this key type");
3952
0
        return WOLFSSL_FAILURE;
3953
0
    }
3954
3955
0
    return WOLFSSL_SUCCESS;
3956
0
}
3957
3958
#ifndef NO_WOLFSSL_STUB
3959
int wolfSSL_EVP_PKEY_missing_parameters(WOLFSSL_EVP_PKEY *pkey)
3960
0
{
3961
0
    (void)pkey;
3962
    /* not using missing params callback and returning zero to indicate success */
3963
0
    return 0;
3964
0
}
3965
#endif
3966
3967
/* wolfSSL_EVP_PKEY_cmp
3968
 * returns 0 on success, -1 on failure.
3969
 *
3970
 * This behavior is different from openssl.
3971
 *  EVP_PKEY_cmp returns:
3972
 *    1 : two keys match
3973
 *    0 : do not match
3974
 *    -1: key types are different
3975
 *    -2: the operation is not supported
3976
 * If you want this function behave the same as openSSL,
3977
 * define WOLFSSL_ERROR_CODE_OPENSSL so that WS_RETURN_CODE translates return
3978
 * codes to match OpenSSL equivalent behavior.
3979
 */
3980
int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
3981
0
{
3982
0
    int ret = -1; /* failure */
3983
3984
0
    if (a == NULL || b == NULL)
3985
0
        return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3986
3987
    /* check its the same type of key */
3988
0
    if (a->type != b->type)
3989
0
        return WS_RETURN_CODE(ret, -1);
3990
3991
    /* get size based on key type */
3992
0
    switch (a->type) {
3993
0
#ifndef NO_RSA
3994
0
    case WC_EVP_PKEY_RSA:
3995
0
        if (wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa)) <= 0 ||
3996
0
                wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa)) <= 0) {
3997
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3998
0
        }
3999
4000
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->n,
4001
0
                   &((RsaKey*)b->rsa->internal)->n) != MP_EQ) {
4002
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4003
0
        }
4004
4005
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->e,
4006
0
                   &((RsaKey*)b->rsa->internal)->e) != MP_EQ) {
4007
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4008
0
        }
4009
0
        break;
4010
0
#endif /* !NO_RSA */
4011
0
#ifdef HAVE_ECC
4012
0
    case WC_EVP_PKEY_EC:
4013
0
        if (a->ecc == NULL || a->ecc->internal == NULL ||
4014
0
            b->ecc == NULL || b->ecc->internal == NULL ||
4015
0
            wc_ecc_size((ecc_key*)a->ecc->internal) <= 0 ||
4016
0
            wc_ecc_size((ecc_key*)b->ecc->internal) <= 0 ||
4017
0
            a->ecc->group == NULL || b->ecc->group == NULL) {
4018
0
            return ret;
4019
0
        }
4020
4021
        /* check curve */
4022
0
        if (a->ecc->group->curve_idx != b->ecc->group->curve_idx) {
4023
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4024
0
        }
4025
4026
0
        if (wc_ecc_cmp_point(&((ecc_key*)a->ecc->internal)->pubkey,
4027
0
                             &((ecc_key*)b->ecc->internal)->pubkey) != 0) {
4028
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4029
0
        }
4030
0
        break;
4031
0
#endif /* HAVE_ECC */
4032
0
    default:
4033
0
        return WS_RETURN_CODE(ret, -2);
4034
0
    } /* switch (a->type) */
4035
4036
0
#if defined(WOLFSSL_ERROR_CODE_OPENSSL)
4037
0
    ret = 1; /* the keys match */
4038
#else
4039
    ret = 0; /* success */
4040
#endif
4041
0
    return ret;
4042
0
}
4043
4044
/**
4045
 * validate DH algorithm parameters
4046
 * @param dh_key  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4047
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4048
 */
4049
static int DH_param_check(WOLFSSL_DH* dh_key)
4050
0
{
4051
0
    int ret = WOLFSSL_SUCCESS;
4052
0
    WOLFSSL_BIGNUM *num1 = NULL;
4053
0
    WOLFSSL_BIGNUM *num2 = NULL;
4054
4055
0
    WOLFSSL_ENTER("DH_param_check");
4056
4057
0
    num1 = wolfSSL_BN_new();
4058
0
    num2 = wolfSSL_BN_new();
4059
0
    if (num1 == NULL || num2 == NULL) {
4060
0
        WOLFSSL_MSG("failed to assign big number");
4061
0
        ret = WOLFSSL_FAILURE;
4062
0
    }
4063
4064
    /* prime check */
4065
0
    if (ret == WOLFSSL_SUCCESS &&
4066
0
        wolfSSL_BN_is_odd(dh_key->p) == 0){
4067
0
        WOLFSSL_MSG("dh_key->p is not prime");
4068
0
        ret = WOLFSSL_FAILURE;
4069
0
    } /* TODO safe prime check. need BN_rshift1 */
4070
4071
    /* generator check */
4072
0
    if (ret == WOLFSSL_SUCCESS &&
4073
0
       (wolfSSL_BN_is_one(dh_key->g) ||
4074
0
        wolfSSL_BN_is_negative(dh_key->g) ||
4075
0
        wolfSSL_BN_is_zero(dh_key->g))) {
4076
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4077
0
        ret = WOLFSSL_FAILURE;
4078
0
    }
4079
4080
0
    if (ret == WOLFSSL_SUCCESS &&
4081
0
        wolfSSL_BN_cmp(dh_key->p, dh_key->g) <= 0) {
4082
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4083
0
        ret = WOLFSSL_FAILURE;
4084
0
    }
4085
4086
0
    if (ret == WOLFSSL_SUCCESS &&
4087
0
        dh_key->q != NULL)
4088
0
    {
4089
0
        if (ret == WOLFSSL_SUCCESS &&
4090
0
            wolfSSL_BN_mod_exp(num1, dh_key->g, dh_key->q, dh_key->p, NULL)
4091
0
               == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
4092
0
        {
4093
0
            WOLFSSL_MSG("BN_mod_exp failed");
4094
0
            ret = WOLFSSL_FAILURE;
4095
0
        }
4096
0
        else
4097
0
            if (ret == WOLFSSL_SUCCESS &&
4098
0
                wolfSSL_BN_is_one(num1) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4099
0
                WOLFSSL_MSG("dh_key->g is not suitable generator");
4100
0
                ret = WOLFSSL_FAILURE;
4101
0
            }
4102
0
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
4103
        /* test if the number q is prime. */
4104
0
        if (ret == WOLFSSL_SUCCESS &&
4105
0
            (wolfSSL_BN_is_prime_ex(dh_key->q, 64, NULL, NULL) <= 0)) {
4106
0
            WOLFSSL_MSG("dh_key->q is not prime or error during check.");
4107
0
            ret = WOLFSSL_FAILURE;
4108
0
        } /* else TODO check q div q - 1. need BN_div */
4109
0
#endif
4110
0
    }
4111
4112
    /* clean up */
4113
0
    wolfSSL_BN_free(num1);
4114
0
    wolfSSL_BN_free(num2);
4115
4116
0
    WOLFSSL_LEAVE("DH_param_check", WOLFSSL_SUCCESS);
4117
0
    return ret;
4118
0
}
4119
/**
4120
 * validate the algorithm parameters
4121
 * @param ctx  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4122
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4123
 */
4124
int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx)
4125
0
{
4126
0
    int type;
4127
0
    int ret;
4128
0
    WOLFSSL_DH* dh_key = NULL;
4129
4130
    /* sanity check */
4131
0
    if (ctx == NULL) {
4132
0
        return WOLFSSL_FAILURE;
4133
0
    }
4134
4135
0
    type = wolfSSL_EVP_PKEY_type(wolfSSL_EVP_PKEY_base_id(ctx->pkey));
4136
0
    switch (type) {
4137
0
        #if !defined(NO_RSA)
4138
0
            case WC_EVP_PKEY_RSA:
4139
0
                WOLFSSL_MSG("WC_EVP_PKEY_RSA not yet implemented");
4140
0
                return WOLFSSL_FAILURE;
4141
0
        #endif
4142
0
        #if defined(HAVE_ECC)
4143
0
            case WC_EVP_PKEY_EC:
4144
0
                WOLFSSL_MSG("WC_EVP_PKEY_EC not yet implemented");
4145
0
                return WOLFSSL_FAILURE;
4146
0
        #endif
4147
        #if !defined(NO_DSA)
4148
            case WC_EVP_PKEY_DSA:
4149
                WOLFSSL_MSG("WC_EVP_PKEY_DSA not yet implemented");
4150
                return WOLFSSL_FAILURE;
4151
        #endif
4152
0
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
4153
0
        #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
4154
0
            case WC_EVP_PKEY_DH:
4155
0
                dh_key = wolfSSL_EVP_PKEY_get1_DH(ctx->pkey);
4156
0
                if (dh_key != NULL) {
4157
0
                    ret = DH_param_check(dh_key);
4158
0
                    wolfSSL_DH_free(dh_key);
4159
0
                }
4160
0
                else
4161
0
                    ret = WOLFSSL_FAILURE;
4162
0
            return ret;
4163
0
        #endif
4164
0
        #endif
4165
0
        default:
4166
0
            WOLFSSL_MSG("Unknown PKEY type");
4167
0
            break;
4168
0
    }
4169
4170
0
    (void)ret;
4171
0
    (void)DH_param_check;
4172
0
    (void)dh_key;
4173
0
    return WOLFSSL_FAILURE;
4174
0
}
4175
4176
/* Initialize structure for signing
4177
 *
4178
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4179
 * type is the type of message digest to use
4180
 *
4181
 * returns WOLFSSL_SUCCESS on success
4182
 */
4183
int wolfSSL_EVP_SignInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4184
0
{
4185
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4186
0
    WOLFSSL_ENTER("EVP_SignInit");
4187
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4188
0
}
4189
4190
int wolfSSL_EVP_SignInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
4191
                                     const WOLFSSL_EVP_MD* type,
4192
                                     WOLFSSL_ENGINE *impl)
4193
0
{
4194
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4195
0
    WOLFSSL_ENTER("EVP_SignInit");
4196
0
    return wolfSSL_EVP_DigestInit_ex(ctx,type,impl);
4197
0
}
4198
4199
4200
/* Update structure with data for signing
4201
 *
4202
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4203
 * data buffer holding data to update with for sign
4204
 * len  length of data buffer
4205
 *
4206
 * returns WOLFSSL_SUCCESS on success
4207
 */
4208
int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4209
0
{
4210
0
    if (ctx == NULL) return 0;
4211
0
    WOLFSSL_ENTER("EVP_SignUpdate(");
4212
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4213
0
}
4214
static const WOLFSSL_EVP_MD* wolfSSL_macType2EVP_md(enum wc_HashType type)
4215
0
{
4216
0
    const struct s_ent *ent ;
4217
4218
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
4219
0
        if (ent->macType == type) {
4220
0
            return ent->name;
4221
0
        }
4222
0
    }
4223
0
    return NULL;
4224
0
}
4225
4226
/* Finalize structure for signing
4227
 *
4228
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4229
 * sigret buffer to hold resulting signature
4230
 * siglen length of sigret buffer
4231
 * pkey   key to sign with
4232
 *
4233
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4234
 */
4235
int wolfSSL_EVP_SignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sigret,
4236
                  unsigned int *siglen, WOLFSSL_EVP_PKEY *pkey)
4237
0
{
4238
0
    unsigned int mdsize;
4239
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4240
0
    int ret;
4241
0
    (void)sigret;
4242
0
    (void)siglen;
4243
4244
0
    WOLFSSL_ENTER("EVP_SignFinal");
4245
0
    if (ctx == NULL || sigret == NULL || siglen == NULL || pkey == NULL)
4246
0
        return WOLFSSL_FAILURE;
4247
4248
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4249
0
    if (ret <= 0)
4250
0
        return ret;
4251
4252
0
    switch (pkey->type) {
4253
0
#if !defined(NO_RSA)
4254
0
    case WC_EVP_PKEY_RSA: {
4255
0
        int nid;
4256
0
        const WOLFSSL_EVP_MD *ctxmd;
4257
4258
0
        ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4259
0
        if (ctxmd == NULL)
4260
0
            return WOLFSSL_FAILURE;
4261
4262
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4263
0
        if (nid < 0)
4264
0
            return WOLFSSL_FAILURE;
4265
0
        return wolfSSL_RSA_sign(nid, md, mdsize, sigret,
4266
0
                                siglen, pkey->rsa);
4267
0
    }
4268
0
#endif /* NO_RSA */
4269
#ifndef NO_DSA
4270
    case WC_EVP_PKEY_DSA: {
4271
        int bytes;
4272
        ret = wolfSSL_DSA_do_sign(md, sigret, pkey->dsa);
4273
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
4274
        if (ret != WOLFSSL_SUCCESS)
4275
            return ret;
4276
        bytes = wolfSSL_BN_num_bytes(pkey->dsa->q);
4277
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE) ||
4278
            (int)*siglen < bytes * 2)
4279
        {
4280
            return WOLFSSL_FAILURE;
4281
        }
4282
        *siglen = (unsigned int)(bytes * 2);
4283
        return WOLFSSL_SUCCESS;
4284
    }
4285
#endif
4286
0
#ifdef HAVE_ECC
4287
0
    case WC_EVP_PKEY_EC: {
4288
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_ECDSA_do_sign(md, (int)mdsize,
4289
0
                pkey->ecc);
4290
0
        if (ecdsaSig == NULL)
4291
0
            return WOLFSSL_FAILURE;
4292
        /* get signature length only */
4293
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4294
0
        if (ret <= 0 || ret > (int)*siglen) {
4295
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4296
0
            return WOLFSSL_FAILURE;
4297
0
        }
4298
        /* perform validation of signature */
4299
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sigret);
4300
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4301
0
        if (ret <= 0 || ret > (int)*siglen)
4302
0
            return WOLFSSL_FAILURE;
4303
0
        *siglen = (unsigned int)ret;
4304
0
        return WOLFSSL_SUCCESS;
4305
0
    }
4306
0
#endif
4307
0
    default:
4308
0
        break;
4309
0
    }
4310
0
    return WOLFSSL_FAILURE;
4311
0
}
4312
4313
4314
/* Initialize structure for verifying signature
4315
 *
4316
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4317
 * type is the type of message digest to use
4318
 *
4319
 * returns WOLFSSL_SUCCESS on success
4320
 */
4321
int wolfSSL_EVP_VerifyInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4322
0
{
4323
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4324
0
    WOLFSSL_ENTER("EVP_VerifyInit");
4325
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4326
0
}
4327
4328
4329
/* Update structure for verifying signature
4330
 *
4331
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4332
 * data buffer holding data to update with for verify
4333
 * len  length of data buffer
4334
 *
4335
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4336
 */
4337
int wolfSSL_EVP_VerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4338
0
{
4339
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4340
0
    WOLFSSL_ENTER("EVP_VerifyUpdate");
4341
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4342
0
}
4343
4344
4345
/* Finalize structure for verifying signature
4346
 *
4347
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4348
 * sig    buffer holding signature
4349
 * siglen length of sig buffer
4350
 * pkey   key to verify with
4351
 *
4352
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4353
 */
4354
int wolfSSL_EVP_VerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4355
        const unsigned char*sig, unsigned int siglen, WOLFSSL_EVP_PKEY *pkey)
4356
0
{
4357
0
    int ret;
4358
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4359
0
    unsigned int mdsize;
4360
4361
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4362
0
    WOLFSSL_ENTER("EVP_VerifyFinal");
4363
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4364
0
    if (ret <= 0)
4365
0
        return ret;
4366
4367
0
    (void)sig;
4368
0
    (void)siglen;
4369
4370
0
    switch (pkey->type) {
4371
0
#if !defined(NO_RSA)
4372
0
    case WC_EVP_PKEY_RSA: {
4373
0
        int nid;
4374
0
        const WOLFSSL_EVP_MD *ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4375
0
        if (ctxmd == NULL) break;
4376
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4377
0
        if (nid < 0) break;
4378
0
        return wolfSSL_RSA_verify(nid, md, mdsize, sig,
4379
0
                (unsigned int)siglen, pkey->rsa);
4380
0
    }
4381
0
#endif /* NO_RSA */
4382
0
#ifdef HAVE_ECC
4383
0
    case WC_EVP_PKEY_EC: {
4384
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
4385
0
            NULL, (const unsigned char **)&sig, (long)siglen);
4386
0
        if (ecdsaSig == NULL)
4387
0
            return WOLFSSL_FAILURE;
4388
0
        ret = wolfSSL_ECDSA_do_verify(md, (int)mdsize, ecdsaSig,
4389
0
            pkey->ecc);
4390
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4391
0
        return ret;
4392
0
    }
4393
0
#endif
4394
0
    case WC_EVP_PKEY_DSA:
4395
0
        WOLFSSL_MSG("not implemented");
4396
0
        FALL_THROUGH;
4397
0
    default:
4398
0
        break;
4399
0
    }
4400
0
    return WOLFSSL_FAILURE;
4401
0
}
4402
4403
int wolfSSL_EVP_add_cipher(const WOLFSSL_EVP_CIPHER *cipher)
4404
0
{
4405
    /* nothing to do */
4406
0
    if (cipher == NULL)
4407
0
        return WOLFSSL_FAILURE;
4408
0
    return WOLFSSL_SUCCESS;
4409
0
}
4410
4411
4412
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_mac_key(int type, WOLFSSL_ENGINE* e,
4413
                                          const unsigned char* key, int keylen)
4414
516
{
4415
516
    WOLFSSL_EVP_PKEY* pkey;
4416
4417
516
    (void)e;
4418
4419
516
    if (type != WC_EVP_PKEY_HMAC || (key == NULL && keylen != 0))
4420
0
        return NULL;
4421
4422
516
    pkey = wolfSSL_EVP_PKEY_new();
4423
516
    if (pkey != NULL) {
4424
516
        pkey->pkey.ptr = (char*)XMALLOC((size_t)keylen, NULL,
4425
516
            DYNAMIC_TYPE_PUBLIC_KEY);
4426
516
        if (pkey->pkey.ptr == NULL && keylen > 0) {
4427
0
            wolfSSL_EVP_PKEY_free(pkey);
4428
0
            pkey = NULL;
4429
0
        }
4430
516
        else {
4431
516
            if (keylen) {
4432
351
                XMEMCPY(pkey->pkey.ptr, key, (size_t)keylen);
4433
351
            }
4434
516
            pkey->pkey_sz = keylen;
4435
516
            pkey->type = pkey->save_type = type;
4436
516
        }
4437
516
    }
4438
4439
516
    return pkey;
4440
516
}
4441
4442
4443
#if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT)
4444
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_CMAC_key(WOLFSSL_ENGINE* e,
4445
        const unsigned char* priv, size_t len, const WOLFSSL_EVP_CIPHER *cipher)
4446
0
{
4447
0
    WOLFSSL_EVP_PKEY* pkey;
4448
0
    WOLFSSL_CMAC_CTX* ctx;
4449
0
    int ret = 0;
4450
4451
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_CMAC_key");
4452
4453
0
    if (priv == NULL || len == 0 || cipher == NULL) {
4454
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", BAD_FUNC_ARG);
4455
0
        return NULL;
4456
0
    }
4457
4458
0
    ctx = wolfSSL_CMAC_CTX_new();
4459
0
    if (ctx == NULL) {
4460
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4461
0
        return NULL;
4462
0
    }
4463
4464
0
    ret = wolfSSL_CMAC_Init(ctx, priv, len, cipher, e);
4465
0
    if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4466
0
        wolfSSL_CMAC_CTX_free(ctx);
4467
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4468
0
        return NULL;
4469
0
    }
4470
4471
0
    pkey = wolfSSL_EVP_PKEY_new();
4472
0
    if (pkey != NULL) {
4473
0
        pkey->pkey.ptr = (char*)XMALLOC((size_t)len, NULL,
4474
0
            DYNAMIC_TYPE_PUBLIC_KEY);
4475
0
        if (pkey->pkey.ptr == NULL && len > 0) {
4476
0
            wolfSSL_EVP_PKEY_free(pkey);
4477
0
            pkey = NULL;
4478
0
            wolfSSL_CMAC_CTX_free(ctx);
4479
0
        }
4480
0
        else {
4481
0
            if (len) {
4482
0
                XMEMCPY(pkey->pkey.ptr, priv, (size_t)len);
4483
0
            }
4484
0
            pkey->pkey_sz = (int)len;
4485
0
            pkey->type = pkey->save_type = WC_EVP_PKEY_CMAC;
4486
0
            pkey->cmacCtx = ctx;
4487
0
        }
4488
0
    }
4489
0
    else {
4490
0
        wolfSSL_CMAC_CTX_free(ctx);
4491
0
    }
4492
4493
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4494
0
    return pkey;
4495
0
}
4496
#endif /* defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) */
4497
4498
const unsigned char* wolfSSL_EVP_PKEY_get0_hmac(const WOLFSSL_EVP_PKEY* pkey,
4499
                                                size_t* len)
4500
481
{
4501
481
    if (pkey == NULL || len == NULL)
4502
0
        return NULL;
4503
4504
481
    *len = (size_t)pkey->pkey_sz;
4505
4506
481
    return (const unsigned char*)pkey->pkey.ptr;
4507
481
}
4508
4509
static int wolfssl_evp_md_to_hash_type(const WOLFSSL_EVP_MD *type,
4510
    int* hashType)
4511
625
{
4512
625
    int ret = 0;
4513
4514
625
#ifndef NO_SHA256
4515
625
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
4516
63
        *hashType = WC_SHA256;
4517
63
    }
4518
562
    else
4519
562
#endif
4520
562
#ifndef NO_SHA
4521
562
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
4522
81
        *hashType = WC_SHA;
4523
81
    }
4524
481
    else
4525
481
#endif /* NO_SHA */
4526
481
#ifdef WOLFSSL_SHA224
4527
481
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
4528
179
        *hashType = WC_SHA224;
4529
179
    }
4530
302
    else
4531
302
#endif
4532
302
#ifdef WOLFSSL_SHA384
4533
302
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
4534
72
        *hashType = WC_SHA384;
4535
72
    }
4536
230
    else
4537
230
#endif
4538
230
#ifdef WOLFSSL_SHA512
4539
230
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
4540
106
        *hashType = WC_SHA512;
4541
106
    }
4542
124
    else
4543
124
#endif
4544
124
#ifdef WOLFSSL_SHA3
4545
124
    #ifndef WOLFSSL_NOSHA3_224
4546
124
        if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
4547
0
            *hashType = WC_SHA3_224;
4548
0
        }
4549
124
        else
4550
124
    #endif
4551
124
    #ifndef WOLFSSL_NOSHA3_256
4552
124
        if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
4553
0
            *hashType = WC_SHA3_256;
4554
0
        }
4555
124
        else
4556
124
    #endif
4557
124
    #ifndef WOLFSSL_NOSHA3_384
4558
124
        if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
4559
0
            *hashType = WC_SHA3_384;
4560
0
        }
4561
124
        else
4562
124
    #endif
4563
124
    #ifndef WOLFSSL_NOSHA3_512
4564
124
        if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
4565
0
            *hashType = WC_SHA3_512;
4566
0
        }
4567
124
        else
4568
124
    #endif
4569
124
#endif
4570
124
#ifdef WOLFSSL_SM3
4571
124
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
4572
0
        *hashType = WC_SM3;
4573
0
    }
4574
124
    else
4575
124
#endif
4576
124
#ifndef NO_MD5
4577
124
    if (XSTRCMP(type, WC_SN_md5) == 0) {
4578
79
        *hashType = WC_MD5;
4579
79
    }
4580
45
    else
4581
45
#endif
4582
45
    {
4583
45
        ret = BAD_FUNC_ARG;
4584
45
    }
4585
4586
625
    return ret;
4587
625
}
4588
4589
/* Initialize an EVP_DigestSign/Verify operation.
4590
 * Initialize a digest for RSA and ECC keys, or HMAC for HMAC key.
4591
 */
4592
static int wolfSSL_evp_digest_pk_init(WOLFSSL_EVP_MD_CTX *ctx,
4593
                                      WOLFSSL_EVP_PKEY_CTX **pctx,
4594
                                      const WOLFSSL_EVP_MD *type,
4595
                                      WOLFSSL_ENGINE *e,
4596
                                      WOLFSSL_EVP_PKEY *pkey)
4597
516
{
4598
516
    if (!type) {
4599
0
        int default_digest;
4600
0
        if (wolfSSL_EVP_PKEY_get_default_digest_nid(pkey, &default_digest)
4601
0
                != WOLFSSL_SUCCESS) {
4602
0
            WOLFSSL_MSG("Could not get default digest");
4603
0
            return WOLFSSL_FAILURE;
4604
0
        }
4605
0
        type = wolfSSL_EVP_get_digestbynid(default_digest);
4606
0
        if (type == NULL) {
4607
0
            return WOLFSSL_FAILURE;
4608
0
        }
4609
0
    }
4610
4611
516
    if (pkey->type == WC_EVP_PKEY_HMAC) {
4612
516
        int hashType;
4613
516
        int ret;
4614
516
        size_t keySz = 0;
4615
516
        const unsigned char* key;
4616
4617
516
        ret = wolfssl_evp_md_to_hash_type(type, &hashType);
4618
516
        if (ret != 0) {
4619
35
             return ret;
4620
35
        }
4621
4622
481
        key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz);
4623
481
        if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0)
4624
0
            return WOLFSSL_FAILURE;
4625
4626
481
        if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0)
4627
0
            return WOLFSSL_FAILURE;
4628
4629
481
        ctx->isHMAC = 1;
4630
481
    }
4631
0
    else if (wolfSSL_EVP_DigestInit(ctx, type) != 1)
4632
0
            return WOLFSSL_FAILURE;
4633
4634
481
    if (ctx->pctx == NULL) {
4635
481
        ctx->pctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
4636
481
        if (ctx->pctx == NULL)
4637
0
            return WOLFSSL_FAILURE;
4638
481
    }
4639
481
    if (pctx != NULL)
4640
0
        *pctx = ctx->pctx;
4641
481
    return WOLFSSL_SUCCESS;
4642
481
}
4643
4644
/* Update an EVP_DigestSign/Verify operation.
4645
 * Update a digest for RSA and ECC keys, or HMAC for HMAC key.
4646
 */
4647
static int wolfssl_evp_digest_pk_update(WOLFSSL_EVP_MD_CTX *ctx,
4648
                                        const void *d, unsigned int cnt)
4649
4.19k
{
4650
4.19k
    if (ctx->isHMAC) {
4651
4.19k
        if (wc_HmacUpdate(&ctx->hash.hmac, (const byte *)d, cnt) != 0)
4652
0
            return WOLFSSL_FAILURE;
4653
4654
4.19k
        return WOLFSSL_SUCCESS;
4655
4.19k
    }
4656
0
    else
4657
0
        return wolfSSL_EVP_DigestUpdate(ctx, d, cnt);
4658
4.19k
}
4659
4660
/* Finalize an EVP_DigestSign/Verify operation - common part only.
4661
 * Finalize a digest for RSA and ECC keys, or HMAC for HMAC key.
4662
 * Copies the digest so that you can keep updating.
4663
 */
4664
static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx,
4665
                                       unsigned char *md, unsigned int* mdlen)
4666
313
{
4667
313
    int  ret;
4668
4669
313
    if (ctx->isHMAC) {
4670
313
#ifdef WOLFSSL_SMALL_STACK
4671
313
        Hmac *hmacCopy = (Hmac *)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_OPENSSL);
4672
313
        if (hmacCopy == NULL)
4673
0
            return WOLFSSL_FAILURE;
4674
#else
4675
        Hmac hmacCopy[1];
4676
#endif
4677
313
        ret = wolfSSL_HmacCopy(hmacCopy, &ctx->hash.hmac);
4678
313
        if (ret == WOLFSSL_SUCCESS)
4679
313
            ret = wc_HmacFinal(hmacCopy, md) == 0;
4680
313
        wc_HmacFree(hmacCopy);
4681
313
        WC_FREE_VAR_EX(hmacCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4682
313
        return ret;
4683
313
    }
4684
0
    else {
4685
0
#ifdef WOLFSSL_SMALL_STACK
4686
0
        WOLFSSL_EVP_MD_CTX *ctxCopy = (WOLFSSL_EVP_MD_CTX *)XMALLOC(sizeof(WOLFSSL_EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
4687
0
        if (ctxCopy == NULL)
4688
0
            return WOLFSSL_FAILURE;
4689
#else
4690
        WOLFSSL_EVP_MD_CTX ctxCopy[1];
4691
#endif
4692
0
        wolfSSL_EVP_MD_CTX_init(ctxCopy);
4693
4694
0
        ret = wolfSSL_EVP_MD_CTX_copy_ex(ctxCopy, ctx);
4695
0
        if (ret == WOLFSSL_SUCCESS)
4696
0
            ret = wolfSSL_EVP_DigestFinal(ctxCopy, md, mdlen);
4697
0
        wolfSSL_EVP_MD_CTX_cleanup(ctxCopy);
4698
0
        WC_FREE_VAR_EX(ctxCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4699
0
        return ret;
4700
0
    }
4701
313
}
4702
4703
/* Get the length of the mac based on the digest algorithm. */
4704
static unsigned int wolfssl_mac_len(unsigned char macType)
4705
412
{
4706
412
    unsigned int hashLen;
4707
4708
412
    switch (macType) {
4709
0
    #ifndef NO_MD5
4710
42
        case WC_MD5:
4711
42
            hashLen = WC_MD5_DIGEST_SIZE;
4712
42
            break;
4713
0
    #endif /* !NO_MD5 */
4714
4715
0
    #ifndef NO_SHA
4716
77
        case WC_SHA:
4717
77
            hashLen = WC_SHA_DIGEST_SIZE;
4718
77
            break;
4719
0
    #endif /* !NO_SHA */
4720
4721
0
    #ifdef WOLFSSL_SHA224
4722
98
        case WC_SHA224:
4723
98
            hashLen = WC_SHA224_DIGEST_SIZE;
4724
98
            break;
4725
0
    #endif /* WOLFSSL_SHA224 */
4726
4727
0
    #ifndef NO_SHA256
4728
62
        case WC_SHA256:
4729
62
            hashLen = WC_SHA256_DIGEST_SIZE;
4730
62
            break;
4731
0
    #endif /* !NO_SHA256 */
4732
4733
0
    #ifdef WOLFSSL_SHA384
4734
29
        case WC_SHA384:
4735
29
            hashLen = WC_SHA384_DIGEST_SIZE;
4736
29
            break;
4737
0
    #endif /* WOLFSSL_SHA384 */
4738
0
    #ifdef WOLFSSL_SHA512
4739
104
        case WC_SHA512:
4740
104
            hashLen = WC_SHA512_DIGEST_SIZE;
4741
104
            break;
4742
0
    #endif /* WOLFSSL_SHA512 */
4743
4744
0
    #ifdef HAVE_BLAKE2
4745
0
        case BLAKE2B_ID:
4746
0
            hashLen = BLAKE2B_OUTBYTES;
4747
0
            break;
4748
0
    #endif /* HAVE_BLAKE2 */
4749
4750
0
    #ifdef WOLFSSL_SHA3
4751
0
        #ifndef WOLFSSL_NOSHA3_224
4752
0
        case WC_SHA3_224:
4753
0
            hashLen = WC_SHA3_224_DIGEST_SIZE;
4754
0
            break;
4755
0
        #endif
4756
0
        #ifndef WOLFSSL_NOSHA3_256
4757
0
        case WC_SHA3_256:
4758
0
            hashLen = WC_SHA3_256_DIGEST_SIZE;
4759
0
            break;
4760
0
        #endif
4761
0
        #ifndef WOLFSSL_NOSHA3_384
4762
0
        case WC_SHA3_384:
4763
0
            hashLen = WC_SHA3_384_DIGEST_SIZE;
4764
0
            break;
4765
0
        #endif
4766
0
        #ifndef WOLFSSL_NOSHA3_512
4767
0
        case WC_SHA3_512:
4768
0
            hashLen = WC_SHA3_512_DIGEST_SIZE;
4769
0
            break;
4770
0
        #endif
4771
0
    #endif
4772
4773
0
    #ifdef WOLFSSL_SM3
4774
0
        case WC_SM3:
4775
0
            hashLen = WC_SM3_DIGEST_SIZE;
4776
0
            break;
4777
0
    #endif /* WOLFSSL_SM3 */
4778
4779
0
        default:
4780
0
            hashLen = 0;
4781
412
    }
4782
4783
412
    return hashLen;
4784
412
}
4785
4786
int wolfSSL_EVP_DigestSignInit(WOLFSSL_EVP_MD_CTX *ctx,
4787
                               WOLFSSL_EVP_PKEY_CTX **pctx,
4788
                               const WOLFSSL_EVP_MD *type,
4789
                               WOLFSSL_ENGINE *e,
4790
                               WOLFSSL_EVP_PKEY *pkey)
4791
516
{
4792
516
    WOLFSSL_ENTER("EVP_DigestSignInit");
4793
4794
516
    if (ctx == NULL || pkey == NULL)
4795
0
        return WOLFSSL_FAILURE;
4796
4797
516
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4798
516
}
4799
4800
4801
int wolfSSL_EVP_DigestSignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4802
                                 unsigned int cnt)
4803
4.35k
{
4804
4.35k
    WOLFSSL_ENTER("EVP_DigestSignUpdate");
4805
4806
4.35k
    if (ctx == NULL || d == NULL)
4807
168
        return WOLFSSL_FAILURE;
4808
4809
4.19k
    return wolfssl_evp_digest_pk_update(ctx, d, cnt);
4810
4.35k
}
4811
4812
int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig,
4813
                                size_t *siglen)
4814
313
{
4815
313
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4816
313
    unsigned int  hashLen;
4817
313
    int           ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
4818
4819
313
    WOLFSSL_ENTER("EVP_DigestSignFinal");
4820
4821
313
    if (ctx == NULL || siglen == NULL)
4822
0
        return WOLFSSL_FAILURE;
4823
4824
    /* Return the maximum size of the signature when sig is NULL. */
4825
313
    if (ctx->isHMAC) {
4826
313
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4827
4828
313
        if (sig == NULL) {
4829
0
            *siglen = hashLen;
4830
0
            return WOLFSSL_SUCCESS;
4831
0
        }
4832
313
    }
4833
0
#ifndef NO_RSA
4834
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_RSA) {
4835
0
        if (sig == NULL) {
4836
0
            *siglen = (size_t)wolfSSL_RSA_size(ctx->pctx->pkey->rsa);
4837
0
            return WOLFSSL_SUCCESS;
4838
0
        }
4839
0
    }
4840
0
#endif /* !NO_RSA */
4841
0
#ifdef HAVE_ECC
4842
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_EC) {
4843
0
        if (sig == NULL) {
4844
            /* SEQ + INT + INT */
4845
0
            *siglen = (size_t)ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx].
4846
0
                size * 2 + 8;
4847
0
            return WOLFSSL_SUCCESS;
4848
0
        }
4849
0
    }
4850
313
#endif
4851
4852
313
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4853
0
        return WOLFSSL_FAILURE;
4854
4855
313
    if (ctx->isHMAC) {
4856
        /* Copy the HMAC result as signature. */
4857
313
        if ((unsigned int)(*siglen) > hashLen)
4858
313
            *siglen = hashLen;
4859
        /* May be a truncated signature. */
4860
4861
313
        XMEMCPY(sig, digest, (size_t)*siglen);
4862
313
        ret = WOLFSSL_SUCCESS;
4863
313
    }
4864
0
    else {
4865
        /* Sign the digest. */
4866
0
        switch (ctx->pctx->pkey->type) {
4867
0
    #if !defined(NO_RSA)
4868
0
        case WC_EVP_PKEY_RSA: {
4869
0
            unsigned int sigSz = (unsigned int)*siglen;
4870
0
            int nid;
4871
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4872
0
            if (md == NULL)
4873
0
                break;
4874
0
            nid = wolfSSL_EVP_MD_type(md);
4875
0
            if (nid < 0)
4876
0
                break;
4877
0
            ret = wolfSSL_RSA_sign_generic_padding(nid, digest, hashLen,
4878
0
                    sig, &sigSz, ctx->pctx->pkey->rsa, 1, ctx->pctx->padding);
4879
0
            if (ret >= 0)
4880
0
                *siglen = sigSz;
4881
0
            break;
4882
0
        }
4883
0
    #endif /* NO_RSA */
4884
4885
0
    #ifdef HAVE_ECC
4886
0
        case WC_EVP_PKEY_EC: {
4887
0
            int len;
4888
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
4889
0
            ecdsaSig = wolfSSL_ECDSA_do_sign(digest, (int)hashLen,
4890
0
                                             ctx->pctx->pkey->ecc);
4891
0
            if (ecdsaSig == NULL)
4892
0
                break;
4893
0
            len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4894
0
            if (len > 0 && (size_t)len <= *siglen)
4895
0
                len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
4896
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4897
0
            if (len == 0)
4898
0
                break;
4899
0
            *siglen = (size_t)len;
4900
0
            ret = WOLFSSL_SUCCESS;
4901
0
            break;
4902
0
        }
4903
0
    #endif
4904
0
        default:
4905
0
            break;
4906
0
        }
4907
0
    }
4908
4909
313
    ForceZero(digest, sizeof(digest));
4910
313
    return ret;
4911
313
}
4912
4913
int wolfSSL_EVP_DigestVerifyInit(WOLFSSL_EVP_MD_CTX *ctx,
4914
                                 WOLFSSL_EVP_PKEY_CTX **pctx,
4915
                                 const WOLFSSL_EVP_MD *type,
4916
                                 WOLFSSL_ENGINE *e,
4917
                                 WOLFSSL_EVP_PKEY *pkey)
4918
0
{
4919
0
    WOLFSSL_ENTER("EVP_DigestVerifyInit");
4920
4921
0
    if (ctx == NULL || type == NULL || pkey == NULL)
4922
0
        return WOLFSSL_FAILURE;
4923
4924
0
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4925
0
}
4926
4927
4928
int wolfSSL_EVP_DigestVerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4929
                                   size_t cnt)
4930
0
{
4931
0
    WOLFSSL_ENTER("EVP_DigestVerifyUpdate");
4932
4933
0
    if (ctx == NULL || d == NULL)
4934
0
        return WOLFSSL_FAILURE;
4935
4936
0
    return wolfssl_evp_digest_pk_update(ctx, d, (unsigned int)cnt);
4937
0
}
4938
4939
4940
int wolfSSL_EVP_DigestVerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4941
                                  const unsigned char *sig, size_t siglen)
4942
0
{
4943
0
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4944
0
    unsigned int  hashLen;
4945
4946
0
    WOLFSSL_ENTER("EVP_DigestVerifyFinal");
4947
4948
0
    if (ctx == NULL || sig == NULL)
4949
0
        return WOLFSSL_FAILURE;
4950
4951
0
    if (ctx->isHMAC) {
4952
4953
0
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4954
4955
0
        if (siglen > hashLen)
4956
0
            return WOLFSSL_FAILURE;
4957
        /* May be a truncated signature. */
4958
0
    }
4959
4960
0
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4961
0
        return WOLFSSL_FAILURE;
4962
4963
0
    if (ctx->isHMAC) {
4964
        /* Check HMAC result matches the signature. */
4965
0
        if (XMEMCMP(sig, digest, (size_t)siglen) == 0)
4966
0
            return WOLFSSL_SUCCESS;
4967
0
        return WOLFSSL_FAILURE;
4968
0
    }
4969
0
    else {
4970
        /* Verify the signature with the digest. */
4971
0
        switch (ctx->pctx->pkey->type) {
4972
0
    #if !defined(NO_RSA)
4973
0
        case WC_EVP_PKEY_RSA: {
4974
0
            int nid;
4975
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4976
0
            if (md == NULL)
4977
0
                return WOLFSSL_FAILURE;
4978
0
            nid = wolfSSL_EVP_MD_type(md);
4979
0
            if (nid < 0)
4980
0
                return WOLFSSL_FAILURE;
4981
0
            return wolfSSL_RSA_verify_ex(nid, digest, hashLen, sig,
4982
0
                                      (unsigned int)siglen,
4983
0
                                      ctx->pctx->pkey->rsa, ctx->pctx->padding);
4984
0
        }
4985
0
    #endif /* NO_RSA */
4986
4987
0
    #ifdef HAVE_ECC
4988
0
        case WC_EVP_PKEY_EC: {
4989
0
            int ret;
4990
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
4991
0
            ecdsaSig = wolfSSL_d2i_ECDSA_SIG(NULL, &sig, (long)siglen);
4992
0
            if (ecdsaSig == NULL)
4993
0
                return WOLFSSL_FAILURE;
4994
0
            ret = wolfSSL_ECDSA_do_verify(digest, (int)hashLen, ecdsaSig,
4995
0
                                          ctx->pctx->pkey->ecc);
4996
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4997
0
            return ret;
4998
0
        }
4999
0
    #endif
5000
0
        default:
5001
0
            break;
5002
0
        }
5003
0
    }
5004
5005
0
    return WOLFSSL_FAILURE;
5006
0
}
5007
5008
5009
#ifdef WOLFSSL_APACHE_HTTPD
5010
#if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32)
5011
    #include <termios.h>
5012
#endif
5013
5014
#ifndef XGETPASSWD
5015
    static int XGETPASSWD(char* buf, int bufSz) {
5016
        int ret = WOLFSSL_SUCCESS;
5017
5018
        /* turn off echo for passwords */
5019
    #ifdef USE_WINDOWS_API
5020
        DWORD originalTerm;
5021
        DWORD newTerm;
5022
        CONSOLE_SCREEN_BUFFER_INFO screenOrig;
5023
        HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
5024
        if (GetConsoleMode(stdinHandle, &originalTerm) == 0) {
5025
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5026
            return WOLFSSL_FAILURE;
5027
        }
5028
        newTerm = originalTerm;
5029
        newTerm &= ~ENABLE_ECHO_INPUT;
5030
        if (SetConsoleMode(stdinHandle, newTerm) == 0) {
5031
            WOLFSSL_MSG("Couldn't turn off echo");
5032
            return WOLFSSL_FAILURE;
5033
        }
5034
    #else
5035
        struct termios originalTerm;
5036
        struct termios newTerm;
5037
        if (tcgetattr(STDIN_FILENO, &originalTerm) != 0) {
5038
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5039
            return WOLFSSL_FAILURE;
5040
        }
5041
        XMEMCPY(&newTerm, &originalTerm, sizeof(struct termios));
5042
5043
        newTerm.c_lflag &= ~ECHO;
5044
        newTerm.c_lflag |= (ICANON | ECHONL);
5045
        if (tcsetattr(STDIN_FILENO, TCSANOW, &newTerm) != 0) {
5046
            WOLFSSL_MSG("Couldn't turn off echo");
5047
            return WOLFSSL_FAILURE;
5048
        }
5049
    #endif
5050
5051
        if (XFGETS(buf, bufSz, stdin) == NULL) {
5052
            ret = WOLFSSL_FAILURE;
5053
        }
5054
5055
        /* restore default echo */
5056
    #ifdef USE_WINDOWS_API
5057
        if (SetConsoleMode(stdinHandle, originalTerm) == 0) {
5058
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5059
            return WOLFSSL_FAILURE;
5060
        }
5061
    #else
5062
        if (tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm) != 0) {
5063
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5064
            return WOLFSSL_FAILURE;
5065
        }
5066
    #endif
5067
        return ret;
5068
    }
5069
#endif
5070
5071
/* returns 0 on success and -2 or -1 on failure */
5072
int wolfSSL_EVP_read_pw_string(char* buf, int bufSz, const char* banner, int v)
5073
{
5074
    printf("%s", banner);
5075
    if (XGETPASSWD(buf, bufSz) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
5076
        return -1;
5077
    }
5078
    (void)v; /* fgets always sanity checks size of input vs buffer */
5079
    return 0;
5080
}
5081
#endif /* WOLFSSL_APACHE_HTTPD */
5082
5083
#if !defined(NO_PWDBASED) && !defined(NO_SHA) && !defined(NO_HMAC)
5084
int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
5085
                                               const unsigned char *salt,
5086
                                               int saltlen, int iter,
5087
                                               int keylen, unsigned char *out)
5088
0
{
5089
0
    const char *nostring = "";
5090
0
    int ret = 0;
5091
5092
0
    if (pass == NULL) {
5093
0
        passlen = 0;
5094
0
        pass = nostring;
5095
0
    }
5096
0
    else if (passlen == -1) {
5097
0
        passlen = (int)XSTRLEN(pass);
5098
0
    }
5099
5100
0
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5101
0
                    iter, keylen, WC_SHA);
5102
0
    if (ret == 0)
5103
0
        return WOLFSSL_SUCCESS;
5104
0
    else
5105
0
        return WOLFSSL_FAILURE;
5106
0
}
5107
#endif /* !NO_PWDBASED !NO_SHA*/
5108
5109
#if !defined(NO_PWDBASED) && !defined(NO_HMAC)
5110
int wolfSSL_PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
5111
                                           const unsigned char *salt,
5112
                                           int saltlen, int iter,
5113
                                           const WOLFSSL_EVP_MD *digest,
5114
                                           int keylen, unsigned char *out)
5115
482
{
5116
482
    const char *nostring = "";
5117
482
    int ret = 0;
5118
482
    enum wc_HashType pbkdf2HashType;
5119
5120
482
    if (pass == NULL) {
5121
264
        passlen = 0;
5122
264
        pass = nostring;
5123
264
    } else if (passlen == -1) {
5124
0
        passlen = (int)XSTRLEN(pass);
5125
0
    }
5126
5127
482
    pbkdf2HashType = EvpMd2MacType(digest);
5128
5129
482
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5130
482
                    iter, keylen, pbkdf2HashType);
5131
482
    if (ret == 0)
5132
411
        return WOLFSSL_SUCCESS;
5133
71
    else
5134
71
        return WOLFSSL_FAILURE;
5135
482
}
5136
#endif /* !NO_PWDBASED */
5137
5138
5139
#if defined(HAVE_SCRYPT) && defined(HAVE_PBKDF2) && !defined(NO_PWDBASED) && \
5140
                                                    !defined(NO_SHA256)
5141
/**
5142
 * Derives a key from the specified password and the salt using SCRYPT
5143
 * algorithm.
5144
 *
5145
 * Parameters:
5146
 * - pass      :password data. no need to be null-terminated. NULL is accepted.
5147
 * - passlen   :length of the password. Must be 0 when pass is NULL.
5148
 * - salt      :salt. NULL is accepted.
5149
 * - saltlen   :length of the salt. Must be 0 when salt is NULL.
5150
 * - N         :cost parameter. Must be grater or equal to 2 and be a power of 2.
5151
 * - r         :block size. Must 1 or greater.
5152
 * - p         :parallelism
5153
 * - maxmem    :maximum size of buffer used for calculation in definition,
5154
 *              Not referred in this implementation.
5155
 * - key       :derived key.
5156
 * - keylen    :length of the derived key
5157
 *
5158
 * Returns:
5159
 *   1 on success, otherwise 0.
5160
 */
5161
int wolfSSL_EVP_PBE_scrypt(const char *pass, size_t passlen,
5162
                            const unsigned char *salt, size_t saltlen,
5163
                            word64 N, word64 r, word64 p,
5164
                            word64 maxmem, unsigned char *key, size_t keylen)
5165
0
{
5166
0
    int ret;
5167
0
    int exp = 0;
5168
5169
0
    (void)maxmem;
5170
5171
0
    WOLFSSL_ENTER("wolfSSL_EVP_PBE_scrypt");
5172
5173
0
    if (r > INT32_MAX || p > INT32_MAX) {
5174
0
        WOLFSSL_MSG("Doesn't support greater than 32 bit values of r and p");
5175
0
        return WOLFSSL_FAILURE;
5176
0
    }
5177
    /* N must be a power of 2 and > 2.
5178
       if (N & (N-1)) is zero, it means N is a power of 2.
5179
     */
5180
0
    if (N < 2 || (N & (N-1)) || r <= 0 || p <= 0)
5181
0
        return WOLFSSL_FAILURE;
5182
5183
0
    if (key == NULL)
5184
0
        return WOLFSSL_SUCCESS;
5185
5186
    /* get exponent of power of 2. Confirmed N is power of 2. */
5187
0
    while (N != 1) {
5188
0
        N >>= 1;
5189
0
        exp++;
5190
0
    }
5191
5192
0
    ret = wc_scrypt(key, (const byte*)pass, (int)passlen, salt, (int)saltlen,
5193
0
                                            exp, (int)r, (int)p, (int)keylen);
5194
5195
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PBE_scrypt", ret);
5196
5197
0
    if (ret == 0)
5198
0
        return WOLFSSL_SUCCESS;
5199
0
    else
5200
0
        return WOLFSSL_FAILURE;
5201
0
}
5202
#endif /* HAVE_SCRYPT && HAVE_PBKDF2 && !NO_PWDBASED && !NO_SHA */
5203
5204
static const struct cipher{
5205
        unsigned char type;
5206
        const char *name;
5207
        int nid;
5208
} cipher_tbl[] = {
5209
5210
#ifndef NO_AES
5211
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5212
    #ifdef WOLFSSL_AES_128
5213
    {WC_AES_128_CBC_TYPE, EVP_AES_128_CBC, WC_NID_aes_128_cbc},
5214
    #endif
5215
    #ifdef WOLFSSL_AES_192
5216
    {WC_AES_192_CBC_TYPE, EVP_AES_192_CBC, WC_NID_aes_192_cbc},
5217
    #endif
5218
    #ifdef WOLFSSL_AES_256
5219
    {WC_AES_256_CBC_TYPE, EVP_AES_256_CBC, WC_NID_aes_256_cbc},
5220
    #endif
5221
    #endif
5222
5223
    #ifdef WOLFSSL_AES_CFB
5224
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5225
    #ifdef WOLFSSL_AES_128
5226
    {WC_AES_128_CFB1_TYPE, EVP_AES_128_CFB1, WC_NID_aes_128_cfb1},
5227
    #endif
5228
    #ifdef WOLFSSL_AES_192
5229
    {WC_AES_192_CFB1_TYPE, EVP_AES_192_CFB1, WC_NID_aes_192_cfb1},
5230
    #endif
5231
    #ifdef WOLFSSL_AES_256
5232
    {WC_AES_256_CFB1_TYPE, EVP_AES_256_CFB1, WC_NID_aes_256_cfb1},
5233
    #endif
5234
5235
    #ifdef WOLFSSL_AES_128
5236
    {WC_AES_128_CFB8_TYPE, EVP_AES_128_CFB8, WC_NID_aes_128_cfb8},
5237
    #endif
5238
    #ifdef WOLFSSL_AES_192
5239
    {WC_AES_192_CFB8_TYPE, EVP_AES_192_CFB8, WC_NID_aes_192_cfb8},
5240
    #endif
5241
    #ifdef WOLFSSL_AES_256
5242
    {WC_AES_256_CFB8_TYPE, EVP_AES_256_CFB8, WC_NID_aes_256_cfb8},
5243
    #endif
5244
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5245
5246
    #ifdef WOLFSSL_AES_128
5247
    {WC_AES_128_CFB128_TYPE, EVP_AES_128_CFB128, WC_NID_aes_128_cfb128},
5248
    #endif
5249
    #ifdef WOLFSSL_AES_192
5250
    {WC_AES_192_CFB128_TYPE, EVP_AES_192_CFB128, WC_NID_aes_192_cfb128},
5251
    #endif
5252
    #ifdef WOLFSSL_AES_256
5253
    {WC_AES_256_CFB128_TYPE, EVP_AES_256_CFB128, WC_NID_aes_256_cfb128},
5254
    #endif
5255
    #endif /* WOLFSSL_AES_CFB */
5256
5257
    #ifdef WOLFSSL_AES_OFB
5258
    #ifdef WOLFSSL_AES_128
5259
    {WC_AES_128_OFB_TYPE, EVP_AES_128_OFB, WC_NID_aes_128_ofb},
5260
    #endif
5261
    #ifdef WOLFSSL_AES_192
5262
    {WC_AES_192_OFB_TYPE, EVP_AES_192_OFB, WC_NID_aes_192_ofb},
5263
    #endif
5264
    #ifdef WOLFSSL_AES_256
5265
    {WC_AES_256_OFB_TYPE, EVP_AES_256_OFB, WC_NID_aes_256_ofb},
5266
    #endif
5267
    #endif
5268
5269
    #if defined(WOLFSSL_AES_XTS) && \
5270
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
5271
    #ifdef WOLFSSL_AES_128
5272
    {WC_AES_128_XTS_TYPE, EVP_AES_128_XTS, WC_NID_aes_128_xts},
5273
    #endif
5274
    #ifdef WOLFSSL_AES_256
5275
    {WC_AES_256_XTS_TYPE, EVP_AES_256_XTS, WC_NID_aes_256_xts},
5276
    #endif
5277
    #endif
5278
5279
    #ifdef HAVE_AESGCM
5280
    #ifdef WOLFSSL_AES_128
5281
    {WC_AES_128_GCM_TYPE, EVP_AES_128_GCM, WC_NID_aes_128_gcm},
5282
    #endif
5283
    #ifdef WOLFSSL_AES_192
5284
    {WC_AES_192_GCM_TYPE, EVP_AES_192_GCM, WC_NID_aes_192_gcm},
5285
    #endif
5286
    #ifdef WOLFSSL_AES_256
5287
    {WC_AES_256_GCM_TYPE, EVP_AES_256_GCM, WC_NID_aes_256_gcm},
5288
    #endif
5289
    #endif
5290
5291
    #ifdef HAVE_AESCCM
5292
    #ifdef WOLFSSL_AES_128
5293
    {WC_AES_128_CCM_TYPE, EVP_AES_128_CCM, WC_NID_aes_128_ccm},
5294
    #endif
5295
    #ifdef WOLFSSL_AES_192
5296
    {WC_AES_192_CCM_TYPE, EVP_AES_192_CCM, WC_NID_aes_192_ccm},
5297
    #endif
5298
    #ifdef WOLFSSL_AES_256
5299
    {WC_AES_256_CCM_TYPE, EVP_AES_256_CCM, WC_NID_aes_256_ccm},
5300
    #endif
5301
    #endif
5302
5303
    #ifdef WOLFSSL_AES_COUNTER
5304
    #ifdef WOLFSSL_AES_128
5305
        {WC_AES_128_CTR_TYPE, EVP_AES_128_CTR, WC_NID_aes_128_ctr},
5306
    #endif
5307
    #ifdef WOLFSSL_AES_192
5308
        {WC_AES_192_CTR_TYPE, EVP_AES_192_CTR, WC_NID_aes_192_ctr},
5309
    #endif
5310
    #ifdef WOLFSSL_AES_256
5311
        {WC_AES_256_CTR_TYPE, EVP_AES_256_CTR, WC_NID_aes_256_ctr},
5312
    #endif
5313
    #endif
5314
5315
    #ifdef HAVE_AES_ECB
5316
    #ifdef WOLFSSL_AES_128
5317
        {WC_AES_128_ECB_TYPE, EVP_AES_128_ECB, WC_NID_aes_128_ecb},
5318
    #endif
5319
    #ifdef WOLFSSL_AES_192
5320
        {WC_AES_192_ECB_TYPE, EVP_AES_192_ECB, WC_NID_aes_192_ecb},
5321
    #endif
5322
    #ifdef WOLFSSL_AES_256
5323
        {WC_AES_256_ECB_TYPE, EVP_AES_256_ECB, WC_NID_aes_256_ecb},
5324
    #endif
5325
    #endif
5326
#endif
5327
5328
#ifdef HAVE_ARIA
5329
    {WC_ARIA_128_GCM_TYPE, EVP_ARIA_128_GCM, WC_NID_aria_128_gcm},
5330
    {WC_ARIA_192_GCM_TYPE, EVP_ARIA_192_GCM, WC_NID_aria_192_gcm},
5331
    {WC_ARIA_256_GCM_TYPE, EVP_ARIA_256_GCM, WC_NID_aria_256_gcm},
5332
#endif
5333
5334
#ifndef NO_DES3
5335
    {WC_DES_CBC_TYPE, EVP_DES_CBC, WC_NID_des_cbc},
5336
    {WC_DES_ECB_TYPE, EVP_DES_ECB, WC_NID_des_ecb},
5337
5338
    {WC_DES_EDE3_CBC_TYPE, EVP_DES_EDE3_CBC, WC_NID_des_ede3_cbc},
5339
    {WC_DES_EDE3_ECB_TYPE, EVP_DES_EDE3_ECB, WC_NID_des_ede3_ecb},
5340
#endif
5341
5342
#ifndef NO_RC4
5343
    {WC_ARC4_TYPE, EVP_ARC4, WC_NID_undef},
5344
#endif
5345
5346
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5347
    {WC_CHACHA20_POLY1305_TYPE, EVP_CHACHA20_POLY1305, WC_NID_chacha20_poly1305},
5348
#endif
5349
5350
#ifdef HAVE_CHACHA
5351
    {WC_CHACHA20_TYPE, EVP_CHACHA20, WC_NID_chacha20},
5352
#endif
5353
5354
#ifdef WOLFSSL_SM4_ECB
5355
    {WC_SM4_ECB_TYPE, EVP_SM4_ECB, WC_NID_sm4_ecb},
5356
#endif
5357
#ifdef WOLFSSL_SM4_CBC
5358
    {WC_SM4_CBC_TYPE, EVP_SM4_CBC, WC_NID_sm4_cbc},
5359
#endif
5360
#ifdef WOLFSSL_SM4_CTR
5361
    {WC_SM4_CTR_TYPE, EVP_SM4_CTR, WC_NID_sm4_ctr},
5362
#endif
5363
#ifdef WOLFSSL_SM4_GCM
5364
    {WC_SM4_GCM_TYPE, EVP_SM4_GCM, WC_NID_sm4_gcm},
5365
#endif
5366
#ifdef WOLFSSL_SM4_CCM
5367
    {WC_SM4_CCM_TYPE, EVP_SM4_CCM, WC_NID_sm4_ccm},
5368
#endif
5369
5370
    { 0, NULL, 0}
5371
};
5372
5373
/* returns cipher using provided ctx type */
5374
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_CIPHER_CTX_cipher(
5375
    const WOLFSSL_EVP_CIPHER_CTX *ctx)
5376
0
{
5377
0
    const struct cipher* c;
5378
5379
0
    if (!ctx || !ctx->cipherType) {
5380
0
        return NULL;
5381
0
    }
5382
5383
0
    for (c = cipher_tbl; c->type != 0; c++) {
5384
0
        if (ctx->cipherType == c->type) {
5385
0
            return wolfSSL_EVP_get_cipherbyname(c->name);
5386
0
        }
5387
0
    }
5388
5389
0
    return NULL;
5390
0
}
5391
5392
int wolfSSL_EVP_CIPHER_nid(const WOLFSSL_EVP_CIPHER *cipher)
5393
0
{
5394
0
    const struct cipher* c;
5395
5396
0
    if (!cipher) {
5397
0
        return 0;
5398
0
    }
5399
5400
0
    for (c = cipher_tbl; c->type != 0; c++) {
5401
0
        if (XSTRCMP(cipher, c->name) == 0) {
5402
0
            return c->nid;
5403
0
        }
5404
0
    }
5405
5406
0
    return 0;
5407
0
}
5408
5409
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbyname(const char *name)
5410
0
{
5411
0
    const struct alias {
5412
0
        const char *name;
5413
0
        const char *alias;
5414
0
    } cipher_alias_tbl[] = {
5415
0
#ifndef NO_DES3
5416
0
        {EVP_DES_CBC, "des"},
5417
0
        {EVP_DES_ECB, "des-ecb"},
5418
0
        {EVP_DES_EDE3_CBC, "des3"},
5419
0
        {EVP_DES_EDE3_CBC, "3des"},
5420
0
        {EVP_DES_EDE3_ECB, "des-ede3"},
5421
0
        {EVP_DES_EDE3_ECB, "des-ede3-ecb"},
5422
0
#endif
5423
0
#ifndef NO_AES
5424
0
    #ifdef HAVE_AES_CBC
5425
0
        #ifdef WOLFSSL_AES_128
5426
0
            {EVP_AES_128_CBC, "aes128-cbc"},
5427
0
            {EVP_AES_128_CBC, "aes128"},
5428
0
        #endif
5429
0
        #ifdef WOLFSSL_AES_192
5430
0
            {EVP_AES_192_CBC, "aes192-cbc"},
5431
0
            {EVP_AES_192_CBC, "aes192"},
5432
0
        #endif
5433
0
        #ifdef WOLFSSL_AES_256
5434
0
            {EVP_AES_256_CBC, "aes256-cbc"},
5435
0
            {EVP_AES_256_CBC, "aes256"},
5436
0
        #endif
5437
0
    #endif
5438
0
    #ifdef HAVE_AES_ECB
5439
0
        #ifdef WOLFSSL_AES_128
5440
0
            {EVP_AES_128_ECB, "aes128-ecb"},
5441
0
        #endif
5442
0
        #ifdef WOLFSSL_AES_192
5443
0
            {EVP_AES_192_ECB, "aes192-ecb"},
5444
0
        #endif
5445
0
        #ifdef WOLFSSL_AES_256
5446
0
            {EVP_AES_256_ECB, "aes256-ecb"},
5447
0
        #endif
5448
0
    #endif
5449
0
    #ifdef HAVE_AESGCM
5450
0
        #ifdef WOLFSSL_AES_128
5451
0
            {EVP_AES_128_GCM, "aes-128-gcm"},
5452
0
            {EVP_AES_128_GCM, "id-aes128-GCM"},
5453
0
        #endif
5454
0
        #ifdef WOLFSSL_AES_192
5455
0
            {EVP_AES_192_GCM, "aes-192-gcm"},
5456
0
            {EVP_AES_192_GCM, "id-aes192-GCM"},
5457
0
        #endif
5458
0
        #ifdef WOLFSSL_AES_256
5459
0
            {EVP_AES_256_GCM, "aes-256-gcm"},
5460
0
            {EVP_AES_256_GCM, "id-aes256-GCM"},
5461
0
        #endif
5462
0
    #endif
5463
0
    #ifdef HAVE_AESCCM
5464
0
        #ifdef WOLFSSL_AES_128
5465
0
            {EVP_AES_128_CCM, "aes-128-ccm"},
5466
0
            {EVP_AES_128_CCM, "id-aes128-CCM"},
5467
0
        #endif
5468
0
        #ifdef WOLFSSL_AES_192
5469
0
            {EVP_AES_192_CCM, "aes-192-ccm"},
5470
0
            {EVP_AES_192_CCM, "id-aes192-CCM"},
5471
0
        #endif
5472
0
        #ifdef WOLFSSL_AES_256
5473
0
            {EVP_AES_256_CCM, "aes-256-ccm"},
5474
0
            {EVP_AES_256_CCM, "id-aes256-CCM"},
5475
0
        #endif
5476
0
    #endif
5477
0
#endif
5478
#ifdef HAVE_ARIA
5479
        {EVP_ARIA_128_GCM, "aria-128-gcm"},
5480
        {EVP_ARIA_128_GCM, "id-aria128-GCM"},
5481
        {EVP_ARIA_192_GCM, "aria-192-gcm"},
5482
        {EVP_ARIA_192_GCM, "id-aria192-GCM"},
5483
        {EVP_ARIA_256_GCM, "aria-256-gcm"},
5484
        {EVP_ARIA_256_GCM, "id-aria256-GCM"},
5485
#endif
5486
#ifdef WOLFSSL_SM4_EBC
5487
        {EVP_SM4_ECB, "sm4-ecb"},
5488
#endif
5489
0
#ifdef WOLFSSL_SM4_CBC
5490
0
        {EVP_SM4_CBC, "sm4"},
5491
0
        {EVP_SM4_CBC, "sm4-cbc"},
5492
0
#endif
5493
0
#ifdef WOLFSSL_SM4_CTR
5494
0
        {EVP_SM4_CTR, "sm4-ctr"},
5495
0
#endif
5496
0
#ifdef WOLFSSL_SM4_GCM
5497
0
        {EVP_SM4_GCM, "sm4-gcm"},
5498
0
#endif
5499
0
#ifdef WOLFSSL_SM4_CCM
5500
0
        {EVP_SM4_CCM, "sm4-ccm"},
5501
0
#endif
5502
0
#ifndef NO_RC4
5503
0
        {EVP_ARC4, "RC4"},
5504
0
#endif
5505
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5506
0
        {EVP_CHACHA20_POLY1305, "chacha20-poly1305"},
5507
0
#endif
5508
0
#ifdef HAVE_CHACHA
5509
0
        {EVP_CHACHA20, "chacha20"},
5510
0
#endif
5511
0
        { NULL, NULL}
5512
0
    };
5513
5514
0
    const struct cipher *ent;
5515
0
    const struct alias  *al;
5516
5517
0
    WOLFSSL_ENTER("EVP_get_cipherbyname");
5518
5519
0
    for (al = cipher_alias_tbl; al->name != NULL; al++) {
5520
        /* Accept any case alternative version of an alias. */
5521
0
        if (XSTRCASECMP(name, al->alias) == 0) {
5522
0
            name = al->name;
5523
0
            break;
5524
0
        }
5525
0
    }
5526
5527
0
    for (ent = cipher_tbl; ent->name != NULL; ent++) {
5528
        /* Accept any case alternative version of name. */
5529
0
        if (XSTRCASECMP(name, ent->name) == 0) {
5530
0
            return (WOLFSSL_EVP_CIPHER *)ent->name;
5531
0
        }
5532
0
    }
5533
5534
0
    return NULL;
5535
0
}
5536
5537
/*
5538
 * return an EVP_CIPHER structure when cipher NID is passed.
5539
 *
5540
 * id  cipher NID
5541
 *
5542
 * return WOLFSSL_EVP_CIPHER
5543
*/
5544
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbynid(int id)
5545
0
{
5546
0
    WOLFSSL_ENTER("EVP_get_cipherbynid");
5547
5548
0
    switch(id) {
5549
5550
0
#ifndef NO_AES
5551
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5552
0
        #ifdef WOLFSSL_AES_128
5553
0
        case WC_NID_aes_128_cbc:
5554
0
            return wolfSSL_EVP_aes_128_cbc();
5555
0
        #endif
5556
0
        #ifdef WOLFSSL_AES_192
5557
0
        case WC_NID_aes_192_cbc:
5558
0
            return wolfSSL_EVP_aes_192_cbc();
5559
0
        #endif
5560
0
        #ifdef WOLFSSL_AES_256
5561
0
        case WC_NID_aes_256_cbc:
5562
0
            return wolfSSL_EVP_aes_256_cbc();
5563
0
        #endif
5564
0
    #endif
5565
0
    #ifdef WOLFSSL_AES_COUNTER
5566
0
        #ifdef WOLFSSL_AES_128
5567
0
        case WC_NID_aes_128_ctr:
5568
0
            return wolfSSL_EVP_aes_128_ctr();
5569
0
        #endif
5570
0
        #ifdef WOLFSSL_AES_192
5571
0
        case WC_NID_aes_192_ctr:
5572
0
            return wolfSSL_EVP_aes_192_ctr();
5573
0
        #endif
5574
0
        #ifdef WOLFSSL_AES_256
5575
0
        case WC_NID_aes_256_ctr:
5576
0
            return wolfSSL_EVP_aes_256_ctr();
5577
0
        #endif
5578
0
    #endif /* WOLFSSL_AES_COUNTER */
5579
0
    #ifdef HAVE_AES_ECB
5580
0
        #ifdef WOLFSSL_AES_128
5581
0
        case WC_NID_aes_128_ecb:
5582
0
            return wolfSSL_EVP_aes_128_ecb();
5583
0
        #endif
5584
0
        #ifdef WOLFSSL_AES_192
5585
0
        case WC_NID_aes_192_ecb:
5586
0
            return wolfSSL_EVP_aes_192_ecb();
5587
0
        #endif
5588
0
        #ifdef WOLFSSL_AES_256
5589
0
        case WC_NID_aes_256_ecb:
5590
0
            return wolfSSL_EVP_aes_256_ecb();
5591
0
        #endif
5592
0
    #endif /* HAVE_AES_ECB */
5593
0
    #ifdef HAVE_AESGCM
5594
0
        #ifdef WOLFSSL_AES_128
5595
0
        case WC_NID_aes_128_gcm:
5596
0
            return wolfSSL_EVP_aes_128_gcm();
5597
0
        #endif
5598
0
        #ifdef WOLFSSL_AES_192
5599
0
        case WC_NID_aes_192_gcm:
5600
0
            return wolfSSL_EVP_aes_192_gcm();
5601
0
        #endif
5602
0
        #ifdef WOLFSSL_AES_256
5603
0
        case WC_NID_aes_256_gcm:
5604
0
            return wolfSSL_EVP_aes_256_gcm();
5605
0
        #endif
5606
0
    #endif
5607
0
    #ifdef HAVE_AESCCM
5608
0
        #ifdef WOLFSSL_AES_128
5609
0
        case WC_NID_aes_128_ccm:
5610
0
            return wolfSSL_EVP_aes_128_ccm();
5611
0
        #endif
5612
0
        #ifdef WOLFSSL_AES_192
5613
0
        case WC_NID_aes_192_ccm:
5614
0
            return wolfSSL_EVP_aes_192_ccm();
5615
0
        #endif
5616
0
        #ifdef WOLFSSL_AES_256
5617
0
        case WC_NID_aes_256_ccm:
5618
0
            return wolfSSL_EVP_aes_256_ccm();
5619
0
        #endif
5620
0
    #endif
5621
0
#endif
5622
5623
#ifdef HAVE_ARIA
5624
    case WC_NID_aria_128_gcm:
5625
        return wolfSSL_EVP_aria_128_gcm();
5626
    case WC_NID_aria_192_gcm:
5627
        return wolfSSL_EVP_aria_192_gcm();
5628
    case WC_NID_aria_256_gcm:
5629
        return wolfSSL_EVP_aria_256_gcm();
5630
#endif
5631
5632
0
#ifndef NO_DES3
5633
0
        case WC_NID_des_cbc:
5634
0
            return wolfSSL_EVP_des_cbc();
5635
0
#ifdef WOLFSSL_DES_ECB
5636
0
        case WC_NID_des_ecb:
5637
0
            return wolfSSL_EVP_des_ecb();
5638
0
#endif
5639
0
        case WC_NID_des_ede3_cbc:
5640
0
            return wolfSSL_EVP_des_ede3_cbc();
5641
0
#ifdef WOLFSSL_DES_ECB
5642
0
        case WC_NID_des_ede3_ecb:
5643
0
            return wolfSSL_EVP_des_ede3_ecb();
5644
0
#endif
5645
0
#endif /*NO_DES3*/
5646
5647
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5648
0
        case WC_NID_chacha20_poly1305:
5649
0
            return wolfSSL_EVP_chacha20_poly1305();
5650
0
#endif
5651
5652
0
#ifdef HAVE_CHACHA
5653
0
        case WC_NID_chacha20:
5654
0
            return wolfSSL_EVP_chacha20();
5655
0
#endif
5656
5657
0
#ifdef WOLFSSL_SM4_ECB
5658
0
        case WC_NID_sm4_ecb:
5659
0
            return wolfSSL_EVP_sm4_ecb();
5660
0
#endif
5661
0
#ifdef WOLFSSL_SM4_CBC
5662
0
        case WC_NID_sm4_cbc:
5663
0
            return wolfSSL_EVP_sm4_cbc();
5664
0
#endif
5665
0
#ifdef WOLFSSL_SM4_CTR
5666
0
        case WC_NID_sm4_ctr:
5667
0
            return wolfSSL_EVP_sm4_ctr();
5668
0
#endif
5669
0
#ifdef WOLFSSL_SM4_GCM
5670
0
        case WC_NID_sm4_gcm:
5671
0
            return wolfSSL_EVP_sm4_gcm();
5672
0
#endif
5673
0
#ifdef WOLFSSL_SM4_CCM
5674
0
        case WC_NID_sm4_ccm:
5675
0
            return wolfSSL_EVP_sm4_ccm();
5676
0
#endif
5677
5678
0
        default:
5679
0
            WOLFSSL_MSG("Bad cipher id value");
5680
0
    }
5681
5682
0
    return NULL;
5683
0
}
5684
5685
void wolfSSL_EVP_init(void)
5686
16
{
5687
    /* Does nothing. */
5688
16
}
5689
5690
    /* returns WOLFSSL_SUCCESS on success */
5691
    int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5692
0
    {
5693
0
        return wolfSSL_EVP_MD_CTX_copy_ex(out, in);
5694
0
    }
5695
    /* Deep copy of EVP_MD hasher
5696
     * return WOLFSSL_SUCCESS on success */
5697
    static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des,
5698
            const WOLFSSL_EVP_MD_CTX* src)
5699
0
    {
5700
0
        if (src->isHMAC) {
5701
0
            return wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac);
5702
0
        }
5703
0
        else {
5704
0
            int ret;
5705
5706
0
            switch (src->macType) {
5707
0
                case WC_HASH_TYPE_MD5:
5708
0
            #ifndef NO_MD5
5709
0
                    ret = wc_Md5Copy((wc_Md5*)&src->hash.digest,
5710
0
                            (wc_Md5*)&des->hash.digest);
5711
            #else
5712
                    ret = NOT_COMPILED_IN;
5713
            #endif /* !NO_MD5 */
5714
0
                    break;
5715
0
                case WC_HASH_TYPE_SHA:
5716
0
            #ifndef NO_SHA
5717
0
                    ret = wc_ShaCopy((wc_Sha*)&src->hash.digest,
5718
0
                            (wc_Sha*)&des->hash.digest);
5719
            #else
5720
                    ret = NOT_COMPILED_IN;
5721
            #endif /* !NO_SHA */
5722
0
                    break;
5723
0
                case WC_HASH_TYPE_SHA224:
5724
0
            #ifdef WOLFSSL_SHA224
5725
0
                    ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest,
5726
0
                            (wc_Sha224*)&des->hash.digest);
5727
            #else
5728
                    ret = NOT_COMPILED_IN;
5729
            #endif /* WOLFSSL_SHA224 */
5730
0
                    break;
5731
0
                case WC_HASH_TYPE_SHA256:
5732
0
            #ifndef NO_SHA256
5733
0
                    ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest,
5734
0
                            (wc_Sha256*)&des->hash.digest);
5735
            #else
5736
                    ret = NOT_COMPILED_IN;
5737
            #endif /* !NO_SHA256 */
5738
0
                    break;
5739
0
                case WC_HASH_TYPE_SHA384:
5740
0
            #ifdef WOLFSSL_SHA384
5741
0
                    ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest,
5742
0
                            (wc_Sha384*)&des->hash.digest);
5743
            #else
5744
                    ret = NOT_COMPILED_IN;
5745
            #endif /* WOLFSSL_SHA384 */
5746
0
                    break;
5747
0
                case WC_HASH_TYPE_SHA512:
5748
0
            #ifdef WOLFSSL_SHA512
5749
0
                    ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest,
5750
0
                        (wc_Sha512*)&des->hash.digest);
5751
            #else
5752
                    ret = NOT_COMPILED_IN;
5753
            #endif /* WOLFSSL_SHA512 */
5754
0
                    break;
5755
0
            #ifndef WOLFSSL_NOSHA512_224
5756
0
                case WC_HASH_TYPE_SHA512_224:
5757
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5758
0
                defined(WOLFSSL_SHA512)
5759
0
                    ret = wc_Sha512_224Copy((wc_Sha512*)&src->hash.digest,
5760
0
                        (wc_Sha512*)&des->hash.digest);
5761
            #else
5762
                    ret = NOT_COMPILED_IN;
5763
            #endif
5764
0
                    break;
5765
0
            #endif /* !WOLFSSL_NOSHA512_224 */
5766
0
            #ifndef WOLFSSL_NOSHA512_256
5767
0
                case WC_HASH_TYPE_SHA512_256:
5768
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5769
0
                defined(WOLFSSL_SHA512)
5770
0
                    ret = wc_Sha512_256Copy((wc_Sha512*)&src->hash.digest,
5771
0
                        (wc_Sha512*)&des->hash.digest);
5772
            #else
5773
                    ret = NOT_COMPILED_IN;
5774
            #endif
5775
0
                    break;
5776
0
            #endif /* !WOLFSSL_NOSHA512_256 */
5777
0
                case WC_HASH_TYPE_SHA3_224:
5778
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
5779
0
                    ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest,
5780
0
                            (wc_Sha3*)&des->hash.digest);
5781
            #else
5782
                    ret = NOT_COMPILED_IN;
5783
            #endif
5784
0
                    break;
5785
0
                case WC_HASH_TYPE_SHA3_256:
5786
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
5787
0
                    ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest,
5788
0
                            (wc_Sha3*)&des->hash.digest);
5789
            #else
5790
                    ret = NOT_COMPILED_IN;
5791
            #endif
5792
0
                    break;
5793
0
                case WC_HASH_TYPE_SHA3_384:
5794
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
5795
0
                    ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest,
5796
0
                            (wc_Sha3*)&des->hash.digest);
5797
            #else
5798
                    ret = NOT_COMPILED_IN;
5799
            #endif
5800
0
                    break;
5801
0
                case WC_HASH_TYPE_SHA3_512:
5802
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
5803
0
                    ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest,
5804
0
                        (wc_Sha3*)&des->hash.digest);
5805
            #else
5806
                    ret = NOT_COMPILED_IN;
5807
            #endif
5808
0
                    break;
5809
0
            #ifdef WOLFSSL_SM3
5810
0
                case WC_HASH_TYPE_SM3:
5811
0
                    ret = wc_Sm3Copy(&src->hash.digest.sm3,
5812
0
                        &des->hash.digest.sm3);
5813
0
                    break;
5814
0
            #endif
5815
0
                case WC_HASH_TYPE_NONE:
5816
0
                case WC_HASH_TYPE_MD2:
5817
0
                case WC_HASH_TYPE_MD4:
5818
0
                case WC_HASH_TYPE_MD5_SHA:
5819
0
                case WC_HASH_TYPE_BLAKE2B:
5820
0
                case WC_HASH_TYPE_BLAKE2S:
5821
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
5822
0
                case WC_HASH_TYPE_SHAKE128:
5823
0
            #endif
5824
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
5825
0
                case WC_HASH_TYPE_SHAKE256:
5826
0
            #endif
5827
0
                default:
5828
0
                    ret = BAD_FUNC_ARG;
5829
0
                    break;
5830
0
            }
5831
0
            return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
5832
0
        }
5833
0
    }
5834
5835
    /* copies structure in to the structure out
5836
     *
5837
     * returns WOLFSSL_SUCCESS on success */
5838
    int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5839
0
    {
5840
0
        if ((out == NULL) || (in == NULL)) return WOLFSSL_FAILURE;
5841
0
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_copy_ex");
5842
0
        wolfSSL_EVP_MD_CTX_cleanup(out);
5843
0
        XMEMCPY(out, in, sizeof(WOLFSSL_EVP_MD_CTX));
5844
0
        if (in->pctx != NULL) {
5845
0
            out->pctx = wolfSSL_EVP_PKEY_CTX_new(in->pctx->pkey, NULL);
5846
0
            if (out->pctx == NULL)
5847
0
                return WOLFSSL_FAILURE;
5848
0
        }
5849
0
        return wolfSSL_EVP_MD_Copy_Hasher(out, (WOLFSSL_EVP_MD_CTX*)in);
5850
0
    }
5851
    #ifndef NO_AES
5852
5853
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5854
    #ifdef WOLFSSL_AES_128
5855
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void)
5856
402
    {
5857
402
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cbc");
5858
402
        return EVP_AES_128_CBC;
5859
402
    }
5860
    #endif /* WOLFSSL_AES_128 */
5861
5862
5863
    #ifdef WOLFSSL_AES_192
5864
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void)
5865
144
    {
5866
144
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cbc");
5867
144
        return EVP_AES_192_CBC;
5868
144
    }
5869
    #endif /* WOLFSSL_AES_192 */
5870
5871
5872
    #ifdef WOLFSSL_AES_256
5873
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void)
5874
150
    {
5875
150
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cbc");
5876
150
        return EVP_AES_256_CBC;
5877
150
    }
5878
    #endif /* WOLFSSL_AES_256 */
5879
    #endif /* HAVE_AES_CBC */
5880
5881
    #ifdef WOLFSSL_AES_CFB
5882
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5883
    #ifdef WOLFSSL_AES_128
5884
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void)
5885
197
    {
5886
197
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1");
5887
197
        return EVP_AES_128_CFB1;
5888
197
    }
5889
    #endif /* WOLFSSL_AES_128 */
5890
5891
    #ifdef WOLFSSL_AES_192
5892
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void)
5893
52
    {
5894
52
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1");
5895
52
        return EVP_AES_192_CFB1;
5896
52
    }
5897
    #endif /* WOLFSSL_AES_192 */
5898
5899
    #ifdef WOLFSSL_AES_256
5900
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void)
5901
169
    {
5902
169
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1");
5903
169
        return EVP_AES_256_CFB1;
5904
169
    }
5905
    #endif /* WOLFSSL_AES_256 */
5906
5907
    #ifdef WOLFSSL_AES_128
5908
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void)
5909
169
    {
5910
169
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8");
5911
169
        return EVP_AES_128_CFB8;
5912
169
    }
5913
    #endif /* WOLFSSL_AES_128 */
5914
5915
    #ifdef WOLFSSL_AES_192
5916
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void)
5917
157
    {
5918
157
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8");
5919
157
        return EVP_AES_192_CFB8;
5920
157
    }
5921
    #endif /* WOLFSSL_AES_192 */
5922
5923
    #ifdef WOLFSSL_AES_256
5924
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void)
5925
129
    {
5926
129
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8");
5927
129
        return EVP_AES_256_CFB8;
5928
129
    }
5929
    #endif /* WOLFSSL_AES_256 */
5930
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5931
5932
    #ifdef WOLFSSL_AES_128
5933
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void)
5934
0
    {
5935
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128");
5936
0
        return EVP_AES_128_CFB128;
5937
0
    }
5938
    #endif /* WOLFSSL_AES_128 */
5939
5940
    #ifdef WOLFSSL_AES_192
5941
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void)
5942
0
    {
5943
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128");
5944
0
        return EVP_AES_192_CFB128;
5945
0
    }
5946
    #endif /* WOLFSSL_AES_192 */
5947
5948
    #ifdef WOLFSSL_AES_256
5949
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void)
5950
0
    {
5951
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128");
5952
0
        return EVP_AES_256_CFB128;
5953
0
    }
5954
    #endif /* WOLFSSL_AES_256 */
5955
    #endif /* WOLFSSL_AES_CFB */
5956
5957
    #ifdef WOLFSSL_AES_OFB
5958
    #ifdef WOLFSSL_AES_128
5959
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void)
5960
210
    {
5961
210
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb");
5962
210
        return EVP_AES_128_OFB;
5963
210
    }
5964
    #endif /* WOLFSSL_AES_128 */
5965
5966
    #ifdef WOLFSSL_AES_192
5967
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void)
5968
164
    {
5969
164
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb");
5970
164
        return EVP_AES_192_OFB;
5971
164
    }
5972
    #endif /* WOLFSSL_AES_192 */
5973
5974
    #ifdef WOLFSSL_AES_256
5975
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void)
5976
265
    {
5977
265
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb");
5978
265
        return EVP_AES_256_OFB;
5979
265
    }
5980
    #endif /* WOLFSSL_AES_256 */
5981
    #endif /* WOLFSSL_AES_OFB */
5982
5983
    #if defined(WOLFSSL_AES_XTS) && \
5984
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
5985
    #ifdef WOLFSSL_AES_128
5986
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void)
5987
419
    {
5988
419
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts");
5989
419
        return EVP_AES_128_XTS;
5990
419
    }
5991
    #endif /* WOLFSSL_AES_128 */
5992
5993
    #ifdef WOLFSSL_AES_256
5994
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void)
5995
133
    {
5996
133
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts");
5997
133
        return EVP_AES_256_XTS;
5998
133
    }
5999
    #endif /* WOLFSSL_AES_256 */
6000
    #endif /* WOLFSSL_AES_XTS &&
6001
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
6002
6003
    #ifdef HAVE_AESGCM
6004
    #ifdef WOLFSSL_AES_128
6005
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void)
6006
560
    {
6007
560
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_gcm");
6008
560
        return EVP_AES_128_GCM;
6009
560
    }
6010
    #endif /* WOLFSSL_GCM_128 */
6011
6012
    #ifdef WOLFSSL_AES_192
6013
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void)
6014
218
    {
6015
218
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_gcm");
6016
218
        return EVP_AES_192_GCM;
6017
218
    }
6018
    #endif /* WOLFSSL_AES_192 */
6019
6020
    #ifdef WOLFSSL_AES_256
6021
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_gcm(void)
6022
469
    {
6023
469
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_gcm");
6024
469
        return EVP_AES_256_GCM;
6025
469
    }
6026
    #endif /* WOLFSSL_AES_256 */
6027
    #endif /* HAVE_AESGCM */
6028
6029
    #ifdef HAVE_AESCCM
6030
    #ifdef WOLFSSL_AES_128
6031
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ccm(void)
6032
0
    {
6033
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ccm");
6034
0
        return EVP_AES_128_CCM;
6035
0
    }
6036
    #endif /* WOLFSSL_CCM_128 */
6037
6038
    #ifdef WOLFSSL_AES_192
6039
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ccm(void)
6040
0
    {
6041
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ccm");
6042
0
        return EVP_AES_192_CCM;
6043
0
    }
6044
    #endif /* WOLFSSL_AES_192 */
6045
6046
    #ifdef WOLFSSL_AES_256
6047
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ccm(void)
6048
0
    {
6049
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ccm");
6050
0
        return EVP_AES_256_CCM;
6051
0
    }
6052
    #endif /* WOLFSSL_AES_256 */
6053
    #endif /* HAVE_AESCCM */
6054
6055
    #ifdef WOLFSSL_AES_COUNTER
6056
    #ifdef WOLFSSL_AES_128
6057
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void)
6058
80
    {
6059
80
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ctr");
6060
80
        return EVP_AES_128_CTR;
6061
80
    }
6062
    #endif /* WOLFSSL_AES_2128 */
6063
6064
    #ifdef WOLFSSL_AES_192
6065
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void)
6066
421
    {
6067
421
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ctr");
6068
421
        return EVP_AES_192_CTR;
6069
421
    }
6070
    #endif /* WOLFSSL_AES_192 */
6071
6072
6073
    #ifdef WOLFSSL_AES_256
6074
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void)
6075
96
    {
6076
96
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ctr");
6077
96
        return EVP_AES_256_CTR;
6078
96
    }
6079
    #endif /* WOLFSSL_AES_256 */
6080
    #endif /* WOLFSSL_AES_COUNTER */
6081
6082
    #ifdef HAVE_AES_ECB
6083
    #ifdef WOLFSSL_AES_128
6084
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void)
6085
95
    {
6086
95
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ecb");
6087
95
        return EVP_AES_128_ECB;
6088
95
    }
6089
    #endif /* WOLFSSL_AES_128 */
6090
6091
6092
    #ifdef WOLFSSL_AES_192
6093
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void)
6094
122
    {
6095
122
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ecb");
6096
122
        return EVP_AES_192_ECB;
6097
122
    }
6098
    #endif /* WOLFSSL_AES_192*/
6099
6100
6101
    #ifdef WOLFSSL_AES_256
6102
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void)
6103
61
    {
6104
61
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ecb");
6105
61
        return EVP_AES_256_ECB;
6106
61
    }
6107
    #endif /* WOLFSSL_AES_256 */
6108
    #endif /* HAVE_AES_ECB */
6109
    #endif /* NO_AES */
6110
6111
#ifdef HAVE_ARIA
6112
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void)
6113
    {
6114
        WOLFSSL_ENTER("wolfSSL_EVP_aria_128_gcm");
6115
        return EVP_ARIA_128_GCM;
6116
    }
6117
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void)
6118
    {
6119
        WOLFSSL_ENTER("wolfSSL_EVP_aria_192_gcm");
6120
        return EVP_ARIA_192_GCM;
6121
    }
6122
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void)
6123
    {
6124
        WOLFSSL_ENTER("wolfSSL_EVP_aria_256_gcm");
6125
        return EVP_ARIA_256_GCM;
6126
    }
6127
#endif /* HAVE_ARIA */
6128
6129
#ifndef NO_DES3
6130
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void)
6131
243
    {
6132
243
        WOLFSSL_ENTER("wolfSSL_EVP_des_cbc");
6133
243
        return EVP_DES_CBC;
6134
243
    }
6135
#ifdef WOLFSSL_DES_ECB
6136
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void)
6137
447
    {
6138
447
        WOLFSSL_ENTER("wolfSSL_EVP_des_ecb");
6139
447
        return EVP_DES_ECB;
6140
447
    }
6141
#endif
6142
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void)
6143
195
    {
6144
195
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_cbc");
6145
195
        return EVP_DES_EDE3_CBC;
6146
195
    }
6147
#ifdef WOLFSSL_DES_ECB
6148
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void)
6149
0
    {
6150
0
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_ecb");
6151
0
        return EVP_DES_EDE3_ECB;
6152
0
    }
6153
#endif
6154
#endif /* NO_DES3 */
6155
6156
#ifndef NO_RC4
6157
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void)
6158
66
    {
6159
66
        WOLFSSL_ENTER("wolfSSL_EVP_rc4");
6160
66
        return EVP_ARC4;
6161
66
    }
6162
#endif
6163
6164
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6165
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20_poly1305(void)
6166
0
    {
6167
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20_poly1305");
6168
0
        return EVP_CHACHA20_POLY1305;
6169
0
    }
6170
#endif
6171
6172
#ifdef HAVE_CHACHA
6173
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20(void)
6174
0
    {
6175
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20");
6176
0
        return EVP_CHACHA20;
6177
0
    }
6178
#endif
6179
6180
#ifdef WOLFSSL_SM4_ECB
6181
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void)
6182
0
    {
6183
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ecb");
6184
0
        return EVP_SM4_ECB;
6185
0
    }
6186
#endif
6187
#ifdef WOLFSSL_SM4_CBC
6188
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void)
6189
0
    {
6190
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_cbc");
6191
0
        return EVP_SM4_CBC;
6192
0
    }
6193
#endif
6194
#ifdef WOLFSSL_SM4_CTR
6195
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void)
6196
0
    {
6197
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ctr");
6198
0
        return EVP_SM4_CTR;
6199
0
    }
6200
#endif
6201
#ifdef WOLFSSL_SM4_GCM
6202
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void)
6203
0
    {
6204
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_gcm");
6205
0
        return EVP_SM4_GCM;
6206
0
    }
6207
#endif
6208
#ifdef WOLFSSL_SM4_CCM
6209
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void)
6210
0
    {
6211
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ccm");
6212
0
        return EVP_SM4_CCM;
6213
0
    }
6214
#endif
6215
6216
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void)
6217
0
    {
6218
0
        WOLFSSL_ENTER("wolfSSL_EVP_enc_null");
6219
0
        return EVP_NULL;
6220
0
    }
6221
    void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx)
6222
8.14k
    {
6223
8.14k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_init");
6224
8.14k
        if (ctx) {
6225
8.14k
            XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_CIPHER_CTX));
6226
8.14k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;   /* not yet initialized */
6227
8.14k
            ctx->keyLen     = 0;
6228
8.14k
            ctx->enc        = 1;      /* start in encrypt mode */
6229
8.14k
        }
6230
8.14k
    }
6231
6232
    /* This function allows cipher specific parameters to be
6233
    determined and set. */
6234
    int wolfSSL_EVP_CIPHER_CTX_ctrl(WOLFSSL_EVP_CIPHER_CTX *ctx, int type, \
6235
                                    int arg, void *ptr)
6236
841
    {
6237
841
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6238
841
#if defined(HAVE_AESGCM) || (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6239
841
#ifndef WC_NO_RNG
6240
841
        WC_RNG rng;
6241
841
#endif
6242
841
#endif
6243
841
        if (ctx == NULL)
6244
0
            return WOLFSSL_FAILURE;
6245
6246
841
        (void)arg;
6247
841
        (void)ptr;
6248
6249
841
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_ctrl");
6250
6251
841
        switch(type) {
6252
0
            case WOLFSSL_EVP_CTRL_INIT:
6253
0
                wolfSSL_EVP_CIPHER_CTX_init(ctx);
6254
0
                if(ctx)
6255
0
                    ret = WOLFSSL_SUCCESS;
6256
0
                break;
6257
0
            case WOLFSSL_EVP_CTRL_SET_KEY_LENGTH:
6258
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg);
6259
0
                break;
6260
0
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6261
0
        defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \
6262
0
        (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6263
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IVLEN:
6264
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6265
0
                    break;
6266
0
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6267
0
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6268
0
                    if (arg != CHACHA20_POLY1305_AEAD_IV_SIZE) {
6269
0
                        break;
6270
0
                    }
6271
0
                }
6272
0
                else
6273
0
            #endif /* HAVE_CHACHA && HAVE_POLY1305 */
6274
0
            #if defined(WOLFSSL_SM4_GCM)
6275
0
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6276
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6277
0
                        break;
6278
0
                    }
6279
0
                }
6280
0
                else
6281
0
            #endif
6282
0
            #if defined(WOLFSSL_SM4_CCM)
6283
0
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6284
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6285
0
                        break;
6286
0
                    }
6287
0
                }
6288
0
                else
6289
0
            #endif
6290
0
                {
6291
0
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6292
0
                        break;
6293
0
                }
6294
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg);
6295
0
                break;
6296
6297
0
#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) || \
6298
0
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6299
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IV_FIXED:
6300
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6301
0
                    break;
6302
0
                if (arg == -1) {
6303
                    /* arg == -1 copies ctx->ivSz from ptr */
6304
0
                    ret = wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, (byte*)ptr, ctx->ivSz);
6305
0
                }
6306
0
#ifndef WC_NO_RNG
6307
0
                else {
6308
                    /*
6309
                     * Fixed field must be at least 4 bytes and invocation
6310
                     * field at least 8.
6311
                     */
6312
0
                    if ((arg < 4) || (ctx->ivSz - arg) < 8) {
6313
0
                        WOLFSSL_MSG("Fixed field or invocation field too short");
6314
0
                        break;
6315
0
                    }
6316
                    /* arg is 4...(ctx->ivSz - 8) */
6317
0
                    XMEMCPY(ctx->iv, ptr, (size_t)arg);
6318
0
                    if (wc_InitRng(&rng) != 0) {
6319
0
                        WOLFSSL_MSG("wc_InitRng failed");
6320
0
                        break;
6321
0
                    }
6322
0
                    if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg,
6323
0
                            (word32)(ctx->ivSz - arg)) == 0) {
6324
0
                        ret = WOLFSSL_SUCCESS;
6325
0
                    } else {
6326
                        /* rng is freed immediately after if block so no need
6327
                         * to do it here
6328
                         */
6329
0
                        WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
6330
0
                    }
6331
0
                    if (wc_FreeRng(&rng) != 0) {
6332
0
                        WOLFSSL_MSG("wc_FreeRng failed");
6333
0
                        ret = WOLFSSL_FAILURE;
6334
0
                        break;
6335
0
                    }
6336
0
                }
6337
0
            #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
6338
0
                if (ret == WOLFSSL_SUCCESS) {
6339
                    /*
6340
                     * OpenSSL requires that a EVP_CTRL_AEAD_SET_IV_FIXED
6341
                     * command be issued before a EVP_CTRL_GCM_IV_GEN command.
6342
                     * This flag is used to enforce that.
6343
                     */
6344
0
                    ctx->authIvGenEnable = 1;
6345
0
                }
6346
0
            #endif
6347
0
#endif /* !WC_NO_RNG */
6348
0
                break;
6349
0
#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM || (HAVE_CHACHA && HAVE_POLY1305) */
6350
0
#if (defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)) && !defined(_WIN32) && \
6351
0
    !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0))
6352
            /*
6353
             * Using EVP_CTRL_GCM_IV_GEN is a way to do AES-GCM encrypt/decrypt
6354
             * multiple times with EVP_Cipher without having to call
6355
             * EVP_CipherInit between each iteration. The IV is incremented for
6356
             * each subsequent EVP_Cipher call to prevent IV reuse.
6357
             */
6358
0
            case WOLFSSL_EVP_CTRL_GCM_IV_GEN:
6359
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6360
0
                    break;
6361
0
                if (!ctx->authIvGenEnable) {
6362
0
                    WOLFSSL_MSG("Must use EVP_CTRL_AEAD_SET_IV_FIXED before "
6363
0
                                "EVP_CTRL_GCM_IV_GEN");
6364
0
                    break;
6365
0
                }
6366
0
                if (ctx->cipher.aes.keylen == 0 || ctx->ivSz == 0) {
6367
0
                    WOLFSSL_MSG("Key or IV not set");
6368
0
                    break;
6369
0
                }
6370
0
                if (ptr == NULL) {
6371
0
                    WOLFSSL_MSG("Destination buffer for IV bytes NULL.");
6372
0
                    break;
6373
0
                }
6374
0
                if (arg <= 0 || arg > ctx->ivSz) {
6375
0
                    XMEMCPY(ptr, ctx->iv, (size_t)ctx->ivSz);
6376
0
                }
6377
0
                else {
6378
                    /*
6379
                     * Copy the last "arg" bytes of ctx->iv into the buffer at
6380
                     * "ptr." Not sure why OpenSSL does this, but it does.
6381
                     */
6382
0
                    XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, (size_t)arg);
6383
0
                }
6384
6385
                /*
6386
                 * The gcmIncIV flag indicates that the IV should be incremented
6387
                 * after the next cipher operation.
6388
                 */
6389
0
                ctx->authIncIv = 1;
6390
0
                ret = WOLFSSL_SUCCESS;
6391
0
                break;
6392
0
#endif /* (HAVE_AESGCM || WOLFSSL_SM4_GCM) && !_WIN32 && !HAVE_SELFTEST &&
6393
        * !HAVE_FIPS || FIPS_VERSION >= 2)*/
6394
305
            case WOLFSSL_EVP_CTRL_AEAD_SET_TAG:
6395
305
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6396
0
                    break;
6397
305
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6398
305
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6399
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6400
0
                        break;
6401
0
                    }
6402
0
                    ctx->authTagSz = arg;
6403
0
                    ret = WOLFSSL_SUCCESS;
6404
0
                    if (ptr != NULL) {
6405
0
                        XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6406
0
                    }
6407
0
                    break;
6408
0
                }
6409
305
                else
6410
305
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6411
305
#if defined(WOLFSSL_SM4_GCM)
6412
305
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6413
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6414
0
                        break;
6415
0
                    }
6416
6417
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6418
0
                    ctx->authTagSz = arg;
6419
0
                    ret = WOLFSSL_SUCCESS;
6420
0
                    break;
6421
0
                }
6422
305
                else
6423
305
#endif
6424
305
#if defined(WOLFSSL_SM4_CCM)
6425
305
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6426
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6427
0
                        break;
6428
0
                    }
6429
6430
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6431
0
                    ctx->authTagSz = arg;
6432
0
                    ret = WOLFSSL_SUCCESS;
6433
0
                    break;
6434
0
                }
6435
305
                else
6436
305
#endif
6437
305
                {
6438
305
                    if(arg <= 0 || arg > 16 || (ptr == NULL))
6439
39
                        break;
6440
6441
266
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6442
266
                    ctx->authTagSz = arg;
6443
266
                    ret = WOLFSSL_SUCCESS;
6444
266
                    break;
6445
305
                }
6446
536
            case WOLFSSL_EVP_CTRL_AEAD_GET_TAG:
6447
536
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6448
0
                    break;
6449
6450
536
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6451
536
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6452
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6453
0
                        break;
6454
0
                    }
6455
0
                }
6456
536
                else
6457
536
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6458
536
#if defined(WOLFSSL_SM4_GCM)
6459
536
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6460
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6461
0
                        break;
6462
0
                    }
6463
0
                }
6464
536
                else
6465
536
#endif
6466
536
#if defined(WOLFSSL_SM4_CCM)
6467
536
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6468
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6469
0
                        break;
6470
0
                    }
6471
0
                }
6472
536
                else
6473
536
#endif
6474
536
                {
6475
536
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6476
280
                        break;
6477
536
                }
6478
6479
256
                if (ptr != NULL) {
6480
256
                    XMEMCPY(ptr, ctx->authTag, (size_t)arg);
6481
256
                    ret = WOLFSSL_SUCCESS;
6482
256
                }
6483
256
                break;
6484
0
#endif /* HAVE_AESGCM || HAVE_AESCCM || WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM ||
6485
        * HAVE_ARIA || (HAVE_CHACHA && HAVE_POLY1305) */
6486
0
            default:
6487
0
                WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled");
6488
0
                break;
6489
841
        }
6490
841
        return ret;
6491
841
    }
6492
6493
    /* WOLFSSL_SUCCESS on ok */
6494
    static int wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(
6495
        WOLFSSL_EVP_CIPHER_CTX* ctx)
6496
9.21k
    {
6497
9.21k
        int ret = WOLFSSL_SUCCESS;
6498
9.21k
        if (ctx) {
6499
9.21k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
6500
9.21k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
6501
9.21k
            switch (ctx->cipherType) {
6502
0
#if (defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM)) || \
6503
0
    defined(HAVE_AESCCM) || \
6504
0
    defined(HAVE_AES_CBC) || \
6505
0
    defined(WOLFSSL_AES_COUNTER) || \
6506
0
    defined(HAVE_AES_ECB) || \
6507
0
    defined(WOLFSSL_AES_CFB) || \
6508
0
    defined(WOLFSSL_AES_OFB) || \
6509
0
    defined(WOLFSSL_AES_XTS)
6510
6511
0
    #if defined(HAVE_AESGCM)
6512
559
                case WC_AES_128_GCM_TYPE:
6513
777
                case WC_AES_192_GCM_TYPE:
6514
1.24k
                case WC_AES_256_GCM_TYPE:
6515
1.24k
    #endif /* HAVE_AESGCM */
6516
1.24k
    #if defined(HAVE_AESCCM)
6517
1.24k
                case WC_AES_128_CCM_TYPE:
6518
1.24k
                case WC_AES_192_CCM_TYPE:
6519
1.24k
                case WC_AES_256_CCM_TYPE:
6520
1.24k
    #endif /* HAVE_AESCCM */
6521
1.24k
    #ifdef HAVE_AES_CBC
6522
1.64k
                case WC_AES_128_CBC_TYPE:
6523
1.74k
                case WC_AES_192_CBC_TYPE:
6524
1.86k
                case WC_AES_256_CBC_TYPE:
6525
1.86k
    #endif
6526
1.86k
    #ifdef WOLFSSL_AES_COUNTER
6527
1.93k
                case WC_AES_128_CTR_TYPE:
6528
2.33k
                case WC_AES_192_CTR_TYPE:
6529
2.40k
                case WC_AES_256_CTR_TYPE:
6530
2.40k
    #endif
6531
2.40k
    #ifdef HAVE_AES_ECB
6532
2.46k
                case WC_AES_128_ECB_TYPE:
6533
2.53k
                case WC_AES_192_ECB_TYPE:
6534
2.59k
                case WC_AES_256_ECB_TYPE:
6535
2.59k
    #endif
6536
2.59k
    #ifdef WOLFSSL_AES_CFB
6537
2.77k
                case WC_AES_128_CFB1_TYPE:
6538
2.82k
                case WC_AES_192_CFB1_TYPE:
6539
2.98k
                case WC_AES_256_CFB1_TYPE:
6540
3.15k
                case WC_AES_128_CFB8_TYPE:
6541
3.29k
                case WC_AES_192_CFB8_TYPE:
6542
3.41k
                case WC_AES_256_CFB8_TYPE:
6543
3.41k
                case WC_AES_128_CFB128_TYPE:
6544
3.41k
                case WC_AES_192_CFB128_TYPE:
6545
3.41k
                case WC_AES_256_CFB128_TYPE:
6546
3.41k
    #endif
6547
3.41k
    #ifdef WOLFSSL_AES_OFB
6548
3.59k
                case WC_AES_128_OFB_TYPE:
6549
3.76k
                case WC_AES_192_OFB_TYPE:
6550
4.02k
                case WC_AES_256_OFB_TYPE:
6551
4.02k
    #endif
6552
4.02k
                    wc_AesFree(&ctx->cipher.aes);
6553
4.02k
                    ctx->flags &=
6554
4.02k
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6555
4.02k
                    break;
6556
0
    #if defined(WOLFSSL_AES_XTS) && \
6557
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
6558
377
                case WC_AES_128_XTS_TYPE:
6559
501
                case WC_AES_256_XTS_TYPE:
6560
501
                    wc_AesXtsFree(&ctx->cipher.xts);
6561
501
                    ctx->flags &=
6562
501
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6563
501
                    break;
6564
9.21k
    #endif
6565
9.21k
#endif /* AES */
6566
    #ifdef HAVE_ARIA
6567
                case WC_ARIA_128_GCM_TYPE:
6568
                case WC_ARIA_192_GCM_TYPE:
6569
                case WC_ARIA_256_GCM_TYPE:
6570
                    {
6571
                        int result = wc_AriaFreeCrypt(&ctx->cipher.aria);
6572
                        if (result != 0) {
6573
                            WOLFSSL_MSG("wc_AriaFreeCrypt failure");
6574
                            ret = result;
6575
                        }
6576
                    }
6577
                    break;
6578
    #endif
6579
9.21k
            }
6580
6581
9.21k
#endif /* not FIPS or FIPS v2+ */
6582
6583
9.21k
#ifdef WOLFSSL_SM4
6584
9.21k
            switch (ctx->cipherType) {
6585
0
    #ifdef WOLFSSL_SM4_ECB
6586
0
                case WC_SM4_ECB_TYPE:
6587
0
    #endif
6588
0
    #ifdef WOLFSSL_SM4_CBC
6589
0
                case WC_SM4_CBC_TYPE:
6590
0
    #endif
6591
0
    #ifdef WOLFSSL_SM4_CTR
6592
0
                case WC_SM4_CTR_TYPE:
6593
0
    #endif
6594
0
    #ifdef WOLFSSL_SM4_GCM
6595
0
                case WC_SM4_GCM_TYPE:
6596
0
    #endif
6597
0
    #ifdef WOLFSSL_SM4_CCM
6598
0
                case WC_SM4_CCM_TYPE:
6599
0
    #endif
6600
0
                    wc_Sm4Free(&ctx->cipher.sm4);
6601
9.21k
            }
6602
9.21k
#endif
6603
9.21k
        }
6604
9.21k
        return ret;
6605
9.21k
    }
6606
6607
    int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx)
6608
9.21k
    {
6609
9.21k
        int ret = WOLFSSL_SUCCESS;
6610
9.21k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup");
6611
9.21k
        if (ctx) {
6612
9.21k
            wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(ctx);
6613
9.21k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;  /* not yet initialized  */
6614
9.21k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6615
9.21k
            if (ctx->key) {
6616
0
                ForceZero(ctx->key, (word32)ctx->keyLen);
6617
0
                XFREE(ctx->key, NULL, DYNAMIC_TYPE_OPENSSL);
6618
0
                ctx->key = NULL;
6619
0
            }
6620
9.21k
#endif
6621
9.21k
            ctx->keyLen     = 0;
6622
9.21k
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6623
9.21k
    defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
6624
9.21k
            XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
6625
9.21k
            ctx->authBuffer = NULL;
6626
9.21k
            ctx->authBufferLen = 0;
6627
9.21k
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6628
9.21k
            ctx->authIn = NULL;
6629
9.21k
            ctx->authInSz = 0;
6630
9.21k
            ctx->authIvGenEnable = 0;
6631
9.21k
            ctx->authIncIv = 0;
6632
9.21k
#endif
6633
9.21k
        }
6634
6635
9.21k
        return ret;
6636
9.21k
    }
6637
6638
    /* Permanent stub for Qt compilation. */
6639
    #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB)
6640
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc2_cbc(void)
6641
    {
6642
        WOLFSSL_ENTER("wolfSSL_EVP_rc2_cbc");
6643
        WOLFSSL_STUB("EVP_rc2_cbc");
6644
        return NULL;
6645
    }
6646
    #endif
6647
6648
#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
6649
6650
    int wolfSSL_EVP_BytesToKey(const WOLFSSL_EVP_CIPHER* type,
6651
                       const WOLFSSL_EVP_MD* md, const byte* salt,
6652
                       const byte* data, int sz, int count, byte* key, byte* iv)
6653
0
    {
6654
0
        int ret;
6655
0
        int hashType = WC_HASH_TYPE_NONE;
6656
0
        WC_DECLARE_VAR(info, EncryptedInfo, 1, 0);
6657
6658
0
    #ifdef WOLFSSL_SMALL_STACK
6659
0
        info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
6660
0
                                       DYNAMIC_TYPE_ENCRYPTEDINFO);
6661
0
        if (info == NULL) {
6662
0
            WOLFSSL_MSG("malloc failed");
6663
0
            return WOLFSSL_FAILURE;
6664
0
        }
6665
0
    #endif
6666
6667
0
        XMEMSET(info, 0, sizeof(EncryptedInfo));
6668
6669
0
        ret = wc_EncryptedInfoGet(info, type);
6670
0
        if (ret < 0)
6671
0
            goto end;
6672
6673
0
        if (data == NULL) {
6674
0
            ret = (int)info->keySz;
6675
0
            goto end;
6676
0
        }
6677
6678
0
        ret = wolfSSL_EVP_get_hashinfo(md, &hashType, NULL);
6679
0
        if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
6680
0
            goto end;
6681
6682
0
        ret = wc_PBKDF1_ex(key, (int)info->keySz, iv, (int)info->ivSz, data, sz,
6683
0
                           salt, EVP_SALT_SIZE, count, hashType, NULL);
6684
0
        if (ret == 0)
6685
0
            ret = (int)info->keySz;
6686
6687
0
    end:
6688
0
        WC_FREE_VAR_EX(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
6689
0
        if (ret < 0)
6690
0
            return 0; /* failure - for compatibility */
6691
6692
0
        return ret;
6693
0
    }
6694
6695
#endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
6696
6697
6698
#ifndef NO_AES
6699
#if defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_192) || \
6700
    defined(WOLFSSL_AES_256)
6701
    #define AES_SIZE_ANY
6702
#endif
6703
6704
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \
6705
    defined(HAVE_AES_ECB) || defined(WOLFSSL_AES_CFB) || \
6706
    defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_DIRECT)
6707
    #define AES_SET_KEY
6708
#endif
6709
6710
#if defined(AES_SIZE_ANY) && defined(AES_SET_KEY)
6711
    static int   AesSetKey_ex(Aes* aes, const byte* key, word32 len,
6712
                              const byte* iv, int dir, int direct)
6713
2.43k
    {
6714
2.43k
        int ret;
6715
        /* wc_AesSetKey clear aes.reg if iv == NULL.
6716
           Keep IV for openSSL compatibility */
6717
2.43k
        if (iv == NULL)
6718
1.61k
            XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, WC_AES_BLOCK_SIZE);
6719
2.43k
        if (direct) {
6720
624
        #if defined(WOLFSSL_AES_DIRECT)
6721
624
            ret = wc_AesSetKeyDirect(aes, key, len, iv, dir);
6722
        #else
6723
            ret = NOT_COMPILED_IN;
6724
        #endif
6725
624
        }
6726
1.80k
        else {
6727
1.80k
            ret = wc_AesSetKey(aes, key, len, iv, dir);
6728
1.80k
        }
6729
2.43k
        if (iv == NULL)
6730
1.61k
            XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, WC_AES_BLOCK_SIZE);
6731
2.43k
        return ret;
6732
2.43k
    }
6733
#endif /* AES_ANY_SIZE && AES_SET_KEY */
6734
#endif /* NO_AES */
6735
6736
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6737
    || FIPS_VERSION_GE(2,0))
6738
    static int EvpCipherInitAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6739
                                   const WOLFSSL_EVP_CIPHER* type,
6740
                                   const byte* key, const byte* iv, int enc)
6741
3.08k
    {
6742
3.08k
        int ret = WOLFSSL_SUCCESS;
6743
6744
3.08k
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6745
3.08k
        ctx->authIn = NULL;
6746
3.08k
        ctx->authInSz = 0;
6747
6748
3.08k
        ctx->block_size = WC_AES_BLOCK_SIZE;
6749
3.08k
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6750
3.08k
        if (ctx->ivSz == 0) {
6751
1.24k
            ctx->ivSz = GCM_NONCE_MID_SZ;
6752
1.24k
        }
6753
3.08k
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6754
3.08k
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
6755
3.08k
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6756
3.08k
        if (enc == 0 || enc == 1) {
6757
2.28k
            ctx->enc = enc ? 1 : 0;
6758
2.28k
        }
6759
6760
3.08k
    #ifdef WOLFSSL_AES_128
6761
3.08k
        if (ctx->cipherType == WC_AES_128_GCM_TYPE ||
6762
2.25k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))) {
6763
1.38k
            WOLFSSL_MSG("EVP_AES_128_GCM");
6764
1.38k
            ctx->cipherType = WC_AES_128_GCM_TYPE;
6765
1.38k
            ctx->keyLen = AES_128_KEY_SIZE;
6766
1.38k
        }
6767
3.08k
    #endif
6768
3.08k
    #ifdef WOLFSSL_AES_192
6769
3.08k
        if (ctx->cipherType == WC_AES_192_GCM_TYPE ||
6770
2.94k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))) {
6771
355
            WOLFSSL_MSG("EVP_AES_192_GCM");
6772
355
            ctx->cipherType = WC_AES_192_GCM_TYPE;
6773
355
            ctx->keyLen = AES_192_KEY_SIZE;
6774
355
        }
6775
3.08k
    #endif
6776
3.08k
    #ifdef WOLFSSL_AES_256
6777
3.08k
        if (ctx->cipherType == WC_AES_256_GCM_TYPE ||
6778
2.21k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))) {
6779
1.34k
            WOLFSSL_MSG("EVP_AES_256_GCM");
6780
1.34k
            ctx->cipherType = WC_AES_256_GCM_TYPE;
6781
1.34k
            ctx->keyLen = AES_256_KEY_SIZE;
6782
1.34k
        }
6783
3.08k
    #endif
6784
6785
3.08k
        if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
6786
1.24k
            if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
6787
0
                ret = WOLFSSL_FAILURE;
6788
1.24k
            else
6789
1.24k
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6790
1.24k
        }
6791
6792
    #ifndef WOLFSSL_AESGCM_STREAM
6793
        if (ret == WOLFSSL_SUCCESS && key &&
6794
            wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) {
6795
            WOLFSSL_MSG("wc_AesGcmSetKey() failed");
6796
            ret = WOLFSSL_FAILURE;
6797
        }
6798
    #endif /* !WOLFSSL_AESGCM_STREAM */
6799
3.08k
        if (ret == WOLFSSL_SUCCESS && iv &&
6800
1.84k
            wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
6801
0
            WOLFSSL_MSG("wc_AesGcmSetExtIV() failed");
6802
0
            ret = WOLFSSL_FAILURE;
6803
0
        }
6804
3.08k
    #ifdef WOLFSSL_AESGCM_STREAM
6805
        /*
6806
         * Initialize with key and IV if available. wc_AesGcmInit will fail
6807
         * if called with IV only and no key has been set.
6808
         */
6809
3.08k
        if (ret == WOLFSSL_SUCCESS &&
6810
3.08k
            (key || (iv && ctx->cipher.aes.gcmKeySet)) &&
6811
1.84k
            wc_AesGcmInit(&ctx->cipher.aes, key,
6812
1.84k
                          (key == NULL) ? 0 : (word32)ctx->keyLen, iv,
6813
1.84k
                          (iv == NULL) ? 0 : (word32)ctx->ivSz) != 0) {
6814
0
            WOLFSSL_MSG("wc_AesGcmInit() failed");
6815
0
            ret = WOLFSSL_FAILURE;
6816
0
        }
6817
3.08k
    #endif /* WOLFSSL_AESGCM_STREAM */
6818
6819
        /*
6820
         * OpenSSL clears this flag, which permits subsequent use of
6821
         * EVP_CTRL_GCM_IV_GEN, when EVP_CipherInit is called with no key.
6822
         * If a key is provided, the flag retains its value.
6823
         */
6824
3.08k
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
6825
2.04k
            ctx->authIvGenEnable = 0;
6826
2.04k
        }
6827
6828
3.08k
        return ret;
6829
3.08k
    }
6830
6831
    static int EvpCipherAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
6832
                               const byte* src, word32 len)
6833
0
    {
6834
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6835
6836
    #ifndef WOLFSSL_AESGCM_STREAM
6837
        /* No destination means only AAD. */
6838
        if (src != NULL && dst == NULL) {
6839
            ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
6840
        }
6841
        else if (src != NULL && dst != NULL) {
6842
            if (ctx->enc) {
6843
                ret = wc_AesGcmEncrypt(&ctx->cipher.aes, dst, src,
6844
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6845
                        ctx->authTagSz, ctx->authIn,
6846
                        ctx->authInSz);
6847
            }
6848
            else {
6849
                ret = wc_AesGcmDecrypt(&ctx->cipher.aes, dst, src,
6850
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6851
                        ctx->authTagSz, ctx->authIn,
6852
                        ctx->authInSz);
6853
            }
6854
            if (ctx->authIncIv) {
6855
                IncCtr((byte*)ctx->cipher.aes.reg,
6856
                       ctx->cipher.aes.nonceSz);
6857
                ctx->authIncIv = 0;
6858
            }
6859
        }
6860
    #else
6861
        /*
6862
         * No need to call wc_AesGcmInit. Should have been called by
6863
         * wolfSSL_EVP_CipherInit.
6864
         */
6865
        /* NULL dst and non-NULL src means only AAD. */
6866
0
        if (src != NULL && dst == NULL) {
6867
0
            if (ctx->enc) {
6868
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL,
6869
0
                    NULL, 0, src, len);
6870
0
            }
6871
0
            else {
6872
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL,
6873
0
                    NULL, 0, src, len);
6874
0
            }
6875
0
        }
6876
        /* Only plain/cipher text. */
6877
0
        else if (src != NULL && dst != NULL) {
6878
0
            if (ctx->enc) {
6879
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, dst, src,
6880
0
                    len, NULL, 0);
6881
0
            }
6882
0
            else {
6883
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, dst, src,
6884
0
                    len, NULL, 0);
6885
0
            }
6886
0
        }
6887
        /*
6888
         * src == NULL is analogous to other "final"-type functions
6889
         * (e.g. EVP_CipherFinal). Calculates tag on encrypt
6890
         * and checks tag on decrypt.
6891
         */
6892
0
        else {
6893
0
            if (ctx->enc) {
6894
                /* Calculate authentication tag. */
6895
0
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes,
6896
0
                    ctx->authTag, (word32)ctx->authTagSz);
6897
                /*
6898
                 * wc_AesGcmEncryptFinal increments the IV in
6899
                 * ctx->cipher.aes.reg, so we don't call IncCtr here.
6900
                 */
6901
0
            }
6902
0
            else {
6903
                /* Calculate authentication tag and compare. */
6904
0
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes,
6905
0
                    ctx->authTag, (word32)ctx->authTagSz);
6906
0
                if (ctx->authIncIv) {
6907
0
                    IncCtr((byte*)ctx->cipher.aes.reg,
6908
0
                           ctx->cipher.aes.nonceSz);
6909
0
                }
6910
0
            }
6911
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
6912
0
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
6913
0
                              (byte*)ctx->cipher.aes.reg,
6914
0
                              (word32)ctx->ivSz) != 0) {
6915
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
6916
0
                return WOLFSSL_FAILURE;
6917
0
            }
6918
0
            ctx->authIncIv = 0;
6919
0
        }
6920
0
    #endif /* WOLFSSL_AESGCM_STREAM */
6921
0
        if (src == NULL) {
6922
            /*
6923
             * Clear any leftover AAD on final (final is when src is
6924
             * NULL).
6925
             */
6926
0
            if (ctx->authIn != NULL) {
6927
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
6928
0
            }
6929
0
            ctx->authInSz = 0;
6930
0
        }
6931
0
        if (ret == 0) {
6932
0
            ret = (int)len;
6933
0
        }
6934
6935
0
        return ret;
6936
0
    }
6937
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
6938
        * HAVE_FIPS_VERSION >= 2 */
6939
6940
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
6941
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6942
    || FIPS_VERSION_GE(2,0))
6943
    static int EvpCipherInitAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6944
                                   const WOLFSSL_EVP_CIPHER* type,
6945
                                   const byte* key, const byte* iv, int enc)
6946
0
    {
6947
0
        int ret = WOLFSSL_SUCCESS;
6948
6949
0
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6950
0
        ctx->authIn = NULL;
6951
0
        ctx->authInSz = 0;
6952
6953
0
        ctx->block_size = WC_AES_BLOCK_SIZE;
6954
0
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6955
0
        if (ctx->ivSz == 0) {
6956
0
            ctx->ivSz = GCM_NONCE_MID_SZ;
6957
0
        }
6958
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6959
0
        ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
6960
0
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6961
0
        if (enc == 0 || enc == 1) {
6962
0
            ctx->enc = enc ? 1 : 0;
6963
0
        }
6964
6965
0
    #ifdef WOLFSSL_AES_128
6966
0
        if (ctx->cipherType == WC_AES_128_CCM_TYPE ||
6967
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))) {
6968
0
            WOLFSSL_MSG("EVP_AES_128_CCM");
6969
0
            ctx->cipherType = WC_AES_128_CCM_TYPE;
6970
0
            ctx->keyLen = AES_128_KEY_SIZE;
6971
0
        }
6972
0
    #endif
6973
0
    #ifdef WOLFSSL_AES_192
6974
0
        if (ctx->cipherType == WC_AES_192_CCM_TYPE ||
6975
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))) {
6976
0
            WOLFSSL_MSG("EVP_AES_192_CCM");
6977
0
            ctx->cipherType = WC_AES_192_CCM_TYPE;
6978
0
            ctx->keyLen = AES_192_KEY_SIZE;
6979
0
        }
6980
0
    #endif
6981
0
    #ifdef WOLFSSL_AES_256
6982
0
        if (ctx->cipherType == WC_AES_256_CCM_TYPE ||
6983
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))) {
6984
0
            WOLFSSL_MSG("EVP_AES_256_CCM");
6985
0
            ctx->cipherType = WC_AES_256_CCM_TYPE;
6986
0
            ctx->keyLen = AES_256_KEY_SIZE;
6987
0
        }
6988
0
    #endif
6989
6990
0
        if (ret == WOLFSSL_SUCCESS) {
6991
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
6992
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) {
6993
0
                    WOLFSSL_MSG("wc_AesInit() failed");
6994
0
                    ret = WOLFSSL_FAILURE;
6995
0
                } else
6996
0
                    ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6997
0
            }
6998
0
        }
6999
7000
0
        if (ret == WOLFSSL_SUCCESS && key &&
7001
0
            wc_AesCcmSetKey(&ctx->cipher.aes, key, (word32)ctx->keyLen)) {
7002
0
            WOLFSSL_MSG("wc_AesCcmSetKey() failed");
7003
0
            ret = WOLFSSL_FAILURE;
7004
0
        }
7005
0
        if (ret == WOLFSSL_SUCCESS && iv &&
7006
0
            wc_AesCcmSetNonce(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
7007
0
            WOLFSSL_MSG("wc_AesCcmSetNonce() failed");
7008
0
            ret = WOLFSSL_FAILURE;
7009
0
        }
7010
7011
        /*
7012
         * OpenSSL clears this flag, which permits subsequent use of
7013
         * EVP_CTRL_CCM_IV_GEN, when EVP_CipherInit is called with no key.
7014
         * If a key is provided, the flag retains its value.
7015
         */
7016
0
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
7017
0
            ctx->authIvGenEnable = 0;
7018
0
        }
7019
7020
0
        return ret;
7021
0
    }
7022
7023
    static int EvpCipherAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
7024
                               const byte* src, word32 len)
7025
0
    {
7026
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
7027
7028
        /* No destination means only AAD. */
7029
0
        if (src != NULL && dst == NULL) {
7030
0
            ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, (int)len);
7031
0
        }
7032
0
        else if (src != NULL && dst != NULL) {
7033
0
            if (ctx->enc) {
7034
0
                ret = wc_AesCcmEncrypt(&ctx->cipher.aes, dst, src,
7035
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7036
0
                        (word32)ctx->authTagSz, ctx->authIn,
7037
0
                        (word32)ctx->authInSz);
7038
0
            }
7039
0
            else {
7040
0
                ret = wc_AesCcmDecrypt(&ctx->cipher.aes, dst, src,
7041
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7042
0
                        (word32)ctx->authTagSz, ctx->authIn,
7043
0
                        (word32)ctx->authInSz);
7044
0
            }
7045
0
            if (ctx->authIncIv) {
7046
0
                IncCtr((byte*)ctx->cipher.aes.reg,
7047
0
                       ctx->cipher.aes.nonceSz);
7048
0
                ctx->authIncIv = 0;
7049
0
            }
7050
0
        }
7051
0
        if (src == NULL) {
7052
            /*
7053
             * Clear any leftover AAD on final (final is when src is
7054
             * NULL).
7055
             */
7056
0
            if (ctx->authIn != NULL) {
7057
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
7058
0
            }
7059
0
            ctx->authInSz = 0;
7060
0
        }
7061
0
        if (ret == 0) {
7062
0
            ret = (int)len;
7063
0
        }
7064
7065
0
        return ret;
7066
0
    }
7067
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7068
        * HAVE_FIPS_VERSION >= 2 */
7069
7070
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7071
    || FIPS_VERSION_GE(2,0))
7072
    static int EvpCipherInitAriaGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
7073
                                    const WOLFSSL_EVP_CIPHER* type,
7074
                                    const byte* key, const byte* iv, int enc)
7075
    {
7076
        int ret = WOLFSSL_SUCCESS;
7077
7078
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7079
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))) {
7080
            WOLFSSL_MSG("EVP_ARIA_128_GCM");
7081
            ctx->cipherType = WC_ARIA_128_GCM_TYPE;
7082
            ctx->keyLen = ARIA_128_KEY_SIZE;
7083
        } else if (ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7084
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))) {
7085
            WOLFSSL_MSG("EVP_ARIA_192_GCM");
7086
            ctx->cipherType = WC_ARIA_192_GCM_TYPE;
7087
            ctx->keyLen = ARIA_192_KEY_SIZE;
7088
        } else if (ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7089
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))) {
7090
            WOLFSSL_MSG("EVP_ARIA_256_GCM");
7091
            ctx->cipherType = WC_ARIA_256_GCM_TYPE;
7092
            ctx->keyLen = ARIA_256_KEY_SIZE;
7093
        } else {
7094
            WOLFSSL_MSG("Unrecognized cipher type");
7095
            return WOLFSSL_FAILURE;
7096
        }
7097
7098
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
7099
        ctx->authIn = NULL;
7100
        ctx->authInSz = 0;
7101
7102
        ctx->block_size = WC_AES_BLOCK_SIZE;
7103
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
7104
        if (ctx->ivSz == 0) {
7105
            ctx->ivSz = GCM_NONCE_MID_SZ;
7106
        }
7107
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7108
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
7109
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
7110
        if (enc == 0 || enc == 1) {
7111
            ctx->enc = enc ? 1 : 0;
7112
        }
7113
7114
        switch(ctx->cipherType) {
7115
            case WC_ARIA_128_GCM_TYPE:
7116
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_128BITKEY);
7117
                break;
7118
            case WC_ARIA_192_GCM_TYPE:
7119
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_192BITKEY);
7120
                break;
7121
            case WC_ARIA_256_GCM_TYPE:
7122
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_256BITKEY);
7123
                break;
7124
            default:
7125
                WOLFSSL_MSG("Unimplemented cipherType");
7126
                return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */
7127
        }
7128
        if (ret != 0) {
7129
            WOLFSSL_MSG(MC_GetErrorString(ret));
7130
            WOLFSSL_MSG(MC_GetError(ctx->cipher.aria.hSession));
7131
            return WOLFSSL_FAILURE;
7132
        }
7133
7134
        if (key && wc_AriaSetKey(&ctx->cipher.aria, (byte *)key)) {
7135
            WOLFSSL_MSG("wc_AriaSetKey() failed");
7136
            return WOLFSSL_FAILURE;
7137
        }
7138
        if (iv && wc_AriaGcmSetExtIV(&ctx->cipher.aria, iv, ctx->ivSz)) {
7139
            WOLFSSL_MSG("wc_AriaGcmSetIV() failed");
7140
            return WOLFSSL_FAILURE;
7141
        }
7142
7143
        return WOLFSSL_SUCCESS;
7144
    }
7145
#endif /* HAVE_ARIA && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7146
        * HAVE_FIPS_VERSION >= 2 */
7147
7148
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
7149
    int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
7150
                               const WOLFSSL_EVP_CIPHER* type, const byte* key,
7151
                               const byte* iv, int enc)
7152
13.7k
    {
7153
13.7k
        int ret = 0;
7154
13.7k
        (void)key;
7155
13.7k
        (void)iv;
7156
13.7k
        (void)enc;
7157
7158
13.7k
        WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
7159
13.7k
        if (ctx == NULL) {
7160
0
            WOLFSSL_MSG("no ctx");
7161
0
            return WOLFSSL_FAILURE;
7162
0
        }
7163
7164
13.7k
        if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
7165
0
            WOLFSSL_MSG("no type set");
7166
0
            return WOLFSSL_FAILURE;
7167
0
        }
7168
13.7k
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
7169
            /* only first EVP_CipherInit invoke. ctx->cipherType is set below */
7170
5.43k
            XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
7171
5.43k
            ctx->flags   = 0;
7172
5.43k
        }
7173
7174
        /* always clear buffer state */
7175
13.7k
        ctx->bufUsed = 0;
7176
13.7k
        ctx->lastUsed = 0;
7177
7178
13.7k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
7179
13.7k
        if (!iv && ctx->ivSz) {
7180
2.24k
            iv = ctx->iv;
7181
2.24k
        }
7182
13.7k
#endif
7183
7184
13.7k
#ifndef NO_AES
7185
13.7k
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
7186
13.7k
        #ifdef WOLFSSL_AES_128
7187
13.7k
        if (ctx->cipherType == WC_AES_128_CBC_TYPE ||
7188
13.4k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CBC))) {
7189
735
            WOLFSSL_MSG("EVP_AES_128_CBC");
7190
735
            ctx->cipherType = WC_AES_128_CBC_TYPE;
7191
735
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7192
735
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7193
735
            ctx->keyLen     = 16;
7194
735
            ctx->block_size = WC_AES_BLOCK_SIZE;
7195
735
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7196
735
            if (enc == 0 || enc == 1)
7197
616
                ctx->enc = enc ? 1 : 0;
7198
735
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7199
397
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7200
0
                    return WOLFSSL_FAILURE;
7201
397
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7202
397
            }
7203
735
            if (key) {
7204
389
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7205
389
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7206
389
                if (ret != 0)
7207
0
                    return WOLFSSL_FAILURE;
7208
389
            }
7209
735
            if (iv && key == NULL) {
7210
119
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7211
119
                if (ret != 0)
7212
0
                    return WOLFSSL_FAILURE;
7213
119
            }
7214
735
        }
7215
13.7k
        #endif /* WOLFSSL_AES_128 */
7216
13.7k
        #ifdef WOLFSSL_AES_192
7217
13.7k
        if (ctx->cipherType == WC_AES_192_CBC_TYPE ||
7218
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CBC))) {
7219
164
            WOLFSSL_MSG("EVP_AES_192_CBC");
7220
164
            ctx->cipherType = WC_AES_192_CBC_TYPE;
7221
164
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7222
164
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7223
164
            ctx->keyLen     = 24;
7224
164
            ctx->block_size = WC_AES_BLOCK_SIZE;
7225
164
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7226
164
            if (enc == 0 || enc == 1)
7227
136
                ctx->enc = enc ? 1 : 0;
7228
164
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7229
104
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7230
0
                    return WOLFSSL_FAILURE;
7231
104
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7232
104
            }
7233
164
            if (key) {
7234
95
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7235
95
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7236
95
                if (ret != 0)
7237
0
                    return WOLFSSL_FAILURE;
7238
95
            }
7239
164
            if (iv && key == NULL) {
7240
28
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7241
28
                if (ret != 0)
7242
0
                    return WOLFSSL_FAILURE;
7243
28
            }
7244
164
        }
7245
13.7k
        #endif /* WOLFSSL_AES_192 */
7246
13.7k
        #ifdef WOLFSSL_AES_256
7247
13.7k
        if (ctx->cipherType == WC_AES_256_CBC_TYPE ||
7248
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CBC))) {
7249
237
            WOLFSSL_MSG("EVP_AES_256_CBC");
7250
237
            ctx->cipherType = WC_AES_256_CBC_TYPE;
7251
237
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7252
237
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7253
237
            ctx->keyLen     = 32;
7254
237
            ctx->block_size = WC_AES_BLOCK_SIZE;
7255
237
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7256
237
            if (enc == 0 || enc == 1)
7257
190
                ctx->enc = enc ? 1 : 0;
7258
237
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7259
116
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7260
0
                    return WOLFSSL_FAILURE;
7261
116
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7262
116
            }
7263
237
            if (key) {
7264
100
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7265
100
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7266
100
                if (ret != 0){
7267
0
                    WOLFSSL_MSG("AesSetKey() failed");
7268
0
                    return WOLFSSL_FAILURE;
7269
0
                }
7270
100
            }
7271
237
            if (iv && key == NULL) {
7272
47
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7273
47
                if (ret != 0){
7274
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7275
0
                    return WOLFSSL_FAILURE;
7276
0
                }
7277
47
            }
7278
237
        }
7279
13.7k
        #endif /* WOLFSSL_AES_256 */
7280
13.7k
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
7281
13.7k
    #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7282
13.7k
        || FIPS_VERSION_GE(2,0))
7283
13.7k
        if (FALSE
7284
13.7k
        #ifdef WOLFSSL_AES_128
7285
13.7k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
7286
12.9k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))
7287
12.3k
        #endif
7288
12.3k
        #ifdef WOLFSSL_AES_192
7289
12.3k
            || ctx->cipherType == WC_AES_192_GCM_TYPE ||
7290
12.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))
7291
12.0k
        #endif
7292
12.0k
        #ifdef WOLFSSL_AES_256
7293
12.0k
            || ctx->cipherType == WC_AES_256_GCM_TYPE ||
7294
11.1k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))
7295
13.7k
        #endif
7296
13.7k
          ) {
7297
3.08k
            if (EvpCipherInitAesGCM(ctx, type, key, iv, enc)
7298
3.08k
                != WOLFSSL_SUCCESS) {
7299
0
                return WOLFSSL_FAILURE;
7300
0
            }
7301
3.08k
        }
7302
13.7k
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7303
            * HAVE_FIPS_VERSION >= 2 */
7304
13.7k
    #if defined(HAVE_AESCCM) && \
7305
13.7k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7306
13.7k
            || FIPS_VERSION_GE(2,0))
7307
13.7k
        if (FALSE
7308
13.7k
        #ifdef WOLFSSL_AES_128
7309
13.7k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
7310
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))
7311
13.7k
        #endif
7312
13.7k
        #ifdef WOLFSSL_AES_192
7313
13.7k
            || ctx->cipherType == WC_AES_192_CCM_TYPE ||
7314
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))
7315
13.7k
        #endif
7316
13.7k
        #ifdef WOLFSSL_AES_256
7317
13.7k
            || ctx->cipherType == WC_AES_256_CCM_TYPE ||
7318
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))
7319
13.7k
        #endif
7320
13.7k
          )
7321
0
        {
7322
0
            if (EvpCipherInitAesCCM(ctx, type, key, iv, enc)
7323
0
                != WOLFSSL_SUCCESS) {
7324
0
                return WOLFSSL_FAILURE;
7325
0
            }
7326
0
        }
7327
13.7k
    #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7328
            * HAVE_FIPS_VERSION >= 2 */
7329
13.7k
#ifdef WOLFSSL_AES_COUNTER
7330
13.7k
        #ifdef WOLFSSL_AES_128
7331
13.7k
        if (ctx->cipherType == WC_AES_128_CTR_TYPE ||
7332
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CTR))) {
7333
196
            WOLFSSL_MSG("EVP_AES_128_CTR");
7334
196
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7335
196
            ctx->cipherType = WC_AES_128_CTR_TYPE;
7336
196
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7337
196
            ctx->keyLen     = 16;
7338
196
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7339
196
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7340
196
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7341
196
            ctx->cipher.aes.left = 0;
7342
196
#endif
7343
196
            if (enc == 0 || enc == 1)
7344
138
                ctx->enc = enc ? 1 : 0;
7345
196
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7346
76
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7347
0
                    return WOLFSSL_FAILURE;
7348
76
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7349
76
            }
7350
196
            if (key) {
7351
62
                ret =  AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7352
62
                    iv, AES_ENCRYPTION, 1);
7353
62
                if (ret != 0)
7354
0
                    return WOLFSSL_FAILURE;
7355
62
            }
7356
196
            if (iv && key == NULL) {
7357
58
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7358
58
                if (ret != 0)
7359
0
                    return WOLFSSL_FAILURE;
7360
58
            }
7361
196
        }
7362
13.7k
        #endif /* WOLFSSL_AES_128 */
7363
13.7k
        #ifdef WOLFSSL_AES_192
7364
13.7k
        if (ctx->cipherType == WC_AES_192_CTR_TYPE ||
7365
12.9k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CTR))) {
7366
1.16k
            WOLFSSL_MSG("EVP_AES_192_CTR");
7367
1.16k
            ctx->cipherType = WC_AES_192_CTR_TYPE;
7368
1.16k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7369
1.16k
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7370
1.16k
            ctx->keyLen     = 24;
7371
1.16k
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7372
1.16k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7373
1.16k
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7374
1.16k
            ctx->cipher.aes.left = 0;
7375
1.16k
#endif
7376
1.16k
            if (enc == 0 || enc == 1)
7377
782
                ctx->enc = enc ? 1 : 0;
7378
1.16k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7379
398
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7380
0
                    return WOLFSSL_FAILURE;
7381
398
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7382
398
            }
7383
1.16k
            if (key) {
7384
384
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7385
384
                    iv, AES_ENCRYPTION, 1);
7386
384
                if (ret != 0)
7387
0
                    return WOLFSSL_FAILURE;
7388
384
            }
7389
1.16k
            if (iv && key == NULL) {
7390
379
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7391
379
                if (ret != 0)
7392
0
                    return WOLFSSL_FAILURE;
7393
379
            }
7394
1.16k
        }
7395
13.7k
        #endif /* WOLFSSL_AES_192 */
7396
13.7k
        #ifdef WOLFSSL_AES_256
7397
13.7k
        if (ctx->cipherType == WC_AES_256_CTR_TYPE ||
7398
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CTR))) {
7399
153
            WOLFSSL_MSG("EVP_AES_256_CTR");
7400
153
            ctx->cipherType = WC_AES_256_CTR_TYPE;
7401
153
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7402
153
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7403
153
            ctx->keyLen     = 32;
7404
153
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7405
153
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7406
153
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7407
153
            ctx->cipher.aes.left = 0;
7408
153
#endif
7409
153
            if (enc == 0 || enc == 1)
7410
114
                ctx->enc = enc ? 1 : 0;
7411
153
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7412
67
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7413
0
                    return WOLFSSL_FAILURE;
7414
67
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7415
67
            }
7416
153
            if (key) {
7417
47
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7418
47
                    iv, AES_ENCRYPTION, 1);
7419
47
                if (ret != 0)
7420
0
                    return WOLFSSL_FAILURE;
7421
47
            }
7422
153
            if (iv && key == NULL) {
7423
39
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7424
39
                if (ret != 0)
7425
0
                    return WOLFSSL_FAILURE;
7426
39
            }
7427
153
        }
7428
13.7k
        #endif /* WOLFSSL_AES_256 */
7429
13.7k
#endif /* WOLFSSL_AES_COUNTER */
7430
13.7k
    #ifdef HAVE_AES_ECB
7431
13.7k
        #ifdef WOLFSSL_AES_128
7432
13.7k
        if (ctx->cipherType == WC_AES_128_ECB_TYPE ||
7433
13.6k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_ECB))) {
7434
118
            WOLFSSL_MSG("EVP_AES_128_ECB");
7435
118
            ctx->cipherType = WC_AES_128_ECB_TYPE;
7436
118
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7437
118
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7438
118
            ctx->keyLen     = 16;
7439
118
            ctx->block_size = WC_AES_BLOCK_SIZE;
7440
118
            if (enc == 0 || enc == 1)
7441
106
                ctx->enc = enc ? 1 : 0;
7442
118
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7443
65
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7444
0
                    return WOLFSSL_FAILURE;
7445
65
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7446
65
            }
7447
118
            if (key) {
7448
41
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7449
41
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7450
41
            }
7451
118
            if (ret != 0)
7452
0
                return WOLFSSL_FAILURE;
7453
118
        }
7454
13.7k
        #endif /* WOLFSSL_AES_128 */
7455
13.7k
        #ifdef WOLFSSL_AES_192
7456
13.7k
        if (ctx->cipherType == WC_AES_192_ECB_TYPE ||
7457
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_ECB))) {
7458
158
            WOLFSSL_MSG("EVP_AES_192_ECB");
7459
158
            ctx->cipherType = WC_AES_192_ECB_TYPE;
7460
158
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7461
158
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7462
158
            ctx->keyLen     = 24;
7463
158
            ctx->block_size = WC_AES_BLOCK_SIZE;
7464
158
            if (enc == 0 || enc == 1)
7465
116
                ctx->enc = enc ? 1 : 0;
7466
158
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7467
63
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7468
0
                    return WOLFSSL_FAILURE;
7469
63
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7470
63
            }
7471
158
            if (key) {
7472
53
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7473
53
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7474
53
            }
7475
158
            if (ret != 0)
7476
0
                return WOLFSSL_FAILURE;
7477
158
        }
7478
13.7k
        #endif /* WOLFSSL_AES_192 */
7479
13.7k
        #ifdef WOLFSSL_AES_256
7480
13.7k
        if (ctx->cipherType == WC_AES_256_ECB_TYPE ||
7481
13.7k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_ECB))) {
7482
106
            WOLFSSL_MSG("EVP_AES_256_ECB");
7483
106
            ctx->cipherType = WC_AES_256_ECB_TYPE;
7484
106
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7485
106
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7486
106
            ctx->keyLen     = 32;
7487
106
            ctx->block_size = WC_AES_BLOCK_SIZE;
7488
106
            if (enc == 0 || enc == 1)
7489
97
                ctx->enc = enc ? 1 : 0;
7490
106
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7491
60
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7492
0
                    return WOLFSSL_FAILURE;
7493
60
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7494
60
            }
7495
106
            if (key) {
7496
37
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7497
37
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7498
37
            }
7499
106
            if (ret != 0)
7500
0
                return WOLFSSL_FAILURE;
7501
106
        }
7502
13.7k
        #endif /* WOLFSSL_AES_256 */
7503
13.7k
    #endif /* HAVE_AES_ECB */
7504
13.7k
    #ifdef WOLFSSL_AES_CFB
7505
13.7k
    #ifndef WOLFSSL_NO_AES_CFB_1_8
7506
13.7k
        #ifdef WOLFSSL_AES_128
7507
13.7k
        if (ctx->cipherType == WC_AES_128_CFB1_TYPE ||
7508
13.4k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB1))) {
7509
466
            WOLFSSL_MSG("EVP_AES_128_CFB1");
7510
466
            ctx->cipherType = WC_AES_128_CFB1_TYPE;
7511
466
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7512
466
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7513
466
            ctx->keyLen     = 16;
7514
466
            ctx->block_size = 1;
7515
466
            if (enc == 0 || enc == 1)
7516
348
                ctx->enc = enc ? 1 : 0;
7517
466
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7518
182
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7519
0
                    return WOLFSSL_FAILURE;
7520
182
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7521
182
            }
7522
466
            if (key) {
7523
166
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7524
166
                    iv, AES_ENCRYPTION, 0);
7525
166
                if (ret != 0)
7526
0
                    return WOLFSSL_FAILURE;
7527
166
            }
7528
466
            if (iv && key == NULL) {
7529
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7530
0
                if (ret != 0)
7531
0
                    return WOLFSSL_FAILURE;
7532
0
            }
7533
466
        }
7534
13.7k
        #endif /* WOLFSSL_AES_128 */
7535
13.7k
        #ifdef WOLFSSL_AES_192
7536
13.7k
        if (ctx->cipherType == WC_AES_192_CFB1_TYPE ||
7537
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB1))) {
7538
121
            WOLFSSL_MSG("EVP_AES_192_CFB1");
7539
121
            ctx->cipherType = WC_AES_192_CFB1_TYPE;
7540
121
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7541
121
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7542
121
            ctx->keyLen     = 24;
7543
121
            ctx->block_size = 1;
7544
121
            if (enc == 0 || enc == 1)
7545
89
                ctx->enc = enc ? 1 : 0;
7546
121
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7547
49
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7548
0
                    return WOLFSSL_FAILURE;
7549
49
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7550
49
            }
7551
121
            if (key) {
7552
40
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7553
40
                    iv, AES_ENCRYPTION, 0);
7554
40
                if (ret != 0)
7555
0
                    return WOLFSSL_FAILURE;
7556
40
            }
7557
121
            if (iv && key == NULL) {
7558
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7559
0
                if (ret != 0)
7560
0
                    return WOLFSSL_FAILURE;
7561
0
            }
7562
121
        }
7563
13.7k
        #endif /* WOLFSSL_AES_192 */
7564
13.7k
        #ifdef WOLFSSL_AES_256
7565
13.7k
        if (ctx->cipherType == WC_AES_256_CFB1_TYPE ||
7566
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB1))) {
7567
459
            WOLFSSL_MSG("EVP_AES_256_CFB1");
7568
459
            ctx->cipherType = WC_AES_256_CFB1_TYPE;
7569
459
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7570
459
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7571
459
            ctx->keyLen     = 32;
7572
459
            ctx->block_size = 1;
7573
459
            if (enc == 0 || enc == 1)
7574
317
                ctx->enc = enc ? 1 : 0;
7575
459
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7576
165
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7577
0
                    return WOLFSSL_FAILURE;
7578
165
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7579
165
            }
7580
459
            if (key) {
7581
152
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7582
152
                    iv, AES_ENCRYPTION, 0);
7583
152
                if (ret != 0){
7584
0
                    WOLFSSL_MSG("AesSetKey() failed");
7585
0
                    return WOLFSSL_FAILURE;
7586
0
                }
7587
152
            }
7588
459
            if (iv && key == NULL) {
7589
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7590
0
                if (ret != 0){
7591
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7592
0
                    return WOLFSSL_FAILURE;
7593
0
                }
7594
0
            }
7595
459
        }
7596
13.7k
        #endif /* WOLFSSL_AES_256 */
7597
13.7k
        #ifdef WOLFSSL_AES_128
7598
13.7k
        if (ctx->cipherType == WC_AES_128_CFB8_TYPE ||
7599
13.4k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB8))) {
7600
435
            WOLFSSL_MSG("EVP_AES_128_CFB8");
7601
435
            ctx->cipherType = WC_AES_128_CFB8_TYPE;
7602
435
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7603
435
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7604
435
            ctx->keyLen     = 16;
7605
435
            ctx->block_size = 1;
7606
435
            if (enc == 0 || enc == 1)
7607
302
                ctx->enc = enc ? 1 : 0;
7608
435
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7609
165
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7610
0
                    return WOLFSSL_FAILURE;
7611
165
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7612
165
            }
7613
435
            if (key) {
7614
137
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7615
137
                    iv, AES_ENCRYPTION, 0);
7616
137
                if (ret != 0)
7617
0
                    return WOLFSSL_FAILURE;
7618
137
            }
7619
435
            if (iv && key == NULL) {
7620
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7621
0
                if (ret != 0)
7622
0
                    return WOLFSSL_FAILURE;
7623
0
            }
7624
435
        }
7625
13.7k
        #endif /* WOLFSSL_AES_128 */
7626
13.7k
        #ifdef WOLFSSL_AES_192
7627
13.7k
        if (ctx->cipherType == WC_AES_192_CFB8_TYPE ||
7628
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB8))) {
7629
393
            WOLFSSL_MSG("EVP_AES_192_CFB8");
7630
393
            ctx->cipherType = WC_AES_192_CFB8_TYPE;
7631
393
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7632
393
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7633
393
            ctx->keyLen     = 24;
7634
393
            ctx->block_size = 1;
7635
393
            if (enc == 0 || enc == 1)
7636
270
                ctx->enc = enc ? 1 : 0;
7637
393
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7638
141
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7639
0
                    return WOLFSSL_FAILURE;
7640
141
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7641
141
            }
7642
393
            if (key) {
7643
129
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7644
129
                    iv, AES_ENCRYPTION, 0);
7645
129
                if (ret != 0)
7646
0
                    return WOLFSSL_FAILURE;
7647
129
            }
7648
393
            if (iv && key == NULL) {
7649
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7650
0
                if (ret != 0)
7651
0
                    return WOLFSSL_FAILURE;
7652
0
            }
7653
393
        }
7654
13.7k
        #endif /* WOLFSSL_AES_192 */
7655
13.7k
        #ifdef WOLFSSL_AES_256
7656
13.7k
        if (ctx->cipherType == WC_AES_256_CFB8_TYPE ||
7657
13.6k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB8))) {
7658
180
            WOLFSSL_MSG("EVP_AES_256_CFB8");
7659
180
            ctx->cipherType = WC_AES_256_CFB8_TYPE;
7660
180
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7661
180
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7662
180
            ctx->keyLen     = 32;
7663
180
            ctx->block_size = 1;
7664
180
            if (enc == 0 || enc == 1)
7665
151
                ctx->enc = enc ? 1 : 0;
7666
180
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7667
118
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7668
0
                    return WOLFSSL_FAILURE;
7669
118
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7670
118
            }
7671
180
            if (key) {
7672
33
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7673
33
                    iv, AES_ENCRYPTION, 0);
7674
33
                if (ret != 0){
7675
0
                    WOLFSSL_MSG("AesSetKey() failed");
7676
0
                    return WOLFSSL_FAILURE;
7677
0
                }
7678
33
            }
7679
180
            if (iv && key == NULL) {
7680
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7681
0
                if (ret != 0){
7682
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7683
0
                    return WOLFSSL_FAILURE;
7684
0
                }
7685
0
            }
7686
180
        }
7687
13.7k
        #endif /* WOLFSSL_AES_256 */
7688
13.7k
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
7689
13.7k
        #ifdef WOLFSSL_AES_128
7690
13.7k
        if (ctx->cipherType == WC_AES_128_CFB128_TYPE ||
7691
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB128))) {
7692
0
            WOLFSSL_MSG("EVP_AES_128_CFB128");
7693
0
            ctx->cipherType = WC_AES_128_CFB128_TYPE;
7694
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7695
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7696
0
            ctx->keyLen     = 16;
7697
0
            ctx->block_size = 1;
7698
0
            if (enc == 0 || enc == 1)
7699
0
                ctx->enc = enc ? 1 : 0;
7700
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7701
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7702
0
                    return WOLFSSL_FAILURE;
7703
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7704
0
            }
7705
0
            if (key) {
7706
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7707
0
                    iv, AES_ENCRYPTION, 0);
7708
0
                if (ret != 0)
7709
0
                    return WOLFSSL_FAILURE;
7710
0
            }
7711
0
            if (iv && key == NULL) {
7712
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7713
0
                if (ret != 0)
7714
0
                    return WOLFSSL_FAILURE;
7715
0
            }
7716
0
        }
7717
13.7k
        #endif /* WOLFSSL_AES_128 */
7718
13.7k
        #ifdef WOLFSSL_AES_192
7719
13.7k
        if (ctx->cipherType == WC_AES_192_CFB128_TYPE ||
7720
13.7k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB128))) {
7721
0
            WOLFSSL_MSG("EVP_AES_192_CFB128");
7722
0
            ctx->cipherType = WC_AES_192_CFB128_TYPE;
7723
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7724
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7725
0
            ctx->keyLen     = 24;
7726
0
            ctx->block_size = 1;
7727
0
            if (enc == 0 || enc == 1)
7728
0
                ctx->enc = enc ? 1 : 0;
7729
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7730
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7731
0
                    return WOLFSSL_FAILURE;
7732
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7733
0
            }
7734
0
            if (key) {
7735
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7736
0
                    iv, AES_ENCRYPTION, 0);
7737
0
                if (ret != 0)
7738
0
                    return WOLFSSL_FAILURE;
7739
0
            }
7740
0
            if (iv && key == NULL) {
7741
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7742
0
                if (ret != 0)
7743
0
                    return WOLFSSL_FAILURE;
7744
0
            }
7745
0
        }
7746
13.7k
        #endif /* WOLFSSL_AES_192 */
7747
13.7k
        #ifdef WOLFSSL_AES_256
7748
13.7k
        if (ctx->cipherType == WC_AES_256_CFB128_TYPE ||
7749
13.7k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB128))) {
7750
0
            WOLFSSL_MSG("EVP_AES_256_CFB128");
7751
0
            ctx->cipherType = WC_AES_256_CFB128_TYPE;
7752
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7753
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7754
0
            ctx->keyLen     = 32;
7755
0
            ctx->block_size = 1;
7756
0
            if (enc == 0 || enc == 1)
7757
0
                ctx->enc = enc ? 1 : 0;
7758
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7759
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7760
0
                    return WOLFSSL_FAILURE;
7761
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7762
0
            }
7763
0
            if (key) {
7764
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7765
0
                    iv, AES_ENCRYPTION, 0);
7766
0
                if (ret != 0){
7767
0
                    WOLFSSL_MSG("AesSetKey() failed");
7768
0
                    return WOLFSSL_FAILURE;
7769
0
                }
7770
0
            }
7771
0
            if (iv && key == NULL) {
7772
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7773
0
                if (ret != 0){
7774
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7775
0
                    return WOLFSSL_FAILURE;
7776
0
                }
7777
0
            }
7778
0
        }
7779
13.7k
        #endif /* WOLFSSL_AES_256 */
7780
13.7k
    #endif /* WOLFSSL_AES_CFB */
7781
13.7k
    #ifdef WOLFSSL_AES_OFB
7782
13.7k
        #ifdef WOLFSSL_AES_128
7783
13.7k
        if (ctx->cipherType == WC_AES_128_OFB_TYPE ||
7784
13.4k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_OFB))) {
7785
517
            WOLFSSL_MSG("EVP_AES_128_OFB");
7786
517
            ctx->cipherType = WC_AES_128_OFB_TYPE;
7787
517
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7788
517
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7789
517
            ctx->keyLen     = 16;
7790
517
            ctx->block_size = 1;
7791
517
            if (enc == 0 || enc == 1)
7792
354
                ctx->enc = enc ? 1 : 0;
7793
517
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7794
186
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7795
0
                    return WOLFSSL_FAILURE;
7796
186
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7797
186
            }
7798
517
            if (key) {
7799
168
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7800
168
                    iv, AES_ENCRYPTION, 0);
7801
168
                if (ret != 0)
7802
0
                    return WOLFSSL_FAILURE;
7803
168
            }
7804
517
            if (iv && key == NULL) {
7805
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7806
0
                if (ret != 0)
7807
0
                    return WOLFSSL_FAILURE;
7808
0
            }
7809
517
        }
7810
13.7k
        #endif /* WOLFSSL_AES_128 */
7811
13.7k
        #ifdef WOLFSSL_AES_192
7812
13.7k
        if (ctx->cipherType == WC_AES_192_OFB_TYPE ||
7813
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_OFB))) {
7814
462
            WOLFSSL_MSG("EVP_AES_192_OFB");
7815
462
            ctx->cipherType = WC_AES_192_OFB_TYPE;
7816
462
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7817
462
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7818
462
            ctx->keyLen     = 24;
7819
462
            ctx->block_size = 1;
7820
462
            if (enc == 0 || enc == 1)
7821
315
                ctx->enc = enc ? 1 : 0;
7822
462
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7823
164
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7824
0
                    return WOLFSSL_FAILURE;
7825
164
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7826
164
            }
7827
462
            if (key) {
7828
151
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7829
151
                    iv, AES_ENCRYPTION, 0);
7830
151
                if (ret != 0)
7831
0
                    return WOLFSSL_FAILURE;
7832
151
            }
7833
462
            if (iv && key == NULL) {
7834
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7835
0
                if (ret != 0)
7836
0
                    return WOLFSSL_FAILURE;
7837
0
            }
7838
462
        }
7839
13.7k
        #endif /* WOLFSSL_AES_192 */
7840
13.7k
        #ifdef WOLFSSL_AES_256
7841
13.7k
        if (ctx->cipherType == WC_AES_256_OFB_TYPE ||
7842
13.2k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_OFB))) {
7843
748
            WOLFSSL_MSG("EVP_AES_256_OFB");
7844
748
            ctx->cipherType = WC_AES_256_OFB_TYPE;
7845
748
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7846
748
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7847
748
            ctx->keyLen     = 32;
7848
748
            ctx->block_size = 1;
7849
748
            if (enc == 0 || enc == 1)
7850
505
                ctx->enc = enc ? 1 : 0;
7851
748
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7852
259
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7853
0
                    return WOLFSSL_FAILURE;
7854
259
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7855
259
            }
7856
748
            if (key) {
7857
246
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7858
246
                    iv, AES_ENCRYPTION, 0);
7859
246
                if (ret != 0){
7860
0
                    WOLFSSL_MSG("AesSetKey() failed");
7861
0
                    return WOLFSSL_FAILURE;
7862
0
                }
7863
246
            }
7864
748
            if (iv && key == NULL) {
7865
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7866
0
                if (ret != 0){
7867
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7868
0
                    return WOLFSSL_FAILURE;
7869
0
                }
7870
0
            }
7871
748
        }
7872
13.7k
        #endif /* WOLFSSL_AES_256 */
7873
13.7k
    #endif /* WOLFSSL_AES_OFB */
7874
13.7k
        #if defined(WOLFSSL_AES_XTS) && \
7875
13.7k
            (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
7876
13.7k
        #ifdef WOLFSSL_AES_128
7877
13.7k
        if (ctx->cipherType == WC_AES_128_XTS_TYPE ||
7878
13.0k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_XTS))) {
7879
1.05k
            WOLFSSL_MSG("EVP_AES_128_XTS");
7880
1.05k
            ctx->cipherType = WC_AES_128_XTS_TYPE;
7881
1.05k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7882
1.05k
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7883
1.05k
            ctx->keyLen     = 32;
7884
1.05k
            ctx->block_size = 1;
7885
1.05k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7886
7887
1.05k
            if (iv != NULL) {
7888
678
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7889
342
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7890
678
            }
7891
377
            else
7892
377
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7893
7894
1.05k
            if (enc == 0 || enc == 1)
7895
719
                ctx->enc = enc ? 1 : 0;
7896
7897
1.05k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7898
377
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7899
377
                if (ret != 0) {
7900
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7901
0
                    return WOLFSSL_FAILURE;
7902
0
                }
7903
377
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7904
377
            }
7905
7906
1.05k
            if (key) {
7907
342
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7908
342
                    (word32)ctx->keyLen,
7909
342
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7910
342
                if (ret != 0) {
7911
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7912
0
                    return WOLFSSL_FAILURE;
7913
0
                }
7914
342
            }
7915
1.05k
        }
7916
13.7k
        #endif /* WOLFSSL_AES_128 */
7917
13.7k
        #ifdef WOLFSSL_AES_256
7918
13.7k
        if (ctx->cipherType == WC_AES_256_XTS_TYPE ||
7919
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_XTS))) {
7920
300
            WOLFSSL_MSG("EVP_AES_256_XTS");
7921
300
            ctx->cipherType = WC_AES_256_XTS_TYPE;
7922
300
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7923
300
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7924
300
            ctx->keyLen     = 64;
7925
300
            ctx->block_size = 1;
7926
300
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7927
7928
300
            if (iv != NULL) {
7929
176
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7930
95
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7931
176
            }
7932
124
            else
7933
124
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7934
7935
300
            if (enc == 0 || enc == 1)
7936
219
                ctx->enc = enc ? 1 : 0;
7937
7938
300
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7939
124
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7940
124
                if (ret != 0) {
7941
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7942
0
                    return WOLFSSL_FAILURE;
7943
0
                }
7944
124
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7945
124
            }
7946
7947
300
            if (key) {
7948
95
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7949
95
                    (word32)ctx->keyLen,
7950
95
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7951
95
                if (ret != 0) {
7952
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7953
0
                    return WOLFSSL_FAILURE;
7954
0
                }
7955
95
            }
7956
300
        }
7957
13.7k
        #endif /* WOLFSSL_AES_256 */
7958
13.7k
    #endif /* WOLFSSL_AES_XTS &&
7959
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
7960
13.7k
#endif /* NO_AES */
7961
    #if defined(HAVE_ARIA)
7962
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7963
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))
7964
            || ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7965
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))
7966
            || ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7967
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))
7968
          ) {
7969
            if (EvpCipherInitAriaGCM(ctx, type, key, iv, enc)
7970
                != WOLFSSL_SUCCESS) {
7971
                return WOLFSSL_FAILURE;
7972
            }
7973
        }
7974
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7975
            * HAVE_FIPS_VERSION >= 2 */
7976
7977
7978
13.7k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
7979
13.7k
        if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE ||
7980
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20_POLY1305))) {
7981
0
            WOLFSSL_MSG("EVP_CHACHA20_POLY1305");
7982
0
            ctx->cipherType = WC_CHACHA20_POLY1305_TYPE;
7983
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7984
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
7985
0
            ctx->keyLen     = CHACHA20_POLY1305_AEAD_KEYSIZE;
7986
0
            ctx->block_size = CHACHA_CHUNK_BYTES;
7987
0
            ctx->authTagSz  = CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE;
7988
0
            ctx->ivSz       = CHACHA20_POLY1305_AEAD_IV_SIZE;
7989
0
            if (enc == 0 || enc == 1) {
7990
0
                ctx->enc    = (byte) enc;
7991
0
            }
7992
7993
            /* wolfSSL_EVP_CipherInit() may be called multiple times to
7994
             * set key or iv alone. A common use case is to set key
7995
             * and then init with another iv again and again after
7996
             * update/finals. We need to preserve the key for those calls
7997
             * since wc_ChaCha20Poly1305_Init() does not. */
7998
0
            if (key != NULL) {
7999
0
                if (!ctx->key) {
8000
0
                    ctx->key = (byte*)XMALLOC((size_t)ctx->keyLen, NULL,
8001
0
                                              DYNAMIC_TYPE_OPENSSL);
8002
0
                    if (!ctx->key) {
8003
0
                        return MEMORY_E;
8004
0
                    }
8005
0
                }
8006
0
                XMEMCPY(ctx->key, key, (size_t)ctx->keyLen);
8007
0
            }
8008
0
            if ((ctx->key != NULL && iv != NULL) && wc_ChaCha20Poly1305_Init(
8009
0
                    &ctx->cipher.chachaPoly, ctx->key, iv, ctx->enc) != 0) {
8010
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Init() failed");
8011
0
                return WOLFSSL_FAILURE;
8012
0
            }
8013
0
        }
8014
13.7k
#endif
8015
13.7k
#ifdef HAVE_CHACHA
8016
13.7k
        if (ctx->cipherType == WC_CHACHA20_TYPE ||
8017
13.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20))) {
8018
0
            WOLFSSL_MSG("EVP_CHACHA20");
8019
0
            ctx->cipherType = WC_CHACHA20_TYPE;
8020
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8021
0
            ctx->keyLen     = CHACHA_MAX_KEY_SZ;
8022
0
            ctx->block_size = 1;
8023
0
            ctx->ivSz       = WOLFSSL_EVP_CHACHA_IV_BYTES;
8024
0
            if (enc == 0 || enc == 1) {
8025
0
                ctx->enc    = (byte) enc;
8026
0
            }
8027
0
            if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, key,
8028
0
                    (word32)ctx->keyLen) != 0) {
8029
0
                WOLFSSL_MSG("wc_Chacha_SetKey() failed");
8030
0
                return WOLFSSL_FAILURE;
8031
0
            }
8032
0
            if (iv != NULL) {
8033
                /* a bit silly. chacha takes an iv+counter and internally
8034
                 * combines them to a new iv. EVP is given exactly *one* iv,
8035
                 * so to pass it into chacha, we have to revert that first.
8036
                 * The counter comes first in little-endian */
8037
0
                word32 counter = (word32)iv[0] + (word32)(iv[1] << 8) +
8038
0
                    (word32)(iv[2] << 16) + (word32)(iv[3] << 24);
8039
0
                if (wc_Chacha_SetIV(&ctx->cipher.chacha,
8040
0
                                    iv + sizeof(counter), counter) != 0) {
8041
8042
0
                    WOLFSSL_MSG("wc_Chacha_SetIV() failed");
8043
0
                    return WOLFSSL_FAILURE;
8044
0
                }
8045
0
            }
8046
0
        }
8047
13.7k
#endif
8048
13.7k
#ifdef WOLFSSL_SM4_ECB
8049
13.7k
        if (ctx->cipherType == WC_SM4_ECB_TYPE ||
8050
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_ECB))) {
8051
0
            WOLFSSL_MSG("EVP_SM4_ECB");
8052
0
            ctx->cipherType = WC_SM4_ECB_TYPE;
8053
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8054
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8055
0
            ctx->keyLen     = SM4_KEY_SIZE;
8056
0
            ctx->block_size = SM4_BLOCK_SIZE;
8057
0
            if (enc == 0 || enc == 1)
8058
0
                ctx->enc = enc ? 1 : 0;
8059
0
            if (key) {
8060
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8061
0
            }
8062
0
            if (ret != 0) {
8063
0
                return WOLFSSL_FAILURE;
8064
0
            }
8065
0
        }
8066
13.7k
#endif
8067
13.7k
#ifdef WOLFSSL_SM4_CBC
8068
13.7k
        if (ctx->cipherType == WC_SM4_CBC_TYPE ||
8069
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CBC))) {
8070
0
            WOLFSSL_MSG("EVP_SM4_CBC");
8071
0
            ctx->cipherType = WC_SM4_CBC_TYPE;
8072
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8073
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8074
0
            ctx->keyLen     = SM4_KEY_SIZE;
8075
0
            ctx->block_size = SM4_BLOCK_SIZE;
8076
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8077
0
            if (enc == 0 || enc == 1)
8078
0
                ctx->enc = enc ? 1 : 0;
8079
0
            if (key != NULL) {
8080
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8081
0
                if (ret != 0) {
8082
0
                    return WOLFSSL_FAILURE;
8083
0
                }
8084
0
            }
8085
0
            if (iv != NULL) {
8086
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8087
0
                if (ret != 0) {
8088
0
                    return WOLFSSL_FAILURE;
8089
0
                }
8090
0
            }
8091
0
        }
8092
13.7k
#endif
8093
13.7k
#ifdef WOLFSSL_SM4_CTR
8094
13.7k
        if (ctx->cipherType == WC_SM4_CTR_TYPE ||
8095
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CTR))) {
8096
0
            WOLFSSL_MSG("EVP_SM4_CTR");
8097
0
            ctx->cipherType = WC_SM4_CTR_TYPE;
8098
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8099
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
8100
0
            ctx->keyLen     = SM4_KEY_SIZE;
8101
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8102
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8103
0
            if (enc == 0 || enc == 1)
8104
0
                ctx->enc = enc ? 1 : 0;
8105
0
            if (key != NULL) {
8106
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8107
0
                if (ret != 0) {
8108
0
                    return WOLFSSL_FAILURE;
8109
0
                }
8110
0
            }
8111
0
            if (iv != NULL) {
8112
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8113
0
                if (ret != 0) {
8114
0
                    return WOLFSSL_FAILURE;
8115
0
                }
8116
0
            }
8117
0
        }
8118
13.7k
#endif
8119
13.7k
#ifdef WOLFSSL_SM4_GCM
8120
13.7k
        if (ctx->cipherType == WC_SM4_GCM_TYPE ||
8121
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_GCM))) {
8122
0
            WOLFSSL_MSG("EVP_SM4_GCM");
8123
0
            ctx->cipherType = WC_SM4_GCM_TYPE;
8124
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8125
0
            ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
8126
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8127
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8128
0
            ctx->keyLen     = SM4_KEY_SIZE;
8129
0
            if (ctx->ivSz == 0) {
8130
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8131
0
            }
8132
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8133
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8134
0
            ctx->authIn = NULL;
8135
0
            ctx->authInSz = 0;
8136
0
            if (enc == 0 || enc == 1)
8137
0
                ctx->enc = enc ? 1 : 0;
8138
0
            if (key != NULL) {
8139
0
                ret = wc_Sm4GcmSetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8140
0
                if (ret != 0) {
8141
0
                    return WOLFSSL_FAILURE;
8142
0
                }
8143
0
            }
8144
0
            if (iv != NULL) {
8145
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8146
0
            }
8147
0
        }
8148
13.7k
#endif
8149
13.7k
#ifdef WOLFSSL_SM4_CCM
8150
13.7k
        if (ctx->cipherType == WC_SM4_CCM_TYPE ||
8151
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CCM))) {
8152
0
            WOLFSSL_MSG("EVP_SM4_CCM");
8153
0
            ctx->cipherType = WC_SM4_CCM_TYPE;
8154
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8155
0
            ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
8156
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8157
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8158
0
            ctx->keyLen     = SM4_KEY_SIZE;
8159
0
            if (ctx->ivSz == 0) {
8160
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8161
0
            }
8162
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8163
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8164
0
            ctx->authIn = NULL;
8165
0
            ctx->authInSz = 0;
8166
0
            if (enc == 0 || enc == 1)
8167
0
                ctx->enc = enc ? 1 : 0;
8168
0
            if (key != NULL) {
8169
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8170
0
                if (ret != 0) {
8171
0
                    return WOLFSSL_FAILURE;
8172
0
                }
8173
0
            }
8174
0
            if (iv != NULL) {
8175
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8176
0
            }
8177
0
        }
8178
13.7k
#endif
8179
13.7k
#ifndef NO_DES3
8180
13.7k
        if (ctx->cipherType == WC_DES_CBC_TYPE ||
8181
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_CBC))) {
8182
658
            WOLFSSL_MSG("EVP_DES_CBC");
8183
658
            ctx->cipherType = WC_DES_CBC_TYPE;
8184
658
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8185
658
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8186
658
            ctx->keyLen     = 8;
8187
658
            ctx->block_size = DES_BLOCK_SIZE;
8188
658
            ctx->ivSz       = DES_BLOCK_SIZE;
8189
658
            if (enc == 0 || enc == 1)
8190
459
                ctx->enc = enc ? 1 : 0;
8191
658
            if (key) {
8192
226
                ret = wc_Des_SetKey(&ctx->cipher.des, key, iv,
8193
226
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8194
226
                if (ret != 0)
8195
0
                    return WOLFSSL_FAILURE;
8196
226
            }
8197
8198
658
            if (iv && key == NULL)
8199
199
                wc_Des_SetIV(&ctx->cipher.des, iv);
8200
658
        }
8201
13.0k
#ifdef WOLFSSL_DES_ECB
8202
13.0k
        else if (ctx->cipherType == WC_DES_ECB_TYPE ||
8203
12.2k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_ECB))) {
8204
1.24k
            WOLFSSL_MSG("EVP_DES_ECB");
8205
1.24k
            ctx->cipherType = WC_DES_ECB_TYPE;
8206
1.24k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8207
1.24k
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8208
1.24k
            ctx->keyLen     = 8;
8209
1.24k
            ctx->block_size = DES_BLOCK_SIZE;
8210
1.24k
            if (enc == 0 || enc == 1)
8211
877
                ctx->enc = enc ? 1 : 0;
8212
1.24k
            if (key) {
8213
431
                WOLFSSL_MSG("Des_SetKey");
8214
431
                ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL,
8215
431
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8216
431
                if (ret != 0)
8217
0
                    return WOLFSSL_FAILURE;
8218
431
            }
8219
1.24k
        }
8220
11.8k
#endif
8221
11.8k
        else if (ctx->cipherType == WC_DES_EDE3_CBC_TYPE ||
8222
11.5k
                 (type &&
8223
4.75k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_CBC))) {
8224
490
            WOLFSSL_MSG("EVP_DES_EDE3_CBC");
8225
490
            ctx->cipherType = WC_DES_EDE3_CBC_TYPE;
8226
490
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8227
490
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8228
490
            ctx->keyLen     = 24;
8229
490
            ctx->block_size = DES_BLOCK_SIZE;
8230
490
            ctx->ivSz       = DES_BLOCK_SIZE;
8231
490
            if (enc == 0 || enc == 1)
8232
336
                ctx->enc = enc ? 1 : 0;
8233
490
            if (key) {
8234
163
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv,
8235
163
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8236
163
                if (ret != 0)
8237
0
                    return WOLFSSL_FAILURE;
8238
163
            }
8239
8240
490
            if (iv && key == NULL) {
8241
154
                ret = wc_Des3_SetIV(&ctx->cipher.des3, iv);
8242
154
                if (ret != 0)
8243
0
                    return WOLFSSL_FAILURE;
8244
154
            }
8245
490
        }
8246
11.3k
        else if (ctx->cipherType == WC_DES_EDE3_ECB_TYPE ||
8247
11.3k
                 (type &&
8248
4.58k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_ECB))) {
8249
0
            WOLFSSL_MSG("EVP_DES_EDE3_ECB");
8250
0
            ctx->cipherType = WC_DES_EDE3_ECB_TYPE;
8251
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8252
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8253
0
            ctx->keyLen     = 24;
8254
0
            ctx->block_size = DES_BLOCK_SIZE;
8255
0
            if (enc == 0 || enc == 1)
8256
0
                ctx->enc = enc ? 1 : 0;
8257
0
            if (key) {
8258
0
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL,
8259
0
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8260
0
                if (ret != 0)
8261
0
                    return WOLFSSL_FAILURE;
8262
0
            }
8263
0
        }
8264
13.7k
#endif /* NO_DES3 */
8265
13.7k
#ifndef NO_RC4
8266
13.7k
        if (ctx->cipherType == WC_ARC4_TYPE ||
8267
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARC4))) {
8268
103
            WOLFSSL_MSG("ARC4");
8269
103
            ctx->cipherType = WC_ARC4_TYPE;
8270
103
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8271
103
            ctx->flags     |= WOLFSSL_EVP_CIPH_STREAM_CIPHER;
8272
103
            ctx->block_size = 1;
8273
103
            if (ctx->keyLen == 0)  /* user may have already set */
8274
63
                ctx->keyLen = 16;  /* default to 128 */
8275
103
            if (key)
8276
23
                wc_Arc4SetKey(&ctx->cipher.arc4, key, (word32)ctx->keyLen);
8277
103
        }
8278
13.7k
#endif /* NO_RC4 */
8279
13.7k
        if (ctx->cipherType == WC_NULL_CIPHER_TYPE ||
8280
13.7k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_NULL))) {
8281
0
            WOLFSSL_MSG("NULL cipher");
8282
0
            ctx->cipherType = WC_NULL_CIPHER_TYPE;
8283
0
            ctx->keyLen = 0;
8284
0
            ctx->block_size = 16;
8285
0
        }
8286
13.7k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8287
13.7k
        if (iv && iv != ctx->iv) {
8288
2.68k
            if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8289
0
                return WOLFSSL_FAILURE;
8290
0
            }
8291
2.68k
        }
8292
13.7k
#endif
8293
13.7k
        (void)ret; /* remove warning. If execution reaches this point, ret=0 */
8294
13.7k
        return WOLFSSL_SUCCESS;
8295
13.7k
    }
8296
8297
8298
    int wolfSSL_EVP_CIPHER_CTX_nid(const WOLFSSL_EVP_CIPHER_CTX *ctx)
8299
0
    {
8300
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_nid");
8301
0
        if (ctx == NULL) {
8302
0
            WOLFSSL_ERROR_MSG("Bad parameters");
8303
0
            return WC_NID_undef;
8304
0
        }
8305
8306
0
        switch (ctx->cipherType) {
8307
0
#ifndef NO_AES
8308
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
8309
0
            case WC_AES_128_CBC_TYPE :
8310
0
                return WC_NID_aes_128_cbc;
8311
0
            case WC_AES_192_CBC_TYPE :
8312
0
                return WC_NID_aes_192_cbc;
8313
0
            case WC_AES_256_CBC_TYPE :
8314
0
                return WC_NID_aes_256_cbc;
8315
0
#endif
8316
0
#ifdef HAVE_AESGCM
8317
0
            case WC_AES_128_GCM_TYPE :
8318
0
                return WC_NID_aes_128_gcm;
8319
0
            case WC_AES_192_GCM_TYPE :
8320
0
                return WC_NID_aes_192_gcm;
8321
0
            case WC_AES_256_GCM_TYPE :
8322
0
                return WC_NID_aes_256_gcm;
8323
0
#endif
8324
0
#ifdef HAVE_AESCCM
8325
0
            case WC_AES_128_CCM_TYPE :
8326
0
                return WC_NID_aes_128_ccm;
8327
0
            case WC_AES_192_CCM_TYPE :
8328
0
                return WC_NID_aes_192_ccm;
8329
0
            case WC_AES_256_CCM_TYPE :
8330
0
                return WC_NID_aes_256_ccm;
8331
0
#endif
8332
0
#ifdef HAVE_AES_ECB
8333
0
            case WC_AES_128_ECB_TYPE :
8334
0
                return WC_NID_aes_128_ecb;
8335
0
            case WC_AES_192_ECB_TYPE :
8336
0
                return WC_NID_aes_192_ecb;
8337
0
            case WC_AES_256_ECB_TYPE :
8338
0
                return WC_NID_aes_256_ecb;
8339
0
#endif
8340
0
#ifdef WOLFSSL_AES_COUNTER
8341
0
            case WC_AES_128_CTR_TYPE :
8342
0
                return WC_NID_aes_128_ctr;
8343
0
            case WC_AES_192_CTR_TYPE :
8344
0
                return WC_NID_aes_192_ctr;
8345
0
            case WC_AES_256_CTR_TYPE :
8346
0
                return WC_NID_aes_256_ctr;
8347
0
#endif
8348
8349
0
#endif /* NO_AES */
8350
8351
#ifdef HAVE_ARIA
8352
            case WC_ARIA_128_GCM_TYPE :
8353
                return WC_NID_aria_128_gcm;
8354
            case WC_ARIA_192_GCM_TYPE :
8355
                return WC_NID_aria_192_gcm;
8356
            case WC_ARIA_256_GCM_TYPE :
8357
                return WC_NID_aria_256_gcm;
8358
#endif
8359
8360
0
#ifndef NO_DES3
8361
0
            case WC_DES_CBC_TYPE :
8362
0
                return WC_NID_des_cbc;
8363
8364
0
            case WC_DES_EDE3_CBC_TYPE :
8365
0
                return WC_NID_des_ede3_cbc;
8366
0
#endif
8367
0
#ifdef WOLFSSL_DES_ECB
8368
0
            case WC_DES_ECB_TYPE :
8369
0
                return WC_NID_des_ecb;
8370
0
            case WC_DES_EDE3_ECB_TYPE :
8371
0
                return WC_NID_des_ede3_ecb;
8372
0
#endif
8373
8374
0
            case WC_ARC4_TYPE :
8375
0
                return WC_NID_rc4;
8376
8377
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
8378
0
            case WC_CHACHA20_POLY1305_TYPE:
8379
0
                return WC_NID_chacha20_poly1305;
8380
0
#endif
8381
8382
0
#ifdef HAVE_CHACHA
8383
0
            case WC_CHACHA20_TYPE:
8384
0
                return WC_NID_chacha20;
8385
0
#endif
8386
8387
0
#ifdef WOLFSSL_SM4_ECB
8388
0
            case WC_SM4_ECB_TYPE:
8389
0
                return WC_NID_sm4_ecb;
8390
0
#endif
8391
8392
0
#ifdef WOLFSSL_SM4_CBC
8393
0
            case WC_SM4_CBC_TYPE:
8394
0
                return WC_NID_sm4_cbc;
8395
0
#endif
8396
8397
0
#ifdef WOLFSSL_SM4_CTR
8398
0
            case WC_SM4_CTR_TYPE:
8399
0
                return WC_NID_sm4_ctr;
8400
0
#endif
8401
8402
0
#ifdef WOLFSSL_SM4_GCM
8403
0
            case WC_SM4_GCM_TYPE:
8404
0
                return WC_NID_sm4_gcm;
8405
0
#endif
8406
8407
0
#ifdef WOLFSSL_SM4_CCM
8408
0
            case WC_SM4_CCM_TYPE:
8409
0
                return WC_NID_sm4_ccm;
8410
0
#endif
8411
8412
0
            case WC_NULL_CIPHER_TYPE :
8413
0
                WOLFSSL_ERROR_MSG("Null cipher has no NID");
8414
0
                FALL_THROUGH;
8415
0
            default:
8416
0
                return WC_NID_undef;
8417
0
        }
8418
0
    }
8419
8420
    /* WOLFSSL_SUCCESS on ok */
8421
    int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx)
8422
0
    {
8423
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_key_length");
8424
0
        if (ctx)
8425
0
            return ctx->keyLen;
8426
0
        else
8427
0
            return WOLFSSL_FAILURE;
8428
0
    }
8429
8430
    /* WOLFSSL_SUCCESS on ok */
8431
    int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8432
                                             int keylen)
8433
0
    {
8434
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_key_length");
8435
0
        if (ctx)
8436
0
            ctx->keyLen = keylen;
8437
0
        else
8438
0
            return WOLFSSL_FAILURE;
8439
8440
0
        return WOLFSSL_SUCCESS;
8441
0
    }
8442
8443
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8444
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8445
    int wolfSSL_EVP_CIPHER_CTX_set_iv_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8446
                                             int ivLen)
8447
0
    {
8448
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length");
8449
0
        if (ctx)
8450
0
            ctx->ivSz= ivLen;
8451
0
        else
8452
0
            return WOLFSSL_FAILURE;
8453
8454
0
        return WOLFSSL_SUCCESS;
8455
0
    }
8456
#endif
8457
8458
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
8459
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
8460
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8461
    int wolfSSL_EVP_CIPHER_CTX_set_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8462
                                             int ivLen)
8463
0
    {
8464
0
        int expectedIvLen;
8465
8466
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv");
8467
0
        if (!ctx || !iv || !ivLen) {
8468
0
            return WOLFSSL_FAILURE;
8469
0
        }
8470
8471
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8472
8473
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8474
0
            WOLFSSL_MSG("Wrong ivLen value");
8475
0
            return WOLFSSL_FAILURE;
8476
0
        }
8477
8478
0
        return wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, -1);
8479
0
    }
8480
#endif
8481
8482
#if !defined(NO_AES) || !defined(NO_DES3)
8483
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8484
    int wolfSSL_EVP_CIPHER_CTX_get_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8485
                                      int ivLen)
8486
0
    {
8487
0
        int expectedIvLen;
8488
8489
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_get_iv");
8490
8491
0
        if (ctx == NULL || iv == NULL || ivLen == 0) {
8492
0
            WOLFSSL_MSG("Bad parameter");
8493
0
            return WOLFSSL_FAILURE;
8494
0
        }
8495
8496
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8497
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8498
0
            WOLFSSL_MSG("Wrong ivLen value");
8499
0
            return WOLFSSL_FAILURE;
8500
0
        }
8501
8502
0
        XMEMCPY(iv, ctx->iv, (size_t)ivLen);
8503
8504
0
        return WOLFSSL_SUCCESS;
8505
0
    }
8506
#endif /* !NO_AES || !NO_DES3 */
8507
8508
    static int IsCipherTypeAEAD(unsigned int type)
8509
0
    {
8510
0
        switch (type) {
8511
0
            case WC_AES_128_GCM_TYPE:
8512
0
            case WC_AES_192_GCM_TYPE:
8513
0
            case WC_AES_256_GCM_TYPE:
8514
0
            case WC_AES_128_CCM_TYPE:
8515
0
            case WC_AES_192_CCM_TYPE:
8516
0
            case WC_AES_256_CCM_TYPE:
8517
0
            case WC_ARIA_128_GCM_TYPE:
8518
0
            case WC_ARIA_192_GCM_TYPE:
8519
0
            case WC_ARIA_256_GCM_TYPE:
8520
0
            case WC_SM4_GCM_TYPE:
8521
0
            case WC_SM4_CCM_TYPE:
8522
0
                return 1;
8523
0
            default:
8524
0
                return 0;
8525
0
        }
8526
0
    }
8527
8528
    /* Return length on ok */
8529
    int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
8530
                           const byte* src, word32 len)
8531
0
    {
8532
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
8533
8534
0
        WOLFSSL_ENTER("wolfSSL_EVP_Cipher");
8535
8536
0
        if (ctx == NULL) {
8537
0
            WOLFSSL_MSG("Bad argument.");
8538
0
            return WOLFSSL_FATAL_ERROR;
8539
0
        }
8540
8541
0
        if (!IsCipherTypeAEAD(ctx->cipherType)) {
8542
            /* No-op for non-AEAD ciphers */
8543
0
            if (src == NULL && dst == NULL && len == 0)
8544
0
                return 0;
8545
0
            if (src == NULL || dst == NULL) {
8546
0
                WOLFSSL_MSG("Bad argument.");
8547
0
                return WOLFSSL_FATAL_ERROR;
8548
0
            }
8549
0
        }
8550
8551
0
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
8552
0
            WOLFSSL_MSG("Cipher operation not initialized. Call "
8553
0
                        "wolfSSL_EVP_CipherInit.");
8554
0
            return WOLFSSL_FATAL_ERROR;
8555
0
        }
8556
8557
0
        switch (ctx->cipherType) {
8558
8559
0
#ifndef NO_AES
8560
0
#ifdef HAVE_AES_CBC
8561
0
            case WC_AES_128_CBC_TYPE :
8562
0
            case WC_AES_192_CBC_TYPE :
8563
0
            case WC_AES_256_CBC_TYPE :
8564
0
                WOLFSSL_MSG("AES CBC");
8565
0
                if (ctx->enc)
8566
0
                    ret = wc_AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
8567
0
                else
8568
0
                    ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
8569
0
                if (ret == 0)
8570
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8571
0
                break;
8572
0
#endif /* HAVE_AES_CBC */
8573
8574
0
#ifdef WOLFSSL_AES_CFB
8575
0
#if !defined(WOLFSSL_NO_AES_CFB_1_8)
8576
0
            case WC_AES_128_CFB1_TYPE:
8577
0
            case WC_AES_192_CFB1_TYPE:
8578
0
            case WC_AES_256_CFB1_TYPE:
8579
0
                WOLFSSL_MSG("AES CFB1");
8580
0
                if (ctx->enc)
8581
0
                    ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, dst, src, len);
8582
0
                else
8583
0
                    ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len);
8584
0
                if (ret == 0)
8585
0
                    ret = (int)len;
8586
0
                break;
8587
0
            case WC_AES_128_CFB8_TYPE:
8588
0
            case WC_AES_192_CFB8_TYPE:
8589
0
            case WC_AES_256_CFB8_TYPE:
8590
0
                WOLFSSL_MSG("AES CFB8");
8591
0
                if (ctx->enc)
8592
0
                    ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, dst, src, len);
8593
0
                else
8594
0
                    ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len);
8595
0
                if (ret == 0)
8596
0
                    ret = (int)len;
8597
0
                break;
8598
0
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
8599
0
            case WC_AES_128_CFB128_TYPE:
8600
0
            case WC_AES_192_CFB128_TYPE:
8601
0
            case WC_AES_256_CFB128_TYPE:
8602
0
                WOLFSSL_MSG("AES CFB128");
8603
0
                if (ctx->enc)
8604
0
                    ret = wc_AesCfbEncrypt(&ctx->cipher.aes, dst, src, len);
8605
0
                else
8606
0
                    ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len);
8607
0
                if (ret == 0)
8608
0
                    ret = (int)len;
8609
0
                break;
8610
0
#endif /* WOLFSSL_AES_CFB */
8611
0
#if defined(WOLFSSL_AES_OFB)
8612
0
            case WC_AES_128_OFB_TYPE:
8613
0
            case WC_AES_192_OFB_TYPE:
8614
0
            case WC_AES_256_OFB_TYPE:
8615
0
                WOLFSSL_MSG("AES OFB");
8616
0
                if (ctx->enc)
8617
0
                    ret = wc_AesOfbEncrypt(&ctx->cipher.aes, dst, src, len);
8618
0
                else
8619
0
                    ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len);
8620
0
                if (ret == 0)
8621
0
                    ret = (int)len;
8622
0
                break;
8623
0
#endif /* WOLFSSL_AES_OFB */
8624
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
8625
0
            case WC_AES_128_XTS_TYPE:
8626
0
            case WC_AES_256_XTS_TYPE:
8627
0
                WOLFSSL_MSG("AES XTS");
8628
0
                if (ctx->enc)
8629
0
                    ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len,
8630
0
                            ctx->iv, (word32)ctx->ivSz);
8631
0
                else
8632
0
                    ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len,
8633
0
                            ctx->iv, (word32)ctx->ivSz);
8634
0
                if (ret == 0)
8635
0
                    ret = (int)len;
8636
0
                break;
8637
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
8638
8639
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8640
0
    || FIPS_VERSION_GE(2,0))
8641
0
            case WC_AES_128_GCM_TYPE :
8642
0
            case WC_AES_192_GCM_TYPE :
8643
0
            case WC_AES_256_GCM_TYPE :
8644
0
                WOLFSSL_MSG("AES GCM");
8645
0
                ret = EvpCipherAesGCM(ctx, dst, src, len);
8646
0
                break;
8647
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8648
        * HAVE_FIPS_VERSION >= 2 */
8649
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8650
0
    || FIPS_VERSION_GE(2,0))
8651
0
            case WC_AES_128_CCM_TYPE :
8652
0
            case WC_AES_192_CCM_TYPE :
8653
0
            case WC_AES_256_CCM_TYPE :
8654
0
                WOLFSSL_MSG("AES CCM");
8655
0
                ret = EvpCipherAesCCM(ctx, dst, src, len);
8656
0
                break;
8657
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8658
        * HAVE_FIPS_VERSION >= 2 */
8659
0
#ifdef HAVE_AES_ECB
8660
0
            case WC_AES_128_ECB_TYPE :
8661
0
            case WC_AES_192_ECB_TYPE :
8662
0
            case WC_AES_256_ECB_TYPE :
8663
0
                WOLFSSL_MSG("AES ECB");
8664
0
                if (ctx->enc)
8665
0
                    ret = wc_AesEcbEncrypt(&ctx->cipher.aes, dst, src, len);
8666
0
                else
8667
0
                    ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len);
8668
0
                if (ret == 0)
8669
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8670
0
                break;
8671
0
#endif
8672
0
#ifdef WOLFSSL_AES_COUNTER
8673
0
            case WC_AES_128_CTR_TYPE :
8674
0
            case WC_AES_192_CTR_TYPE :
8675
0
            case WC_AES_256_CTR_TYPE :
8676
0
                WOLFSSL_MSG("AES CTR");
8677
0
                ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
8678
0
                if (ret == 0)
8679
0
                    ret = (int)len;
8680
0
                break;
8681
0
#endif /* WOLFSSL_AES_COUNTER */
8682
0
#endif /* NO_AES */
8683
8684
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8685
    || FIPS_VERSION_GE(2,0))
8686
            case WC_ARIA_128_GCM_TYPE :
8687
            case WC_ARIA_192_GCM_TYPE :
8688
            case WC_ARIA_256_GCM_TYPE :
8689
                WOLFSSL_MSG("ARIA GCM");
8690
                if (ctx->enc) {
8691
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, dst, src, len,
8692
                                         ctx->iv, ctx->ivSz, NULL, 0,
8693
                                         ctx->authTag, ctx->authTagSz);
8694
                }
8695
                else {
8696
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, dst, src, len,
8697
                                         ctx->iv, ctx->ivSz, NULL, 0,
8698
                                         ctx->authTag, ctx->authTagSz);
8699
                }
8700
                break;
8701
#endif /* HAVE_ARIA&& ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8702
        * HAVE_FIPS_VERSION >= 2 */
8703
8704
0
#ifndef NO_DES3
8705
0
            case WC_DES_CBC_TYPE :
8706
0
                WOLFSSL_MSG("DES CBC");
8707
0
                if (ctx->enc)
8708
0
                    wc_Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
8709
0
                else
8710
0
                    wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
8711
0
                if (ret == 0)
8712
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8713
0
                break;
8714
0
            case WC_DES_EDE3_CBC_TYPE :
8715
0
                WOLFSSL_MSG("DES3 CBC");
8716
0
                if (ctx->enc)
8717
0
                    ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
8718
0
                else
8719
0
                    ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
8720
0
                if (ret == 0)
8721
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8722
0
                break;
8723
0
#ifdef WOLFSSL_DES_ECB
8724
0
            case WC_DES_ECB_TYPE :
8725
0
                WOLFSSL_MSG("DES ECB");
8726
0
                ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len);
8727
0
                if (ret == 0)
8728
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8729
0
                break;
8730
0
            case WC_DES_EDE3_ECB_TYPE :
8731
0
                WOLFSSL_MSG("DES3 ECB");
8732
0
                ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len);
8733
0
                if (ret == 0)
8734
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8735
0
                break;
8736
0
#endif
8737
0
#endif /* !NO_DES3 */
8738
8739
0
#ifndef NO_RC4
8740
0
            case WC_ARC4_TYPE :
8741
0
                WOLFSSL_MSG("ARC4");
8742
0
                wc_Arc4Process(&ctx->cipher.arc4, dst, src, len);
8743
0
                if (ret == 0)
8744
0
                    ret = (int)len;
8745
0
                break;
8746
0
#endif
8747
8748
            /* TODO: Chacha??? */
8749
8750
0
#ifdef WOLFSSL_SM4_ECB
8751
0
            case WC_SM4_ECB_TYPE :
8752
0
                WOLFSSL_MSG("Sm4 ECB");
8753
0
                if (ctx->enc)
8754
0
                    ret = wc_Sm4EcbEncrypt(&ctx->cipher.sm4, dst, src, len);
8755
0
                else
8756
0
                    ret = wc_Sm4EcbDecrypt(&ctx->cipher.sm4, dst, src, len);
8757
0
                if (ret == 0)
8758
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8759
0
                break;
8760
0
#endif
8761
0
#ifdef WOLFSSL_SM4_CBC
8762
0
            case WC_SM4_CBC_TYPE :
8763
0
                WOLFSSL_MSG("Sm4 CBC");
8764
0
                if (ctx->enc)
8765
0
                    ret = wc_Sm4CbcEncrypt(&ctx->cipher.sm4, dst, src, len);
8766
0
                else
8767
0
                    ret = wc_Sm4CbcDecrypt(&ctx->cipher.sm4, dst, src, len);
8768
0
                if (ret == 0)
8769
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8770
0
                break;
8771
0
#endif
8772
0
#ifdef WOLFSSL_SM4_CTR
8773
0
            case WC_SM4_CTR_TYPE :
8774
0
                WOLFSSL_MSG("AES CTR");
8775
0
                ret = wc_Sm4CtrEncrypt(&ctx->cipher.sm4, dst, src, len);
8776
0
                if (ret == 0)
8777
0
                    ret = (int)len;
8778
0
                break;
8779
0
#endif
8780
0
#ifdef WOLFSSL_SM4_GCM
8781
0
            case WC_SM4_GCM_TYPE :
8782
0
                WOLFSSL_MSG("SM4 GCM");
8783
                /* No destination means only AAD. */
8784
0
                if (src != NULL && dst == NULL) {
8785
0
                    ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
8786
0
                }
8787
0
                else if (src != NULL && dst != NULL) {
8788
0
                    if (ctx->enc) {
8789
0
                        ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, dst, src,
8790
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8791
0
                                ctx->authTagSz, ctx->authIn,
8792
0
                                ctx->authInSz);
8793
0
                    }
8794
0
                    else {
8795
0
                        ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, dst, src,
8796
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8797
0
                                ctx->authTagSz, ctx->authIn,
8798
0
                                ctx->authInSz);
8799
0
                    }
8800
0
                    if (ctx->authIncIv) {
8801
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8802
0
                               ctx->cipher.sm4.nonceSz);
8803
0
                        ctx->authIncIv = 0;
8804
0
                    }
8805
0
                }
8806
0
                break;
8807
0
#endif
8808
0
#ifdef WOLFSSL_SM4_CCM
8809
0
            case WC_SM4_CCM_TYPE :
8810
0
                WOLFSSL_MSG("SM4 CCM");
8811
                /* No destination means only AAD. */
8812
0
                if (src != NULL && dst == NULL) {
8813
0
                    ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len);
8814
0
                }
8815
0
                else if (src != NULL && dst != NULL) {
8816
0
                    if (ctx->enc) {
8817
0
                        ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, dst, src,
8818
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8819
0
                                ctx->authTagSz, ctx->authIn,
8820
0
                                ctx->authInSz);
8821
0
                    }
8822
0
                    else {
8823
0
                        ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, dst, src,
8824
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8825
0
                                ctx->authTagSz, ctx->authIn,
8826
0
                                ctx->authInSz);
8827
0
                    }
8828
0
                    if (ctx->authIncIv) {
8829
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8830
0
                               ctx->cipher.sm4.nonceSz);
8831
0
                        ctx->authIncIv = 0;
8832
0
                    }
8833
0
                }
8834
0
                if (src == NULL) {
8835
                    /*
8836
                     * Clear any leftover AAD on final (final is when src is
8837
                     * NULL).
8838
                     */
8839
0
                    if (ctx->authIn != NULL) {
8840
0
                        XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
8841
0
                    }
8842
0
                    ctx->authInSz = 0;
8843
0
                }
8844
0
                if (ret == 0) {
8845
0
                    ret = (int)len;
8846
0
                }
8847
0
                break;
8848
0
#endif
8849
8850
0
            case WC_NULL_CIPHER_TYPE :
8851
0
                WOLFSSL_MSG("NULL CIPHER");
8852
0
                XMEMCPY(dst, src, (size_t)len);
8853
0
                ret = (int)len;
8854
0
                break;
8855
8856
0
            default: {
8857
0
                WOLFSSL_MSG("bad type");
8858
0
                return WOLFSSL_FATAL_ERROR;
8859
0
            }
8860
0
        }
8861
8862
0
        if (ret < 0) {
8863
0
            if (ret == WC_NO_ERR_TRACE(AES_GCM_AUTH_E)) {
8864
0
                WOLFSSL_MSG("wolfSSL_EVP_Cipher failure: bad AES-GCM tag.");
8865
0
            }
8866
0
            WOLFSSL_MSG("wolfSSL_EVP_Cipher failure");
8867
0
            return WOLFSSL_FATAL_ERROR;
8868
0
        }
8869
8870
0
        if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8871
0
            return WOLFSSL_FATAL_ERROR;
8872
0
        }
8873
8874
0
        WOLFSSL_MSG("wolfSSL_EVP_Cipher success");
8875
0
        return ret;
8876
0
    }
8877
8878
static void clearEVPPkeyKeys(WOLFSSL_EVP_PKEY *pkey)
8879
0
{
8880
0
    if(pkey == NULL)
8881
0
        return;
8882
0
    WOLFSSL_ENTER("clearEVPPkeyKeys");
8883
0
#ifndef NO_RSA
8884
0
    if (pkey->rsa != NULL && pkey->ownRsa == 1) {
8885
0
        wolfSSL_RSA_free(pkey->rsa);
8886
0
        pkey->rsa = NULL;
8887
0
    }
8888
0
    pkey->ownRsa = 0;
8889
0
#endif
8890
#ifndef NO_DSA
8891
    if (pkey->dsa != NULL && pkey->ownDsa == 1) {
8892
        wolfSSL_DSA_free(pkey->dsa);
8893
        pkey->dsa = NULL;
8894
    }
8895
    pkey->ownDsa = 0;
8896
#endif
8897
0
#ifndef NO_DH
8898
0
    if (pkey->dh != NULL && pkey->ownDh == 1) {
8899
0
        wolfSSL_DH_free(pkey->dh);
8900
0
        pkey->dh = NULL;
8901
0
    }
8902
0
    pkey->ownDh = 0;
8903
0
#endif
8904
0
#ifdef HAVE_ECC
8905
0
    if (pkey->ecc != NULL && pkey->ownEcc == 1) {
8906
0
        wolfSSL_EC_KEY_free(pkey->ecc);
8907
0
        pkey->ecc = NULL;
8908
0
    }
8909
0
    pkey->ownEcc = 0;
8910
0
#endif
8911
0
}
8912
8913
#ifndef NO_RSA
8914
#ifdef WOLFSSL_KEY_TO_DER
8915
static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey)
8916
0
{
8917
0
    int ret = 0;
8918
0
    int derSz = 0;
8919
0
    word32 pkcs8Sz = 0;
8920
0
    byte* derBuf = NULL;
8921
0
    RsaKey* rsa = NULL;
8922
0
    WOLFSSL_RSA *key = NULL;
8923
8924
0
    if (pkey == NULL || pkey->rsa == NULL || pkey->rsa->internal == NULL) {
8925
0
        WOLFSSL_MSG("bad parameter");
8926
0
        return WOLFSSL_FAILURE;
8927
0
    }
8928
8929
0
    key = pkey->rsa;
8930
0
    rsa = (RsaKey*)pkey->rsa->internal;
8931
8932
    /* Get DER size */
8933
0
    if (rsa->type == RSA_PRIVATE) {
8934
0
        ret = wc_RsaKeyToDer(rsa, NULL, 0);
8935
0
        if (ret > 0) {
8936
0
            derSz = ret;
8937
0
        #ifdef HAVE_PKCS8
8938
0
            if (key->pkcs8HeaderSz) {
8939
0
                ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, (word32)derSz,
8940
0
                    RSAk, NULL, 0);
8941
0
                if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
8942
0
                    ret = 0;
8943
0
            }
8944
0
        #endif
8945
0
        }
8946
0
    }
8947
0
    else {
8948
0
        ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
8949
0
        if (ret > 0)
8950
0
            derSz = ret;
8951
0
    }
8952
8953
0
    if (derSz == 0 || ret < 0) {
8954
0
        WOLFSSL_MSG("Error getting RSA DER size");
8955
0
        return WOLFSSL_FAILURE;
8956
0
    }
8957
8958
#ifdef WOLFSSL_NO_REALLOC
8959
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER);
8960
    if (derBuf != NULL) {
8961
        XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
8962
        XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_DER);
8963
        pkey->pkey.ptr = NULL;
8964
    }
8965
#else
8966
0
    derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz,
8967
0
            pkey->heap, DYNAMIC_TYPE_DER);
8968
0
#endif
8969
0
    if (derBuf == NULL) {
8970
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer malloc failed");
8971
0
        return WOLFSSL_FAILURE;
8972
0
    }
8973
8974
    /* Old pointer is invalid from this point on */
8975
0
    pkey->pkey.ptr = (char*)derBuf;
8976
8977
0
    if (rsa->type == RSA_PRIVATE) {
8978
0
        ret = wc_RsaKeyToDer(rsa, derBuf, (word32)derSz);
8979
0
        if (ret > 0) {
8980
0
            derSz = ret;
8981
0
        #ifdef HAVE_PKCS8
8982
0
            if (key->pkcs8HeaderSz) {
8983
0
                byte* keyBuf = derBuf;
8984
0
                int keySz = derSz;
8985
0
                word32 sz = pkcs8Sz;
8986
                /* Need new buffer for PKCS8 since we can't
8987
                 * do this in-place */
8988
0
                derBuf = (byte*)XMALLOC((size_t)pkcs8Sz, pkey->heap,
8989
0
                    DYNAMIC_TYPE_DER);
8990
0
                if (derBuf != NULL) {
8991
0
                    ret = wc_CreatePKCS8Key(derBuf, &sz, keyBuf, (word32)keySz,
8992
0
                        RSAk, NULL, 0);
8993
0
                    XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
8994
0
                    pkey->pkey.ptr = (char*)derBuf;
8995
0
                }
8996
0
                else {
8997
0
                    ret = MEMORY_E;
8998
0
                }
8999
0
                derSz = (int)sz;
9000
0
            }
9001
0
        #endif
9002
0
        }
9003
0
    }
9004
0
    else {
9005
        /* Public key to DER */
9006
0
        ret = wc_RsaKeyToPublicDer(rsa, derBuf, (word32)derSz);
9007
0
        if (ret > 0)
9008
0
            derSz = ret;
9009
0
    }
9010
9011
0
    if (ret < 0) {
9012
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9013
0
        return WOLFSSL_FAILURE;
9014
0
    }
9015
0
    else {
9016
0
        pkey->pkey_sz = derSz;
9017
0
        return WOLFSSL_SUCCESS;
9018
0
    }
9019
0
}
9020
#endif /* WOLFSSL_KEY_TO_DER */
9021
9022
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey)
9023
0
{
9024
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get0_RSA");
9025
9026
0
    if (pkey == NULL)
9027
0
        return NULL;
9028
9029
0
    return pkey->rsa;
9030
0
}
9031
9032
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* pkey)
9033
0
{
9034
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
9035
9036
0
    if (pkey == NULL || pkey->rsa == NULL)
9037
0
        return NULL;
9038
9039
0
    if (wolfSSL_RSA_up_ref(pkey->rsa) != WOLFSSL_SUCCESS)
9040
0
        return NULL;
9041
9042
0
    return pkey->rsa;
9043
0
}
9044
9045
/* with set1 functions the pkey struct does not own the RSA structure
9046
 *
9047
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9048
 */
9049
int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
9050
0
{
9051
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA");
9052
0
    if (pkey == NULL || key == NULL)
9053
0
        return WOLFSSL_FAILURE;
9054
9055
0
    if (wolfSSL_RSA_up_ref(key) != WOLFSSL_SUCCESS) {
9056
0
        WOLFSSL_MSG("wolfSSL_RSA_up_ref failed");
9057
0
        return WOLFSSL_FAILURE;
9058
0
    }
9059
9060
0
    clearEVPPkeyKeys(pkey);
9061
0
    pkey->rsa    = key;
9062
0
    pkey->ownRsa = 1; /* pkey does not own RSA but needs to call free on it */
9063
0
    pkey->type   = WC_EVP_PKEY_RSA;
9064
0
    pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9065
0
    if (key->inSet == 0) {
9066
0
        if (SetRsaInternal(key) != WOLFSSL_SUCCESS) {
9067
0
            WOLFSSL_MSG("SetRsaInternal failed");
9068
0
            return WOLFSSL_FAILURE;
9069
0
        }
9070
0
    }
9071
9072
0
#ifdef WOLFSSL_KEY_TO_DER
9073
0
    if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) {
9074
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9075
0
        return WOLFSSL_FAILURE;
9076
0
    }
9077
0
#endif
9078
9079
0
#ifdef WC_RSA_BLINDING
9080
0
    if (key->ownRng == 0) {
9081
0
        if (wc_RsaSetRNG((RsaKey*)pkey->rsa->internal, &pkey->rng) != 0) {
9082
0
            WOLFSSL_MSG("Error setting RSA rng");
9083
0
            return WOLFSSL_FAILURE;
9084
0
        }
9085
0
    }
9086
0
#endif
9087
0
    return WOLFSSL_SUCCESS;
9088
0
}
9089
#endif /* !NO_RSA */
9090
9091
#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN)
9092
/* with set1 functions the pkey struct does not own the DSA structure
9093
 *
9094
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9095
 */
9096
int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key)
9097
{
9098
    int derMax = 0;
9099
    int derSz  = 0;
9100
    DsaKey* dsa  = NULL;
9101
    byte* derBuf = NULL;
9102
9103
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DSA");
9104
9105
    if((pkey == NULL) || (key == NULL))return WOLFSSL_FAILURE;
9106
    clearEVPPkeyKeys(pkey);
9107
    pkey->dsa    = key;
9108
    pkey->ownDsa = 0; /* pkey does not own DSA */
9109
    pkey->type   = WC_EVP_PKEY_DSA;
9110
    if (key->inSet == 0) {
9111
        if (SetDsaInternal(key) != WOLFSSL_SUCCESS) {
9112
            WOLFSSL_MSG("SetDsaInternal failed");
9113
            return WOLFSSL_FAILURE;
9114
        }
9115
    }
9116
    dsa = (DsaKey*)key->internal;
9117
9118
    /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
9119
    derMax = 4 * wolfSSL_BN_num_bytes(key->g) + WC_AES_BLOCK_SIZE;
9120
9121
    derBuf = (byte*)XMALLOC((size_t)derMax, pkey->heap,
9122
        DYNAMIC_TYPE_TMP_BUFFER);
9123
    if (derBuf == NULL) {
9124
        WOLFSSL_MSG("malloc failed");
9125
        return WOLFSSL_FAILURE;
9126
    }
9127
9128
    if (dsa->type == DSA_PRIVATE) {
9129
        /* Private key to DER */
9130
        derSz = wc_DsaKeyToDer(dsa, derBuf, (word32)derMax);
9131
    }
9132
    else {
9133
        /* Public key to DER */
9134
        derSz = wc_DsaKeyToPublicDer(dsa, derBuf, (word32)derMax);
9135
    }
9136
9137
    if (derSz < 0) {
9138
        if (dsa->type == DSA_PRIVATE) {
9139
            WOLFSSL_MSG("wc_DsaKeyToDer failed");
9140
        }
9141
        else {
9142
            WOLFSSL_MSG("wc_DsaKeyToPublicDer failed");
9143
        }
9144
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9145
        return WOLFSSL_FAILURE;
9146
    }
9147
9148
    pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, pkey->heap,
9149
        DYNAMIC_TYPE_DER);
9150
    if (pkey->pkey.ptr == NULL) {
9151
        WOLFSSL_MSG("key malloc failed");
9152
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9153
        return WOLFSSL_FAILURE;
9154
    }
9155
    pkey->pkey_sz = derSz;
9156
    XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz);
9157
    XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9158
9159
    return WOLFSSL_SUCCESS;
9160
}
9161
9162
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey)
9163
{
9164
    if (!pkey) {
9165
        return NULL;
9166
    }
9167
    return pkey->dsa;
9168
}
9169
9170
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key)
9171
{
9172
    WOLFSSL_DSA* local;
9173
9174
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DSA");
9175
9176
    if (key == NULL) {
9177
        WOLFSSL_MSG("Bad function argument");
9178
        return NULL;
9179
    }
9180
9181
    local = wolfSSL_DSA_new();
9182
    if (local == NULL) {
9183
        WOLFSSL_MSG("Error creating a new WOLFSSL_DSA structure");
9184
        return NULL;
9185
    }
9186
9187
    if (key->type == WC_EVP_PKEY_DSA) {
9188
        if (wolfSSL_DSA_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9189
                    key->pkey_sz) != WOLFSSL_SUCCESS) {
9190
            /* now try public key */
9191
            if (wolfSSL_DSA_LoadDer_ex(local,
9192
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9193
                        WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9194
                wolfSSL_DSA_free(local);
9195
                local = NULL;
9196
            }
9197
        }
9198
    }
9199
    else {
9200
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DSA key");
9201
        wolfSSL_DSA_free(local);
9202
        local = NULL;
9203
    }
9204
    return local;
9205
}
9206
#endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */
9207
9208
#ifdef HAVE_ECC
9209
WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey)
9210
0
{
9211
0
    WOLFSSL_EC_KEY *eckey = NULL;
9212
0
    if (pkey && pkey->type == WC_EVP_PKEY_EC) {
9213
0
#ifdef HAVE_ECC
9214
0
        eckey = pkey->ecc;
9215
0
#endif
9216
0
    }
9217
0
    return eckey;
9218
0
}
9219
9220
WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key)
9221
0
{
9222
0
    WOLFSSL_EC_KEY* local = NULL;
9223
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY");
9224
9225
0
    if (key == NULL || key->type != WC_EVP_PKEY_EC) {
9226
0
        return NULL;
9227
0
    }
9228
0
    if (key->type == WC_EVP_PKEY_EC) {
9229
0
        if (key->ecc != NULL) {
9230
0
            if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) {
9231
0
                return NULL;
9232
0
            }
9233
0
            local = key->ecc;
9234
0
        }
9235
0
        else {
9236
0
            key->ecc = local = wolfSSL_EC_KEY_new();
9237
0
            if (local == NULL) {
9238
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure");
9239
0
                return NULL;
9240
0
            }
9241
0
            if (wolfSSL_EC_KEY_LoadDer(local,
9242
0
                        (const unsigned char*)key->pkey.ptr,
9243
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9244
                /* now try public key */
9245
0
                if (wolfSSL_EC_KEY_LoadDer_ex(local,
9246
0
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9247
0
                        WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9248
9249
0
                    wolfSSL_EC_KEY_free(local);
9250
0
                    local = NULL;
9251
0
                }
9252
0
            }
9253
0
        }
9254
0
    }
9255
0
    else {
9256
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key");
9257
0
    }
9258
9259
0
    return local;
9260
0
}
9261
#endif /* HAVE_ECC */
9262
9263
#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
9264
#if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
9265
/* with set1 functions the pkey struct does not own the DH structure
9266
 * Build the following DH Key format from the passed in WOLFSSL_DH
9267
 * then store in WOLFSSL_EVP_PKEY in DER format.
9268
 *
9269
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9270
 */
9271
int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
9272
0
{
9273
0
    byte havePublic = 0, havePrivate = 0;
9274
0
    int ret;
9275
0
    word32 derSz = 0;
9276
0
    byte* derBuf = NULL;
9277
0
    DhKey* dhkey = NULL;
9278
9279
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH");
9280
9281
0
    if (pkey == NULL || key == NULL)
9282
0
        return WOLFSSL_FAILURE;
9283
9284
0
    clearEVPPkeyKeys(pkey);
9285
9286
0
    if (wolfSSL_DH_up_ref(key) != WOLFSSL_SUCCESS) {
9287
0
        WOLFSSL_MSG("Failed to increase dh key ref count");
9288
0
        return WOLFSSL_FAILURE;
9289
0
    }
9290
9291
0
    pkey->dh    = key;
9292
0
    pkey->ownDh = 1; /* pkey does not own DH but needs to call free on it */
9293
0
    pkey->type  = WC_EVP_PKEY_DH;
9294
0
    if (key->inSet == 0) {
9295
0
        if (SetDhInternal(key) != WOLFSSL_SUCCESS) {
9296
0
            WOLFSSL_MSG("SetDhInternal failed");
9297
0
            return WOLFSSL_FAILURE;
9298
0
        }
9299
0
    }
9300
9301
0
    dhkey = (DhKey*)key->internal;
9302
9303
0
    havePublic  = mp_unsigned_bin_size(&dhkey->pub)  > 0;
9304
0
    havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0;
9305
9306
    /* Get size of DER buffer only */
9307
0
    if (havePublic && !havePrivate) {
9308
0
        ret = wc_DhPubKeyToDer(dhkey, NULL, &derSz);
9309
0
    } else if (havePrivate) {
9310
0
        ret = wc_DhPrivKeyToDer(dhkey, NULL, &derSz);
9311
0
    } else {
9312
0
        ret = wc_DhParamsToDer(dhkey,NULL,&derSz);
9313
0
    }
9314
9315
0
    if (derSz == 0 || ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9316
0
       WOLFSSL_MSG("Failed to get size of DH Key");
9317
0
       return WOLFSSL_FAILURE;
9318
0
    }
9319
9320
0
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9321
0
    if (derBuf == NULL) {
9322
0
        WOLFSSL_MSG("malloc failed");
9323
0
        return WOLFSSL_FAILURE;
9324
0
    }
9325
9326
    /* Fill DER buffer */
9327
0
    if (havePublic && !havePrivate) {
9328
0
        ret = wc_DhPubKeyToDer(dhkey, derBuf, &derSz);
9329
0
    } else if (havePrivate) {
9330
0
        ret = wc_DhPrivKeyToDer(dhkey, derBuf, &derSz);
9331
0
    } else {
9332
0
        ret = wc_DhParamsToDer(dhkey,derBuf,&derSz);
9333
0
    }
9334
9335
0
    if (ret <= 0) {
9336
0
        WOLFSSL_MSG("Failed to export DH Key");
9337
0
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9338
0
        return WOLFSSL_FAILURE;
9339
0
    }
9340
9341
    /* Store DH key into pkey (DER format) */
9342
0
    pkey->pkey.ptr = (char*)derBuf;
9343
0
    pkey->pkey_sz = (int)derSz;
9344
9345
0
    return WOLFSSL_SUCCESS;
9346
0
}
9347
9348
WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key)
9349
0
{
9350
0
    if (!key) {
9351
0
        return NULL;
9352
0
    }
9353
0
    return key->dh;
9354
0
}
9355
9356
WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key)
9357
0
{
9358
0
    WOLFSSL_DH* local = NULL;
9359
9360
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DH");
9361
9362
0
    if (key == NULL || key->dh == NULL) {
9363
0
        WOLFSSL_MSG("Bad function argument");
9364
0
        return NULL;
9365
0
    }
9366
9367
0
    if (key->type == WC_EVP_PKEY_DH) {
9368
        /* if key->dh already exists copy instead of re-importing from DER */
9369
0
        if (key->dh != NULL) {
9370
0
            if (wolfSSL_DH_up_ref(key->dh) != WOLFSSL_SUCCESS) {
9371
0
                return NULL;
9372
0
            }
9373
0
            local = key->dh;
9374
0
        }
9375
0
        else {
9376
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
9377
0
    (HAVE_FIPS_VERSION>2)))
9378
0
            local = wolfSSL_DH_new();
9379
0
            if (local == NULL) {
9380
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure");
9381
0
                return NULL;
9382
0
            }
9383
0
            if (wolfSSL_DH_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9384
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9385
0
                wolfSSL_DH_free(local);
9386
0
                WOLFSSL_MSG("Error wolfSSL_DH_LoadDer");
9387
0
                local = NULL;
9388
0
            }
9389
#else
9390
            WOLFSSL_MSG("EVP_PKEY does not hold DH struct");
9391
            return NULL;
9392
#endif
9393
0
        }
9394
0
    }
9395
0
    else {
9396
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DH key");
9397
0
        wolfSSL_DH_free(local);
9398
0
        return NULL;
9399
0
    }
9400
9401
0
    return local;
9402
0
}
9403
#endif /* NO_DH && WOLFSSL_DH_EXTRA && NO_FILESYSTEM */
9404
9405
int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key)
9406
0
{
9407
0
    int ret;
9408
9409
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_assign");
9410
9411
    /* pkey and key checked if NULL in subsequent assign functions */
9412
0
    switch(type) {
9413
0
    #ifndef NO_RSA
9414
0
        case WC_EVP_PKEY_RSA:
9415
0
            ret = wolfSSL_EVP_PKEY_assign_RSA(pkey, (WOLFSSL_RSA*)key);
9416
0
            break;
9417
0
    #endif
9418
    #ifndef NO_DSA
9419
        case WC_EVP_PKEY_DSA:
9420
            ret = wolfSSL_EVP_PKEY_assign_DSA(pkey, (WOLFSSL_DSA*)key);
9421
            break;
9422
    #endif
9423
0
    #ifdef HAVE_ECC
9424
0
        case WC_EVP_PKEY_EC:
9425
0
            ret = wolfSSL_EVP_PKEY_assign_EC_KEY(pkey, (WOLFSSL_EC_KEY*)key);
9426
0
            break;
9427
0
    #endif
9428
0
    #ifndef NO_DH
9429
0
         case WC_EVP_PKEY_DH:
9430
0
            ret = wolfSSL_EVP_PKEY_assign_DH(pkey, (WOLFSSL_DH*)key);
9431
0
            break;
9432
0
    #endif
9433
0
        default:
9434
0
            WOLFSSL_MSG("Unknown EVP_PKEY type in wolfSSL_EVP_PKEY_assign.");
9435
0
            ret = WOLFSSL_FAILURE;
9436
0
    }
9437
9438
0
    return ret;
9439
0
}
9440
#endif /* WOLFSSL_QT || OPENSSL_ALL */
9441
9442
#if defined(HAVE_ECC)
9443
/* try and populate public pkey_sz and pkey.ptr */
9444
static int ECC_populate_EVP_PKEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
9445
0
{
9446
0
    int derSz = 0;
9447
0
    byte* derBuf = NULL;
9448
0
    ecc_key* ecc;
9449
9450
0
    if (pkey == NULL || key == NULL || key->internal == NULL)
9451
0
        return WOLFSSL_FAILURE;
9452
9453
0
    ecc = (ecc_key*)key->internal;
9454
0
    if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) {
9455
0
#ifdef HAVE_PKCS8
9456
0
        if (key->pkcs8HeaderSz) {
9457
            /* when key has pkcs8 header the pkey should too */
9458
0
            if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9459
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9460
0
                    DYNAMIC_TYPE_OPENSSL);
9461
0
                if (derBuf) {
9462
0
                    if (wc_EccKeyToPKCS8(ecc, derBuf, (word32*)&derSz) >= 0) {
9463
0
                        if (pkey->pkey.ptr) {
9464
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9465
0
                        }
9466
0
                        pkey->pkey_sz = (int)derSz;
9467
0
                        pkey->pkey.ptr = (char*)derBuf;
9468
0
                        pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9469
0
                        return WOLFSSL_SUCCESS;
9470
0
                    }
9471
0
                    else {
9472
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9473
0
                        derBuf = NULL;
9474
0
                    }
9475
0
                }
9476
0
            }
9477
0
        }
9478
0
        else
9479
0
#endif /* HAVE_PKCS8 */
9480
0
        {
9481
0
            if (ecc->type == ECC_PRIVATEKEY_ONLY) {
9482
0
                if (wc_ecc_make_pub(ecc, NULL) != MP_OKAY) {
9483
0
                    return WOLFSSL_FAILURE;
9484
0
                }
9485
0
            }
9486
9487
            /* if not, the pkey will be traditional ecc key */
9488
0
            if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) {
9489
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9490
0
                    DYNAMIC_TYPE_OPENSSL);
9491
0
                if (derBuf) {
9492
0
                    if (wc_EccKeyToDer(ecc, derBuf, (word32)derSz) >= 0) {
9493
0
                        if (pkey->pkey.ptr) {
9494
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9495
0
                        }
9496
0
                        pkey->pkey_sz = (int)derSz;
9497
0
                        pkey->pkey.ptr = (char*)derBuf;
9498
0
                        return WOLFSSL_SUCCESS;
9499
0
                    }
9500
0
                    else {
9501
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9502
0
                        derBuf = NULL;
9503
0
                    }
9504
0
                }
9505
0
            }
9506
0
        }
9507
0
    }
9508
0
    else if (ecc->type == ECC_PUBLICKEY) {
9509
0
        if ((derSz = wc_EccPublicKeyDerSize(ecc, 1)) > 0) {
9510
        #ifdef WOLFSSL_NO_REALLOC
9511
            derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9512
            if (derBuf != NULL) {
9513
                XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
9514
                XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9515
                pkey->pkey.ptr = NULL;
9516
            }
9517
        #else
9518
0
            derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, pkey->heap,
9519
0
                    DYNAMIC_TYPE_OPENSSL);
9520
0
        #endif
9521
0
            if (derBuf != NULL) {
9522
0
                pkey->pkey.ptr = (char*)derBuf;
9523
0
                if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, (word32)derSz,
9524
0
                        1)) < 0) {
9525
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
9526
0
                    derBuf = NULL;
9527
0
                }
9528
0
            }
9529
0
        }
9530
0
    }
9531
0
    if (derBuf != NULL) {
9532
0
        pkey->pkey_sz = (int)derSz;
9533
0
        return WOLFSSL_SUCCESS;
9534
0
    }
9535
0
    else {
9536
0
        return WOLFSSL_FAILURE;
9537
0
    }
9538
0
}
9539
9540
int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
9541
0
{
9542
0
#ifdef HAVE_ECC
9543
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY");
9544
0
    if (pkey == NULL || key == NULL)
9545
0
        return WOLFSSL_FAILURE;
9546
0
    clearEVPPkeyKeys(pkey);
9547
0
    if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) {
9548
0
        WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed");
9549
0
        return WOLFSSL_FAILURE;
9550
0
    }
9551
0
    pkey->ecc    = key;
9552
0
    pkey->ownEcc = 1; /* pkey needs to call free on key */
9553
0
    pkey->type   = WC_EVP_PKEY_EC;
9554
0
    return ECC_populate_EVP_PKEY(pkey, key);
9555
#else
9556
    (void)pkey;
9557
    (void)key;
9558
    return WOLFSSL_FAILURE;
9559
#endif /* HAVE_ECC */
9560
0
}
9561
9562
void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9563
0
{
9564
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE");
9565
9566
0
    if (ctx) {
9567
0
        switch (ctx->cipherType) {
9568
0
            case WC_ARC4_TYPE:
9569
0
                WOLFSSL_MSG("returning arc4 state");
9570
0
                return (void*)&ctx->cipher.arc4.x;
9571
9572
0
            default:
9573
0
                WOLFSSL_MSG("bad x state type");
9574
0
                return 0;
9575
0
        }
9576
0
    }
9577
9578
0
    return NULL;
9579
0
}
9580
int wolfSSL_EVP_PKEY_assign_EC_KEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY* key)
9581
0
{
9582
0
    int ret;
9583
9584
0
    if (pkey == NULL || key == NULL)
9585
0
        return WOLFSSL_FAILURE;
9586
9587
    /* try and populate public pkey_sz and pkey.ptr */
9588
0
    ret = ECC_populate_EVP_PKEY(pkey, key);
9589
0
    if (ret == WOLFSSL_SUCCESS) { /* take ownership of key if can be used */
9590
0
        clearEVPPkeyKeys(pkey); /* clear out any previous keys */
9591
9592
0
        pkey->type = WC_EVP_PKEY_EC;
9593
0
        pkey->ecc = key;
9594
0
        pkey->ownEcc = 1;
9595
0
    }
9596
0
    return ret;
9597
0
}
9598
#endif /* HAVE_ECC */
9599
9600
#ifndef NO_WOLFSSL_STUB
9601
const WOLFSSL_EVP_MD* wolfSSL_EVP_ripemd160(void)
9602
1
{
9603
1
    WOLFSSL_MSG("wolfSSL_ripemd160");
9604
1
    WOLFSSL_STUB("EVP_ripemd160");
9605
1
    return NULL;
9606
1
}
9607
#endif
9608
9609
9610
int wolfSSL_EVP_MD_pkey_type(const WOLFSSL_EVP_MD* type)
9611
0
{
9612
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
9613
9614
0
    WOLFSSL_ENTER("wolfSSL_EVP_MD_pkey_type");
9615
9616
0
    if (type != NULL) {
9617
0
        if (XSTRCMP(type, WC_SN_md5) == 0) {
9618
0
            ret = WC_NID_md5WithRSAEncryption;
9619
0
        }
9620
0
        else if (XSTRCMP(type, WC_SN_sha1) == 0) {
9621
0
            ret = WC_NID_sha1WithRSAEncryption;
9622
0
        }
9623
0
        else if (XSTRCMP(type, WC_SN_sha224) == 0) {
9624
0
            ret = WC_NID_sha224WithRSAEncryption;
9625
0
        }
9626
0
        else if (XSTRCMP(type, WC_SN_sha256) == 0) {
9627
0
            ret = WC_NID_sha256WithRSAEncryption;
9628
0
        }
9629
0
        else if (XSTRCMP(type, WC_SN_sha384) == 0) {
9630
0
            ret = WC_NID_sha384WithRSAEncryption;
9631
0
        }
9632
0
        else if (XSTRCMP(type, WC_SN_sha512) == 0) {
9633
0
            ret = WC_NID_sha512WithRSAEncryption;
9634
0
        }
9635
0
    }
9636
0
    else {
9637
0
        ret = WOLFSSL_FAILURE;
9638
0
    }
9639
9640
0
    WOLFSSL_LEAVE("wolfSSL_EVP_MD_pkey_type", ret);
9641
9642
0
    return ret;
9643
0
}
9644
9645
9646
9647
int wolfSSL_EVP_CIPHER_CTX_iv_length(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9648
0
{
9649
0
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_CTX_iv_length");
9650
9651
0
    if (ctx == NULL) {
9652
0
        WOLFSSL_MSG("No context");
9653
0
        return 0;
9654
0
    }
9655
9656
0
    switch (ctx->cipherType) {
9657
9658
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9659
0
        case WC_AES_128_CBC_TYPE :
9660
0
        case WC_AES_192_CBC_TYPE :
9661
0
        case WC_AES_256_CBC_TYPE :
9662
0
            WOLFSSL_MSG("AES CBC");
9663
0
            return WC_AES_BLOCK_SIZE;
9664
0
#endif
9665
0
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9666
0
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9667
0
#ifdef HAVE_AESGCM
9668
0
        case WC_AES_128_GCM_TYPE :
9669
0
        case WC_AES_192_GCM_TYPE :
9670
0
        case WC_AES_256_GCM_TYPE :
9671
0
            WOLFSSL_MSG("AES GCM");
9672
0
            if (ctx->ivSz != 0) {
9673
0
                return ctx->ivSz;
9674
0
            }
9675
0
            return GCM_NONCE_MID_SZ;
9676
0
#endif
9677
0
#ifdef HAVE_AESCCM
9678
0
        case WC_AES_128_CCM_TYPE :
9679
0
        case WC_AES_192_CCM_TYPE :
9680
0
        case WC_AES_256_CCM_TYPE :
9681
0
            WOLFSSL_MSG("AES CCM");
9682
0
            if (ctx->ivSz != 0) {
9683
0
                return ctx->ivSz;
9684
0
            }
9685
0
            return CCM_NONCE_MIN_SZ;
9686
0
#endif
9687
0
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9688
0
#ifdef WOLFSSL_AES_COUNTER
9689
0
        case WC_AES_128_CTR_TYPE :
9690
0
        case WC_AES_192_CTR_TYPE :
9691
0
        case WC_AES_256_CTR_TYPE :
9692
0
            WOLFSSL_MSG("AES CTR");
9693
0
            return WC_AES_BLOCK_SIZE;
9694
0
#endif
9695
0
#ifndef NO_DES3
9696
0
        case WC_DES_CBC_TYPE :
9697
0
            WOLFSSL_MSG("DES CBC");
9698
0
            return DES_BLOCK_SIZE;
9699
9700
0
        case WC_DES_EDE3_CBC_TYPE :
9701
0
            WOLFSSL_MSG("DES EDE3 CBC");
9702
0
            return DES_BLOCK_SIZE;
9703
0
#endif
9704
0
#ifndef NO_RC4
9705
0
        case WC_ARC4_TYPE :
9706
0
            WOLFSSL_MSG("ARC4");
9707
0
            return 0;
9708
0
#endif
9709
0
#ifdef WOLFSSL_AES_CFB
9710
0
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9711
0
        case WC_AES_128_CFB1_TYPE:
9712
0
        case WC_AES_192_CFB1_TYPE:
9713
0
        case WC_AES_256_CFB1_TYPE:
9714
0
            WOLFSSL_MSG("AES CFB1");
9715
0
            return WC_AES_BLOCK_SIZE;
9716
0
        case WC_AES_128_CFB8_TYPE:
9717
0
        case WC_AES_192_CFB8_TYPE:
9718
0
        case WC_AES_256_CFB8_TYPE:
9719
0
            WOLFSSL_MSG("AES CFB8");
9720
0
            return WC_AES_BLOCK_SIZE;
9721
0
#endif /* !HAVE_SELFTEST && !HAVE_FIPS */
9722
0
        case WC_AES_128_CFB128_TYPE:
9723
0
        case WC_AES_192_CFB128_TYPE:
9724
0
        case WC_AES_256_CFB128_TYPE:
9725
0
            WOLFSSL_MSG("AES CFB128");
9726
0
            return WC_AES_BLOCK_SIZE;
9727
0
#endif /* WOLFSSL_AES_CFB */
9728
0
#if defined(WOLFSSL_AES_OFB)
9729
0
        case WC_AES_128_OFB_TYPE:
9730
0
        case WC_AES_192_OFB_TYPE:
9731
0
        case WC_AES_256_OFB_TYPE:
9732
0
            WOLFSSL_MSG("AES OFB");
9733
0
            return WC_AES_BLOCK_SIZE;
9734
0
#endif /* WOLFSSL_AES_OFB */
9735
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9736
0
        case WC_AES_128_XTS_TYPE:
9737
0
        case WC_AES_256_XTS_TYPE:
9738
0
            WOLFSSL_MSG("AES XTS");
9739
0
            return WC_AES_BLOCK_SIZE;
9740
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9741
#ifdef HAVE_ARIA
9742
        case WC_ARIA_128_GCM_TYPE :
9743
        case WC_ARIA_192_GCM_TYPE :
9744
        case WC_ARIA_256_GCM_TYPE :
9745
            WOLFSSL_MSG("ARIA GCM");
9746
            if (ctx->ivSz != 0) {
9747
                return ctx->ivSz;
9748
            }
9749
            return GCM_NONCE_MID_SZ;
9750
#endif
9751
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9752
0
        case WC_CHACHA20_POLY1305_TYPE:
9753
0
            WOLFSSL_MSG("CHACHA20 POLY1305");
9754
0
            return CHACHA20_POLY1305_AEAD_IV_SIZE;
9755
0
#endif /* HAVE_CHACHA HAVE_POLY1305 */
9756
0
#ifdef HAVE_CHACHA
9757
0
        case WC_CHACHA20_TYPE:
9758
0
            WOLFSSL_MSG("CHACHA20");
9759
0
            return WOLFSSL_EVP_CHACHA_IV_BYTES;
9760
0
#endif /* HAVE_CHACHA */
9761
0
#ifdef WOLFSSL_SM4_CBC
9762
0
        case WC_SM4_CBC_TYPE :
9763
0
            WOLFSSL_MSG("SM4 CBC");
9764
0
            return SM4_BLOCK_SIZE;
9765
0
#endif
9766
0
#ifdef WOLFSSL_SM4_CTR
9767
0
        case WC_SM4_CTR_TYPE :
9768
0
            WOLFSSL_MSG("SM4 CTR");
9769
0
            return SM4_BLOCK_SIZE;
9770
0
#endif
9771
0
#ifdef WOLFSSL_SM4_GCM
9772
0
        case WC_SM4_GCM_TYPE :
9773
0
            WOLFSSL_MSG("SM4 GCM");
9774
0
            if (ctx->ivSz != 0) {
9775
0
                return ctx->ivSz;
9776
0
            }
9777
0
            return GCM_NONCE_MID_SZ;
9778
0
#endif
9779
0
#ifdef WOLFSSL_SM4_CCM
9780
0
        case WC_SM4_CCM_TYPE :
9781
0
            WOLFSSL_MSG("SM4 CCM");
9782
0
            if (ctx->ivSz != 0) {
9783
0
                return ctx->ivSz;
9784
0
            }
9785
0
            return CCM_NONCE_MIN_SZ;
9786
0
#endif
9787
9788
0
        case WC_NULL_CIPHER_TYPE :
9789
0
            WOLFSSL_MSG("NULL");
9790
0
            return 0;
9791
9792
0
        default: {
9793
0
            WOLFSSL_MSG("bad type");
9794
0
        }
9795
0
    }
9796
0
    return 0;
9797
0
}
9798
9799
int wolfSSL_EVP_CIPHER_iv_length(const WOLFSSL_EVP_CIPHER* cipher)
9800
5.17k
{
9801
5.17k
    const char *name = (const char *)cipher;
9802
5.17k
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_iv_length");
9803
9804
5.17k
#ifndef NO_AES
9805
5.17k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9806
5.17k
    #ifdef WOLFSSL_AES_128
9807
5.17k
    if (XSTRCMP(name, EVP_AES_128_CBC) == 0)
9808
227
        return WC_AES_BLOCK_SIZE;
9809
4.95k
    #endif
9810
4.95k
    #ifdef WOLFSSL_AES_192
9811
4.95k
    if (XSTRCMP(name, EVP_AES_192_CBC) == 0)
9812
41
        return WC_AES_BLOCK_SIZE;
9813
4.91k
    #endif
9814
4.91k
    #ifdef WOLFSSL_AES_256
9815
4.91k
    if (XSTRCMP(name, EVP_AES_256_CBC) == 0)
9816
90
        return WC_AES_BLOCK_SIZE;
9817
4.82k
    #endif
9818
4.82k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
9819
4.82k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9820
4.82k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9821
4.82k
#ifdef HAVE_AESGCM
9822
4.82k
    #ifdef WOLFSSL_AES_128
9823
4.82k
    if (XSTRCMP(name, EVP_AES_128_GCM) == 0)
9824
559
        return GCM_NONCE_MID_SZ;
9825
4.26k
    #endif
9826
4.26k
    #ifdef WOLFSSL_AES_192
9827
4.26k
    if (XSTRCMP(name, EVP_AES_192_GCM) == 0)
9828
218
        return GCM_NONCE_MID_SZ;
9829
4.04k
    #endif
9830
4.04k
    #ifdef WOLFSSL_AES_256
9831
4.04k
    if (XSTRCMP(name, EVP_AES_256_GCM) == 0)
9832
469
        return GCM_NONCE_MID_SZ;
9833
3.57k
    #endif
9834
3.57k
#endif /* HAVE_AESGCM */
9835
3.57k
#ifdef HAVE_AESCCM
9836
3.57k
    #ifdef WOLFSSL_AES_128
9837
3.57k
    if (XSTRCMP(name, EVP_AES_128_CCM) == 0)
9838
0
        return CCM_NONCE_MIN_SZ;
9839
3.57k
    #endif
9840
3.57k
    #ifdef WOLFSSL_AES_192
9841
3.57k
    if (XSTRCMP(name, EVP_AES_192_CCM) == 0)
9842
0
        return CCM_NONCE_MIN_SZ;
9843
3.57k
    #endif
9844
3.57k
    #ifdef WOLFSSL_AES_256
9845
3.57k
    if (XSTRCMP(name, EVP_AES_256_CCM) == 0)
9846
0
        return CCM_NONCE_MIN_SZ;
9847
3.57k
    #endif
9848
3.57k
#endif /* HAVE_AESCCM */
9849
3.57k
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9850
3.57k
#ifdef WOLFSSL_AES_COUNTER
9851
3.57k
    #ifdef WOLFSSL_AES_128
9852
3.57k
    if (XSTRCMP(name, EVP_AES_128_CTR) == 0)
9853
76
        return WC_AES_BLOCK_SIZE;
9854
3.49k
    #endif
9855
3.49k
    #ifdef WOLFSSL_AES_192
9856
3.49k
    if (XSTRCMP(name, EVP_AES_192_CTR) == 0)
9857
398
        return WC_AES_BLOCK_SIZE;
9858
3.10k
    #endif
9859
3.10k
    #ifdef WOLFSSL_AES_256
9860
3.10k
    if (XSTRCMP(name, EVP_AES_256_CTR) == 0)
9861
67
        return WC_AES_BLOCK_SIZE;
9862
3.03k
    #endif
9863
3.03k
#endif
9864
3.03k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9865
3.03k
    #ifdef WOLFSSL_AES_128
9866
3.03k
    if (XSTRCMP(name, EVP_AES_128_XTS) == 0)
9867
377
        return WC_AES_BLOCK_SIZE;
9868
2.65k
    #endif /* WOLFSSL_AES_128 */
9869
9870
2.65k
    #ifdef WOLFSSL_AES_256
9871
2.65k
    if (XSTRCMP(name, EVP_AES_256_XTS) == 0)
9872
124
        return WC_AES_BLOCK_SIZE;
9873
2.53k
    #endif /* WOLFSSL_AES_256 */
9874
2.53k
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9875
9876
2.53k
#endif
9877
#ifdef HAVE_ARIA
9878
    if (XSTRCMP(name, EVP_ARIA_128_GCM) == 0)
9879
        return GCM_NONCE_MID_SZ;
9880
    if (XSTRCMP(name, EVP_ARIA_192_GCM) == 0)
9881
        return GCM_NONCE_MID_SZ;
9882
    if (XSTRCMP(name, EVP_ARIA_256_GCM) == 0)
9883
        return GCM_NONCE_MID_SZ;
9884
#endif /* HAVE_ARIA */
9885
9886
2.53k
#ifndef NO_DES3
9887
2.53k
    if ((XSTRCMP(name, EVP_DES_CBC) == 0) ||
9888
2.29k
           (XSTRCMP(name, EVP_DES_EDE3_CBC) == 0)) {
9889
406
        return DES_BLOCK_SIZE;
9890
406
    }
9891
2.12k
#endif
9892
9893
2.12k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9894
2.12k
    if (XSTRCMP(name, EVP_CHACHA20_POLY1305) == 0)
9895
0
        return CHACHA20_POLY1305_AEAD_IV_SIZE;
9896
2.12k
#endif
9897
9898
2.12k
#ifdef HAVE_CHACHA
9899
2.12k
    if (XSTRCMP(name, EVP_CHACHA20) == 0)
9900
0
        return WOLFSSL_EVP_CHACHA_IV_BYTES;
9901
2.12k
#endif
9902
9903
2.12k
#ifdef WOLFSSL_SM4_CBC
9904
2.12k
    if (XSTRCMP(name, EVP_SM4_CBC) == 0)
9905
0
        return SM4_BLOCK_SIZE;
9906
2.12k
#endif
9907
2.12k
#ifdef WOLFSSL_SM4_CTR
9908
2.12k
    if (XSTRCMP(name, EVP_SM4_CTR) == 0)
9909
0
        return SM4_BLOCK_SIZE;
9910
2.12k
#endif
9911
2.12k
#ifdef WOLFSSL_SM4_GCM
9912
2.12k
    if (XSTRCMP(name, EVP_SM4_GCM) == 0)
9913
0
        return GCM_NONCE_MID_SZ;
9914
2.12k
#endif
9915
2.12k
#ifdef WOLFSSL_SM4_CCM
9916
2.12k
    if (XSTRCMP(name, EVP_SM4_CCM) == 0)
9917
0
        return CCM_NONCE_MIN_SZ;
9918
2.12k
#endif
9919
9920
2.12k
    (void)name;
9921
9922
2.12k
    return 0;
9923
2.12k
}
9924
9925
9926
int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9927
0
{
9928
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE_LEN");
9929
9930
0
    if (ctx) {
9931
0
        switch (ctx->cipherType) {
9932
0
            case WC_ARC4_TYPE:
9933
0
                WOLFSSL_MSG("returning arc4 state size");
9934
0
                return sizeof(Arc4);
9935
9936
0
            default:
9937
0
                WOLFSSL_MSG("bad x state type");
9938
0
                return 0;
9939
0
        }
9940
0
    }
9941
9942
0
    return 0;
9943
0
}
9944
9945
9946
/* return of pkey->type which will be WC_EVP_PKEY_RSA for example.
9947
 *
9948
 * type  type of EVP_PKEY
9949
 *
9950
 * returns type or if type is not found then WC_NID_undef
9951
 */
9952
int wolfSSL_EVP_PKEY_type(int type)
9953
0
{
9954
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_type");
9955
9956
0
    switch (type) {
9957
0
        case WC_EVP_PKEY_RSA:
9958
0
            return WC_EVP_PKEY_RSA;
9959
0
        case WC_EVP_PKEY_DSA:
9960
0
            return WC_EVP_PKEY_DSA;
9961
0
        case WC_EVP_PKEY_EC:
9962
0
            return WC_EVP_PKEY_EC;
9963
0
        case WC_EVP_PKEY_DH:
9964
0
            return WC_EVP_PKEY_DH;
9965
0
        default:
9966
0
            return WC_NID_undef;
9967
0
    }
9968
0
}
9969
9970
9971
int wolfSSL_EVP_PKEY_id(const WOLFSSL_EVP_PKEY *pkey)
9972
0
{
9973
0
    if (pkey != NULL)
9974
0
        return pkey->type;
9975
0
    return 0;
9976
0
}
9977
9978
9979
int wolfSSL_EVP_PKEY_base_id(const WOLFSSL_EVP_PKEY *pkey)
9980
0
{
9981
0
    if (pkey == NULL)
9982
0
        return WC_NID_undef;
9983
0
    return wolfSSL_EVP_PKEY_type(pkey->type);
9984
0
}
9985
9986
int wolfSSL_EVP_PKEY_get_default_digest_nid(WOLFSSL_EVP_PKEY *pkey, int *pnid)
9987
0
{
9988
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get_default_digest_nid");
9989
9990
0
    if (!pkey || !pnid) {
9991
0
        WOLFSSL_MSG("Bad parameter");
9992
0
        return WOLFSSL_FAILURE;
9993
0
    }
9994
9995
0
    switch (pkey->type) {
9996
0
    case WC_EVP_PKEY_HMAC:
9997
#ifndef NO_DSA
9998
    case WC_EVP_PKEY_DSA:
9999
#endif
10000
0
#ifndef NO_RSA
10001
0
    case WC_EVP_PKEY_RSA:
10002
0
#endif
10003
0
#ifdef HAVE_ECC
10004
0
    case WC_EVP_PKEY_EC:
10005
0
#endif
10006
0
        *pnid = WC_NID_sha256;
10007
0
        return WOLFSSL_SUCCESS;
10008
0
    default:
10009
0
        return WOLFSSL_FAILURE;
10010
0
    }
10011
0
}
10012
10013
#if defined(OPENSSL_ALL) || defined(WOLFSSL_WPAS_SMALL)
10014
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKCS82PKEY(const WOLFSSL_PKCS8_PRIV_KEY_INFO* p8)
10015
0
{
10016
0
    if (p8 == NULL || p8->pkey.ptr == NULL) {
10017
0
        return NULL;
10018
0
    }
10019
10020
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&p8->pkey.ptr,
10021
0
        p8->pkey_sz);
10022
0
}
10023
10024
/* in wolf PKCS8_PRIV_KEY_INFO and WOLFSSL_EVP_PKEY are same type */
10025
/* this function just casts and returns pointer */
10026
WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_EVP_PKEY2PKCS8(const WOLFSSL_EVP_PKEY* pkey)
10027
0
{
10028
0
    if (pkey == NULL || pkey->pkey.ptr == NULL) {
10029
0
        return NULL;
10030
0
    }
10031
10032
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&pkey->pkey.ptr,
10033
0
        pkey->pkey_sz);
10034
0
}
10035
#endif
10036
10037
/* increments ref count of WOLFSSL_EVP_PKEY. Return 1 on success, 0 on error */
10038
int wolfSSL_EVP_PKEY_up_ref(WOLFSSL_EVP_PKEY* pkey)
10039
1.23k
{
10040
1.23k
    if (pkey) {
10041
1.23k
        int ret;
10042
1.23k
        wolfSSL_RefInc(&pkey->ref, &ret);
10043
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
10044
        if (ret != 0) {
10045
            WOLFSSL_MSG("Failed to lock pkey mutex");
10046
        }
10047
    #else
10048
1.23k
        (void)ret;
10049
1.23k
    #endif
10050
10051
1.23k
        return WOLFSSL_SUCCESS;
10052
1.23k
    }
10053
10054
0
    return WOLFSSL_FAILURE;
10055
1.23k
}
10056
10057
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
10058
int wolfSSL_EVP_PKEY_assign_RSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_RSA* key)
10059
0
{
10060
0
    if (pkey == NULL || key == NULL)
10061
0
        return WOLFSSL_FAILURE;
10062
10063
0
    clearEVPPkeyKeys(pkey);
10064
0
    pkey->type = WC_EVP_PKEY_RSA;
10065
0
    pkey->rsa = key;
10066
0
    pkey->ownRsa = 1;
10067
10068
    /* try and populate pkey_sz and pkey.ptr */
10069
0
    if (key->internal) {
10070
0
        RsaKey* rsa = (RsaKey*)key->internal;
10071
0
        int ret = wc_RsaKeyToDer(rsa, NULL, 0);
10072
0
        if (ret > 0) {
10073
0
            word32 derSz = (word32)ret;
10074
0
            byte* derBuf = (byte*)XMALLOC((size_t)derSz, NULL,
10075
0
                DYNAMIC_TYPE_TMP_BUFFER);
10076
0
            if (derBuf != NULL) {
10077
0
                ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
10078
0
                if (ret >= 0) {
10079
0
                    pkey->pkey_sz = ret;
10080
0
                    pkey->pkey.ptr = (char*)derBuf;
10081
0
                }
10082
0
                else { /* failure - okay to ignore */
10083
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
10084
0
                    derBuf = NULL;
10085
0
                }
10086
0
            }
10087
0
        }
10088
0
    }
10089
10090
0
    return WOLFSSL_SUCCESS;
10091
0
}
10092
#endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
10093
10094
#ifndef NO_DSA
10095
int wolfSSL_EVP_PKEY_assign_DSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DSA* key)
10096
{
10097
    if (pkey == NULL || key == NULL)
10098
        return WOLFSSL_FAILURE;
10099
10100
    clearEVPPkeyKeys(pkey);
10101
    pkey->type = WC_EVP_PKEY_DSA;
10102
    pkey->dsa = key;
10103
    pkey->ownDsa = 1;
10104
10105
    return WOLFSSL_SUCCESS;
10106
}
10107
#endif /* !NO_DSA */
10108
10109
#ifndef NO_DH
10110
int wolfSSL_EVP_PKEY_assign_DH(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DH* key)
10111
0
{
10112
0
    if (pkey == NULL || key == NULL)
10113
0
        return WOLFSSL_FAILURE;
10114
10115
0
    clearEVPPkeyKeys(pkey);
10116
0
    pkey->type = WC_EVP_PKEY_DH;
10117
0
    pkey->dh = key;
10118
0
    pkey->ownDh = 1;
10119
10120
0
    return WOLFSSL_SUCCESS;
10121
0
}
10122
#endif /* !NO_DH */
10123
#endif /* OPENSSL_EXTRA */
10124
10125
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
10126
/* EVP Digest functions used with cURL build too */
10127
10128
static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md)
10129
37.8k
{
10130
37.8k
    if (md != NULL) {
10131
37.8k
        const struct s_ent *ent;
10132
159k
        for (ent = md_tbl; ent->name != NULL; ent++) {
10133
159k
            if (XSTRCMP((const char *)md, ent->name) == 0) {
10134
37.8k
                return ent->macType;
10135
37.8k
            }
10136
159k
        }
10137
37.8k
    }
10138
0
    return WC_HASH_TYPE_NONE;
10139
37.8k
}
10140
10141
int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
10142
                                     const WOLFSSL_EVP_MD* type,
10143
                                     WOLFSSL_ENGINE *impl)
10144
744
{
10145
744
    (void) impl;
10146
744
    WOLFSSL_ENTER("wolfSSL_EVP_DigestInit_ex");
10147
744
    return wolfSSL_EVP_DigestInit(ctx, type);
10148
744
}
10149
10150
/* this function makes the assumption that out buffer is big enough for digest*/
10151
int wolfSSL_EVP_Digest(const unsigned char* in, int inSz, unsigned char* out,
10152
                              unsigned int* outSz, const WOLFSSL_EVP_MD* evp,
10153
                              WOLFSSL_ENGINE* eng)
10154
0
{
10155
0
    int err;
10156
0
    int hashType = WC_HASH_TYPE_NONE;
10157
0
    int hashSz;
10158
10159
0
    WOLFSSL_ENTER("wolfSSL_EVP_Digest");
10160
0
    if (in == NULL || out == NULL || evp == NULL) {
10161
0
        WOLFSSL_MSG("Null argument passed in");
10162
0
        return WOLFSSL_FAILURE;
10163
0
    }
10164
10165
0
    err = wolfSSL_EVP_get_hashinfo(evp, &hashType, &hashSz);
10166
0
    if (err != WOLFSSL_SUCCESS)
10167
0
        return err;
10168
10169
0
    if (wc_Hash((enum wc_HashType)hashType, in, (word32)inSz, out,
10170
0
            (word32)hashSz) != 0) {
10171
0
        return WOLFSSL_FAILURE;
10172
0
    }
10173
10174
0
    if (outSz != NULL)
10175
0
        *outSz = (unsigned int)hashSz;
10176
10177
0
    (void)eng;
10178
0
    return WOLFSSL_SUCCESS;
10179
0
}
10180
10181
static const struct alias {
10182
            const char *name;
10183
            const char *alias;
10184
} digest_alias_tbl[] =
10185
{
10186
    {WC_SN_md4, "md4"},
10187
    {WC_SN_md5, "md5"},
10188
    {WC_SN_sha1, "sha1"},
10189
    {WC_SN_sha1, "SHA"},
10190
    {WC_SN_sha224, "sha224"},
10191
    {WC_SN_sha256, "sha256"},
10192
    {WC_SN_sha384, "sha384"},
10193
    {WC_SN_sha512, "sha512"},
10194
    {WC_SN_sha512_224, "sha512_224"},
10195
    {WC_SN_sha3_224, "sha3_224"},
10196
    {WC_SN_sha3_256, "sha3_256"},
10197
    {WC_SN_sha3_384, "sha3_384"},
10198
    {WC_SN_sha3_512, "sha3_512"},
10199
    {WC_SN_sm3, "sm3"},
10200
    {WC_SN_blake2b512, "blake2b512"},
10201
    {WC_SN_blake2s256, "blake2s256"},
10202
    {WC_SN_shake128, "shake128"},
10203
    {WC_SN_shake256, "shake256"},
10204
    { NULL, NULL}
10205
};
10206
10207
const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name)
10208
7
{
10209
7
    const struct alias  *al;
10210
7
    const struct s_ent *ent;
10211
10212
133
    for (al = digest_alias_tbl; al->name != NULL; al++) {
10213
126
        if(XSTRCMP(name, al->alias) == 0) {
10214
0
            name = al->name;
10215
0
            break;
10216
0
        }
10217
126
    }
10218
10219
32
    for (ent = md_tbl; ent->name != NULL; ent++) {
10220
32
        if(XSTRCMP(name, ent->name) == 0) {
10221
7
            return (WOLFSSL_EVP_MD *)ent->name;
10222
7
        }
10223
32
    }
10224
0
    return NULL;
10225
7
}
10226
10227
/* Returns the NID of the WOLFSSL_EVP_MD passed in.
10228
 *
10229
 * type - pointer to WOLFSSL_EVP_MD for which to return NID value
10230
 *
10231
 * Returns NID on success, or WC_NID_undef if none exists.
10232
 */
10233
int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type)
10234
0
{
10235
0
    const struct s_ent *ent ;
10236
0
    WOLFSSL_ENTER("EVP_MD_type");
10237
10238
0
    if (type == NULL) {
10239
0
        WOLFSSL_MSG("MD type arg is NULL");
10240
0
        return WC_NID_undef;
10241
0
    }
10242
10243
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
10244
0
        if (XSTRCMP((const char *)type, ent->name) == 0) {
10245
0
            return ent->nid;
10246
0
        }
10247
0
    }
10248
0
    return WC_NID_undef;
10249
0
}
10250
10251
#ifndef NO_MD4
10252
10253
    /* return a pointer to MD4 EVP type */
10254
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void)
10255
1
    {
10256
1
        WOLFSSL_ENTER("EVP_md4");
10257
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md4);
10258
1
    }
10259
10260
#endif /* !NO_MD4 */
10261
10262
10263
#ifndef NO_MD5
10264
10265
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void)
10266
1
    {
10267
1
        WOLFSSL_ENTER("EVP_md5");
10268
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md5);
10269
1
    }
10270
10271
#endif /* !NO_MD5 */
10272
10273
#ifdef HAVE_BLAKE2
10274
    /* return EVP_MD
10275
     * @param none
10276
     * @return "blake2b512"
10277
     */
10278
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2b512(void)
10279
0
    {
10280
0
        WOLFSSL_ENTER("wolfSSL_EVP_blake2b512");
10281
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_blake2b512);
10282
0
    }
10283
10284
#endif
10285
10286
#ifdef HAVE_BLAKE2S
10287
    /* return EVP_MD
10288
     * @param none
10289
     * @return "blake2s256"
10290
     */
10291
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2s256(void)
10292
0
    {
10293
0
        WOLFSSL_ENTER("EVP_blake2s256");
10294
0
        return wolfSSL_EVP_get_digestbyname("BLAKE2s256");
10295
0
    }
10296
10297
#endif
10298
10299
10300
#ifndef NO_WOLFSSL_STUB
10301
    void wolfSSL_EVP_set_pw_prompt(const char *prompt)
10302
0
    {
10303
0
        (void)prompt;
10304
0
        WOLFSSL_STUB("EVP_set_pw_prompt");
10305
0
    }
10306
#endif
10307
10308
#ifndef NO_WOLFSSL_STUB
10309
    const WOLFSSL_EVP_MD* wolfSSL_EVP_mdc2(void)
10310
1
    {
10311
1
        WOLFSSL_STUB("EVP_mdc2");
10312
1
        return NULL;
10313
1
    }
10314
#endif
10315
10316
#ifndef NO_SHA
10317
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void)
10318
1
    {
10319
1
        WOLFSSL_ENTER("EVP_sha1");
10320
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha1);
10321
1
    }
10322
#endif /* NO_SHA */
10323
10324
#ifdef WOLFSSL_SHA224
10325
10326
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void)
10327
1
    {
10328
1
        WOLFSSL_ENTER("EVP_sha224");
10329
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha224);
10330
1
    }
10331
10332
#endif /* WOLFSSL_SHA224 */
10333
10334
10335
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void)
10336
1
    {
10337
1
        WOLFSSL_ENTER("EVP_sha256");
10338
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha256);
10339
1
    }
10340
10341
#ifdef WOLFSSL_SHA384
10342
10343
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void)
10344
1
    {
10345
1
        WOLFSSL_ENTER("EVP_sha384");
10346
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha384);
10347
1
    }
10348
10349
#endif /* WOLFSSL_SHA384 */
10350
10351
#ifdef WOLFSSL_SHA512
10352
10353
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void)
10354
1
    {
10355
1
        WOLFSSL_ENTER("EVP_sha512");
10356
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512);
10357
1
    }
10358
10359
#ifndef WOLFSSL_NOSHA512_224
10360
10361
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_224(void)
10362
0
    {
10363
0
        WOLFSSL_ENTER("EVP_sha512_224");
10364
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_224);
10365
0
    }
10366
10367
#endif /* !WOLFSSL_NOSHA512_224 */
10368
10369
#ifndef WOLFSSL_NOSHA512_256
10370
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_256(void)
10371
0
    {
10372
0
        WOLFSSL_ENTER("EVP_sha512_256");
10373
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_256);
10374
0
    }
10375
10376
#endif /* !WOLFSSL_NOSHA512_224 */
10377
10378
#endif /* WOLFSSL_SHA512 */
10379
10380
#ifdef WOLFSSL_SHA3
10381
#ifndef WOLFSSL_NOSHA3_224
10382
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_224(void)
10383
0
    {
10384
0
        WOLFSSL_ENTER("EVP_sha3_224");
10385
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_224);
10386
0
    }
10387
#endif /* WOLFSSL_NOSHA3_224 */
10388
10389
10390
#ifndef WOLFSSL_NOSHA3_256
10391
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_256(void)
10392
0
    {
10393
0
        WOLFSSL_ENTER("EVP_sha3_256");
10394
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_256);
10395
0
    }
10396
#endif /* WOLFSSL_NOSHA3_256 */
10397
10398
#ifndef WOLFSSL_NOSHA3_384
10399
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void)
10400
0
    {
10401
0
        WOLFSSL_ENTER("EVP_sha3_384");
10402
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_384);
10403
0
    }
10404
#endif /* WOLFSSL_NOSHA3_384 */
10405
10406
#ifndef WOLFSSL_NOSHA3_512
10407
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void)
10408
0
    {
10409
0
        WOLFSSL_ENTER("EVP_sha3_512");
10410
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_512);
10411
0
    }
10412
#endif /* WOLFSSL_NOSHA3_512 */
10413
10414
#ifdef WOLFSSL_SHAKE128
10415
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake128(void)
10416
0
    {
10417
0
        WOLFSSL_ENTER("EVP_shake128");
10418
0
        return wolfSSL_EVP_get_digestbyname("SHAKE128");
10419
0
    }
10420
#endif /* WOLFSSL_SHAKE128 */
10421
10422
#ifdef WOLFSSL_SHAKE256
10423
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake256(void)
10424
0
    {
10425
0
        WOLFSSL_ENTER("EVP_shake256");
10426
0
        return wolfSSL_EVP_get_digestbyname("SHAKE256");
10427
0
    }
10428
#endif /* WOLFSSL_SHAKE256 */
10429
10430
#endif /* WOLFSSL_SHA3 */
10431
10432
#ifdef WOLFSSL_SM3
10433
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void)
10434
0
    {
10435
0
        WOLFSSL_ENTER("EVP_sm3");
10436
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sm3);
10437
0
    }
10438
#endif /* WOLFSSL_SM3 */
10439
10440
10441
    WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void)
10442
1.69k
    {
10443
1.69k
        WOLFSSL_EVP_MD_CTX* ctx;
10444
1.69k
        WOLFSSL_ENTER("EVP_MD_CTX_new");
10445
1.69k
        ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof(*ctx), NULL,
10446
1.69k
                                                       DYNAMIC_TYPE_OPENSSL);
10447
1.69k
        if (ctx){
10448
1.69k
            wolfSSL_EVP_MD_CTX_init(ctx);
10449
1.69k
        }
10450
1.69k
        return ctx;
10451
1.69k
    }
10452
10453
    void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX *ctx)
10454
1.69k
    {
10455
1.69k
        if (ctx) {
10456
1.69k
            WOLFSSL_ENTER("EVP_MD_CTX_free");
10457
1.69k
            wolfSSL_EVP_MD_CTX_cleanup(ctx);
10458
1.69k
            XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
10459
1.69k
        }
10460
1.69k
    }
10461
10462
    /* returns the NID of message digest used by the ctx */
10463
    int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx)
10464
0
    {
10465
0
        WOLFSSL_ENTER("EVP_MD_CTX_type");
10466
10467
0
        if (ctx) {
10468
0
            const struct s_ent *ent;
10469
10470
0
            if (ctx->isHMAC) {
10471
0
                return WC_NID_hmac;
10472
0
            }
10473
10474
0
            for(ent = md_tbl; ent->name != NULL; ent++) {
10475
0
                if (ctx->macType == ent->macType) {
10476
0
                    return ent->nid;
10477
0
                }
10478
0
            }
10479
            /* Return whatever we got */
10480
0
            return ctx->macType;
10481
0
        }
10482
0
        return 0;
10483
0
    }
10484
10485
10486
    /* returns digest size */
10487
0
    int wolfSSL_EVP_MD_CTX_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10488
0
        return(wolfSSL_EVP_MD_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10489
0
    }
10490
    /* returns block size */
10491
0
    int wolfSSL_EVP_MD_CTX_block_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10492
0
        return(wolfSSL_EVP_MD_block_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10493
0
    }
10494
10495
    void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx)
10496
2.43k
    {
10497
2.43k
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_init");
10498
2.43k
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_MD_CTX));
10499
2.43k
    }
10500
10501
    const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx)
10502
36.0k
    {
10503
36.0k
        const struct s_ent *ent;
10504
36.0k
        if (ctx == NULL)
10505
0
            return NULL;
10506
36.0k
        WOLFSSL_ENTER("EVP_MD_CTX_md");
10507
36.0k
        if (ctx->isHMAC) {
10508
0
            return "HMAC";
10509
0
        }
10510
150k
        for(ent = md_tbl; ent->name != NULL; ent++) {
10511
150k
            if(ctx->macType == ent->macType) {
10512
36.0k
                return (const WOLFSSL_EVP_MD *)ent->name;
10513
36.0k
            }
10514
150k
        }
10515
0
        return (WOLFSSL_EVP_MD *)NULL;
10516
36.0k
    }
10517
10518
    /* return alias name if has
10519
     * @param n message digest type name
10520
     * @return alias name, otherwise NULL
10521
     */
10522
    static const char* getMdAliasName(const char* n)
10523
0
    {
10524
10525
0
        const char* aliasnm = NULL;
10526
0
        const struct alias  *al;
10527
10528
0
        for (al = digest_alias_tbl; al->name != NULL; al++)
10529
0
            if(XSTRCMP(n, al->name) == 0) {
10530
0
                aliasnm = al->alias;
10531
0
                break;
10532
0
            }
10533
10534
0
        return aliasnm;
10535
0
    }
10536
10537
10538
    struct do_all_md {
10539
        void *arg;
10540
        void (*fn) (const WOLFSSL_EVP_MD *m,
10541
                    const char* from, const char* to, void *arg);
10542
    };
10543
10544
    /* do all md algorithm
10545
     * @param nm a pointer to WOLFSSL_OBJ_NAME
10546
     * @param arg arguments to pass to the callback
10547
     * @return none
10548
     */
10549
    static void md_do_all_func(const WOLFSSL_OBJ_NAME* nm, void* arg)
10550
0
    {
10551
0
        struct do_all_md *md = (struct do_all_md*)arg;
10552
10553
        /* sanity check */
10554
0
        if (md == NULL || nm == NULL || md->fn == NULL ||
10555
0
            nm->type != WOLFSSL_OBJ_NAME_TYPE_MD_METH)
10556
0
            return;
10557
10558
0
        if (nm->alias)
10559
0
            md->fn(NULL, nm->name, nm->data, md->arg);
10560
0
        else
10561
0
            md->fn((const WOLFSSL_EVP_MD *)nm->data, nm->name, NULL, md->arg);
10562
0
    }
10563
10564
    /* call md_do_all function to do all md algorithm via a callback function
10565
     * @param fn a callback function to be called with all 'md'
10566
     * @param args arguments to pass to the callback
10567
     * @return none
10568
     */
10569
    void wolfSSL_EVP_MD_do_all(void (*fn) (const WOLFSSL_EVP_MD *m,
10570
                 const char* from, const char* to, void* xx), void* args)
10571
0
    {
10572
0
        struct do_all_md md;
10573
10574
0
        md.fn = fn;
10575
0
        md.arg = args;
10576
10577
0
        wolfSSL_OBJ_NAME_do_all(WOLFSSL_OBJ_NAME_TYPE_MD_METH,
10578
0
                        md_do_all_func, &md);
10579
0
    }
10580
10581
    /* call "fn" based on OBJ_NAME type
10582
     * @param type OBJ_NAME type
10583
     * @param fn a callback function
10584
     * @param args arguments to pass to the callback
10585
     * @return none
10586
     */
10587
    void wolfSSL_OBJ_NAME_do_all(int type,
10588
                void (*fn)(const WOLFSSL_OBJ_NAME*, void* arg), void* arg)
10589
0
    {
10590
0
        WOLFSSL_OBJ_NAME objnm;
10591
10592
        /* sanity check */
10593
0
        if (!fn)
10594
0
            return;
10595
10596
0
        switch(type) {
10597
0
            case WOLFSSL_OBJ_NAME_TYPE_MD_METH:
10598
0
                {
10599
0
                    const struct s_ent *ent;
10600
                    /* loop all md */
10601
0
                    for (ent = md_tbl; ent->name != NULL; ent++){
10602
0
                        XMEMSET(&objnm, 0, sizeof(objnm));
10603
10604
                        /* populate objnm with info about the md */
10605
0
                        objnm.type = WOLFSSL_OBJ_NAME_TYPE_MD_METH;
10606
0
                        objnm.name = ent->name;
10607
0
                        objnm.data = (const char*)
10608
0
                                wolfSSL_EVP_get_digestbyname(ent->name);
10609
0
                        fn(&objnm, arg);
10610
10611
                        /* check if the md has alias and also call fn with it */
10612
0
                        objnm.name = getMdAliasName(ent->name);
10613
0
                        if (objnm.name != NULL) {
10614
0
                            objnm.alias |= WOLFSSL_OBJ_NAME_ALIAS;
10615
0
                            objnm.data = ent->name;
10616
0
                            fn(&objnm, arg);
10617
0
                        }
10618
0
                    }
10619
0
                }
10620
0
                break;
10621
0
            case WOLFSSL_OBJ_NAME_TYPE_CIPHER_METH:
10622
0
            case WOLFSSL_OBJ_NAME_TYPE_PKEY_METH:
10623
0
            case WOLFSSL_OBJ_NAME_TYPE_COMP_METH:
10624
0
            case WOLFSSL_OBJ_NAME_TYPE_NUM:
10625
0
                WOLFSSL_MSG("not implemented");
10626
0
                FALL_THROUGH;
10627
0
            case WOLFSSL_OBJ_NAME_TYPE_UNDEF:
10628
0
            default:
10629
0
                break;
10630
0
        }
10631
0
    }
10632
10633
    int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx)
10634
1.69k
    {
10635
1.69k
        int ret = WOLFSSL_SUCCESS;
10636
1.69k
        WOLFSSL_ENTER("wolfSSL_EVP_MD_CTX_cleanup");
10637
1.69k
    #ifdef OPENSSL_EXTRA
10638
1.69k
        if (ctx->pctx != NULL)
10639
481
            wolfSSL_EVP_PKEY_CTX_free(ctx->pctx);
10640
1.69k
    #endif
10641
10642
1.69k
        if (ctx->isHMAC) {
10643
481
            wc_HmacFree(&ctx->hash.hmac);
10644
481
        }
10645
1.21k
        else {
10646
1.21k
            switch (ctx->macType) {
10647
93
                case WC_HASH_TYPE_MD5:
10648
93
            #ifndef NO_MD5
10649
93
                    wc_Md5Free((wc_Md5*)&ctx->hash.digest);
10650
93
            #endif /* !NO_MD5 */
10651
93
                    break;
10652
83
                case WC_HASH_TYPE_SHA:
10653
83
            #ifndef NO_SHA
10654
83
                    wc_ShaFree((wc_Sha*)&ctx->hash.digest);
10655
83
            #endif /* !NO_SHA */
10656
83
                    break;
10657
84
                case WC_HASH_TYPE_SHA224:
10658
84
            #ifdef WOLFSSL_SHA224
10659
84
                    wc_Sha224Free((wc_Sha224*)&ctx->hash.digest);
10660
84
            #endif /* WOLFSSL_SHA224 */
10661
84
                    break;
10662
123
                case WC_HASH_TYPE_SHA256:
10663
123
            #ifndef NO_SHA256
10664
123
                    wc_Sha256Free((wc_Sha256*)&ctx->hash.digest);
10665
123
            #endif /* !NO_SHA256 */
10666
123
                    break;
10667
64
                case WC_HASH_TYPE_SHA384:
10668
64
            #ifdef WOLFSSL_SHA384
10669
64
                    wc_Sha384Free((wc_Sha384*)&ctx->hash.digest);
10670
64
            #endif /* WOLFSSL_SHA384 */
10671
64
                    break;
10672
132
                case WC_HASH_TYPE_SHA512:
10673
132
            #ifdef WOLFSSL_SHA512
10674
132
                    wc_Sha512Free((wc_Sha512*)&ctx->hash.digest);
10675
132
            #endif /* WOLFSSL_SHA512 */
10676
132
                    break;
10677
0
            #ifndef WOLFSSL_NOSHA512_224
10678
0
                case WC_HASH_TYPE_SHA512_224:
10679
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10680
0
                defined(WOLFSSL_SHA512)
10681
0
                    wc_Sha512_224Free((wc_Sha512*)&ctx->hash.digest);
10682
0
            #endif
10683
0
                    break;
10684
0
            #endif /* !WOLFSSL_NOSHA512_224 */
10685
0
            #ifndef WOLFSSL_NOSHA512_256
10686
0
                case WC_HASH_TYPE_SHA512_256:
10687
0
             #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10688
0
                 defined(WOLFSSL_SHA512)
10689
0
                    wc_Sha512_256Free((wc_Sha512*)&ctx->hash.digest);
10690
0
            #endif
10691
0
                    break;
10692
0
            #endif /* !WOLFSSL_NOSHA512_256 */
10693
0
                case WC_HASH_TYPE_SHA3_224:
10694
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
10695
0
                    wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest);
10696
0
            #endif
10697
0
                    break;
10698
0
                case WC_HASH_TYPE_SHA3_256:
10699
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
10700
0
                    wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest);
10701
0
            #endif
10702
0
                    break;
10703
0
                case WC_HASH_TYPE_SHA3_384:
10704
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
10705
0
                    wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest);
10706
0
            #endif
10707
0
                    break;
10708
0
                case WC_HASH_TYPE_SHA3_512:
10709
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
10710
0
                    wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest);
10711
0
            #endif
10712
0
                    break;
10713
0
            #ifdef WOLFSSL_SM3
10714
0
                case WC_HASH_TYPE_SM3:
10715
0
                    wc_Sm3Free(&ctx->hash.digest.sm3);
10716
0
                    break;
10717
0
            #endif
10718
468
                case WC_HASH_TYPE_NONE:
10719
                    /* Not an error since an unused struct could be free'd or
10720
                     * reset. */
10721
468
                    break;
10722
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
10723
0
                case WC_HASH_TYPE_SHAKE128:
10724
0
                    wc_Shake128_Free(&ctx->hash.digest.shake);
10725
0
                    break;
10726
0
            #endif
10727
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
10728
0
                case WC_HASH_TYPE_SHAKE256:
10729
0
                    wc_Shake256_Free(&ctx->hash.digest.shake);
10730
0
                    break;
10731
0
            #endif
10732
0
                case WC_HASH_TYPE_MD2:
10733
165
                case WC_HASH_TYPE_MD4:
10734
165
                case WC_HASH_TYPE_MD5_SHA:
10735
165
                case WC_HASH_TYPE_BLAKE2B:
10736
165
                case WC_HASH_TYPE_BLAKE2S:
10737
165
                default:
10738
165
                    ret = WOLFSSL_FAILURE;
10739
165
                    break;
10740
1.21k
            }
10741
1.21k
        }
10742
1.69k
        ForceZero(ctx, sizeof(*ctx));
10743
1.69k
        ctx->macType = WC_HASH_TYPE_NONE;
10744
1.69k
        return ret;
10745
1.69k
    }
10746
10747
    /* WOLFSSL_SUCCESS on ok */
10748
    int wolfSSL_EVP_DigestInit(WOLFSSL_EVP_MD_CTX* ctx,
10749
                               const WOLFSSL_EVP_MD* md)
10750
744
    {
10751
744
        int ret = WOLFSSL_SUCCESS;
10752
    #ifdef WOLFSSL_ASYNC_CRYPT
10753
        wc_static_assert(WC_ASYNC_DEV_SIZE >= sizeof(WC_ASYNC_DEV));
10754
    #endif
10755
10756
744
        WOLFSSL_ENTER("EVP_DigestInit");
10757
10758
744
        if (ctx == NULL) {
10759
0
            return WOLFSSL_FAILURE;
10760
0
        }
10761
10762
744
        wolfSSL_EVP_MD_CTX_init(ctx);
10763
10764
        /* Set to 0 if no match */
10765
744
        ctx->macType = EvpMd2MacType(md);
10766
744
        if (md == NULL) {
10767
0
             XMEMSET(&ctx->hash.digest, 0, sizeof(WOLFSSL_Hasher));
10768
0
        } else
10769
744
    #ifndef NO_SHA
10770
744
        if ((XSTRCMP(md, "SHA") == 0) || (XSTRCMP(md, WC_SN_sha1) == 0)) {
10771
83
             ret = wolfSSL_SHA_Init(&(ctx->hash.digest.sha));
10772
83
        } else
10773
661
    #endif
10774
661
    #ifndef NO_SHA256
10775
661
        if (XSTRCMP(md, WC_SN_sha256) == 0) {
10776
123
             ret = wolfSSL_SHA256_Init(&(ctx->hash.digest.sha256));
10777
123
        } else
10778
538
    #endif
10779
538
    #ifdef WOLFSSL_SHA224
10780
538
        if (XSTRCMP(md, WC_SN_sha224) == 0) {
10781
84
             ret = wolfSSL_SHA224_Init(&(ctx->hash.digest.sha224));
10782
84
        } else
10783
454
    #endif
10784
454
    #ifdef WOLFSSL_SHA384
10785
454
        if (XSTRCMP(md, WC_SN_sha384) == 0) {
10786
64
             ret = wolfSSL_SHA384_Init(&(ctx->hash.digest.sha384));
10787
64
        } else
10788
390
    #endif
10789
390
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10790
390
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10791
390
        if (XSTRCMP(md, WC_SN_sha512_224) == 0) {
10792
0
             ret = wolfSSL_SHA512_224_Init(&(ctx->hash.digest.sha512));
10793
0
        } else
10794
390
    #endif
10795
390
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10796
390
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10797
390
        if (XSTRCMP(md, WC_SN_sha512_256) == 0) {
10798
0
             ret = wolfSSL_SHA512_256_Init(&(ctx->hash.digest.sha512));
10799
0
        } else
10800
390
    #endif
10801
390
    #ifdef WOLFSSL_SHA512
10802
390
        if (XSTRCMP(md, WC_SN_sha512) == 0) {
10803
132
             ret = wolfSSL_SHA512_Init(&(ctx->hash.digest.sha512));
10804
132
        } else
10805
258
    #endif
10806
258
    #ifndef NO_MD4
10807
258
        if (XSTRCMP(md, WC_SN_md4) == 0) {
10808
165
            wolfSSL_MD4_Init(&(ctx->hash.digest.md4));
10809
165
        } else
10810
93
    #endif
10811
93
    #ifndef NO_MD5
10812
93
        if (XSTRCMP(md, WC_SN_md5) == 0) {
10813
93
            ret = wolfSSL_MD5_Init(&(ctx->hash.digest.md5));
10814
93
        } else
10815
0
    #endif
10816
0
#ifdef WOLFSSL_SHA3
10817
0
    #ifndef WOLFSSL_NOSHA3_224
10818
0
        if (XSTRCMP(md, WC_SN_sha3_224) == 0) {
10819
0
             ret = wolfSSL_SHA3_224_Init(&(ctx->hash.digest.sha3_224));
10820
0
        } else
10821
0
    #endif
10822
0
    #ifndef WOLFSSL_NOSHA3_256
10823
0
        if (XSTRCMP(md, WC_SN_sha3_256) == 0) {
10824
0
             ret = wolfSSL_SHA3_256_Init(&(ctx->hash.digest.sha3_256));
10825
0
        } else
10826
0
    #endif
10827
0
    #ifndef WOLFSSL_NOSHA3_384
10828
0
        if (XSTRCMP(md, WC_SN_sha3_384) == 0) {
10829
0
             ret = wolfSSL_SHA3_384_Init(&(ctx->hash.digest.sha3_384));
10830
0
        } else
10831
0
    #endif
10832
0
    #ifndef WOLFSSL_NOSHA3_512
10833
0
        if (XSTRCMP(md, WC_SN_sha3_512) == 0) {
10834
0
             ret = wolfSSL_SHA3_512_Init(&(ctx->hash.digest.sha3_512));
10835
0
        } else
10836
0
    #endif
10837
0
    #ifdef WOLFSSL_SHAKE128
10838
0
        if (XSTRCMP(md, WC_SN_shake128) == 0) {
10839
0
            if (wc_InitShake128(&(ctx->hash.digest.shake), NULL,
10840
0
                INVALID_DEVID) != 0) {
10841
0
                ret = WOLFSSL_FAILURE;
10842
0
            }
10843
0
        } else
10844
0
    #endif
10845
0
    #ifdef WOLFSSL_SHAKE256
10846
0
        if (XSTRCMP(md, WC_SN_shake256) == 0) {
10847
0
            if (wc_InitShake256(&(ctx->hash.digest.shake), NULL,
10848
0
                INVALID_DEVID) != 0) {
10849
0
                ret = WOLFSSL_FAILURE;
10850
0
            }
10851
0
        } else
10852
0
    #endif
10853
0
#endif
10854
0
    #ifdef WOLFSSL_SM3
10855
0
        if (XSTRCMP(md, WC_SN_sm3) == 0) {
10856
0
             ret = wc_InitSm3(&ctx->hash.digest.sm3, NULL, INVALID_DEVID);
10857
0
             if (ret == 0) {
10858
0
                ret = WOLFSSL_SUCCESS;
10859
0
             }
10860
0
             else {
10861
0
                ret = WOLFSSL_FAILURE;
10862
0
             }
10863
0
        } else
10864
0
    #endif
10865
0
        {
10866
0
             ctx->macType = WC_HASH_TYPE_NONE;
10867
0
             return WOLFSSL_FAILURE;
10868
0
        }
10869
10870
744
        return ret;
10871
744
    }
10872
10873
    /* WOLFSSL_SUCCESS on ok, WOLFSSL_FAILURE on failure */
10874
    int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data,
10875
                                size_t sz)
10876
35.2k
    {
10877
35.2k
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
10878
35.2k
        enum wc_HashType macType;
10879
10880
35.2k
        WOLFSSL_ENTER("EVP_DigestUpdate");
10881
10882
35.2k
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
10883
35.2k
        switch (macType) {
10884
6.45k
            case WC_HASH_TYPE_MD4:
10885
6.45k
        #ifndef NO_MD4
10886
6.45k
                wolfSSL_MD4_Update((WOLFSSL_MD4_CTX*)&ctx->hash, data,
10887
6.45k
                                  (unsigned long)sz);
10888
6.45k
                ret = WOLFSSL_SUCCESS;
10889
6.45k
        #endif
10890
6.45k
                break;
10891
4.11k
            case WC_HASH_TYPE_MD5:
10892
4.11k
        #ifndef NO_MD5
10893
4.11k
                ret = wolfSSL_MD5_Update((WOLFSSL_MD5_CTX*)&ctx->hash, data,
10894
4.11k
                                  (unsigned long)sz);
10895
4.11k
        #endif
10896
4.11k
                break;
10897
9.45k
            case WC_HASH_TYPE_SHA:
10898
9.45k
        #ifndef NO_SHA
10899
9.45k
                ret = wolfSSL_SHA_Update((WOLFSSL_SHA_CTX*)&ctx->hash, data,
10900
9.45k
                                  (unsigned long)sz);
10901
9.45k
        #endif
10902
9.45k
                break;
10903
3.33k
            case WC_HASH_TYPE_SHA224:
10904
3.33k
        #ifdef WOLFSSL_SHA224
10905
3.33k
                ret = wolfSSL_SHA224_Update((WOLFSSL_SHA224_CTX*)&ctx->hash, data,
10906
3.33k
                                     (unsigned long)sz);
10907
3.33k
        #endif
10908
3.33k
                break;
10909
3.22k
            case WC_HASH_TYPE_SHA256:
10910
3.22k
        #ifndef NO_SHA256
10911
3.22k
                ret = wolfSSL_SHA256_Update((WOLFSSL_SHA256_CTX*)&ctx->hash, data,
10912
3.22k
                                     (unsigned long)sz);
10913
3.22k
        #endif /* !NO_SHA256 */
10914
3.22k
                break;
10915
1.49k
            case WC_HASH_TYPE_SHA384:
10916
1.49k
        #ifdef WOLFSSL_SHA384
10917
1.49k
                ret = wolfSSL_SHA384_Update((WOLFSSL_SHA384_CTX*)&ctx->hash, data,
10918
1.49k
                                     (unsigned long)sz);
10919
1.49k
        #endif
10920
1.49k
                break;
10921
7.20k
            case WC_HASH_TYPE_SHA512:
10922
7.20k
        #ifdef WOLFSSL_SHA512
10923
7.20k
                ret = wolfSSL_SHA512_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10924
7.20k
                                     (unsigned long)sz);
10925
7.20k
        #endif /* WOLFSSL_SHA512 */
10926
7.20k
                break;
10927
10928
0
        #ifndef WOLFSSL_NOSHA512_224
10929
0
            case WC_HASH_TYPE_SHA512_224:
10930
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10931
0
            defined(WOLFSSL_SHA512)
10932
0
                ret = wolfSSL_SHA512_224_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10933
0
                                     (unsigned long)sz);
10934
0
        #endif
10935
0
                break;
10936
0
        #endif /* !WOLFSSL_NOSHA512_224 */
10937
10938
0
        #ifndef WOLFSSL_NOSHA512_256
10939
0
            case WC_HASH_TYPE_SHA512_256:
10940
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10941
0
            defined(WOLFSSL_SHA512)
10942
0
                ret = wolfSSL_SHA512_256_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10943
0
                                     (unsigned long)sz);
10944
0
        #endif /* WOLFSSL_SHA512 */
10945
0
                break;
10946
0
        #endif /* !WOLFSSL_NOSHA512_256 */
10947
10948
0
            case WC_HASH_TYPE_SHA3_224:
10949
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
10950
0
                ret = wolfSSL_SHA3_224_Update((WOLFSSL_SHA3_224_CTX*)&ctx->hash, data,
10951
0
                                     (unsigned long)sz);
10952
0
        #endif
10953
0
                break;
10954
0
            case WC_HASH_TYPE_SHA3_256:
10955
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
10956
0
                ret = wolfSSL_SHA3_256_Update((WOLFSSL_SHA3_256_CTX*)&ctx->hash, data,
10957
0
                                     (unsigned long)sz);
10958
0
        #endif
10959
0
                break;
10960
0
            case WC_HASH_TYPE_SHA3_384:
10961
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
10962
0
                ret = wolfSSL_SHA3_384_Update((WOLFSSL_SHA3_384_CTX*)&ctx->hash, data,
10963
0
                                     (unsigned long)sz);
10964
0
        #endif
10965
0
                break;
10966
0
            case WC_HASH_TYPE_SHA3_512:
10967
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
10968
0
                ret = wolfSSL_SHA3_512_Update((WOLFSSL_SHA3_512_CTX*)&ctx->hash, data,
10969
0
                                     (unsigned long)sz);
10970
0
        #endif
10971
0
                break;
10972
0
        #ifdef WOLFSSL_SM3
10973
0
            case WC_HASH_TYPE_SM3:
10974
0
                ret = wc_Sm3Update(&ctx->hash.digest.sm3, data, (word32)sz);
10975
0
                if (ret == 0) {
10976
0
                    ret = WOLFSSL_SUCCESS;
10977
0
                }
10978
0
                else {
10979
0
                    ret = WOLFSSL_FAILURE;
10980
0
                }
10981
0
                break;
10982
0
        #endif
10983
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
10984
0
            case WC_HASH_TYPE_SHAKE128:
10985
0
                if (wc_Shake128_Update(&ctx->hash.digest.shake,
10986
0
                        (const byte*)data, (word32)sz) == 0) {
10987
10988
0
                    ret = WOLFSSL_SUCCESS;
10989
0
                }
10990
0
                break;
10991
0
        #endif
10992
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
10993
0
            case WC_HASH_TYPE_SHAKE256:
10994
0
                if (wc_Shake256_Update(&ctx->hash.digest.shake,
10995
0
                        (const byte*)data, (word32)sz) == 0) {
10996
0
                    ret = WOLFSSL_SUCCESS;
10997
0
                }
10998
0
                break;
10999
0
        #endif
11000
0
            case WC_HASH_TYPE_NONE:
11001
0
            case WC_HASH_TYPE_MD2:
11002
0
            case WC_HASH_TYPE_MD5_SHA:
11003
0
            case WC_HASH_TYPE_BLAKE2B:
11004
0
            case WC_HASH_TYPE_BLAKE2S:
11005
0
            default:
11006
0
                return WOLFSSL_FAILURE;
11007
35.2k
        }
11008
11009
35.2k
        return ret;
11010
35.2k
    }
11011
11012
    /* WOLFSSL_SUCCESS on ok */
11013
    static int wolfSSL_EVP_DigestFinal_Common(WOLFSSL_EVP_MD_CTX* ctx,
11014
            unsigned char* md, unsigned int* s, enum wc_HashType macType)
11015
744
    {
11016
744
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11017
11018
744
        switch (macType) {
11019
165
            case WC_HASH_TYPE_MD4:
11020
165
        #ifndef NO_MD4
11021
165
                wolfSSL_MD4_Final(md, (WOLFSSL_MD4_CTX*)&ctx->hash);
11022
165
                if (s) *s = WC_MD4_DIGEST_SIZE;
11023
165
                ret = WOLFSSL_SUCCESS;
11024
165
        #endif
11025
165
                break;
11026
93
            case WC_HASH_TYPE_MD5:
11027
93
        #ifndef NO_MD5
11028
93
                ret = wolfSSL_MD5_Final(md, (WOLFSSL_MD5_CTX*)&ctx->hash);
11029
93
                if (s) *s = WC_MD5_DIGEST_SIZE;
11030
93
        #endif
11031
93
                break;
11032
83
            case WC_HASH_TYPE_SHA:
11033
83
        #ifndef NO_SHA
11034
83
                ret = wolfSSL_SHA_Final(md, (WOLFSSL_SHA_CTX*)&ctx->hash);
11035
83
                if (s) *s = WC_SHA_DIGEST_SIZE;
11036
83
        #endif
11037
83
                break;
11038
84
            case WC_HASH_TYPE_SHA224:
11039
84
        #ifdef WOLFSSL_SHA224
11040
84
                ret = wolfSSL_SHA224_Final(md, (WOLFSSL_SHA224_CTX*)&ctx->hash);
11041
84
                if (s) *s = WC_SHA224_DIGEST_SIZE;
11042
84
        #endif
11043
84
                break;
11044
123
            case WC_HASH_TYPE_SHA256:
11045
123
        #ifndef NO_SHA256
11046
123
                ret = wolfSSL_SHA256_Final(md, (WOLFSSL_SHA256_CTX*)&ctx->hash);
11047
123
                if (s) *s = WC_SHA256_DIGEST_SIZE;
11048
123
        #endif /* !NO_SHA256 */
11049
123
                break;
11050
64
            case WC_HASH_TYPE_SHA384:
11051
64
        #ifdef WOLFSSL_SHA384
11052
64
                ret = wolfSSL_SHA384_Final(md, (WOLFSSL_SHA384_CTX*)&ctx->hash);
11053
64
                if (s) *s = WC_SHA384_DIGEST_SIZE;
11054
64
        #endif
11055
64
                break;
11056
132
            case WC_HASH_TYPE_SHA512:
11057
132
        #ifdef WOLFSSL_SHA512
11058
132
                ret = wolfSSL_SHA512_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11059
132
                if (s) *s = WC_SHA512_DIGEST_SIZE;
11060
132
        #endif /* WOLFSSL_SHA512 */
11061
132
                break;
11062
0
        #ifndef WOLFSSL_NOSHA512_224
11063
0
            case WC_HASH_TYPE_SHA512_224:
11064
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11065
0
            defined(WOLFSSL_SHA512)
11066
0
                ret = wolfSSL_SHA512_224_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11067
0
                if (s) *s = WC_SHA512_224_DIGEST_SIZE;
11068
0
        #endif
11069
0
                break;
11070
0
        #endif /* !WOLFSSL_NOSHA512_224 */
11071
0
        #ifndef WOLFSSL_NOSHA512_256
11072
0
            case WC_HASH_TYPE_SHA512_256:
11073
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11074
0
            defined(WOLFSSL_SHA512)
11075
0
                ret = wolfSSL_SHA512_256_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11076
0
                if (s) *s = WC_SHA512_256_DIGEST_SIZE;
11077
0
        #endif
11078
0
                break;
11079
0
        #endif /* !WOLFSSL_NOSHA512_256 */
11080
0
            case WC_HASH_TYPE_SHA3_224:
11081
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
11082
0
                ret = wolfSSL_SHA3_224_Final(md, (WOLFSSL_SHA3_224_CTX*)&ctx->hash);
11083
0
                if (s) *s = WC_SHA3_224_DIGEST_SIZE;
11084
0
        #endif
11085
0
                break;
11086
0
            case WC_HASH_TYPE_SHA3_256:
11087
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
11088
0
                ret = wolfSSL_SHA3_256_Final(md, (WOLFSSL_SHA3_256_CTX*)&ctx->hash);
11089
0
                if (s) *s = WC_SHA3_256_DIGEST_SIZE;
11090
0
        #endif
11091
0
                break;
11092
0
            case WC_HASH_TYPE_SHA3_384:
11093
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
11094
0
                ret = wolfSSL_SHA3_384_Final(md, (WOLFSSL_SHA3_384_CTX*)&ctx->hash);
11095
0
                if (s) *s = WC_SHA3_384_DIGEST_SIZE;
11096
0
        #endif
11097
0
                break;
11098
0
            case WC_HASH_TYPE_SHA3_512:
11099
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
11100
0
                ret = wolfSSL_SHA3_512_Final(md, (WOLFSSL_SHA3_512_CTX*)&ctx->hash);
11101
0
                if (s) *s = WC_SHA3_512_DIGEST_SIZE;
11102
0
        #endif
11103
0
                break;
11104
0
        #ifdef WOLFSSL_SM3
11105
0
            case WC_HASH_TYPE_SM3:
11106
0
                ret = wc_Sm3Final(&ctx->hash.digest.sm3, md);
11107
0
                if (ret == 0) {
11108
0
                    ret = WOLFSSL_SUCCESS;
11109
0
                }
11110
0
                else {
11111
0
                    ret = WOLFSSL_FAILURE;
11112
0
                }
11113
0
                if (s) *s = WC_SM3_DIGEST_SIZE;
11114
0
                break;
11115
0
        #endif
11116
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11117
0
            case WC_HASH_TYPE_SHAKE128:
11118
0
                if (wc_Shake128_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11119
0
                    ret = WOLFSSL_SUCCESS;
11120
0
                }
11121
0
                break;
11122
0
        #endif
11123
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11124
0
            case WC_HASH_TYPE_SHAKE256:
11125
0
                if (wc_Shake256_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11126
0
                    ret = WOLFSSL_SUCCESS;
11127
0
                }
11128
0
                break;
11129
0
        #endif
11130
0
            case WC_HASH_TYPE_NONE:
11131
0
            case WC_HASH_TYPE_MD2:
11132
0
            case WC_HASH_TYPE_MD5_SHA:
11133
0
            case WC_HASH_TYPE_BLAKE2B:
11134
0
            case WC_HASH_TYPE_BLAKE2S:
11135
0
            default:
11136
0
                return WOLFSSL_FAILURE;
11137
744
        }
11138
11139
744
        return ret;
11140
744
    }
11141
11142
    int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11143
                               unsigned int* s)
11144
744
    {
11145
744
        enum wc_HashType macType;
11146
11147
744
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinal");
11148
744
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11149
744
        switch (macType) {
11150
165
            case WC_HASH_TYPE_MD4:
11151
258
            case WC_HASH_TYPE_MD5:
11152
341
            case WC_HASH_TYPE_SHA:
11153
425
            case WC_HASH_TYPE_SHA224:
11154
548
            case WC_HASH_TYPE_SHA256:
11155
612
            case WC_HASH_TYPE_SHA384:
11156
744
            case WC_HASH_TYPE_SHA512:
11157
744
        #ifndef WOLFSSL_NOSHA512_224
11158
744
            case WC_HASH_TYPE_SHA512_224:
11159
744
        #endif /* !WOLFSSL_NOSHA512_224 */
11160
744
        #ifndef WOLFSSL_NOSHA512_256
11161
744
            case WC_HASH_TYPE_SHA512_256:
11162
744
        #endif /* !WOLFSSL_NOSHA512_256 */
11163
744
            case WC_HASH_TYPE_SHA3_224:
11164
744
            case WC_HASH_TYPE_SHA3_256:
11165
744
            case WC_HASH_TYPE_SHA3_384:
11166
744
            case WC_HASH_TYPE_SHA3_512:
11167
744
        #ifdef WOLFSSL_SM3
11168
744
            case WC_HASH_TYPE_SM3:
11169
744
        #endif
11170
744
            case WC_HASH_TYPE_NONE:
11171
744
            case WC_HASH_TYPE_MD2:
11172
744
            case WC_HASH_TYPE_MD5_SHA:
11173
744
            case WC_HASH_TYPE_BLAKE2B:
11174
744
            case WC_HASH_TYPE_BLAKE2S:
11175
744
                break;
11176
11177
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11178
0
            case WC_HASH_TYPE_SHAKE128:
11179
0
                *s = 16; /* if mixing up XOF with plain digest 128 bit is
11180
                          * default for SHAKE128 */
11181
0
                break;
11182
0
        #endif
11183
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11184
0
            case WC_HASH_TYPE_SHAKE256:
11185
0
                *s = 32; /* if mixing up XOF with plain digest 256 bit is
11186
                          * default for SHAKE256 */
11187
0
                break;
11188
0
        #endif
11189
0
            default:
11190
0
                return WOLFSSL_FAILURE;
11191
744
        }
11192
744
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, s, macType);
11193
744
    }
11194
11195
    /* WOLFSSL_SUCCESS on ok */
11196
    int wolfSSL_EVP_DigestFinal_ex(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11197
                                   unsigned int* s)
11198
744
    {
11199
744
        WOLFSSL_ENTER("EVP_DigestFinal_ex");
11200
744
        return wolfSSL_EVP_DigestFinal(ctx, md, s);
11201
744
    }
11202
11203
11204
    /* XOF stands for extendable-output functions. This is used for algos such
11205
     * as SHAKE256.
11206
     *
11207
     * returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on fail */
11208
    int wolfSSL_EVP_DigestFinalXOF(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *md,
11209
        size_t sz)
11210
0
    {
11211
0
        unsigned int len;
11212
0
        enum wc_HashType macType;
11213
11214
0
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinalXOF");
11215
0
        len = (unsigned int)sz;
11216
11217
0
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11218
0
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, &len, macType);
11219
0
    }
11220
11221
11222
    unsigned long wolfSSL_EVP_MD_flags(const WOLFSSL_EVP_MD *md)
11223
0
    {
11224
0
        enum wc_HashType macType;
11225
11226
0
        macType = EvpMd2MacType(md);
11227
0
        switch ((int)macType) {
11228
0
            case WC_HASH_TYPE_BLAKE2B:
11229
0
            case WC_HASH_TYPE_BLAKE2S:
11230
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11231
0
            case WC_HASH_TYPE_SHAKE128:
11232
0
        #endif
11233
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11234
0
            case WC_HASH_TYPE_SHAKE256:
11235
0
        #endif
11236
0
                return WOLFSSL_EVP_MD_FLAG_XOF;
11237
0
            default:
11238
0
                return 0;
11239
0
        }
11240
0
    }
11241
11242
11243
    void wolfSSL_EVP_cleanup(void)
11244
0
    {
11245
        /* nothing to do here */
11246
0
    }
11247
11248
const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id)
11249
0
{
11250
0
    WOLFSSL_MSG("wolfSSL_get_digestbynid");
11251
11252
0
    switch(id) {
11253
0
#ifndef NO_MD4
11254
0
        case WC_NID_md4:
11255
0
            return wolfSSL_EVP_md4();
11256
0
#endif
11257
0
#ifndef NO_MD5
11258
0
        case WC_NID_md5:
11259
0
            return wolfSSL_EVP_md5();
11260
0
#endif
11261
0
#ifndef NO_SHA
11262
0
        case WC_NID_sha1:
11263
0
            return wolfSSL_EVP_sha1();
11264
0
#endif
11265
0
#ifdef WOLFSSL_SHA224
11266
0
        case WC_NID_sha224:
11267
0
            return wolfSSL_EVP_sha224();
11268
0
#endif
11269
0
#ifndef NO_SHA256
11270
0
        case WC_NID_sha256:
11271
0
            return wolfSSL_EVP_sha256();
11272
0
#endif
11273
0
#ifdef WOLFSSL_SHA384
11274
0
        case WC_NID_sha384:
11275
0
            return wolfSSL_EVP_sha384();
11276
0
#endif
11277
0
#ifdef WOLFSSL_SHA512
11278
0
        case WC_NID_sha512:
11279
0
            return wolfSSL_EVP_sha512();
11280
0
#endif
11281
0
#ifdef WOLFSSL_SM3
11282
0
        case WC_NID_sm3:
11283
0
            return wolfSSL_EVP_sm3();
11284
0
#endif
11285
0
        default:
11286
0
            WOLFSSL_MSG("Bad digest id value");
11287
0
    }
11288
11289
0
    return NULL;
11290
0
}
11291
int wolfSSL_EVP_MD_block_size(const WOLFSSL_EVP_MD* type)
11292
0
{
11293
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_block_size");
11294
11295
0
    if (type == NULL) {
11296
0
        WOLFSSL_MSG("No md type arg");
11297
0
        return WOLFSSL_FAILURE;
11298
0
    }
11299
11300
0
#ifndef NO_SHA
11301
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11302
0
        return WC_SHA_BLOCK_SIZE;
11303
0
    } else
11304
0
#endif
11305
0
#ifndef NO_SHA256
11306
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11307
0
        return WC_SHA256_BLOCK_SIZE;
11308
0
    } else
11309
0
#endif
11310
0
#ifndef NO_MD4
11311
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11312
0
        return WC_MD4_BLOCK_SIZE;
11313
0
    } else
11314
0
#endif
11315
0
#ifndef NO_MD5
11316
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11317
0
        return WC_MD5_BLOCK_SIZE;
11318
0
    } else
11319
0
#endif
11320
0
#ifdef WOLFSSL_SHA224
11321
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11322
0
        return WC_SHA224_BLOCK_SIZE;
11323
0
    } else
11324
0
#endif
11325
0
#ifdef WOLFSSL_SHA384
11326
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11327
0
        return WC_SHA384_BLOCK_SIZE;
11328
0
    } else
11329
0
#endif
11330
0
#ifdef WOLFSSL_SHA512
11331
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11332
0
        return WC_SHA512_BLOCK_SIZE;
11333
0
    } else
11334
0
#endif
11335
0
#ifdef WOLFSSL_SHA3
11336
0
#ifndef WOLFSSL_NOSHA3_224
11337
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11338
0
        return WC_SHA3_224_BLOCK_SIZE;
11339
0
    } else
11340
0
#endif
11341
0
#ifndef WOLFSSL_NOSHA3_256
11342
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11343
0
        return WC_SHA3_256_BLOCK_SIZE;
11344
0
    } else
11345
0
#endif
11346
0
#ifndef WOLFSSL_NOSHA3_384
11347
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11348
0
        return WC_SHA3_384_BLOCK_SIZE;
11349
0
    } else
11350
0
#endif
11351
0
#ifndef WOLFSSL_NOSHA3_512
11352
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11353
0
        return WC_SHA3_512_BLOCK_SIZE;
11354
0
    } else
11355
0
#endif
11356
0
#endif /* WOLFSSL_SHA3 */
11357
0
#ifdef WOLFSSL_SM3
11358
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11359
0
        return WC_SM3_BLOCK_SIZE;
11360
0
    } else
11361
0
#endif
11362
11363
0
    return WOLFSSL_FAILURE;
11364
0
}
11365
11366
int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type)
11367
0
{
11368
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_size");
11369
11370
0
    if (type == NULL) {
11371
0
        WOLFSSL_MSG("No md type arg");
11372
0
        return WOLFSSL_FAILURE;
11373
0
    }
11374
11375
0
#ifndef NO_SHA
11376
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11377
0
        return WC_SHA_DIGEST_SIZE;
11378
0
    } else
11379
0
#endif
11380
0
#ifndef NO_SHA256
11381
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11382
0
        return WC_SHA256_DIGEST_SIZE;
11383
0
    } else
11384
0
#endif
11385
0
#ifndef NO_MD4
11386
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11387
0
        return WC_MD4_DIGEST_SIZE;
11388
0
    } else
11389
0
#endif
11390
0
#ifndef NO_MD5
11391
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11392
0
        return WC_MD5_DIGEST_SIZE;
11393
0
    } else
11394
0
#endif
11395
0
#ifdef WOLFSSL_SHA224
11396
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11397
0
        return WC_SHA224_DIGEST_SIZE;
11398
0
    } else
11399
0
#endif
11400
0
#ifdef WOLFSSL_SHA384
11401
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11402
0
        return WC_SHA384_DIGEST_SIZE;
11403
0
    } else
11404
0
#endif
11405
0
#ifdef WOLFSSL_SHA512
11406
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11407
0
        return WC_SHA512_DIGEST_SIZE;
11408
0
    } else
11409
0
#ifndef WOLFSSL_NOSHA512_224
11410
0
    if (XSTRCMP(type, WC_SN_sha512_224) == 0) {
11411
0
        return WC_SHA512_224_DIGEST_SIZE;
11412
0
    } else
11413
0
#endif
11414
0
#ifndef WOLFSSL_NOSHA512_256
11415
0
    if (XSTRCMP(type, WC_SN_sha512_256) == 0) {
11416
0
        return WC_SHA512_256_DIGEST_SIZE;
11417
0
    } else
11418
0
#endif
11419
0
#endif
11420
0
#ifdef WOLFSSL_SHA3
11421
0
#ifndef WOLFSSL_NOSHA3_224
11422
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11423
0
        return WC_SHA3_224_DIGEST_SIZE;
11424
0
    } else
11425
0
#endif
11426
0
#ifndef WOLFSSL_NOSHA3_256
11427
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11428
0
        return WC_SHA3_256_DIGEST_SIZE;
11429
0
    } else
11430
0
#endif
11431
0
#ifndef WOLFSSL_NOSHA3_384
11432
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11433
0
        return WC_SHA3_384_DIGEST_SIZE;
11434
0
    } else
11435
0
#endif
11436
0
#ifndef WOLFSSL_NOSHA3_512
11437
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11438
0
        return WC_SHA3_512_DIGEST_SIZE;
11439
0
    } else
11440
0
#endif
11441
0
#endif /* WOLFSSL_SHA3 */
11442
0
#ifdef WOLFSSL_SM3
11443
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11444
0
        return WC_SM3_DIGEST_SIZE;
11445
0
    }
11446
0
#endif
11447
11448
0
    return WOLFSSL_FAILURE;
11449
0
}
11450
11451
#endif /* OPENSSL_EXTRA  || HAVE_CURL */
11452
11453
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
11454
/* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the
11455
 * subset of X509 API */
11456
11457
1.80k
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new(void){
11458
1.80k
    return wolfSSL_EVP_PKEY_new_ex(NULL);
11459
1.80k
}
11460
11461
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap)
11462
2.56k
{
11463
2.56k
    WOLFSSL_EVP_PKEY* pkey;
11464
2.56k
    int ret;
11465
2.56k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_ex");
11466
2.56k
    pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap,
11467
2.56k
            DYNAMIC_TYPE_PUBLIC_KEY);
11468
2.56k
    if (pkey != NULL) {
11469
2.56k
        XMEMSET(pkey, 0, sizeof(WOLFSSL_EVP_PKEY));
11470
2.56k
        pkey->heap = heap;
11471
2.56k
        pkey->type = WOLFSSL_EVP_PKEY_DEFAULT;
11472
11473
2.56k
#ifndef HAVE_FIPS
11474
2.56k
        ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID);
11475
#else
11476
        ret = wc_InitRng(&pkey->rng);
11477
#endif
11478
2.56k
        if (ret != 0){
11479
            /* Free directly since mutex for ref count not set yet */
11480
0
            XFREE(pkey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
11481
0
            WOLFSSL_MSG("Issue initializing RNG");
11482
0
            return NULL;
11483
0
        }
11484
11485
2.56k
        wolfSSL_RefInit(&pkey->ref, &ret);
11486
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11487
        if (ret != 0){
11488
            wolfSSL_EVP_PKEY_free(pkey);
11489
            WOLFSSL_MSG("Issue initializing mutex");
11490
            return NULL;
11491
        }
11492
    #else
11493
2.56k
        (void)ret;
11494
2.56k
    #endif
11495
2.56k
    }
11496
0
    else {
11497
0
        WOLFSSL_MSG("memory failure");
11498
0
    }
11499
11500
2.56k
    return pkey;
11501
2.56k
}
11502
11503
void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
11504
3.43k
{
11505
3.43k
    int doFree = 0;
11506
3.43k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free");
11507
3.43k
    if (key != NULL) {
11508
2.50k
        int ret;
11509
2.50k
        wolfSSL_RefDec(&key->ref, &doFree, &ret);
11510
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11511
        if (ret != 0) {
11512
            WOLFSSL_MSG("Couldn't lock pkey mutex");
11513
        }
11514
    #else
11515
2.50k
        (void)ret;
11516
2.50k
    #endif
11517
11518
2.50k
        if (doFree) {
11519
1.27k
            wc_FreeRng(&key->rng);
11520
11521
1.27k
            if (key->pkey.ptr != NULL) {
11522
516
                XFREE(key->pkey.ptr, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11523
516
                key->pkey.ptr = NULL;
11524
516
            }
11525
1.27k
            switch(key->type)
11526
1.27k
            {
11527
0
                #ifndef NO_RSA
11528
0
                case WC_EVP_PKEY_RSA:
11529
0
                    if (key->rsa != NULL && key->ownRsa == 1) {
11530
0
                        wolfSSL_RSA_free(key->rsa);
11531
0
                        key->rsa = NULL;
11532
0
                    }
11533
0
                    break;
11534
0
                #endif /* NO_RSA */
11535
11536
0
                #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
11537
0
                case WC_EVP_PKEY_EC:
11538
0
                    if (key->ecc != NULL && key->ownEcc == 1) {
11539
0
                        wolfSSL_EC_KEY_free(key->ecc);
11540
0
                        key->ecc = NULL;
11541
0
                    }
11542
0
                    break;
11543
0
                #endif /* HAVE_ECC && OPENSSL_EXTRA */
11544
11545
                #ifndef NO_DSA
11546
                case WC_EVP_PKEY_DSA:
11547
                    if (key->dsa != NULL && key->ownDsa == 1) {
11548
                        wolfSSL_DSA_free(key->dsa);
11549
                        key->dsa = NULL;
11550
                    }
11551
                    break;
11552
                #endif /* NO_DSA */
11553
11554
0
                #if !defined(NO_DH) && (defined(WOLFSSL_QT) || \
11555
0
                       defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL))
11556
0
                case WC_EVP_PKEY_DH:
11557
0
                    if (key->dh != NULL && key->ownDh == 1) {
11558
0
                        wolfSSL_DH_free(key->dh);
11559
0
                        key->dh = NULL;
11560
0
                    }
11561
0
                    break;
11562
0
                #endif /* ! NO_DH ... */
11563
11564
0
                #ifdef HAVE_HKDF
11565
754
                case WC_EVP_PKEY_HKDF:
11566
754
                    XFREE(key->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
11567
754
                    key->hkdfSalt = NULL;
11568
754
                    XFREE(key->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
11569
754
                    key->hkdfKey = NULL;
11570
754
                    XFREE(key->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
11571
754
                    key->hkdfInfo = NULL;
11572
754
                    key->hkdfSaltSz = 0;
11573
754
                    key->hkdfKeySz = 0;
11574
754
                    key->hkdfInfoSz = 0;
11575
754
                    break;
11576
0
                #endif /* HAVE_HKDF */
11577
11578
0
                #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
11579
0
                    defined(WOLFSSL_AES_DIRECT)
11580
0
                case WC_EVP_PKEY_CMAC:
11581
0
                    if (key->cmacCtx != NULL) {
11582
0
                        wolfSSL_CMAC_CTX_free(key->cmacCtx);
11583
0
                        key->cmacCtx = NULL;
11584
0
                    }
11585
0
                    break;
11586
0
                #endif /* defined(WOLFSSL_CMAC) ... */
11587
11588
516
                default:
11589
516
                    break;
11590
1.27k
            }
11591
11592
1.27k
            wolfSSL_RefFree(&key->ref);
11593
1.27k
            XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11594
1.27k
        }
11595
2.50k
    }
11596
3.43k
}
11597
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
11598
11599
/* Indent writes white spaces of the number specified by "indents"
11600
 * to the BIO. The number of white spaces is limited from 0 to
11601
 * EVP_PKEY_PRINT_INDENT_MAX.
11602
 * returns the amount written to BIO.
11603
 */
11604
static int Indent(WOLFSSL_BIO* out, int indents)
11605
0
{
11606
0
    int i;
11607
0
    char space = ' ';
11608
0
    if (out == NULL) {
11609
0
        return 0;
11610
0
    }
11611
0
    if (indents > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11612
0
        indents = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11613
0
    }
11614
0
    for (i = 0; i < indents; i++) {
11615
0
        if (wolfSSL_BIO_write(out, &space, 1) < 0) {
11616
0
            break;
11617
0
        }
11618
0
    }
11619
0
    return indents -i;
11620
0
}
11621
/* PrintHexWithColon dump byte-data specified by "input" to the "out".
11622
 * Each line has leading white spaces( "indent" gives the number ) plus
11623
 * four spaces, then hex coded 15 byte data with separator ":" follow.
11624
 * Each line looks like:
11625
 * "    00:e6:ab: --- 9f:ef:"
11626
 * Parameters:
11627
 * out     bio to output dump data
11628
 * input   buffer holding data to dump
11629
 * inlen   input data size
11630
 * indent  the number of spaces for indent
11631
 * blower  true if lower case uses
11632
 * Returns 1 on success, 0 on failure.
11633
 */
11634
static int PrintHexWithColon(WOLFSSL_BIO* out, const byte* input,
11635
    int inlen, int indent, byte blower)
11636
0
{
11637
0
#ifdef WOLFSSL_SMALL_STACK
11638
0
    byte*  buff = NULL;
11639
#else
11640
    byte   buff[WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX] = { 0 };
11641
#endif /* WOLFSSL_SMALL_STACK */
11642
0
    int    ret = WOLFSSL_SUCCESS;
11643
0
    word32 in = 0;
11644
0
    word32 i;
11645
0
    int    idx;
11646
0
    const  byte* data;
11647
0
    word32 outSz;
11648
0
    byte   outHex[3];
11649
11650
0
    if (!out || !input || inlen <= 0) {
11651
0
        return WOLFSSL_FAILURE;
11652
0
    }
11653
11654
0
    if (indent < 0) {
11655
0
        indent = 0;
11656
0
    }
11657
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11658
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11659
0
    }
11660
11661
0
    data = input;
11662
11663
0
#ifdef WOLFSSL_SMALL_STACK
11664
0
    buff = (byte*)XMALLOC(WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX, NULL,
11665
0
        DYNAMIC_TYPE_TMP_BUFFER);
11666
0
    if (!buff) {
11667
0
        return WOLFSSL_FAILURE;
11668
0
    }
11669
0
#endif
11670
11671
    /* print pub element */
11672
0
    idx = 0;
11673
11674
0
    for (in = 0; in < (word32)inlen && ret == WOLFSSL_SUCCESS; in +=
11675
0
             WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE ) {
11676
0
        if (Indent(out, indent) < 0) {
11677
0
            ret = WOLFSSL_FAILURE;
11678
0
            break;
11679
0
        }
11680
0
        for (i = 0; (i < WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE) &&
11681
0
                                        (in + i < (word32)inlen); i++) {
11682
11683
0
            if (ret == WOLFSSL_SUCCESS) {
11684
0
                outSz = sizeof(outHex);
11685
0
                ret = Base16_Encode((const byte*)&data[in + i], 1,
11686
0
                                                    outHex, &outSz) == 0;
11687
0
            }
11688
0
            if (ret == WOLFSSL_SUCCESS) {
11689
0
                if (blower) {
11690
0
                    outHex[0] = (byte)XTOLOWER(outHex[0]);
11691
0
                    outHex[1] = (byte)XTOLOWER(outHex[1]);
11692
0
                }
11693
0
                XMEMCPY(buff + idx, outHex, 2);
11694
0
                idx += 2;
11695
11696
0
                if (in + i != (word32)inlen -1) {
11697
0
                    XMEMSET(buff + idx, ':', 1);
11698
0
                    idx += 1;
11699
0
                }
11700
0
            }
11701
0
        }
11702
0
        if (ret == WOLFSSL_SUCCESS) {
11703
0
            ret = wolfSSL_BIO_write(out, buff, idx) > 0;
11704
0
        }
11705
0
        if (ret == WOLFSSL_SUCCESS) {
11706
0
            ret = wolfSSL_BIO_write(out, "\n", 1) > 0;
11707
0
        }
11708
0
        if (ret == WOLFSSL_SUCCESS) {
11709
0
            XMEMSET(buff, 0, WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX);
11710
0
            idx = 0;
11711
0
        }
11712
0
    }
11713
0
    WC_FREE_VAR_EX(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11714
0
    return ret;
11715
0
}
11716
#if !defined(NO_RSA)
11717
/* PrintPubKeyRSA is a helper function for wolfSSL_EVP_PKEY_print_public
11718
 * to parse a DER format RSA public key specified in the second parameter.
11719
 * Parameters:
11720
 * out     bio to output dump data
11721
 * pkey    buffer holding public key data
11722
 * pkeySz  public key data size
11723
 * indent  the number of spaces for indent
11724
 * bitlen  bit size of the given key
11725
 * pctx    context(not used)
11726
 * Returns 1 on success, 0 on failure.
11727
*/
11728
static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11729
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11730
0
{
11731
0
    byte   buff[8] = { 0 };
11732
0
    int    res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11733
0
    word32 inOutIdx = 0;
11734
0
    word32 nSz;             /* size of modulus */
11735
0
    word32 eSz;             /* size of public exponent */
11736
0
    const byte*  n   = NULL;
11737
0
    const byte*  e   = NULL; /* pointer to modulus/exponent */
11738
0
    word32 i;
11739
0
    unsigned long exponent = 0;
11740
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
11741
0
    char line[32] = { 0 };
11742
11743
0
    (void)pctx;
11744
11745
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
11746
0
        return WOLFSSL_FAILURE);
11747
11748
0
    if( mp_init(a) != 0) {
11749
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11750
0
        return WOLFSSL_FAILURE;
11751
0
    }
11752
0
    if (indent < 0) {
11753
0
        indent = 0;
11754
0
    }
11755
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11756
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11757
0
    }
11758
11759
0
    do {
11760
0
        int idx;
11761
0
        int wsz;
11762
11763
        /* parse key to get modulus and exponent */
11764
0
        if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, (word32)pkeySz,
11765
0
                                                &n, &nSz, &e, &eSz) != 0) {
11766
0
            break;
11767
0
        }
11768
11769
        /* print out public key elements */
11770
0
        idx = 0;
11771
0
        XMEMSET(buff, 0, sizeof(buff));
11772
0
        Indent(out, indent);
11773
0
        XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
11774
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11775
0
            break;
11776
0
        }
11777
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
11778
0
            break;
11779
0
        }
11780
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11781
0
            break;
11782
0
        }
11783
0
        wsz = (int)XSTRLEN((const char*)buff);
11784
11785
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11786
0
            break;
11787
0
        }
11788
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
11789
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11790
0
            break;
11791
0
        }
11792
        /* print Modulus */
11793
0
        Indent(out, indent);
11794
0
        XSTRNCPY(line, "Modulus:\n", sizeof(line));
11795
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11796
0
            break;
11797
0
        }
11798
11799
        /* print modulus with leading zero if exists */
11800
0
        if (*n & 0x80 && *(n-1) == 0) {
11801
0
            n--;
11802
0
            nSz++;
11803
0
        }
11804
11805
0
        if (PrintHexWithColon(out, n, (int)nSz,
11806
0
                    indent + 4, 1/* lower case */) != WOLFSSL_SUCCESS) {
11807
0
            break;
11808
0
        }
11809
        /* print public Exponent */
11810
0
        idx = 0;
11811
0
        Indent(out, indent);
11812
0
        XSTRNCPY(line, "Exponent: ", sizeof(line));
11813
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11814
0
            break;
11815
0
        }
11816
0
        for (i = 0; i < eSz; i++) {
11817
0
            exponent <<= 8;
11818
0
            exponent += e[i];
11819
0
        }
11820
11821
0
        XMEMSET(buff, 0, sizeof(buff));
11822
0
        if (mp_set_int(a, exponent) != 0) {
11823
0
            break;
11824
0
        }
11825
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11826
0
            break;
11827
0
        }
11828
0
        wsz = (int)XSTRLEN((const char*)buff);
11829
11830
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11831
0
            break;
11832
0
        }
11833
0
        XSTRNCPY(line, " (0x", sizeof(line));
11834
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11835
0
            break;
11836
0
        }
11837
0
        XMEMSET(buff, 0, sizeof(buff));
11838
0
        if (mp_tohex(a, (char*)buff) != 0) {
11839
0
            break;
11840
0
        }
11841
0
        if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((char*)buff)) <= 0) {
11842
0
            break;
11843
0
        }
11844
0
        XSTRNCPY(line, ")\n", sizeof(line));
11845
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11846
0
            break;
11847
0
        }
11848
11849
0
        res = WOLFSSL_SUCCESS;
11850
0
    } while (0);
11851
11852
0
    mp_free(a);
11853
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11854
0
    return res;
11855
0
}
11856
#endif /* !NO_RSA */
11857
11858
#if defined(HAVE_ECC)
11859
/* PrintPubKeyEC is a helper function for wolfSSL_EVP_PKEY_print_public
11860
 * to parse a DER format ECC public key specified in the second parameter.
11861
 * Parameters:
11862
 * out     bio to output dump data
11863
 * pkey    buffer holding public key data
11864
 * pkeySz  public key data size
11865
 * indent  the number of spaces for indent
11866
 * bitlen  bit size of the given key
11867
 * pctx    context(not used)
11868
 * Returns 1 on success, 0 on failure.
11869
*/
11870
static int PrintPubKeyEC(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11871
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11872
0
{
11873
0
    byte*   pub = NULL;
11874
0
    word32  pubSz = 0;
11875
0
    byte    buff[8] = { 0 };
11876
0
    int     res = WOLFSSL_SUCCESS;
11877
0
    word32  inOutIdx = 0;
11878
0
    int     curveId = 0;
11879
0
    const byte* curveOID = NULL;
11880
0
    word32  oidSz = 0;
11881
0
    const char* OIDName = NULL;
11882
0
    const char* nistCurveName = NULL;
11883
0
    int idx = 0;
11884
0
    int wsz = 0;
11885
0
#ifdef WOLFSSL_SMALL_STACK
11886
0
    mp_int* a = NULL;
11887
0
    ecc_key* key = NULL;
11888
#else
11889
    mp_int  a[1];
11890
    ecc_key key[1];
11891
#endif
11892
0
    char line[32] = { 0 };
11893
0
    (void)pctx;
11894
11895
0
#ifdef WOLFSSL_SMALL_STACK
11896
0
    a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
11897
0
    if (a == NULL) {
11898
0
        WOLFSSL_MSG("Failed to allocate memory for mp_int");
11899
0
        return WOLFSSL_FAILURE;
11900
0
    }
11901
0
    XMEMSET(a, 0, sizeof(mp_int));
11902
11903
0
    key = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
11904
0
    if (key == NULL) {
11905
0
        WOLFSSL_MSG("Failed to allocate memory for ecc_key");
11906
0
        XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
11907
0
        return WOLFSSL_FAILURE;
11908
0
    }
11909
0
#endif
11910
11911
0
    if (mp_init(a) != 0) {
11912
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
11913
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11914
0
        return WOLFSSL_FAILURE;
11915
0
    }
11916
11917
0
    if (wc_ecc_init(key) != 0) {
11918
        /* Return early so we don't have to remember if init succeeded
11919
         * or not. */
11920
0
        mp_free(a);
11921
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
11922
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11923
0
        return WOLFSSL_FAILURE;
11924
0
    }
11925
11926
0
    if (indent < 0) {
11927
0
        indent = 0;
11928
0
    }
11929
0
    else if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11930
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11931
0
    }
11932
11933
0
    if (res == WOLFSSL_SUCCESS) {
11934
0
        res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, (word32)pkeySz) == 0;
11935
0
    }
11936
11937
0
    if (res == WOLFSSL_SUCCESS) {
11938
0
        curveId = wc_ecc_get_oid(key->dp->oidSum, &curveOID, &oidSz);
11939
0
        res = curveId > 0 && oidSz > 0;
11940
0
    }
11941
11942
    /* get NIST curve name */
11943
0
    if (res == WOLFSSL_SUCCESS) {
11944
0
        int nid = EccEnumToNID(curveId);
11945
0
        if (nid != -1) {
11946
            /* look up object name and nist curve name*/
11947
0
            OIDName = wolfSSL_OBJ_nid2sn(nid);
11948
0
            nistCurveName = wolfSSL_EC_curve_nid2nist(nid);
11949
0
            res = (nistCurveName != NULL) && (OIDName != NULL);
11950
0
        }
11951
0
        else {
11952
0
            res = WOLFSSL_FAILURE;
11953
0
        }
11954
0
    }
11955
0
    if (res == WOLFSSL_SUCCESS) {
11956
0
        pub = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
11957
0
        if (pub != NULL) {
11958
0
            pubSz = ECC_BUFSIZE;
11959
0
            XMEMSET(pub, 0, ECC_BUFSIZE);
11960
11961
0
            PRIVATE_KEY_UNLOCK();
11962
0
            res = wc_ecc_export_x963(key, pub, &pubSz) == 0;
11963
0
            PRIVATE_KEY_LOCK();
11964
0
        }
11965
0
        else {
11966
0
            res = WOLFSSL_FAILURE;
11967
0
        }
11968
0
    }
11969
0
    if (res == WOLFSSL_SUCCESS) {
11970
0
        idx = 0;
11971
0
        res = Indent(out, indent) >= 0;
11972
0
    }
11973
0
    if (res == WOLFSSL_SUCCESS) {
11974
0
        XSTRNCPY(line, "Public-Key: (", sizeof(line));
11975
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
11976
0
    }
11977
0
    if (res == WOLFSSL_SUCCESS) {
11978
0
        res = mp_set_int(a, (unsigned long)bitlen) == 0;
11979
0
    }
11980
0
    if (res == WOLFSSL_SUCCESS) {
11981
0
        res = mp_todecimal(a, (char*)buff) == 0;
11982
0
    }
11983
0
    if (res == WOLFSSL_SUCCESS) {
11984
0
        wsz = (int)XSTRLEN((const char*)buff);
11985
0
    }
11986
0
    if (res == WOLFSSL_SUCCESS) {
11987
0
        res = wolfSSL_BIO_write(out, buff + idx, wsz) >= 0;
11988
0
    }
11989
0
    if (res == WOLFSSL_SUCCESS) {
11990
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
11991
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
11992
0
    }
11993
0
    if (res == WOLFSSL_SUCCESS) {
11994
0
        res = Indent(out, indent) >= 0;
11995
0
    }
11996
0
    if (res == WOLFSSL_SUCCESS) {
11997
        /* print pub element */
11998
0
        XSTRNCPY(line, "pub:\n", sizeof(line));
11999
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12000
0
    }
12001
0
    if (res == WOLFSSL_SUCCESS) {
12002
        /* upper case */
12003
0
        res = PrintHexWithColon(out, pub, (int)pubSz, indent + 4, 0);
12004
0
    }
12005
0
    if (res == WOLFSSL_SUCCESS) {
12006
0
        res = Indent(out, indent) >= 0;
12007
0
    }
12008
0
    if (res == WOLFSSL_SUCCESS) {
12009
        /* print OID in name */
12010
0
        XSTRNCPY(line, "ASN1 OID: ", sizeof(line));
12011
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12012
0
    }
12013
0
    if (res == WOLFSSL_SUCCESS) {
12014
0
        res = wolfSSL_BIO_write(out, OIDName, (int)XSTRLEN(OIDName)) > 0;
12015
0
    }
12016
0
    if (res == WOLFSSL_SUCCESS) {
12017
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12018
0
    }
12019
0
    if (res == WOLFSSL_SUCCESS) {
12020
0
        res = Indent(out, indent) >= 0;
12021
0
    }
12022
0
    if (res == WOLFSSL_SUCCESS) {
12023
        /* print NIST curve name */
12024
0
        XSTRNCPY(line, "NIST CURVE: ", sizeof(line));
12025
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12026
0
    }
12027
0
    if (res == WOLFSSL_SUCCESS) {
12028
0
        res = wolfSSL_BIO_write(out, nistCurveName,
12029
0
            (int)XSTRLEN(nistCurveName)) > 0;
12030
0
    }
12031
0
    if (res == WOLFSSL_SUCCESS) {
12032
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12033
0
    }
12034
12035
0
    XFREE(pub, NULL, DYNAMIC_TYPE_ECC_BUFFER);
12036
0
    pub = NULL;
12037
12038
0
    wc_ecc_free(key);
12039
0
    mp_free(a);
12040
12041
0
    WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12042
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12043
12044
0
    return res;
12045
0
}
12046
#endif /* HAVE_ECC */
12047
12048
#if !defined(NO_DSA)
12049
/* PrintPubKeyDSA is a helper function for wolfSSL_EVP_PKEY_print_public
12050
 * to parse a DER format DSA public key specified in the second parameter.
12051
 * Parameters:
12052
 * out     bio to output dump data
12053
 * pkey    buffer holding public key data
12054
 * pkeySz  public key data size
12055
 * indent  the number of spaces for indent
12056
 * bitlen  bit size of the given key
12057
 * pctx    context(not used)
12058
 * Returns 1 on success, 0 on failure.
12059
*/
12060
static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12061
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12062
{
12063
12064
    byte    buff[8] = { 0 };
12065
    int     length;
12066
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12067
    word32  inOutIdx = 0;
12068
    word32  oid;
12069
    byte    tagFound;
12070
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12071
    char line[32] = { 0 };
12072
12073
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12074
        return WOLFSSL_FAILURE);
12075
12076
    if( mp_init(a) != 0) {
12077
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12078
        return WOLFSSL_FAILURE;
12079
    }
12080
12081
    inOutIdx = 0;
12082
    (void)pctx;
12083
12084
    if (indent < 0) {
12085
        indent = 0;
12086
    }
12087
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12088
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12089
    }
12090
12091
    do {
12092
        byte *p = NULL, * q = NULL, * g = NULL, * y = NULL;
12093
        int pSz, qSz, gSz, ySz;
12094
        int idx;
12095
        int wsz;
12096
12097
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12098
            break;
12099
        }
12100
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12101
            break;
12102
        }
12103
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) !=
12104
                0) {
12105
            break;
12106
        }
12107
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12108
            break;
12109
        }
12110
        /* find P */
12111
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12112
            break;
12113
        }
12114
        if (tagFound != ASN_INTEGER) {
12115
            break;
12116
        }
12117
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12118
            break;
12119
        }
12120
        p   = (byte*)(pkey + inOutIdx);
12121
        pSz = length;
12122
12123
        if (bitlen == 0) {
12124
            if (*p == 0) {
12125
                bitlen = (pSz - 1) * 8;    /* remove leading zero */
12126
            }
12127
            else {
12128
                bitlen = pSz * 8;
12129
            }
12130
        }
12131
12132
        inOutIdx += (word32)length;
12133
        /* find Q */
12134
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12135
            break;
12136
        }
12137
        if (tagFound != ASN_INTEGER) {
12138
            break;
12139
        }
12140
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12141
            break;
12142
        }
12143
        q = (byte*)(pkey + inOutIdx);
12144
        qSz = length;
12145
        inOutIdx += (word32)length;
12146
12147
        /* find G */
12148
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12149
            break;
12150
        }
12151
        if (tagFound != ASN_INTEGER) {
12152
            break;
12153
        }
12154
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12155
            break;
12156
        }
12157
        g = (byte*)(pkey + inOutIdx);
12158
        gSz = length;
12159
        inOutIdx += (word32)length;
12160
        /* find Y */
12161
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12162
            break;
12163
        }
12164
        if (tagFound != ASN_BIT_STRING) {
12165
            break;
12166
        }
12167
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12168
            break;
12169
        }
12170
        inOutIdx++;     /* skip the first byte( unused byte number)*/
12171
12172
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12173
            break;
12174
        }
12175
        if (tagFound != ASN_INTEGER) {
12176
            break;
12177
        }
12178
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12179
            break;
12180
        }
12181
        y = (byte*)(pkey + inOutIdx);
12182
        ySz = length;
12183
12184
        idx = 0;
12185
        XMEMSET(buff, 0, sizeof(buff));
12186
        Indent(out, indent);
12187
        XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
12188
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12189
            break;
12190
        }
12191
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12192
            break;
12193
        }
12194
        if (mp_todecimal(a, (char*)buff) != 0) {
12195
            break;
12196
        }
12197
        wsz = (int)XSTRLEN((const char*)buff);
12198
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12199
            break;
12200
        }
12201
        XSTRNCPY(line, " bit)\n", sizeof(line));
12202
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12203
            break;
12204
        }
12205
        /* print pub element */
12206
        Indent(out, indent);
12207
        XSTRNCPY(line, "pub:\n", sizeof(line));
12208
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12209
            break;
12210
        }
12211
        if (PrintHexWithColon(out, y, ySz, indent + 4, 0/* upper case */)
12212
                                                        != WOLFSSL_SUCCESS) {
12213
            break;
12214
        }
12215
        /* print P element */
12216
        Indent(out, indent);
12217
        XSTRNCPY(line, "P:\n", sizeof(line));
12218
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12219
            break;
12220
        }
12221
        if (PrintHexWithColon(out, p, pSz, indent + 4, 0/* upper case */)
12222
                                                        != WOLFSSL_SUCCESS) {
12223
            break;
12224
        }
12225
        /* print Q element */
12226
        Indent(out, indent);
12227
        XSTRNCPY(line, "Q:\n", sizeof(line));
12228
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12229
            break;
12230
        }
12231
        if (PrintHexWithColon(out, q, qSz, indent + 4, 0/* upper case */)
12232
                                                         != WOLFSSL_SUCCESS) {
12233
            break;
12234
        }
12235
        /* print G element */
12236
        Indent(out, indent);
12237
        XSTRNCPY(line, "G:\n", sizeof(line));
12238
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12239
            break;
12240
        }
12241
        if (PrintHexWithColon(out, g, gSz, indent + 4, 0/* upper case */)
12242
                                                        != WOLFSSL_SUCCESS) {
12243
            break;
12244
        }
12245
12246
        res = WOLFSSL_SUCCESS;
12247
    } while (0);
12248
12249
    mp_free(a);
12250
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12251
    return res;
12252
}
12253
#endif /* !NO_DSA */
12254
12255
#if defined(WOLFSSL_DH_EXTRA)
12256
/* PrintPubKeyDH is a helper function for wolfSSL_EVP_PKEY_print_public
12257
 * to parse a DER format DH public key specified in the second parameter.
12258
 * Parameters:
12259
 * out     bio to output dump data
12260
 * pkey    buffer holding public key data
12261
 * pkeySz  public key data size
12262
 * indent  the number of spaces for indent
12263
 * bitlen  bit size of the given key
12264
 * pctx    context(not used)
12265
 * Returns 1 on success, 0 on failure.
12266
*/
12267
static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12268
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12269
0
{
12270
12271
0
    byte    buff[8] = { 0 };
12272
0
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12273
0
    word32  length;
12274
0
    word32  inOutIdx;
12275
0
    word32  oid;
12276
0
    byte    tagFound;
12277
0
    byte*   prime = NULL;
12278
0
    byte    generator;
12279
0
    byte*   publicKey = NULL;
12280
0
    word32  outSz;
12281
0
    byte    outHex[3];
12282
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12283
0
    char line[32] = { 0 };
12284
12285
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12286
0
        return WOLFSSL_FAILURE);
12287
12288
0
    if( mp_init(a) != 0) {
12289
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12290
0
        return WOLFSSL_FAILURE;
12291
0
    }
12292
12293
0
    inOutIdx = 0;
12294
0
    (void)pctx;
12295
12296
0
    if (indent < 0) {
12297
0
        indent = 0;
12298
0
    }
12299
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12300
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12301
0
    }
12302
12303
0
    do {
12304
0
        int primeSz;
12305
0
        int publicKeySz;
12306
0
        int idx;
12307
0
        int wsz;
12308
12309
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12310
0
            break;
12311
0
        }
12312
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12313
0
            break;
12314
0
        }
12315
0
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) <
12316
0
                0) {
12317
0
            break;
12318
0
        }
12319
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12320
0
            break;
12321
0
        }
12322
        /* get prime element */
12323
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12324
0
            break;
12325
0
        }
12326
0
        if (tagFound != ASN_INTEGER) {
12327
0
            break;
12328
0
        }
12329
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12330
0
            break;
12331
0
        }
12332
0
        prime     = (byte*)(pkey + inOutIdx);
12333
0
        primeSz   = (int)length;
12334
0
        inOutIdx += length;
12335
12336
        /* get generator element */
12337
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12338
0
            break;
12339
0
        }
12340
0
        if (tagFound != ASN_INTEGER) {
12341
0
            break;
12342
0
        }
12343
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12344
0
            break;
12345
0
        }
12346
0
        if (length != 1) {
12347
0
            break;
12348
0
        }
12349
0
        generator = *(pkey + inOutIdx);
12350
0
        inOutIdx += length;
12351
12352
        /* get public-key element */
12353
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12354
0
            break;
12355
0
        }
12356
0
        if (tagFound != ASN_BIT_STRING) {
12357
0
            break;
12358
0
        }
12359
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12360
0
            break;
12361
0
        }
12362
0
        inOutIdx ++;
12363
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12364
0
            break;
12365
0
        }
12366
0
        if (tagFound != ASN_INTEGER) {
12367
0
            break;
12368
0
        }
12369
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12370
0
            break;
12371
0
        }
12372
0
        publicKeySz = (int)length;
12373
0
        publicKey = (byte*)(pkey + inOutIdx);
12374
12375
0
        if (bitlen == 0) {
12376
0
            if (*publicKey == 0) {
12377
0
                bitlen = (publicKeySz - 1) * 8;
12378
0
            }
12379
0
            else {
12380
0
                bitlen = publicKeySz * 8;
12381
0
            }
12382
0
        }
12383
12384
        /* print elements */
12385
0
        idx = 0;
12386
0
        Indent(out, indent);
12387
0
        XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
12388
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12389
0
            break;
12390
0
        }
12391
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12392
0
            break;
12393
0
        }
12394
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12395
0
            break;
12396
0
        }
12397
0
        wsz = (int)XSTRLEN((const char*)buff);
12398
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12399
0
            break;
12400
0
        }
12401
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
12402
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12403
0
            break;
12404
0
        }
12405
0
        Indent(out, indent);
12406
0
        XSTRNCPY(line, "public-key:\n", sizeof(line));
12407
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12408
0
            break;
12409
0
        }
12410
0
        if (PrintHexWithColon(out, publicKey,
12411
0
                                publicKeySz, indent + 4, 0/* upper case */)
12412
0
                                                    != WOLFSSL_SUCCESS) {
12413
0
            break;
12414
0
        }
12415
0
        Indent(out, indent);
12416
0
        XSTRNCPY(line, "prime:\n", sizeof(line));
12417
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12418
0
            break;
12419
0
        }
12420
0
        if (PrintHexWithColon(out, prime, primeSz,
12421
0
                                            indent + 4, 0/* upper case */)
12422
0
                != WOLFSSL_SUCCESS) {
12423
0
            break;
12424
0
        }
12425
0
        idx = 0;
12426
0
        XMEMSET(buff, 0, sizeof(buff));
12427
0
        Indent(out, indent);
12428
0
        XSTRNCPY(line, "generator: ", sizeof(line));
12429
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12430
0
            break;
12431
0
        }
12432
0
        if (mp_set_int(a, generator) != 0) {
12433
0
            break;
12434
0
        }
12435
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12436
0
            break;
12437
0
        }
12438
0
        wsz = (int)XSTRLEN((const char*)buff);
12439
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12440
0
            break;
12441
0
        }
12442
0
        XSTRNCPY(line, " (0x", sizeof(line));
12443
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12444
0
            break;
12445
0
        }
12446
0
        idx = 0;
12447
0
        XMEMSET(buff, 0, sizeof(buff));
12448
0
        outSz = sizeof(outHex);
12449
0
        if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
12450
0
            break;
12451
0
        }
12452
0
        if (idx + 2 < (int)sizeof(buff) ) {
12453
0
            XMEMCPY(buff + idx, outHex, 2);
12454
0
            idx += 2;
12455
0
        }
12456
0
        if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
12457
0
            break;
12458
0
        }
12459
0
        XSTRNCPY(line, ")\n", sizeof(line));
12460
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12461
0
            break;
12462
0
        }
12463
12464
0
        res = WOLFSSL_SUCCESS;
12465
0
    } while (0);
12466
12467
0
    mp_free(a);
12468
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12469
0
    return res;
12470
0
}
12471
#endif /* WOLFSSL_DH_EXTRA */
12472
12473
/* wolfSSL_EVP_PKEY_print_public parses the specified key then
12474
 * outputs public key info in human readable format to the specified BIO.
12475
 * White spaces of the same number which 'indent" gives, will be added to
12476
 * each line to output and ignores pctx parameter.
12477
 * Parameters:
12478
 * out     bio to output dump data
12479
 * pkey    buffer holding public key data
12480
 * indent  the number of spaces for indent
12481
 * pctx    context(not used)
12482
 * Returns 1 on success, 0 or negative on error, -2 means specified key
12483
 * algo is not supported.
12484
 * Can handle RSA, ECC, DSA and DH public keys.
12485
 */
12486
int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
12487
    const WOLFSSL_EVP_PKEY* pkey, int indent, WOLFSSL_ASN1_PCTX* pctx)
12488
0
{
12489
0
    int res;
12490
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12491
0
    defined(WOLFSSL_DH_EXTRA)
12492
0
    int keybits;    /* bit length of the key */
12493
0
#endif
12494
12495
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_print_public");
12496
12497
0
    if (pkey == NULL || out == NULL) {
12498
0
        return 0;
12499
0
    }
12500
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12501
0
    defined(WOLFSSL_DH_EXTRA)
12502
0
    if (indent < 0) {
12503
0
        indent = 0;
12504
0
    }
12505
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12506
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12507
0
    }
12508
0
#endif
12509
12510
0
    switch (pkey->type) {
12511
0
        case WC_EVP_PKEY_RSA:
12512
12513
0
#if !defined(NO_RSA)
12514
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12515
0
            res     = PrintPubKeyRSA(
12516
0
                        out,
12517
0
                        (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
12518
0
                        pkey->pkey_sz,           /* raw pkey size */
12519
0
                        indent,                  /* indent size */
12520
0
                        keybits,                 /* bit length of the key */
12521
0
                        pctx);                   /* not used */
12522
#else
12523
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12524
#endif
12525
0
            break;
12526
12527
0
        case WC_EVP_PKEY_EC:
12528
12529
0
#if defined(HAVE_ECC)
12530
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12531
0
            res     = PrintPubKeyEC(
12532
0
                        out,
12533
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12534
0
                        pkey->pkey_sz,            /* raw pkey size */
12535
0
                        indent,                   /* indent size */
12536
0
                        keybits,                  /* bit length of the key */
12537
0
                        pctx);                    /* not used */
12538
#else
12539
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12540
#endif
12541
0
            break;
12542
12543
0
        case WC_EVP_PKEY_DSA:
12544
12545
#if !defined(NO_DSA)
12546
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12547
            res     = PrintPubKeyDSA(
12548
                        out,
12549
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12550
                        pkey->pkey_sz,            /* raw pkey size */
12551
                        indent,                   /* indent size */
12552
                        keybits,                  /* bit length of the key */
12553
                        pctx);                    /* not used */
12554
#else
12555
0
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12556
0
#endif
12557
0
            break;
12558
12559
0
        case WC_EVP_PKEY_DH:
12560
12561
0
#if defined(WOLFSSL_DH_EXTRA)
12562
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12563
0
            res     = PrintPubKeyDH(
12564
0
                        out,
12565
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12566
0
                        pkey->pkey_sz,            /* raw pkey size */
12567
0
                        indent,                   /* indent size */
12568
0
                        keybits,                  /* bit length of the key */
12569
0
                        pctx);                    /* not used */
12570
#else
12571
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12572
#endif
12573
0
            break;
12574
12575
0
        default:
12576
0
            res = WOLFSSL_UNKNOWN;      /* not supported algo */
12577
0
            break;
12578
0
    }
12579
0
    return res;
12580
0
}
12581
#endif /* OPENSSL_EXTRA && !NO_BIO */
12582
12583
int wolfSSL_EVP_get_hashinfo(const WOLFSSL_EVP_MD* evp,
12584
    int* pHash, int* pHashSz)
12585
0
{
12586
0
    enum wc_HashType hash = WC_HASH_TYPE_NONE;
12587
0
    int hashSz;
12588
12589
0
    if (XSTRLEN(evp) < 3) {
12590
        /* do not try comparing strings if size is too small */
12591
0
        return WOLFSSL_FAILURE;
12592
0
    }
12593
12594
0
#ifndef NO_SHA
12595
0
    if ((XSTRCMP("SHA", evp) == 0) || (XSTRCMP(WC_SN_sha1, evp) == 0)) {
12596
0
        hash = WC_HASH_TYPE_SHA;
12597
0
    } else
12598
0
#endif
12599
0
#ifdef WOLFSSL_SHA224
12600
0
    if (XSTRCMP(WC_SN_sha224, evp) == 0) {
12601
0
        hash = WC_HASH_TYPE_SHA224;
12602
0
    } else
12603
0
#endif
12604
0
#ifndef NO_SHA256
12605
0
    if (XSTRCMP(WC_SN_sha256, evp) == 0) {
12606
0
        hash = WC_HASH_TYPE_SHA256;
12607
0
    } else
12608
0
#endif
12609
0
#ifdef WOLFSSL_SHA384
12610
0
    if (XSTRCMP(WC_SN_sha384, evp) == 0) {
12611
0
        hash = WC_HASH_TYPE_SHA384;
12612
0
    } else
12613
0
#endif
12614
0
#ifdef WOLFSSL_SHA512
12615
0
    if (XSTRCMP(WC_SN_sha512, evp) == 0) {
12616
0
        hash = WC_HASH_TYPE_SHA512;
12617
0
    } else
12618
0
#ifndef WOLFSSL_NOSHA512_224
12619
0
    if (XSTRCMP(WC_SN_sha512_224, evp) == 0) {
12620
0
        hash = WC_HASH_TYPE_SHA512_224;
12621
0
    } else
12622
0
#endif
12623
0
#ifndef WOLFSSL_NOSHA512_256
12624
0
    if (XSTRCMP(WC_SN_sha512_256, evp) == 0) {
12625
0
        hash = WC_HASH_TYPE_SHA512_256;
12626
0
    } else
12627
0
#endif
12628
0
#endif
12629
0
#ifdef WOLFSSL_SHA3
12630
0
#ifndef WOLFSSL_NOSHA3_224
12631
0
    if (XSTRCMP(WC_SN_sha3_224, evp) == 0) {
12632
0
        hash = WC_HASH_TYPE_SHA3_224;
12633
0
    } else
12634
0
#endif
12635
0
#ifndef WOLFSSL_NOSHA3_256
12636
0
    if (XSTRCMP(WC_SN_sha3_256, evp) == 0) {
12637
0
        hash = WC_HASH_TYPE_SHA3_256;
12638
0
    } else
12639
0
#endif
12640
0
#ifndef WOLFSSL_NOSHA3_384
12641
0
    if (XSTRCMP(WC_SN_sha3_384, evp) == 0) {
12642
0
        hash = WC_HASH_TYPE_SHA3_384;
12643
0
    } else
12644
0
#endif
12645
0
#ifndef WOLFSSL_NOSHA3_512
12646
0
    if (XSTRCMP(WC_SN_sha3_512, evp) == 0) {
12647
0
        hash = WC_HASH_TYPE_SHA3_512;
12648
0
    } else
12649
0
#endif
12650
0
#endif /* WOLFSSL_SHA3 */
12651
0
#ifdef WOLFSSL_SM3
12652
0
    if (XSTRCMP(WC_SN_sm3, evp) == 0) {
12653
0
        hash = WC_HASH_TYPE_SM3;
12654
0
    } else
12655
0
#endif
12656
0
#ifdef WOLFSSL_MD2
12657
0
    if (XSTRCMP("MD2", evp) == 0) {
12658
0
        hash = WC_HASH_TYPE_MD2;
12659
0
    } else
12660
0
#endif
12661
0
#ifndef NO_MD4
12662
0
    if (XSTRCMP(WC_SN_md4, evp) == 0) {
12663
0
        hash = WC_HASH_TYPE_MD4;
12664
0
    } else
12665
0
#endif
12666
0
#ifndef NO_MD5
12667
0
    if (XSTRCMP(WC_SN_md5, evp) == 0) {
12668
0
        hash = WC_HASH_TYPE_MD5;
12669
0
    } else
12670
0
#endif
12671
0
    {
12672
0
        if (XSTRNCMP("SHA", evp, 3) == 0) {
12673
0
            WOLFSSL_MSG("Unknown SHA hash");
12674
0
        }
12675
0
        return WOLFSSL_FAILURE;
12676
0
    }
12677
12678
0
    if (pHash)
12679
0
        *pHash = hash;
12680
12681
0
    hashSz = wc_HashGetDigestSize(hash);
12682
0
    if (pHashSz)
12683
0
        *pHashSz = hashSz;
12684
12685
0
    if (hashSz < 0) {
12686
0
        return WOLFSSL_FAILURE;
12687
0
    }
12688
12689
0
    return WOLFSSL_SUCCESS;
12690
0
}
12691
12692
/* Base64 encoding APIs */
12693
#if defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)
12694
12695
/*  wolfSSL_EVP_ENCODE_CTX_new allocates WOLFSSL_EVP_ENCODE_CTX
12696
 *  Returns WOLFSSL_EVP_ENCODE_CTX structure on success, NULL on failure.
12697
 */
12698
struct WOLFSSL_EVP_ENCODE_CTX* wolfSSL_EVP_ENCODE_CTX_new(void)
12699
0
{
12700
0
    WOLFSSL_EVP_ENCODE_CTX* ctx = NULL;
12701
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_new");
12702
0
    ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_ENCODE_CTX),
12703
0
             NULL, DYNAMIC_TYPE_OPENSSL );
12704
12705
0
    if (ctx != NULL) {
12706
0
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_ENCODE_CTX) );
12707
0
        ctx->heap = NULL;
12708
0
        return ctx;
12709
0
    }
12710
0
    return NULL;
12711
0
}
12712
/*  wolfSSL_EVP_ENCODE_CTX_free frees specified WOLFSSL_EVP_ENCODE_CTX struct.
12713
 */
12714
void wolfSSL_EVP_ENCODE_CTX_free(WOLFSSL_EVP_ENCODE_CTX* ctx)
12715
0
{
12716
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_free");
12717
0
    if (ctx != NULL) {
12718
0
        XFREE(ctx, ctx->heap, DYNAMIC_TYPE_OPENSSL);
12719
0
    }
12720
0
}
12721
#endif /* WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE */
12722
#if defined(WOLFSSL_BASE64_ENCODE)
12723
12724
/* Assume that out has enough space */
12725
int wolfSSL_EVP_EncodeBlock(unsigned char *out, const unsigned char *in,
12726
                            int inLen)
12727
0
{
12728
0
    word32 ret = (word32)-1;
12729
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeBlock");
12730
12731
0
    if (out == NULL || in == NULL)
12732
0
        return WOLFSSL_FATAL_ERROR;
12733
12734
0
    if (Base64_Encode_NoNl(in, (word32)inLen, out, &ret) == 0)
12735
0
        return (int)ret;
12736
0
    else
12737
0
        return WOLFSSL_FATAL_ERROR;
12738
0
}
12739
12740
/* Assume that out has enough space */
12741
int wolfSSL_EVP_DecodeBlock(unsigned char *out, const unsigned char *in,
12742
                            int inLen)
12743
0
{
12744
0
    word32 ret = (word32)-1;
12745
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeBlock");
12746
12747
0
    if (out == NULL || in == NULL)
12748
0
        return WOLFSSL_FATAL_ERROR;
12749
12750
0
    if (Base64_Decode(in, (word32)inLen, out, &ret) == 0)
12751
0
        return (int)ret;
12752
0
    else
12753
0
        return WOLFSSL_FATAL_ERROR;
12754
12755
0
}
12756
12757
/*  wolfSSL_EVP_EncodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX object
12758
 *  for the subsequent wolfSSL_EVP_EncodeUpdate.
12759
 */
12760
void wolfSSL_EVP_EncodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
12761
0
{
12762
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeInit");
12763
12764
    /* clean up ctx */
12765
0
    if (ctx != NULL) {
12766
0
        ctx->remaining = 0;
12767
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12768
0
    }
12769
0
}
12770
/*  wolfSSL_EVP_EncodeUpdate encodes the input data in 48-byte units
12771
 *  and outputs it to out. If less than 48 bytes of data remain, save it in
12772
 *  ctx. The data given in the subsequent wolfSSL_EVP_EncodeUpdate
12773
 *  is combined with the data stored in CTX and used for encoding.
12774
 *  Returns 1 on success, 0 on error.
12775
 */
12776
int  wolfSSL_EVP_EncodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
12777
            unsigned char* out, int* outl, const unsigned char* in, int inl)
12778
0
{
12779
0
    int res;
12780
0
    word32 outsz = 0;
12781
12782
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeUpdate");
12783
12784
0
    if (ctx == NULL || out == NULL || in == NULL || outl == NULL)
12785
0
        return 0;
12786
12787
0
    *outl = 0;
12788
12789
    /* if the remaining data exists in the ctx, add input data to them
12790
     * to create a block(48bytes) for encoding
12791
     */
12792
0
    if (ctx->remaining > 0 && inl > 0) {
12793
0
        int cpysz = (int)min(
12794
0
            (word32)(BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
12795
0
        XMEMCPY(ctx->data + ctx->remaining, in, (size_t)cpysz);
12796
0
        ctx->remaining += cpysz;
12797
0
        in             += cpysz;
12798
0
        inl            -= cpysz;
12799
12800
        /* check if a block for encoding exists in ctx.data, if so encode it */
12801
0
        if (ctx->remaining >= BASE64_ENCODE_BLOCK_SIZE) {
12802
            /* Base64_Encode asks the out buff size via the 4th param*/
12803
0
            outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;
12804
0
            res = Base64_Encode(ctx->data, BASE64_ENCODE_BLOCK_SIZE, out,
12805
0
                &outsz);
12806
0
            if (res == 0) {
12807
0
                ctx->remaining = 0;
12808
0
                *outl = (int)outsz;
12809
0
            }
12810
0
            else
12811
0
                return 0;   /* return with error */
12812
0
        }
12813
0
        else {
12814
            /* could not create a block */
12815
0
            *outl = 0;
12816
0
            return  1;
12817
0
        }
12818
0
    }
12819
    /* Here, there is no data left in ctx, so try processing the data of
12820
     * the specified input data.
12821
     */
12822
12823
0
    while (inl >= BASE64_ENCODE_BLOCK_SIZE) {
12824
0
        outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;/* 64 byte and one for LF*/
12825
0
        res = Base64_Encode(in, BASE64_ENCODE_BLOCK_SIZE,out,&outsz);
12826
0
        if (res == 0) {
12827
0
            in    += BASE64_ENCODE_BLOCK_SIZE;
12828
0
            inl   -= BASE64_ENCODE_BLOCK_SIZE;
12829
0
            out   += outsz;
12830
0
            *outl += (int)outsz;
12831
0
        }
12832
0
        else {
12833
0
            *outl = 0;
12834
0
            return  0;
12835
0
        }
12836
0
    }
12837
12838
    /* if remaining data exists, copy them into ctx for the next call*/
12839
0
    if (inl > 0) {
12840
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12841
0
        XMEMCPY(ctx->data, in, (size_t)inl);
12842
0
        ctx->remaining = inl;
12843
0
    }
12844
12845
0
    return 1;   /* returns 1 on success, 0 on error */
12846
0
}
12847
/*  wolfSSL_EVP_EncodeFinal encodes data in ctx and outputs to out.
12848
 */
12849
void wolfSSL_EVP_EncodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
12850
                unsigned char* out, int* outl)
12851
0
{
12852
0
    word32 outsz = 0;
12853
0
    int res;
12854
12855
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeFinal");
12856
12857
0
    if (outl == NULL)
12858
0
        return;
12859
12860
0
    if (ctx == NULL || out == NULL) {
12861
0
        *outl = 0;
12862
0
        return;
12863
0
    }
12864
0
    if (ctx->remaining >= BASE64_ENCODE_RESULT_BLOCK_SIZE) {
12865
0
        *outl = 0;
12866
0
        return;
12867
0
    }
12868
    /* process remaining data in ctx */
12869
0
    outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; /* 64 byte and one for LF*/
12870
0
    res = Base64_Encode(ctx->data, (word32)ctx->remaining, out, &outsz);
12871
0
    if (res == 0)
12872
0
        *outl = (int)outsz;
12873
0
    else
12874
0
        *outl = 0;
12875
12876
0
    ctx->remaining = 0;
12877
0
    XMEMSET(ctx->data, 0, sizeof(ctx->data));
12878
12879
0
    return;
12880
0
}
12881
#endif /* WOLFSSL_BASE64_ENCODE */
12882
#if defined(WOLFSSL_BASE64_DECODE)
12883
12884
/*  wolfSSL_EVP_DecodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX struct
12885
 *  for subsequent wolfSSL_EVP_DecodeUpdate.
12886
 */
12887
void wolfSSL_EVP_DecodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
12888
0
{
12889
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeInit");
12890
    /* clean up ctx */
12891
0
    if (ctx != NULL) {
12892
0
        ctx->remaining = 0;
12893
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12894
0
    }
12895
0
}
12896
/*  wolfSSL_EVP_DecodeUpdate encodes the input data in 4-byte units
12897
 *  and outputs it to out. If less than 4 bytes of data remain, save it in
12898
 *  ctx. The data given in the subsequent wolfSSL_EVP_DecodeUpdate
12899
 *  is combined with the data stored in CTX and used for decoding.
12900
 *  Returns 1 or 0 on success, -1 on error. Return value 0 indicates that
12901
 *  clients should call wolfSSL_EVP_DecodeFinal as next call.
12902
 */
12903
int  wolfSSL_EVP_DecodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
12904
            unsigned char* out, int* outl, const unsigned char* in, int inl)
12905
0
{
12906
0
    word32 outsz = 0;
12907
0
    word32 j = 0;
12908
0
    word32 inLen;
12909
0
    int    res;
12910
0
    int    pad = 0;
12911
0
    int    i;
12912
0
    unsigned char c;
12913
0
    int pad3 = 0;
12914
0
    int pad4 = 0;
12915
0
    byte e[4];
12916
12917
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeUpdate");
12918
12919
0
    if (outl == NULL)
12920
0
        return -1;
12921
12922
0
    if (ctx == NULL || out == NULL || in == NULL) {
12923
0
        *outl = 0;
12924
0
        return -1;
12925
0
    }
12926
12927
0
    if (inl == 0) {
12928
0
        *outl = 0;
12929
0
        return 1;
12930
0
    }
12931
12932
0
    inLen = (word32)inl;
12933
0
    *outl = 0;
12934
12935
    /* if the remaining data exist in the ctx, add input data to them to create
12936
    a block(4bytes) for decoding*/
12937
0
    if (ctx->remaining > 0 && inl > 0) {
12938
12939
0
        int cpySz = (int)min(
12940
0
            (word32)(BASE64_DECODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
12941
12942
0
        for ( i = 0; cpySz > 0 && inLen > 0; i++) {
12943
0
            if (Base64_SkipNewline(in, &inLen, &j) == WC_NO_ERR_TRACE(ASN_INPUT_E)) {
12944
0
                return -1;  /* detected an illegal char in input */
12945
0
            }
12946
0
            c = in[j++];
12947
12948
0
            if (c == '=')
12949
0
                pad = 1;
12950
12951
0
            *(ctx->data + ctx->remaining + i) = c;
12952
0
            inLen--;
12953
0
            cpySz--;
12954
0
        }
12955
12956
0
        outsz = sizeof(ctx->data);
12957
0
        res = Base64_Decode( ctx->data, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
12958
0
        if (res == 0) {
12959
0
            *outl += (int)outsz;
12960
0
            out   += outsz;
12961
12962
0
            ctx->remaining = 0;
12963
0
            XMEMSET(ctx->data, 0, sizeof(ctx->data));
12964
0
        }
12965
0
        else {
12966
0
            *outl = 0;
12967
0
            return -1;   /* return with error */
12968
0
        }
12969
0
    }
12970
12971
    /* Base64_Decode is not a streaming process, so it processes
12972
     * the input data and exits. If a line break or whitespace
12973
     * character is found in the input data, it will be skipped,
12974
     * but if the end point of the input data is reached as a result,
12975
     * Base64_Decode will stop processing there. The data cleansing is
12976
     * required before Base64_Decode so that the processing does not
12977
     * stop within 4 bytes, which is the unit of Base64 decoding processing.
12978
     * The logic that exists before calling Base64_Decode in a While Loop is
12979
     * a data cleansing process that removes line breaks and whitespace.
12980
     */
12981
0
    while (inLen > 3) {
12982
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
12983
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
12984
0
                break;
12985
0
            }
12986
0
            else {
12987
0
                *outl = 0;
12988
0
                return -1;
12989
0
            }
12990
0
        }
12991
0
        e[0] = in[j++];
12992
0
        if (e[0] == '\0') {
12993
0
            break;
12994
0
        }
12995
0
        inLen--;
12996
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
12997
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
12998
0
                break;
12999
0
            }
13000
0
            else {
13001
0
                *outl = 0;
13002
0
                return -1;
13003
0
            }
13004
0
        }
13005
0
        e[1] = in[j++];
13006
0
        inLen--;
13007
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13008
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13009
0
                break;
13010
0
            }
13011
0
            else {
13012
0
                *outl = 0;
13013
0
                return -1;
13014
0
            }
13015
0
        }
13016
0
        e[2] = in[j++];
13017
0
        inLen--;
13018
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13019
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13020
0
                break;
13021
0
            }
13022
0
            else {
13023
0
                *outl = 0;
13024
0
                return -1;
13025
0
            }
13026
0
        }
13027
0
        e[3] = in[j++];
13028
0
        inLen--;
13029
13030
0
        if (e[0] == '=')
13031
0
            pad = 1;
13032
0
        if (e[1] == '=')
13033
0
            pad = 1;
13034
0
        if (e[2] == '=') {
13035
0
            pad = 1;
13036
0
            pad3 = 1;
13037
0
        }
13038
0
        if (e[3] == '=') {
13039
0
            pad = 1;
13040
0
            pad4 = 1;
13041
0
        }
13042
0
        if (pad3 && !pad4) {
13043
0
            *outl = 0;
13044
0
            return -1;
13045
0
        }
13046
13047
        /* decode four bytes */
13048
0
        outsz = sizeof(ctx->data);
13049
0
        res = Base64_Decode( e, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
13050
0
        if (res < 0) {
13051
0
            *outl = 0;
13052
0
            return -1;
13053
0
        }
13054
13055
0
        *outl += (int)outsz;
13056
0
        out   += outsz;
13057
0
    }
13058
    /* copy left data to ctx */
13059
0
    if (inLen > 0) {
13060
13061
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
13062
13063
0
        i = 0;
13064
0
        while (inLen > 0) {
13065
0
            c = in[j++];
13066
0
            if (c== '\n' || c == '\r' || c == ' ') {
13067
0
                inLen--;
13068
0
                continue;
13069
0
            }
13070
0
            if (c == '=') {
13071
0
                pad = 1;
13072
0
            }
13073
0
            ctx->data[i++] = c;
13074
0
            ctx->remaining++;
13075
0
            inLen--;
13076
0
        }
13077
13078
0
        if (pad)
13079
0
            return 0;   /* indicates that clients should call DecodeFinal */
13080
0
        else
13081
0
            return 1;
13082
13083
0
    }
13084
    /* If the last data is '\n', remove it */
13085
0
    if (j > 0) {
13086
0
        c = in[j - 1];
13087
0
        if (c == '\n' && (j > 1)) {
13088
0
            c = (in[j - 2]);
13089
0
            if (c == '=')
13090
0
                return 0;
13091
0
            else
13092
0
                return 1;
13093
0
        } else if (c == '\n') {
13094
0
            return 1;
13095
0
        }
13096
0
        if (c == '=')
13097
0
            return 0;
13098
0
        else
13099
0
            return 1;
13100
0
    }
13101
13102
    /* j == 0 */
13103
0
    return 1;
13104
0
}
13105
/*  wolfSSL_EVP_DecodeFinal decode remaining data in ctx
13106
 *  to outputs to out.
13107
 *  Returns 1 on success, -1 on failure.
13108
 */
13109
int  wolfSSL_EVP_DecodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
13110
                unsigned char* out, int* outl)
13111
0
{
13112
0
    word32 outsz = 0;
13113
0
    word32 inLen;
13114
0
    word32 j = 0;
13115
13116
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeFinal");
13117
13118
0
    if (outl == NULL)
13119
0
        return -1;
13120
13121
0
    if (ctx == NULL || out == NULL ) {
13122
0
        *outl = 0;
13123
0
        return -1;
13124
0
    }
13125
13126
0
    if (ctx->remaining > 0) {
13127
0
        int res;
13128
13129
0
        inLen = (word32)ctx->remaining;
13130
0
        if ((res = Base64_SkipNewline(ctx->data, &inLen, &j)) != 0) {
13131
0
            *outl = 0;
13132
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13133
                /* means no valid data to decode in buffer */
13134
0
                return  1; /* returns as success with no output */
13135
0
            }
13136
0
            else
13137
0
                return -1;
13138
0
        }
13139
13140
13141
0
        outsz = (word32)ctx->remaining;
13142
0
        res = Base64_Decode(ctx->data, (word32)ctx->remaining, out, &outsz);
13143
0
        if (res == 0) {
13144
0
            *outl = (int)outsz;
13145
0
            return 1;
13146
0
        }
13147
0
        else {
13148
0
            *outl = 0;
13149
0
            return -1;
13150
0
        }
13151
0
    }
13152
0
    else {
13153
0
        *outl = 0;
13154
0
        return 1;
13155
0
    }
13156
0
}
13157
#endif /* WOLFSSL_BASE64_DECODE */
13158
13159
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13160
13161
#endif /* WOLFSSL_EVP_INCLUDED */