Coverage Report

Created: 2026-04-05 07:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-openssl-api/wolfcrypt/src/evp.c
Line
Count
Source
1
/* evp.c
2
 *
3
 * Copyright (C) 2006-2026 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
#if !defined(WOLFSSL_EVP_INCLUDED)
25
    #ifndef WOLFSSL_IGNORE_FILE_WARN
26
        #warning evp.c does not need to be compiled separately from ssl.c
27
    #endif
28
#elif defined(WOLFCRYPT_ONLY)
29
#else
30
31
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
32
    defined(HAVE_CURL)
33
34
#if !defined(HAVE_PKCS7) && \
35
      ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \
36
       (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST))
37
    #include <wolfssl/wolfcrypt/aes.h>
38
#endif
39
40
#include <wolfssl/openssl/ecdsa.h>
41
#include <wolfssl/openssl/evp.h>
42
#include <wolfssl/openssl/kdf.h>
43
#include <wolfssl/wolfcrypt/wolfmath.h>
44
45
static const struct s_ent {
46
    const enum wc_HashType macType;
47
    const int nid;
48
    const char *name;
49
} md_tbl[] = {
50
#ifndef NO_MD4
51
    {WC_HASH_TYPE_MD4, WC_NID_md4, WC_SN_md4},
52
#endif /* NO_MD4 */
53
54
#ifndef NO_MD5
55
    {WC_HASH_TYPE_MD5, WC_NID_md5, WC_SN_md5},
56
#endif /* NO_MD5 */
57
58
#ifndef NO_SHA
59
    {WC_HASH_TYPE_SHA, WC_NID_sha1, WC_SN_sha1},
60
    {WC_HASH_TYPE_SHA, WC_NID_sha1, "SHA"}, /* Leave for backwards compatibility */
61
#endif /* NO_SHA */
62
63
#ifdef WOLFSSL_SHA224
64
    {WC_HASH_TYPE_SHA224, WC_NID_sha224, WC_SN_sha224},
65
#endif /* WOLFSSL_SHA224 */
66
#ifndef NO_SHA256
67
    {WC_HASH_TYPE_SHA256, WC_NID_sha256, WC_SN_sha256},
68
#endif
69
70
#ifdef WOLFSSL_SHA384
71
    {WC_HASH_TYPE_SHA384, WC_NID_sha384, WC_SN_sha384},
72
#endif /* WOLFSSL_SHA384 */
73
74
#ifdef WOLFSSL_SHA512
75
    {WC_HASH_TYPE_SHA512, WC_NID_sha512, WC_SN_sha512},
76
#endif /* WOLFSSL_SHA512 */
77
78
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
79
    {WC_HASH_TYPE_SHA512_224, WC_NID_sha512_224, WC_SN_sha512_224},
80
#endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */
81
82
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
83
    {WC_HASH_TYPE_SHA512_256, WC_NID_sha512_256, WC_SN_sha512_256},
84
#endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */
85
86
#ifndef WOLFSSL_NOSHA3_224
87
    {WC_HASH_TYPE_SHA3_224, WC_NID_sha3_224, WC_SN_sha3_224},
88
#endif
89
#ifndef WOLFSSL_NOSHA3_256
90
    {WC_HASH_TYPE_SHA3_256, WC_NID_sha3_256, WC_SN_sha3_256},
91
#endif
92
#ifndef WOLFSSL_NOSHA3_384
93
    {WC_HASH_TYPE_SHA3_384, WC_NID_sha3_384, WC_SN_sha3_384},
94
#endif
95
#ifndef WOLFSSL_NOSHA3_512
96
    {WC_HASH_TYPE_SHA3_512, WC_NID_sha3_512, WC_SN_sha3_512},
97
#endif
98
#ifdef WOLFSSL_SM3
99
    {WC_HASH_TYPE_SM3, WC_NID_sm3, WC_SN_sm3},
100
#endif /* WOLFSSL_SHA512 */
101
#ifdef HAVE_BLAKE2
102
    {WC_HASH_TYPE_BLAKE2B, WC_NID_blake2b512, WC_SN_blake2b512},
103
#endif
104
#ifdef HAVE_BLAKE2S
105
    {WC_HASH_TYPE_BLAKE2S, WC_NID_blake2s256, WC_SN_blake2s256},
106
#endif
107
#ifdef WOLFSSL_SHAKE128
108
    {WC_HASH_TYPE_SHAKE128, WC_NID_shake128, WC_SN_shake128},
109
#endif
110
#ifdef WOLFSSL_SHAKE256
111
    {WC_HASH_TYPE_SHAKE256, WC_NID_shake256, WC_SN_shake256},
112
#endif
113
    {WC_HASH_TYPE_NONE, 0, NULL}
114
};
115
#endif /* OPENSSL_EXTRA || HAVE_CURL */
116
117
#if defined(OPENSSL_EXTRA)
118
119
#ifndef NO_AES
120
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
121
    #ifdef WOLFSSL_AES_128
122
        static const char EVP_AES_128_CBC[] = "AES-128-CBC";
123
    #endif
124
    #ifdef WOLFSSL_AES_192
125
        static const char EVP_AES_192_CBC[] = "AES-192-CBC";
126
    #endif
127
    #ifdef WOLFSSL_AES_256
128
        static const char EVP_AES_256_CBC[] = "AES-256-CBC";
129
    #endif
130
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
131
132
    #ifdef WOLFSSL_AES_OFB
133
    #ifdef WOLFSSL_AES_128
134
        static const char EVP_AES_128_OFB[] = "AES-128-OFB";
135
    #endif
136
    #ifdef WOLFSSL_AES_192
137
        static const char EVP_AES_192_OFB[] = "AES-192-OFB";
138
    #endif
139
    #ifdef WOLFSSL_AES_256
140
        static const char EVP_AES_256_OFB[] = "AES-256-OFB";
141
    #endif
142
    #endif /* WOLFSSL_AES_OFB */
143
144
    #if defined(WOLFSSL_AES_XTS) && \
145
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
146
    #ifdef WOLFSSL_AES_128
147
        static const char EVP_AES_128_XTS[] = "AES-128-XTS";
148
    #endif
149
    #ifdef WOLFSSL_AES_256
150
        static const char EVP_AES_256_XTS[] = "AES-256-XTS";
151
    #endif
152
    #endif /* WOLFSSL_AES_XTS &&
153
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
154
155
    #ifdef WOLFSSL_AES_CFB
156
    #ifndef WOLFSSL_NO_AES_CFB_1_8
157
    #ifdef WOLFSSL_AES_128
158
        static const char EVP_AES_128_CFB1[] = "AES-128-CFB1";
159
    #endif
160
    #ifdef WOLFSSL_AES_192
161
        static const char EVP_AES_192_CFB1[] = "AES-192-CFB1";
162
    #endif
163
    #ifdef WOLFSSL_AES_256
164
        static const char EVP_AES_256_CFB1[] = "AES-256-CFB1";
165
    #endif
166
167
    #ifdef WOLFSSL_AES_128
168
        static const char EVP_AES_128_CFB8[] = "AES-128-CFB8";
169
    #endif
170
    #ifdef WOLFSSL_AES_192
171
        static const char EVP_AES_192_CFB8[] = "AES-192-CFB8";
172
    #endif
173
    #ifdef WOLFSSL_AES_256
174
        static const char EVP_AES_256_CFB8[] = "AES-256-CFB8";
175
    #endif
176
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
177
178
    #ifdef WOLFSSL_AES_128
179
        static const char EVP_AES_128_CFB128[] = "AES-128-CFB128";
180
    #endif
181
    #ifdef WOLFSSL_AES_192
182
        static const char EVP_AES_192_CFB128[] = "AES-192-CFB128";
183
    #endif
184
    #ifdef WOLFSSL_AES_256
185
        static const char EVP_AES_256_CFB128[] = "AES-256-CFB128";
186
    #endif
187
    #endif /* WOLFSSL_AES_CFB */
188
189
    #ifdef HAVE_AESGCM
190
        #ifdef WOLFSSL_AES_128
191
            static const char EVP_AES_128_GCM[] = "AES-128-GCM";
192
        #endif
193
        #ifdef WOLFSSL_AES_192
194
            static const char EVP_AES_192_GCM[] = "AES-192-GCM";
195
        #endif
196
        #ifdef WOLFSSL_AES_256
197
            static const char EVP_AES_256_GCM[] = "AES-256-GCM";
198
        #endif
199
    #endif /* HAVE_AESGCM */
200
201
    #ifdef HAVE_AESCCM
202
        #ifdef WOLFSSL_AES_128
203
            static const char EVP_AES_128_CCM[] = "AES-128-CCM";
204
        #endif
205
        #ifdef WOLFSSL_AES_192
206
            static const char EVP_AES_192_CCM[] = "AES-192-CCM";
207
        #endif
208
        #ifdef WOLFSSL_AES_256
209
            static const char EVP_AES_256_CCM[] = "AES-256-CCM";
210
        #endif
211
    #endif /* HAVE_AESCCM */
212
213
    #ifdef WOLFSSL_AES_COUNTER
214
    #ifdef WOLFSSL_AES_128
215
        static const char EVP_AES_128_CTR[] = "AES-128-CTR";
216
    #endif
217
    #ifdef WOLFSSL_AES_192
218
        static const char EVP_AES_192_CTR[] = "AES-192-CTR";
219
    #endif
220
    #ifdef WOLFSSL_AES_256
221
        static const char EVP_AES_256_CTR[] = "AES-256-CTR";
222
    #endif
223
    #endif
224
225
    #ifdef HAVE_AES_ECB
226
    #ifdef WOLFSSL_AES_128
227
        static const char EVP_AES_128_ECB[] = "AES-128-ECB";
228
    #endif
229
    #ifdef WOLFSSL_AES_192
230
        static const char EVP_AES_192_ECB[] = "AES-192-ECB";
231
    #endif
232
    #ifdef WOLFSSL_AES_256
233
        static const char EVP_AES_256_ECB[] = "AES-256-ECB";
234
    #endif
235
    #endif
236
#endif
237
238
#ifdef HAVE_ARIA
239
    #include <wolfssl/wolfcrypt/port/aria/aria-crypt.h>
240
    static const char EVP_ARIA_128_GCM[] = "ARIA-128-GCM";
241
    static const char EVP_ARIA_192_GCM[] = "ARIA-192-GCM";
242
    static const char EVP_ARIA_256_GCM[] = "ARIA-256-GCM";
243
#endif
244
245
#ifndef NO_DES3
246
    static const char EVP_DES_CBC[] = "DES-CBC";
247
    static const char EVP_DES_ECB[] = "DES-ECB";
248
249
    static const char EVP_DES_EDE3_CBC[] = "DES-EDE3-CBC";
250
    static const char EVP_DES_EDE3_ECB[] = "DES-EDE3-ECB";
251
#endif
252
253
#ifndef NO_RC4
254
    static const char EVP_ARC4[] = "ARC4";
255
#endif
256
257
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
258
    static const char EVP_CHACHA20_POLY1305[] = "CHACHA20-POLY1305";
259
#endif
260
261
#ifdef HAVE_CHACHA
262
    static const char EVP_CHACHA20[] = "CHACHA20";
263
#endif
264
265
#ifdef WOLFSSL_SM4_ECB
266
    static const char EVP_SM4_ECB[] = "SM4-ECB";
267
#endif /* WOLFSSL_SM4_ECB */
268
#ifdef WOLFSSL_SM4_CBC
269
    static const char EVP_SM4_CBC[] = "SM4-CBC";
270
#endif /* WOLFSSL_SM4_CBC */
271
#ifdef WOLFSSL_SM4_CTR
272
    static const char EVP_SM4_CTR[] = "SM4-CTR";
273
#endif /* WOLFSSL_SM4_CTR */
274
#ifdef WOLFSSL_SM4_GCM
275
    static const char EVP_SM4_GCM[] = "SM4-GCM";
276
#endif /* WOLFSSL_SM4_GCM */
277
#ifdef WOLFSSL_SM4_CCM
278
    static const char EVP_SM4_CCM[] = "SM4-CCM";
279
#endif /* WOLFSSL_SM4_CCM */
280
281
static const char EVP_NULL[] = "NULL";
282
283
static const struct pkey_type_name_ent {
284
    int type;
285
    const char *name;
286
} pkey_type_names[] = {
287
    { WC_EVP_PKEY_RSA,     "RSA" },
288
    { WC_EVP_PKEY_EC,      "EC" },
289
    { WC_EVP_PKEY_DH,      "DH" },
290
    { WC_EVP_PKEY_DSA,     "DSA" }
291
};
292
293
0
static int pkey_type_by_name(const char *name) {
294
0
    unsigned int i;
295
0
    if (name == NULL)
296
0
        return WC_EVP_PKEY_NONE;
297
0
    for (i = 0; i < XELEM_CNT(pkey_type_names); ++i) {
298
0
        if (XSTRCMP(name, pkey_type_names[i].name) == 0)
299
0
            return pkey_type_names[i].type;
300
0
    }
301
0
    return WC_EVP_PKEY_NONE;
302
0
}
303
304
0
int wolfSSL_EVP_PKEY_is_a(const WOLFSSL_EVP_PKEY *pkey, const char *name) {
305
0
    int type;
306
307
0
    if (pkey == NULL)
308
0
        return WOLFSSL_FAILURE;
309
310
0
    type = pkey_type_by_name(name);
311
0
    if (type == WC_EVP_PKEY_NONE)
312
0
        return WOLFSSL_FAILURE;
313
314
0
    return (pkey->type == type) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
315
0
}
316
317
748k
#define EVP_CIPHER_TYPE_MATCHES(x, y) (XSTRCMP(x,y) == 0)
318
319
#define WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX  80
320
0
#define WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE 15
321
322
static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher);
323
324
static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md);
325
326
/* Getter function for cipher key length
327
 *
328
 * c  WOLFSSL_EVP_CIPHER structure to get key length from
329
 *
330
 * NOTE: OpenSSL_add_all_ciphers() should be called first before using this
331
 *       function
332
 *
333
 * Returns size of key in bytes
334
 */
335
int wolfSSL_EVP_Cipher_key_length(const WOLFSSL_EVP_CIPHER* c)
336
4.92k
{
337
4.92k
    WOLFSSL_ENTER("wolfSSL_EVP_Cipher_key_length");
338
339
4.92k
    if (c == NULL) {
340
0
        return 0;
341
0
    }
342
343
4.92k
    switch (cipherType(c)) {
344
0
#if !defined(NO_AES)
345
0
  #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
346
307
      case WC_AES_128_CBC_TYPE: return 16;
347
144
      case WC_AES_192_CBC_TYPE: return 24;
348
138
      case WC_AES_256_CBC_TYPE: return 32;
349
0
  #endif
350
0
  #if defined(WOLFSSL_AES_CFB)
351
131
      case WC_AES_128_CFB1_TYPE: return 16;
352
45
      case WC_AES_192_CFB1_TYPE: return 24;
353
158
      case WC_AES_256_CFB1_TYPE: return 32;
354
160
      case WC_AES_128_CFB8_TYPE: return 16;
355
107
      case WC_AES_192_CFB8_TYPE: return 24;
356
123
      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
196
      case WC_AES_128_OFB_TYPE: return 16;
363
121
      case WC_AES_192_OFB_TYPE: return 24;
364
266
      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
369
      case WC_AES_128_XTS_TYPE: return 16 * 2;
369
92
      case WC_AES_256_XTS_TYPE: return 32 * 2;
370
0
  #endif
371
0
  #if defined(HAVE_AESGCM)
372
432
      case WC_AES_128_GCM_TYPE: return 16;
373
78
      case WC_AES_192_GCM_TYPE: return 24;
374
475
      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
58
      case WC_AES_128_CTR_TYPE: return 16;
383
406
      case WC_AES_192_CTR_TYPE: return 24;
384
45
      case WC_AES_256_CTR_TYPE: return 32;
385
0
  #endif
386
0
  #if defined(HAVE_AES_ECB)
387
42
      case WC_AES_128_ECB_TYPE: return 16;
388
48
      case WC_AES_192_ECB_TYPE: return 24;
389
56
      case WC_AES_256_ECB_TYPE: return 32;
390
0
  #endif
391
0
#endif /* !NO_AES */
392
0
  #ifndef NO_DES3
393
206
      case WC_DES_CBC_TYPE:      return 8;
394
217
      case WC_DES_EDE3_CBC_TYPE: return 24;
395
437
      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
66
      case WC_ARC4_TYPE:         return 16;
400
0
  #endif
401
0
  #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
402
0
      case WC_CHACHA20_POLY1305_TYPE: return 32;
403
0
  #endif
404
0
  #ifdef HAVE_CHACHA
405
0
      case WC_CHACHA20_TYPE: return CHACHA_MAX_KEY_SZ;
406
0
  #endif
407
0
  #ifdef WOLFSSL_SM4_ECB
408
0
      case WC_SM4_ECB_TYPE:      return 16;
409
0
  #endif
410
0
  #ifdef WOLFSSL_SM4_CBC
411
0
      case WC_SM4_CBC_TYPE:      return 16;
412
0
  #endif
413
0
  #ifdef WOLFSSL_SM4_CTR
414
0
      case WC_SM4_CTR_TYPE:      return 16;
415
0
  #endif
416
0
  #ifdef WOLFSSL_SM4_GCM
417
0
      case WC_SM4_GCM_TYPE:      return 16;
418
0
  #endif
419
0
  #ifdef WOLFSSL_SM4_CCM
420
0
      case WC_SM4_CCM_TYPE:      return 16;
421
0
  #endif
422
0
      default:
423
0
          return 0;
424
4.92k
      }
425
4.92k
}
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.73k
{
442
4.73k
    (void) impl;
443
4.73k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
444
4.73k
}
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.73k
{
461
4.73k
    (void) impl;
462
4.73k
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptInit");
463
4.73k
    return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
464
4.73k
}
465
466
467
WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void)
468
8.36k
{
469
8.36k
    WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof(*ctx),
470
8.36k
                                                 NULL, DYNAMIC_TYPE_TMP_BUFFER);
471
8.36k
    if (ctx) {
472
8.36k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new");
473
8.36k
        wolfSSL_EVP_CIPHER_CTX_init(ctx);
474
8.36k
    }
475
8.36k
    return ctx;
476
8.36k
}
477
478
void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx)
479
8.36k
{
480
8.36k
    if (ctx) {
481
8.36k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_free");
482
8.36k
        wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
483
8.36k
        XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
484
8.36k
    }
485
8.36k
}
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.63k
{
579
1.63k
    if (sz > 0) {
580
1.63k
        int fill;
581
582
1.63k
        if ((sz+ctx->bufUsed) > ctx->block_size) {
583
306
            fill = ctx->block_size - ctx->bufUsed;
584
1.32k
        } else {
585
1.32k
            fill = sz;
586
1.32k
        }
587
1.63k
        XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, (size_t)fill);
588
1.63k
        ctx->bufUsed += fill;
589
1.63k
        return fill;
590
1.63k
    } else return 0;
591
1.63k
}
592
593
static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx,
594
                                   unsigned char *out,
595
                                   const unsigned char *in, int inLen)
596
4.98k
{
597
4.98k
    int ret = 0;
598
4.98k
    word32 inl = (word32)inLen;
599
600
4.98k
    switch (ctx->cipherType) {
601
0
#if !defined(NO_AES)
602
0
    #if defined(HAVE_AES_CBC)
603
190
        case WC_AES_128_CBC_TYPE:
604
275
        case WC_AES_192_CBC_TYPE:
605
339
        case WC_AES_256_CBC_TYPE:
606
339
            if (ctx->enc)
607
164
                ret = wc_AesCbcEncrypt(&ctx->cipher.aes, out, in, inl);
608
175
            else
609
175
                ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl);
610
339
            break;
611
0
    #endif
612
0
    #if defined(WOLFSSL_AES_COUNTER)
613
116
        case WC_AES_128_CTR_TYPE:
614
785
        case WC_AES_192_CTR_TYPE:
615
844
        case WC_AES_256_CTR_TYPE:
616
844
            ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
617
844
            break;
618
0
    #endif
619
0
    #if defined(HAVE_AES_ECB)
620
70
        case WC_AES_128_ECB_TYPE:
621
114
        case WC_AES_192_ECB_TYPE:
622
230
        case WC_AES_256_ECB_TYPE:
623
230
            if (ctx->enc)
624
185
                ret = wc_AesEcbEncrypt(&ctx->cipher.aes, out, in, inl);
625
45
            else
626
45
                ret = wc_AesEcbDecrypt(&ctx->cipher.aes, out, in, inl);
627
230
            break;
628
0
    #endif
629
0
    #if defined(WOLFSSL_AES_OFB)
630
349
        case WC_AES_128_OFB_TYPE:
631
543
        case WC_AES_192_OFB_TYPE:
632
943
        case WC_AES_256_OFB_TYPE:
633
943
            if (ctx->enc)
634
666
                ret = wc_AesOfbEncrypt(&ctx->cipher.aes, out, in, inl);
635
277
            else
636
277
                ret = wc_AesOfbDecrypt(&ctx->cipher.aes, out, in, inl);
637
943
            break;
638
0
    #endif
639
0
    #if defined(WOLFSSL_AES_CFB)
640
0
    #if !defined(WOLFSSL_NO_AES_CFB_1_8)
641
106
        case WC_AES_128_CFB1_TYPE:
642
156
        case WC_AES_192_CFB1_TYPE:
643
387
        case WC_AES_256_CFB1_TYPE:
644
387
            if (ctx->enc)
645
264
                ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, out, in,
646
264
                        inl * WOLFSSL_BIT_SIZE);
647
123
            else
648
123
                ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, out, in,
649
123
                        inl * WOLFSSL_BIT_SIZE);
650
387
            break;
651
652
239
        case WC_AES_128_CFB8_TYPE:
653
341
        case WC_AES_192_CFB8_TYPE:
654
403
        case WC_AES_256_CFB8_TYPE:
655
403
            if (ctx->enc)
656
219
                ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, out, in, inl);
657
184
            else
658
184
                ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, out, in, inl);
659
403
            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
365
    case WC_AES_128_XTS_TYPE:
673
455
    case WC_AES_256_XTS_TYPE:
674
455
        if (ctx->enc)
675
218
            ret = wc_AesXtsEncrypt(&ctx->cipher.xts, out, in, inl,
676
218
                    ctx->iv, (word32)ctx->ivSz);
677
237
        else
678
237
            ret = wc_AesXtsDecrypt(&ctx->cipher.xts, out, in, inl,
679
237
                    ctx->iv, (word32)ctx->ivSz);
680
455
        break;
681
0
#endif
682
0
#endif /* !NO_AES */
683
0
    #ifndef NO_DES3
684
331
        case WC_DES_CBC_TYPE:
685
331
            if (ctx->enc)
686
219
                ret = wc_Des_CbcEncrypt(&ctx->cipher.des, out, in, inl);
687
112
            else
688
112
                ret = wc_Des_CbcDecrypt(&ctx->cipher.des, out, in, inl);
689
331
            break;
690
450
        case WC_DES_EDE3_CBC_TYPE:
691
450
            if (ctx->enc)
692
343
                ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, out, in, inl);
693
107
            else
694
107
                ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, out, in, inl);
695
450
            break;
696
0
        #if defined(WOLFSSL_DES_ECB)
697
548
        case WC_DES_ECB_TYPE:
698
548
            if (ctx->enc)
699
372
                ret = wc_Des_EcbEncrypt(&ctx->cipher.des, out, in, inl);
700
176
            else
701
176
                ret = wc_Des_EcbDecrypt(&ctx->cipher.des, out, in, inl);
702
548
            break;
703
0
        case WC_DES_EDE3_ECB_TYPE:
704
0
            if (ctx->enc)
705
0
                ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, out, in, inl);
706
0
            else
707
0
                ret = wc_Des3_EcbDecrypt(&ctx->cipher.des3, out, in, inl);
708
0
            break;
709
0
        #endif
710
0
    #endif
711
0
    #ifndef NO_RC4
712
51
        case WC_ARC4_TYPE:
713
51
            wc_Arc4Process(&ctx->cipher.arc4, out, in, inl);
714
51
            break;
715
0
    #endif
716
0
#if defined(WOLFSSL_SM4_ECB)
717
0
        case WC_SM4_ECB_TYPE:
718
0
            if (ctx->enc)
719
0
                wc_Sm4EcbEncrypt(&ctx->cipher.sm4, out, in, inl);
720
0
            else
721
0
                wc_Sm4EcbDecrypt(&ctx->cipher.sm4, out, in, inl);
722
0
            break;
723
0
#endif
724
0
#if defined(WOLFSSL_SM4_CBC)
725
0
        case WC_SM4_CBC_TYPE:
726
0
            if (ctx->enc)
727
0
                wc_Sm4CbcEncrypt(&ctx->cipher.sm4, out, in, inl);
728
0
            else
729
0
                wc_Sm4CbcDecrypt(&ctx->cipher.sm4, out, in, inl);
730
0
            break;
731
0
#endif
732
0
#if defined(WOLFSSL_SM4_CTR)
733
0
        case WC_SM4_CTR_TYPE:
734
0
            wc_Sm4CtrEncrypt(&ctx->cipher.sm4, out, in, inl);
735
0
            break;
736
0
#endif
737
738
0
        default:
739
0
            ret = WOLFSSL_FAILURE;
740
4.98k
    }
741
742
4.98k
    (void)in;
743
4.98k
    (void)inl;
744
4.98k
    (void)out;
745
746
4.98k
    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
747
4.98k
}
748
749
#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
750
#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
751
static int wolfSSL_EVP_CipherUpdate_GCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
752
0
        const unsigned char *in, int inl) {
753
0
    if (in && inl > 0) {
754
0
        byte* tmp;
755
0
        if (inl > INT_MAX - ctx->authInSz) {
756
0
            WOLFSSL_MSG("AuthIn overflow");
757
0
            return BAD_FUNC_ARG;
758
0
        }
759
    #ifdef WOLFSSL_NO_REALLOC
760
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
761
                DYNAMIC_TYPE_OPENSSL);
762
        if (tmp != NULL) {
763
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
764
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
765
            ctx->authIn = NULL;
766
        }
767
    #else
768
0
        tmp = (byte*)XREALLOC(ctx->authIn,
769
0
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
770
0
    #endif
771
0
        if (tmp) {
772
0
            ctx->authIn = tmp;
773
0
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
774
0
            ctx->authInSz += inl;
775
0
        }
776
0
        else {
777
0
            WOLFSSL_MSG("realloc error");
778
0
            return MEMORY_E;
779
0
        }
780
0
    }
781
0
    return 0;
782
0
}
783
#endif /* WOLFSSL_AESGCM_STREAM */
784
785
static int wolfSSL_EVP_CipherUpdate_GCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
786
                                   unsigned char *out, int *outl,
787
                                   const unsigned char *in, int inLen)
788
9.15k
{
789
9.15k
    word32 inl = (word32)inLen;
790
791
9.15k
#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
792
9.15k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
793
9.15k
    if (ctx->cipherType == WC_SM4_GCM_TYPE)
794
0
#endif
795
0
    {
796
0
        int ret = 0;
797
798
0
        *outl = inl;
799
0
        if (out) {
800
            /* Buffer input for one-shot API */
801
0
            if (inl > 0) {
802
0
                byte* tmp;
803
0
                if ((int)inl > INT_MAX - ctx->authBufferLen) {
804
0
                    return MEMORY_E;
805
0
                }
806
            #ifdef WOLFSSL_NO_REALLOC
807
                tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL,
808
                        DYNAMIC_TYPE_OPENSSL);
809
                if (tmp != NULL) {
810
                    XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
811
                    XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
812
                    ctx->authBuffer = NULL;
813
                }
814
            #else
815
0
                tmp = (byte*)XREALLOC(ctx->authBuffer,
816
0
                        (size_t)(ctx->authBufferLen + inl), NULL,
817
0
                        DYNAMIC_TYPE_OPENSSL);
818
0
            #endif
819
0
                if (tmp) {
820
0
                    XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
821
0
                    ctx->authBufferLen += inl;
822
0
                    ctx->authBuffer = tmp;
823
0
                    *outl = 0;
824
0
                }
825
0
                else {
826
0
                    ret = MEMORY_E;
827
0
                }
828
0
            }
829
0
        }
830
0
        else {
831
0
            ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, in, inl);
832
0
        }
833
834
0
        if (ret != 0) {
835
0
            *outl = 0;
836
0
            return WOLFSSL_FAILURE;
837
0
        }
838
839
0
        return WOLFSSL_SUCCESS;
840
0
    }
841
9.15k
#endif
842
9.15k
#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
843
9.15k
    else
844
9.15k
#endif
845
9.15k
#if defined(WOLFSSL_AESGCM_STREAM)
846
9.15k
    {
847
9.15k
        int ret;
848
849
        /* When out is NULL then this is AAD. */
850
9.15k
        if (out == NULL) {
851
1.78k
            if (ctx->enc) {
852
62
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
853
62
                    in, inl);
854
62
            }
855
1.72k
            else {
856
1.72k
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
857
1.72k
                    in, inl);
858
1.72k
            }
859
1.78k
        }
860
        /* When out is not NULL then this is plaintext/cipher text. */
861
7.36k
        else {
862
7.36k
            if (ctx->enc) {
863
7.03k
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl,
864
7.03k
                    NULL, 0);
865
7.03k
            }
866
332
            else {
867
332
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl,
868
332
                    NULL, 0);
869
332
            }
870
7.36k
        }
871
9.15k
        *outl = (int)inl;
872
9.15k
        if (ret == 0) {
873
9.15k
            ret = WOLFSSL_SUCCESS;
874
9.15k
        }
875
0
        else {
876
0
            ret = WOLFSSL_FAILURE;
877
0
        }
878
9.15k
        return ret;
879
9.15k
    }
880
9.15k
#endif /* WOLFSSL_AESGCM_STREAM */
881
9.15k
}
882
#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM */
883
884
#if defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_CCM)
885
static int wolfSSL_EVP_CipherUpdate_CCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
886
0
        const unsigned char *in, int inl) {
887
0
    if (in && inl > 0) {
888
0
        byte* tmp;
889
0
        if (inl > INT_MAX - ctx->authInSz) {
890
0
            WOLFSSL_MSG("AuthIn overflow");
891
0
            return BAD_FUNC_ARG;
892
0
        }
893
    #ifdef WOLFSSL_NO_REALLOC
894
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
895
                DYNAMIC_TYPE_OPENSSL);
896
        if (tmp != NULL) {
897
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
898
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
899
            ctx->authIn = NULL;
900
        }
901
    #else
902
0
        tmp = (byte*)XREALLOC(ctx->authIn,
903
0
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
904
0
    #endif
905
0
        if (tmp) {
906
0
            ctx->authIn = tmp;
907
0
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
908
0
            ctx->authInSz += inl;
909
0
        }
910
0
        else {
911
0
            WOLFSSL_MSG("realloc error");
912
0
            return MEMORY_E;
913
0
        }
914
0
    }
915
0
    return 0;
916
0
}
917
918
static int wolfSSL_EVP_CipherUpdate_CCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
919
                                   unsigned char *out, int *outl,
920
                                   const unsigned char *in, int inl)
921
0
{
922
0
    int ret = 0;
923
924
0
    *outl = inl;
925
0
    if (out) {
926
        /* Buffer input for one-shot API */
927
0
        if (inl > 0) {
928
0
            byte* tmp;
929
0
            if (inl > INT_MAX - ctx->authBufferLen) {
930
0
                return MEMORY_E;
931
0
            }
932
        #ifdef WOLFSSL_NO_REALLOC
933
            tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL,
934
                    DYNAMIC_TYPE_OPENSSL);
935
            if (tmp != NULL) {
936
                XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
937
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
938
                ctx->authBuffer = NULL;
939
            }
940
        #else
941
0
            tmp = (byte*)XREALLOC(ctx->authBuffer,
942
0
                    (size_t)(ctx->authBufferLen + inl), NULL,
943
0
                    DYNAMIC_TYPE_OPENSSL);
944
0
        #endif
945
0
            if (tmp) {
946
0
                XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
947
0
                ctx->authBufferLen += inl;
948
0
                ctx->authBuffer = tmp;
949
0
                *outl = 0;
950
0
            }
951
0
            else {
952
0
                ret = MEMORY_E;
953
0
            }
954
0
        }
955
0
    }
956
0
    else {
957
0
        ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, in, inl);
958
0
    }
959
960
0
    if (ret != 0) {
961
0
        *outl = 0;
962
0
        return WOLFSSL_FAILURE;
963
0
    }
964
965
0
    return WOLFSSL_SUCCESS;
966
0
}
967
#endif /* HAVE_AESCCM || WOLFSSL_SM4_CCM */
968
969
#if defined(HAVE_ARIA)
970
static int wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
971
        const unsigned char *in, int inl)
972
{
973
    if (in && inl > 0) {
974
        byte* tmp;
975
        if (inl > INT_MAX - ctx->authInSz) {
976
            WOLFSSL_MSG("AuthIn overflow");
977
            return BAD_FUNC_ARG;
978
        }
979
    #ifdef WOLFSSL_NO_REALLOC
980
        tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL,
981
                DYNAMIC_TYPE_OPENSSL);
982
        if (tmp != NULL) {
983
            XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz);
984
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
985
            ctx->authIn = NULL;
986
        }
987
    #else
988
        tmp = (byte*)XREALLOC(ctx->authIn,
989
                (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
990
    #endif
991
        if (tmp) {
992
            ctx->authIn = tmp;
993
            XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
994
            ctx->authInSz += inl;
995
        }
996
        else {
997
            WOLFSSL_MSG("realloc error");
998
            return MEMORY_E;
999
        }
1000
    }
1001
    return 0;
1002
}
1003
1004
static int wolfSSL_EVP_CipherUpdate_AriaGCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
1005
                                   unsigned char *out, int *outl,
1006
                                   const unsigned char *in, int inl)
1007
{
1008
    int ret = 0;
1009
1010
    *outl = inl;
1011
    if (out) {
1012
        /* Buffer input for one-shot API */
1013
        if (inl > 0) {
1014
            byte* tmp;
1015
            int size = ctx->authBufferLen + inl;
1016
            if (ctx->enc == 0) { /* Append extra space for the tag */
1017
                size = WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(size);
1018
            }
1019
        #ifdef WOLFSSL_NO_REALLOC
1020
            tmp = (byte*)XMALLOC((size_t)size, NULL,
1021
                DYNAMIC_TYPE_OPENSSL);
1022
            if (tmp != NULL) {
1023
                XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen);
1024
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1025
                ctx->authBuffer = NULL;
1026
            }
1027
        #else
1028
            tmp = (byte*)XREALLOC(ctx->authBuffer, (size_t)size, NULL,
1029
                DYNAMIC_TYPE_OPENSSL);
1030
        #endif
1031
            if (tmp) {
1032
                XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
1033
                ctx->authBufferLen += inl;
1034
                ctx->authBuffer = tmp;
1035
                *outl = 0;
1036
            }
1037
            else {
1038
                ret = MEMORY_E;
1039
            }
1040
        }
1041
    }
1042
    else {
1043
        ret = wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(ctx, in, inl);
1044
    }
1045
1046
    if (ret != 0) {
1047
        *outl = 0;
1048
        return WOLFSSL_FAILURE;
1049
    }
1050
1051
    return WOLFSSL_SUCCESS;
1052
}
1053
#endif /* HAVE_ARIA */
1054
1055
1056
/* returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
1057
int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx,
1058
                                   unsigned char *out, int *outl,
1059
                                   const unsigned char *in, int inl)
1060
28.4k
{
1061
28.4k
    int blocks;
1062
1063
28.4k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherUpdate");
1064
28.4k
    if ((ctx == NULL) || (outl == NULL)) {
1065
0
        WOLFSSL_MSG("Bad argument");
1066
0
        return WOLFSSL_FAILURE;
1067
0
    }
1068
1069
28.4k
    *outl = 0;
1070
1071
28.4k
    if ((inl == 0) && (in == NULL)) {
1072
        /* Nothing to do in this case. Just return. */
1073
364
        return WOLFSSL_SUCCESS;
1074
364
    }
1075
1076
28.0k
    if ((inl < 0) || (in == NULL)) {
1077
0
        WOLFSSL_MSG("Bad argument");
1078
0
        return WOLFSSL_FAILURE;
1079
0
    }
1080
1081
28.0k
    switch (ctx->cipherType) {
1082
0
        case WC_NULL_CIPHER_TYPE:
1083
0
            if (out == NULL) {
1084
0
                WOLFSSL_MSG("Bad argument");
1085
0
                return WOLFSSL_FAILURE;
1086
0
            }
1087
0
            XMEMMOVE(out, in, inl);
1088
0
            *outl = inl;
1089
0
            return WOLFSSL_SUCCESS;
1090
0
#if !defined(NO_AES) && defined(HAVE_AESGCM)
1091
4.94k
        case WC_AES_128_GCM_TYPE:
1092
5.63k
        case WC_AES_192_GCM_TYPE:
1093
9.15k
        case WC_AES_256_GCM_TYPE:
1094
            /* if out == NULL, in/inl contains the additional auth data */
1095
9.15k
            return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
1096
0
#endif /* !defined(NO_AES) && defined(HAVE_AESGCM) */
1097
0
#if !defined(NO_AES) && defined(HAVE_AESCCM)
1098
0
        case WC_AES_128_CCM_TYPE:
1099
0
        case WC_AES_192_CCM_TYPE:
1100
0
        case WC_AES_256_CCM_TYPE:
1101
            /* if out == NULL, in/inl contains the
1102
             * additional auth data */
1103
0
            return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
1104
0
#endif /* !defined(NO_AES) && defined(HAVE_AESCCM) */
1105
#if defined(HAVE_ARIA)
1106
        case WC_ARIA_128_GCM_TYPE:
1107
        case WC_ARIA_192_GCM_TYPE:
1108
        case WC_ARIA_256_GCM_TYPE:
1109
            /* if out == NULL, in/inl contains the additional auth data */
1110
            return wolfSSL_EVP_CipherUpdate_AriaGCM(ctx, out, outl, in, inl);
1111
#endif /* defined(HAVE_ARIA) */
1112
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
1113
0
        case WC_CHACHA20_POLY1305_TYPE:
1114
0
            if (out == NULL) {
1115
0
                if (wc_ChaCha20Poly1305_UpdateAad(&ctx->cipher.chachaPoly, in,
1116
0
                                                  (word32)inl) != 0) {
1117
0
                    WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateAad failed");
1118
0
                    return WOLFSSL_FAILURE;
1119
0
                }
1120
0
                else {
1121
0
                    *outl = inl;
1122
0
                    return WOLFSSL_SUCCESS;
1123
0
                }
1124
0
            }
1125
0
            else {
1126
0
                if (wc_ChaCha20Poly1305_UpdateData(&ctx->cipher.chachaPoly, in,
1127
0
                                                   out, (word32)inl) != 0) {
1128
0
                    WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateData failed");
1129
0
                    return WOLFSSL_FAILURE;
1130
0
                }
1131
0
                else {
1132
0
                    *outl = inl;
1133
0
                    return WOLFSSL_SUCCESS;
1134
0
                }
1135
0
            }
1136
0
#endif
1137
0
#ifdef HAVE_CHACHA
1138
0
        case WC_CHACHA20_TYPE:
1139
0
            if (wc_Chacha_Process(&ctx->cipher.chacha, out, in, (word32)inl) !=
1140
0
                    0) {
1141
0
                WOLFSSL_MSG("wc_ChaCha_Process failed");
1142
0
                return WOLFSSL_FAILURE;
1143
0
            }
1144
0
            *outl = inl;
1145
0
            return WOLFSSL_SUCCESS;
1146
0
#endif
1147
0
#ifdef WOLFSSL_SM4_GCM
1148
0
        case WC_SM4_GCM_TYPE:
1149
            /* if out == NULL, in/inl contains the additional auth data */
1150
0
            return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
1151
0
#endif
1152
0
#ifdef WOLFSSL_SM4_CCM
1153
0
        case WC_SM4_CCM_TYPE:
1154
            /* if out == NULL, in/inl contains the
1155
             * additional auth data */
1156
0
            return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
1157
0
#endif
1158
18.9k
        default:
1159
            /* fall-through */
1160
18.9k
            break;
1161
28.0k
    }
1162
1163
18.9k
    if (out == NULL) {
1164
1
        return WOLFSSL_FAILURE;
1165
1
    }
1166
1167
    /* if(inl == 0)wolfSSL_EVP_CipherUpdate_GCM to get tag */
1168
18.9k
    if (inl == 0) {
1169
13.6k
        return WOLFSSL_SUCCESS;
1170
13.6k
    }
1171
5.25k
    if (ctx->bufUsed > 0) { /* concatenate them if there is anything */
1172
902
        int fill = fillBuff(ctx, in, inl);
1173
902
        inl -= fill;
1174
902
        in  += fill;
1175
902
    }
1176
1177
    /* check if the buff is full, and if so flash it out */
1178
5.25k
    if (ctx->bufUsed == ctx->block_size) {
1179
468
        byte* output = out;
1180
1181
        /* During decryption we save the last block to check padding on Final.
1182
         * Update the last block stored if one has already been stored */
1183
468
        if (ctx->enc == 0) {
1184
0
            if (ctx->lastUsed == 1) {
1185
0
                XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
1186
0
                *outl+= ctx->block_size;
1187
0
                out  += ctx->block_size;
1188
0
            }
1189
0
            output = ctx->lastBlock; /* redirect output to last block buffer */
1190
0
            ctx->lastUsed = 1;
1191
0
        }
1192
1193
468
        PRINT_BUF(ctx->buf, ctx->block_size);
1194
468
        if (evpCipherBlock(ctx, output, ctx->buf, ctx->block_size) == 0) {
1195
0
            return WOLFSSL_FAILURE;
1196
0
        }
1197
468
        PRINT_BUF(out, ctx->block_size);
1198
468
        ctx->bufUsed = 0;
1199
1200
        /* if doing encryption update the new output block, decryption will
1201
         * always have the last block saved for when Final is called */
1202
468
        if ((ctx->enc != 0)) {
1203
468
            *outl+= ctx->block_size;
1204
468
            out  += ctx->block_size;
1205
468
        }
1206
468
    }
1207
1208
5.25k
    blocks = inl / ctx->block_size;
1209
5.25k
    if (blocks > 0) {
1210
        /* During decryption we save the last block to check padding on Final.
1211
         * Update the last block stored if one has already been stored */
1212
4.26k
        if ((ctx->enc == 0) && (ctx->lastUsed == 1)) {
1213
0
            PRINT_BUF(ctx->lastBlock, ctx->block_size);
1214
0
            XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
1215
0
            *outl += ctx->block_size;
1216
0
            out += ctx->block_size;
1217
0
            ctx->lastUsed = 0;
1218
0
        }
1219
1220
        /* process blocks */
1221
4.26k
        if (evpCipherBlock(ctx, out, in, blocks * ctx->block_size) == 0) {
1222
13
            return WOLFSSL_FAILURE;
1223
13
        }
1224
4.25k
        PRINT_BUF(in, ctx->block_size*blocks);
1225
4.25k
        PRINT_BUF(out,ctx->block_size*blocks);
1226
4.25k
        inl  -= ctx->block_size * blocks;
1227
4.25k
        in   += ctx->block_size * blocks;
1228
4.25k
        if (ctx->enc == 0) {
1229
1.69k
            if ((ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) ||
1230
1.47k
                    (ctx->block_size == 1)) {
1231
1.30k
                ctx->lastUsed = 0;
1232
1.30k
                *outl += ctx->block_size * blocks;
1233
1.30k
            } else {
1234
                /* in the case of decryption and padding, store the last block
1235
                 * here in order to verify the padding when Final is called */
1236
394
                if (inl == 0) { /* if not 0 then we know leftovers are checked*/
1237
391
                    ctx->lastUsed = 1;
1238
391
                    blocks = blocks - 1; /* save last block to check padding in
1239
                                          * EVP_CipherFinal call */
1240
391
                    XMEMCPY(ctx->lastBlock, &out[ctx->block_size * blocks],
1241
391
                            (size_t)ctx->block_size);
1242
391
                }
1243
394
                *outl += ctx->block_size * blocks;
1244
394
            }
1245
2.56k
        } else {
1246
2.56k
            *outl += ctx->block_size * blocks;
1247
2.56k
        }
1248
4.25k
    }
1249
1250
1251
5.24k
    if (inl > 0) {
1252
        /* put fraction into buff */
1253
728
        fillBuff(ctx, in, inl);
1254
        /* no increase of outl */
1255
728
    }
1256
5.24k
    (void)out; /* silence warning in case not read */
1257
1258
5.24k
    return WOLFSSL_SUCCESS;
1259
5.25k
}
1260
1261
static void padBlock(WOLFSSL_EVP_CIPHER_CTX *ctx)
1262
245
{
1263
245
    int i;
1264
1.52k
    for (i = ctx->bufUsed; i < ctx->block_size; i++)
1265
1.27k
        ctx->buf[i] = (byte)(ctx->block_size - ctx->bufUsed);
1266
245
}
1267
1268
static int checkPad(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *buff)
1269
391
{
1270
391
    int i;
1271
391
    int n;
1272
391
    byte mask = 0;
1273
391
    n = buff[ctx->block_size-1];
1274
    /* Encode invalid n into mask constant-time instead of early-returning,
1275
     * so the loop always runs and timing does not reveal padding length. */
1276
391
    mask |= ctMaskEq(n, 0) | ctMaskGT(n, ctx->block_size);
1277
4.91k
    for (i = 0; i < ctx->block_size; i++) {
1278
4.52k
        byte in_padding = ctMaskLT(i, n);
1279
4.52k
        mask |= ctMaskSel(in_padding,
1280
4.52k
                    ctMaskNotEq(buff[ctx->block_size - 1 - i], n), 0);
1281
4.52k
    }
1282
391
    return ctMaskSelInt(ctMaskEq(mask, 0), ctx->block_size - n, -1);
1283
391
}
1284
1285
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1286
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1287
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1288
static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
1289
0
{
1290
0
    int i;
1291
0
    for (i = (int)ctrSz-1; i >= 0; i--) {
1292
0
        if (++ctr[i])
1293
0
            break;
1294
0
    }
1295
0
}
1296
#endif
1297
1298
int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out,
1299
                            int *outl)
1300
4.15k
{
1301
4.15k
    int ret = WOLFSSL_SUCCESS;
1302
1303
4.15k
    if (!ctx || !outl)
1304
0
        return WOLFSSL_FAILURE;
1305
1306
4.15k
    WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal");
1307
4.15k
    switch (ctx->cipherType) {
1308
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1309
0
    || FIPS_VERSION_GE(2,0))
1310
410
        case WC_AES_128_GCM_TYPE:
1311
482
        case WC_AES_192_GCM_TYPE:
1312
907
        case WC_AES_256_GCM_TYPE:
1313
#ifndef WOLFSSL_AESGCM_STREAM
1314
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1315
             || (ctx->authBufferLen == 0)) {
1316
                if (ctx->enc)
1317
                    ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out,
1318
                            ctx->authBuffer, ctx->authBufferLen,
1319
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1320
                            ctx->authIn, ctx->authInSz);
1321
                else
1322
                    ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out,
1323
                            ctx->authBuffer, ctx->authBufferLen,
1324
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1325
                            ctx->authIn, ctx->authInSz);
1326
1327
                if (ret == 0) {
1328
                    ret = WOLFSSL_SUCCESS;
1329
                    *outl = ctx->authBufferLen;
1330
                }
1331
                else {
1332
                    ret = WOLFSSL_FAILURE;
1333
                    *outl = 0;
1334
                }
1335
1336
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1337
                ctx->authBuffer = NULL;
1338
                ctx->authBufferLen = 0;
1339
1340
                if (ctx->authIncIv) {
1341
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1342
                    ctx->authIncIv = 0;
1343
                }
1344
            }
1345
            else {
1346
                *outl = 0;
1347
            }
1348
#else
1349
            /* No data to return - all handled in Update. */
1350
907
            *outl = 0;
1351
907
            if (ctx->enc) {
1352
499
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, ctx->authTag,
1353
499
                    (word32)ctx->authTagSz);
1354
499
            }
1355
408
            else {
1356
408
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, ctx->authTag,
1357
408
                    (word32)ctx->authTagSz);
1358
408
                if (ctx->authIncIv) {
1359
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1360
0
                }
1361
408
            }
1362
1363
907
            if (ret == 0)
1364
753
                ret = WOLFSSL_SUCCESS;
1365
154
            else
1366
154
                ret = WOLFSSL_FAILURE;
1367
1368
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
1369
907
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
1370
907
                              (byte*)ctx->cipher.aes.reg,
1371
907
                              (word32)ctx->ivSz) != 0)
1372
0
            {
1373
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
1374
0
                ret = WOLFSSL_FAILURE;
1375
0
            }
1376
907
#endif /* WOLFSSL_AESGCM_STREAM */
1377
907
            if (ret == WOLFSSL_SUCCESS) {
1378
753
                if (ctx->authIncIv) {
1379
0
                    ctx->authIncIv = 0;
1380
0
                }
1381
753
                else {
1382
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1383
753
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1384
753
                }
1385
753
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1386
0
                    ret = WOLFSSL_FAILURE;
1387
0
                }
1388
753
            }
1389
907
            break;
1390
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1391
        * HAVE_FIPS_VERSION >= 2 */
1392
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1393
0
    || FIPS_VERSION_GE(2,0))
1394
0
        case WC_AES_128_CCM_TYPE:
1395
0
        case WC_AES_192_CCM_TYPE:
1396
0
        case WC_AES_256_CCM_TYPE:
1397
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1398
0
             || (ctx->authBufferLen == 0)) {
1399
0
                if (ctx->enc) {
1400
0
                    ret = wc_AesCcmEncrypt(&ctx->cipher.aes, out,
1401
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1402
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1403
0
                        (word32)ctx->authTagSz, ctx->authIn,
1404
0
                        (word32)ctx->authInSz);
1405
0
                }
1406
0
                else {
1407
0
                    ret = wc_AesCcmDecrypt(&ctx->cipher.aes, out,
1408
0
                        ctx->authBuffer, (word32)ctx->authBufferLen,
1409
0
                        ctx->iv, (word32)ctx->ivSz, ctx->authTag,
1410
0
                        (word32)ctx->authTagSz, ctx->authIn,
1411
0
                        (word32)ctx->authInSz);
1412
0
                }
1413
1414
0
                if (ret == 0) {
1415
0
                    ret = WOLFSSL_SUCCESS;
1416
0
                    *outl = ctx->authBufferLen;
1417
0
                }
1418
0
                else {
1419
0
                    ret = WOLFSSL_FAILURE;
1420
0
                    *outl = 0;
1421
0
                }
1422
1423
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1424
0
                ctx->authBuffer = NULL;
1425
0
                ctx->authBufferLen = 0;
1426
1427
0
                if (ctx->authIncIv) {
1428
0
                    IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
1429
0
                    ctx->authIncIv = 0;
1430
0
                }
1431
0
            }
1432
0
            else {
1433
0
                *outl = 0;
1434
0
            }
1435
0
            if (ret == WOLFSSL_SUCCESS) {
1436
0
                if (ctx->authIncIv) {
1437
0
                    ctx->authIncIv = 0;
1438
0
                }
1439
0
                else {
1440
                    /* Clear IV, since IV reuse is not recommended
1441
                     * for AES CCM. */
1442
0
                    XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
1443
0
                }
1444
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1445
0
                    ret = WOLFSSL_FAILURE;
1446
0
                }
1447
0
            }
1448
0
            break;
1449
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1450
        * HAVE_FIPS_VERSION >= 2 */
1451
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1452
    || FIPS_VERSION_GE(2,0))
1453
        case WC_ARIA_128_GCM_TYPE:
1454
        case WC_ARIA_192_GCM_TYPE:
1455
        case WC_ARIA_256_GCM_TYPE:
1456
            if ((ctx->authBuffer && ctx->authBufferLen > 0)
1457
             || (ctx->authBufferLen == 0)) {
1458
                if (ctx->enc)
1459
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, out,
1460
                            ctx->authBuffer, ctx->authBufferLen,
1461
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1462
                            ctx->authTag, ctx->authTagSz);
1463
                else
1464
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, out,
1465
                            ctx->authBuffer, ctx->authBufferLen,
1466
                            ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
1467
                            ctx->authTag, ctx->authTagSz);
1468
1469
                if (ret == 0) {
1470
                    ret = WOLFSSL_SUCCESS;
1471
                    *outl = ctx->authBufferLen;
1472
                }
1473
                else {
1474
                    ret = WOLFSSL_FAILURE;
1475
                    *outl = 0;
1476
                }
1477
1478
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1479
                ctx->authBuffer = NULL;
1480
                ctx->authBufferLen = 0;
1481
1482
                if (ctx->authIncIv) {
1483
                    IncCtr((byte*)ctx->cipher.aria.nonce,
1484
                           ctx->cipher.aria.nonceSz);
1485
                    ctx->authIncIv = 0;
1486
                }
1487
            }
1488
            else {
1489
                *outl = 0;
1490
            }
1491
            if (ret == WOLFSSL_SUCCESS) {
1492
                if (ctx->authIncIv) {
1493
                    ctx->authIncIv = 0;
1494
                }
1495
                else {
1496
                    /* Clear IV, since IV reuse is not recommended for AES GCM. */
1497
                    XMEMSET(ctx->iv, 0, ARIA_BLOCK_SIZE);
1498
                }
1499
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1500
                    ret = WOLFSSL_FAILURE;
1501
                }
1502
            }
1503
            break;
1504
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
1505
        * HAVE_FIPS_VERSION >= 2 */
1506
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
1507
0
        case WC_CHACHA20_POLY1305_TYPE:
1508
0
            if (wc_ChaCha20Poly1305_Final(&ctx->cipher.chachaPoly,
1509
0
                                          ctx->authTag) != 0) {
1510
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Final failed");
1511
0
                return WOLFSSL_FAILURE;
1512
0
            }
1513
0
            else {
1514
0
                *outl = 0;
1515
0
                return WOLFSSL_SUCCESS;
1516
0
            }
1517
0
            break;
1518
0
#endif
1519
0
#ifdef WOLFSSL_SM4_GCM
1520
0
        case WC_SM4_GCM_TYPE:
1521
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1522
0
                     (ctx->authBufferLen == 0)) {
1523
0
                if (ctx->enc)
1524
0
                    ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, out,
1525
0
                            ctx->authBuffer, ctx->authBufferLen,
1526
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1527
0
                            ctx->authIn, ctx->authInSz);
1528
0
                else
1529
0
                    ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, out,
1530
0
                            ctx->authBuffer, ctx->authBufferLen,
1531
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1532
0
                            ctx->authIn, ctx->authInSz);
1533
1534
0
                if (ret == 0) {
1535
0
                    ret = WOLFSSL_SUCCESS;
1536
0
                    *outl = ctx->authBufferLen;
1537
0
                }
1538
0
                else {
1539
0
                    ret = WOLFSSL_FAILURE;
1540
0
                    *outl = 0;
1541
0
                }
1542
1543
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1544
0
                ctx->authBuffer = NULL;
1545
0
                ctx->authBufferLen = 0;
1546
1547
0
                if (ctx->authIncIv) {
1548
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1549
0
                    ctx->authIncIv = 0;
1550
0
                }
1551
0
            }
1552
0
            else {
1553
0
                *outl = 0;
1554
0
            }
1555
0
            if (ret == WOLFSSL_SUCCESS) {
1556
0
                if (ctx->authIncIv) {
1557
0
                    ctx->authIncIv = 0;
1558
0
                }
1559
0
                else {
1560
                    /* Clear IV, since IV reuse is not recommended for SM4 GCM.
1561
                     */
1562
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1563
0
                }
1564
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1565
0
                    ret = WOLFSSL_FAILURE;
1566
0
                }
1567
0
            }
1568
0
            break;
1569
0
#endif
1570
0
#ifdef WOLFSSL_SM4_CCM
1571
0
        case WC_SM4_CCM_TYPE:
1572
0
            if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
1573
0
                    (ctx->authBufferLen == 0)) {
1574
0
                if (ctx->enc)
1575
0
                    ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, out,
1576
0
                            ctx->authBuffer, ctx->authBufferLen,
1577
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1578
0
                            ctx->authIn, ctx->authInSz);
1579
0
                else
1580
0
                    ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, out,
1581
0
                            ctx->authBuffer, ctx->authBufferLen,
1582
0
                            ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
1583
0
                            ctx->authIn, ctx->authInSz);
1584
1585
0
                if (ret == 0) {
1586
0
                    ret = WOLFSSL_SUCCESS;
1587
0
                    *outl = ctx->authBufferLen;
1588
0
                }
1589
0
                else {
1590
0
                    ret = WOLFSSL_FAILURE;
1591
0
                    *outl = 0;
1592
0
                }
1593
1594
0
                XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
1595
0
                ctx->authBuffer = NULL;
1596
0
                ctx->authBufferLen = 0;
1597
1598
0
                if (ctx->authIncIv) {
1599
0
                    IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
1600
0
                    ctx->authIncIv = 0;
1601
0
                }
1602
0
            }
1603
0
            else {
1604
0
                *outl = 0;
1605
0
            }
1606
0
            if (ret == WOLFSSL_SUCCESS) {
1607
0
                if (ctx->authIncIv) {
1608
0
                    ctx->authIncIv = 0;
1609
0
                }
1610
0
                else {
1611
                    /* Clear IV, since IV reuse is not recommended
1612
                     * for SM4 CCM. */
1613
0
                    XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
1614
0
                }
1615
0
                if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
1616
0
                    ret = WOLFSSL_FAILURE;
1617
0
                }
1618
0
            }
1619
0
            break;
1620
0
#endif
1621
3.24k
        default:
1622
3.24k
            if (!out)
1623
0
                return WOLFSSL_FAILURE;
1624
1625
3.24k
            if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) {
1626
540
                if (ctx->bufUsed != 0) return WOLFSSL_FAILURE;
1627
441
                *outl = 0;
1628
441
            }
1629
2.70k
            else if (ctx->enc) {
1630
1.20k
                if (ctx->block_size == 1) {
1631
959
                    *outl = 0;
1632
959
                }
1633
245
                else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) {
1634
245
                    padBlock(ctx);
1635
245
                    PRINT_BUF(ctx->buf, ctx->block_size);
1636
245
                    if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) {
1637
0
                        WOLFSSL_MSG("Final Cipher Block failed");
1638
0
                        ret = WOLFSSL_FAILURE;
1639
0
                    }
1640
245
                    else {
1641
245
                        PRINT_BUF(out, ctx->block_size);
1642
245
                        *outl = ctx->block_size;
1643
245
                    }
1644
245
                }
1645
1.20k
            }
1646
1.50k
            else {
1647
1.50k
                if (ctx->block_size == 1) {
1648
1.08k
                    *outl = 0;
1649
1.08k
                }
1650
417
                else if ((ctx->bufUsed % ctx->block_size) != 0) {
1651
16
                    *outl = 0;
1652
                    /* not enough padding for decrypt */
1653
16
                    WOLFSSL_MSG("Final Cipher Block not enough padding");
1654
16
                    ret = WOLFSSL_FAILURE;
1655
16
                }
1656
401
                else if (ctx->lastUsed) {
1657
391
                    int fl;
1658
391
                    PRINT_BUF(ctx->lastBlock, ctx->block_size);
1659
391
                    if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) {
1660
340
                        XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1661
340
                        *outl = fl;
1662
340
                        if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1663
                            /* return error in cases where the block length is
1664
                             * incorrect */
1665
0
                            WOLFSSL_MSG("Final Cipher Block bad length");
1666
0
                            ret = WOLFSSL_FAILURE;
1667
0
                        }
1668
340
                    }
1669
51
                    else {
1670
51
                        ret = WOLFSSL_FAILURE;
1671
51
                    }
1672
391
                }
1673
10
                else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1674
                    /* return error in cases where the block length is
1675
                     * incorrect */
1676
10
                    ret = WOLFSSL_FAILURE;
1677
10
                }
1678
1.50k
            }
1679
3.14k
            break;
1680
4.15k
    }
1681
1682
4.05k
    if (ret == WOLFSSL_SUCCESS) {
1683
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1684
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1685
3.82k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
1686
3.82k
            || FIPS_VERSION_GE(2,0))
1687
3.82k
        byte tmp = 0;
1688
1689
        /*
1690
         * This flag needs to retain its value between wolfSSL_EVP_CipherFinal
1691
         * calls. wolfSSL_EVP_CipherInit will clear it, so we save and restore
1692
         * it here.
1693
         */
1694
3.82k
        if (FALSE
1695
3.82k
        #ifdef HAVE_AESGCM
1696
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1697
3.51k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1698
3.48k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1699
3.06k
        #endif
1700
3.06k
        #ifdef HAVE_AESCCM
1701
3.06k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1702
3.06k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1703
3.06k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1704
3.06k
        #endif
1705
3.06k
        #ifdef WOLFSSL_SM4_GCM
1706
3.06k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1707
3.06k
        #endif
1708
3.06k
        #ifdef WOLFSSL_SM4_CCM
1709
3.06k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1710
3.82k
        #endif
1711
3.82k
            ) {
1712
753
            tmp = ctx->authIvGenEnable;
1713
753
        }
1714
3.82k
#endif
1715
1716
        /* reset cipher state after final */
1717
3.82k
        ret = wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1);
1718
1719
3.82k
#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
1720
3.82k
     defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
1721
3.82k
    ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
1722
3.82k
        if (FALSE
1723
3.82k
        #ifdef HAVE_AESGCM
1724
3.82k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
1725
3.51k
            ctx->cipherType == WC_AES_192_GCM_TYPE ||
1726
3.48k
            ctx->cipherType == WC_AES_256_GCM_TYPE
1727
3.06k
        #endif
1728
3.06k
        #ifdef HAVE_AESCCM
1729
3.06k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
1730
3.06k
            ctx->cipherType == WC_AES_192_CCM_TYPE ||
1731
3.06k
            ctx->cipherType == WC_AES_256_CCM_TYPE
1732
3.06k
        #endif
1733
3.06k
        #ifdef WOLFSSL_SM4_GCM
1734
3.06k
            || ctx->cipherType == WC_SM4_GCM_TYPE
1735
3.06k
        #endif
1736
3.06k
        #ifdef WOLFSSL_SM4_CCM
1737
3.06k
            || ctx->cipherType == WC_SM4_CCM_TYPE
1738
3.82k
        #endif
1739
3.82k
            ) {
1740
753
            ctx->authIvGenEnable = (tmp == 1);
1741
753
        }
1742
3.82k
#endif
1743
3.82k
    }
1744
1745
4.05k
    return ret;
1746
4.15k
}
1747
1748
1749
#ifdef WOLFSSL_EVP_DECRYPT_LEGACY
1750
/* This is a version of DecryptFinal to work with data encrypted with
1751
 * wolfSSL_EVP_EncryptFinal() with the broken padding. (pre-v3.12.0)
1752
 * Only call this after wolfSSL_EVP_CipherFinal() fails on a decrypt.
1753
 * Note, you don't know if the padding is good or bad with the old
1754
 * encrypt, but it is likely to be or bad. It will update the output
1755
 * length with the block_size so the last block is still captured. */
1756
int  wolfSSL_EVP_DecryptFinal_legacy(WOLFSSL_EVP_CIPHER_CTX *ctx,
1757
        unsigned char *out, int *outl)
1758
{
1759
    int fl;
1760
    if (ctx == NULL || out == NULL || outl == NULL)
1761
        return WOLFSSL_FAILURE;
1762
1763
    WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_legacy");
1764
    if (ctx->block_size == 1) {
1765
        *outl = 0;
1766
        return WOLFSSL_SUCCESS;
1767
    }
1768
    if ((ctx->bufUsed % ctx->block_size) != 0) {
1769
        *outl = 0;
1770
        /* not enough padding for decrypt */
1771
        return WOLFSSL_FAILURE;
1772
    }
1773
    /* The original behavior of CipherFinal() was like it is now,
1774
     * but checkPad would return 0 in case of a bad pad. It would
1775
     * treat the pad as 0, and leave the data in the output buffer,
1776
     * and not try to copy anything. This converts checkPad's -1 error
1777
     * code to block_size.
1778
     */
1779
    if (ctx->lastUsed) {
1780
        PRINT_BUF(ctx->lastBlock, ctx->block_size);
1781
        if ((fl = checkPad(ctx, ctx->lastBlock)) < 0) {
1782
            fl = ctx->block_size;
1783
        }
1784
        else {
1785
            XMEMCPY(out, ctx->lastBlock, (size_t)fl);
1786
        }
1787
        *outl = fl;
1788
    }
1789
    /* return error in cases where the block length is incorrect */
1790
    if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
1791
        return WOLFSSL_FAILURE;
1792
    }
1793
1794
    return WOLFSSL_SUCCESS;
1795
}
1796
#endif
1797
1798
int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx)
1799
245
{
1800
245
    if (ctx == NULL) return WOLFSSL_FAILURE;
1801
245
    switch (ctx->cipherType) {
1802
0
#if !defined(NO_AES) || !defined(NO_DES3) || defined(WOLFSSL_SM4)
1803
0
#if !defined(NO_AES)
1804
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1805
153
    case WC_AES_128_CBC_TYPE:
1806
216
    case WC_AES_192_CBC_TYPE:
1807
245
    case WC_AES_256_CBC_TYPE:
1808
245
#endif
1809
245
#if defined(HAVE_AESGCM)
1810
245
    case WC_AES_128_GCM_TYPE:
1811
245
    case WC_AES_192_GCM_TYPE:
1812
245
    case WC_AES_256_GCM_TYPE:
1813
245
#endif
1814
245
#if defined(HAVE_AESCCM)
1815
245
    case WC_AES_128_CCM_TYPE:
1816
245
    case WC_AES_192_CCM_TYPE:
1817
245
    case WC_AES_256_CCM_TYPE:
1818
245
#endif
1819
245
#if defined(WOLFSSL_AES_COUNTER)
1820
245
    case WC_AES_128_CTR_TYPE:
1821
245
    case WC_AES_192_CTR_TYPE:
1822
245
    case WC_AES_256_CTR_TYPE:
1823
245
#endif
1824
245
#if defined(WOLFSSL_AES_CFB)
1825
245
    case WC_AES_128_CFB1_TYPE:
1826
245
    case WC_AES_192_CFB1_TYPE:
1827
245
    case WC_AES_256_CFB1_TYPE:
1828
245
    case WC_AES_128_CFB8_TYPE:
1829
245
    case WC_AES_192_CFB8_TYPE:
1830
245
    case WC_AES_256_CFB8_TYPE:
1831
245
    case WC_AES_128_CFB128_TYPE:
1832
245
    case WC_AES_192_CFB128_TYPE:
1833
245
    case WC_AES_256_CFB128_TYPE:
1834
245
#endif
1835
245
#if defined(WOLFSSL_AES_OFB)
1836
245
    case WC_AES_128_OFB_TYPE:
1837
245
    case WC_AES_192_OFB_TYPE:
1838
245
    case WC_AES_256_OFB_TYPE:
1839
245
#endif
1840
245
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1841
245
    case WC_AES_128_XTS_TYPE:
1842
245
    case WC_AES_256_XTS_TYPE:
1843
245
#endif
1844
#if defined(HAVE_ARIA)
1845
    case WC_ARIA_128_GCM_TYPE:
1846
    case WC_ARIA_192_GCM_TYPE:
1847
    case WC_ARIA_256_GCM_TYPE:
1848
#endif
1849
1850
245
    case WC_AES_128_ECB_TYPE:
1851
245
    case WC_AES_192_ECB_TYPE:
1852
245
    case WC_AES_256_ECB_TYPE:
1853
245
#endif /* !NO_AES */
1854
245
#ifndef NO_DES3
1855
245
    case WC_DES_CBC_TYPE:
1856
245
    case WC_DES_ECB_TYPE:
1857
245
    case WC_DES_EDE3_CBC_TYPE:
1858
245
    case WC_DES_EDE3_ECB_TYPE:
1859
245
#endif
1860
245
#ifdef WOLFSSL_SM4_ECB
1861
245
    case WC_SM4_ECB_TYPE:
1862
245
#endif
1863
245
#ifdef WOLFSSL_SM4_CBC
1864
245
    case WC_SM4_CBC_TYPE:
1865
245
#endif
1866
245
#ifdef WOLFSSL_SM4_CTR
1867
245
    case WC_SM4_CTR_TYPE:
1868
245
#endif
1869
245
#ifdef WOLFSSL_SM4_GCM
1870
245
    case WC_SM4_GCM_TYPE:
1871
245
#endif
1872
245
#ifdef WOLFSSL_SM4_CCM
1873
245
    case WC_SM4_CCM_TYPE:
1874
245
#endif
1875
245
        return ctx->block_size;
1876
0
#endif /* !NO_AES || !NO_DES3 || WOLFSSL_SM4 */
1877
0
    default:
1878
0
        return 0;
1879
245
    }
1880
245
}
1881
1882
static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher)
1883
36.9k
{
1884
36.9k
    if (cipher == NULL) return 0; /* dummy for #ifdef */
1885
36.9k
#ifndef NO_DES3
1886
36.9k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_CBC))
1887
1.26k
        return WC_DES_CBC_TYPE;
1888
35.6k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_CBC))
1889
921
        return WC_DES_EDE3_CBC_TYPE;
1890
34.7k
#if !defined(NO_DES3)
1891
34.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_ECB))
1892
5.72k
        return WC_DES_ECB_TYPE;
1893
29.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_ECB))
1894
0
        return WC_DES_EDE3_ECB_TYPE;
1895
29.0k
#endif /* NO_DES3 && HAVE_AES_ECB */
1896
29.0k
#endif
1897
29.0k
#if !defined(NO_AES)
1898
29.0k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
1899
29.0k
    #ifdef WOLFSSL_AES_128
1900
29.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CBC))
1901
669
        return WC_AES_128_CBC_TYPE;
1902
28.3k
    #endif
1903
28.3k
    #ifdef WOLFSSL_AES_192
1904
28.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CBC))
1905
556
        return WC_AES_192_CBC_TYPE;
1906
27.8k
    #endif
1907
27.8k
    #ifdef WOLFSSL_AES_256
1908
27.8k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CBC))
1909
531
        return WC_AES_256_CBC_TYPE;
1910
27.2k
    #endif
1911
27.2k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
1912
27.2k
#if defined(HAVE_AESGCM)
1913
27.2k
    #ifdef WOLFSSL_AES_128
1914
27.2k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_GCM))
1915
4.91k
        return WC_AES_128_GCM_TYPE;
1916
22.3k
    #endif
1917
22.3k
    #ifdef WOLFSSL_AES_192
1918
22.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_GCM))
1919
941
        return WC_AES_192_GCM_TYPE;
1920
21.4k
    #endif
1921
21.4k
    #ifdef WOLFSSL_AES_256
1922
21.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_GCM))
1923
4.63k
        return WC_AES_256_GCM_TYPE;
1924
16.7k
    #endif
1925
16.7k
#endif /* HAVE_AESGCM */
1926
16.7k
#if defined(HAVE_AESCCM)
1927
16.7k
    #ifdef WOLFSSL_AES_128
1928
16.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CCM))
1929
0
        return WC_AES_128_CCM_TYPE;
1930
16.7k
    #endif
1931
16.7k
    #ifdef WOLFSSL_AES_192
1932
16.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CCM))
1933
0
        return WC_AES_192_CCM_TYPE;
1934
16.7k
    #endif
1935
16.7k
    #ifdef WOLFSSL_AES_256
1936
16.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CCM))
1937
0
        return WC_AES_256_CCM_TYPE;
1938
16.7k
    #endif
1939
16.7k
#endif /* HAVE_AESCCM */
1940
16.7k
#if defined(WOLFSSL_AES_COUNTER)
1941
16.7k
    #ifdef WOLFSSL_AES_128
1942
16.7k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CTR))
1943
473
        return WC_AES_128_CTR_TYPE;
1944
16.3k
    #endif
1945
16.3k
    #ifdef WOLFSSL_AES_192
1946
16.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CTR))
1947
3.13k
        return WC_AES_192_CTR_TYPE;
1948
13.1k
    #endif
1949
13.1k
    #ifdef WOLFSSL_AES_256
1950
13.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CTR))
1951
330
        return WC_AES_256_CTR_TYPE;
1952
12.8k
    #endif
1953
12.8k
#endif /* HAVE_AES_CBC */
1954
12.8k
#if defined(HAVE_AES_ECB)
1955
12.8k
    #ifdef WOLFSSL_AES_128
1956
12.8k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_ECB))
1957
440
        return WC_AES_128_ECB_TYPE;
1958
12.4k
    #endif
1959
12.4k
    #ifdef WOLFSSL_AES_192
1960
12.4k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_ECB))
1961
242
        return WC_AES_192_ECB_TYPE;
1962
12.1k
    #endif
1963
12.1k
    #ifdef WOLFSSL_AES_256
1964
12.1k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_ECB))
1965
668
        return WC_AES_256_ECB_TYPE;
1966
11.5k
    #endif
1967
11.5k
#endif /*HAVE_AES_CBC */
1968
11.5k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
1969
11.5k
    #ifdef WOLFSSL_AES_128
1970
11.5k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_XTS))
1971
1.16k
        return WC_AES_128_XTS_TYPE;
1972
10.3k
    #endif
1973
10.3k
    #ifdef WOLFSSL_AES_256
1974
10.3k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_XTS))
1975
266
        return WC_AES_256_XTS_TYPE;
1976
10.0k
    #endif
1977
10.0k
#endif /* WOLFSSL_AES_XTS */
1978
10.0k
#if defined(WOLFSSL_AES_CFB)
1979
10.0k
#ifndef WOLFSSL_NO_AES_CFB_1_8
1980
10.0k
    #ifdef WOLFSSL_AES_128
1981
10.0k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB1))
1982
601
        return WC_AES_128_CFB1_TYPE;
1983
9.47k
    #endif
1984
9.47k
    #ifdef WOLFSSL_AES_192
1985
9.47k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB1))
1986
423
        return WC_AES_192_CFB1_TYPE;
1987
9.05k
    #endif
1988
9.05k
    #ifdef WOLFSSL_AES_256
1989
9.05k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB1))
1990
1.47k
        return WC_AES_256_CFB1_TYPE;
1991
7.58k
    #endif
1992
7.58k
    #ifdef WOLFSSL_AES_128
1993
7.58k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB8))
1994
1.32k
        return WC_AES_128_CFB8_TYPE;
1995
6.25k
    #endif
1996
6.25k
    #ifdef WOLFSSL_AES_192
1997
6.25k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB8))
1998
549
        return WC_AES_192_CFB8_TYPE;
1999
5.70k
    #endif
2000
5.70k
    #ifdef WOLFSSL_AES_256
2001
5.70k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB8))
2002
263
        return WC_AES_256_CFB8_TYPE;
2003
5.44k
    #endif
2004
5.44k
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
2005
5.44k
    #ifdef WOLFSSL_AES_128
2006
5.44k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB128))
2007
0
        return WC_AES_128_CFB128_TYPE;
2008
5.44k
    #endif
2009
5.44k
    #ifdef WOLFSSL_AES_192
2010
5.44k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB128))
2011
0
        return WC_AES_192_CFB128_TYPE;
2012
5.44k
    #endif
2013
5.44k
    #ifdef WOLFSSL_AES_256
2014
5.44k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB128))
2015
0
        return WC_AES_256_CFB128_TYPE;
2016
5.44k
    #endif
2017
5.44k
#endif /*HAVE_AES_CBC */
2018
5.44k
#if defined(WOLFSSL_AES_OFB)
2019
5.44k
    #ifdef WOLFSSL_AES_128
2020
5.44k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_OFB))
2021
1.60k
      return WC_AES_128_OFB_TYPE;
2022
3.84k
    #endif
2023
3.84k
    #ifdef WOLFSSL_AES_192
2024
3.84k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_OFB))
2025
1.21k
      return WC_AES_192_OFB_TYPE;
2026
2.62k
    #endif
2027
2.62k
    #ifdef WOLFSSL_AES_256
2028
2.62k
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_OFB))
2029
2.25k
      return WC_AES_256_OFB_TYPE;
2030
377
    #endif
2031
377
#endif
2032
377
#endif /* !NO_AES */
2033
#if defined(HAVE_ARIA)
2034
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_128_GCM))
2035
        return WC_ARIA_128_GCM_TYPE;
2036
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_192_GCM))
2037
        return WC_ARIA_192_GCM_TYPE;
2038
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_256_GCM))
2039
        return WC_ARIA_256_GCM_TYPE;
2040
#endif /* HAVE_ARIA */
2041
2042
377
#ifndef NO_RC4
2043
377
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARC4))
2044
377
      return WC_ARC4_TYPE;
2045
0
#endif
2046
2047
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2048
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20_POLY1305))
2049
0
        return WC_CHACHA20_POLY1305_TYPE;
2050
0
#endif
2051
2052
0
#ifdef HAVE_CHACHA
2053
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20))
2054
0
        return WC_CHACHA20_TYPE;
2055
0
#endif
2056
2057
0
#ifdef WOLFSSL_SM4_ECB
2058
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_ECB))
2059
0
        return WC_SM4_ECB_TYPE;
2060
0
#endif
2061
0
#ifdef WOLFSSL_SM4_CBC
2062
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CBC))
2063
0
        return WC_SM4_CBC_TYPE;
2064
0
#endif
2065
0
#ifdef WOLFSSL_SM4_CTR
2066
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CTR))
2067
0
        return WC_SM4_CTR_TYPE;
2068
0
#endif
2069
0
#ifdef WOLFSSL_SM4_GCM
2070
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_GCM))
2071
0
        return WC_SM4_GCM_TYPE;
2072
0
#endif
2073
0
#ifdef WOLFSSL_SM4_CCM
2074
0
    else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CCM))
2075
0
        return WC_SM4_CCM_TYPE;
2076
0
#endif
2077
2078
0
      else return 0;
2079
36.9k
}
2080
2081
/* Getter function for cipher type string
2082
 *
2083
 * cipherType  cipherType enum value to get string for
2084
 *
2085
 * Returns string representation of the cipher type or NULL if not found
2086
 */
2087
const char* wolfSSL_EVP_CIPHER_type_string(unsigned int cipherType)
2088
0
{
2089
0
    WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_type_string");
2090
2091
0
    switch (cipherType) {
2092
0
#ifndef NO_DES3
2093
0
        case WC_DES_CBC_TYPE:           return EVP_DES_CBC;
2094
0
        case WC_DES_EDE3_CBC_TYPE:      return EVP_DES_EDE3_CBC;
2095
0
        case WC_DES_ECB_TYPE:           return EVP_DES_ECB;
2096
0
        case WC_DES_EDE3_ECB_TYPE:      return EVP_DES_EDE3_ECB;
2097
0
#endif
2098
0
#if !defined(NO_AES)
2099
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2100
0
        #ifdef WOLFSSL_AES_128
2101
0
        case WC_AES_128_CBC_TYPE:       return EVP_AES_128_CBC;
2102
0
        #endif
2103
0
        #ifdef WOLFSSL_AES_192
2104
0
        case WC_AES_192_CBC_TYPE:       return EVP_AES_192_CBC;
2105
0
        #endif
2106
0
        #ifdef WOLFSSL_AES_256
2107
0
        case WC_AES_256_CBC_TYPE:       return EVP_AES_256_CBC;
2108
0
        #endif
2109
0
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
2110
0
    #if defined(WOLFSSL_AES_CFB)
2111
0
        #ifndef WOLFSSL_NO_AES_CFB_1_8
2112
0
            #ifdef WOLFSSL_AES_128
2113
0
            case WC_AES_128_CFB1_TYPE:      return EVP_AES_128_CFB1;
2114
0
            #endif
2115
0
            #ifdef WOLFSSL_AES_192
2116
0
            case WC_AES_192_CFB1_TYPE:      return EVP_AES_192_CFB1;
2117
0
            #endif
2118
0
            #ifdef WOLFSSL_AES_256
2119
0
            case WC_AES_256_CFB1_TYPE:      return EVP_AES_256_CFB1;
2120
0
            #endif
2121
0
            #ifdef WOLFSSL_AES_128
2122
0
            case WC_AES_128_CFB8_TYPE:      return EVP_AES_128_CFB8;
2123
0
            #endif
2124
0
            #ifdef WOLFSSL_AES_192
2125
0
            case WC_AES_192_CFB8_TYPE:      return EVP_AES_192_CFB8;
2126
0
            #endif
2127
0
            #ifdef WOLFSSL_AES_256
2128
0
            case WC_AES_256_CFB8_TYPE:      return EVP_AES_256_CFB8;
2129
0
            #endif
2130
0
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
2131
0
        #ifdef WOLFSSL_AES_128
2132
0
        case WC_AES_128_CFB128_TYPE:    return EVP_AES_128_CFB128;
2133
0
        #endif
2134
0
        #ifdef WOLFSSL_AES_192
2135
0
        case WC_AES_192_CFB128_TYPE:    return EVP_AES_192_CFB128;
2136
0
        #endif
2137
0
        #ifdef WOLFSSL_AES_256
2138
0
        case WC_AES_256_CFB128_TYPE:    return EVP_AES_256_CFB128;
2139
0
        #endif
2140
0
    #endif /* WOLFSSL_AES_CFB */
2141
0
    #if defined(WOLFSSL_AES_OFB)
2142
0
        #ifdef WOLFSSL_AES_128
2143
0
        case WC_AES_128_OFB_TYPE:       return EVP_AES_128_OFB;
2144
0
        #endif
2145
0
        #ifdef WOLFSSL_AES_192
2146
0
        case WC_AES_192_OFB_TYPE:       return EVP_AES_192_OFB;
2147
0
        #endif
2148
0
        #ifdef WOLFSSL_AES_256
2149
0
        case WC_AES_256_OFB_TYPE:       return EVP_AES_256_OFB;
2150
0
        #endif
2151
0
    #endif /* WOLFSSL_AES_OFB */
2152
0
    #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2153
0
        #ifdef WOLFSSL_AES_128
2154
0
        case WC_AES_128_XTS_TYPE:       return EVP_AES_128_XTS;
2155
0
        #endif
2156
0
        #ifdef WOLFSSL_AES_256
2157
0
        case WC_AES_256_XTS_TYPE:       return EVP_AES_256_XTS;
2158
0
        #endif
2159
0
    #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
2160
0
    #if defined(HAVE_AESGCM)
2161
0
        #ifdef WOLFSSL_AES_128
2162
0
        case WC_AES_128_GCM_TYPE:       return EVP_AES_128_GCM;
2163
0
        #endif
2164
0
        #ifdef WOLFSSL_AES_192
2165
0
        case WC_AES_192_GCM_TYPE:       return EVP_AES_192_GCM;
2166
0
        #endif
2167
0
        #ifdef WOLFSSL_AES_256
2168
0
        case WC_AES_256_GCM_TYPE:       return EVP_AES_256_GCM;
2169
0
        #endif
2170
0
    #endif /* HAVE_AESGCM */
2171
0
    #if defined(HAVE_AESCCM)
2172
0
        #ifdef WOLFSSL_AES_128
2173
0
        case WC_AES_128_CCM_TYPE:       return EVP_AES_128_CCM;
2174
0
        #endif
2175
0
        #ifdef WOLFSSL_AES_192
2176
0
        case WC_AES_192_CCM_TYPE:       return EVP_AES_192_CCM;
2177
0
        #endif
2178
0
        #ifdef WOLFSSL_AES_256
2179
0
        case WC_AES_256_CCM_TYPE:       return EVP_AES_256_CCM;
2180
0
        #endif
2181
0
    #endif /* HAVE_AESCCM */
2182
0
    #if defined(WOLFSSL_AES_COUNTER)
2183
0
        #ifdef WOLFSSL_AES_128
2184
0
        case WC_AES_128_CTR_TYPE:       return EVP_AES_128_CTR;
2185
0
        #endif
2186
0
        #ifdef WOLFSSL_AES_192
2187
0
        case WC_AES_192_CTR_TYPE:       return EVP_AES_192_CTR;
2188
0
        #endif
2189
0
        #ifdef WOLFSSL_AES_256
2190
0
        case WC_AES_256_CTR_TYPE:       return EVP_AES_256_CTR;
2191
0
        #endif
2192
0
    #endif /* WOLFSSL_AES_COUNTER */
2193
0
    #if defined(HAVE_AES_ECB)
2194
0
        #ifdef WOLFSSL_AES_128
2195
0
        case WC_AES_128_ECB_TYPE:       return EVP_AES_128_ECB;
2196
0
        #endif
2197
0
        #ifdef WOLFSSL_AES_192
2198
0
        case WC_AES_192_ECB_TYPE:       return EVP_AES_192_ECB;
2199
0
        #endif
2200
0
        #ifdef WOLFSSL_AES_256
2201
0
        case WC_AES_256_ECB_TYPE:       return EVP_AES_256_ECB;
2202
0
        #endif
2203
0
    #endif /* HAVE_AES_ECB */
2204
0
#endif /* !NO_AES */
2205
#if defined(HAVE_ARIA)
2206
        case WC_ARIA_128_GCM_TYPE:      return EVP_ARIA_128_GCM;
2207
        case WC_ARIA_192_GCM_TYPE:      return EVP_ARIA_192_GCM;
2208
        case WC_ARIA_256_GCM_TYPE:      return EVP_ARIA_256_GCM;
2209
#endif /* HAVE_ARIA */
2210
0
#ifndef NO_RC4
2211
0
        case WC_ARC4_TYPE:              return EVP_ARC4;
2212
0
#endif
2213
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2214
0
        case WC_CHACHA20_POLY1305_TYPE: return EVP_CHACHA20_POLY1305;
2215
0
#endif
2216
0
#ifdef HAVE_CHACHA
2217
0
        case WC_CHACHA20_TYPE:          return EVP_CHACHA20;
2218
0
#endif
2219
0
#ifdef WOLFSSL_SM4_ECB
2220
0
        case WC_SM4_ECB_TYPE:           return EVP_SM4_ECB;
2221
0
#endif
2222
0
#ifdef WOLFSSL_SM4_CBC
2223
0
        case WC_SM4_CBC_TYPE:           return EVP_SM4_CBC;
2224
0
#endif
2225
0
#ifdef WOLFSSL_SM4_CTR
2226
0
        case WC_SM4_CTR_TYPE:           return EVP_SM4_CTR;
2227
0
#endif
2228
0
#ifdef WOLFSSL_SM4_GCM
2229
0
        case WC_SM4_GCM_TYPE:           return EVP_SM4_GCM;
2230
0
#endif
2231
0
#ifdef WOLFSSL_SM4_CCM
2232
0
        case WC_SM4_CCM_TYPE:           return EVP_SM4_CCM;
2233
0
#endif
2234
0
        case WC_NULL_CIPHER_TYPE:       return EVP_NULL;
2235
0
        default:
2236
0
            return NULL;
2237
0
    }
2238
0
}
2239
2240
int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher)
2241
30.8k
{
2242
30.8k
    if (cipher == NULL)
2243
0
        return WOLFSSL_FAILURE;
2244
2245
30.8k
    switch (cipherType(cipher)) {
2246
0
#if !defined(NO_AES)
2247
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2248
362
        case WC_AES_128_CBC_TYPE:
2249
774
        case WC_AES_192_CBC_TYPE:
2250
1.16k
        case WC_AES_256_CBC_TYPE:
2251
1.16k
            return WC_AES_BLOCK_SIZE;
2252
0
    #endif
2253
0
    #if defined(HAVE_AESGCM)
2254
3.97k
        case WC_AES_128_GCM_TYPE:
2255
4.73k
        case WC_AES_192_GCM_TYPE:
2256
8.45k
        case WC_AES_256_GCM_TYPE:
2257
8.45k
            return 1;
2258
0
    #endif
2259
0
    #if defined(HAVE_AESCCM)
2260
0
        case WC_AES_128_CCM_TYPE:
2261
0
        case WC_AES_192_CCM_TYPE:
2262
0
        case WC_AES_256_CCM_TYPE:
2263
0
            return 1;
2264
0
    #endif
2265
0
    #if defined(WOLFSSL_AES_COUNTER)
2266
412
        case WC_AES_128_CTR_TYPE:
2267
3.12k
        case WC_AES_192_CTR_TYPE:
2268
3.40k
        case WC_AES_256_CTR_TYPE:
2269
3.40k
            return 1;
2270
0
    #endif
2271
0
    #if defined(HAVE_AES_ECB)
2272
398
        case WC_AES_128_ECB_TYPE:
2273
590
        case WC_AES_192_ECB_TYPE:
2274
1.20k
        case WC_AES_256_ECB_TYPE:
2275
1.20k
            return WC_AES_BLOCK_SIZE;
2276
0
    #endif
2277
0
    #if defined(WOLFSSL_AES_CFB)
2278
458
        case WC_AES_128_CFB1_TYPE:
2279
836
        case WC_AES_192_CFB1_TYPE:
2280
2.14k
        case WC_AES_256_CFB1_TYPE:
2281
3.30k
        case WC_AES_128_CFB8_TYPE:
2282
3.74k
        case WC_AES_192_CFB8_TYPE:
2283
3.87k
        case WC_AES_256_CFB8_TYPE:
2284
3.87k
        case WC_AES_128_CFB128_TYPE:
2285
3.87k
        case WC_AES_192_CFB128_TYPE:
2286
3.87k
        case WC_AES_256_CFB128_TYPE:
2287
3.87k
            return 1;
2288
0
    #endif
2289
0
    #if defined(WOLFSSL_AES_OFB)
2290
1.38k
        case WC_AES_128_OFB_TYPE:
2291
2.47k
        case WC_AES_192_OFB_TYPE:
2292
4.46k
        case WC_AES_256_OFB_TYPE:
2293
4.46k
            return 1;
2294
0
    #endif
2295
0
    #if defined(WOLFSSL_AES_XTS) && \
2296
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2297
732
        case WC_AES_128_XTS_TYPE:
2298
901
        case WC_AES_256_XTS_TYPE:
2299
901
            return 1;
2300
0
    #endif
2301
0
  #endif /* NO_AES */
2302
2303
0
  #ifndef NO_RC4
2304
311
        case WC_ARC4_TYPE:
2305
311
            return 1;
2306
0
  #endif
2307
#if defined(HAVE_ARIA)
2308
    case WC_ARIA_128_GCM_TYPE:
2309
    case WC_ARIA_192_GCM_TYPE:
2310
    case WC_ARIA_256_GCM_TYPE:
2311
        return 1;
2312
#endif
2313
2314
0
#ifndef NO_DES3
2315
1.05k
        case WC_DES_CBC_TYPE: return 8;
2316
701
        case WC_DES_EDE3_CBC_TYPE: return 8;
2317
5.29k
        case WC_DES_ECB_TYPE: return 8;
2318
0
        case WC_DES_EDE3_ECB_TYPE: return 8;
2319
0
#endif
2320
2321
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2322
0
        case WC_CHACHA20_POLY1305_TYPE:
2323
0
            return 1;
2324
0
#endif
2325
2326
0
#ifdef HAVE_CHACHA
2327
0
        case WC_CHACHA20_TYPE:
2328
0
            return 1;
2329
0
#endif
2330
2331
0
#ifdef WOLFSSL_SM4_ECB
2332
0
       case WC_SM4_ECB_TYPE:
2333
0
            return SM4_BLOCK_SIZE;
2334
0
#endif
2335
0
#ifdef WOLFSSL_SM4_CBC
2336
0
       case WC_SM4_CBC_TYPE:
2337
0
            return SM4_BLOCK_SIZE;
2338
0
#endif
2339
0
#ifdef WOLFSSL_SM4_CTR
2340
0
       case WC_SM4_CTR_TYPE:
2341
0
            return 1;
2342
0
#endif
2343
0
#ifdef WOLFSSL_SM4_GCM
2344
0
       case WC_SM4_GCM_TYPE:
2345
0
            return 1;
2346
0
#endif
2347
0
#ifdef WOLFSSL_SM4_CCM
2348
0
       case WC_SM4_CCM_TYPE:
2349
0
            return 1;
2350
0
#endif
2351
2352
0
        default:
2353
0
            return 0;
2354
30.8k
    }
2355
30.8k
}
2356
2357
unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2358
1.19k
{
2359
1.19k
    switch (cipherType(cipher)) {
2360
0
#if !defined(NO_AES)
2361
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
2362
0
        case WC_AES_128_CBC_TYPE:
2363
0
        case WC_AES_192_CBC_TYPE:
2364
0
        case WC_AES_256_CBC_TYPE:
2365
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2366
0
    #endif
2367
0
    #if defined(HAVE_AESGCM)
2368
508
        case WC_AES_128_GCM_TYPE:
2369
611
        case WC_AES_192_GCM_TYPE:
2370
1.04k
        case WC_AES_256_GCM_TYPE:
2371
1.04k
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2372
1.04k
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2373
0
    #endif
2374
0
    #if defined(HAVE_AESCCM)
2375
0
        case WC_AES_128_CCM_TYPE:
2376
0
        case WC_AES_192_CCM_TYPE:
2377
0
        case WC_AES_256_CCM_TYPE:
2378
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2379
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2380
0
    #endif
2381
0
    #if defined(WOLFSSL_AES_COUNTER)
2382
3
        case WC_AES_128_CTR_TYPE:
2383
20
        case WC_AES_192_CTR_TYPE:
2384
23
        case WC_AES_256_CTR_TYPE:
2385
23
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2386
0
    #endif
2387
0
    #if defined(WOLFSSL_AES_CFB)
2388
12
        case WC_AES_128_CFB1_TYPE:
2389
12
        case WC_AES_192_CFB1_TYPE:
2390
15
        case WC_AES_256_CFB1_TYPE:
2391
15
        case WC_AES_128_CFB8_TYPE:
2392
20
        case WC_AES_192_CFB8_TYPE:
2393
28
        case WC_AES_256_CFB8_TYPE:
2394
28
        case WC_AES_128_CFB128_TYPE:
2395
28
        case WC_AES_192_CFB128_TYPE:
2396
28
        case WC_AES_256_CFB128_TYPE:
2397
28
            return WOLFSSL_EVP_CIPH_CFB_MODE;
2398
0
    #endif
2399
0
    #if defined(WOLFSSL_AES_OFB)
2400
22
        case WC_AES_128_OFB_TYPE:
2401
22
        case WC_AES_192_OFB_TYPE:
2402
22
        case WC_AES_256_OFB_TYPE:
2403
22
            return WOLFSSL_EVP_CIPH_OFB_MODE;
2404
0
    #endif
2405
0
    #if defined(WOLFSSL_AES_XTS) && \
2406
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
2407
61
        case WC_AES_128_XTS_TYPE:
2408
66
        case WC_AES_256_XTS_TYPE:
2409
66
            return WOLFSSL_EVP_CIPH_XTS_MODE;
2410
0
    #endif
2411
0
        case WC_AES_128_ECB_TYPE:
2412
2
        case WC_AES_192_ECB_TYPE:
2413
2
        case WC_AES_256_ECB_TYPE:
2414
2
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2415
0
#endif /* !NO_AES */
2416
    #if defined(HAVE_ARIA)
2417
        case WC_ARIA_128_GCM_TYPE:
2418
        case WC_ARIA_192_GCM_TYPE:
2419
        case WC_ARIA_256_GCM_TYPE:
2420
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2421
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2422
    #endif
2423
0
    #ifndef NO_DES3
2424
1
        case WC_DES_CBC_TYPE:
2425
4
        case WC_DES_EDE3_CBC_TYPE:
2426
4
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2427
0
        case WC_DES_ECB_TYPE:
2428
0
        case WC_DES_EDE3_ECB_TYPE:
2429
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2430
0
    #endif
2431
0
    #ifndef NO_RC4
2432
0
        case WC_ARC4_TYPE:
2433
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2434
0
    #endif
2435
0
    #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
2436
0
        case WC_CHACHA20_POLY1305_TYPE:
2437
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER |
2438
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2439
0
    #endif
2440
0
    #ifdef HAVE_CHACHA
2441
0
        case WC_CHACHA20_TYPE:
2442
0
            return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
2443
0
    #endif
2444
0
    #ifdef WOLFSSL_SM4_ECB
2445
0
        case WC_SM4_ECB_TYPE:
2446
0
            return WOLFSSL_EVP_CIPH_ECB_MODE;
2447
0
    #endif
2448
0
    #ifdef WOLFSSL_SM4_CBC
2449
0
        case WC_SM4_CBC_TYPE:
2450
0
            return WOLFSSL_EVP_CIPH_CBC_MODE;
2451
0
    #endif
2452
0
    #ifdef WOLFSSL_SM4_CTR
2453
0
        case WC_SM4_CTR_TYPE:
2454
0
            return WOLFSSL_EVP_CIPH_CTR_MODE;
2455
0
    #endif
2456
0
    #ifdef WOLFSSL_SM4_GCM
2457
0
        case WC_SM4_GCM_TYPE:
2458
0
            return WOLFSSL_EVP_CIPH_GCM_MODE |
2459
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2460
0
    #endif
2461
0
    #ifdef WOLFSSL_SM4_CCM
2462
0
        case WC_SM4_CCM_TYPE:
2463
0
            return WOLFSSL_EVP_CIPH_CCM_MODE |
2464
0
                    WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
2465
0
    #endif
2466
0
        default:
2467
0
            return 0;
2468
1.19k
    }
2469
1.19k
}
2470
2471
unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
2472
0
{
2473
0
    if (cipher == NULL)
2474
0
        return 0;
2475
0
    return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE;
2476
0
}
2477
2478
void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2479
0
{
2480
0
    if (ctx != NULL) {
2481
0
        ctx->flags |= (unsigned long)flags;
2482
0
    }
2483
0
}
2484
2485
void wolfSSL_EVP_CIPHER_CTX_clear_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
2486
0
{
2487
0
    if (ctx != NULL) {
2488
0
        ctx->flags &= (unsigned long)~flags;
2489
0
    }
2490
0
}
2491
2492
unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher)
2493
1.19k
{
2494
1.19k
    if (cipher == NULL)
2495
0
        return 0;
2496
1.19k
    return WOLFSSL_CIPHER_mode(cipher);
2497
1.19k
}
2498
2499
int  wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx,
2500
    int padding)
2501
560
{
2502
560
    if (ctx == NULL)
2503
0
        return WOLFSSL_FAILURE;
2504
560
    if (padding) {
2505
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_NO_PADDING;
2506
0
    }
2507
560
    else {
2508
560
        ctx->flags |=  WOLFSSL_EVP_CIPH_NO_PADDING;
2509
560
    }
2510
560
    return 1;
2511
560
}
2512
2513
int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest)
2514
0
{
2515
    /* nothing to do */
2516
0
    if (digest == NULL)
2517
0
        return WOLFSSL_FAILURE;
2518
0
    return WOLFSSL_SUCCESS;
2519
0
}
2520
2521
2522
/* Frees the WOLFSSL_EVP_PKEY_CTX passed in.
2523
 *
2524
 * return WOLFSSL_SUCCESS on success
2525
 */
2526
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2527
void wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2528
#else
2529
int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
2530
#endif
2531
1.28k
{
2532
1.28k
    if (ctx == NULL)
2533
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
2534
        return;
2535
#else
2536
110
        return 0;
2537
1.17k
#endif
2538
1.17k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_free");
2539
1.17k
    if (ctx->pkey != NULL)
2540
1.17k
        wolfSSL_EVP_PKEY_free(ctx->pkey);
2541
1.17k
    if (ctx->peerKey != NULL)
2542
0
        wolfSSL_EVP_PKEY_free(ctx->peerKey);
2543
1.17k
    XFREE(ctx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
2544
1.17k
#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
2545
1.17k
    return WOLFSSL_SUCCESS;
2546
1.28k
#endif
2547
1.28k
}
2548
2549
2550
/* Creates a new WOLFSSL_EVP_PKEY_CTX structure.
2551
 *
2552
 * pkey  key structure to use with new WOLFSSL_EVP_PKEY_CTX
2553
 * e     engine to use. It should be NULL at this time.
2554
 *
2555
 * return the new structure on success and NULL if failed.
2556
 */
2557
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_ENGINE *e)
2558
1.17k
{
2559
1.17k
    WOLFSSL_EVP_PKEY_CTX* ctx;
2560
2561
1.17k
    if (pkey == NULL) return 0;
2562
1.17k
    if (e != NULL) return 0;
2563
1.17k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new");
2564
2565
1.17k
    ctx = (WOLFSSL_EVP_PKEY_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY_CTX), NULL,
2566
1.17k
            DYNAMIC_TYPE_PUBLIC_KEY);
2567
1.17k
    if (ctx == NULL) return NULL;
2568
1.17k
    XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_PKEY_CTX));
2569
1.17k
    ctx->pkey = pkey;
2570
1.17k
#ifndef NO_RSA
2571
1.17k
    ctx->padding = WC_RSA_PKCS1_PADDING;
2572
1.17k
    ctx->md = NULL;
2573
1.17k
    ctx->mgf1_md = NULL;
2574
1.17k
    ctx->saltlen = 0;
2575
1.17k
#endif
2576
1.17k
#ifdef HAVE_ECC
2577
1.17k
    if (pkey->ecc && pkey->ecc->group) {
2578
        /* set curve NID from pkey if available */
2579
0
        ctx->curveNID = pkey->ecc->group->curve_nid;
2580
0
    }
2581
1.17k
    else {
2582
1.17k
        ctx->curveNID = ECC_CURVE_DEF;
2583
1.17k
    }
2584
1.17k
#endif
2585
1.17k
    if (wolfSSL_EVP_PKEY_up_ref(pkey) != WOLFSSL_SUCCESS) {
2586
0
        WOLFSSL_MSG("Couldn't increase key reference count");
2587
0
    }
2588
1.17k
    return ctx;
2589
1.17k
}
2590
2591
2592
/* Sets the type of RSA padding to use.
2593
 *
2594
 * ctx     structure to set padding in.
2595
 * padding RSA padding type
2596
 *
2597
 * returns WOLFSSL_SUCCESS on success.
2598
 */
2599
int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, int padding)
2600
0
{
2601
0
    if (ctx == NULL) return 0;
2602
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_padding");
2603
0
    ctx->padding = padding;
2604
0
    return WOLFSSL_SUCCESS;
2605
0
}
2606
2607
/* Sets the message digest type for RSA padding to use.
2608
 *
2609
 * ctx  structure to set padding in.
2610
 * md   Message digest
2611
 *
2612
 * returns WOLFSSL_SUCCESS on success.
2613
 */
2614
int wolfSSL_EVP_PKEY_CTX_set_signature_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2615
    const WOLFSSL_EVP_MD* md)
2616
0
{
2617
0
    if (ctx == NULL) return 0;
2618
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_signature_md");
2619
0
#ifndef NO_RSA
2620
0
    ctx->md = md;
2621
#else
2622
    (void)md;
2623
#endif
2624
0
    return WOLFSSL_SUCCESS;
2625
0
}
2626
2627
int wolfSSL_EVP_PKEY_CTX_set_rsa_oaep_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2628
    const WOLFSSL_EVP_MD *md)
2629
0
{
2630
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_OAEP_PADDING);
2631
0
    return wolfSSL_EVP_PKEY_CTX_set_signature_md(ctx, md);
2632
0
}
2633
2634
int wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen(WOLFSSL_EVP_PKEY_CTX *ctx,
2635
                                             int saltlen)
2636
0
{
2637
0
    if (ctx == NULL) return 0;
2638
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_pss_saltlen");
2639
0
    wolfSSL_EVP_PKEY_CTX_set_rsa_padding(ctx, WC_RSA_PKCS1_PSS_PADDING);
2640
0
#ifndef NO_RSA
2641
0
    ctx->saltlen = saltlen;
2642
#else
2643
    (void)saltlen;
2644
#endif
2645
0
    return WOLFSSL_SUCCESS;
2646
0
}
2647
2648
int wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md(WOLFSSL_EVP_PKEY_CTX *ctx,
2649
                                         const WOLFSSL_EVP_MD *md)
2650
0
{
2651
0
    if (ctx == NULL) return 0;
2652
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_mgf1_md");
2653
0
#ifndef NO_RSA
2654
    /* Hash digest algorithm used with Mask Generation Function 1 (MGF1) for
2655
     * RSA-PSS and RSA-OAEP. */
2656
0
    ctx->mgf1_md = md;
2657
#else
2658
    (void)md;
2659
#endif
2660
0
    return WOLFSSL_SUCCESS;
2661
0
}
2662
2663
/* create a PKEY context and return it */
2664
WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new_id(int id, WOLFSSL_ENGINE *e)
2665
689
{
2666
689
    WOLFSSL_EVP_PKEY* pkey;
2667
689
    WOLFSSL_EVP_PKEY_CTX* ctx = NULL;
2668
2669
689
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new_id");
2670
2671
689
    pkey = wolfSSL_EVP_PKEY_new_ex(NULL);
2672
689
    if (pkey) {
2673
689
        pkey->type = id;
2674
689
        ctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
2675
        /* wolfSSL_EVP_PKEY_CTX_new calls wolfSSL_EVP_PKEY_up_ref so we need
2676
         * to always call wolfSSL_EVP_PKEY_free (either to free it if an
2677
         * error occurred in the previous function or to decrease the reference
2678
         * count so that pkey is actually free'd when wolfSSL_EVP_PKEY_CTX_free
2679
         * is called) */
2680
689
        wolfSSL_EVP_PKEY_free(pkey);
2681
689
    }
2682
689
    return ctx;
2683
689
}
2684
2685
/* Returns WOLFSSL_SUCCESS or error */
2686
int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits)
2687
0
{
2688
0
    if (ctx) {
2689
0
        ctx->nbits = bits;
2690
0
    }
2691
0
    return WOLFSSL_SUCCESS;
2692
0
}
2693
2694
2695
int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx)
2696
689
{
2697
689
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_init");
2698
2699
689
    if (!ctx) {
2700
0
        return WOLFSSL_FAILURE;
2701
0
    }
2702
689
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2703
689
    ctx->op = WC_EVP_PKEY_OP_DERIVE;
2704
689
    ctx->padding = 0;
2705
689
    ctx->nbits = 0;
2706
689
    return WOLFSSL_SUCCESS;
2707
689
}
2708
2709
int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer)
2710
0
{
2711
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_set_peer");
2712
2713
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE) {
2714
0
        return WOLFSSL_FAILURE;
2715
0
    }
2716
0
    wolfSSL_EVP_PKEY_free(ctx->peerKey);
2717
0
    ctx->peerKey = peer;
2718
0
    if (!wolfSSL_EVP_PKEY_up_ref(peer)) {
2719
0
        ctx->peerKey = NULL;
2720
0
        return WOLFSSL_FAILURE;
2721
0
    }
2722
0
    return WOLFSSL_SUCCESS;
2723
0
}
2724
2725
#ifndef NO_WOLFSSL_STUB
2726
int wolfSSL_EVP_PKEY_CTX_ctrl_str(WOLFSSL_EVP_PKEY_CTX *ctx,
2727
                          const char *name, const char *value)
2728
0
{
2729
0
    WOLFSSL_STUB("wolfSSL_EVP_PKEY_CTX_ctrl_str");
2730
0
    (void)ctx;
2731
0
    (void)name;
2732
0
    (void)value;
2733
0
    return WOLFSSL_FAILURE;
2734
0
}
2735
#endif /* NO_WOLFSSL_STUB */
2736
2737
#if (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || defined(HAVE_ECC) || \
2738
    defined(HAVE_HKDF)
2739
int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
2740
568
{
2741
568
    int len;
2742
568
#ifdef HAVE_HKDF
2743
568
    enum wc_HashType hkdfHashType;
2744
568
#endif
2745
2746
568
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive");
2747
2748
568
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_DERIVE || !ctx->pkey || (!ctx->peerKey
2749
568
        && ctx->pkey->type != WC_EVP_PKEY_HKDF) || !keylen || (ctx->pkey->type
2750
568
        != WC_EVP_PKEY_HKDF && ctx->pkey->type != ctx->peerKey->type)) {
2751
0
        return WOLFSSL_FAILURE;
2752
0
    }
2753
568
    switch (ctx->pkey->type) {
2754
0
#ifndef NO_DH
2755
0
    case WC_EVP_PKEY_DH:
2756
        /* Use DH */
2757
0
        if (!ctx->pkey->dh || !ctx->peerKey->dh) {
2758
0
            return WOLFSSL_FAILURE;
2759
0
        }
2760
        /* set internal peer key if not done */
2761
0
        if (!ctx->peerKey->dh->inSet) {
2762
0
            if (SetDhInternal(ctx->peerKey->dh) != WOLFSSL_SUCCESS) {
2763
0
                WOLFSSL_MSG("SetDhInternal failed");
2764
0
                return WOLFSSL_FAILURE;
2765
0
            }
2766
0
        }
2767
0
        if (!ctx->peerKey->dh->pub_key) {
2768
0
            WOLFSSL_MSG("SetDhInternal failed, pub_key is NULL");
2769
0
            return WOLFSSL_FAILURE;
2770
0
        }
2771
0
        if ((len = wolfSSL_DH_size(ctx->pkey->dh)) <= 0) {
2772
0
            return WOLFSSL_FAILURE;
2773
0
        }
2774
0
        if (key) {
2775
0
            if (*keylen < (size_t)len) {
2776
0
                return WOLFSSL_FAILURE;
2777
0
            }
2778
            /* computed DH agreement can be less than DH size if leading zeros */
2779
0
            if (wolfSSL_DH_compute_key(key, ctx->peerKey->dh->pub_key,
2780
0
                                       ctx->pkey->dh) <= 0) {
2781
0
                return WOLFSSL_FAILURE;
2782
0
            }
2783
0
        }
2784
0
        *keylen = (size_t)len;
2785
0
        break;
2786
0
#endif
2787
0
#if defined(HAVE_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
2788
0
    case WC_EVP_PKEY_EC:
2789
        /* Use ECDH */
2790
0
        if (!ctx->pkey->ecc || !ctx->peerKey->ecc) {
2791
0
            return WOLFSSL_FAILURE;
2792
0
        }
2793
        /* set internal key if not done */
2794
0
        if (!ctx->pkey->ecc->inSet) {
2795
0
            if (SetECKeyInternal(ctx->pkey->ecc) != WOLFSSL_SUCCESS) {
2796
0
                WOLFSSL_MSG("SetECKeyInternal failed");
2797
0
                return WOLFSSL_FAILURE;
2798
0
            }
2799
0
        }
2800
0
        if (!ctx->peerKey->ecc->exSet || !ctx->peerKey->ecc->pub_key->internal) {
2801
0
            if (SetECKeyExternal(ctx->peerKey->ecc) != WOLFSSL_SUCCESS) {
2802
0
                WOLFSSL_MSG("SetECKeyExternal failed");
2803
0
                return WOLFSSL_FAILURE;
2804
0
            }
2805
0
        }
2806
0
        if (!(len = wc_ecc_size((ecc_key*)ctx->pkey->ecc->internal))) {
2807
0
            return WOLFSSL_FAILURE;
2808
0
        }
2809
0
        if (key) {
2810
0
            word32 len32 = (word32)len;
2811
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2812
0
    && (!defined(HAVE_FIPS) || \
2813
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2814
2815
0
            WC_RNG rng;
2816
0
            if (wc_InitRng(&rng) != MP_OKAY) {
2817
0
                WOLFSSL_MSG("Init RNG failed");
2818
0
                return WOLFSSL_FAILURE;
2819
0
            }
2820
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = &rng;
2821
0
#endif
2822
0
            if (*keylen < len32) {
2823
0
                WOLFSSL_MSG("buffer too short");
2824
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2825
0
    && (!defined(HAVE_FIPS) || \
2826
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2827
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2828
0
                wc_FreeRng(&rng);
2829
0
#endif
2830
0
                return WOLFSSL_FAILURE;
2831
0
            }
2832
0
            if (wc_ecc_shared_secret((ecc_key*)ctx->pkey->ecc->internal,
2833
0
                    (ecc_key*)ctx->peerKey->ecc->internal, key, &len32)
2834
0
                    != MP_OKAY) {
2835
0
                WOLFSSL_MSG("wc_ecc_shared_secret failed");
2836
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2837
0
    && (!defined(HAVE_FIPS) || \
2838
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2839
0
                ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2840
0
                wc_FreeRng(&rng);
2841
0
#endif
2842
0
                return WOLFSSL_FAILURE;
2843
0
            }
2844
0
#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
2845
0
    && (!defined(HAVE_FIPS) || \
2846
0
         (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
2847
0
            ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
2848
0
            wc_FreeRng(&rng);
2849
0
#endif
2850
0
            len = (int)len32;
2851
0
        }
2852
0
        *keylen = (size_t)len;
2853
0
        break;
2854
0
#endif
2855
0
#ifdef HAVE_HKDF
2856
568
    case WC_EVP_PKEY_HKDF:
2857
568
        (void)len;
2858
2859
568
        hkdfHashType = EvpMd2MacType(ctx->pkey->hkdfMd);
2860
568
        if (hkdfHashType == WC_HASH_TYPE_NONE) {
2861
0
            WOLFSSL_MSG("Invalid hash type for HKDF.");
2862
0
            return WOLFSSL_FAILURE;
2863
0
        }
2864
568
        if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) {
2865
568
            if (wc_HKDF((int)hkdfHashType, ctx->pkey->hkdfKey, ctx->pkey->hkdfKeySz,
2866
568
                        ctx->pkey->hkdfSalt, ctx->pkey->hkdfSaltSz,
2867
568
                        ctx->pkey->hkdfInfo, ctx->pkey->hkdfInfoSz, key,
2868
568
                        (word32)*keylen) != 0) {
2869
228
                WOLFSSL_MSG("wc_HKDF failed.");
2870
228
                return WOLFSSL_FAILURE;
2871
228
            }
2872
568
        }
2873
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) {
2874
0
            if (wc_HKDF_Extract((int)hkdfHashType, ctx->pkey->hkdfSalt,
2875
0
                                ctx->pkey->hkdfSaltSz, ctx->pkey->hkdfKey,
2876
0
                                ctx->pkey->hkdfKeySz, key) != 0) {
2877
0
                WOLFSSL_MSG("wc_HKDF_Extract failed.");
2878
0
                return WOLFSSL_FAILURE;
2879
0
            }
2880
0
            else {
2881
0
                int hkdfHashSz = wolfSSL_EVP_MD_size(ctx->pkey->hkdfMd);
2882
0
                if (hkdfHashSz <= 0) {
2883
0
                    WOLFSSL_MSG("Failed to get block size for HKDF hash.");
2884
0
                    return WOLFSSL_FAILURE;
2885
0
                }
2886
                /* Length of extract only is always the length of the hash. */
2887
0
                *keylen = (size_t)hkdfHashSz;
2888
0
            }
2889
0
        }
2890
0
        else if (ctx->pkey->hkdfMode == WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
2891
0
            if (wc_HKDF_Expand((int)hkdfHashType, ctx->pkey->hkdfKey,
2892
0
                               ctx->pkey->hkdfKeySz, ctx->pkey->hkdfInfo,
2893
0
                               ctx->pkey->hkdfInfoSz, key,
2894
0
                               (word32)*keylen) != 0) {
2895
0
                WOLFSSL_MSG("wc_HKDF_Expand failed.");
2896
0
                return WOLFSSL_FAILURE;
2897
0
            }
2898
0
        }
2899
0
        else {
2900
0
            WOLFSSL_MSG("Invalid HKDF mode.");
2901
0
            return WOLFSSL_FAILURE;
2902
0
        }
2903
340
        break;
2904
340
#endif /* HAVE_HKDF */
2905
340
    default:
2906
0
        WOLFSSL_MSG("Unknown key type");
2907
0
        return WOLFSSL_FAILURE;
2908
568
    }
2909
340
    return WOLFSSL_SUCCESS;
2910
568
}
2911
#endif /* (!NO_DH && WOLFSSL_DH_EXTRA) || HAVE_ECC || HAVE_HKDF */
2912
2913
#ifdef HAVE_HKDF
2914
int wolfSSL_EVP_PKEY_CTX_set_hkdf_md(WOLFSSL_EVP_PKEY_CTX* ctx,
2915
                                     const WOLFSSL_EVP_MD* md)
2916
689
{
2917
689
    int ret = WOLFSSL_SUCCESS;
2918
2919
689
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_hkdf_md");
2920
2921
689
    if (ctx == NULL || ctx->pkey == NULL || md == NULL) {
2922
0
        WOLFSSL_MSG("Bad argument.");
2923
0
        ret = WOLFSSL_FAILURE;
2924
0
    }
2925
2926
689
    if (ret == WOLFSSL_SUCCESS) {
2927
689
        ctx->pkey->hkdfMd = md;
2928
689
    }
2929
2930
689
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set_hkdf_md", ret);
2931
2932
689
    return ret;
2933
689
}
2934
2935
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt(WOLFSSL_EVP_PKEY_CTX* ctx,
2936
                                        const byte* salt, int saltSz)
2937
568
{
2938
568
    int ret = WOLFSSL_SUCCESS;
2939
2940
568
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt");
2941
2942
568
    if (ctx == NULL || ctx->pkey == NULL || saltSz < 0) {
2943
0
        WOLFSSL_MSG("Bad argument.");
2944
0
        ret = WOLFSSL_FAILURE;
2945
0
    }
2946
568
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2947
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2948
0
        ret = WOLFSSL_FAILURE;
2949
0
    }
2950
2951
568
    if (ret == WOLFSSL_SUCCESS && salt != NULL && saltSz > 0) {
2952
355
        XFREE(ctx->pkey->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
2953
355
        ctx->pkey->hkdfSalt = (byte*)XMALLOC((size_t)saltSz, NULL,
2954
355
            DYNAMIC_TYPE_SALT);
2955
355
        if (ctx->pkey->hkdfSalt == NULL) {
2956
0
            WOLFSSL_MSG("Failed to allocate HKDF salt buffer.");
2957
0
            ret = WOLFSSL_FAILURE;
2958
0
        }
2959
355
        else {
2960
355
            XMEMCPY(ctx->pkey->hkdfSalt, salt, (size_t)saltSz);
2961
355
            ctx->pkey->hkdfSaltSz = (word32)saltSz;
2962
355
        }
2963
355
    }
2964
2965
568
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt", ret);
2966
2967
568
    return ret;
2968
568
}
2969
2970
int wolfSSL_EVP_PKEY_CTX_set1_hkdf_key(WOLFSSL_EVP_PKEY_CTX* ctx,
2971
                                       const byte* key, int keySz)
2972
689
{
2973
689
    int ret = WOLFSSL_SUCCESS;
2974
2975
689
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key");
2976
2977
689
    if (ctx == NULL || ctx->pkey == NULL || key == NULL || keySz <= 0) {
2978
121
        WOLFSSL_MSG("Bad argument.");
2979
121
        ret = WOLFSSL_FAILURE;
2980
121
    }
2981
689
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
2982
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
2983
0
        ret = WOLFSSL_FAILURE;
2984
0
    }
2985
2986
689
    if (ret == WOLFSSL_SUCCESS) {
2987
568
        XFREE(ctx->pkey->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
2988
568
        ctx->pkey->hkdfKey = (byte*)XMALLOC((size_t)keySz, NULL,
2989
568
            DYNAMIC_TYPE_KEY);
2990
568
        if (ctx->pkey->hkdfKey == NULL) {
2991
0
            WOLFSSL_MSG("Failed to allocate HKDF key buffer.");
2992
0
            ret = WOLFSSL_FAILURE;
2993
0
        }
2994
568
        else {
2995
568
            XMEMCPY(ctx->pkey->hkdfKey, key, (size_t)keySz);
2996
568
            ctx->pkey->hkdfKeySz = (word32)keySz;
2997
568
        }
2998
568
    }
2999
3000
689
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key", ret);
3001
3002
689
    return ret;
3003
689
}
3004
3005
int wolfSSL_EVP_PKEY_CTX_add1_hkdf_info(WOLFSSL_EVP_PKEY_CTX* ctx,
3006
                                        const byte* info, int infoSz)
3007
568
{
3008
568
    int ret = WOLFSSL_SUCCESS;
3009
3010
568
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info");
3011
3012
568
    if (ctx == NULL || ctx->pkey == NULL || infoSz < 0) {
3013
0
        WOLFSSL_MSG("Bad argument.");
3014
0
        ret = WOLFSSL_FAILURE;
3015
0
    }
3016
568
    if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != WC_EVP_PKEY_HKDF) {
3017
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
3018
0
        ret = WOLFSSL_FAILURE;
3019
0
    }
3020
3021
568
    if (ret == WOLFSSL_SUCCESS && info != NULL && infoSz > 0) {
3022
223
        unsigned char* p;
3023
        /* If there's already info in the buffer, append. */
3024
    #ifdef WOLFSSL_NO_REALLOC
3025
        p = (byte*)XMALLOC((size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3026
            DYNAMIC_TYPE_INFO);
3027
        if (p != NULL) {
3028
            XMEMCPY(p, ctx->pkey->hkdfInfo, (size_t)ctx->pkey->hkdfInfoSz);
3029
            XFREE(ctx->pkey->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
3030
            ctx->pkey->hkdfInfo = NULL;
3031
        }
3032
    #else
3033
223
        p = (byte*)XREALLOC(ctx->pkey->hkdfInfo,
3034
223
            (size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
3035
223
            DYNAMIC_TYPE_INFO);
3036
223
    #endif
3037
223
        if (p == NULL) {
3038
0
            WOLFSSL_MSG("Failed to reallocate larger HKDF info buffer.");
3039
0
            ret = WOLFSSL_FAILURE;
3040
0
        }
3041
223
        else {
3042
223
            ctx->pkey->hkdfInfo = p;
3043
223
            XMEMCPY(ctx->pkey->hkdfInfo + ctx->pkey->hkdfInfoSz, info,
3044
223
                    (size_t)infoSz);
3045
223
            ctx->pkey->hkdfInfoSz += (word32)infoSz;
3046
223
        }
3047
223
    }
3048
3049
568
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info", ret);
3050
3051
568
    return ret;
3052
568
}
3053
3054
int wolfSSL_EVP_PKEY_CTX_hkdf_mode(WOLFSSL_EVP_PKEY_CTX* ctx, int mode)
3055
0
{
3056
0
    int ret = WOLFSSL_SUCCESS;
3057
3058
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_hkdf_mode");
3059
3060
0
    if (ctx == NULL || ctx->pkey == NULL) {
3061
0
        WOLFSSL_MSG("Bad argument.");
3062
0
        ret = WOLFSSL_FAILURE;
3063
0
    }
3064
3065
0
    if (ret == WOLFSSL_SUCCESS &&
3066
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND &&
3067
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY &&
3068
0
        mode != WOLFSSL_EVP_PKEY_HKDEF_MODE_EXPAND_ONLY)
3069
0
    {
3070
0
        WOLFSSL_MSG("Invalid HKDF mode.");
3071
0
        ret = WOLFSSL_FAILURE;
3072
0
    }
3073
3074
0
    if (ret == WOLFSSL_SUCCESS) {
3075
0
        ctx->pkey->hkdfMode = mode;
3076
0
    }
3077
3078
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_hkdf_mode", ret);
3079
3080
0
    return ret;
3081
0
}
3082
#endif /* HAVE_HKDF */
3083
3084
/* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer.
3085
 *
3086
 * ctx    EVP_PKEY context of operation.
3087
 * out    Decrypted output buffer. If NULL, puts the maximum output buffer size
3088
          in outLen and returns success.
3089
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3090
 *        the size of out. On output holds the length of actual decryption.
3091
 * in     Encrypted input buffer.
3092
 * inLen  Length of encrypted data.
3093
 *
3094
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3095
 */
3096
int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3097
                     unsigned char *out, size_t *outLen,
3098
                     const unsigned char *in, size_t inLen)
3099
0
{
3100
0
    int len = 0;
3101
3102
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt");
3103
3104
0
    if (ctx == NULL || ctx->pkey == NULL) {
3105
0
        WOLFSSL_MSG("Bad parameter.");
3106
0
        return 0;
3107
0
    }
3108
3109
0
    if (ctx->op != WC_EVP_PKEY_OP_DECRYPT) {
3110
0
        WOLFSSL_MSG("ctx->op must be set to WC_EVP_PKEY_OP_DECRYPT. Use "
3111
0
            "wolfSSL_EVP_PKEY_decrypt_init.");
3112
0
        return WOLFSSL_FAILURE;
3113
0
    }
3114
3115
0
    (void)out;
3116
0
    (void)outLen;
3117
0
    (void)in;
3118
0
    (void)inLen;
3119
0
    (void)len;
3120
3121
0
    switch (ctx->pkey->type) {
3122
0
#if !defined(NO_RSA)
3123
0
    case WC_EVP_PKEY_RSA:
3124
0
        if (out == NULL) {
3125
0
            if (ctx->pkey->rsa == NULL) {
3126
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3127
0
                return WOLFSSL_FAILURE;
3128
0
            }
3129
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3130
0
            if (len <= 0) {
3131
0
                WOLFSSL_MSG("Error getting RSA size.");
3132
0
                return WOLFSSL_FAILURE;
3133
0
            }
3134
0
            if (outLen == NULL) {
3135
0
                WOLFSSL_MSG("outLen is NULL.");
3136
0
                return WOLFSSL_FAILURE;
3137
0
            }
3138
3139
0
            *outLen = (size_t)len;
3140
0
            return WOLFSSL_SUCCESS;
3141
0
        }
3142
3143
0
        len = wolfSSL_RSA_private_decrypt((int)inLen, (unsigned char*)in, out,
3144
0
              ctx->pkey->rsa, ctx->padding);
3145
0
        if (len < 0) break;
3146
0
        else {
3147
0
            *outLen = (size_t)len;
3148
0
            return WOLFSSL_SUCCESS;
3149
0
        }
3150
0
#endif /* NO_RSA */
3151
3152
0
    case WC_EVP_PKEY_EC:
3153
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented.");
3154
0
        FALL_THROUGH;
3155
0
    default:
3156
0
        break;
3157
0
    }
3158
3159
0
    return WOLFSSL_FAILURE;
3160
0
}
3161
3162
3163
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure for decryption
3164
 *
3165
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with decryption
3166
 *
3167
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3168
 */
3169
int wolfSSL_EVP_PKEY_decrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3170
0
{
3171
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt_init");
3172
0
    if (ctx == NULL || ctx->pkey == NULL) return WOLFSSL_FAILURE;
3173
0
    switch (ctx->pkey->type) {
3174
0
    case WC_EVP_PKEY_RSA:
3175
0
        ctx->op = WC_EVP_PKEY_OP_DECRYPT;
3176
0
        return WOLFSSL_SUCCESS;
3177
0
    case WC_EVP_PKEY_EC:
3178
0
        WOLFSSL_MSG("not implemented");
3179
0
        FALL_THROUGH;
3180
0
    default:
3181
0
        break;
3182
0
    }
3183
0
    return WOLFSSL_FAILURE;
3184
0
}
3185
3186
3187
/* Uses the WOLFSSL_EVP_PKEY_CTX to encrypt a buffer.
3188
 *
3189
 * ctx    EVP_PKEY context of operation.
3190
 * out    Encrypted output buffer. If NULL, puts the maximum output buffer size
3191
 *        in outlen and returns success.
3192
 * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
3193
 *        the size of out. On output holds the length of actual encryption.
3194
 * in     Plaintext input buffer.
3195
 * inLen  Length of plaintext.
3196
 *
3197
 * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
3198
 */
3199
int wolfSSL_EVP_PKEY_encrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
3200
                     unsigned char *out, size_t *outLen,
3201
                     const unsigned char *in, size_t inLen)
3202
0
{
3203
0
    int len = 0;
3204
3205
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt");
3206
3207
0
    if (ctx == NULL || ctx->pkey == NULL) {
3208
0
        WOLFSSL_MSG("Bad parameter.");
3209
0
        return 0;
3210
0
    }
3211
3212
0
    if (ctx->op != WC_EVP_PKEY_OP_ENCRYPT) {
3213
0
        WOLFSSL_MSG("ctx->op must be set to WC_EVP_PKEY_OP_ENCRYPT. Use "
3214
0
            "wolfSSL_EVP_PKEY_encrypt_init.");
3215
0
        return WOLFSSL_FAILURE;
3216
0
    }
3217
3218
0
    (void)out;
3219
0
    (void)outLen;
3220
0
    (void)in;
3221
0
    (void)inLen;
3222
0
    (void)len;
3223
3224
0
    switch (ctx->pkey->type) {
3225
0
#if !defined(NO_RSA)
3226
0
    case WC_EVP_PKEY_RSA:
3227
0
        if (out == NULL) {
3228
0
            if (ctx->pkey->rsa == NULL) {
3229
0
                WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
3230
0
                return WOLFSSL_FAILURE;
3231
0
            }
3232
0
            len = wolfSSL_RSA_size(ctx->pkey->rsa);
3233
0
            if (len <= 0) {
3234
0
                WOLFSSL_MSG("Error getting RSA size.");
3235
0
                return WOLFSSL_FAILURE;
3236
0
            }
3237
0
            if (outLen == NULL) {
3238
0
                WOLFSSL_MSG("outLen is NULL.");
3239
0
                return WOLFSSL_FAILURE;
3240
0
            }
3241
3242
0
            *outLen = (size_t)len;
3243
0
            return WOLFSSL_SUCCESS;
3244
0
        }
3245
3246
0
        len = wolfSSL_RSA_public_encrypt((int)inLen, (unsigned char *)in, out,
3247
0
                  ctx->pkey->rsa, ctx->padding);
3248
0
        if (len < 0)
3249
0
            break;
3250
0
        else {
3251
0
            *outLen = (size_t)len;
3252
0
            return WOLFSSL_SUCCESS;
3253
0
        }
3254
0
#endif /* NO_RSA */
3255
3256
0
    case WC_EVP_PKEY_EC:
3257
0
        WOLFSSL_MSG("WC_EVP_PKEY_EC not implemented");
3258
0
        FALL_THROUGH;
3259
0
    default:
3260
0
        break;
3261
0
    }
3262
3263
0
    return WOLFSSL_FAILURE;
3264
0
}
3265
3266
3267
/* Initialize a WOLFSSL_EVP_PKEY_CTX structure to encrypt data
3268
 *
3269
 * ctx    WOLFSSL_EVP_PKEY_CTX structure to use with encryption
3270
 *
3271
 * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
3272
 */
3273
int wolfSSL_EVP_PKEY_encrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3274
0
{
3275
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt_init");
3276
0
    if (ctx == NULL || ctx->pkey == NULL) return WOLFSSL_FAILURE;
3277
3278
0
    switch (ctx->pkey->type) {
3279
0
    case WC_EVP_PKEY_RSA:
3280
0
        ctx->op = WC_EVP_PKEY_OP_ENCRYPT;
3281
0
        return WOLFSSL_SUCCESS;
3282
0
    case WC_EVP_PKEY_EC:
3283
0
        WOLFSSL_MSG("not implemented");
3284
0
        FALL_THROUGH;
3285
0
    default:
3286
0
        break;
3287
0
    }
3288
0
    return WOLFSSL_FAILURE;
3289
0
}
3290
/******************************************************************************
3291
* wolfSSL_EVP_PKEY_sign_init -  initializes a public key algorithm context for
3292
* a signing operation.
3293
*
3294
* RETURNS:
3295
* returns WOLFSSL_SUCCESS on success, otherwise returns -2
3296
*/
3297
int wolfSSL_EVP_PKEY_sign_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3298
0
{
3299
0
    int ret = -2;
3300
3301
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign_init");
3302
0
    if (!ctx  || !ctx->pkey)
3303
0
        return ret;
3304
3305
0
    switch (ctx->pkey->type) {
3306
0
#if !defined(NO_RSA)
3307
0
        case WC_EVP_PKEY_RSA:
3308
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3309
0
            ret = WOLFSSL_SUCCESS;
3310
0
            break;
3311
0
#endif /* NO_RSA */
3312
3313
#ifndef NO_DSA
3314
        case WC_EVP_PKEY_DSA:
3315
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3316
            ret = WOLFSSL_SUCCESS;
3317
            break;
3318
#endif /* NO_DSA */
3319
3320
0
#ifdef HAVE_ECC
3321
0
        case WC_EVP_PKEY_EC:
3322
0
            ctx->op = WC_EVP_PKEY_OP_SIGN;
3323
0
            ret = WOLFSSL_SUCCESS;
3324
0
            break;
3325
0
#endif /* HAVE_ECC */
3326
3327
0
        default:
3328
0
            ret = -2;
3329
0
    }
3330
0
    return ret;
3331
0
}
3332
/******************************************************************************
3333
* wolfSSL_EVP_PKEY_sign - performs a public key signing operation using ctx
3334
* The data to be signed should be hashed since the function does not hash the data.
3335
*
3336
* RETURNS:
3337
* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
3338
*/
3339
3340
int wolfSSL_EVP_PKEY_sign(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *sig,
3341
                        size_t *siglen, const unsigned char *tbs, size_t tbslen)
3342
0
{
3343
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign");
3344
3345
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_SIGN || !ctx->pkey || !siglen)
3346
0
        return WOLFSSL_FAILURE;
3347
3348
0
    (void)sig;
3349
0
    (void)siglen;
3350
0
    (void)tbs;
3351
0
    (void)tbslen;
3352
3353
0
    switch (ctx->pkey->type) {
3354
0
#ifndef NO_RSA
3355
0
    case WC_EVP_PKEY_RSA: {
3356
0
        unsigned int usiglen = (unsigned int)*siglen;
3357
0
        if (!sig) {
3358
0
            int len;
3359
0
            if (!ctx->pkey->rsa)
3360
0
                return WOLFSSL_FAILURE;
3361
0
            len = wc_RsaEncryptSize((RsaKey*)ctx->pkey->rsa->internal);
3362
0
            if (len < 0)
3363
0
                return WOLFSSL_FAILURE;
3364
0
            *siglen = (size_t)len;
3365
0
            return WOLFSSL_SUCCESS;
3366
0
        }
3367
3368
0
        if (wolfSSL_RSA_sign_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3369
0
            (unsigned int)tbslen, sig, &usiglen, ctx->pkey->rsa, 1,
3370
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen
3371
0
        ) != WOLFSSL_SUCCESS) {
3372
0
            return WOLFSSL_FAILURE;
3373
0
        }
3374
0
        *siglen = (size_t)usiglen;
3375
0
        return WOLFSSL_SUCCESS;
3376
0
    }
3377
0
#endif /* !NO_RSA */
3378
3379
#ifndef NO_DSA
3380
    case WC_EVP_PKEY_DSA: {
3381
        int bytes;
3382
        int ret;
3383
        if (!ctx->pkey->dsa)
3384
            return WOLFSSL_FAILURE;
3385
        bytes = wolfSSL_BN_num_bytes(ctx->pkey->dsa->q);
3386
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3387
            return WOLFSSL_FAILURE;
3388
        bytes *= 2;
3389
        if (!sig) {
3390
            *siglen = (size_t)bytes;
3391
            return WOLFSSL_SUCCESS;
3392
        }
3393
        if ((int)*siglen < bytes)
3394
            return WOLFSSL_FAILURE;
3395
        ret = wolfSSL_DSA_do_sign(tbs, sig, ctx->pkey->dsa);
3396
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
3397
        if (ret != WOLFSSL_SUCCESS)
3398
            return ret;
3399
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
3400
            return WOLFSSL_FAILURE;
3401
        *siglen = (size_t)bytes;
3402
        return WOLFSSL_SUCCESS;
3403
    }
3404
#endif /* NO_DSA */
3405
3406
0
#ifdef HAVE_ECC
3407
0
    case WC_EVP_PKEY_EC: {
3408
0
        int ret;
3409
0
        WOLFSSL_ECDSA_SIG *ecdsaSig;
3410
0
        if (!sig) {
3411
0
            WOLFSSL_EC_KEY *key = ctx->pkey->ecc;
3412
0
            ecc_key* eckey;
3413
0
            if (!key)
3414
0
                return WOLFSSL_FAILURE;
3415
            /* set internal key if not done */
3416
0
            if (key->inSet == 0 && SetECKeyInternal(key) != WOLFSSL_SUCCESS)
3417
0
                return WOLFSSL_FAILURE;
3418
0
            eckey = (ecc_key*)ctx->pkey->ecc->internal;
3419
0
            if (!eckey)
3420
0
                return WOLFSSL_FAILURE;
3421
0
            ret = wc_ecc_sig_size(eckey);
3422
0
            if (ret == 0)
3423
0
                return WOLFSSL_FAILURE;
3424
0
            *siglen = (size_t)ret;
3425
0
            return WOLFSSL_SUCCESS;
3426
0
        }
3427
0
        ecdsaSig = wolfSSL_ECDSA_do_sign(tbs, (int)tbslen, ctx->pkey->ecc);
3428
0
        if (ecdsaSig == NULL)
3429
0
            return WOLFSSL_FAILURE;
3430
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
3431
0
        if (ret == 0 || ret > (int)*siglen) {
3432
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
3433
0
            return WOLFSSL_FAILURE;
3434
0
        }
3435
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
3436
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3437
0
        if (ret == 0)
3438
0
            return WOLFSSL_FAILURE;
3439
0
        *siglen = (size_t)ret;
3440
0
        return WOLFSSL_SUCCESS;
3441
0
    }
3442
0
#endif /* HAVE_ECC */
3443
3444
0
    default:
3445
0
        break;
3446
0
    }
3447
0
    return WOLFSSL_FAILURE;
3448
0
}
3449
3450
/******************************************************************************
3451
* wolfSSL_EVP_PKEY_verify_init - initializes a public key algorithm context for
3452
* a verification operation.
3453
*
3454
* RETURNS:
3455
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3456
* a return value of -2 indicates the operation is not supported by the public
3457
* key algorithm.
3458
*/
3459
3460
int wolfSSL_EVP_PKEY_verify_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3461
0
{
3462
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify_init");
3463
3464
0
    if (!ctx || !ctx->pkey)
3465
0
        return WOLFSSL_FAILURE;
3466
3467
0
    switch (ctx->pkey->type) {
3468
0
#if !defined(NO_RSA)
3469
0
        case WC_EVP_PKEY_RSA:
3470
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3471
0
            return WOLFSSL_SUCCESS;
3472
0
#endif /* NO_RSA */
3473
3474
#ifndef NO_DSA
3475
        case WC_EVP_PKEY_DSA:
3476
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3477
            return WOLFSSL_SUCCESS;
3478
#endif /* NO_DSA */
3479
3480
0
#ifdef HAVE_ECC
3481
0
        case WC_EVP_PKEY_EC:
3482
0
            ctx->op = WC_EVP_PKEY_OP_VERIFY;
3483
0
            return WOLFSSL_SUCCESS;
3484
0
#endif /* HAVE_ECC */
3485
3486
0
        default:
3487
0
            return -2;
3488
0
    }
3489
0
}
3490
3491
/******************************************************************************
3492
* wolfSSL_EVP_PKEY_verify - verifies a signature using ctx
3493
*
3494
* RETURNS:
3495
* returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
3496
* a return value of -2 indicates the operation is not supported by the public
3497
* key algorithm.
3498
*/
3499
3500
int wolfSSL_EVP_PKEY_verify(WOLFSSL_EVP_PKEY_CTX *ctx, const unsigned char *sig,
3501
                            size_t siglen, const unsigned char *tbs,
3502
                            size_t tbslen)
3503
0
{
3504
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify");
3505
3506
0
    if (!ctx || ctx->op != WC_EVP_PKEY_OP_VERIFY || !ctx->pkey)
3507
0
        return WOLFSSL_FAILURE;
3508
3509
0
    switch (ctx->pkey->type) {
3510
0
#ifndef NO_RSA
3511
0
    case WC_EVP_PKEY_RSA:
3512
0
        return wolfSSL_RSA_verify_mgf(wolfSSL_EVP_MD_type(ctx->md), tbs,
3513
0
            (unsigned int)tbslen, sig, (unsigned int)siglen, ctx->pkey->rsa,
3514
0
            ctx->padding, wolfSSL_EVP_MD_type(ctx->mgf1_md), ctx->saltlen);
3515
0
#endif /* !NO_RSA */
3516
3517
#ifndef NO_DSA
3518
     case WC_EVP_PKEY_DSA: {
3519
        int dsacheck = 0;
3520
        if (wolfSSL_DSA_do_verify(tbs, (unsigned char *)sig, ctx->pkey->dsa,
3521
            &dsacheck) != WOLFSSL_SUCCESS || dsacheck != 1)
3522
            return WOLFSSL_FAILURE;
3523
        return WOLFSSL_SUCCESS;
3524
     }
3525
#endif /* NO_DSA */
3526
3527
0
#ifdef HAVE_ECC
3528
0
    case WC_EVP_PKEY_EC: {
3529
0
        int ret;
3530
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
3531
0
            NULL, (const unsigned char **)&sig, (long)siglen);
3532
0
        if (ecdsaSig == NULL)
3533
0
            return WOLFSSL_FAILURE;
3534
0
        ret = wolfSSL_ECDSA_do_verify(tbs, (int)tbslen, ecdsaSig,
3535
0
            ctx->pkey->ecc);
3536
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
3537
0
        return ret;
3538
0
    }
3539
0
#endif /* HAVE_ECC */
3540
3541
0
    default:
3542
0
        return -2;
3543
0
    }
3544
0
}
3545
3546
/* Get the size in bits for WOLFSSL_EVP_PKEY key
3547
 *
3548
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3549
 *
3550
 * returns the size in bits of key on success
3551
 */
3552
int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey)
3553
0
{
3554
0
    int ret = 0;
3555
3556
0
    if (pkey == NULL)
3557
0
        return 0;
3558
3559
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
3560
3561
0
    switch (pkey->type) {
3562
0
#ifndef NO_RSA
3563
0
    case WC_EVP_PKEY_RSA:
3564
0
        ret = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3565
0
        break;
3566
0
#endif /* !NO_RSA */
3567
3568
#ifndef NO_DSA
3569
    case WC_EVP_PKEY_DSA:
3570
        if (pkey->dsa == NULL ||
3571
                (!pkey->dsa->exSet &&
3572
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3573
            break;
3574
        ret = wolfSSL_BN_num_bytes(pkey->dsa->p);
3575
        break;
3576
#endif
3577
3578
0
#ifdef HAVE_ECC
3579
0
    case WC_EVP_PKEY_EC:
3580
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3581
0
            WOLFSSL_MSG("No ECC key has been set");
3582
0
            break;
3583
0
        }
3584
0
        ret = wc_ecc_size((ecc_key*)(pkey->ecc->internal));
3585
0
        break;
3586
0
#endif /* HAVE_ECC */
3587
3588
0
    default:
3589
0
        break;
3590
0
    }
3591
0
    return ret > 0 ? ret * 8 : 0;
3592
0
}
3593
3594
3595
int wolfSSL_EVP_PKEY_paramgen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3596
0
{
3597
0
    (void)ctx;
3598
0
    return WOLFSSL_SUCCESS;
3599
0
}
3600
3601
int wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(WOLFSSL_EVP_PKEY_CTX *ctx,
3602
        int nid)
3603
0
{
3604
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid");
3605
0
#ifdef HAVE_ECC
3606
0
    if (ctx != NULL && ctx->pkey != NULL && ctx->pkey->type == WC_EVP_PKEY_EC) {
3607
0
        ctx->curveNID = nid;
3608
0
        return WOLFSSL_SUCCESS;
3609
0
    }
3610
0
    else
3611
0
#endif
3612
0
    {
3613
#ifndef HAVE_ECC
3614
        (void)ctx;
3615
        (void)nid;
3616
        WOLFSSL_MSG("Support not compiled in");
3617
#else
3618
0
        WOLFSSL_MSG("Bad parameter");
3619
0
#endif
3620
0
        return WOLFSSL_FAILURE;
3621
0
    }
3622
0
}
3623
3624
int wolfSSL_EVP_PKEY_paramgen(WOLFSSL_EVP_PKEY_CTX* ctx,
3625
                              WOLFSSL_EVP_PKEY** pkey)
3626
0
{
3627
0
    int ret = WOLFSSL_SUCCESS;
3628
0
    int ownPkey = 0;
3629
3630
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_paramgen");
3631
3632
0
    if (ctx == NULL || pkey == NULL) {
3633
0
        WOLFSSL_MSG("Bad parameter");
3634
0
        ret = WOLFSSL_FAILURE;
3635
0
    }
3636
3637
0
    if (ret == WOLFSSL_SUCCESS && *pkey == NULL) {
3638
        /* Only ECC is supported currently. */
3639
0
        if (ctx->pkey == NULL || ctx->pkey->type != WC_EVP_PKEY_EC) {
3640
0
            WOLFSSL_MSG("Key not set or key type not supported.");
3641
0
            ret = WOLFSSL_FAILURE;
3642
0
        }
3643
0
        else {
3644
0
            *pkey = wolfSSL_EVP_PKEY_new();
3645
0
            if (*pkey == NULL) {
3646
0
                WOLFSSL_MSG("Failed to create WOLFSSL_EVP_PKEY.");
3647
0
                ret = WOLFSSL_FAILURE;
3648
0
            }
3649
0
            else {
3650
0
                (*pkey)->type = ctx->pkey->type;
3651
0
                ownPkey = 1;
3652
0
            }
3653
0
        }
3654
0
    }
3655
0
    if (ret == WOLFSSL_SUCCESS) {
3656
0
        switch ((*pkey)->type) {
3657
0
        #ifdef HAVE_ECC
3658
            /* For ECC parameter generation we just need to set the group, which
3659
             * wolfSSL_EC_KEY_new_by_curve_name will do. */
3660
0
            case WC_EVP_PKEY_EC:
3661
0
                (*pkey)->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3662
0
                if ((*pkey)->ecc == NULL) {
3663
0
                    WOLFSSL_MSG("Failed to create WOLFSSL_EC_KEY.");
3664
0
                    ret = WOLFSSL_FAILURE;
3665
0
                }
3666
0
                else {
3667
0
                    (*pkey)->ownEcc = 1;
3668
0
                }
3669
0
                break;
3670
0
        #endif
3671
0
            default:
3672
0
                ret = WOLFSSL_FAILURE;
3673
0
                break;
3674
0
        }
3675
0
    }
3676
3677
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3678
0
        wolfSSL_EVP_PKEY_free(*pkey);
3679
0
        *pkey = NULL;
3680
0
    }
3681
3682
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_paramgen", ret);
3683
3684
0
    return ret;
3685
0
}
3686
3687
/* wolfSSL only supports writing out named curves so no need to store the flag.
3688
 * In short, it is preferred to write out the name of the curve chosen instead
3689
 * of the explicit parameters.
3690
 * The difference is nicely explained and illustrated in section
3691
 * "ECDH and Named Curves" of
3692
 * https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman */
3693
int wolfSSL_EVP_PKEY_CTX_set_ec_param_enc(WOLFSSL_EVP_PKEY_CTX *ctx,
3694
        int flag)
3695
0
{
3696
0
    (void)ctx;
3697
0
    (void)flag;
3698
0
    return WOLFSSL_SUCCESS;
3699
0
}
3700
3701
int wolfSSL_EVP_PKEY_keygen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
3702
0
{
3703
0
    (void)ctx;
3704
0
    return WOLFSSL_SUCCESS;
3705
0
}
3706
3707
int wolfSSL_EVP_PKEY_keygen(WOLFSSL_EVP_PKEY_CTX *ctx,
3708
  WOLFSSL_EVP_PKEY **ppkey)
3709
0
{
3710
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
3711
0
    int ownPkey = 0;
3712
0
    WOLFSSL_EVP_PKEY* pkey;
3713
3714
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_keygen");
3715
3716
0
    if (ctx == NULL || ppkey == NULL) {
3717
0
        return WOLFSSL_FAILURE;
3718
0
    }
3719
3720
0
    pkey = *ppkey;
3721
0
    if (pkey == NULL) {
3722
0
        if (ctx->pkey == NULL ||
3723
0
                (ctx->pkey->type != WC_EVP_PKEY_EC &&
3724
0
                 ctx->pkey->type != WC_EVP_PKEY_RSA &&
3725
0
                 ctx->pkey->type != WC_EVP_PKEY_DH)) {
3726
0
            WOLFSSL_MSG("Key not set or key type not supported");
3727
0
            return WOLFSSL_FAILURE;
3728
0
        }
3729
0
        pkey = wolfSSL_EVP_PKEY_new();
3730
0
        if (pkey == NULL) {
3731
0
            return MEMORY_E;
3732
0
        }
3733
0
        ownPkey = 1;
3734
0
        pkey->type = ctx->pkey->type;
3735
0
    }
3736
3737
0
    switch (pkey->type) {
3738
0
#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
3739
0
        case WC_EVP_PKEY_RSA:
3740
0
            pkey->rsa = wolfSSL_RSA_generate_key(ctx->nbits, WC_RSA_EXPONENT,
3741
0
                NULL, NULL);
3742
0
            if (pkey->rsa) {
3743
0
                pkey->ownRsa = 1;
3744
0
                pkey->pkey_sz = wolfSSL_i2d_RSAPrivateKey(pkey->rsa,
3745
0
                        (unsigned char**)&pkey->pkey.ptr);
3746
0
                ret = WOLFSSL_SUCCESS;
3747
0
            }
3748
0
            break;
3749
0
#endif
3750
0
#ifdef HAVE_ECC
3751
0
        case WC_EVP_PKEY_EC:
3752
            /* pkey->ecc may not be NULL, if, for example, it was populated by a
3753
             * prior call to wolfSSL_EVP_PKEY_paramgen. */
3754
0
            if (pkey->ecc == NULL) {
3755
0
                pkey->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
3756
0
            }
3757
0
            if (pkey->ecc) {
3758
0
                ret = wolfSSL_EC_KEY_generate_key(pkey->ecc);
3759
0
                if (ret == WOLFSSL_SUCCESS) {
3760
0
                    pkey->ownEcc = 1;
3761
0
                }
3762
0
            }
3763
0
            break;
3764
0
#endif
3765
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
3766
0
        case WC_EVP_PKEY_DH:
3767
0
            pkey->dh = wolfSSL_DH_new();
3768
0
            if (pkey->dh) {
3769
0
                pkey->ownDh = 1;
3770
                /* load DH params from CTX */
3771
0
                ret = wolfSSL_DH_LoadDer(pkey->dh,
3772
0
                        (const unsigned char*)ctx->pkey->pkey.ptr,
3773
0
                        ctx->pkey->pkey_sz);
3774
0
                if (ret == WOLFSSL_SUCCESS) {
3775
0
                    ret = wolfSSL_DH_generate_key(pkey->dh);
3776
0
                }
3777
0
                if (ret == WOLFSSL_SUCCESS) {
3778
                    /* copy private/public key from external to internal */
3779
0
                    ret = SetDhInternal(pkey->dh);
3780
0
                }
3781
0
            }
3782
0
            break;
3783
0
#endif
3784
0
        default:
3785
0
            break;
3786
0
    }
3787
3788
0
    if (ret != WOLFSSL_SUCCESS && ownPkey) {
3789
0
        wolfSSL_EVP_PKEY_free(pkey);
3790
0
        pkey = NULL;
3791
0
    }
3792
3793
0
    *ppkey = pkey;
3794
3795
0
    return ret;
3796
0
}
3797
3798
/* Get the maximum suitable size for the operations that can be done with pkey
3799
 *
3800
 * pkey WOLFSSL_EVP_PKEY structure to get key size of
3801
 *
3802
 * returns the recommended size of buffers
3803
 */
3804
int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
3805
0
{
3806
0
    if (pkey == NULL) return 0;
3807
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_size");
3808
3809
0
    switch (pkey->type) {
3810
0
#ifndef NO_RSA
3811
0
    case WC_EVP_PKEY_RSA:
3812
0
        return (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3813
0
#endif /* !NO_RSA */
3814
3815
#ifndef NO_DSA
3816
    case WC_EVP_PKEY_DSA:
3817
        if (pkey->dsa == NULL ||
3818
                (!pkey->dsa->exSet &&
3819
                        SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3820
            return WOLFSSL_FAILURE;
3821
        return wolfSSL_BN_num_bytes(pkey->dsa->p);
3822
#endif
3823
3824
0
#ifdef HAVE_ECC
3825
0
    case WC_EVP_PKEY_EC:
3826
0
        if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3827
0
            WOLFSSL_MSG("No ECC key has been set");
3828
0
            break;
3829
0
        }
3830
0
        return wc_ecc_sig_size((ecc_key*)(pkey->ecc->internal));
3831
0
#endif /* HAVE_ECC */
3832
3833
0
    default:
3834
0
        break;
3835
0
    }
3836
0
    return 0;
3837
0
}
3838
3839
3840
int wolfSSL_EVP_PKEY_copy_parameters(WOLFSSL_EVP_PKEY *to,
3841
        const WOLFSSL_EVP_PKEY *from)
3842
0
{
3843
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_copy_parameters");
3844
3845
0
    if (!to || !from) {
3846
0
        WOLFSSL_MSG("Bad parameter");
3847
0
        return WOLFSSL_FAILURE;
3848
0
    }
3849
3850
0
    if (to->type == WC_EVP_PKEY_NONE) {
3851
0
        to->type = from->type;
3852
0
    }
3853
0
    else if (to->type != from->type) {
3854
0
        WOLFSSL_MSG("Different key types");
3855
0
        return WOLFSSL_FAILURE;
3856
0
    }
3857
3858
0
    switch(from->type) {
3859
0
#ifdef HAVE_ECC
3860
0
    case WC_EVP_PKEY_EC:
3861
0
        if (from->ecc) {
3862
0
            if (!to->ecc) {
3863
0
                if ((to->ecc = wolfSSL_EC_KEY_new()) == NULL) {
3864
0
                    WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
3865
0
                    return WOLFSSL_FAILURE;
3866
0
                }
3867
0
                to->ownEcc = 1;
3868
0
            }
3869
0
            to->ecc->group->curve_idx = from->ecc->group->curve_idx;
3870
0
            to->ecc->group->curve_nid = from->ecc->group->curve_nid;
3871
0
            to->ecc->group->curve_oid = from->ecc->group->curve_oid;
3872
0
        }
3873
0
        else {
3874
0
            WOLFSSL_MSG("Missing ECC struct");
3875
0
            return WOLFSSL_FAILURE;
3876
0
        }
3877
0
        break;
3878
0
#endif
3879
#ifndef NO_DSA
3880
    case WC_EVP_PKEY_DSA:
3881
        if (from->dsa) {
3882
            WOLFSSL_BIGNUM* cpy;
3883
            if (!to->dsa) {
3884
                if ((to->dsa = wolfSSL_DSA_new()) == NULL) {
3885
                    WOLFSSL_MSG("wolfSSL_DSA_new error");
3886
                    return WOLFSSL_FAILURE;
3887
                }
3888
                to->ownDsa = 1;
3889
            }
3890
3891
            /* free existing BIGNUMs if needed before copying over new */
3892
            wolfSSL_BN_free(to->dsa->p);
3893
            wolfSSL_BN_free(to->dsa->g);
3894
            wolfSSL_BN_free(to->dsa->q);
3895
            to->dsa->p = NULL;
3896
            to->dsa->g = NULL;
3897
            to->dsa->q = NULL;
3898
3899
            if (!(cpy = wolfSSL_BN_dup(from->dsa->p))) {
3900
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3901
                return WOLFSSL_FAILURE;
3902
            }
3903
            to->dsa->p = cpy;
3904
            if (!(cpy = wolfSSL_BN_dup(from->dsa->q))) {
3905
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3906
                return WOLFSSL_FAILURE;
3907
            }
3908
            to->dsa->q = cpy;
3909
            if (!(cpy = wolfSSL_BN_dup(from->dsa->g))) {
3910
                WOLFSSL_MSG("wolfSSL_BN_dup error");
3911
                return WOLFSSL_FAILURE;
3912
            }
3913
            to->dsa->g = cpy;
3914
        }
3915
        else {
3916
            WOLFSSL_MSG("Missing DSA struct");
3917
            return WOLFSSL_FAILURE;
3918
        }
3919
        break;
3920
#endif
3921
0
#ifndef NO_DH
3922
0
    case WC_EVP_PKEY_DH:
3923
0
        if (from->dh) {
3924
0
            WOLFSSL_BIGNUM* cpy;
3925
0
            if (!to->dh) {
3926
0
                if ((to->dh = wolfSSL_DH_new()) == NULL) {
3927
0
                    WOLFSSL_MSG("wolfSSL_DH_new error");
3928
0
                    return WOLFSSL_FAILURE;
3929
0
                }
3930
0
                to->ownDh = 1;
3931
0
            }
3932
3933
            /* free existing BIGNUMs if needed before copying over new */
3934
0
            wolfSSL_BN_free(to->dh->p);
3935
0
            wolfSSL_BN_free(to->dh->g);
3936
0
            wolfSSL_BN_free(to->dh->q);
3937
0
            to->dh->p = NULL;
3938
0
            to->dh->g = NULL;
3939
0
            to->dh->q = NULL;
3940
3941
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->p))) {
3942
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH p");
3943
0
                return WOLFSSL_FAILURE;
3944
0
            }
3945
0
            to->dh->p = cpy;
3946
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->g))) {
3947
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH g");
3948
0
                return WOLFSSL_FAILURE;
3949
0
            }
3950
0
            to->dh->g = cpy;
3951
0
            if (!(cpy = wolfSSL_BN_dup(from->dh->q))) {
3952
0
                WOLFSSL_MSG("wolfSSL_BN_dup error, DH q");
3953
0
                return WOLFSSL_FAILURE;
3954
0
            }
3955
0
            to->dh->q = cpy;
3956
0
        }
3957
0
        else {
3958
0
            WOLFSSL_MSG("Missing DH struct");
3959
0
            return WOLFSSL_FAILURE;
3960
0
        }
3961
0
        break;
3962
0
#endif
3963
0
#ifndef NO_RSA
3964
0
    case WC_EVP_PKEY_RSA:
3965
0
#endif
3966
0
    default:
3967
0
        WOLFSSL_MSG("Copy parameters not available for this key type");
3968
0
        return WOLFSSL_FAILURE;
3969
0
    }
3970
3971
0
    return WOLFSSL_SUCCESS;
3972
0
}
3973
3974
#ifndef NO_WOLFSSL_STUB
3975
int wolfSSL_EVP_PKEY_missing_parameters(WOLFSSL_EVP_PKEY *pkey)
3976
0
{
3977
0
    (void)pkey;
3978
    /* not using missing params callback and returning zero to indicate success */
3979
0
    return 0;
3980
0
}
3981
#endif
3982
3983
/* wolfSSL_EVP_PKEY_cmp
3984
 * returns 0 on success, -1 on failure.
3985
 *
3986
 * This behavior is different from openssl.
3987
 *  EVP_PKEY_cmp returns:
3988
 *    1 : two keys match
3989
 *    0 : do not match
3990
 *    -1: key types are different
3991
 *    -2: the operation is not supported
3992
 * If you want this function behave the same as openSSL,
3993
 * define WOLFSSL_ERROR_CODE_OPENSSL so that WS_RETURN_CODE translates return
3994
 * codes to match OpenSSL equivalent behavior.
3995
 */
3996
int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
3997
0
{
3998
0
    int ret = -1; /* failure */
3999
4000
0
    if (a == NULL || b == NULL)
4001
0
        return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4002
4003
    /* check its the same type of key */
4004
0
    if (a->type != b->type)
4005
0
        return WS_RETURN_CODE(ret, -1);
4006
4007
    /* get size based on key type */
4008
0
    switch (a->type) {
4009
0
#ifndef NO_RSA
4010
0
    case WC_EVP_PKEY_RSA:
4011
0
        if (wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa)) <= 0 ||
4012
0
                wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa)) <= 0) {
4013
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4014
0
        }
4015
4016
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->n,
4017
0
                   &((RsaKey*)b->rsa->internal)->n) != MP_EQ) {
4018
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4019
0
        }
4020
4021
0
        if (mp_cmp(&((RsaKey*)a->rsa->internal)->e,
4022
0
                   &((RsaKey*)b->rsa->internal)->e) != MP_EQ) {
4023
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4024
0
        }
4025
0
        break;
4026
0
#endif /* !NO_RSA */
4027
0
#ifdef HAVE_ECC
4028
0
    case WC_EVP_PKEY_EC:
4029
0
        if (a->ecc == NULL || a->ecc->internal == NULL ||
4030
0
            b->ecc == NULL || b->ecc->internal == NULL ||
4031
0
            wc_ecc_size((ecc_key*)a->ecc->internal) <= 0 ||
4032
0
            wc_ecc_size((ecc_key*)b->ecc->internal) <= 0 ||
4033
0
            a->ecc->group == NULL || b->ecc->group == NULL) {
4034
0
            return ret;
4035
0
        }
4036
4037
        /* check curve */
4038
0
        if (a->ecc->group->curve_idx != b->ecc->group->curve_idx) {
4039
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4040
0
        }
4041
4042
0
        if (wc_ecc_cmp_point(&((ecc_key*)a->ecc->internal)->pubkey,
4043
0
                             &((ecc_key*)b->ecc->internal)->pubkey) != 0) {
4044
0
            return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
4045
0
        }
4046
0
        break;
4047
0
#endif /* HAVE_ECC */
4048
0
    default:
4049
0
        return WS_RETURN_CODE(ret, -2);
4050
0
    } /* switch (a->type) */
4051
4052
0
#if defined(WOLFSSL_ERROR_CODE_OPENSSL)
4053
0
    ret = 1; /* the keys match */
4054
#else
4055
    ret = 0; /* success */
4056
#endif
4057
0
    return ret;
4058
0
}
4059
4060
/**
4061
 * validate DH algorithm parameters
4062
 * @param dh_key  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4063
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4064
 */
4065
static int DH_param_check(WOLFSSL_DH* dh_key)
4066
0
{
4067
0
    int ret = WOLFSSL_SUCCESS;
4068
0
    WOLFSSL_BIGNUM *num1 = NULL;
4069
0
    WOLFSSL_BIGNUM *num2 = NULL;
4070
4071
0
    WOLFSSL_ENTER("DH_param_check");
4072
4073
0
    num1 = wolfSSL_BN_new();
4074
0
    num2 = wolfSSL_BN_new();
4075
0
    if (num1 == NULL || num2 == NULL) {
4076
0
        WOLFSSL_MSG("failed to assign big number");
4077
0
        ret = WOLFSSL_FAILURE;
4078
0
    }
4079
4080
    /* prime check */
4081
0
    if (ret == WOLFSSL_SUCCESS &&
4082
0
        wolfSSL_BN_is_odd(dh_key->p) == 0){
4083
0
        WOLFSSL_MSG("dh_key->p is not prime");
4084
0
        ret = WOLFSSL_FAILURE;
4085
0
    } /* TODO safe prime check. need BN_rshift1 */
4086
4087
    /* generator check */
4088
0
    if (ret == WOLFSSL_SUCCESS &&
4089
0
       (wolfSSL_BN_is_one(dh_key->g) ||
4090
0
        wolfSSL_BN_is_negative(dh_key->g) ||
4091
0
        wolfSSL_BN_is_zero(dh_key->g))) {
4092
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4093
0
        ret = WOLFSSL_FAILURE;
4094
0
    }
4095
4096
0
    if (ret == WOLFSSL_SUCCESS &&
4097
0
        wolfSSL_BN_cmp(dh_key->p, dh_key->g) <= 0) {
4098
0
        WOLFSSL_MSG("dh_key->g is not suitable generator");
4099
0
        ret = WOLFSSL_FAILURE;
4100
0
    }
4101
4102
0
    if (ret == WOLFSSL_SUCCESS &&
4103
0
        dh_key->q != NULL)
4104
0
    {
4105
0
        if (ret == WOLFSSL_SUCCESS &&
4106
0
            wolfSSL_BN_mod_exp(num1, dh_key->g, dh_key->q, dh_key->p, NULL)
4107
0
               == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
4108
0
        {
4109
0
            WOLFSSL_MSG("BN_mod_exp failed");
4110
0
            ret = WOLFSSL_FAILURE;
4111
0
        }
4112
0
        else
4113
0
            if (ret == WOLFSSL_SUCCESS &&
4114
0
                wolfSSL_BN_is_one(num1) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4115
0
                WOLFSSL_MSG("dh_key->g is not suitable generator");
4116
0
                ret = WOLFSSL_FAILURE;
4117
0
            }
4118
0
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
4119
        /* test if the number q is prime. */
4120
0
        if (ret == WOLFSSL_SUCCESS &&
4121
0
            (wolfSSL_BN_is_prime_ex(dh_key->q, 64, NULL, NULL) <= 0)) {
4122
0
            WOLFSSL_MSG("dh_key->q is not prime or error during check.");
4123
0
            ret = WOLFSSL_FAILURE;
4124
0
        } /* else TODO check q div q - 1. need BN_div */
4125
0
#endif
4126
0
    }
4127
4128
    /* clean up */
4129
0
    wolfSSL_BN_free(num1);
4130
0
    wolfSSL_BN_free(num2);
4131
4132
0
    WOLFSSL_LEAVE("DH_param_check", WOLFSSL_SUCCESS);
4133
0
    return ret;
4134
0
}
4135
/**
4136
 * validate the algorithm parameters
4137
 * @param ctx  a pointer to WOLFSSL_EVP_PKEY_CTX structure
4138
 * @return WOLFSSL_SUCCESS on success, otherwise failure
4139
 */
4140
int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx)
4141
0
{
4142
0
    int type;
4143
0
    int ret;
4144
0
    WOLFSSL_DH* dh_key = NULL;
4145
4146
    /* sanity check */
4147
0
    if (ctx == NULL) {
4148
0
        return WOLFSSL_FAILURE;
4149
0
    }
4150
4151
0
    type = wolfSSL_EVP_PKEY_type(wolfSSL_EVP_PKEY_base_id(ctx->pkey));
4152
0
    switch (type) {
4153
0
        #if !defined(NO_RSA)
4154
0
            case WC_EVP_PKEY_RSA:
4155
0
                WOLFSSL_MSG("WC_EVP_PKEY_RSA not yet implemented");
4156
0
                return WOLFSSL_FAILURE;
4157
0
        #endif
4158
0
        #if defined(HAVE_ECC)
4159
0
            case WC_EVP_PKEY_EC:
4160
0
                WOLFSSL_MSG("WC_EVP_PKEY_EC not yet implemented");
4161
0
                return WOLFSSL_FAILURE;
4162
0
        #endif
4163
        #if !defined(NO_DSA)
4164
            case WC_EVP_PKEY_DSA:
4165
                WOLFSSL_MSG("WC_EVP_PKEY_DSA not yet implemented");
4166
                return WOLFSSL_FAILURE;
4167
        #endif
4168
0
        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
4169
0
        #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
4170
0
            case WC_EVP_PKEY_DH:
4171
0
                dh_key = wolfSSL_EVP_PKEY_get1_DH(ctx->pkey);
4172
0
                if (dh_key != NULL) {
4173
0
                    ret = DH_param_check(dh_key);
4174
0
                    wolfSSL_DH_free(dh_key);
4175
0
                }
4176
0
                else
4177
0
                    ret = WOLFSSL_FAILURE;
4178
0
            return ret;
4179
0
        #endif
4180
0
        #endif
4181
0
        default:
4182
0
            WOLFSSL_MSG("Unknown PKEY type");
4183
0
            break;
4184
0
    }
4185
4186
0
    (void)ret;
4187
0
    (void)DH_param_check;
4188
0
    (void)dh_key;
4189
0
    return WOLFSSL_FAILURE;
4190
0
}
4191
4192
/* Initialize structure for signing
4193
 *
4194
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4195
 * type is the type of message digest to use
4196
 *
4197
 * returns WOLFSSL_SUCCESS on success
4198
 */
4199
int wolfSSL_EVP_SignInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4200
0
{
4201
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4202
0
    WOLFSSL_ENTER("EVP_SignInit");
4203
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4204
0
}
4205
4206
int wolfSSL_EVP_SignInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
4207
                                     const WOLFSSL_EVP_MD* type,
4208
                                     WOLFSSL_ENGINE *impl)
4209
0
{
4210
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4211
0
    WOLFSSL_ENTER("EVP_SignInit");
4212
0
    return wolfSSL_EVP_DigestInit_ex(ctx,type,impl);
4213
0
}
4214
4215
4216
/* Update structure with data for signing
4217
 *
4218
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4219
 * data buffer holding data to update with for sign
4220
 * len  length of data buffer
4221
 *
4222
 * returns WOLFSSL_SUCCESS on success
4223
 */
4224
int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4225
0
{
4226
0
    if (ctx == NULL) return 0;
4227
0
    WOLFSSL_ENTER("EVP_SignUpdate(");
4228
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4229
0
}
4230
static const WOLFSSL_EVP_MD* wolfSSL_macType2EVP_md(enum wc_HashType type)
4231
0
{
4232
0
    const struct s_ent *ent ;
4233
4234
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
4235
0
        if (ent->macType == type) {
4236
0
            return ent->name;
4237
0
        }
4238
0
    }
4239
0
    return NULL;
4240
0
}
4241
4242
/* Finalize structure for signing
4243
 *
4244
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4245
 * sigret buffer to hold resulting signature
4246
 * siglen length of sigret buffer
4247
 * pkey   key to sign with
4248
 *
4249
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4250
 */
4251
int wolfSSL_EVP_SignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sigret,
4252
                  unsigned int *siglen, WOLFSSL_EVP_PKEY *pkey)
4253
0
{
4254
0
    unsigned int mdsize;
4255
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4256
0
    int ret;
4257
0
    (void)sigret;
4258
0
    (void)siglen;
4259
4260
0
    WOLFSSL_ENTER("EVP_SignFinal");
4261
0
    if (ctx == NULL || sigret == NULL || siglen == NULL || pkey == NULL)
4262
0
        return WOLFSSL_FAILURE;
4263
4264
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4265
0
    if (ret <= 0)
4266
0
        return ret;
4267
4268
0
    switch (pkey->type) {
4269
0
#if !defined(NO_RSA)
4270
0
    case WC_EVP_PKEY_RSA: {
4271
0
        int nid;
4272
0
        const WOLFSSL_EVP_MD *ctxmd;
4273
4274
0
        ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4275
0
        if (ctxmd == NULL)
4276
0
            return WOLFSSL_FAILURE;
4277
4278
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4279
0
        if (nid < 0)
4280
0
            return WOLFSSL_FAILURE;
4281
0
        return wolfSSL_RSA_sign(nid, md, mdsize, sigret,
4282
0
                                siglen, pkey->rsa);
4283
0
    }
4284
0
#endif /* NO_RSA */
4285
#ifndef NO_DSA
4286
    case WC_EVP_PKEY_DSA: {
4287
        int bytes;
4288
        ret = wolfSSL_DSA_do_sign(md, sigret, pkey->dsa);
4289
        /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
4290
        if (ret != WOLFSSL_SUCCESS)
4291
            return ret;
4292
        bytes = wolfSSL_BN_num_bytes(pkey->dsa->q);
4293
        if (bytes == WC_NO_ERR_TRACE(WOLFSSL_FAILURE) ||
4294
            (int)*siglen < bytes * 2)
4295
        {
4296
            return WOLFSSL_FAILURE;
4297
        }
4298
        *siglen = (unsigned int)(bytes * 2);
4299
        return WOLFSSL_SUCCESS;
4300
    }
4301
#endif
4302
0
#ifdef HAVE_ECC
4303
0
    case WC_EVP_PKEY_EC: {
4304
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_ECDSA_do_sign(md, (int)mdsize,
4305
0
                pkey->ecc);
4306
0
        if (ecdsaSig == NULL)
4307
0
            return WOLFSSL_FAILURE;
4308
        /* get signature length only */
4309
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4310
0
        if (ret <= 0 || ret > (int)*siglen) {
4311
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4312
0
            return WOLFSSL_FAILURE;
4313
0
        }
4314
        /* perform validation of signature */
4315
0
        ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sigret);
4316
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4317
0
        if (ret <= 0 || ret > (int)*siglen)
4318
0
            return WOLFSSL_FAILURE;
4319
0
        *siglen = (unsigned int)ret;
4320
0
        return WOLFSSL_SUCCESS;
4321
0
    }
4322
0
#endif
4323
0
    default:
4324
0
        break;
4325
0
    }
4326
0
    return WOLFSSL_FAILURE;
4327
0
}
4328
4329
4330
/* Initialize structure for verifying signature
4331
 *
4332
 * ctx  WOLFSSL_EVP_MD_CTX structure to initialize
4333
 * type is the type of message digest to use
4334
 *
4335
 * returns WOLFSSL_SUCCESS on success
4336
 */
4337
int wolfSSL_EVP_VerifyInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
4338
0
{
4339
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4340
0
    WOLFSSL_ENTER("EVP_VerifyInit");
4341
0
    return wolfSSL_EVP_DigestInit(ctx,type);
4342
0
}
4343
4344
4345
/* Update structure for verifying signature
4346
 *
4347
 * ctx  WOLFSSL_EVP_MD_CTX structure to update
4348
 * data buffer holding data to update with for verify
4349
 * len  length of data buffer
4350
 *
4351
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4352
 */
4353
int wolfSSL_EVP_VerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
4354
0
{
4355
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4356
0
    WOLFSSL_ENTER("EVP_VerifyUpdate");
4357
0
    return wolfSSL_EVP_DigestUpdate(ctx, data, len);
4358
0
}
4359
4360
4361
/* Finalize structure for verifying signature
4362
 *
4363
 * ctx    WOLFSSL_EVP_MD_CTX structure to finalize
4364
 * sig    buffer holding signature
4365
 * siglen length of sig buffer
4366
 * pkey   key to verify with
4367
 *
4368
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
4369
 */
4370
int wolfSSL_EVP_VerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4371
        const unsigned char*sig, unsigned int siglen, WOLFSSL_EVP_PKEY *pkey)
4372
0
{
4373
0
    int ret;
4374
0
    unsigned char md[WC_MAX_DIGEST_SIZE];
4375
0
    unsigned int mdsize;
4376
4377
0
    if (ctx == NULL) return WOLFSSL_FAILURE;
4378
0
    WOLFSSL_ENTER("EVP_VerifyFinal");
4379
0
    ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
4380
0
    if (ret <= 0)
4381
0
        return ret;
4382
4383
0
    (void)sig;
4384
0
    (void)siglen;
4385
4386
0
    switch (pkey->type) {
4387
0
#if !defined(NO_RSA)
4388
0
    case WC_EVP_PKEY_RSA: {
4389
0
        int nid;
4390
0
        const WOLFSSL_EVP_MD *ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
4391
0
        if (ctxmd == NULL) break;
4392
0
        nid = wolfSSL_EVP_MD_type(ctxmd);
4393
0
        if (nid < 0) break;
4394
0
        return wolfSSL_RSA_verify(nid, md, mdsize, sig,
4395
0
                (unsigned int)siglen, pkey->rsa);
4396
0
    }
4397
0
#endif /* NO_RSA */
4398
0
#ifdef HAVE_ECC
4399
0
    case WC_EVP_PKEY_EC: {
4400
0
        WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
4401
0
            NULL, (const unsigned char **)&sig, (long)siglen);
4402
0
        if (ecdsaSig == NULL)
4403
0
            return WOLFSSL_FAILURE;
4404
0
        ret = wolfSSL_ECDSA_do_verify(md, (int)mdsize, ecdsaSig,
4405
0
            pkey->ecc);
4406
0
        wolfSSL_ECDSA_SIG_free(ecdsaSig);
4407
0
        return ret;
4408
0
    }
4409
0
#endif
4410
0
    case WC_EVP_PKEY_DSA:
4411
0
        WOLFSSL_MSG("not implemented");
4412
0
        FALL_THROUGH;
4413
0
    default:
4414
0
        break;
4415
0
    }
4416
0
    return WOLFSSL_FAILURE;
4417
0
}
4418
4419
int wolfSSL_EVP_add_cipher(const WOLFSSL_EVP_CIPHER *cipher)
4420
0
{
4421
    /* nothing to do */
4422
0
    if (cipher == NULL)
4423
0
        return WOLFSSL_FAILURE;
4424
0
    return WOLFSSL_SUCCESS;
4425
0
}
4426
4427
4428
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_mac_key(int type, WOLFSSL_ENGINE* e,
4429
                                          const unsigned char* key, int keylen)
4430
517
{
4431
517
    WOLFSSL_EVP_PKEY* pkey;
4432
4433
517
    (void)e;
4434
4435
517
    if (type != WC_EVP_PKEY_HMAC || (key == NULL && keylen != 0))
4436
0
        return NULL;
4437
4438
517
    pkey = wolfSSL_EVP_PKEY_new();
4439
517
    if (pkey != NULL) {
4440
517
        pkey->pkey.ptr = (char*)XMALLOC((size_t)keylen, NULL,
4441
517
            DYNAMIC_TYPE_PUBLIC_KEY);
4442
517
        if (pkey->pkey.ptr == NULL && keylen > 0) {
4443
0
            wolfSSL_EVP_PKEY_free(pkey);
4444
0
            pkey = NULL;
4445
0
        }
4446
517
        else {
4447
517
            if (keylen) {
4448
347
                XMEMCPY(pkey->pkey.ptr, key, (size_t)keylen);
4449
347
            }
4450
517
            pkey->pkey_sz = keylen;
4451
517
            pkey->type = pkey->save_type = type;
4452
517
        }
4453
517
    }
4454
4455
517
    return pkey;
4456
517
}
4457
4458
4459
#if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT)
4460
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_CMAC_key(WOLFSSL_ENGINE* e,
4461
        const unsigned char* priv, size_t len, const WOLFSSL_EVP_CIPHER *cipher)
4462
0
{
4463
0
    WOLFSSL_EVP_PKEY* pkey;
4464
0
    WOLFSSL_CMAC_CTX* ctx;
4465
0
    int ret = 0;
4466
4467
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_CMAC_key");
4468
4469
0
    if (priv == NULL || len == 0 || cipher == NULL) {
4470
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", BAD_FUNC_ARG);
4471
0
        return NULL;
4472
0
    }
4473
4474
0
    ctx = wolfSSL_CMAC_CTX_new();
4475
0
    if (ctx == NULL) {
4476
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4477
0
        return NULL;
4478
0
    }
4479
4480
0
    ret = wolfSSL_CMAC_Init(ctx, priv, len, cipher, e);
4481
0
    if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
4482
0
        wolfSSL_CMAC_CTX_free(ctx);
4483
0
        WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4484
0
        return NULL;
4485
0
    }
4486
4487
0
    pkey = wolfSSL_EVP_PKEY_new();
4488
0
    if (pkey != NULL) {
4489
0
        pkey->pkey.ptr = (char*)XMALLOC((size_t)len, NULL,
4490
0
            DYNAMIC_TYPE_PUBLIC_KEY);
4491
0
        if (pkey->pkey.ptr == NULL && len > 0) {
4492
0
            wolfSSL_EVP_PKEY_free(pkey);
4493
0
            pkey = NULL;
4494
0
            wolfSSL_CMAC_CTX_free(ctx);
4495
0
        }
4496
0
        else {
4497
0
            if (len) {
4498
0
                XMEMCPY(pkey->pkey.ptr, priv, (size_t)len);
4499
0
            }
4500
0
            pkey->pkey_sz = (int)len;
4501
0
            pkey->type = pkey->save_type = WC_EVP_PKEY_CMAC;
4502
0
            pkey->cmacCtx = ctx;
4503
0
        }
4504
0
    }
4505
0
    else {
4506
0
        wolfSSL_CMAC_CTX_free(ctx);
4507
0
    }
4508
4509
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
4510
0
    return pkey;
4511
0
}
4512
#endif /* defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) */
4513
4514
const unsigned char* wolfSSL_EVP_PKEY_get0_hmac(const WOLFSSL_EVP_PKEY* pkey,
4515
                                                size_t* len)
4516
482
{
4517
482
    if (pkey == NULL || len == NULL)
4518
0
        return NULL;
4519
4520
482
    *len = (size_t)pkey->pkey_sz;
4521
4522
482
    return (const unsigned char*)pkey->pkey.ptr;
4523
482
}
4524
4525
static int wolfssl_evp_md_to_hash_type(const WOLFSSL_EVP_MD *type,
4526
    int* hashType)
4527
622
{
4528
622
    int ret = 0;
4529
4530
622
#ifndef NO_SHA256
4531
622
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
4532
66
        *hashType = WC_SHA256;
4533
66
    }
4534
556
    else
4535
556
#endif
4536
556
#ifndef NO_SHA
4537
556
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
4538
112
        *hashType = WC_SHA;
4539
112
    }
4540
444
    else
4541
444
#endif /* NO_SHA */
4542
444
#ifdef WOLFSSL_SHA224
4543
444
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
4544
142
        *hashType = WC_SHA224;
4545
142
    }
4546
302
    else
4547
302
#endif
4548
302
#ifdef WOLFSSL_SHA384
4549
302
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
4550
75
        *hashType = WC_SHA384;
4551
75
    }
4552
227
    else
4553
227
#endif
4554
227
#ifdef WOLFSSL_SHA512
4555
227
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
4556
116
        *hashType = WC_SHA512;
4557
116
    }
4558
111
    else
4559
111
#endif
4560
111
#ifdef WOLFSSL_SHA3
4561
111
    #ifndef WOLFSSL_NOSHA3_224
4562
111
        if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
4563
0
            *hashType = WC_SHA3_224;
4564
0
        }
4565
111
        else
4566
111
    #endif
4567
111
    #ifndef WOLFSSL_NOSHA3_256
4568
111
        if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
4569
0
            *hashType = WC_SHA3_256;
4570
0
        }
4571
111
        else
4572
111
    #endif
4573
111
    #ifndef WOLFSSL_NOSHA3_384
4574
111
        if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
4575
0
            *hashType = WC_SHA3_384;
4576
0
        }
4577
111
        else
4578
111
    #endif
4579
111
    #ifndef WOLFSSL_NOSHA3_512
4580
111
        if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
4581
0
            *hashType = WC_SHA3_512;
4582
0
        }
4583
111
        else
4584
111
    #endif
4585
111
#endif
4586
111
#ifdef WOLFSSL_SM3
4587
111
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
4588
0
        *hashType = WC_SM3;
4589
0
    }
4590
111
    else
4591
111
#endif
4592
111
#ifndef NO_MD5
4593
111
    if (XSTRCMP(type, WC_SN_md5) == 0) {
4594
66
        *hashType = WC_MD5;
4595
66
    }
4596
45
    else
4597
45
#endif
4598
45
    {
4599
45
        ret = BAD_FUNC_ARG;
4600
45
    }
4601
4602
622
    return ret;
4603
622
}
4604
4605
/* Initialize an EVP_DigestSign/Verify operation.
4606
 * Initialize a digest for RSA and ECC keys, or HMAC for HMAC key.
4607
 */
4608
static int wolfSSL_evp_digest_pk_init(WOLFSSL_EVP_MD_CTX *ctx,
4609
                                      WOLFSSL_EVP_PKEY_CTX **pctx,
4610
                                      const WOLFSSL_EVP_MD *type,
4611
                                      WOLFSSL_ENGINE *e,
4612
                                      WOLFSSL_EVP_PKEY *pkey)
4613
517
{
4614
517
    if (!type) {
4615
0
        int default_digest;
4616
0
        if (wolfSSL_EVP_PKEY_get_default_digest_nid(pkey, &default_digest)
4617
0
                != WOLFSSL_SUCCESS) {
4618
0
            WOLFSSL_MSG("Could not get default digest");
4619
0
            return WOLFSSL_FAILURE;
4620
0
        }
4621
0
        type = wolfSSL_EVP_get_digestbynid(default_digest);
4622
0
        if (type == NULL) {
4623
0
            return WOLFSSL_FAILURE;
4624
0
        }
4625
0
    }
4626
4627
517
    if (pkey->type == WC_EVP_PKEY_HMAC) {
4628
517
        int hashType;
4629
517
        int ret;
4630
517
        size_t keySz = 0;
4631
517
        const unsigned char* key;
4632
4633
517
        ret = wolfssl_evp_md_to_hash_type(type, &hashType);
4634
517
        if (ret != 0) {
4635
35
             return ret;
4636
35
        }
4637
4638
482
        key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz);
4639
482
        if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0)
4640
0
            return WOLFSSL_FAILURE;
4641
4642
482
        if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0)
4643
0
            return WOLFSSL_FAILURE;
4644
4645
482
        ctx->isHMAC = 1;
4646
482
    }
4647
0
    else if (wolfSSL_EVP_DigestInit(ctx, type) != 1)
4648
0
            return WOLFSSL_FAILURE;
4649
4650
482
    if (ctx->pctx == NULL) {
4651
482
        ctx->pctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
4652
482
        if (ctx->pctx == NULL)
4653
0
            return WOLFSSL_FAILURE;
4654
482
    }
4655
482
    if (pctx != NULL)
4656
0
        *pctx = ctx->pctx;
4657
482
    return WOLFSSL_SUCCESS;
4658
482
}
4659
4660
/* Update an EVP_DigestSign/Verify operation.
4661
 * Update a digest for RSA and ECC keys, or HMAC for HMAC key.
4662
 */
4663
static int wolfssl_evp_digest_pk_update(WOLFSSL_EVP_MD_CTX *ctx,
4664
                                        const void *d, unsigned int cnt)
4665
5.05k
{
4666
5.05k
    if (ctx->isHMAC) {
4667
5.05k
        if (wc_HmacUpdate(&ctx->hash.hmac, (const byte *)d, cnt) != 0)
4668
0
            return WOLFSSL_FAILURE;
4669
4670
5.05k
        return WOLFSSL_SUCCESS;
4671
5.05k
    }
4672
0
    else
4673
0
        return wolfSSL_EVP_DigestUpdate(ctx, d, cnt);
4674
5.05k
}
4675
4676
/* Finalize an EVP_DigestSign/Verify operation - common part only.
4677
 * Finalize a digest for RSA and ECC keys, or HMAC for HMAC key.
4678
 * Copies the digest so that you can keep updating.
4679
 */
4680
static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx,
4681
                                       unsigned char *md, unsigned int* mdlen)
4682
292
{
4683
292
    int  ret;
4684
4685
292
    if (ctx->isHMAC) {
4686
292
#ifdef WOLFSSL_SMALL_STACK
4687
292
        Hmac *hmacCopy = (Hmac *)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_OPENSSL);
4688
292
        if (hmacCopy == NULL)
4689
0
            return WOLFSSL_FAILURE;
4690
#else
4691
        Hmac hmacCopy[1];
4692
#endif
4693
292
        ret = wolfSSL_HmacCopy(hmacCopy, &ctx->hash.hmac);
4694
292
        if (ret == WOLFSSL_SUCCESS)
4695
292
            ret = wc_HmacFinal(hmacCopy, md) == 0;
4696
292
        wc_HmacFree(hmacCopy);
4697
292
        WC_FREE_VAR_EX(hmacCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4698
292
        return ret;
4699
292
    }
4700
0
    else {
4701
0
#ifdef WOLFSSL_SMALL_STACK
4702
0
        WOLFSSL_EVP_MD_CTX *ctxCopy = (WOLFSSL_EVP_MD_CTX *)XMALLOC(sizeof(WOLFSSL_EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
4703
0
        if (ctxCopy == NULL)
4704
0
            return WOLFSSL_FAILURE;
4705
#else
4706
        WOLFSSL_EVP_MD_CTX ctxCopy[1];
4707
#endif
4708
0
        wolfSSL_EVP_MD_CTX_init(ctxCopy);
4709
4710
0
        ret = wolfSSL_EVP_MD_CTX_copy_ex(ctxCopy, ctx);
4711
0
        if (ret == WOLFSSL_SUCCESS)
4712
0
            ret = wolfSSL_EVP_DigestFinal(ctxCopy, md, mdlen);
4713
0
        wolfSSL_EVP_MD_CTX_cleanup(ctxCopy);
4714
0
        WC_FREE_VAR_EX(ctxCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4715
0
        return ret;
4716
0
    }
4717
292
}
4718
4719
/* Get the length of the mac based on the digest algorithm. */
4720
static unsigned int wolfssl_mac_len(unsigned char macType)
4721
387
{
4722
387
    unsigned int hashLen;
4723
4724
387
    switch (macType) {
4725
0
    #ifndef NO_MD5
4726
30
        case WC_MD5:
4727
30
            hashLen = WC_MD5_DIGEST_SIZE;
4728
30
            break;
4729
0
    #endif /* !NO_MD5 */
4730
4731
0
    #ifndef NO_SHA
4732
106
        case WC_SHA:
4733
106
            hashLen = WC_SHA_DIGEST_SIZE;
4734
106
            break;
4735
0
    #endif /* !NO_SHA */
4736
4737
0
    #ifdef WOLFSSL_SHA224
4738
52
        case WC_SHA224:
4739
52
            hashLen = WC_SHA224_DIGEST_SIZE;
4740
52
            break;
4741
0
    #endif /* WOLFSSL_SHA224 */
4742
4743
0
    #ifndef NO_SHA256
4744
66
        case WC_SHA256:
4745
66
            hashLen = WC_SHA256_DIGEST_SIZE;
4746
66
            break;
4747
0
    #endif /* !NO_SHA256 */
4748
4749
0
    #ifdef WOLFSSL_SHA384
4750
19
        case WC_SHA384:
4751
19
            hashLen = WC_SHA384_DIGEST_SIZE;
4752
19
            break;
4753
0
    #endif /* WOLFSSL_SHA384 */
4754
0
    #ifdef WOLFSSL_SHA512
4755
114
        case WC_SHA512:
4756
114
            hashLen = WC_SHA512_DIGEST_SIZE;
4757
114
            break;
4758
0
    #endif /* WOLFSSL_SHA512 */
4759
4760
0
    #ifdef HAVE_BLAKE2
4761
0
        case BLAKE2B_ID:
4762
0
            hashLen = BLAKE2B_OUTBYTES;
4763
0
            break;
4764
0
    #endif /* HAVE_BLAKE2 */
4765
4766
0
    #ifdef WOLFSSL_SHA3
4767
0
        #ifndef WOLFSSL_NOSHA3_224
4768
0
        case WC_SHA3_224:
4769
0
            hashLen = WC_SHA3_224_DIGEST_SIZE;
4770
0
            break;
4771
0
        #endif
4772
0
        #ifndef WOLFSSL_NOSHA3_256
4773
0
        case WC_SHA3_256:
4774
0
            hashLen = WC_SHA3_256_DIGEST_SIZE;
4775
0
            break;
4776
0
        #endif
4777
0
        #ifndef WOLFSSL_NOSHA3_384
4778
0
        case WC_SHA3_384:
4779
0
            hashLen = WC_SHA3_384_DIGEST_SIZE;
4780
0
            break;
4781
0
        #endif
4782
0
        #ifndef WOLFSSL_NOSHA3_512
4783
0
        case WC_SHA3_512:
4784
0
            hashLen = WC_SHA3_512_DIGEST_SIZE;
4785
0
            break;
4786
0
        #endif
4787
0
    #endif
4788
4789
0
    #ifdef WOLFSSL_SM3
4790
0
        case WC_SM3:
4791
0
            hashLen = WC_SM3_DIGEST_SIZE;
4792
0
            break;
4793
0
    #endif /* WOLFSSL_SM3 */
4794
4795
0
        default:
4796
0
            hashLen = 0;
4797
387
    }
4798
4799
387
    return hashLen;
4800
387
}
4801
4802
int wolfSSL_EVP_DigestSignInit(WOLFSSL_EVP_MD_CTX *ctx,
4803
                               WOLFSSL_EVP_PKEY_CTX **pctx,
4804
                               const WOLFSSL_EVP_MD *type,
4805
                               WOLFSSL_ENGINE *e,
4806
                               WOLFSSL_EVP_PKEY *pkey)
4807
517
{
4808
517
    WOLFSSL_ENTER("EVP_DigestSignInit");
4809
4810
517
    if (ctx == NULL || pkey == NULL)
4811
0
        return WOLFSSL_FAILURE;
4812
4813
517
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4814
517
}
4815
4816
4817
int wolfSSL_EVP_DigestSignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4818
                                 unsigned int cnt)
4819
5.24k
{
4820
5.24k
    WOLFSSL_ENTER("EVP_DigestSignUpdate");
4821
4822
5.24k
    if (ctx == NULL || d == NULL)
4823
190
        return WOLFSSL_FAILURE;
4824
4825
5.05k
    return wolfssl_evp_digest_pk_update(ctx, d, cnt);
4826
5.24k
}
4827
4828
int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig,
4829
                                size_t *siglen)
4830
292
{
4831
292
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4832
292
    unsigned int  hashLen;
4833
292
    int           ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
4834
4835
292
    WOLFSSL_ENTER("EVP_DigestSignFinal");
4836
4837
292
    if (ctx == NULL || siglen == NULL)
4838
0
        return WOLFSSL_FAILURE;
4839
4840
    /* Return the maximum size of the signature when sig is NULL. */
4841
292
    if (ctx->isHMAC) {
4842
292
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4843
4844
292
        if (sig == NULL) {
4845
0
            *siglen = hashLen;
4846
0
            return WOLFSSL_SUCCESS;
4847
0
        }
4848
292
    }
4849
0
#ifndef NO_RSA
4850
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_RSA) {
4851
0
        if (sig == NULL) {
4852
0
            *siglen = (size_t)wolfSSL_RSA_size(ctx->pctx->pkey->rsa);
4853
0
            return WOLFSSL_SUCCESS;
4854
0
        }
4855
0
    }
4856
0
#endif /* !NO_RSA */
4857
0
#ifdef HAVE_ECC
4858
0
    else if (ctx->pctx->pkey->type == WC_EVP_PKEY_EC) {
4859
0
        if (sig == NULL) {
4860
            /* SEQ + INT + INT */
4861
0
            *siglen = (size_t)ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx].
4862
0
                size * 2 + 8;
4863
0
            return WOLFSSL_SUCCESS;
4864
0
        }
4865
0
    }
4866
292
#endif
4867
4868
292
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4869
0
        return WOLFSSL_FAILURE;
4870
4871
292
    if (ctx->isHMAC) {
4872
        /* Copy the HMAC result as signature. */
4873
292
        if ((unsigned int)(*siglen) > hashLen)
4874
292
            *siglen = hashLen;
4875
        /* May be a truncated signature. */
4876
4877
292
        XMEMCPY(sig, digest, (size_t)*siglen);
4878
292
        ret = WOLFSSL_SUCCESS;
4879
292
    }
4880
0
    else {
4881
        /* Sign the digest. */
4882
0
        switch (ctx->pctx->pkey->type) {
4883
0
    #if !defined(NO_RSA)
4884
0
        case WC_EVP_PKEY_RSA: {
4885
0
            unsigned int sigSz = (unsigned int)*siglen;
4886
0
            int nid;
4887
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4888
0
            if (md == NULL)
4889
0
                break;
4890
0
            nid = wolfSSL_EVP_MD_type(md);
4891
0
            if (nid < 0)
4892
0
                break;
4893
0
            ret = wolfSSL_RSA_sign_generic_padding(nid, digest, hashLen,
4894
0
                    sig, &sigSz, ctx->pctx->pkey->rsa, 1, ctx->pctx->padding);
4895
0
            if (ret >= 0)
4896
0
                *siglen = sigSz;
4897
0
            break;
4898
0
        }
4899
0
    #endif /* NO_RSA */
4900
4901
0
    #ifdef HAVE_ECC
4902
0
        case WC_EVP_PKEY_EC: {
4903
0
            int len;
4904
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
4905
0
            ecdsaSig = wolfSSL_ECDSA_do_sign(digest, (int)hashLen,
4906
0
                                             ctx->pctx->pkey->ecc);
4907
0
            if (ecdsaSig == NULL)
4908
0
                break;
4909
0
            len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4910
0
            if (len > 0 && (size_t)len <= *siglen)
4911
0
                len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
4912
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
4913
0
            if (len == 0)
4914
0
                break;
4915
0
            *siglen = (size_t)len;
4916
0
            ret = WOLFSSL_SUCCESS;
4917
0
            break;
4918
0
        }
4919
0
    #endif
4920
0
        default:
4921
0
            break;
4922
0
        }
4923
0
    }
4924
4925
292
    ForceZero(digest, sizeof(digest));
4926
292
    return ret;
4927
292
}
4928
4929
int wolfSSL_EVP_DigestVerifyInit(WOLFSSL_EVP_MD_CTX *ctx,
4930
                                 WOLFSSL_EVP_PKEY_CTX **pctx,
4931
                                 const WOLFSSL_EVP_MD *type,
4932
                                 WOLFSSL_ENGINE *e,
4933
                                 WOLFSSL_EVP_PKEY *pkey)
4934
0
{
4935
0
    WOLFSSL_ENTER("EVP_DigestVerifyInit");
4936
4937
0
    if (ctx == NULL || type == NULL || pkey == NULL)
4938
0
        return WOLFSSL_FAILURE;
4939
4940
0
    return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
4941
0
}
4942
4943
4944
int wolfSSL_EVP_DigestVerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
4945
                                   size_t cnt)
4946
0
{
4947
0
    WOLFSSL_ENTER("EVP_DigestVerifyUpdate");
4948
4949
0
    if (ctx == NULL || d == NULL)
4950
0
        return WOLFSSL_FAILURE;
4951
4952
0
    return wolfssl_evp_digest_pk_update(ctx, d, (unsigned int)cnt);
4953
0
}
4954
4955
4956
int wolfSSL_EVP_DigestVerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
4957
                                  const unsigned char *sig, size_t siglen)
4958
0
{
4959
0
    unsigned char digest[WC_MAX_DIGEST_SIZE];
4960
0
    unsigned int  hashLen;
4961
4962
0
    WOLFSSL_ENTER("EVP_DigestVerifyFinal");
4963
4964
0
    if (ctx == NULL || sig == NULL)
4965
0
        return WOLFSSL_FAILURE;
4966
4967
0
    if (ctx->isHMAC) {
4968
4969
0
        hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
4970
4971
0
        if (siglen > hashLen || siglen > INT_MAX)
4972
0
            return WOLFSSL_FAILURE;
4973
        /* May be a truncated signature. */
4974
0
    }
4975
4976
0
    if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
4977
0
        return WOLFSSL_FAILURE;
4978
4979
0
    if (ctx->isHMAC) {
4980
        /* Check HMAC result matches the signature. */
4981
0
        if (ConstantCompare(sig, digest, (int)siglen) == 0)
4982
0
            return WOLFSSL_SUCCESS;
4983
0
        return WOLFSSL_FAILURE;
4984
0
    }
4985
0
    else {
4986
        /* Verify the signature with the digest. */
4987
0
        switch (ctx->pctx->pkey->type) {
4988
0
    #if !defined(NO_RSA)
4989
0
        case WC_EVP_PKEY_RSA: {
4990
0
            int nid;
4991
0
            const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
4992
0
            if (md == NULL)
4993
0
                return WOLFSSL_FAILURE;
4994
0
            nid = wolfSSL_EVP_MD_type(md);
4995
0
            if (nid < 0)
4996
0
                return WOLFSSL_FAILURE;
4997
0
            return wolfSSL_RSA_verify_ex(nid, digest, hashLen, sig,
4998
0
                                      (unsigned int)siglen,
4999
0
                                      ctx->pctx->pkey->rsa, ctx->pctx->padding);
5000
0
        }
5001
0
    #endif /* NO_RSA */
5002
5003
0
    #ifdef HAVE_ECC
5004
0
        case WC_EVP_PKEY_EC: {
5005
0
            int ret;
5006
0
            WOLFSSL_ECDSA_SIG *ecdsaSig;
5007
0
            ecdsaSig = wolfSSL_d2i_ECDSA_SIG(NULL, &sig, (long)siglen);
5008
0
            if (ecdsaSig == NULL)
5009
0
                return WOLFSSL_FAILURE;
5010
0
            ret = wolfSSL_ECDSA_do_verify(digest, (int)hashLen, ecdsaSig,
5011
0
                                          ctx->pctx->pkey->ecc);
5012
0
            wolfSSL_ECDSA_SIG_free(ecdsaSig);
5013
0
            return ret;
5014
0
        }
5015
0
    #endif
5016
0
        default:
5017
0
            break;
5018
0
        }
5019
0
    }
5020
5021
0
    return WOLFSSL_FAILURE;
5022
0
}
5023
5024
5025
#ifdef WOLFSSL_APACHE_HTTPD
5026
#if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32)
5027
    #include <termios.h>
5028
#endif
5029
5030
#ifndef XGETPASSWD
5031
    static int XGETPASSWD(char* buf, int bufSz) {
5032
        int ret = WOLFSSL_SUCCESS;
5033
5034
        /* turn off echo for passwords */
5035
    #ifdef USE_WINDOWS_API
5036
        DWORD originalTerm;
5037
        DWORD newTerm;
5038
        CONSOLE_SCREEN_BUFFER_INFO screenOrig;
5039
        HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
5040
        if (GetConsoleMode(stdinHandle, &originalTerm) == 0) {
5041
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5042
            return WOLFSSL_FAILURE;
5043
        }
5044
        newTerm = originalTerm;
5045
        newTerm &= ~ENABLE_ECHO_INPUT;
5046
        if (SetConsoleMode(stdinHandle, newTerm) == 0) {
5047
            WOLFSSL_MSG("Couldn't turn off echo");
5048
            return WOLFSSL_FAILURE;
5049
        }
5050
    #else
5051
        struct termios originalTerm;
5052
        struct termios newTerm;
5053
        if (tcgetattr(STDIN_FILENO, &originalTerm) != 0) {
5054
            WOLFSSL_MSG("Couldn't get the original terminal settings");
5055
            return WOLFSSL_FAILURE;
5056
        }
5057
        XMEMCPY(&newTerm, &originalTerm, sizeof(struct termios));
5058
5059
        newTerm.c_lflag &= ~ECHO;
5060
        newTerm.c_lflag |= (ICANON | ECHONL);
5061
        if (tcsetattr(STDIN_FILENO, TCSANOW, &newTerm) != 0) {
5062
            WOLFSSL_MSG("Couldn't turn off echo");
5063
            return WOLFSSL_FAILURE;
5064
        }
5065
    #endif
5066
5067
        if (XFGETS(buf, bufSz, stdin) == NULL) {
5068
            ret = WOLFSSL_FAILURE;
5069
        }
5070
5071
        /* restore default echo */
5072
    #ifdef USE_WINDOWS_API
5073
        if (SetConsoleMode(stdinHandle, originalTerm) == 0) {
5074
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5075
            return WOLFSSL_FAILURE;
5076
        }
5077
    #else
5078
        if (tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm) != 0) {
5079
            WOLFSSL_MSG("Couldn't restore the terminal settings");
5080
            return WOLFSSL_FAILURE;
5081
        }
5082
    #endif
5083
        return ret;
5084
    }
5085
#endif
5086
5087
/* returns 0 on success and -2 or -1 on failure */
5088
int wolfSSL_EVP_read_pw_string(char* buf, int bufSz, const char* banner, int v)
5089
{
5090
    printf("%s", banner);
5091
    if (XGETPASSWD(buf, bufSz) == WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
5092
        return -1;
5093
    }
5094
    (void)v; /* fgets always sanity checks size of input vs buffer */
5095
    return 0;
5096
}
5097
#endif /* WOLFSSL_APACHE_HTTPD */
5098
5099
#if !defined(NO_PWDBASED) && !defined(NO_SHA) && !defined(NO_HMAC)
5100
int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
5101
                                               const unsigned char *salt,
5102
                                               int saltlen, int iter,
5103
                                               int keylen, unsigned char *out)
5104
0
{
5105
0
    const char *nostring = "";
5106
0
    int ret = 0;
5107
5108
0
    if (pass == NULL) {
5109
0
        passlen = 0;
5110
0
        pass = nostring;
5111
0
    }
5112
0
    else if (passlen == -1) {
5113
0
        passlen = (int)XSTRLEN(pass);
5114
0
    }
5115
5116
0
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5117
0
                    iter, keylen, WC_SHA);
5118
0
    if (ret == 0)
5119
0
        return WOLFSSL_SUCCESS;
5120
0
    else
5121
0
        return WOLFSSL_FAILURE;
5122
0
}
5123
#endif /* !NO_PWDBASED !NO_SHA*/
5124
5125
#if !defined(NO_PWDBASED) && !defined(NO_HMAC)
5126
int wolfSSL_PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
5127
                                           const unsigned char *salt,
5128
                                           int saltlen, int iter,
5129
                                           const WOLFSSL_EVP_MD *digest,
5130
                                           int keylen, unsigned char *out)
5131
504
{
5132
504
    const char *nostring = "";
5133
504
    int ret = 0;
5134
504
    enum wc_HashType pbkdf2HashType;
5135
5136
504
    if (pass == NULL) {
5137
258
        passlen = 0;
5138
258
        pass = nostring;
5139
258
    } else if (passlen == -1) {
5140
0
        passlen = (int)XSTRLEN(pass);
5141
0
    }
5142
5143
504
    pbkdf2HashType = EvpMd2MacType(digest);
5144
5145
504
    ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
5146
504
                    iter, keylen, pbkdf2HashType);
5147
504
    if (ret == 0)
5148
432
        return WOLFSSL_SUCCESS;
5149
72
    else
5150
72
        return WOLFSSL_FAILURE;
5151
504
}
5152
#endif /* !NO_PWDBASED */
5153
5154
5155
#if defined(HAVE_SCRYPT) && defined(HAVE_PBKDF2) && !defined(NO_PWDBASED) && \
5156
                                                    !defined(NO_SHA256)
5157
/**
5158
 * Derives a key from the specified password and the salt using SCRYPT
5159
 * algorithm.
5160
 *
5161
 * Parameters:
5162
 * - pass      :password data. no need to be null-terminated. NULL is accepted.
5163
 * - passlen   :length of the password. Must be 0 when pass is NULL.
5164
 * - salt      :salt. NULL is accepted.
5165
 * - saltlen   :length of the salt. Must be 0 when salt is NULL.
5166
 * - N         :cost parameter. Must be grater or equal to 2 and be a power of 2.
5167
 * - r         :block size. Must 1 or greater.
5168
 * - p         :parallelism
5169
 * - maxmem    :maximum size of buffer used for calculation in definition,
5170
 *              Not referred in this implementation.
5171
 * - key       :derived key.
5172
 * - keylen    :length of the derived key
5173
 *
5174
 * Returns:
5175
 *   1 on success, otherwise 0.
5176
 */
5177
int wolfSSL_EVP_PBE_scrypt(const char *pass, size_t passlen,
5178
                            const unsigned char *salt, size_t saltlen,
5179
                            word64 N, word64 r, word64 p,
5180
                            word64 maxmem, unsigned char *key, size_t keylen)
5181
0
{
5182
0
    int ret;
5183
0
    int exp = 0;
5184
5185
0
    (void)maxmem;
5186
5187
0
    WOLFSSL_ENTER("wolfSSL_EVP_PBE_scrypt");
5188
5189
0
    if (r > INT32_MAX || p > INT32_MAX) {
5190
0
        WOLFSSL_MSG("Doesn't support greater than 32 bit values of r and p");
5191
0
        return WOLFSSL_FAILURE;
5192
0
    }
5193
    /* N must be a power of 2 and > 2.
5194
       if (N & (N-1)) is zero, it means N is a power of 2.
5195
     */
5196
0
    if (N < 2 || (N & (N-1)) || r <= 0 || p <= 0)
5197
0
        return WOLFSSL_FAILURE;
5198
5199
0
    if (key == NULL)
5200
0
        return WOLFSSL_SUCCESS;
5201
5202
    /* get exponent of power of 2. Confirmed N is power of 2. */
5203
0
    while (N != 1) {
5204
0
        N >>= 1;
5205
0
        exp++;
5206
0
    }
5207
5208
0
    ret = wc_scrypt(key, (const byte*)pass, (int)passlen, salt, (int)saltlen,
5209
0
                                            exp, (int)r, (int)p, (int)keylen);
5210
5211
0
    WOLFSSL_LEAVE("wolfSSL_EVP_PBE_scrypt", ret);
5212
5213
0
    if (ret == 0)
5214
0
        return WOLFSSL_SUCCESS;
5215
0
    else
5216
0
        return WOLFSSL_FAILURE;
5217
0
}
5218
#endif /* HAVE_SCRYPT && HAVE_PBKDF2 && !NO_PWDBASED && !NO_SHA */
5219
5220
static const struct cipher{
5221
        unsigned char type;
5222
        const char *name;
5223
        int nid;
5224
} cipher_tbl[] = {
5225
5226
#ifndef NO_AES
5227
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5228
    #ifdef WOLFSSL_AES_128
5229
    {WC_AES_128_CBC_TYPE, EVP_AES_128_CBC, WC_NID_aes_128_cbc},
5230
    #endif
5231
    #ifdef WOLFSSL_AES_192
5232
    {WC_AES_192_CBC_TYPE, EVP_AES_192_CBC, WC_NID_aes_192_cbc},
5233
    #endif
5234
    #ifdef WOLFSSL_AES_256
5235
    {WC_AES_256_CBC_TYPE, EVP_AES_256_CBC, WC_NID_aes_256_cbc},
5236
    #endif
5237
    #endif
5238
5239
    #ifdef WOLFSSL_AES_CFB
5240
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5241
    #ifdef WOLFSSL_AES_128
5242
    {WC_AES_128_CFB1_TYPE, EVP_AES_128_CFB1, WC_NID_aes_128_cfb1},
5243
    #endif
5244
    #ifdef WOLFSSL_AES_192
5245
    {WC_AES_192_CFB1_TYPE, EVP_AES_192_CFB1, WC_NID_aes_192_cfb1},
5246
    #endif
5247
    #ifdef WOLFSSL_AES_256
5248
    {WC_AES_256_CFB1_TYPE, EVP_AES_256_CFB1, WC_NID_aes_256_cfb1},
5249
    #endif
5250
5251
    #ifdef WOLFSSL_AES_128
5252
    {WC_AES_128_CFB8_TYPE, EVP_AES_128_CFB8, WC_NID_aes_128_cfb8},
5253
    #endif
5254
    #ifdef WOLFSSL_AES_192
5255
    {WC_AES_192_CFB8_TYPE, EVP_AES_192_CFB8, WC_NID_aes_192_cfb8},
5256
    #endif
5257
    #ifdef WOLFSSL_AES_256
5258
    {WC_AES_256_CFB8_TYPE, EVP_AES_256_CFB8, WC_NID_aes_256_cfb8},
5259
    #endif
5260
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5261
5262
    #ifdef WOLFSSL_AES_128
5263
    {WC_AES_128_CFB128_TYPE, EVP_AES_128_CFB128, WC_NID_aes_128_cfb128},
5264
    #endif
5265
    #ifdef WOLFSSL_AES_192
5266
    {WC_AES_192_CFB128_TYPE, EVP_AES_192_CFB128, WC_NID_aes_192_cfb128},
5267
    #endif
5268
    #ifdef WOLFSSL_AES_256
5269
    {WC_AES_256_CFB128_TYPE, EVP_AES_256_CFB128, WC_NID_aes_256_cfb128},
5270
    #endif
5271
    #endif /* WOLFSSL_AES_CFB */
5272
5273
    #ifdef WOLFSSL_AES_OFB
5274
    #ifdef WOLFSSL_AES_128
5275
    {WC_AES_128_OFB_TYPE, EVP_AES_128_OFB, WC_NID_aes_128_ofb},
5276
    #endif
5277
    #ifdef WOLFSSL_AES_192
5278
    {WC_AES_192_OFB_TYPE, EVP_AES_192_OFB, WC_NID_aes_192_ofb},
5279
    #endif
5280
    #ifdef WOLFSSL_AES_256
5281
    {WC_AES_256_OFB_TYPE, EVP_AES_256_OFB, WC_NID_aes_256_ofb},
5282
    #endif
5283
    #endif
5284
5285
    #if defined(WOLFSSL_AES_XTS) && \
5286
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
5287
    #ifdef WOLFSSL_AES_128
5288
    {WC_AES_128_XTS_TYPE, EVP_AES_128_XTS, WC_NID_aes_128_xts},
5289
    #endif
5290
    #ifdef WOLFSSL_AES_256
5291
    {WC_AES_256_XTS_TYPE, EVP_AES_256_XTS, WC_NID_aes_256_xts},
5292
    #endif
5293
    #endif
5294
5295
    #ifdef HAVE_AESGCM
5296
    #ifdef WOLFSSL_AES_128
5297
    {WC_AES_128_GCM_TYPE, EVP_AES_128_GCM, WC_NID_aes_128_gcm},
5298
    #endif
5299
    #ifdef WOLFSSL_AES_192
5300
    {WC_AES_192_GCM_TYPE, EVP_AES_192_GCM, WC_NID_aes_192_gcm},
5301
    #endif
5302
    #ifdef WOLFSSL_AES_256
5303
    {WC_AES_256_GCM_TYPE, EVP_AES_256_GCM, WC_NID_aes_256_gcm},
5304
    #endif
5305
    #endif
5306
5307
    #ifdef HAVE_AESCCM
5308
    #ifdef WOLFSSL_AES_128
5309
    {WC_AES_128_CCM_TYPE, EVP_AES_128_CCM, WC_NID_aes_128_ccm},
5310
    #endif
5311
    #ifdef WOLFSSL_AES_192
5312
    {WC_AES_192_CCM_TYPE, EVP_AES_192_CCM, WC_NID_aes_192_ccm},
5313
    #endif
5314
    #ifdef WOLFSSL_AES_256
5315
    {WC_AES_256_CCM_TYPE, EVP_AES_256_CCM, WC_NID_aes_256_ccm},
5316
    #endif
5317
    #endif
5318
5319
    #ifdef WOLFSSL_AES_COUNTER
5320
    #ifdef WOLFSSL_AES_128
5321
        {WC_AES_128_CTR_TYPE, EVP_AES_128_CTR, WC_NID_aes_128_ctr},
5322
    #endif
5323
    #ifdef WOLFSSL_AES_192
5324
        {WC_AES_192_CTR_TYPE, EVP_AES_192_CTR, WC_NID_aes_192_ctr},
5325
    #endif
5326
    #ifdef WOLFSSL_AES_256
5327
        {WC_AES_256_CTR_TYPE, EVP_AES_256_CTR, WC_NID_aes_256_ctr},
5328
    #endif
5329
    #endif
5330
5331
    #ifdef HAVE_AES_ECB
5332
    #ifdef WOLFSSL_AES_128
5333
        {WC_AES_128_ECB_TYPE, EVP_AES_128_ECB, WC_NID_aes_128_ecb},
5334
    #endif
5335
    #ifdef WOLFSSL_AES_192
5336
        {WC_AES_192_ECB_TYPE, EVP_AES_192_ECB, WC_NID_aes_192_ecb},
5337
    #endif
5338
    #ifdef WOLFSSL_AES_256
5339
        {WC_AES_256_ECB_TYPE, EVP_AES_256_ECB, WC_NID_aes_256_ecb},
5340
    #endif
5341
    #endif
5342
#endif
5343
5344
#ifdef HAVE_ARIA
5345
    {WC_ARIA_128_GCM_TYPE, EVP_ARIA_128_GCM, WC_NID_aria_128_gcm},
5346
    {WC_ARIA_192_GCM_TYPE, EVP_ARIA_192_GCM, WC_NID_aria_192_gcm},
5347
    {WC_ARIA_256_GCM_TYPE, EVP_ARIA_256_GCM, WC_NID_aria_256_gcm},
5348
#endif
5349
5350
#ifndef NO_DES3
5351
    {WC_DES_CBC_TYPE, EVP_DES_CBC, WC_NID_des_cbc},
5352
    {WC_DES_ECB_TYPE, EVP_DES_ECB, WC_NID_des_ecb},
5353
5354
    {WC_DES_EDE3_CBC_TYPE, EVP_DES_EDE3_CBC, WC_NID_des_ede3_cbc},
5355
    {WC_DES_EDE3_ECB_TYPE, EVP_DES_EDE3_ECB, WC_NID_des_ede3_ecb},
5356
#endif
5357
5358
#ifndef NO_RC4
5359
    {WC_ARC4_TYPE, EVP_ARC4, WC_NID_undef},
5360
#endif
5361
5362
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5363
    {WC_CHACHA20_POLY1305_TYPE, EVP_CHACHA20_POLY1305, WC_NID_chacha20_poly1305},
5364
#endif
5365
5366
#ifdef HAVE_CHACHA
5367
    {WC_CHACHA20_TYPE, EVP_CHACHA20, WC_NID_chacha20},
5368
#endif
5369
5370
#ifdef WOLFSSL_SM4_ECB
5371
    {WC_SM4_ECB_TYPE, EVP_SM4_ECB, WC_NID_sm4_ecb},
5372
#endif
5373
#ifdef WOLFSSL_SM4_CBC
5374
    {WC_SM4_CBC_TYPE, EVP_SM4_CBC, WC_NID_sm4_cbc},
5375
#endif
5376
#ifdef WOLFSSL_SM4_CTR
5377
    {WC_SM4_CTR_TYPE, EVP_SM4_CTR, WC_NID_sm4_ctr},
5378
#endif
5379
#ifdef WOLFSSL_SM4_GCM
5380
    {WC_SM4_GCM_TYPE, EVP_SM4_GCM, WC_NID_sm4_gcm},
5381
#endif
5382
#ifdef WOLFSSL_SM4_CCM
5383
    {WC_SM4_CCM_TYPE, EVP_SM4_CCM, WC_NID_sm4_ccm},
5384
#endif
5385
5386
    { 0, NULL, 0}
5387
};
5388
5389
/* returns cipher using provided ctx type */
5390
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_CIPHER_CTX_cipher(
5391
    const WOLFSSL_EVP_CIPHER_CTX *ctx)
5392
0
{
5393
0
    const struct cipher* c;
5394
5395
0
    if (!ctx || !ctx->cipherType) {
5396
0
        return NULL;
5397
0
    }
5398
5399
0
    for (c = cipher_tbl; c->type != 0; c++) {
5400
0
        if (ctx->cipherType == c->type) {
5401
0
            return wolfSSL_EVP_get_cipherbyname(c->name);
5402
0
        }
5403
0
    }
5404
5405
0
    return NULL;
5406
0
}
5407
5408
int wolfSSL_EVP_CIPHER_nid(const WOLFSSL_EVP_CIPHER *cipher)
5409
0
{
5410
0
    const struct cipher* c;
5411
5412
0
    if (!cipher) {
5413
0
        return 0;
5414
0
    }
5415
5416
0
    for (c = cipher_tbl; c->type != 0; c++) {
5417
0
        if (XSTRCMP(cipher, c->name) == 0) {
5418
0
            return c->nid;
5419
0
        }
5420
0
    }
5421
5422
0
    return 0;
5423
0
}
5424
5425
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbyname(const char *name)
5426
0
{
5427
0
    const struct alias {
5428
0
        const char *name;
5429
0
        const char *alias;
5430
0
    } cipher_alias_tbl[] = {
5431
0
#ifndef NO_DES3
5432
0
        {EVP_DES_CBC, "des"},
5433
0
        {EVP_DES_ECB, "des-ecb"},
5434
0
        {EVP_DES_EDE3_CBC, "des3"},
5435
0
        {EVP_DES_EDE3_CBC, "3des"},
5436
0
        {EVP_DES_EDE3_ECB, "des-ede3"},
5437
0
        {EVP_DES_EDE3_ECB, "des-ede3-ecb"},
5438
0
#endif
5439
0
#ifndef NO_AES
5440
0
    #ifdef HAVE_AES_CBC
5441
0
        #ifdef WOLFSSL_AES_128
5442
0
            {EVP_AES_128_CBC, "aes128-cbc"},
5443
0
            {EVP_AES_128_CBC, "aes128"},
5444
0
        #endif
5445
0
        #ifdef WOLFSSL_AES_192
5446
0
            {EVP_AES_192_CBC, "aes192-cbc"},
5447
0
            {EVP_AES_192_CBC, "aes192"},
5448
0
        #endif
5449
0
        #ifdef WOLFSSL_AES_256
5450
0
            {EVP_AES_256_CBC, "aes256-cbc"},
5451
0
            {EVP_AES_256_CBC, "aes256"},
5452
0
        #endif
5453
0
    #endif
5454
0
    #ifdef HAVE_AES_ECB
5455
0
        #ifdef WOLFSSL_AES_128
5456
0
            {EVP_AES_128_ECB, "aes128-ecb"},
5457
0
        #endif
5458
0
        #ifdef WOLFSSL_AES_192
5459
0
            {EVP_AES_192_ECB, "aes192-ecb"},
5460
0
        #endif
5461
0
        #ifdef WOLFSSL_AES_256
5462
0
            {EVP_AES_256_ECB, "aes256-ecb"},
5463
0
        #endif
5464
0
    #endif
5465
0
    #ifdef HAVE_AESGCM
5466
0
        #ifdef WOLFSSL_AES_128
5467
0
            {EVP_AES_128_GCM, "aes-128-gcm"},
5468
0
            {EVP_AES_128_GCM, "id-aes128-GCM"},
5469
0
        #endif
5470
0
        #ifdef WOLFSSL_AES_192
5471
0
            {EVP_AES_192_GCM, "aes-192-gcm"},
5472
0
            {EVP_AES_192_GCM, "id-aes192-GCM"},
5473
0
        #endif
5474
0
        #ifdef WOLFSSL_AES_256
5475
0
            {EVP_AES_256_GCM, "aes-256-gcm"},
5476
0
            {EVP_AES_256_GCM, "id-aes256-GCM"},
5477
0
        #endif
5478
0
    #endif
5479
0
    #ifdef HAVE_AESCCM
5480
0
        #ifdef WOLFSSL_AES_128
5481
0
            {EVP_AES_128_CCM, "aes-128-ccm"},
5482
0
            {EVP_AES_128_CCM, "id-aes128-CCM"},
5483
0
        #endif
5484
0
        #ifdef WOLFSSL_AES_192
5485
0
            {EVP_AES_192_CCM, "aes-192-ccm"},
5486
0
            {EVP_AES_192_CCM, "id-aes192-CCM"},
5487
0
        #endif
5488
0
        #ifdef WOLFSSL_AES_256
5489
0
            {EVP_AES_256_CCM, "aes-256-ccm"},
5490
0
            {EVP_AES_256_CCM, "id-aes256-CCM"},
5491
0
        #endif
5492
0
    #endif
5493
0
#endif
5494
#ifdef HAVE_ARIA
5495
        {EVP_ARIA_128_GCM, "aria-128-gcm"},
5496
        {EVP_ARIA_128_GCM, "id-aria128-GCM"},
5497
        {EVP_ARIA_192_GCM, "aria-192-gcm"},
5498
        {EVP_ARIA_192_GCM, "id-aria192-GCM"},
5499
        {EVP_ARIA_256_GCM, "aria-256-gcm"},
5500
        {EVP_ARIA_256_GCM, "id-aria256-GCM"},
5501
#endif
5502
0
#ifdef WOLFSSL_SM4_ECB
5503
0
        {EVP_SM4_ECB, "sm4-ecb"},
5504
0
#endif
5505
0
#ifdef WOLFSSL_SM4_CBC
5506
0
        {EVP_SM4_CBC, "sm4"},
5507
0
        {EVP_SM4_CBC, "sm4-cbc"},
5508
0
#endif
5509
0
#ifdef WOLFSSL_SM4_CTR
5510
0
        {EVP_SM4_CTR, "sm4-ctr"},
5511
0
#endif
5512
0
#ifdef WOLFSSL_SM4_GCM
5513
0
        {EVP_SM4_GCM, "sm4-gcm"},
5514
0
#endif
5515
0
#ifdef WOLFSSL_SM4_CCM
5516
0
        {EVP_SM4_CCM, "sm4-ccm"},
5517
0
#endif
5518
0
#ifndef NO_RC4
5519
0
        {EVP_ARC4, "RC4"},
5520
0
#endif
5521
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5522
0
        {EVP_CHACHA20_POLY1305, "chacha20-poly1305"},
5523
0
#endif
5524
0
#ifdef HAVE_CHACHA
5525
0
        {EVP_CHACHA20, "chacha20"},
5526
0
#endif
5527
0
        { NULL, NULL}
5528
0
    };
5529
5530
0
    const struct cipher *ent;
5531
0
    const struct alias  *al;
5532
5533
0
    WOLFSSL_ENTER("EVP_get_cipherbyname");
5534
5535
0
    for (al = cipher_alias_tbl; al->name != NULL; al++) {
5536
        /* Accept any case alternative version of an alias. */
5537
0
        if (XSTRCASECMP(name, al->alias) == 0) {
5538
0
            name = al->name;
5539
0
            break;
5540
0
        }
5541
0
    }
5542
5543
0
    for (ent = cipher_tbl; ent->name != NULL; ent++) {
5544
        /* Accept any case alternative version of name. */
5545
0
        if (XSTRCASECMP(name, ent->name) == 0) {
5546
0
            return (WOLFSSL_EVP_CIPHER *)ent->name;
5547
0
        }
5548
0
    }
5549
5550
0
    return NULL;
5551
0
}
5552
5553
/*
5554
 * return an EVP_CIPHER structure when cipher NID is passed.
5555
 *
5556
 * id  cipher NID
5557
 *
5558
 * return WOLFSSL_EVP_CIPHER
5559
*/
5560
const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbynid(int id)
5561
0
{
5562
0
    WOLFSSL_ENTER("EVP_get_cipherbynid");
5563
5564
0
    switch(id) {
5565
5566
0
#ifndef NO_AES
5567
0
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5568
0
        #ifdef WOLFSSL_AES_128
5569
0
        case WC_NID_aes_128_cbc:
5570
0
            return wolfSSL_EVP_aes_128_cbc();
5571
0
        #endif
5572
0
        #ifdef WOLFSSL_AES_192
5573
0
        case WC_NID_aes_192_cbc:
5574
0
            return wolfSSL_EVP_aes_192_cbc();
5575
0
        #endif
5576
0
        #ifdef WOLFSSL_AES_256
5577
0
        case WC_NID_aes_256_cbc:
5578
0
            return wolfSSL_EVP_aes_256_cbc();
5579
0
        #endif
5580
0
    #endif
5581
0
    #ifdef WOLFSSL_AES_COUNTER
5582
0
        #ifdef WOLFSSL_AES_128
5583
0
        case WC_NID_aes_128_ctr:
5584
0
            return wolfSSL_EVP_aes_128_ctr();
5585
0
        #endif
5586
0
        #ifdef WOLFSSL_AES_192
5587
0
        case WC_NID_aes_192_ctr:
5588
0
            return wolfSSL_EVP_aes_192_ctr();
5589
0
        #endif
5590
0
        #ifdef WOLFSSL_AES_256
5591
0
        case WC_NID_aes_256_ctr:
5592
0
            return wolfSSL_EVP_aes_256_ctr();
5593
0
        #endif
5594
0
    #endif /* WOLFSSL_AES_COUNTER */
5595
0
    #ifdef HAVE_AES_ECB
5596
0
        #ifdef WOLFSSL_AES_128
5597
0
        case WC_NID_aes_128_ecb:
5598
0
            return wolfSSL_EVP_aes_128_ecb();
5599
0
        #endif
5600
0
        #ifdef WOLFSSL_AES_192
5601
0
        case WC_NID_aes_192_ecb:
5602
0
            return wolfSSL_EVP_aes_192_ecb();
5603
0
        #endif
5604
0
        #ifdef WOLFSSL_AES_256
5605
0
        case WC_NID_aes_256_ecb:
5606
0
            return wolfSSL_EVP_aes_256_ecb();
5607
0
        #endif
5608
0
    #endif /* HAVE_AES_ECB */
5609
0
    #ifdef HAVE_AESGCM
5610
0
        #ifdef WOLFSSL_AES_128
5611
0
        case WC_NID_aes_128_gcm:
5612
0
            return wolfSSL_EVP_aes_128_gcm();
5613
0
        #endif
5614
0
        #ifdef WOLFSSL_AES_192
5615
0
        case WC_NID_aes_192_gcm:
5616
0
            return wolfSSL_EVP_aes_192_gcm();
5617
0
        #endif
5618
0
        #ifdef WOLFSSL_AES_256
5619
0
        case WC_NID_aes_256_gcm:
5620
0
            return wolfSSL_EVP_aes_256_gcm();
5621
0
        #endif
5622
0
    #endif
5623
0
    #ifdef HAVE_AESCCM
5624
0
        #ifdef WOLFSSL_AES_128
5625
0
        case WC_NID_aes_128_ccm:
5626
0
            return wolfSSL_EVP_aes_128_ccm();
5627
0
        #endif
5628
0
        #ifdef WOLFSSL_AES_192
5629
0
        case WC_NID_aes_192_ccm:
5630
0
            return wolfSSL_EVP_aes_192_ccm();
5631
0
        #endif
5632
0
        #ifdef WOLFSSL_AES_256
5633
0
        case WC_NID_aes_256_ccm:
5634
0
            return wolfSSL_EVP_aes_256_ccm();
5635
0
        #endif
5636
0
    #endif
5637
0
#endif
5638
5639
#ifdef HAVE_ARIA
5640
    case WC_NID_aria_128_gcm:
5641
        return wolfSSL_EVP_aria_128_gcm();
5642
    case WC_NID_aria_192_gcm:
5643
        return wolfSSL_EVP_aria_192_gcm();
5644
    case WC_NID_aria_256_gcm:
5645
        return wolfSSL_EVP_aria_256_gcm();
5646
#endif
5647
5648
0
#ifndef NO_DES3
5649
0
        case WC_NID_des_cbc:
5650
0
            return wolfSSL_EVP_des_cbc();
5651
0
#ifdef WOLFSSL_DES_ECB
5652
0
        case WC_NID_des_ecb:
5653
0
            return wolfSSL_EVP_des_ecb();
5654
0
#endif
5655
0
        case WC_NID_des_ede3_cbc:
5656
0
            return wolfSSL_EVP_des_ede3_cbc();
5657
0
#ifdef WOLFSSL_DES_ECB
5658
0
        case WC_NID_des_ede3_ecb:
5659
0
            return wolfSSL_EVP_des_ede3_ecb();
5660
0
#endif
5661
0
#endif /*NO_DES3*/
5662
5663
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
5664
0
        case WC_NID_chacha20_poly1305:
5665
0
            return wolfSSL_EVP_chacha20_poly1305();
5666
0
#endif
5667
5668
0
#ifdef HAVE_CHACHA
5669
0
        case WC_NID_chacha20:
5670
0
            return wolfSSL_EVP_chacha20();
5671
0
#endif
5672
5673
0
#ifdef WOLFSSL_SM4_ECB
5674
0
        case WC_NID_sm4_ecb:
5675
0
            return wolfSSL_EVP_sm4_ecb();
5676
0
#endif
5677
0
#ifdef WOLFSSL_SM4_CBC
5678
0
        case WC_NID_sm4_cbc:
5679
0
            return wolfSSL_EVP_sm4_cbc();
5680
0
#endif
5681
0
#ifdef WOLFSSL_SM4_CTR
5682
0
        case WC_NID_sm4_ctr:
5683
0
            return wolfSSL_EVP_sm4_ctr();
5684
0
#endif
5685
0
#ifdef WOLFSSL_SM4_GCM
5686
0
        case WC_NID_sm4_gcm:
5687
0
            return wolfSSL_EVP_sm4_gcm();
5688
0
#endif
5689
0
#ifdef WOLFSSL_SM4_CCM
5690
0
        case WC_NID_sm4_ccm:
5691
0
            return wolfSSL_EVP_sm4_ccm();
5692
0
#endif
5693
5694
0
        default:
5695
0
            WOLFSSL_MSG("Bad cipher id value");
5696
0
    }
5697
5698
0
    return NULL;
5699
0
}
5700
5701
void wolfSSL_EVP_init(void)
5702
16
{
5703
    /* Does nothing. */
5704
16
}
5705
5706
    /* returns WOLFSSL_SUCCESS on success */
5707
    int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5708
0
    {
5709
0
        return wolfSSL_EVP_MD_CTX_copy_ex(out, in);
5710
0
    }
5711
    /* Deep copy of EVP_MD hasher
5712
     * return WOLFSSL_SUCCESS on success */
5713
    static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des,
5714
            const WOLFSSL_EVP_MD_CTX* src)
5715
0
    {
5716
0
        if (src->isHMAC) {
5717
0
            return wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac);
5718
0
        }
5719
0
        else {
5720
0
            int ret;
5721
5722
0
            switch (src->macType) {
5723
0
                case WC_HASH_TYPE_MD5:
5724
0
            #ifndef NO_MD5
5725
0
                    ret = wc_Md5Copy((wc_Md5*)&src->hash.digest,
5726
0
                            (wc_Md5*)&des->hash.digest);
5727
            #else
5728
                    ret = NOT_COMPILED_IN;
5729
            #endif /* !NO_MD5 */
5730
0
                    break;
5731
0
                case WC_HASH_TYPE_SHA:
5732
0
            #ifndef NO_SHA
5733
0
                    ret = wc_ShaCopy((wc_Sha*)&src->hash.digest,
5734
0
                            (wc_Sha*)&des->hash.digest);
5735
            #else
5736
                    ret = NOT_COMPILED_IN;
5737
            #endif /* !NO_SHA */
5738
0
                    break;
5739
0
                case WC_HASH_TYPE_SHA224:
5740
0
            #ifdef WOLFSSL_SHA224
5741
0
                    ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest,
5742
0
                            (wc_Sha224*)&des->hash.digest);
5743
            #else
5744
                    ret = NOT_COMPILED_IN;
5745
            #endif /* WOLFSSL_SHA224 */
5746
0
                    break;
5747
0
                case WC_HASH_TYPE_SHA256:
5748
0
            #ifndef NO_SHA256
5749
0
                    ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest,
5750
0
                            (wc_Sha256*)&des->hash.digest);
5751
            #else
5752
                    ret = NOT_COMPILED_IN;
5753
            #endif /* !NO_SHA256 */
5754
0
                    break;
5755
0
                case WC_HASH_TYPE_SHA384:
5756
0
            #ifdef WOLFSSL_SHA384
5757
0
                    ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest,
5758
0
                            (wc_Sha384*)&des->hash.digest);
5759
            #else
5760
                    ret = NOT_COMPILED_IN;
5761
            #endif /* WOLFSSL_SHA384 */
5762
0
                    break;
5763
0
                case WC_HASH_TYPE_SHA512:
5764
0
            #ifdef WOLFSSL_SHA512
5765
0
                    ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest,
5766
0
                        (wc_Sha512*)&des->hash.digest);
5767
            #else
5768
                    ret = NOT_COMPILED_IN;
5769
            #endif /* WOLFSSL_SHA512 */
5770
0
                    break;
5771
0
                case WC_HASH_TYPE_SHA512_224:
5772
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5773
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
5774
0
                    ret = wc_Sha512_224Copy((wc_Sha512*)&src->hash.digest,
5775
0
                        (wc_Sha512*)&des->hash.digest);
5776
            #else
5777
                    ret = NOT_COMPILED_IN;
5778
            #endif
5779
0
                    break;
5780
0
                case WC_HASH_TYPE_SHA512_256:
5781
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
5782
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
5783
0
                    ret = wc_Sha512_256Copy((wc_Sha512*)&src->hash.digest,
5784
0
                        (wc_Sha512*)&des->hash.digest);
5785
            #else
5786
                    ret = NOT_COMPILED_IN;
5787
            #endif
5788
0
                    break;
5789
0
                case WC_HASH_TYPE_SHA3_224:
5790
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
5791
0
                    ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest,
5792
0
                            (wc_Sha3*)&des->hash.digest);
5793
            #else
5794
                    ret = NOT_COMPILED_IN;
5795
            #endif
5796
0
                    break;
5797
0
                case WC_HASH_TYPE_SHA3_256:
5798
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
5799
0
                    ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest,
5800
0
                            (wc_Sha3*)&des->hash.digest);
5801
            #else
5802
                    ret = NOT_COMPILED_IN;
5803
            #endif
5804
0
                    break;
5805
0
                case WC_HASH_TYPE_SHA3_384:
5806
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
5807
0
                    ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest,
5808
0
                            (wc_Sha3*)&des->hash.digest);
5809
            #else
5810
                    ret = NOT_COMPILED_IN;
5811
            #endif
5812
0
                    break;
5813
0
                case WC_HASH_TYPE_SHA3_512:
5814
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
5815
0
                    ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest,
5816
0
                        (wc_Sha3*)&des->hash.digest);
5817
            #else
5818
                    ret = NOT_COMPILED_IN;
5819
            #endif
5820
0
                    break;
5821
0
                case WC_HASH_TYPE_SM3:
5822
0
            #ifdef WOLFSSL_SM3
5823
0
                    ret = wc_Sm3Copy(&src->hash.digest.sm3,
5824
0
                        &des->hash.digest.sm3);
5825
            #else
5826
                    ret = NOT_COMPILED_IN;
5827
            #endif
5828
0
                    break;
5829
0
                case WC_HASH_TYPE_SHAKE128:
5830
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
5831
0
                    ret = wc_Shake128_Copy((wc_Shake*)&src->hash.digest.shake,
5832
0
                            (wc_Shake*)&des->hash.digest.shake);
5833
            #else
5834
                    ret = NOT_COMPILED_IN;
5835
            #endif
5836
0
                    break;
5837
0
                case WC_HASH_TYPE_SHAKE256:
5838
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
5839
0
                    ret = wc_Shake256_Copy((wc_Shake*)&src->hash.digest.shake,
5840
0
                            (wc_Shake*)&des->hash.digest.shake);
5841
            #else
5842
                    ret = NOT_COMPILED_IN;
5843
            #endif
5844
0
                    break;
5845
0
                case WC_HASH_TYPE_NONE:
5846
0
                case WC_HASH_TYPE_MD2:
5847
0
                case WC_HASH_TYPE_MD4:
5848
0
                case WC_HASH_TYPE_MD5_SHA:
5849
0
                case WC_HASH_TYPE_BLAKE2B:
5850
0
                case WC_HASH_TYPE_BLAKE2S:
5851
0
                default:
5852
0
                    ret = BAD_FUNC_ARG;
5853
0
                    break;
5854
0
            }
5855
0
            return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
5856
0
        }
5857
0
    }
5858
5859
    /* copies structure in to the structure out
5860
     *
5861
     * returns WOLFSSL_SUCCESS on success */
5862
    int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
5863
0
    {
5864
0
        if ((out == NULL) || (in == NULL)) return WOLFSSL_FAILURE;
5865
0
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_copy_ex");
5866
0
        wolfSSL_EVP_MD_CTX_cleanup(out);
5867
0
        XMEMCPY(out, in, sizeof(WOLFSSL_EVP_MD_CTX));
5868
0
        if (in->pctx != NULL) {
5869
0
            out->pctx = wolfSSL_EVP_PKEY_CTX_new(in->pctx->pkey, NULL);
5870
0
            if (out->pctx == NULL)
5871
0
                return WOLFSSL_FAILURE;
5872
0
        }
5873
        /* Zero hash context after shallow copy to prevent shared sub-pointers
5874
         * with src. The hash Copy function will perform the proper deep copy. */
5875
0
        XMEMSET(&out->hash, 0, sizeof(out->hash));
5876
0
        return wolfSSL_EVP_MD_Copy_Hasher(out, (WOLFSSL_EVP_MD_CTX*)in);
5877
0
    }
5878
    #ifndef NO_AES
5879
5880
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
5881
    #ifdef WOLFSSL_AES_128
5882
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void)
5883
316
    {
5884
316
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cbc");
5885
316
        return EVP_AES_128_CBC;
5886
316
    }
5887
    #endif /* WOLFSSL_AES_128 */
5888
5889
5890
    #ifdef WOLFSSL_AES_192
5891
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void)
5892
149
    {
5893
149
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cbc");
5894
149
        return EVP_AES_192_CBC;
5895
149
    }
5896
    #endif /* WOLFSSL_AES_192 */
5897
5898
5899
    #ifdef WOLFSSL_AES_256
5900
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void)
5901
142
    {
5902
142
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cbc");
5903
142
        return EVP_AES_256_CBC;
5904
142
    }
5905
    #endif /* WOLFSSL_AES_256 */
5906
    #endif /* HAVE_AES_CBC */
5907
5908
    #ifdef WOLFSSL_AES_CFB
5909
    #ifndef WOLFSSL_NO_AES_CFB_1_8
5910
    #ifdef WOLFSSL_AES_128
5911
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void)
5912
149
    {
5913
149
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1");
5914
149
        return EVP_AES_128_CFB1;
5915
149
    }
5916
    #endif /* WOLFSSL_AES_128 */
5917
5918
    #ifdef WOLFSSL_AES_192
5919
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void)
5920
47
    {
5921
47
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1");
5922
47
        return EVP_AES_192_CFB1;
5923
47
    }
5924
    #endif /* WOLFSSL_AES_192 */
5925
5926
    #ifdef WOLFSSL_AES_256
5927
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void)
5928
171
    {
5929
171
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1");
5930
171
        return EVP_AES_256_CFB1;
5931
171
    }
5932
    #endif /* WOLFSSL_AES_256 */
5933
5934
    #ifdef WOLFSSL_AES_128
5935
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void)
5936
188
    {
5937
188
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8");
5938
188
        return EVP_AES_128_CFB8;
5939
188
    }
5940
    #endif /* WOLFSSL_AES_128 */
5941
5942
    #ifdef WOLFSSL_AES_192
5943
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void)
5944
124
    {
5945
124
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8");
5946
124
        return EVP_AES_192_CFB8;
5947
124
    }
5948
    #endif /* WOLFSSL_AES_192 */
5949
5950
    #ifdef WOLFSSL_AES_256
5951
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void)
5952
147
    {
5953
147
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8");
5954
147
        return EVP_AES_256_CFB8;
5955
147
    }
5956
    #endif /* WOLFSSL_AES_256 */
5957
    #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
5958
5959
    #ifdef WOLFSSL_AES_128
5960
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void)
5961
0
    {
5962
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128");
5963
0
        return EVP_AES_128_CFB128;
5964
0
    }
5965
    #endif /* WOLFSSL_AES_128 */
5966
5967
    #ifdef WOLFSSL_AES_192
5968
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void)
5969
0
    {
5970
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128");
5971
0
        return EVP_AES_192_CFB128;
5972
0
    }
5973
    #endif /* WOLFSSL_AES_192 */
5974
5975
    #ifdef WOLFSSL_AES_256
5976
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void)
5977
0
    {
5978
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128");
5979
0
        return EVP_AES_256_CFB128;
5980
0
    }
5981
    #endif /* WOLFSSL_AES_256 */
5982
    #endif /* WOLFSSL_AES_CFB */
5983
5984
    #ifdef WOLFSSL_AES_OFB
5985
    #ifdef WOLFSSL_AES_128
5986
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void)
5987
231
    {
5988
231
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb");
5989
231
        return EVP_AES_128_OFB;
5990
231
    }
5991
    #endif /* WOLFSSL_AES_128 */
5992
5993
    #ifdef WOLFSSL_AES_192
5994
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void)
5995
127
    {
5996
127
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb");
5997
127
        return EVP_AES_192_OFB;
5998
127
    }
5999
    #endif /* WOLFSSL_AES_192 */
6000
6001
    #ifdef WOLFSSL_AES_256
6002
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void)
6003
279
    {
6004
279
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb");
6005
279
        return EVP_AES_256_OFB;
6006
279
    }
6007
    #endif /* WOLFSSL_AES_256 */
6008
    #endif /* WOLFSSL_AES_OFB */
6009
6010
    #if defined(WOLFSSL_AES_XTS) && \
6011
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
6012
    #ifdef WOLFSSL_AES_128
6013
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void)
6014
456
    {
6015
456
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts");
6016
456
        return EVP_AES_128_XTS;
6017
456
    }
6018
    #endif /* WOLFSSL_AES_128 */
6019
6020
    #ifdef WOLFSSL_AES_256
6021
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void)
6022
106
    {
6023
106
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts");
6024
106
        return EVP_AES_256_XTS;
6025
106
    }
6026
    #endif /* WOLFSSL_AES_256 */
6027
    #endif /* WOLFSSL_AES_XTS &&
6028
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
6029
6030
    #ifdef HAVE_AESGCM
6031
    #ifdef WOLFSSL_AES_128
6032
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void)
6033
512
    {
6034
512
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_gcm");
6035
512
        return EVP_AES_128_GCM;
6036
512
    }
6037
    #endif /* WOLFSSL_GCM_128 */
6038
6039
    #ifdef WOLFSSL_AES_192
6040
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void)
6041
178
    {
6042
178
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_gcm");
6043
178
        return EVP_AES_192_GCM;
6044
178
    }
6045
    #endif /* WOLFSSL_AES_192 */
6046
6047
    #ifdef WOLFSSL_AES_256
6048
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_gcm(void)
6049
483
    {
6050
483
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_gcm");
6051
483
        return EVP_AES_256_GCM;
6052
483
    }
6053
    #endif /* WOLFSSL_AES_256 */
6054
    #endif /* HAVE_AESGCM */
6055
6056
    #ifdef HAVE_AESCCM
6057
    #ifdef WOLFSSL_AES_128
6058
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ccm(void)
6059
0
    {
6060
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ccm");
6061
0
        return EVP_AES_128_CCM;
6062
0
    }
6063
    #endif /* WOLFSSL_CCM_128 */
6064
6065
    #ifdef WOLFSSL_AES_192
6066
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ccm(void)
6067
0
    {
6068
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ccm");
6069
0
        return EVP_AES_192_CCM;
6070
0
    }
6071
    #endif /* WOLFSSL_AES_192 */
6072
6073
    #ifdef WOLFSSL_AES_256
6074
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ccm(void)
6075
0
    {
6076
0
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ccm");
6077
0
        return EVP_AES_256_CCM;
6078
0
    }
6079
    #endif /* WOLFSSL_AES_256 */
6080
    #endif /* HAVE_AESCCM */
6081
6082
    #ifdef WOLFSSL_AES_COUNTER
6083
    #ifdef WOLFSSL_AES_128
6084
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void)
6085
78
    {
6086
78
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ctr");
6087
78
        return EVP_AES_128_CTR;
6088
78
    }
6089
    #endif /* WOLFSSL_AES_2128 */
6090
6091
    #ifdef WOLFSSL_AES_192
6092
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void)
6093
440
    {
6094
440
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ctr");
6095
440
        return EVP_AES_192_CTR;
6096
440
    }
6097
    #endif /* WOLFSSL_AES_192 */
6098
6099
6100
    #ifdef WOLFSSL_AES_256
6101
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void)
6102
83
    {
6103
83
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ctr");
6104
83
        return EVP_AES_256_CTR;
6105
83
    }
6106
    #endif /* WOLFSSL_AES_256 */
6107
    #endif /* WOLFSSL_AES_COUNTER */
6108
6109
    #ifdef HAVE_AES_ECB
6110
    #ifdef WOLFSSL_AES_128
6111
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void)
6112
104
    {
6113
104
        WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ecb");
6114
104
        return EVP_AES_128_ECB;
6115
104
    }
6116
    #endif /* WOLFSSL_AES_128 */
6117
6118
6119
    #ifdef WOLFSSL_AES_192
6120
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void)
6121
119
    {
6122
119
        WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ecb");
6123
119
        return EVP_AES_192_ECB;
6124
119
    }
6125
    #endif /* WOLFSSL_AES_192*/
6126
6127
6128
    #ifdef WOLFSSL_AES_256
6129
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void)
6130
63
    {
6131
63
        WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ecb");
6132
63
        return EVP_AES_256_ECB;
6133
63
    }
6134
    #endif /* WOLFSSL_AES_256 */
6135
    #endif /* HAVE_AES_ECB */
6136
    #endif /* NO_AES */
6137
6138
#ifdef HAVE_ARIA
6139
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void)
6140
    {
6141
        WOLFSSL_ENTER("wolfSSL_EVP_aria_128_gcm");
6142
        return EVP_ARIA_128_GCM;
6143
    }
6144
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void)
6145
    {
6146
        WOLFSSL_ENTER("wolfSSL_EVP_aria_192_gcm");
6147
        return EVP_ARIA_192_GCM;
6148
    }
6149
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void)
6150
    {
6151
        WOLFSSL_ENTER("wolfSSL_EVP_aria_256_gcm");
6152
        return EVP_ARIA_256_GCM;
6153
    }
6154
#endif /* HAVE_ARIA */
6155
6156
#ifndef NO_DES3
6157
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void)
6158
220
    {
6159
220
        WOLFSSL_ENTER("wolfSSL_EVP_des_cbc");
6160
220
        return EVP_DES_CBC;
6161
220
    }
6162
#ifdef WOLFSSL_DES_ECB
6163
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void)
6164
446
    {
6165
446
        WOLFSSL_ENTER("wolfSSL_EVP_des_ecb");
6166
446
        return EVP_DES_ECB;
6167
446
    }
6168
#endif
6169
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void)
6170
248
    {
6171
248
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_cbc");
6172
248
        return EVP_DES_EDE3_CBC;
6173
248
    }
6174
#ifdef WOLFSSL_DES_ECB
6175
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void)
6176
0
    {
6177
0
        WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_ecb");
6178
0
        return EVP_DES_EDE3_ECB;
6179
0
    }
6180
#endif
6181
#endif /* NO_DES3 */
6182
6183
#ifndef NO_RC4
6184
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void)
6185
66
    {
6186
66
        WOLFSSL_ENTER("wolfSSL_EVP_rc4");
6187
66
        return EVP_ARC4;
6188
66
    }
6189
#endif
6190
6191
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6192
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20_poly1305(void)
6193
0
    {
6194
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20_poly1305");
6195
0
        return EVP_CHACHA20_POLY1305;
6196
0
    }
6197
#endif
6198
6199
#ifdef HAVE_CHACHA
6200
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20(void)
6201
0
    {
6202
0
        WOLFSSL_ENTER("wolfSSL_EVP_chacha20");
6203
0
        return EVP_CHACHA20;
6204
0
    }
6205
#endif
6206
6207
#ifdef WOLFSSL_SM4_ECB
6208
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void)
6209
0
    {
6210
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ecb");
6211
0
        return EVP_SM4_ECB;
6212
0
    }
6213
#endif
6214
#ifdef WOLFSSL_SM4_CBC
6215
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void)
6216
0
    {
6217
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_cbc");
6218
0
        return EVP_SM4_CBC;
6219
0
    }
6220
#endif
6221
#ifdef WOLFSSL_SM4_CTR
6222
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void)
6223
0
    {
6224
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ctr");
6225
0
        return EVP_SM4_CTR;
6226
0
    }
6227
#endif
6228
#ifdef WOLFSSL_SM4_GCM
6229
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void)
6230
0
    {
6231
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_gcm");
6232
0
        return EVP_SM4_GCM;
6233
0
    }
6234
#endif
6235
#ifdef WOLFSSL_SM4_CCM
6236
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void)
6237
0
    {
6238
0
        WOLFSSL_ENTER("wolfSSL_EVP_sm4_ccm");
6239
0
        return EVP_SM4_CCM;
6240
0
    }
6241
#endif
6242
6243
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void)
6244
0
    {
6245
0
        WOLFSSL_ENTER("wolfSSL_EVP_enc_null");
6246
0
        return EVP_NULL;
6247
0
    }
6248
    void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx)
6249
8.36k
    {
6250
8.36k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_init");
6251
8.36k
        if (ctx) {
6252
8.36k
            XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_CIPHER_CTX));
6253
8.36k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;   /* not yet initialized */
6254
8.36k
            ctx->keyLen     = 0;
6255
8.36k
            ctx->enc        = 1;      /* start in encrypt mode */
6256
8.36k
        }
6257
8.36k
    }
6258
6259
    /* This function allows cipher specific parameters to be
6260
    determined and set. */
6261
    int wolfSSL_EVP_CIPHER_CTX_ctrl(WOLFSSL_EVP_CIPHER_CTX *ctx, int type, \
6262
                                    int arg, void *ptr)
6263
768
    {
6264
768
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6265
768
#if defined(HAVE_AESGCM) || (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6266
768
#ifndef WC_NO_RNG
6267
768
        WC_RNG rng;
6268
768
#endif
6269
768
#endif
6270
768
        if (ctx == NULL)
6271
0
            return WOLFSSL_FAILURE;
6272
6273
768
        (void)arg;
6274
768
        (void)ptr;
6275
6276
768
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_ctrl");
6277
6278
768
        switch(type) {
6279
0
            case WOLFSSL_EVP_CTRL_INIT:
6280
0
                wolfSSL_EVP_CIPHER_CTX_init(ctx);
6281
0
                if(ctx)
6282
0
                    ret = WOLFSSL_SUCCESS;
6283
0
                break;
6284
0
            case WOLFSSL_EVP_CTRL_SET_KEY_LENGTH:
6285
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg);
6286
0
                break;
6287
0
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6288
0
        defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \
6289
0
        (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6290
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IVLEN:
6291
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6292
0
                    break;
6293
0
            #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6294
0
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6295
0
                    if (arg != CHACHA20_POLY1305_AEAD_IV_SIZE) {
6296
0
                        break;
6297
0
                    }
6298
0
                }
6299
0
                else
6300
0
            #endif /* HAVE_CHACHA && HAVE_POLY1305 */
6301
0
            #if defined(WOLFSSL_SM4_GCM)
6302
0
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6303
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6304
0
                        break;
6305
0
                    }
6306
0
                }
6307
0
                else
6308
0
            #endif
6309
0
            #if defined(WOLFSSL_SM4_CCM)
6310
0
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6311
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6312
0
                        break;
6313
0
                    }
6314
0
                }
6315
0
                else
6316
0
            #endif
6317
0
                {
6318
0
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6319
0
                        break;
6320
0
                }
6321
0
                ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg);
6322
0
                break;
6323
6324
0
#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) || \
6325
0
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
6326
0
            case WOLFSSL_EVP_CTRL_AEAD_SET_IV_FIXED:
6327
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6328
0
                    break;
6329
0
                if (arg == -1) {
6330
                    /* arg == -1 copies ctx->ivSz from ptr */
6331
0
                    ret = wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, (byte*)ptr, ctx->ivSz);
6332
0
                }
6333
0
#ifndef WC_NO_RNG
6334
0
                else {
6335
                    /*
6336
                     * Fixed field must be at least 4 bytes and invocation
6337
                     * field at least 8.
6338
                     */
6339
0
                    if ((arg < 4) || (ctx->ivSz - arg) < 8) {
6340
0
                        WOLFSSL_MSG("Fixed field or invocation field too short");
6341
0
                        break;
6342
0
                    }
6343
                    /* arg is 4...(ctx->ivSz - 8) */
6344
0
                    XMEMCPY(ctx->iv, ptr, (size_t)arg);
6345
0
                    if (wc_InitRng(&rng) != 0) {
6346
0
                        WOLFSSL_MSG("wc_InitRng failed");
6347
0
                        break;
6348
0
                    }
6349
0
                    if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg,
6350
0
                            (word32)(ctx->ivSz - arg)) == 0) {
6351
0
                        ret = WOLFSSL_SUCCESS;
6352
0
                    } else {
6353
                        /* rng is freed immediately after if block so no need
6354
                         * to do it here
6355
                         */
6356
0
                        WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
6357
0
                    }
6358
0
                    if (wc_FreeRng(&rng) != 0) {
6359
0
                        WOLFSSL_MSG("wc_FreeRng failed");
6360
0
                        ret = WOLFSSL_FAILURE;
6361
0
                        break;
6362
0
                    }
6363
0
                }
6364
0
            #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
6365
0
                if (ret == WOLFSSL_SUCCESS) {
6366
                    /*
6367
                     * OpenSSL requires that a EVP_CTRL_AEAD_SET_IV_FIXED
6368
                     * command be issued before a EVP_CTRL_GCM_IV_GEN command.
6369
                     * This flag is used to enforce that.
6370
                     */
6371
0
                    ctx->authIvGenEnable = 1;
6372
0
                }
6373
0
            #endif
6374
0
#endif /* !WC_NO_RNG */
6375
0
                break;
6376
0
#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM || (HAVE_CHACHA && HAVE_POLY1305) */
6377
0
#if (defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)) && !defined(_WIN32) && \
6378
0
    !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0))
6379
            /*
6380
             * Using EVP_CTRL_GCM_IV_GEN is a way to do AES-GCM encrypt/decrypt
6381
             * multiple times with EVP_Cipher without having to call
6382
             * EVP_CipherInit between each iteration. The IV is incremented for
6383
             * each subsequent EVP_Cipher call to prevent IV reuse.
6384
             */
6385
0
            case WOLFSSL_EVP_CTRL_GCM_IV_GEN:
6386
0
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6387
0
                    break;
6388
0
                if (!ctx->authIvGenEnable) {
6389
0
                    WOLFSSL_MSG("Must use EVP_CTRL_AEAD_SET_IV_FIXED before "
6390
0
                                "EVP_CTRL_GCM_IV_GEN");
6391
0
                    break;
6392
0
                }
6393
0
                if (ctx->cipher.aes.keylen == 0 || ctx->ivSz == 0) {
6394
0
                    WOLFSSL_MSG("Key or IV not set");
6395
0
                    break;
6396
0
                }
6397
0
                if (ptr == NULL) {
6398
0
                    WOLFSSL_MSG("Destination buffer for IV bytes NULL.");
6399
0
                    break;
6400
0
                }
6401
0
                if (arg <= 0 || arg > ctx->ivSz) {
6402
0
                    XMEMCPY(ptr, ctx->iv, (size_t)ctx->ivSz);
6403
0
                }
6404
0
                else {
6405
                    /*
6406
                     * Copy the last "arg" bytes of ctx->iv into the buffer at
6407
                     * "ptr." Not sure why OpenSSL does this, but it does.
6408
                     */
6409
0
                    XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, (size_t)arg);
6410
0
                }
6411
6412
                /*
6413
                 * The gcmIncIV flag indicates that the IV should be incremented
6414
                 * after the next cipher operation.
6415
                 */
6416
0
                ctx->authIncIv = 1;
6417
0
                ret = WOLFSSL_SUCCESS;
6418
0
                break;
6419
0
#endif /* (HAVE_AESGCM || WOLFSSL_SM4_GCM) && !_WIN32 && !HAVE_SELFTEST &&
6420
        * !HAVE_FIPS || FIPS_VERSION >= 2)*/
6421
297
            case WOLFSSL_EVP_CTRL_AEAD_SET_TAG:
6422
297
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6423
0
                    break;
6424
297
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6425
297
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6426
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6427
0
                        break;
6428
0
                    }
6429
0
                    ctx->authTagSz = arg;
6430
0
                    ret = WOLFSSL_SUCCESS;
6431
0
                    if (ptr != NULL) {
6432
0
                        XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6433
0
                    }
6434
0
                    break;
6435
0
                }
6436
297
                else
6437
297
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6438
297
#if defined(WOLFSSL_SM4_GCM)
6439
297
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6440
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6441
0
                        break;
6442
0
                    }
6443
6444
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6445
0
                    ctx->authTagSz = arg;
6446
0
                    ret = WOLFSSL_SUCCESS;
6447
0
                    break;
6448
0
                }
6449
297
                else
6450
297
#endif
6451
297
#if defined(WOLFSSL_SM4_CCM)
6452
297
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6453
0
                    if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
6454
0
                        break;
6455
0
                    }
6456
6457
0
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6458
0
                    ctx->authTagSz = arg;
6459
0
                    ret = WOLFSSL_SUCCESS;
6460
0
                    break;
6461
0
                }
6462
297
                else
6463
297
#endif
6464
297
                {
6465
297
                    if(arg <= 0 || arg > 16 || (ptr == NULL))
6466
30
                        break;
6467
6468
267
                    XMEMCPY(ctx->authTag, ptr, (size_t)arg);
6469
267
                    ctx->authTagSz = arg;
6470
267
                    ret = WOLFSSL_SUCCESS;
6471
267
                    break;
6472
297
                }
6473
471
            case WOLFSSL_EVP_CTRL_AEAD_GET_TAG:
6474
471
                if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
6475
0
                    break;
6476
6477
471
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6478
471
                if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE) {
6479
0
                    if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
6480
0
                        break;
6481
0
                    }
6482
0
                }
6483
471
                else
6484
471
#endif /* HAVE_CHACHA && HAVE_POLY1305 */
6485
471
#if defined(WOLFSSL_SM4_GCM)
6486
471
                if (ctx->cipherType == WC_SM4_GCM_TYPE) {
6487
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6488
0
                        break;
6489
0
                    }
6490
0
                }
6491
471
                else
6492
471
#endif
6493
471
#if defined(WOLFSSL_SM4_CCM)
6494
471
                if (ctx->cipherType == WC_SM4_CCM_TYPE) {
6495
0
                    if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
6496
0
                        break;
6497
0
                    }
6498
0
                }
6499
471
                else
6500
471
#endif
6501
471
                {
6502
471
                    if (arg <= 0 || arg > WC_AES_BLOCK_SIZE)
6503
217
                        break;
6504
471
                }
6505
6506
254
                if (ptr != NULL) {
6507
254
                    XMEMCPY(ptr, ctx->authTag, (size_t)arg);
6508
254
                    ret = WOLFSSL_SUCCESS;
6509
254
                }
6510
254
                break;
6511
0
#endif /* HAVE_AESGCM || HAVE_AESCCM || WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM ||
6512
        * HAVE_ARIA || (HAVE_CHACHA && HAVE_POLY1305) */
6513
0
            default:
6514
0
                WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled");
6515
0
                break;
6516
768
        }
6517
768
        return ret;
6518
768
    }
6519
6520
    /* WOLFSSL_SUCCESS on ok */
6521
    static int wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(
6522
        WOLFSSL_EVP_CIPHER_CTX* ctx)
6523
9.51k
    {
6524
9.51k
        int ret = WOLFSSL_SUCCESS;
6525
9.51k
        if (ctx) {
6526
9.51k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
6527
9.51k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
6528
9.51k
            switch (ctx->cipherType) {
6529
0
#if (defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM)) || \
6530
0
    defined(HAVE_AESCCM) || \
6531
0
    defined(HAVE_AES_CBC) || \
6532
0
    defined(WOLFSSL_AES_COUNTER) || \
6533
0
    defined(HAVE_AES_ECB) || \
6534
0
    defined(WOLFSSL_AES_CFB) || \
6535
0
    defined(WOLFSSL_AES_OFB) || \
6536
0
    defined(WOLFSSL_AES_XTS)
6537
6538
0
    #if defined(HAVE_AESGCM)
6539
512
                case WC_AES_128_GCM_TYPE:
6540
688
                case WC_AES_192_GCM_TYPE:
6541
1.17k
                case WC_AES_256_GCM_TYPE:
6542
1.17k
    #endif /* HAVE_AESGCM */
6543
1.17k
    #if defined(HAVE_AESCCM)
6544
1.17k
                case WC_AES_128_CCM_TYPE:
6545
1.17k
                case WC_AES_192_CCM_TYPE:
6546
1.17k
                case WC_AES_256_CCM_TYPE:
6547
1.17k
    #endif /* HAVE_AESCCM */
6548
1.17k
    #ifdef HAVE_AES_CBC
6549
1.48k
                case WC_AES_128_CBC_TYPE:
6550
1.60k
                case WC_AES_192_CBC_TYPE:
6551
1.70k
                case WC_AES_256_CBC_TYPE:
6552
1.70k
    #endif
6553
1.70k
    #ifdef WOLFSSL_AES_COUNTER
6554
1.78k
                case WC_AES_128_CTR_TYPE:
6555
2.19k
                case WC_AES_192_CTR_TYPE:
6556
2.26k
                case WC_AES_256_CTR_TYPE:
6557
2.26k
    #endif
6558
2.26k
    #ifdef HAVE_AES_ECB
6559
2.33k
                case WC_AES_128_ECB_TYPE:
6560
2.39k
                case WC_AES_192_ECB_TYPE:
6561
2.45k
                case WC_AES_256_ECB_TYPE:
6562
2.45k
    #endif
6563
2.45k
    #ifdef WOLFSSL_AES_CFB
6564
2.59k
                case WC_AES_128_CFB1_TYPE:
6565
2.63k
                case WC_AES_192_CFB1_TYPE:
6566
2.80k
                case WC_AES_256_CFB1_TYPE:
6567
2.99k
                case WC_AES_128_CFB8_TYPE:
6568
3.10k
                case WC_AES_192_CFB8_TYPE:
6569
3.24k
                case WC_AES_256_CFB8_TYPE:
6570
3.24k
                case WC_AES_128_CFB128_TYPE:
6571
3.24k
                case WC_AES_192_CFB128_TYPE:
6572
3.24k
                case WC_AES_256_CFB128_TYPE:
6573
3.24k
    #endif
6574
3.24k
    #ifdef WOLFSSL_AES_OFB
6575
3.45k
                case WC_AES_128_OFB_TYPE:
6576
3.57k
                case WC_AES_192_OFB_TYPE:
6577
3.85k
                case WC_AES_256_OFB_TYPE:
6578
3.85k
    #endif
6579
3.85k
                    wc_AesFree(&ctx->cipher.aes);
6580
3.85k
                    ctx->flags &=
6581
3.85k
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6582
3.85k
                    break;
6583
0
    #if defined(WOLFSSL_AES_XTS) && \
6584
0
        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
6585
393
                case WC_AES_128_XTS_TYPE:
6586
492
                case WC_AES_256_XTS_TYPE:
6587
492
                    wc_AesXtsFree(&ctx->cipher.xts);
6588
492
                    ctx->flags &=
6589
492
                        (unsigned long)~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6590
492
                    break;
6591
9.51k
    #endif
6592
9.51k
#endif /* AES */
6593
    #ifdef HAVE_ARIA
6594
                case WC_ARIA_128_GCM_TYPE:
6595
                case WC_ARIA_192_GCM_TYPE:
6596
                case WC_ARIA_256_GCM_TYPE:
6597
                    {
6598
                        int result = wc_AriaFreeCrypt(&ctx->cipher.aria);
6599
                        if (result != 0) {
6600
                            WOLFSSL_MSG("wc_AriaFreeCrypt failure");
6601
                            ret = result;
6602
                        }
6603
                    }
6604
                    break;
6605
    #endif
6606
9.51k
            }
6607
6608
9.51k
#endif /* not FIPS or FIPS v2+ */
6609
6610
9.51k
#ifdef WOLFSSL_SM4
6611
9.51k
            switch (ctx->cipherType) {
6612
0
    #ifdef WOLFSSL_SM4_ECB
6613
0
                case WC_SM4_ECB_TYPE:
6614
0
    #endif
6615
0
    #ifdef WOLFSSL_SM4_CBC
6616
0
                case WC_SM4_CBC_TYPE:
6617
0
    #endif
6618
0
    #ifdef WOLFSSL_SM4_CTR
6619
0
                case WC_SM4_CTR_TYPE:
6620
0
    #endif
6621
0
    #ifdef WOLFSSL_SM4_GCM
6622
0
                case WC_SM4_GCM_TYPE:
6623
0
    #endif
6624
0
    #ifdef WOLFSSL_SM4_CCM
6625
0
                case WC_SM4_CCM_TYPE:
6626
0
    #endif
6627
0
                    wc_Sm4Free(&ctx->cipher.sm4);
6628
9.51k
            }
6629
9.51k
#endif
6630
9.51k
        }
6631
9.51k
        return ret;
6632
9.51k
    }
6633
6634
    int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx)
6635
9.51k
    {
6636
9.51k
        int ret = WOLFSSL_SUCCESS;
6637
9.51k
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup");
6638
9.51k
        if (ctx) {
6639
9.51k
            wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(ctx);
6640
9.51k
            ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT;  /* not yet initialized  */
6641
9.51k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
6642
9.51k
            if (ctx->key) {
6643
0
                ForceZero(ctx->key, (word32)ctx->keyLen);
6644
0
                XFREE(ctx->key, NULL, DYNAMIC_TYPE_OPENSSL);
6645
0
                ctx->key = NULL;
6646
0
            }
6647
9.51k
#endif
6648
9.51k
            ctx->keyLen     = 0;
6649
9.51k
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
6650
9.51k
    defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
6651
9.51k
            XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
6652
9.51k
            ctx->authBuffer = NULL;
6653
9.51k
            ctx->authBufferLen = 0;
6654
9.51k
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6655
9.51k
            ctx->authIn = NULL;
6656
9.51k
            ctx->authInSz = 0;
6657
9.51k
            ctx->authIvGenEnable = 0;
6658
9.51k
            ctx->authIncIv = 0;
6659
9.51k
#endif
6660
9.51k
        }
6661
6662
9.51k
        return ret;
6663
9.51k
    }
6664
6665
    /* Permanent stub for Qt compilation. */
6666
    #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB)
6667
    const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc2_cbc(void)
6668
    {
6669
        WOLFSSL_ENTER("wolfSSL_EVP_rc2_cbc");
6670
        WOLFSSL_STUB("EVP_rc2_cbc");
6671
        return NULL;
6672
    }
6673
    #endif
6674
6675
#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
6676
6677
    int wolfSSL_EVP_BytesToKey(const WOLFSSL_EVP_CIPHER* type,
6678
                       const WOLFSSL_EVP_MD* md, const byte* salt,
6679
                       const byte* data, int sz, int count, byte* key, byte* iv)
6680
0
    {
6681
0
        int ret;
6682
0
        int hashType = WC_HASH_TYPE_NONE;
6683
0
        WC_DECLARE_VAR(info, EncryptedInfo, 1, 0);
6684
6685
0
    #ifdef WOLFSSL_SMALL_STACK
6686
0
        info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
6687
0
                                       DYNAMIC_TYPE_ENCRYPTEDINFO);
6688
0
        if (info == NULL) {
6689
0
            WOLFSSL_MSG("malloc failed");
6690
0
            return WOLFSSL_FAILURE;
6691
0
        }
6692
0
    #endif
6693
6694
0
        XMEMSET(info, 0, sizeof(EncryptedInfo));
6695
6696
0
        ret = wc_EncryptedInfoGet(info, type);
6697
0
        if (ret < 0)
6698
0
            goto end;
6699
6700
0
        if (data == NULL) {
6701
0
            ret = (int)info->keySz;
6702
0
            goto end;
6703
0
        }
6704
6705
0
        ret = wolfSSL_EVP_get_hashinfo(md, &hashType, NULL);
6706
0
        if (ret == WC_NO_ERR_TRACE(WOLFSSL_FAILURE))
6707
0
            goto end;
6708
6709
0
        ret = wc_PBKDF1_ex(key, (int)info->keySz, iv, (int)info->ivSz, data, sz,
6710
0
                           salt, EVP_SALT_SIZE, count, hashType, NULL);
6711
0
        if (ret == 0)
6712
0
            ret = (int)info->keySz;
6713
6714
0
    end:
6715
0
        WC_FREE_VAR_EX(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
6716
0
        if (ret < 0)
6717
0
            return 0; /* failure - for compatibility */
6718
6719
0
        return ret;
6720
0
    }
6721
6722
#endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
6723
6724
6725
#ifndef NO_AES
6726
#if defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_192) || \
6727
    defined(WOLFSSL_AES_256)
6728
    #define AES_SIZE_ANY
6729
#endif
6730
6731
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \
6732
    defined(HAVE_AES_ECB) || defined(WOLFSSL_AES_CFB) || \
6733
    defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_DIRECT)
6734
    #define AES_SET_KEY
6735
#endif
6736
6737
#if defined(AES_SIZE_ANY) && defined(AES_SET_KEY)
6738
    static int   AesSetKey_ex(Aes* aes, const byte* key, word32 len,
6739
                              const byte* iv, int dir, int direct)
6740
2.33k
    {
6741
2.33k
        int ret;
6742
        /* wc_AesSetKey clear aes.reg if iv == NULL.
6743
           Keep IV for openSSL compatibility */
6744
2.33k
        if (iv == NULL)
6745
1.56k
            XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, WC_AES_BLOCK_SIZE);
6746
2.33k
        if (direct) {
6747
631
        #if defined(WOLFSSL_AES_DIRECT)
6748
631
            ret = wc_AesSetKeyDirect(aes, key, len, iv, dir);
6749
        #else
6750
            ret = NOT_COMPILED_IN;
6751
        #endif
6752
631
        }
6753
1.70k
        else {
6754
1.70k
            ret = wc_AesSetKey(aes, key, len, iv, dir);
6755
1.70k
        }
6756
2.33k
        if (iv == NULL)
6757
1.56k
            XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, WC_AES_BLOCK_SIZE);
6758
2.33k
        return ret;
6759
2.33k
    }
6760
#endif /* AES_ANY_SIZE && AES_SET_KEY */
6761
#endif /* NO_AES */
6762
6763
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6764
    || FIPS_VERSION_GE(2,0))
6765
    static int EvpCipherInitAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6766
                                   const WOLFSSL_EVP_CIPHER* type,
6767
                                   const byte* key, const byte* iv, int enc)
6768
2.90k
    {
6769
2.90k
        int ret = WOLFSSL_SUCCESS;
6770
6771
2.90k
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6772
2.90k
        ctx->authIn = NULL;
6773
2.90k
        ctx->authInSz = 0;
6774
6775
2.90k
        ctx->block_size = WC_AES_BLOCK_SIZE;
6776
2.90k
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6777
2.90k
        if (ctx->ivSz == 0) {
6778
1.17k
            ctx->ivSz = GCM_NONCE_MID_SZ;
6779
1.17k
        }
6780
2.90k
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6781
2.90k
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
6782
2.90k
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6783
2.90k
        if (enc == 0 || enc == 1) {
6784
2.15k
            ctx->enc = enc ? 1 : 0;
6785
2.15k
        }
6786
6787
2.90k
    #ifdef WOLFSSL_AES_128
6788
2.90k
        if (ctx->cipherType == WC_AES_128_GCM_TYPE ||
6789
2.16k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))) {
6790
1.25k
            WOLFSSL_MSG("EVP_AES_128_GCM");
6791
1.25k
            ctx->cipherType = WC_AES_128_GCM_TYPE;
6792
1.25k
            ctx->keyLen = AES_128_KEY_SIZE;
6793
1.25k
        }
6794
2.90k
    #endif
6795
2.90k
    #ifdef WOLFSSL_AES_192
6796
2.90k
        if (ctx->cipherType == WC_AES_192_GCM_TYPE ||
6797
2.79k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))) {
6798
282
            WOLFSSL_MSG("EVP_AES_192_GCM");
6799
282
            ctx->cipherType = WC_AES_192_GCM_TYPE;
6800
282
            ctx->keyLen = AES_192_KEY_SIZE;
6801
282
        }
6802
2.90k
    #endif
6803
2.90k
    #ifdef WOLFSSL_AES_256
6804
2.90k
        if (ctx->cipherType == WC_AES_256_GCM_TYPE ||
6805
2.01k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))) {
6806
1.37k
            WOLFSSL_MSG("EVP_AES_256_GCM");
6807
1.37k
            ctx->cipherType = WC_AES_256_GCM_TYPE;
6808
1.37k
            ctx->keyLen = AES_256_KEY_SIZE;
6809
1.37k
        }
6810
2.90k
    #endif
6811
6812
2.90k
        if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
6813
1.17k
            if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
6814
0
                ret = WOLFSSL_FAILURE;
6815
1.17k
            else
6816
1.17k
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
6817
1.17k
        }
6818
6819
    #ifndef WOLFSSL_AESGCM_STREAM
6820
        if (ret == WOLFSSL_SUCCESS && key &&
6821
            wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) {
6822
            WOLFSSL_MSG("wc_AesGcmSetKey() failed");
6823
            ret = WOLFSSL_FAILURE;
6824
        }
6825
    #endif /* !WOLFSSL_AESGCM_STREAM */
6826
2.90k
        if (ret == WOLFSSL_SUCCESS && iv &&
6827
1.73k
            wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
6828
0
            WOLFSSL_MSG("wc_AesGcmSetExtIV() failed");
6829
0
            ret = WOLFSSL_FAILURE;
6830
0
        }
6831
2.90k
    #ifdef WOLFSSL_AESGCM_STREAM
6832
        /*
6833
         * Initialize with key and IV if available. wc_AesGcmInit will fail
6834
         * if called with IV only and no key has been set.
6835
         */
6836
2.90k
        if (ret == WOLFSSL_SUCCESS &&
6837
2.90k
            (key || (iv && ctx->cipher.aes.gcmKeySet)) &&
6838
1.73k
            wc_AesGcmInit(&ctx->cipher.aes, key,
6839
1.73k
                          (key == NULL) ? 0 : (word32)ctx->keyLen, iv,
6840
1.73k
                          (iv == NULL) ? 0 : (word32)ctx->ivSz) != 0) {
6841
0
            WOLFSSL_MSG("wc_AesGcmInit() failed");
6842
0
            ret = WOLFSSL_FAILURE;
6843
0
        }
6844
2.90k
    #endif /* WOLFSSL_AESGCM_STREAM */
6845
6846
        /*
6847
         * OpenSSL clears this flag, which permits subsequent use of
6848
         * EVP_CTRL_GCM_IV_GEN, when EVP_CipherInit is called with no key.
6849
         * If a key is provided, the flag retains its value.
6850
         */
6851
2.90k
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
6852
1.92k
            ctx->authIvGenEnable = 0;
6853
1.92k
        }
6854
6855
2.90k
        return ret;
6856
2.90k
    }
6857
6858
    static int EvpCipherAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
6859
                               const byte* src, word32 len)
6860
0
    {
6861
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
6862
6863
    #ifndef WOLFSSL_AESGCM_STREAM
6864
        /* No destination means only AAD. */
6865
        if (src != NULL && dst == NULL) {
6866
            ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
6867
        }
6868
        else if (src != NULL && dst != NULL) {
6869
            if (ctx->enc) {
6870
                ret = wc_AesGcmEncrypt(&ctx->cipher.aes, dst, src,
6871
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6872
                        ctx->authTagSz, ctx->authIn,
6873
                        ctx->authInSz);
6874
            }
6875
            else {
6876
                ret = wc_AesGcmDecrypt(&ctx->cipher.aes, dst, src,
6877
                        len, ctx->iv, ctx->ivSz, ctx->authTag,
6878
                        ctx->authTagSz, ctx->authIn,
6879
                        ctx->authInSz);
6880
            }
6881
            if (ctx->authIncIv) {
6882
                IncCtr((byte*)ctx->cipher.aes.reg,
6883
                       ctx->cipher.aes.nonceSz);
6884
                ctx->authIncIv = 0;
6885
            }
6886
        }
6887
    #else
6888
        /*
6889
         * No need to call wc_AesGcmInit. Should have been called by
6890
         * wolfSSL_EVP_CipherInit.
6891
         */
6892
        /* NULL dst and non-NULL src means only AAD. */
6893
0
        if (src != NULL && dst == NULL) {
6894
0
            if (ctx->enc) {
6895
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL,
6896
0
                    NULL, 0, src, len);
6897
0
            }
6898
0
            else {
6899
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL,
6900
0
                    NULL, 0, src, len);
6901
0
            }
6902
0
        }
6903
        /* Only plain/cipher text. */
6904
0
        else if (src != NULL && dst != NULL) {
6905
0
            if (ctx->enc) {
6906
0
                ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, dst, src,
6907
0
                    len, NULL, 0);
6908
0
            }
6909
0
            else {
6910
0
                ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, dst, src,
6911
0
                    len, NULL, 0);
6912
0
            }
6913
0
        }
6914
        /*
6915
         * src == NULL is analogous to other "final"-type functions
6916
         * (e.g. EVP_CipherFinal). Calculates tag on encrypt
6917
         * and checks tag on decrypt.
6918
         */
6919
0
        else {
6920
0
            if (ctx->enc) {
6921
                /* Calculate authentication tag. */
6922
0
                ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes,
6923
0
                    ctx->authTag, (word32)ctx->authTagSz);
6924
                /*
6925
                 * wc_AesGcmEncryptFinal increments the IV in
6926
                 * ctx->cipher.aes.reg, so we don't call IncCtr here.
6927
                 */
6928
0
            }
6929
0
            else {
6930
                /* Calculate authentication tag and compare. */
6931
0
                ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes,
6932
0
                    ctx->authTag, (word32)ctx->authTagSz);
6933
0
                if (ctx->authIncIv) {
6934
0
                    IncCtr((byte*)ctx->cipher.aes.reg,
6935
0
                           ctx->cipher.aes.nonceSz);
6936
0
                }
6937
0
            }
6938
            /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
6939
0
            if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
6940
0
                              (byte*)ctx->cipher.aes.reg,
6941
0
                              (word32)ctx->ivSz) != 0) {
6942
0
                WOLFSSL_MSG("wc_AesGcmInit failed");
6943
0
                return WOLFSSL_FAILURE;
6944
0
            }
6945
0
            ctx->authIncIv = 0;
6946
0
        }
6947
0
    #endif /* WOLFSSL_AESGCM_STREAM */
6948
0
        if (src == NULL) {
6949
            /*
6950
             * Clear any leftover AAD on final (final is when src is
6951
             * NULL).
6952
             */
6953
0
            if (ctx->authIn != NULL) {
6954
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
6955
0
            }
6956
0
            ctx->authInSz = 0;
6957
0
        }
6958
0
        if (ret == 0) {
6959
0
            ret = (int)len;
6960
0
        }
6961
6962
0
        return ret;
6963
0
    }
6964
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
6965
        * HAVE_FIPS_VERSION >= 2 */
6966
6967
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
6968
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
6969
    || FIPS_VERSION_GE(2,0))
6970
    static int EvpCipherInitAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
6971
                                   const WOLFSSL_EVP_CIPHER* type,
6972
                                   const byte* key, const byte* iv, int enc)
6973
0
    {
6974
0
        int ret = WOLFSSL_SUCCESS;
6975
6976
0
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
6977
0
        ctx->authIn = NULL;
6978
0
        ctx->authInSz = 0;
6979
6980
0
        ctx->block_size = WC_AES_BLOCK_SIZE;
6981
0
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
6982
0
        if (ctx->ivSz == 0) {
6983
0
            ctx->ivSz = GCM_NONCE_MID_SZ;
6984
0
        }
6985
0
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
6986
0
        ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
6987
0
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
6988
0
        if (enc == 0 || enc == 1) {
6989
0
            ctx->enc = enc ? 1 : 0;
6990
0
        }
6991
6992
0
    #ifdef WOLFSSL_AES_128
6993
0
        if (ctx->cipherType == WC_AES_128_CCM_TYPE ||
6994
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))) {
6995
0
            WOLFSSL_MSG("EVP_AES_128_CCM");
6996
0
            ctx->cipherType = WC_AES_128_CCM_TYPE;
6997
0
            ctx->keyLen = AES_128_KEY_SIZE;
6998
0
        }
6999
0
    #endif
7000
0
    #ifdef WOLFSSL_AES_192
7001
0
        if (ctx->cipherType == WC_AES_192_CCM_TYPE ||
7002
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))) {
7003
0
            WOLFSSL_MSG("EVP_AES_192_CCM");
7004
0
            ctx->cipherType = WC_AES_192_CCM_TYPE;
7005
0
            ctx->keyLen = AES_192_KEY_SIZE;
7006
0
        }
7007
0
    #endif
7008
0
    #ifdef WOLFSSL_AES_256
7009
0
        if (ctx->cipherType == WC_AES_256_CCM_TYPE ||
7010
0
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))) {
7011
0
            WOLFSSL_MSG("EVP_AES_256_CCM");
7012
0
            ctx->cipherType = WC_AES_256_CCM_TYPE;
7013
0
            ctx->keyLen = AES_256_KEY_SIZE;
7014
0
        }
7015
0
    #endif
7016
7017
0
        if (ret == WOLFSSL_SUCCESS) {
7018
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7019
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) {
7020
0
                    WOLFSSL_MSG("wc_AesInit() failed");
7021
0
                    ret = WOLFSSL_FAILURE;
7022
0
                } else
7023
0
                    ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7024
0
            }
7025
0
        }
7026
7027
0
        if (ret == WOLFSSL_SUCCESS && key &&
7028
0
            wc_AesCcmSetKey(&ctx->cipher.aes, key, (word32)ctx->keyLen)) {
7029
0
            WOLFSSL_MSG("wc_AesCcmSetKey() failed");
7030
0
            ret = WOLFSSL_FAILURE;
7031
0
        }
7032
0
        if (ret == WOLFSSL_SUCCESS && iv &&
7033
0
            wc_AesCcmSetNonce(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
7034
0
            WOLFSSL_MSG("wc_AesCcmSetNonce() failed");
7035
0
            ret = WOLFSSL_FAILURE;
7036
0
        }
7037
7038
        /*
7039
         * OpenSSL clears this flag, which permits subsequent use of
7040
         * EVP_CTRL_CCM_IV_GEN, when EVP_CipherInit is called with no key.
7041
         * If a key is provided, the flag retains its value.
7042
         */
7043
0
        if (ret == WOLFSSL_SUCCESS && key == NULL) {
7044
0
            ctx->authIvGenEnable = 0;
7045
0
        }
7046
7047
0
        return ret;
7048
0
    }
7049
7050
    static int EvpCipherAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
7051
                               const byte* src, word32 len)
7052
0
    {
7053
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
7054
7055
        /* No destination means only AAD. */
7056
0
        if (src != NULL && dst == NULL) {
7057
0
            ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, (int)len);
7058
0
        }
7059
0
        else if (src != NULL && dst != NULL) {
7060
0
            if (ctx->enc) {
7061
0
                ret = wc_AesCcmEncrypt(&ctx->cipher.aes, dst, src,
7062
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7063
0
                        (word32)ctx->authTagSz, ctx->authIn,
7064
0
                        (word32)ctx->authInSz);
7065
0
            }
7066
0
            else {
7067
0
                ret = wc_AesCcmDecrypt(&ctx->cipher.aes, dst, src,
7068
0
                        len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
7069
0
                        (word32)ctx->authTagSz, ctx->authIn,
7070
0
                        (word32)ctx->authInSz);
7071
0
            }
7072
0
            if (ctx->authIncIv) {
7073
0
                IncCtr((byte*)ctx->cipher.aes.reg,
7074
0
                       ctx->cipher.aes.nonceSz);
7075
0
                ctx->authIncIv = 0;
7076
0
            }
7077
0
        }
7078
0
        if (src == NULL) {
7079
            /*
7080
             * Clear any leftover AAD on final (final is when src is
7081
             * NULL).
7082
             */
7083
0
            if (ctx->authIn != NULL) {
7084
0
                XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
7085
0
            }
7086
0
            ctx->authInSz = 0;
7087
0
        }
7088
0
        if (ret == 0) {
7089
0
            ret = (int)len;
7090
0
        }
7091
7092
0
        return ret;
7093
0
    }
7094
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7095
        * HAVE_FIPS_VERSION >= 2 */
7096
7097
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7098
    || FIPS_VERSION_GE(2,0))
7099
    static int EvpCipherInitAriaGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
7100
                                    const WOLFSSL_EVP_CIPHER* type,
7101
                                    const byte* key, const byte* iv, int enc)
7102
    {
7103
        int ret = WOLFSSL_SUCCESS;
7104
7105
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7106
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))) {
7107
            WOLFSSL_MSG("EVP_ARIA_128_GCM");
7108
            ctx->cipherType = WC_ARIA_128_GCM_TYPE;
7109
            ctx->keyLen = ARIA_128_KEY_SIZE;
7110
        } else if (ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7111
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))) {
7112
            WOLFSSL_MSG("EVP_ARIA_192_GCM");
7113
            ctx->cipherType = WC_ARIA_192_GCM_TYPE;
7114
            ctx->keyLen = ARIA_192_KEY_SIZE;
7115
        } else if (ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7116
                   (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))) {
7117
            WOLFSSL_MSG("EVP_ARIA_256_GCM");
7118
            ctx->cipherType = WC_ARIA_256_GCM_TYPE;
7119
            ctx->keyLen = ARIA_256_KEY_SIZE;
7120
        } else {
7121
            WOLFSSL_MSG("Unrecognized cipher type");
7122
            return WOLFSSL_FAILURE;
7123
        }
7124
7125
        XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
7126
        ctx->authIn = NULL;
7127
        ctx->authInSz = 0;
7128
7129
        ctx->block_size = WC_AES_BLOCK_SIZE;
7130
        ctx->authTagSz = WC_AES_BLOCK_SIZE;
7131
        if (ctx->ivSz == 0) {
7132
            ctx->ivSz = GCM_NONCE_MID_SZ;
7133
        }
7134
        ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7135
        ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
7136
                      WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
7137
        if (enc == 0 || enc == 1) {
7138
            ctx->enc = enc ? 1 : 0;
7139
        }
7140
7141
        switch(ctx->cipherType) {
7142
            case WC_ARIA_128_GCM_TYPE:
7143
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_128BITKEY);
7144
                break;
7145
            case WC_ARIA_192_GCM_TYPE:
7146
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_192BITKEY);
7147
                break;
7148
            case WC_ARIA_256_GCM_TYPE:
7149
                ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_256BITKEY);
7150
                break;
7151
            default:
7152
                WOLFSSL_MSG("Unimplemented cipherType");
7153
                return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */
7154
        }
7155
        if (ret != 0) {
7156
            WOLFSSL_MSG(MC_GetErrorString(ret));
7157
            WOLFSSL_MSG(MC_GetError(ctx->cipher.aria.hSession));
7158
            return WOLFSSL_FAILURE;
7159
        }
7160
7161
        if (key && wc_AriaSetKey(&ctx->cipher.aria, (byte *)key)) {
7162
            WOLFSSL_MSG("wc_AriaSetKey() failed");
7163
            return WOLFSSL_FAILURE;
7164
        }
7165
        if (iv && wc_AriaGcmSetExtIV(&ctx->cipher.aria, iv, ctx->ivSz)) {
7166
            WOLFSSL_MSG("wc_AriaGcmSetIV() failed");
7167
            return WOLFSSL_FAILURE;
7168
        }
7169
7170
        return WOLFSSL_SUCCESS;
7171
    }
7172
#endif /* HAVE_ARIA && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7173
        * HAVE_FIPS_VERSION >= 2 */
7174
7175
    /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
7176
    int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
7177
                               const WOLFSSL_EVP_CIPHER* type, const byte* key,
7178
                               const byte* iv, int enc)
7179
13.5k
    {
7180
13.5k
        int ret = 0;
7181
13.5k
        (void)key;
7182
13.5k
        (void)iv;
7183
13.5k
        (void)enc;
7184
7185
13.5k
        WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
7186
13.5k
        if (ctx == NULL) {
7187
0
            WOLFSSL_MSG("no ctx");
7188
0
            return WOLFSSL_FAILURE;
7189
0
        }
7190
7191
13.5k
        if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
7192
0
            WOLFSSL_MSG("no type set");
7193
0
            return WOLFSSL_FAILURE;
7194
0
        }
7195
13.5k
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
7196
            /* only first EVP_CipherInit invoke. ctx->cipherType is set below */
7197
5.29k
            XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
7198
5.29k
            ctx->flags   = 0;
7199
5.29k
        }
7200
7201
        /* always clear buffer state */
7202
13.5k
        ctx->bufUsed = 0;
7203
13.5k
        ctx->lastUsed = 0;
7204
7205
13.5k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
7206
13.5k
        if (!iv && ctx->ivSz) {
7207
2.27k
            iv = ctx->iv;
7208
2.27k
        }
7209
13.5k
#endif
7210
7211
13.5k
#ifndef NO_AES
7212
13.5k
    #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
7213
13.5k
        #ifdef WOLFSSL_AES_128
7214
13.5k
        if (ctx->cipherType == WC_AES_128_CBC_TYPE ||
7215
13.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CBC))) {
7216
582
            WOLFSSL_MSG("EVP_AES_128_CBC");
7217
582
            ctx->cipherType = WC_AES_128_CBC_TYPE;
7218
582
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7219
582
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7220
582
            ctx->keyLen     = 16;
7221
582
            ctx->block_size = WC_AES_BLOCK_SIZE;
7222
582
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7223
582
            if (enc == 0 || enc == 1)
7224
470
                ctx->enc = enc ? 1 : 0;
7225
582
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7226
316
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7227
0
                    return WOLFSSL_FAILURE;
7228
316
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7229
316
            }
7230
582
            if (key) {
7231
307
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7232
307
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7233
307
                if (ret != 0)
7234
0
                    return WOLFSSL_FAILURE;
7235
307
            }
7236
582
            if (iv && key == NULL) {
7237
112
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7238
112
                if (ret != 0)
7239
0
                    return WOLFSSL_FAILURE;
7240
112
            }
7241
582
        }
7242
13.5k
        #endif /* WOLFSSL_AES_128 */
7243
13.5k
        #ifdef WOLFSSL_AES_192
7244
13.5k
        if (ctx->cipherType == WC_AES_192_CBC_TYPE ||
7245
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CBC))) {
7246
200
            WOLFSSL_MSG("EVP_AES_192_CBC");
7247
200
            ctx->cipherType = WC_AES_192_CBC_TYPE;
7248
200
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7249
200
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7250
200
            ctx->keyLen     = 24;
7251
200
            ctx->block_size = WC_AES_BLOCK_SIZE;
7252
200
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7253
200
            if (enc == 0 || enc == 1)
7254
158
                ctx->enc = enc ? 1 : 0;
7255
200
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7256
113
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7257
0
                    return WOLFSSL_FAILURE;
7258
113
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7259
113
            }
7260
200
            if (key) {
7261
108
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7262
108
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7263
108
                if (ret != 0)
7264
0
                    return WOLFSSL_FAILURE;
7265
108
            }
7266
200
            if (iv && key == NULL) {
7267
42
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7268
42
                if (ret != 0)
7269
0
                    return WOLFSSL_FAILURE;
7270
42
            }
7271
200
        }
7272
13.5k
        #endif /* WOLFSSL_AES_192 */
7273
13.5k
        #ifdef WOLFSSL_AES_256
7274
13.5k
        if (ctx->cipherType == WC_AES_256_CBC_TYPE ||
7275
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CBC))) {
7276
214
            WOLFSSL_MSG("EVP_AES_256_CBC");
7277
214
            ctx->cipherType = WC_AES_256_CBC_TYPE;
7278
214
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7279
214
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
7280
214
            ctx->keyLen     = 32;
7281
214
            ctx->block_size = WC_AES_BLOCK_SIZE;
7282
214
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7283
214
            if (enc == 0 || enc == 1)
7284
172
                ctx->enc = enc ? 1 : 0;
7285
214
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7286
108
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7287
0
                    return WOLFSSL_FAILURE;
7288
108
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7289
108
            }
7290
214
            if (key) {
7291
93
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7292
93
                            iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
7293
93
                if (ret != 0){
7294
0
                    WOLFSSL_MSG("AesSetKey() failed");
7295
0
                    return WOLFSSL_FAILURE;
7296
0
                }
7297
93
            }
7298
214
            if (iv && key == NULL) {
7299
42
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7300
42
                if (ret != 0){
7301
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7302
0
                    return WOLFSSL_FAILURE;
7303
0
                }
7304
42
            }
7305
214
        }
7306
13.5k
        #endif /* WOLFSSL_AES_256 */
7307
13.5k
    #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
7308
13.5k
    #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7309
13.5k
        || FIPS_VERSION_GE(2,0))
7310
13.5k
        if (FALSE
7311
13.5k
        #ifdef WOLFSSL_AES_128
7312
13.5k
            || ctx->cipherType == WC_AES_128_GCM_TYPE ||
7313
12.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))
7314
12.2k
        #endif
7315
12.2k
        #ifdef WOLFSSL_AES_192
7316
12.2k
            || ctx->cipherType == WC_AES_192_GCM_TYPE ||
7317
12.1k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))
7318
11.9k
        #endif
7319
11.9k
        #ifdef WOLFSSL_AES_256
7320
11.9k
            || ctx->cipherType == WC_AES_256_GCM_TYPE ||
7321
11.1k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))
7322
13.5k
        #endif
7323
13.5k
          ) {
7324
2.90k
            if (EvpCipherInitAesGCM(ctx, type, key, iv, enc)
7325
2.90k
                != WOLFSSL_SUCCESS) {
7326
0
                return WOLFSSL_FAILURE;
7327
0
            }
7328
2.90k
        }
7329
13.5k
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7330
            * HAVE_FIPS_VERSION >= 2 */
7331
13.5k
    #if defined(HAVE_AESCCM) && \
7332
13.5k
        ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
7333
13.5k
            || FIPS_VERSION_GE(2,0))
7334
13.5k
        if (FALSE
7335
13.5k
        #ifdef WOLFSSL_AES_128
7336
13.5k
            || ctx->cipherType == WC_AES_128_CCM_TYPE ||
7337
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))
7338
13.5k
        #endif
7339
13.5k
        #ifdef WOLFSSL_AES_192
7340
13.5k
            || ctx->cipherType == WC_AES_192_CCM_TYPE ||
7341
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))
7342
13.5k
        #endif
7343
13.5k
        #ifdef WOLFSSL_AES_256
7344
13.5k
            || ctx->cipherType == WC_AES_256_CCM_TYPE ||
7345
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))
7346
13.5k
        #endif
7347
13.5k
          )
7348
0
        {
7349
0
            if (EvpCipherInitAesCCM(ctx, type, key, iv, enc)
7350
0
                != WOLFSSL_SUCCESS) {
7351
0
                return WOLFSSL_FAILURE;
7352
0
            }
7353
0
        }
7354
13.5k
    #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
7355
            * HAVE_FIPS_VERSION >= 2 */
7356
13.5k
#ifdef WOLFSSL_AES_COUNTER
7357
13.5k
        #ifdef WOLFSSL_AES_128
7358
13.5k
        if (ctx->cipherType == WC_AES_128_CTR_TYPE ||
7359
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CTR))) {
7360
184
            WOLFSSL_MSG("EVP_AES_128_CTR");
7361
184
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7362
184
            ctx->cipherType = WC_AES_128_CTR_TYPE;
7363
184
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7364
184
            ctx->keyLen     = 16;
7365
184
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7366
184
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7367
184
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7368
184
            ctx->cipher.aes.left = 0;
7369
184
#endif
7370
184
            if (enc == 0 || enc == 1)
7371
131
                ctx->enc = enc ? 1 : 0;
7372
184
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7373
73
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7374
0
                    return WOLFSSL_FAILURE;
7375
73
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7376
73
            }
7377
184
            if (key) {
7378
58
                ret =  AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7379
58
                    iv, AES_ENCRYPTION, 1);
7380
58
                if (ret != 0)
7381
0
                    return WOLFSSL_FAILURE;
7382
58
            }
7383
184
            if (iv && key == NULL) {
7384
53
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7385
53
                if (ret != 0)
7386
0
                    return WOLFSSL_FAILURE;
7387
53
            }
7388
184
        }
7389
13.5k
        #endif /* WOLFSSL_AES_128 */
7390
13.5k
        #ifdef WOLFSSL_AES_192
7391
13.5k
        if (ctx->cipherType == WC_AES_192_CTR_TYPE ||
7392
12.7k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CTR))) {
7393
1.22k
            WOLFSSL_MSG("EVP_AES_192_CTR");
7394
1.22k
            ctx->cipherType = WC_AES_192_CTR_TYPE;
7395
1.22k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7396
1.22k
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7397
1.22k
            ctx->keyLen     = 24;
7398
1.22k
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7399
1.22k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7400
1.22k
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7401
1.22k
            ctx->cipher.aes.left = 0;
7402
1.22k
#endif
7403
1.22k
            if (enc == 0 || enc == 1)
7404
823
                ctx->enc = enc ? 1 : 0;
7405
1.22k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7406
418
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7407
0
                    return WOLFSSL_FAILURE;
7408
418
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7409
418
            }
7410
1.22k
            if (key) {
7411
405
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7412
405
                    iv, AES_ENCRYPTION, 1);
7413
405
                if (ret != 0)
7414
0
                    return WOLFSSL_FAILURE;
7415
405
            }
7416
1.22k
            if (iv && key == NULL) {
7417
400
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7418
400
                if (ret != 0)
7419
0
                    return WOLFSSL_FAILURE;
7420
400
            }
7421
1.22k
        }
7422
13.5k
        #endif /* WOLFSSL_AES_192 */
7423
13.5k
        #ifdef WOLFSSL_AES_256
7424
13.5k
        if (ctx->cipherType == WC_AES_256_CTR_TYPE ||
7425
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CTR))) {
7426
143
            WOLFSSL_MSG("EVP_AES_256_CTR");
7427
143
            ctx->cipherType = WC_AES_256_CTR_TYPE;
7428
143
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7429
143
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
7430
143
            ctx->keyLen     = 32;
7431
143
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
7432
143
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7433
143
#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
7434
143
            ctx->cipher.aes.left = 0;
7435
143
#endif
7436
143
            if (enc == 0 || enc == 1)
7437
106
                ctx->enc = enc ? 1 : 0;
7438
143
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7439
62
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7440
0
                    return WOLFSSL_FAILURE;
7441
62
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7442
62
            }
7443
143
            if (key) {
7444
44
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7445
44
                    iv, AES_ENCRYPTION, 1);
7446
44
                if (ret != 0)
7447
0
                    return WOLFSSL_FAILURE;
7448
44
            }
7449
143
            if (iv && key == NULL) {
7450
37
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7451
37
                if (ret != 0)
7452
0
                    return WOLFSSL_FAILURE;
7453
37
            }
7454
143
        }
7455
13.5k
        #endif /* WOLFSSL_AES_256 */
7456
13.5k
#endif /* WOLFSSL_AES_COUNTER */
7457
13.5k
    #ifdef HAVE_AES_ECB
7458
13.5k
        #ifdef WOLFSSL_AES_128
7459
13.5k
        if (ctx->cipherType == WC_AES_128_ECB_TYPE ||
7460
13.4k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_ECB))) {
7461
130
            WOLFSSL_MSG("EVP_AES_128_ECB");
7462
130
            ctx->cipherType = WC_AES_128_ECB_TYPE;
7463
130
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7464
130
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7465
130
            ctx->keyLen     = 16;
7466
130
            ctx->block_size = WC_AES_BLOCK_SIZE;
7467
130
            if (enc == 0 || enc == 1)
7468
113
                ctx->enc = enc ? 1 : 0;
7469
130
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7470
73
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7471
0
                    return WOLFSSL_FAILURE;
7472
73
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7473
73
            }
7474
130
            if (key) {
7475
40
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7476
40
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7477
40
            }
7478
130
            if (ret != 0)
7479
0
                return WOLFSSL_FAILURE;
7480
130
        }
7481
13.5k
        #endif /* WOLFSSL_AES_128 */
7482
13.5k
        #ifdef WOLFSSL_AES_192
7483
13.5k
        if (ctx->cipherType == WC_AES_192_ECB_TYPE ||
7484
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_ECB))) {
7485
147
            WOLFSSL_MSG("EVP_AES_192_ECB");
7486
147
            ctx->cipherType = WC_AES_192_ECB_TYPE;
7487
147
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7488
147
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7489
147
            ctx->keyLen     = 24;
7490
147
            ctx->block_size = WC_AES_BLOCK_SIZE;
7491
147
            if (enc == 0 || enc == 1)
7492
107
                ctx->enc = enc ? 1 : 0;
7493
147
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7494
60
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7495
0
                    return WOLFSSL_FAILURE;
7496
60
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7497
60
            }
7498
147
            if (key) {
7499
47
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7500
47
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7501
47
            }
7502
147
            if (ret != 0)
7503
0
                return WOLFSSL_FAILURE;
7504
147
        }
7505
13.5k
        #endif /* WOLFSSL_AES_192 */
7506
13.5k
        #ifdef WOLFSSL_AES_256
7507
13.5k
        if (ctx->cipherType == WC_AES_256_ECB_TYPE ||
7508
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_ECB))) {
7509
113
            WOLFSSL_MSG("EVP_AES_256_ECB");
7510
113
            ctx->cipherType = WC_AES_256_ECB_TYPE;
7511
113
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7512
113
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
7513
113
            ctx->keyLen     = 32;
7514
113
            ctx->block_size = WC_AES_BLOCK_SIZE;
7515
113
            if (enc == 0 || enc == 1)
7516
98
                ctx->enc = enc ? 1 : 0;
7517
113
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7518
61
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7519
0
                    return WOLFSSL_FAILURE;
7520
61
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7521
61
            }
7522
113
            if (key) {
7523
37
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7524
37
                    NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
7525
37
            }
7526
113
            if (ret != 0)
7527
0
                return WOLFSSL_FAILURE;
7528
113
        }
7529
13.5k
        #endif /* WOLFSSL_AES_256 */
7530
13.5k
    #endif /* HAVE_AES_ECB */
7531
13.5k
    #ifdef WOLFSSL_AES_CFB
7532
13.5k
    #ifndef WOLFSSL_NO_AES_CFB_1_8
7533
13.5k
        #ifdef WOLFSSL_AES_128
7534
13.5k
        if (ctx->cipherType == WC_AES_128_CFB1_TYPE ||
7535
13.3k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB1))) {
7536
327
            WOLFSSL_MSG("EVP_AES_128_CFB1");
7537
327
            ctx->cipherType = WC_AES_128_CFB1_TYPE;
7538
327
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7539
327
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7540
327
            ctx->keyLen     = 16;
7541
327
            ctx->block_size = 1;
7542
327
            if (enc == 0 || enc == 1)
7543
257
                ctx->enc = enc ? 1 : 0;
7544
327
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7545
137
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7546
0
                    return WOLFSSL_FAILURE;
7547
137
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7548
137
            }
7549
327
            if (key) {
7550
120
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7551
120
                    iv, AES_ENCRYPTION, 0);
7552
120
                if (ret != 0)
7553
0
                    return WOLFSSL_FAILURE;
7554
120
            }
7555
327
            if (iv && key == NULL) {
7556
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7557
0
                if (ret != 0)
7558
0
                    return WOLFSSL_FAILURE;
7559
0
            }
7560
327
        }
7561
13.5k
        #endif /* WOLFSSL_AES_128 */
7562
13.5k
        #ifdef WOLFSSL_AES_192
7563
13.5k
        if (ctx->cipherType == WC_AES_192_CFB1_TYPE ||
7564
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB1))) {
7565
118
            WOLFSSL_MSG("EVP_AES_192_CFB1");
7566
118
            ctx->cipherType = WC_AES_192_CFB1_TYPE;
7567
118
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7568
118
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7569
118
            ctx->keyLen     = 24;
7570
118
            ctx->block_size = 1;
7571
118
            if (enc == 0 || enc == 1)
7572
86
                ctx->enc = enc ? 1 : 0;
7573
118
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7574
46
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7575
0
                    return WOLFSSL_FAILURE;
7576
46
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7577
46
            }
7578
118
            if (key) {
7579
40
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7580
40
                    iv, AES_ENCRYPTION, 0);
7581
40
                if (ret != 0)
7582
0
                    return WOLFSSL_FAILURE;
7583
40
            }
7584
118
            if (iv && key == NULL) {
7585
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7586
0
                if (ret != 0)
7587
0
                    return WOLFSSL_FAILURE;
7588
0
            }
7589
118
        }
7590
13.5k
        #endif /* WOLFSSL_AES_192 */
7591
13.5k
        #ifdef WOLFSSL_AES_256
7592
13.5k
        if (ctx->cipherType == WC_AES_256_CFB1_TYPE ||
7593
13.2k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB1))) {
7594
459
            WOLFSSL_MSG("EVP_AES_256_CFB1");
7595
459
            ctx->cipherType = WC_AES_256_CFB1_TYPE;
7596
459
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7597
459
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7598
459
            ctx->keyLen     = 32;
7599
459
            ctx->block_size = 1;
7600
459
            if (enc == 0 || enc == 1)
7601
319
                ctx->enc = enc ? 1 : 0;
7602
459
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7603
168
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7604
0
                    return WOLFSSL_FAILURE;
7605
168
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7606
168
            }
7607
459
            if (key) {
7608
151
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7609
151
                    iv, AES_ENCRYPTION, 0);
7610
151
                if (ret != 0){
7611
0
                    WOLFSSL_MSG("AesSetKey() failed");
7612
0
                    return WOLFSSL_FAILURE;
7613
0
                }
7614
151
            }
7615
459
            if (iv && key == NULL) {
7616
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7617
0
                if (ret != 0){
7618
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7619
0
                    return WOLFSSL_FAILURE;
7620
0
                }
7621
0
            }
7622
459
        }
7623
13.5k
        #endif /* WOLFSSL_AES_256 */
7624
13.5k
        #ifdef WOLFSSL_AES_128
7625
13.5k
        if (ctx->cipherType == WC_AES_128_CFB8_TYPE ||
7626
13.2k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB8))) {
7627
503
            WOLFSSL_MSG("EVP_AES_128_CFB8");
7628
503
            ctx->cipherType = WC_AES_128_CFB8_TYPE;
7629
503
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7630
503
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7631
503
            ctx->keyLen     = 16;
7632
503
            ctx->block_size = 1;
7633
503
            if (enc == 0 || enc == 1)
7634
347
                ctx->enc = enc ? 1 : 0;
7635
503
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7636
187
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7637
0
                    return WOLFSSL_FAILURE;
7638
187
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7639
187
            }
7640
503
            if (key) {
7641
160
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7642
160
                    iv, AES_ENCRYPTION, 0);
7643
160
                if (ret != 0)
7644
0
                    return WOLFSSL_FAILURE;
7645
160
            }
7646
503
            if (iv && key == NULL) {
7647
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7648
0
                if (ret != 0)
7649
0
                    return WOLFSSL_FAILURE;
7650
0
            }
7651
503
        }
7652
13.5k
        #endif /* WOLFSSL_AES_128 */
7653
13.5k
        #ifdef WOLFSSL_AES_192
7654
13.5k
        if (ctx->cipherType == WC_AES_192_CFB8_TYPE ||
7655
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB8))) {
7656
300
            WOLFSSL_MSG("EVP_AES_192_CFB8");
7657
300
            ctx->cipherType = WC_AES_192_CFB8_TYPE;
7658
300
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7659
300
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7660
300
            ctx->keyLen     = 24;
7661
300
            ctx->block_size = 1;
7662
300
            if (enc == 0 || enc == 1)
7663
211
                ctx->enc = enc ? 1 : 0;
7664
300
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7665
110
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7666
0
                    return WOLFSSL_FAILURE;
7667
110
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7668
110
            }
7669
300
            if (key) {
7670
101
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7671
101
                    iv, AES_ENCRYPTION, 0);
7672
101
                if (ret != 0)
7673
0
                    return WOLFSSL_FAILURE;
7674
101
            }
7675
300
            if (iv && key == NULL) {
7676
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7677
0
                if (ret != 0)
7678
0
                    return WOLFSSL_FAILURE;
7679
0
            }
7680
300
        }
7681
13.5k
        #endif /* WOLFSSL_AES_192 */
7682
13.5k
        #ifdef WOLFSSL_AES_256
7683
13.5k
        if (ctx->cipherType == WC_AES_256_CFB8_TYPE ||
7684
13.4k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB8))) {
7685
248
            WOLFSSL_MSG("EVP_AES_256_CFB8");
7686
248
            ctx->cipherType = WC_AES_256_CFB8_TYPE;
7687
248
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7688
248
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7689
248
            ctx->keyLen     = 32;
7690
248
            ctx->block_size = 1;
7691
248
            if (enc == 0 || enc == 1)
7692
197
                ctx->enc = enc ? 1 : 0;
7693
248
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7694
139
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7695
0
                    return WOLFSSL_FAILURE;
7696
139
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7697
139
            }
7698
248
            if (key) {
7699
58
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7700
58
                    iv, AES_ENCRYPTION, 0);
7701
58
                if (ret != 0){
7702
0
                    WOLFSSL_MSG("AesSetKey() failed");
7703
0
                    return WOLFSSL_FAILURE;
7704
0
                }
7705
58
            }
7706
248
            if (iv && key == NULL) {
7707
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7708
0
                if (ret != 0){
7709
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7710
0
                    return WOLFSSL_FAILURE;
7711
0
                }
7712
0
            }
7713
248
        }
7714
13.5k
        #endif /* WOLFSSL_AES_256 */
7715
13.5k
        #endif /* !WOLFSSL_NO_AES_CFB_1_8 */
7716
13.5k
        #ifdef WOLFSSL_AES_128
7717
13.5k
        if (ctx->cipherType == WC_AES_128_CFB128_TYPE ||
7718
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB128))) {
7719
0
            WOLFSSL_MSG("EVP_AES_128_CFB128");
7720
0
            ctx->cipherType = WC_AES_128_CFB128_TYPE;
7721
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7722
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7723
0
            ctx->keyLen     = 16;
7724
0
            ctx->block_size = 1;
7725
0
            if (enc == 0 || enc == 1)
7726
0
                ctx->enc = enc ? 1 : 0;
7727
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7728
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7729
0
                    return WOLFSSL_FAILURE;
7730
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7731
0
            }
7732
0
            if (key) {
7733
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7734
0
                    iv, AES_ENCRYPTION, 0);
7735
0
                if (ret != 0)
7736
0
                    return WOLFSSL_FAILURE;
7737
0
            }
7738
0
            if (iv && key == NULL) {
7739
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7740
0
                if (ret != 0)
7741
0
                    return WOLFSSL_FAILURE;
7742
0
            }
7743
0
        }
7744
13.5k
        #endif /* WOLFSSL_AES_128 */
7745
13.5k
        #ifdef WOLFSSL_AES_192
7746
13.5k
        if (ctx->cipherType == WC_AES_192_CFB128_TYPE ||
7747
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB128))) {
7748
0
            WOLFSSL_MSG("EVP_AES_192_CFB128");
7749
0
            ctx->cipherType = WC_AES_192_CFB128_TYPE;
7750
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7751
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7752
0
            ctx->keyLen     = 24;
7753
0
            ctx->block_size = 1;
7754
0
            if (enc == 0 || enc == 1)
7755
0
                ctx->enc = enc ? 1 : 0;
7756
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7757
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7758
0
                    return WOLFSSL_FAILURE;
7759
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7760
0
            }
7761
0
            if (key) {
7762
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7763
0
                    iv, AES_ENCRYPTION, 0);
7764
0
                if (ret != 0)
7765
0
                    return WOLFSSL_FAILURE;
7766
0
            }
7767
0
            if (iv && key == NULL) {
7768
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7769
0
                if (ret != 0)
7770
0
                    return WOLFSSL_FAILURE;
7771
0
            }
7772
0
        }
7773
13.5k
        #endif /* WOLFSSL_AES_192 */
7774
13.5k
        #ifdef WOLFSSL_AES_256
7775
13.5k
        if (ctx->cipherType == WC_AES_256_CFB128_TYPE ||
7776
13.5k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB128))) {
7777
0
            WOLFSSL_MSG("EVP_AES_256_CFB128");
7778
0
            ctx->cipherType = WC_AES_256_CFB128_TYPE;
7779
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7780
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CFB_MODE;
7781
0
            ctx->keyLen     = 32;
7782
0
            ctx->block_size = 1;
7783
0
            if (enc == 0 || enc == 1)
7784
0
                ctx->enc = enc ? 1 : 0;
7785
0
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7786
0
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7787
0
                    return WOLFSSL_FAILURE;
7788
0
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7789
0
            }
7790
0
            if (key) {
7791
0
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7792
0
                    iv, AES_ENCRYPTION, 0);
7793
0
                if (ret != 0){
7794
0
                    WOLFSSL_MSG("AesSetKey() failed");
7795
0
                    return WOLFSSL_FAILURE;
7796
0
                }
7797
0
            }
7798
0
            if (iv && key == NULL) {
7799
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7800
0
                if (ret != 0){
7801
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7802
0
                    return WOLFSSL_FAILURE;
7803
0
                }
7804
0
            }
7805
0
        }
7806
13.5k
        #endif /* WOLFSSL_AES_256 */
7807
13.5k
    #endif /* WOLFSSL_AES_CFB */
7808
13.5k
    #ifdef WOLFSSL_AES_OFB
7809
13.5k
        #ifdef WOLFSSL_AES_128
7810
13.5k
        if (ctx->cipherType == WC_AES_128_OFB_TYPE ||
7811
13.1k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_OFB))) {
7812
588
            WOLFSSL_MSG("EVP_AES_128_OFB");
7813
588
            ctx->cipherType = WC_AES_128_OFB_TYPE;
7814
588
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7815
588
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7816
588
            ctx->keyLen     = 16;
7817
588
            ctx->block_size = 1;
7818
588
            if (enc == 0 || enc == 1)
7819
401
                ctx->enc = enc ? 1 : 0;
7820
588
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7821
209
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7822
0
                    return WOLFSSL_FAILURE;
7823
209
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7824
209
            }
7825
588
            if (key) {
7826
192
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7827
192
                    iv, AES_ENCRYPTION, 0);
7828
192
                if (ret != 0)
7829
0
                    return WOLFSSL_FAILURE;
7830
192
            }
7831
588
            if (iv && key == NULL) {
7832
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7833
0
                if (ret != 0)
7834
0
                    return WOLFSSL_FAILURE;
7835
0
            }
7836
588
        }
7837
13.5k
        #endif /* WOLFSSL_AES_128 */
7838
13.5k
        #ifdef WOLFSSL_AES_192
7839
13.5k
        if (ctx->cipherType == WC_AES_192_OFB_TYPE ||
7840
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_OFB))) {
7841
347
            WOLFSSL_MSG("EVP_AES_192_OFB");
7842
347
            ctx->cipherType = WC_AES_192_OFB_TYPE;
7843
347
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7844
347
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7845
347
            ctx->keyLen     = 24;
7846
347
            ctx->block_size = 1;
7847
347
            if (enc == 0 || enc == 1)
7848
239
                ctx->enc = enc ? 1 : 0;
7849
347
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7850
127
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7851
0
                    return WOLFSSL_FAILURE;
7852
127
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7853
127
            }
7854
347
            if (key) {
7855
112
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7856
112
                    iv, AES_ENCRYPTION, 0);
7857
112
                if (ret != 0)
7858
0
                    return WOLFSSL_FAILURE;
7859
112
            }
7860
347
            if (iv && key == NULL) {
7861
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7862
0
                if (ret != 0)
7863
0
                    return WOLFSSL_FAILURE;
7864
0
            }
7865
347
        }
7866
13.5k
        #endif /* WOLFSSL_AES_192 */
7867
13.5k
        #ifdef WOLFSSL_AES_256
7868
13.5k
        if (ctx->cipherType == WC_AES_256_OFB_TYPE ||
7869
13.0k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_OFB))) {
7870
791
            WOLFSSL_MSG("EVP_AES_256_OFB");
7871
791
            ctx->cipherType = WC_AES_256_OFB_TYPE;
7872
791
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7873
791
            ctx->flags     |= WOLFSSL_EVP_CIPH_OFB_MODE;
7874
791
            ctx->keyLen     = 32;
7875
791
            ctx->block_size = 1;
7876
791
            if (enc == 0 || enc == 1)
7877
533
                ctx->enc = enc ? 1 : 0;
7878
791
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7879
273
                if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
7880
0
                    return WOLFSSL_FAILURE;
7881
273
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7882
273
            }
7883
791
            if (key) {
7884
260
                ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
7885
260
                    iv, AES_ENCRYPTION, 0);
7886
260
                if (ret != 0){
7887
0
                    WOLFSSL_MSG("AesSetKey() failed");
7888
0
                    return WOLFSSL_FAILURE;
7889
0
                }
7890
260
            }
7891
791
            if (iv && key == NULL) {
7892
0
                ret = wc_AesSetIV(&ctx->cipher.aes, iv);
7893
0
                if (ret != 0){
7894
0
                    WOLFSSL_MSG("wc_AesSetIV() failed");
7895
0
                    return WOLFSSL_FAILURE;
7896
0
                }
7897
0
            }
7898
791
        }
7899
13.5k
        #endif /* WOLFSSL_AES_256 */
7900
13.5k
    #endif /* WOLFSSL_AES_OFB */
7901
13.5k
        #if defined(WOLFSSL_AES_XTS) && \
7902
13.5k
            (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
7903
13.5k
        #ifdef WOLFSSL_AES_128
7904
13.5k
        if (ctx->cipherType == WC_AES_128_XTS_TYPE ||
7905
12.7k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_XTS))) {
7906
1.12k
            WOLFSSL_MSG("EVP_AES_128_XTS");
7907
1.12k
            ctx->cipherType = WC_AES_128_XTS_TYPE;
7908
1.12k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7909
1.12k
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7910
1.12k
            ctx->keyLen     = 32;
7911
1.12k
            ctx->block_size = 1;
7912
1.12k
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7913
7914
1.12k
            if (iv != NULL) {
7915
732
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7916
369
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7917
732
            }
7918
393
            else
7919
393
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7920
7921
1.12k
            if (enc == 0 || enc == 1)
7922
762
                ctx->enc = enc ? 1 : 0;
7923
7924
1.12k
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7925
393
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7926
393
                if (ret != 0) {
7927
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7928
0
                    return WOLFSSL_FAILURE;
7929
0
                }
7930
393
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7931
393
            }
7932
7933
1.12k
            if (key) {
7934
369
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7935
369
                    (word32)ctx->keyLen,
7936
369
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7937
369
                if (ret != 0) {
7938
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7939
0
                    return WOLFSSL_FAILURE;
7940
0
                }
7941
369
            }
7942
1.12k
        }
7943
13.5k
        #endif /* WOLFSSL_AES_128 */
7944
13.5k
        #ifdef WOLFSSL_AES_256
7945
13.5k
        if (ctx->cipherType == WC_AES_256_XTS_TYPE ||
7946
13.3k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_XTS))) {
7947
268
            WOLFSSL_MSG("EVP_AES_256_XTS");
7948
268
            ctx->cipherType = WC_AES_256_XTS_TYPE;
7949
268
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
7950
268
            ctx->flags     |= WOLFSSL_EVP_CIPH_XTS_MODE;
7951
268
            ctx->keyLen     = 64;
7952
268
            ctx->block_size = 1;
7953
268
            ctx->ivSz       = WC_AES_BLOCK_SIZE;
7954
7955
268
            if (iv != NULL) {
7956
169
                if (iv != ctx->iv) /* Valgrind error when src == dst */
7957
90
                    XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
7958
169
            }
7959
99
            else
7960
99
                XMEMSET(ctx->iv, 0, WC_AES_BLOCK_SIZE);
7961
7962
268
            if (enc == 0 || enc == 1)
7963
189
                ctx->enc = enc ? 1 : 0;
7964
7965
268
            if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
7966
99
                ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
7967
99
                if (ret != 0) {
7968
0
                    WOLFSSL_MSG("wc_AesXtsInit() failed");
7969
0
                    return WOLFSSL_FAILURE;
7970
0
                }
7971
99
                ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
7972
99
            }
7973
7974
268
            if (key) {
7975
90
                ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
7976
90
                    (word32)ctx->keyLen,
7977
90
                    ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
7978
90
                if (ret != 0) {
7979
0
                    WOLFSSL_MSG("wc_AesXtsSetKey() failed");
7980
0
                    return WOLFSSL_FAILURE;
7981
0
                }
7982
90
            }
7983
268
        }
7984
13.5k
        #endif /* WOLFSSL_AES_256 */
7985
13.5k
    #endif /* WOLFSSL_AES_XTS &&
7986
              (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
7987
13.5k
#endif /* NO_AES */
7988
    #if defined(HAVE_ARIA)
7989
        if (ctx->cipherType == WC_ARIA_128_GCM_TYPE ||
7990
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))
7991
            || ctx->cipherType == WC_ARIA_192_GCM_TYPE ||
7992
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))
7993
            || ctx->cipherType == WC_ARIA_256_GCM_TYPE ||
7994
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))
7995
          ) {
7996
            if (EvpCipherInitAriaGCM(ctx, type, key, iv, enc)
7997
                != WOLFSSL_SUCCESS) {
7998
                return WOLFSSL_FAILURE;
7999
            }
8000
        }
8001
    #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8002
            * HAVE_FIPS_VERSION >= 2 */
8003
8004
8005
13.5k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
8006
13.5k
        if (ctx->cipherType == WC_CHACHA20_POLY1305_TYPE ||
8007
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20_POLY1305))) {
8008
0
            WOLFSSL_MSG("EVP_CHACHA20_POLY1305");
8009
0
            ctx->cipherType = WC_CHACHA20_POLY1305_TYPE;
8010
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8011
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8012
0
            ctx->keyLen     = CHACHA20_POLY1305_AEAD_KEYSIZE;
8013
0
            ctx->block_size = CHACHA_CHUNK_BYTES;
8014
0
            ctx->authTagSz  = CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE;
8015
0
            ctx->ivSz       = CHACHA20_POLY1305_AEAD_IV_SIZE;
8016
0
            if (enc == 0 || enc == 1) {
8017
0
                ctx->enc    = (byte) enc;
8018
0
            }
8019
8020
            /* wolfSSL_EVP_CipherInit() may be called multiple times to
8021
             * set key or iv alone. A common use case is to set key
8022
             * and then init with another iv again and again after
8023
             * update/finals. We need to preserve the key for those calls
8024
             * since wc_ChaCha20Poly1305_Init() does not. */
8025
0
            if (key != NULL) {
8026
0
                if (!ctx->key) {
8027
0
                    ctx->key = (byte*)XMALLOC((size_t)ctx->keyLen, NULL,
8028
0
                                              DYNAMIC_TYPE_OPENSSL);
8029
0
                    if (!ctx->key) {
8030
0
                        return MEMORY_E;
8031
0
                    }
8032
0
                }
8033
0
                XMEMCPY(ctx->key, key, (size_t)ctx->keyLen);
8034
0
            }
8035
0
            if ((ctx->key != NULL && iv != NULL) && wc_ChaCha20Poly1305_Init(
8036
0
                    &ctx->cipher.chachaPoly, ctx->key, iv, ctx->enc) != 0) {
8037
0
                WOLFSSL_MSG("wc_ChaCha20Poly1305_Init() failed");
8038
0
                return WOLFSSL_FAILURE;
8039
0
            }
8040
0
        }
8041
13.5k
#endif
8042
13.5k
#ifdef HAVE_CHACHA
8043
13.5k
        if (ctx->cipherType == WC_CHACHA20_TYPE ||
8044
13.5k
            (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20))) {
8045
0
            WOLFSSL_MSG("EVP_CHACHA20");
8046
0
            ctx->cipherType = WC_CHACHA20_TYPE;
8047
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8048
0
            ctx->keyLen     = CHACHA_MAX_KEY_SZ;
8049
0
            ctx->block_size = 1;
8050
0
            ctx->ivSz       = WOLFSSL_EVP_CHACHA_IV_BYTES;
8051
0
            if (enc == 0 || enc == 1) {
8052
0
                ctx->enc    = (byte) enc;
8053
0
            }
8054
0
            if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, key,
8055
0
                    (word32)ctx->keyLen) != 0) {
8056
0
                WOLFSSL_MSG("wc_Chacha_SetKey() failed");
8057
0
                return WOLFSSL_FAILURE;
8058
0
            }
8059
0
            if (iv != NULL) {
8060
                /* a bit silly. chacha takes an iv+counter and internally
8061
                 * combines them to a new iv. EVP is given exactly *one* iv,
8062
                 * so to pass it into chacha, we have to revert that first.
8063
                 * The counter comes first in little-endian */
8064
0
                word32 counter = (word32)iv[0] + (word32)(iv[1] << 8) +
8065
0
                    (word32)(iv[2] << 16) + (word32)(iv[3] << 24);
8066
0
                if (wc_Chacha_SetIV(&ctx->cipher.chacha,
8067
0
                                    iv + sizeof(counter), counter) != 0) {
8068
8069
0
                    WOLFSSL_MSG("wc_Chacha_SetIV() failed");
8070
0
                    return WOLFSSL_FAILURE;
8071
0
                }
8072
0
            }
8073
0
        }
8074
13.5k
#endif
8075
13.5k
#ifdef WOLFSSL_SM4_ECB
8076
13.5k
        if (ctx->cipherType == WC_SM4_ECB_TYPE ||
8077
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_ECB))) {
8078
0
            WOLFSSL_MSG("EVP_SM4_ECB");
8079
0
            ctx->cipherType = WC_SM4_ECB_TYPE;
8080
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8081
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8082
0
            ctx->keyLen     = SM4_KEY_SIZE;
8083
0
            ctx->block_size = SM4_BLOCK_SIZE;
8084
0
            if (enc == 0 || enc == 1)
8085
0
                ctx->enc = enc ? 1 : 0;
8086
0
            if (key) {
8087
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8088
0
            }
8089
0
            if (ret != 0) {
8090
0
                return WOLFSSL_FAILURE;
8091
0
            }
8092
0
        }
8093
13.5k
#endif
8094
13.5k
#ifdef WOLFSSL_SM4_CBC
8095
13.5k
        if (ctx->cipherType == WC_SM4_CBC_TYPE ||
8096
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CBC))) {
8097
0
            WOLFSSL_MSG("EVP_SM4_CBC");
8098
0
            ctx->cipherType = WC_SM4_CBC_TYPE;
8099
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8100
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8101
0
            ctx->keyLen     = SM4_KEY_SIZE;
8102
0
            ctx->block_size = SM4_BLOCK_SIZE;
8103
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8104
0
            if (enc == 0 || enc == 1)
8105
0
                ctx->enc = enc ? 1 : 0;
8106
0
            if (key != NULL) {
8107
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8108
0
                if (ret != 0) {
8109
0
                    return WOLFSSL_FAILURE;
8110
0
                }
8111
0
            }
8112
0
            if (iv != NULL) {
8113
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8114
0
                if (ret != 0) {
8115
0
                    return WOLFSSL_FAILURE;
8116
0
                }
8117
0
            }
8118
0
        }
8119
13.5k
#endif
8120
13.5k
#ifdef WOLFSSL_SM4_CTR
8121
13.5k
        if (ctx->cipherType == WC_SM4_CTR_TYPE ||
8122
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CTR))) {
8123
0
            WOLFSSL_MSG("EVP_SM4_CTR");
8124
0
            ctx->cipherType = WC_SM4_CTR_TYPE;
8125
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8126
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_CTR_MODE;
8127
0
            ctx->keyLen     = SM4_KEY_SIZE;
8128
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8129
0
            ctx->ivSz       = SM4_BLOCK_SIZE;
8130
0
            if (enc == 0 || enc == 1)
8131
0
                ctx->enc = enc ? 1 : 0;
8132
0
            if (key != NULL) {
8133
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8134
0
                if (ret != 0) {
8135
0
                    return WOLFSSL_FAILURE;
8136
0
                }
8137
0
            }
8138
0
            if (iv != NULL) {
8139
0
                ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
8140
0
                if (ret != 0) {
8141
0
                    return WOLFSSL_FAILURE;
8142
0
                }
8143
0
            }
8144
0
        }
8145
13.5k
#endif
8146
13.5k
#ifdef WOLFSSL_SM4_GCM
8147
13.5k
        if (ctx->cipherType == WC_SM4_GCM_TYPE ||
8148
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_GCM))) {
8149
0
            WOLFSSL_MSG("EVP_SM4_GCM");
8150
0
            ctx->cipherType = WC_SM4_GCM_TYPE;
8151
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8152
0
            ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
8153
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8154
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8155
0
            ctx->keyLen     = SM4_KEY_SIZE;
8156
0
            if (ctx->ivSz == 0) {
8157
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8158
0
            }
8159
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8160
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8161
0
            ctx->authIn = NULL;
8162
0
            ctx->authInSz = 0;
8163
0
            if (enc == 0 || enc == 1)
8164
0
                ctx->enc = enc ? 1 : 0;
8165
0
            if (key != NULL) {
8166
0
                ret = wc_Sm4GcmSetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8167
0
                if (ret != 0) {
8168
0
                    return WOLFSSL_FAILURE;
8169
0
                }
8170
0
            }
8171
0
            if (iv != NULL) {
8172
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8173
0
            }
8174
0
        }
8175
13.5k
#endif
8176
13.5k
#ifdef WOLFSSL_SM4_CCM
8177
13.5k
        if (ctx->cipherType == WC_SM4_CCM_TYPE ||
8178
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CCM))) {
8179
0
            WOLFSSL_MSG("EVP_SM4_CCM");
8180
0
            ctx->cipherType = WC_SM4_CCM_TYPE;
8181
0
            ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8182
0
            ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
8183
0
                          WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
8184
0
            ctx->block_size = WOLFSSL_NO_PADDING_BLOCK_SIZE;
8185
0
            ctx->keyLen     = SM4_KEY_SIZE;
8186
0
            if (ctx->ivSz == 0) {
8187
0
                ctx->ivSz = GCM_NONCE_MID_SZ;
8188
0
            }
8189
0
            ctx->authTagSz  = SM4_BLOCK_SIZE;
8190
0
            XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
8191
0
            ctx->authIn = NULL;
8192
0
            ctx->authInSz = 0;
8193
0
            if (enc == 0 || enc == 1)
8194
0
                ctx->enc = enc ? 1 : 0;
8195
0
            if (key != NULL) {
8196
0
                ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
8197
0
                if (ret != 0) {
8198
0
                    return WOLFSSL_FAILURE;
8199
0
                }
8200
0
            }
8201
0
            if (iv != NULL) {
8202
0
                XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
8203
0
            }
8204
0
        }
8205
13.5k
#endif
8206
13.5k
#ifndef NO_DES3
8207
13.5k
        if (ctx->cipherType == WC_DES_CBC_TYPE ||
8208
13.1k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_CBC))) {
8209
599
            WOLFSSL_MSG("EVP_DES_CBC");
8210
599
            ctx->cipherType = WC_DES_CBC_TYPE;
8211
599
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8212
599
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8213
599
            ctx->keyLen     = 8;
8214
599
            ctx->block_size = DES_BLOCK_SIZE;
8215
599
            ctx->ivSz       = DES_BLOCK_SIZE;
8216
599
            if (enc == 0 || enc == 1)
8217
418
                ctx->enc = enc ? 1 : 0;
8218
599
            if (key) {
8219
206
                ret = wc_Des_SetKey(&ctx->cipher.des, key, iv,
8220
206
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8221
206
                if (ret != 0)
8222
0
                    return WOLFSSL_FAILURE;
8223
206
            }
8224
8225
599
            if (iv && key == NULL)
8226
181
                wc_Des_SetIV(&ctx->cipher.des, iv);
8227
599
        }
8228
12.9k
#ifdef WOLFSSL_DES_ECB
8229
12.9k
        else if (ctx->cipherType == WC_DES_ECB_TYPE ||
8230
12.1k
                 (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_ECB))) {
8231
1.25k
            WOLFSSL_MSG("EVP_DES_ECB");
8232
1.25k
            ctx->cipherType = WC_DES_ECB_TYPE;
8233
1.25k
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8234
1.25k
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8235
1.25k
            ctx->keyLen     = 8;
8236
1.25k
            ctx->block_size = DES_BLOCK_SIZE;
8237
1.25k
            if (enc == 0 || enc == 1)
8238
882
                ctx->enc = enc ? 1 : 0;
8239
1.25k
            if (key) {
8240
436
                WOLFSSL_MSG("Des_SetKey");
8241
436
                ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL,
8242
436
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8243
436
                if (ret != 0)
8244
0
                    return WOLFSSL_FAILURE;
8245
436
            }
8246
1.25k
        }
8247
11.6k
#endif
8248
11.6k
        else if (ctx->cipherType == WC_DES_EDE3_CBC_TYPE ||
8249
11.2k
                 (type &&
8250
4.63k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_CBC))) {
8251
653
            WOLFSSL_MSG("EVP_DES_EDE3_CBC");
8252
653
            ctx->cipherType = WC_DES_EDE3_CBC_TYPE;
8253
653
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8254
653
            ctx->flags     |= WOLFSSL_EVP_CIPH_CBC_MODE;
8255
653
            ctx->keyLen     = 24;
8256
653
            ctx->block_size = DES_BLOCK_SIZE;
8257
653
            ctx->ivSz       = DES_BLOCK_SIZE;
8258
653
            if (enc == 0 || enc == 1)
8259
445
                ctx->enc = enc ? 1 : 0;
8260
653
            if (key) {
8261
217
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv,
8262
217
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8263
217
                if (ret != 0)
8264
0
                    return WOLFSSL_FAILURE;
8265
217
            }
8266
8267
653
            if (iv && key == NULL) {
8268
208
                ret = wc_Des3_SetIV(&ctx->cipher.des3, iv);
8269
208
                if (ret != 0)
8270
0
                    return WOLFSSL_FAILURE;
8271
208
            }
8272
653
        }
8273
11.0k
        else if (ctx->cipherType == WC_DES_EDE3_ECB_TYPE ||
8274
11.0k
                 (type &&
8275
4.40k
                  EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_ECB))) {
8276
0
            WOLFSSL_MSG("EVP_DES_EDE3_ECB");
8277
0
            ctx->cipherType = WC_DES_EDE3_ECB_TYPE;
8278
0
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8279
0
            ctx->flags     |= WOLFSSL_EVP_CIPH_ECB_MODE;
8280
0
            ctx->keyLen     = 24;
8281
0
            ctx->block_size = DES_BLOCK_SIZE;
8282
0
            if (enc == 0 || enc == 1)
8283
0
                ctx->enc = enc ? 1 : 0;
8284
0
            if (key) {
8285
0
                ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL,
8286
0
                          ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
8287
0
                if (ret != 0)
8288
0
                    return WOLFSSL_FAILURE;
8289
0
            }
8290
0
        }
8291
13.5k
#endif /* NO_DES3 */
8292
13.5k
#ifndef NO_RC4
8293
13.5k
        if (ctx->cipherType == WC_ARC4_TYPE ||
8294
13.4k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARC4))) {
8295
110
            WOLFSSL_MSG("ARC4");
8296
110
            ctx->cipherType = WC_ARC4_TYPE;
8297
110
            ctx->flags     &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
8298
110
            ctx->flags     |= WOLFSSL_EVP_CIPH_STREAM_CIPHER;
8299
110
            ctx->block_size = 1;
8300
110
            if (ctx->keyLen == 0)  /* user may have already set */
8301
66
                ctx->keyLen = 16;  /* default to 128 */
8302
110
            if (key)
8303
25
                wc_Arc4SetKey(&ctx->cipher.arc4, key, (word32)ctx->keyLen);
8304
110
        }
8305
13.5k
#endif /* NO_RC4 */
8306
13.5k
        if (ctx->cipherType == WC_NULL_CIPHER_TYPE ||
8307
13.5k
                (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_NULL))) {
8308
0
            WOLFSSL_MSG("NULL cipher");
8309
0
            ctx->cipherType = WC_NULL_CIPHER_TYPE;
8310
0
            ctx->keyLen = 0;
8311
0
            ctx->block_size = 16;
8312
0
        }
8313
13.5k
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8314
13.5k
        if (iv && iv != ctx->iv) {
8315
2.63k
            if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8316
0
                return WOLFSSL_FAILURE;
8317
0
            }
8318
2.63k
        }
8319
13.5k
#endif
8320
13.5k
        (void)ret; /* remove warning. If execution reaches this point, ret=0 */
8321
13.5k
        return WOLFSSL_SUCCESS;
8322
13.5k
    }
8323
8324
8325
    int wolfSSL_EVP_CIPHER_CTX_nid(const WOLFSSL_EVP_CIPHER_CTX *ctx)
8326
0
    {
8327
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_nid");
8328
0
        if (ctx == NULL) {
8329
0
            WOLFSSL_ERROR_MSG("Bad parameters");
8330
0
            return WC_NID_undef;
8331
0
        }
8332
8333
0
        switch (ctx->cipherType) {
8334
0
#ifndef NO_AES
8335
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
8336
0
            case WC_AES_128_CBC_TYPE :
8337
0
                return WC_NID_aes_128_cbc;
8338
0
            case WC_AES_192_CBC_TYPE :
8339
0
                return WC_NID_aes_192_cbc;
8340
0
            case WC_AES_256_CBC_TYPE :
8341
0
                return WC_NID_aes_256_cbc;
8342
0
#endif
8343
0
#ifdef HAVE_AESGCM
8344
0
            case WC_AES_128_GCM_TYPE :
8345
0
                return WC_NID_aes_128_gcm;
8346
0
            case WC_AES_192_GCM_TYPE :
8347
0
                return WC_NID_aes_192_gcm;
8348
0
            case WC_AES_256_GCM_TYPE :
8349
0
                return WC_NID_aes_256_gcm;
8350
0
#endif
8351
0
#ifdef HAVE_AESCCM
8352
0
            case WC_AES_128_CCM_TYPE :
8353
0
                return WC_NID_aes_128_ccm;
8354
0
            case WC_AES_192_CCM_TYPE :
8355
0
                return WC_NID_aes_192_ccm;
8356
0
            case WC_AES_256_CCM_TYPE :
8357
0
                return WC_NID_aes_256_ccm;
8358
0
#endif
8359
0
#ifdef HAVE_AES_ECB
8360
0
            case WC_AES_128_ECB_TYPE :
8361
0
                return WC_NID_aes_128_ecb;
8362
0
            case WC_AES_192_ECB_TYPE :
8363
0
                return WC_NID_aes_192_ecb;
8364
0
            case WC_AES_256_ECB_TYPE :
8365
0
                return WC_NID_aes_256_ecb;
8366
0
#endif
8367
0
#ifdef WOLFSSL_AES_COUNTER
8368
0
            case WC_AES_128_CTR_TYPE :
8369
0
                return WC_NID_aes_128_ctr;
8370
0
            case WC_AES_192_CTR_TYPE :
8371
0
                return WC_NID_aes_192_ctr;
8372
0
            case WC_AES_256_CTR_TYPE :
8373
0
                return WC_NID_aes_256_ctr;
8374
0
#endif
8375
8376
0
#endif /* NO_AES */
8377
8378
#ifdef HAVE_ARIA
8379
            case WC_ARIA_128_GCM_TYPE :
8380
                return WC_NID_aria_128_gcm;
8381
            case WC_ARIA_192_GCM_TYPE :
8382
                return WC_NID_aria_192_gcm;
8383
            case WC_ARIA_256_GCM_TYPE :
8384
                return WC_NID_aria_256_gcm;
8385
#endif
8386
8387
0
#ifndef NO_DES3
8388
0
            case WC_DES_CBC_TYPE :
8389
0
                return WC_NID_des_cbc;
8390
8391
0
            case WC_DES_EDE3_CBC_TYPE :
8392
0
                return WC_NID_des_ede3_cbc;
8393
0
#endif
8394
0
#ifdef WOLFSSL_DES_ECB
8395
0
            case WC_DES_ECB_TYPE :
8396
0
                return WC_NID_des_ecb;
8397
0
            case WC_DES_EDE3_ECB_TYPE :
8398
0
                return WC_NID_des_ede3_ecb;
8399
0
#endif
8400
8401
0
            case WC_ARC4_TYPE :
8402
0
                return WC_NID_rc4;
8403
8404
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
8405
0
            case WC_CHACHA20_POLY1305_TYPE:
8406
0
                return WC_NID_chacha20_poly1305;
8407
0
#endif
8408
8409
0
#ifdef HAVE_CHACHA
8410
0
            case WC_CHACHA20_TYPE:
8411
0
                return WC_NID_chacha20;
8412
0
#endif
8413
8414
0
#ifdef WOLFSSL_SM4_ECB
8415
0
            case WC_SM4_ECB_TYPE:
8416
0
                return WC_NID_sm4_ecb;
8417
0
#endif
8418
8419
0
#ifdef WOLFSSL_SM4_CBC
8420
0
            case WC_SM4_CBC_TYPE:
8421
0
                return WC_NID_sm4_cbc;
8422
0
#endif
8423
8424
0
#ifdef WOLFSSL_SM4_CTR
8425
0
            case WC_SM4_CTR_TYPE:
8426
0
                return WC_NID_sm4_ctr;
8427
0
#endif
8428
8429
0
#ifdef WOLFSSL_SM4_GCM
8430
0
            case WC_SM4_GCM_TYPE:
8431
0
                return WC_NID_sm4_gcm;
8432
0
#endif
8433
8434
0
#ifdef WOLFSSL_SM4_CCM
8435
0
            case WC_SM4_CCM_TYPE:
8436
0
                return WC_NID_sm4_ccm;
8437
0
#endif
8438
8439
0
            case WC_NULL_CIPHER_TYPE :
8440
0
                WOLFSSL_ERROR_MSG("Null cipher has no NID");
8441
0
                FALL_THROUGH;
8442
0
            default:
8443
0
                return WC_NID_undef;
8444
0
        }
8445
0
    }
8446
8447
    /* WOLFSSL_SUCCESS on ok */
8448
    int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx)
8449
0
    {
8450
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_key_length");
8451
0
        if (ctx)
8452
0
            return ctx->keyLen;
8453
0
        else
8454
0
            return WOLFSSL_FAILURE;
8455
0
    }
8456
8457
    /* WOLFSSL_SUCCESS on ok */
8458
    int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8459
                                             int keylen)
8460
0
    {
8461
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_key_length");
8462
0
        if (ctx)
8463
0
            ctx->keyLen = keylen;
8464
0
        else
8465
0
            return WOLFSSL_FAILURE;
8466
8467
0
        return WOLFSSL_SUCCESS;
8468
0
    }
8469
8470
#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
8471
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8472
    int wolfSSL_EVP_CIPHER_CTX_set_iv_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
8473
                                             int ivLen)
8474
0
    {
8475
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length");
8476
0
        if (ctx == NULL) {
8477
0
            return WOLFSSL_FAILURE;
8478
0
        }
8479
8480
0
        if (ivLen < 0 || ivLen > (int) sizeof(ctx->iv)) {
8481
0
            return WOLFSSL_FAILURE;
8482
0
        }
8483
8484
0
        ctx->ivSz = ivLen;
8485
8486
0
        return WOLFSSL_SUCCESS;
8487
0
    }
8488
#endif
8489
8490
#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
8491
    (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
8492
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8493
    int wolfSSL_EVP_CIPHER_CTX_set_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8494
                                             int ivLen)
8495
0
    {
8496
0
        int expectedIvLen;
8497
8498
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv");
8499
0
        if (!ctx || !iv || !ivLen) {
8500
0
            return WOLFSSL_FAILURE;
8501
0
        }
8502
8503
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8504
8505
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8506
0
            WOLFSSL_MSG("Wrong ivLen value");
8507
0
            return WOLFSSL_FAILURE;
8508
0
        }
8509
8510
0
        return wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, -1);
8511
0
    }
8512
#endif
8513
8514
#if !defined(NO_AES) || !defined(NO_DES3)
8515
    /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
8516
    int wolfSSL_EVP_CIPHER_CTX_get_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
8517
                                      int ivLen)
8518
0
    {
8519
0
        int expectedIvLen;
8520
8521
0
        WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_get_iv");
8522
8523
0
        if (ctx == NULL || iv == NULL || ivLen == 0) {
8524
0
            WOLFSSL_MSG("Bad parameter");
8525
0
            return WOLFSSL_FAILURE;
8526
0
        }
8527
8528
0
        expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
8529
0
        if (expectedIvLen == 0 || expectedIvLen != ivLen) {
8530
0
            WOLFSSL_MSG("Wrong ivLen value");
8531
0
            return WOLFSSL_FAILURE;
8532
0
        }
8533
8534
0
        XMEMCPY(iv, ctx->iv, (size_t)ivLen);
8535
8536
0
        return WOLFSSL_SUCCESS;
8537
0
    }
8538
#endif /* !NO_AES || !NO_DES3 */
8539
8540
    static int IsCipherTypeAEAD(unsigned int type)
8541
0
    {
8542
0
        switch (type) {
8543
0
            case WC_AES_128_GCM_TYPE:
8544
0
            case WC_AES_192_GCM_TYPE:
8545
0
            case WC_AES_256_GCM_TYPE:
8546
0
            case WC_AES_128_CCM_TYPE:
8547
0
            case WC_AES_192_CCM_TYPE:
8548
0
            case WC_AES_256_CCM_TYPE:
8549
0
            case WC_ARIA_128_GCM_TYPE:
8550
0
            case WC_ARIA_192_GCM_TYPE:
8551
0
            case WC_ARIA_256_GCM_TYPE:
8552
0
            case WC_SM4_GCM_TYPE:
8553
0
            case WC_SM4_CCM_TYPE:
8554
0
                return 1;
8555
0
            default:
8556
0
                return 0;
8557
0
        }
8558
0
    }
8559
8560
    /* Return length on ok */
8561
    int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
8562
                           const byte* src, word32 len)
8563
0
    {
8564
0
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
8565
8566
0
        WOLFSSL_ENTER("wolfSSL_EVP_Cipher");
8567
8568
0
        if (ctx == NULL) {
8569
0
            WOLFSSL_MSG("Bad argument.");
8570
0
            return WOLFSSL_FATAL_ERROR;
8571
0
        }
8572
8573
0
        if (!IsCipherTypeAEAD(ctx->cipherType)) {
8574
            /* No-op for non-AEAD ciphers */
8575
0
            if (src == NULL && dst == NULL && len == 0)
8576
0
                return 0;
8577
0
            if (src == NULL || dst == NULL) {
8578
0
                WOLFSSL_MSG("Bad argument.");
8579
0
                return WOLFSSL_FATAL_ERROR;
8580
0
            }
8581
0
        }
8582
8583
0
        if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
8584
0
            WOLFSSL_MSG("Cipher operation not initialized. Call "
8585
0
                        "wolfSSL_EVP_CipherInit.");
8586
0
            return WOLFSSL_FATAL_ERROR;
8587
0
        }
8588
8589
0
        switch (ctx->cipherType) {
8590
8591
0
#ifndef NO_AES
8592
0
#ifdef HAVE_AES_CBC
8593
0
            case WC_AES_128_CBC_TYPE :
8594
0
            case WC_AES_192_CBC_TYPE :
8595
0
            case WC_AES_256_CBC_TYPE :
8596
0
                WOLFSSL_MSG("AES CBC");
8597
0
                if (ctx->enc)
8598
0
                    ret = wc_AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
8599
0
                else
8600
0
                    ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
8601
0
                if (ret == 0)
8602
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8603
0
                break;
8604
0
#endif /* HAVE_AES_CBC */
8605
8606
0
#ifdef WOLFSSL_AES_CFB
8607
0
#if !defined(WOLFSSL_NO_AES_CFB_1_8)
8608
0
            case WC_AES_128_CFB1_TYPE:
8609
0
            case WC_AES_192_CFB1_TYPE:
8610
0
            case WC_AES_256_CFB1_TYPE:
8611
0
                WOLFSSL_MSG("AES CFB1");
8612
0
                if (ctx->enc)
8613
0
                    ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, dst, src, len);
8614
0
                else
8615
0
                    ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len);
8616
0
                if (ret == 0)
8617
0
                    ret = (int)len;
8618
0
                break;
8619
0
            case WC_AES_128_CFB8_TYPE:
8620
0
            case WC_AES_192_CFB8_TYPE:
8621
0
            case WC_AES_256_CFB8_TYPE:
8622
0
                WOLFSSL_MSG("AES CFB8");
8623
0
                if (ctx->enc)
8624
0
                    ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, dst, src, len);
8625
0
                else
8626
0
                    ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len);
8627
0
                if (ret == 0)
8628
0
                    ret = (int)len;
8629
0
                break;
8630
0
#endif /* !WOLFSSL_NO_AES_CFB_1_8 */
8631
0
            case WC_AES_128_CFB128_TYPE:
8632
0
            case WC_AES_192_CFB128_TYPE:
8633
0
            case WC_AES_256_CFB128_TYPE:
8634
0
                WOLFSSL_MSG("AES CFB128");
8635
0
                if (ctx->enc)
8636
0
                    ret = wc_AesCfbEncrypt(&ctx->cipher.aes, dst, src, len);
8637
0
                else
8638
0
                    ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len);
8639
0
                if (ret == 0)
8640
0
                    ret = (int)len;
8641
0
                break;
8642
0
#endif /* WOLFSSL_AES_CFB */
8643
0
#if defined(WOLFSSL_AES_OFB)
8644
0
            case WC_AES_128_OFB_TYPE:
8645
0
            case WC_AES_192_OFB_TYPE:
8646
0
            case WC_AES_256_OFB_TYPE:
8647
0
                WOLFSSL_MSG("AES OFB");
8648
0
                if (ctx->enc)
8649
0
                    ret = wc_AesOfbEncrypt(&ctx->cipher.aes, dst, src, len);
8650
0
                else
8651
0
                    ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len);
8652
0
                if (ret == 0)
8653
0
                    ret = (int)len;
8654
0
                break;
8655
0
#endif /* WOLFSSL_AES_OFB */
8656
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
8657
0
            case WC_AES_128_XTS_TYPE:
8658
0
            case WC_AES_256_XTS_TYPE:
8659
0
                WOLFSSL_MSG("AES XTS");
8660
0
                if (ctx->enc)
8661
0
                    ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len,
8662
0
                            ctx->iv, (word32)ctx->ivSz);
8663
0
                else
8664
0
                    ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len,
8665
0
                            ctx->iv, (word32)ctx->ivSz);
8666
0
                if (ret == 0)
8667
0
                    ret = (int)len;
8668
0
                break;
8669
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
8670
8671
0
#if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8672
0
    || FIPS_VERSION_GE(2,0))
8673
0
            case WC_AES_128_GCM_TYPE :
8674
0
            case WC_AES_192_GCM_TYPE :
8675
0
            case WC_AES_256_GCM_TYPE :
8676
0
                WOLFSSL_MSG("AES GCM");
8677
0
                ret = EvpCipherAesGCM(ctx, dst, src, len);
8678
0
                break;
8679
0
#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8680
        * HAVE_FIPS_VERSION >= 2 */
8681
0
#if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8682
0
    || FIPS_VERSION_GE(2,0))
8683
0
            case WC_AES_128_CCM_TYPE :
8684
0
            case WC_AES_192_CCM_TYPE :
8685
0
            case WC_AES_256_CCM_TYPE :
8686
0
                WOLFSSL_MSG("AES CCM");
8687
0
                ret = EvpCipherAesCCM(ctx, dst, src, len);
8688
0
                break;
8689
0
#endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8690
        * HAVE_FIPS_VERSION >= 2 */
8691
0
#ifdef HAVE_AES_ECB
8692
0
            case WC_AES_128_ECB_TYPE :
8693
0
            case WC_AES_192_ECB_TYPE :
8694
0
            case WC_AES_256_ECB_TYPE :
8695
0
                WOLFSSL_MSG("AES ECB");
8696
0
                if (ctx->enc)
8697
0
                    ret = wc_AesEcbEncrypt(&ctx->cipher.aes, dst, src, len);
8698
0
                else
8699
0
                    ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len);
8700
0
                if (ret == 0)
8701
0
                    ret = (int)((len / WC_AES_BLOCK_SIZE) * WC_AES_BLOCK_SIZE);
8702
0
                break;
8703
0
#endif
8704
0
#ifdef WOLFSSL_AES_COUNTER
8705
0
            case WC_AES_128_CTR_TYPE :
8706
0
            case WC_AES_192_CTR_TYPE :
8707
0
            case WC_AES_256_CTR_TYPE :
8708
0
                WOLFSSL_MSG("AES CTR");
8709
0
                ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
8710
0
                if (ret == 0)
8711
0
                    ret = (int)len;
8712
0
                break;
8713
0
#endif /* WOLFSSL_AES_COUNTER */
8714
0
#endif /* NO_AES */
8715
8716
#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
8717
    || FIPS_VERSION_GE(2,0))
8718
            case WC_ARIA_128_GCM_TYPE :
8719
            case WC_ARIA_192_GCM_TYPE :
8720
            case WC_ARIA_256_GCM_TYPE :
8721
                WOLFSSL_MSG("ARIA GCM");
8722
                if (ctx->enc) {
8723
                    ret = wc_AriaEncrypt(&ctx->cipher.aria, dst, src, len,
8724
                                         ctx->iv, ctx->ivSz, NULL, 0,
8725
                                         ctx->authTag, ctx->authTagSz);
8726
                }
8727
                else {
8728
                    ret = wc_AriaDecrypt(&ctx->cipher.aria, dst, src, len,
8729
                                         ctx->iv, ctx->ivSz, NULL, 0,
8730
                                         ctx->authTag, ctx->authTagSz);
8731
                }
8732
                break;
8733
#endif /* HAVE_ARIA&& ((!HAVE_FIPS && !HAVE_SELFTEST) ||
8734
        * HAVE_FIPS_VERSION >= 2 */
8735
8736
0
#ifndef NO_DES3
8737
0
            case WC_DES_CBC_TYPE :
8738
0
                WOLFSSL_MSG("DES CBC");
8739
0
                if (ctx->enc)
8740
0
                    wc_Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
8741
0
                else
8742
0
                    wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
8743
0
                if (ret == 0)
8744
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8745
0
                break;
8746
0
            case WC_DES_EDE3_CBC_TYPE :
8747
0
                WOLFSSL_MSG("DES3 CBC");
8748
0
                if (ctx->enc)
8749
0
                    ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
8750
0
                else
8751
0
                    ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
8752
0
                if (ret == 0)
8753
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8754
0
                break;
8755
0
#ifdef WOLFSSL_DES_ECB
8756
0
            case WC_DES_ECB_TYPE :
8757
0
                WOLFSSL_MSG("DES ECB");
8758
0
                if (ctx->enc)
8759
0
                    ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len);
8760
0
                else
8761
0
                    ret = wc_Des_EcbDecrypt(&ctx->cipher.des, dst, src, len);
8762
0
                if (ret == 0)
8763
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8764
0
                break;
8765
0
            case WC_DES_EDE3_ECB_TYPE :
8766
0
                WOLFSSL_MSG("DES3 ECB");
8767
0
                if (ctx->enc)
8768
0
                    ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len);
8769
0
                else
8770
0
                    ret = wc_Des3_EcbDecrypt(&ctx->cipher.des3, dst, src, len);
8771
0
                if (ret == 0)
8772
0
                    ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
8773
0
                break;
8774
0
#endif
8775
0
#endif /* !NO_DES3 */
8776
8777
0
#ifndef NO_RC4
8778
0
            case WC_ARC4_TYPE :
8779
0
                WOLFSSL_MSG("ARC4");
8780
0
                wc_Arc4Process(&ctx->cipher.arc4, dst, src, len);
8781
0
                if (ret == 0)
8782
0
                    ret = (int)len;
8783
0
                break;
8784
0
#endif
8785
8786
            /* TODO: Chacha??? */
8787
8788
0
#ifdef WOLFSSL_SM4_ECB
8789
0
            case WC_SM4_ECB_TYPE :
8790
0
                WOLFSSL_MSG("Sm4 ECB");
8791
0
                if (ctx->enc)
8792
0
                    ret = wc_Sm4EcbEncrypt(&ctx->cipher.sm4, dst, src, len);
8793
0
                else
8794
0
                    ret = wc_Sm4EcbDecrypt(&ctx->cipher.sm4, dst, src, len);
8795
0
                if (ret == 0)
8796
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8797
0
                break;
8798
0
#endif
8799
0
#ifdef WOLFSSL_SM4_CBC
8800
0
            case WC_SM4_CBC_TYPE :
8801
0
                WOLFSSL_MSG("Sm4 CBC");
8802
0
                if (ctx->enc)
8803
0
                    ret = wc_Sm4CbcEncrypt(&ctx->cipher.sm4, dst, src, len);
8804
0
                else
8805
0
                    ret = wc_Sm4CbcDecrypt(&ctx->cipher.sm4, dst, src, len);
8806
0
                if (ret == 0)
8807
0
                    ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
8808
0
                break;
8809
0
#endif
8810
0
#ifdef WOLFSSL_SM4_CTR
8811
0
            case WC_SM4_CTR_TYPE :
8812
0
                WOLFSSL_MSG("AES CTR");
8813
0
                ret = wc_Sm4CtrEncrypt(&ctx->cipher.sm4, dst, src, len);
8814
0
                if (ret == 0)
8815
0
                    ret = (int)len;
8816
0
                break;
8817
0
#endif
8818
0
#ifdef WOLFSSL_SM4_GCM
8819
0
            case WC_SM4_GCM_TYPE :
8820
0
                WOLFSSL_MSG("SM4 GCM");
8821
                /* No destination means only AAD. */
8822
0
                if (src != NULL && dst == NULL) {
8823
0
                    ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
8824
0
                }
8825
0
                else if (src != NULL && dst != NULL) {
8826
0
                    if (ctx->enc) {
8827
0
                        ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, dst, src,
8828
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8829
0
                                ctx->authTagSz, ctx->authIn,
8830
0
                                ctx->authInSz);
8831
0
                    }
8832
0
                    else {
8833
0
                        ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, dst, src,
8834
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8835
0
                                ctx->authTagSz, ctx->authIn,
8836
0
                                ctx->authInSz);
8837
0
                    }
8838
0
                    if (ctx->authIncIv) {
8839
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8840
0
                               ctx->cipher.sm4.nonceSz);
8841
0
                        ctx->authIncIv = 0;
8842
0
                    }
8843
0
                }
8844
0
                break;
8845
0
#endif
8846
0
#ifdef WOLFSSL_SM4_CCM
8847
0
            case WC_SM4_CCM_TYPE :
8848
0
                WOLFSSL_MSG("SM4 CCM");
8849
                /* No destination means only AAD. */
8850
0
                if (src != NULL && dst == NULL) {
8851
0
                    ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len);
8852
0
                }
8853
0
                else if (src != NULL && dst != NULL) {
8854
0
                    if (ctx->enc) {
8855
0
                        ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, dst, src,
8856
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8857
0
                                ctx->authTagSz, ctx->authIn,
8858
0
                                ctx->authInSz);
8859
0
                    }
8860
0
                    else {
8861
0
                        ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, dst, src,
8862
0
                                len, ctx->iv, ctx->ivSz, ctx->authTag,
8863
0
                                ctx->authTagSz, ctx->authIn,
8864
0
                                ctx->authInSz);
8865
0
                    }
8866
0
                    if (ctx->authIncIv) {
8867
0
                        IncCtr((byte*)ctx->cipher.sm4.iv,
8868
0
                               ctx->cipher.sm4.nonceSz);
8869
0
                        ctx->authIncIv = 0;
8870
0
                    }
8871
0
                }
8872
0
                if (src == NULL) {
8873
                    /*
8874
                     * Clear any leftover AAD on final (final is when src is
8875
                     * NULL).
8876
                     */
8877
0
                    if (ctx->authIn != NULL) {
8878
0
                        XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
8879
0
                    }
8880
0
                    ctx->authInSz = 0;
8881
0
                }
8882
0
                if (ret == 0) {
8883
0
                    ret = (int)len;
8884
0
                }
8885
0
                break;
8886
0
#endif
8887
8888
0
            case WC_NULL_CIPHER_TYPE :
8889
0
                WOLFSSL_MSG("NULL CIPHER");
8890
0
                XMEMCPY(dst, src, (size_t)len);
8891
0
                ret = (int)len;
8892
0
                break;
8893
8894
0
            default: {
8895
0
                WOLFSSL_MSG("bad type");
8896
0
                return WOLFSSL_FATAL_ERROR;
8897
0
            }
8898
0
        }
8899
8900
0
        if (ret < 0) {
8901
0
            if (ret == WC_NO_ERR_TRACE(AES_GCM_AUTH_E)) {
8902
0
                WOLFSSL_MSG("wolfSSL_EVP_Cipher failure: bad AES-GCM tag.");
8903
0
            }
8904
0
            WOLFSSL_MSG("wolfSSL_EVP_Cipher failure");
8905
0
            return WOLFSSL_FATAL_ERROR;
8906
0
        }
8907
8908
0
        if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
8909
0
            return WOLFSSL_FATAL_ERROR;
8910
0
        }
8911
8912
0
        WOLFSSL_MSG("wolfSSL_EVP_Cipher success");
8913
0
        return ret;
8914
0
    }
8915
8916
static void clearEVPPkeyKeys(WOLFSSL_EVP_PKEY *pkey)
8917
0
{
8918
0
    if(pkey == NULL)
8919
0
        return;
8920
0
    WOLFSSL_ENTER("clearEVPPkeyKeys");
8921
0
#ifndef NO_RSA
8922
0
    if (pkey->rsa != NULL && pkey->ownRsa == 1) {
8923
0
        wolfSSL_RSA_free(pkey->rsa);
8924
0
        pkey->rsa = NULL;
8925
0
    }
8926
0
    pkey->ownRsa = 0;
8927
0
#endif
8928
#ifndef NO_DSA
8929
    if (pkey->dsa != NULL && pkey->ownDsa == 1) {
8930
        wolfSSL_DSA_free(pkey->dsa);
8931
        pkey->dsa = NULL;
8932
    }
8933
    pkey->ownDsa = 0;
8934
#endif
8935
0
#ifndef NO_DH
8936
0
    if (pkey->dh != NULL && pkey->ownDh == 1) {
8937
0
        wolfSSL_DH_free(pkey->dh);
8938
0
        pkey->dh = NULL;
8939
0
    }
8940
0
    pkey->ownDh = 0;
8941
0
#endif
8942
0
#ifdef HAVE_ECC
8943
0
    if (pkey->ecc != NULL && pkey->ownEcc == 1) {
8944
0
        wolfSSL_EC_KEY_free(pkey->ecc);
8945
0
        pkey->ecc = NULL;
8946
0
    }
8947
0
    pkey->ownEcc = 0;
8948
0
#endif
8949
0
}
8950
8951
#ifndef NO_RSA
8952
#ifdef WOLFSSL_KEY_TO_DER
8953
static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey)
8954
0
{
8955
0
    int ret = 0;
8956
0
    int derSz = 0;
8957
0
    word32 pkcs8Sz = 0;
8958
0
    byte* derBuf = NULL;
8959
0
    RsaKey* rsa = NULL;
8960
0
    WOLFSSL_RSA *key = NULL;
8961
8962
0
    if (pkey == NULL || pkey->rsa == NULL || pkey->rsa->internal == NULL) {
8963
0
        WOLFSSL_MSG("bad parameter");
8964
0
        return WOLFSSL_FAILURE;
8965
0
    }
8966
8967
0
    key = pkey->rsa;
8968
0
    rsa = (RsaKey*)pkey->rsa->internal;
8969
8970
    /* Get DER size */
8971
0
    if (rsa->type == RSA_PRIVATE) {
8972
0
        ret = wc_RsaKeyToDer(rsa, NULL, 0);
8973
0
        if (ret > 0) {
8974
0
            derSz = ret;
8975
0
        #ifdef HAVE_PKCS8
8976
0
            if (key->pkcs8HeaderSz) {
8977
0
                ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, (word32)derSz,
8978
0
                    RSAk, NULL, 0);
8979
0
                if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
8980
0
                    ret = 0;
8981
0
            }
8982
0
        #endif
8983
0
        }
8984
0
    }
8985
0
    else {
8986
0
        ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
8987
0
        if (ret > 0)
8988
0
            derSz = ret;
8989
0
    }
8990
8991
0
    if (derSz == 0 || ret < 0) {
8992
0
        WOLFSSL_MSG("Error getting RSA DER size");
8993
0
        return WOLFSSL_FAILURE;
8994
0
    }
8995
8996
#ifdef WOLFSSL_NO_REALLOC
8997
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER);
8998
    if (derBuf != NULL) {
8999
        XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
9000
        XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_DER);
9001
        pkey->pkey.ptr = NULL;
9002
    }
9003
#else
9004
0
    derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz,
9005
0
            pkey->heap, DYNAMIC_TYPE_DER);
9006
0
#endif
9007
0
    if (derBuf == NULL) {
9008
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer malloc failed");
9009
0
        return WOLFSSL_FAILURE;
9010
0
    }
9011
9012
    /* Old pointer is invalid from this point on */
9013
0
    pkey->pkey.ptr = (char*)derBuf;
9014
9015
0
    if (rsa->type == RSA_PRIVATE) {
9016
0
        ret = wc_RsaKeyToDer(rsa, derBuf, (word32)derSz);
9017
0
        if (ret > 0) {
9018
0
            derSz = ret;
9019
0
        #ifdef HAVE_PKCS8
9020
0
            if (key->pkcs8HeaderSz) {
9021
0
                byte* keyBuf = derBuf;
9022
0
                int keySz = derSz;
9023
0
                word32 sz = pkcs8Sz;
9024
                /* Need new buffer for PKCS8 since we can't
9025
                 * do this in-place */
9026
0
                derBuf = (byte*)XMALLOC((size_t)pkcs8Sz, pkey->heap,
9027
0
                    DYNAMIC_TYPE_DER);
9028
0
                if (derBuf != NULL) {
9029
0
                    ret = wc_CreatePKCS8Key(derBuf, &sz, keyBuf, (word32)keySz,
9030
0
                        RSAk, NULL, 0);
9031
0
                    XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
9032
0
                    pkey->pkey.ptr = (char*)derBuf;
9033
0
                }
9034
0
                else {
9035
0
                    ret = MEMORY_E;
9036
0
                }
9037
0
                derSz = (int)sz;
9038
0
            }
9039
0
        #endif
9040
0
        }
9041
0
    }
9042
0
    else {
9043
        /* Public key to DER */
9044
0
        ret = wc_RsaKeyToPublicDer(rsa, derBuf, (word32)derSz);
9045
0
        if (ret > 0)
9046
0
            derSz = ret;
9047
0
    }
9048
9049
0
    if (ret < 0) {
9050
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9051
0
        return WOLFSSL_FAILURE;
9052
0
    }
9053
0
    else {
9054
0
        pkey->pkey_sz = derSz;
9055
0
        return WOLFSSL_SUCCESS;
9056
0
    }
9057
0
}
9058
#endif /* WOLFSSL_KEY_TO_DER */
9059
9060
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey)
9061
0
{
9062
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get0_RSA");
9063
9064
0
    if (pkey == NULL)
9065
0
        return NULL;
9066
9067
0
    return pkey->rsa;
9068
0
}
9069
9070
WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* pkey)
9071
0
{
9072
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
9073
9074
0
    if (pkey == NULL || pkey->rsa == NULL)
9075
0
        return NULL;
9076
9077
0
    if (wolfSSL_RSA_up_ref(pkey->rsa) != WOLFSSL_SUCCESS)
9078
0
        return NULL;
9079
9080
0
    return pkey->rsa;
9081
0
}
9082
9083
/* with set1 functions the pkey struct does not own the RSA structure
9084
 *
9085
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9086
 */
9087
int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
9088
0
{
9089
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA");
9090
0
    if (pkey == NULL || key == NULL)
9091
0
        return WOLFSSL_FAILURE;
9092
9093
0
    if (wolfSSL_RSA_up_ref(key) != WOLFSSL_SUCCESS) {
9094
0
        WOLFSSL_MSG("wolfSSL_RSA_up_ref failed");
9095
0
        return WOLFSSL_FAILURE;
9096
0
    }
9097
9098
0
    clearEVPPkeyKeys(pkey);
9099
0
    pkey->rsa    = key;
9100
0
    pkey->ownRsa = 1; /* pkey does not own RSA but needs to call free on it */
9101
0
    pkey->type   = WC_EVP_PKEY_RSA;
9102
0
    pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9103
0
    if (key->inSet == 0) {
9104
0
        if (SetRsaInternal(key) != WOLFSSL_SUCCESS) {
9105
0
            WOLFSSL_MSG("SetRsaInternal failed");
9106
0
            return WOLFSSL_FAILURE;
9107
0
        }
9108
0
    }
9109
9110
0
#ifdef WOLFSSL_KEY_TO_DER
9111
0
    if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) {
9112
0
        WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
9113
0
        return WOLFSSL_FAILURE;
9114
0
    }
9115
0
#endif
9116
9117
0
#ifdef WC_RSA_BLINDING
9118
0
    if (key->ownRng == 0) {
9119
0
        if (wc_RsaSetRNG((RsaKey*)pkey->rsa->internal, &pkey->rng) != 0) {
9120
0
            WOLFSSL_MSG("Error setting RSA rng");
9121
0
            return WOLFSSL_FAILURE;
9122
0
        }
9123
0
    }
9124
0
#endif
9125
0
    return WOLFSSL_SUCCESS;
9126
0
}
9127
#endif /* !NO_RSA */
9128
9129
#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN)
9130
/* with set1 functions the pkey struct does not own the DSA structure
9131
 *
9132
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9133
 */
9134
int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key)
9135
{
9136
    int derMax = 0;
9137
    int derSz  = 0;
9138
    DsaKey* dsa  = NULL;
9139
    byte* derBuf = NULL;
9140
9141
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DSA");
9142
9143
    if((pkey == NULL) || (key == NULL))return WOLFSSL_FAILURE;
9144
    clearEVPPkeyKeys(pkey);
9145
    pkey->dsa    = key;
9146
    pkey->ownDsa = 0; /* pkey does not own DSA */
9147
    pkey->type   = WC_EVP_PKEY_DSA;
9148
    if (key->inSet == 0) {
9149
        if (SetDsaInternal(key) != WOLFSSL_SUCCESS) {
9150
            WOLFSSL_MSG("SetDsaInternal failed");
9151
            return WOLFSSL_FAILURE;
9152
        }
9153
    }
9154
    dsa = (DsaKey*)key->internal;
9155
9156
    /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
9157
    derMax = 4 * wolfSSL_BN_num_bytes(key->g) + WC_AES_BLOCK_SIZE;
9158
9159
    derBuf = (byte*)XMALLOC((size_t)derMax, pkey->heap,
9160
        DYNAMIC_TYPE_TMP_BUFFER);
9161
    if (derBuf == NULL) {
9162
        WOLFSSL_MSG("malloc failed");
9163
        return WOLFSSL_FAILURE;
9164
    }
9165
9166
    if (dsa->type == DSA_PRIVATE) {
9167
        /* Private key to DER */
9168
        derSz = wc_DsaKeyToDer(dsa, derBuf, (word32)derMax);
9169
    }
9170
    else {
9171
        /* Public key to DER */
9172
        derSz = wc_DsaKeyToPublicDer(dsa, derBuf, (word32)derMax);
9173
    }
9174
9175
    if (derSz < 0) {
9176
        if (dsa->type == DSA_PRIVATE) {
9177
            WOLFSSL_MSG("wc_DsaKeyToDer failed");
9178
        }
9179
        else {
9180
            WOLFSSL_MSG("wc_DsaKeyToPublicDer failed");
9181
        }
9182
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9183
        return WOLFSSL_FAILURE;
9184
    }
9185
9186
    pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, pkey->heap,
9187
        DYNAMIC_TYPE_DER);
9188
    if (pkey->pkey.ptr == NULL) {
9189
        WOLFSSL_MSG("key malloc failed");
9190
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9191
        return WOLFSSL_FAILURE;
9192
    }
9193
    pkey->pkey_sz = derSz;
9194
    XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz);
9195
    XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9196
9197
    return WOLFSSL_SUCCESS;
9198
}
9199
9200
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey)
9201
{
9202
    if (!pkey) {
9203
        return NULL;
9204
    }
9205
    return pkey->dsa;
9206
}
9207
9208
WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key)
9209
{
9210
    WOLFSSL_DSA* local;
9211
9212
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DSA");
9213
9214
    if (key == NULL) {
9215
        WOLFSSL_MSG("Bad function argument");
9216
        return NULL;
9217
    }
9218
9219
    local = wolfSSL_DSA_new();
9220
    if (local == NULL) {
9221
        WOLFSSL_MSG("Error creating a new WOLFSSL_DSA structure");
9222
        return NULL;
9223
    }
9224
9225
    if (key->type == WC_EVP_PKEY_DSA) {
9226
        if (wolfSSL_DSA_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9227
                    key->pkey_sz) != WOLFSSL_SUCCESS) {
9228
            /* now try public key */
9229
            if (wolfSSL_DSA_LoadDer_ex(local,
9230
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9231
                        WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9232
                wolfSSL_DSA_free(local);
9233
                local = NULL;
9234
            }
9235
        }
9236
    }
9237
    else {
9238
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DSA key");
9239
        wolfSSL_DSA_free(local);
9240
        local = NULL;
9241
    }
9242
    return local;
9243
}
9244
#endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */
9245
9246
#ifdef HAVE_ECC
9247
WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey)
9248
0
{
9249
0
    WOLFSSL_EC_KEY *eckey = NULL;
9250
0
    if (pkey && pkey->type == WC_EVP_PKEY_EC) {
9251
0
#ifdef HAVE_ECC
9252
0
        eckey = pkey->ecc;
9253
0
#endif
9254
0
    }
9255
0
    return eckey;
9256
0
}
9257
9258
WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key)
9259
0
{
9260
0
    WOLFSSL_EC_KEY* local = NULL;
9261
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY");
9262
9263
0
    if (key == NULL || key->type != WC_EVP_PKEY_EC) {
9264
0
        return NULL;
9265
0
    }
9266
0
    if (key->type == WC_EVP_PKEY_EC) {
9267
0
        if (key->ecc != NULL) {
9268
0
            if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) {
9269
0
                return NULL;
9270
0
            }
9271
0
            local = key->ecc;
9272
0
        }
9273
0
        else {
9274
0
            key->ecc = local = wolfSSL_EC_KEY_new();
9275
0
            if (local == NULL) {
9276
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure");
9277
0
                return NULL;
9278
0
            }
9279
0
            if (wolfSSL_EC_KEY_LoadDer(local,
9280
0
                        (const unsigned char*)key->pkey.ptr,
9281
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9282
                /* now try public key */
9283
0
                if (wolfSSL_EC_KEY_LoadDer_ex(local,
9284
0
                        (const unsigned char*)key->pkey.ptr, key->pkey_sz,
9285
0
                        WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
9286
9287
0
                    wolfSSL_EC_KEY_free(local);
9288
0
                    local = NULL;
9289
0
                }
9290
0
            }
9291
0
        }
9292
0
    }
9293
0
    else {
9294
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key");
9295
0
    }
9296
9297
0
    return local;
9298
0
}
9299
#endif /* HAVE_ECC */
9300
9301
#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
9302
#if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
9303
/* with set1 functions the pkey struct does not own the DH structure
9304
 * Build the following DH Key format from the passed in WOLFSSL_DH
9305
 * then store in WOLFSSL_EVP_PKEY in DER format.
9306
 *
9307
 * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
9308
 */
9309
int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
9310
0
{
9311
0
    byte havePublic = 0, havePrivate = 0;
9312
0
    int ret;
9313
0
    word32 derSz = 0;
9314
0
    byte* derBuf = NULL;
9315
0
    DhKey* dhkey = NULL;
9316
9317
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH");
9318
9319
0
    if (pkey == NULL || key == NULL)
9320
0
        return WOLFSSL_FAILURE;
9321
9322
0
    clearEVPPkeyKeys(pkey);
9323
9324
0
    if (wolfSSL_DH_up_ref(key) != WOLFSSL_SUCCESS) {
9325
0
        WOLFSSL_MSG("Failed to increase dh key ref count");
9326
0
        return WOLFSSL_FAILURE;
9327
0
    }
9328
9329
0
    pkey->dh    = key;
9330
0
    pkey->ownDh = 1; /* pkey does not own DH but needs to call free on it */
9331
0
    pkey->type  = WC_EVP_PKEY_DH;
9332
0
    if (key->inSet == 0) {
9333
0
        if (SetDhInternal(key) != WOLFSSL_SUCCESS) {
9334
0
            WOLFSSL_MSG("SetDhInternal failed");
9335
0
            return WOLFSSL_FAILURE;
9336
0
        }
9337
0
    }
9338
9339
0
    dhkey = (DhKey*)key->internal;
9340
9341
0
    havePublic  = mp_unsigned_bin_size(&dhkey->pub)  > 0;
9342
0
    havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0;
9343
9344
    /* Get size of DER buffer only */
9345
0
    if (havePublic && !havePrivate) {
9346
0
        ret = wc_DhPubKeyToDer(dhkey, NULL, &derSz);
9347
0
    } else if (havePrivate) {
9348
0
        ret = wc_DhPrivKeyToDer(dhkey, NULL, &derSz);
9349
0
    } else {
9350
0
        ret = wc_DhParamsToDer(dhkey,NULL,&derSz);
9351
0
    }
9352
9353
0
    if (derSz == 0 || ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9354
0
       WOLFSSL_MSG("Failed to get size of DH Key");
9355
0
       return WOLFSSL_FAILURE;
9356
0
    }
9357
9358
0
    derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9359
0
    if (derBuf == NULL) {
9360
0
        WOLFSSL_MSG("malloc failed");
9361
0
        return WOLFSSL_FAILURE;
9362
0
    }
9363
9364
    /* Fill DER buffer */
9365
0
    if (havePublic && !havePrivate) {
9366
0
        ret = wc_DhPubKeyToDer(dhkey, derBuf, &derSz);
9367
0
    } else if (havePrivate) {
9368
0
        ret = wc_DhPrivKeyToDer(dhkey, derBuf, &derSz);
9369
0
    } else {
9370
0
        ret = wc_DhParamsToDer(dhkey,derBuf,&derSz);
9371
0
    }
9372
9373
0
    if (ret <= 0) {
9374
0
        WOLFSSL_MSG("Failed to export DH Key");
9375
0
        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
9376
0
        return WOLFSSL_FAILURE;
9377
0
    }
9378
9379
    /* Store DH key into pkey (DER format) */
9380
0
    pkey->pkey.ptr = (char*)derBuf;
9381
0
    pkey->pkey_sz = (int)derSz;
9382
9383
0
    return WOLFSSL_SUCCESS;
9384
0
}
9385
9386
WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key)
9387
0
{
9388
0
    if (!key) {
9389
0
        return NULL;
9390
0
    }
9391
0
    return key->dh;
9392
0
}
9393
9394
WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key)
9395
0
{
9396
0
    WOLFSSL_DH* local = NULL;
9397
9398
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DH");
9399
9400
0
    if (key == NULL || key->dh == NULL) {
9401
0
        WOLFSSL_MSG("Bad function argument");
9402
0
        return NULL;
9403
0
    }
9404
9405
0
    if (key->type == WC_EVP_PKEY_DH) {
9406
        /* if key->dh already exists copy instead of re-importing from DER */
9407
0
        if (key->dh != NULL) {
9408
0
            if (wolfSSL_DH_up_ref(key->dh) != WOLFSSL_SUCCESS) {
9409
0
                return NULL;
9410
0
            }
9411
0
            local = key->dh;
9412
0
        }
9413
0
        else {
9414
0
#if !defined(NO_DH) && (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
9415
0
    (HAVE_FIPS_VERSION>2)))
9416
0
            local = wolfSSL_DH_new();
9417
0
            if (local == NULL) {
9418
0
                WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure");
9419
0
                return NULL;
9420
0
            }
9421
0
            if (wolfSSL_DH_LoadDer(local, (const unsigned char*)key->pkey.ptr,
9422
0
                        key->pkey_sz) != WOLFSSL_SUCCESS) {
9423
0
                wolfSSL_DH_free(local);
9424
0
                WOLFSSL_MSG("Error wolfSSL_DH_LoadDer");
9425
0
                local = NULL;
9426
0
            }
9427
#else
9428
            WOLFSSL_MSG("EVP_PKEY does not hold DH struct");
9429
            return NULL;
9430
#endif
9431
0
        }
9432
0
    }
9433
0
    else {
9434
0
        WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DH key");
9435
0
        wolfSSL_DH_free(local);
9436
0
        return NULL;
9437
0
    }
9438
9439
0
    return local;
9440
0
}
9441
#endif /* NO_DH && WOLFSSL_DH_EXTRA && NO_FILESYSTEM */
9442
9443
int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key)
9444
0
{
9445
0
    int ret;
9446
9447
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_assign");
9448
9449
    /* pkey and key checked if NULL in subsequent assign functions */
9450
0
    switch(type) {
9451
0
    #ifndef NO_RSA
9452
0
        case WC_EVP_PKEY_RSA:
9453
0
            ret = wolfSSL_EVP_PKEY_assign_RSA(pkey, (WOLFSSL_RSA*)key);
9454
0
            break;
9455
0
    #endif
9456
    #ifndef NO_DSA
9457
        case WC_EVP_PKEY_DSA:
9458
            ret = wolfSSL_EVP_PKEY_assign_DSA(pkey, (WOLFSSL_DSA*)key);
9459
            break;
9460
    #endif
9461
0
    #ifdef HAVE_ECC
9462
0
        case WC_EVP_PKEY_EC:
9463
0
            ret = wolfSSL_EVP_PKEY_assign_EC_KEY(pkey, (WOLFSSL_EC_KEY*)key);
9464
0
            break;
9465
0
    #endif
9466
0
    #ifndef NO_DH
9467
0
         case WC_EVP_PKEY_DH:
9468
0
            ret = wolfSSL_EVP_PKEY_assign_DH(pkey, (WOLFSSL_DH*)key);
9469
0
            break;
9470
0
    #endif
9471
0
        default:
9472
0
            WOLFSSL_MSG("Unknown EVP_PKEY type in wolfSSL_EVP_PKEY_assign.");
9473
0
            ret = WOLFSSL_FAILURE;
9474
0
    }
9475
9476
0
    return ret;
9477
0
}
9478
#endif /* WOLFSSL_QT || OPENSSL_ALL */
9479
9480
#if defined(HAVE_ECC)
9481
/* try and populate public pkey_sz and pkey.ptr */
9482
static int ECC_populate_EVP_PKEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
9483
0
{
9484
0
    int derSz = 0;
9485
0
    byte* derBuf = NULL;
9486
0
    ecc_key* ecc;
9487
9488
0
    if (pkey == NULL || key == NULL || key->internal == NULL)
9489
0
        return WOLFSSL_FAILURE;
9490
9491
0
    ecc = (ecc_key*)key->internal;
9492
0
    if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) {
9493
0
#ifdef HAVE_PKCS8
9494
0
        if (key->pkcs8HeaderSz) {
9495
            /* when key has pkcs8 header the pkey should too */
9496
0
            if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
9497
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9498
0
                    DYNAMIC_TYPE_OPENSSL);
9499
0
                if (derBuf) {
9500
0
                    if (wc_EccKeyToPKCS8(ecc, derBuf, (word32*)&derSz) >= 0) {
9501
0
                        if (pkey->pkey.ptr) {
9502
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9503
0
                        }
9504
0
                        pkey->pkey_sz = (int)derSz;
9505
0
                        pkey->pkey.ptr = (char*)derBuf;
9506
0
                        pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
9507
0
                        return WOLFSSL_SUCCESS;
9508
0
                    }
9509
0
                    else {
9510
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9511
0
                        derBuf = NULL;
9512
0
                    }
9513
0
                }
9514
0
            }
9515
0
        }
9516
0
        else
9517
0
#endif /* HAVE_PKCS8 */
9518
0
        {
9519
0
            if (ecc->type == ECC_PRIVATEKEY_ONLY) {
9520
0
                if (wc_ecc_make_pub(ecc, NULL) != MP_OKAY) {
9521
0
                    return WOLFSSL_FAILURE;
9522
0
                }
9523
0
            }
9524
9525
            /* if not, the pkey will be traditional ecc key */
9526
0
            if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) {
9527
0
                derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
9528
0
                    DYNAMIC_TYPE_OPENSSL);
9529
0
                if (derBuf) {
9530
0
                    if (wc_EccKeyToDer(ecc, derBuf, (word32)derSz) >= 0) {
9531
0
                        if (pkey->pkey.ptr) {
9532
0
                            XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9533
0
                        }
9534
0
                        pkey->pkey_sz = (int)derSz;
9535
0
                        pkey->pkey.ptr = (char*)derBuf;
9536
0
                        return WOLFSSL_SUCCESS;
9537
0
                    }
9538
0
                    else {
9539
0
                        XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9540
0
                        derBuf = NULL;
9541
0
                    }
9542
0
                }
9543
0
            }
9544
0
        }
9545
0
    }
9546
0
    else if (ecc->type == ECC_PUBLICKEY) {
9547
0
        if ((derSz = wc_EccPublicKeyDerSize(ecc, 1)) > 0) {
9548
        #ifdef WOLFSSL_NO_REALLOC
9549
            derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9550
            if (derBuf != NULL) {
9551
                XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
9552
                XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
9553
                pkey->pkey.ptr = NULL;
9554
            }
9555
        #else
9556
0
            derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, pkey->heap,
9557
0
                    DYNAMIC_TYPE_OPENSSL);
9558
0
        #endif
9559
0
            if (derBuf != NULL) {
9560
0
                pkey->pkey.ptr = (char*)derBuf;
9561
0
                if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, (word32)derSz,
9562
0
                        1)) < 0) {
9563
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
9564
0
                    derBuf = NULL;
9565
0
                }
9566
0
            }
9567
0
        }
9568
0
    }
9569
0
    if (derBuf != NULL) {
9570
0
        pkey->pkey_sz = (int)derSz;
9571
0
        return WOLFSSL_SUCCESS;
9572
0
    }
9573
0
    else {
9574
0
        return WOLFSSL_FAILURE;
9575
0
    }
9576
0
}
9577
9578
int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
9579
0
{
9580
0
#ifdef HAVE_ECC
9581
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY");
9582
0
    if (pkey == NULL || key == NULL)
9583
0
        return WOLFSSL_FAILURE;
9584
0
    clearEVPPkeyKeys(pkey);
9585
0
    if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) {
9586
0
        WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed");
9587
0
        return WOLFSSL_FAILURE;
9588
0
    }
9589
0
    pkey->ecc    = key;
9590
0
    pkey->ownEcc = 1; /* pkey needs to call free on key */
9591
0
    pkey->type   = WC_EVP_PKEY_EC;
9592
0
    return ECC_populate_EVP_PKEY(pkey, key);
9593
#else
9594
    (void)pkey;
9595
    (void)key;
9596
    return WOLFSSL_FAILURE;
9597
#endif /* HAVE_ECC */
9598
0
}
9599
9600
void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9601
0
{
9602
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE");
9603
9604
0
    if (ctx) {
9605
0
        switch (ctx->cipherType) {
9606
0
            case WC_ARC4_TYPE:
9607
0
                WOLFSSL_MSG("returning arc4 state");
9608
0
                return (void*)&ctx->cipher.arc4.x;
9609
9610
0
            default:
9611
0
                WOLFSSL_MSG("bad x state type");
9612
0
                return 0;
9613
0
        }
9614
0
    }
9615
9616
0
    return NULL;
9617
0
}
9618
int wolfSSL_EVP_PKEY_assign_EC_KEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_EC_KEY* key)
9619
0
{
9620
0
    int ret;
9621
9622
0
    if (pkey == NULL || key == NULL)
9623
0
        return WOLFSSL_FAILURE;
9624
9625
    /* try and populate public pkey_sz and pkey.ptr */
9626
0
    ret = ECC_populate_EVP_PKEY(pkey, key);
9627
0
    if (ret == WOLFSSL_SUCCESS) { /* take ownership of key if can be used */
9628
0
        clearEVPPkeyKeys(pkey); /* clear out any previous keys */
9629
9630
0
        pkey->type = WC_EVP_PKEY_EC;
9631
0
        pkey->ecc = key;
9632
0
        pkey->ownEcc = 1;
9633
0
    }
9634
0
    return ret;
9635
0
}
9636
#endif /* HAVE_ECC */
9637
9638
#ifndef NO_WOLFSSL_STUB
9639
const WOLFSSL_EVP_MD* wolfSSL_EVP_ripemd160(void)
9640
1
{
9641
1
    WOLFSSL_MSG("wolfSSL_ripemd160");
9642
1
    WOLFSSL_STUB("EVP_ripemd160");
9643
1
    return NULL;
9644
1
}
9645
#endif
9646
9647
9648
int wolfSSL_EVP_MD_pkey_type(const WOLFSSL_EVP_MD* type)
9649
0
{
9650
0
    int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
9651
9652
0
    WOLFSSL_ENTER("wolfSSL_EVP_MD_pkey_type");
9653
9654
0
    if (type != NULL) {
9655
0
        if (XSTRCMP(type, WC_SN_md5) == 0) {
9656
0
            ret = WC_NID_md5WithRSAEncryption;
9657
0
        }
9658
0
        else if (XSTRCMP(type, WC_SN_sha1) == 0) {
9659
0
            ret = WC_NID_sha1WithRSAEncryption;
9660
0
        }
9661
0
        else if (XSTRCMP(type, WC_SN_sha224) == 0) {
9662
0
            ret = WC_NID_sha224WithRSAEncryption;
9663
0
        }
9664
0
        else if (XSTRCMP(type, WC_SN_sha256) == 0) {
9665
0
            ret = WC_NID_sha256WithRSAEncryption;
9666
0
        }
9667
0
        else if (XSTRCMP(type, WC_SN_sha384) == 0) {
9668
0
            ret = WC_NID_sha384WithRSAEncryption;
9669
0
        }
9670
0
        else if (XSTRCMP(type, WC_SN_sha512) == 0) {
9671
0
            ret = WC_NID_sha512WithRSAEncryption;
9672
0
        }
9673
0
    }
9674
0
    else {
9675
0
        ret = WOLFSSL_FAILURE;
9676
0
    }
9677
9678
0
    WOLFSSL_LEAVE("wolfSSL_EVP_MD_pkey_type", ret);
9679
9680
0
    return ret;
9681
0
}
9682
9683
9684
9685
int wolfSSL_EVP_CIPHER_CTX_iv_length(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9686
0
{
9687
0
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_CTX_iv_length");
9688
9689
0
    if (ctx == NULL) {
9690
0
        WOLFSSL_MSG("No context");
9691
0
        return 0;
9692
0
    }
9693
9694
0
    switch (ctx->cipherType) {
9695
9696
0
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9697
0
        case WC_AES_128_CBC_TYPE :
9698
0
        case WC_AES_192_CBC_TYPE :
9699
0
        case WC_AES_256_CBC_TYPE :
9700
0
            WOLFSSL_MSG("AES CBC");
9701
0
            return WC_AES_BLOCK_SIZE;
9702
0
#endif
9703
0
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9704
0
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9705
0
#ifdef HAVE_AESGCM
9706
0
        case WC_AES_128_GCM_TYPE :
9707
0
        case WC_AES_192_GCM_TYPE :
9708
0
        case WC_AES_256_GCM_TYPE :
9709
0
            WOLFSSL_MSG("AES GCM");
9710
0
            if (ctx->ivSz != 0) {
9711
0
                return ctx->ivSz;
9712
0
            }
9713
0
            return GCM_NONCE_MID_SZ;
9714
0
#endif
9715
0
#ifdef HAVE_AESCCM
9716
0
        case WC_AES_128_CCM_TYPE :
9717
0
        case WC_AES_192_CCM_TYPE :
9718
0
        case WC_AES_256_CCM_TYPE :
9719
0
            WOLFSSL_MSG("AES CCM");
9720
0
            if (ctx->ivSz != 0) {
9721
0
                return ctx->ivSz;
9722
0
            }
9723
0
            return CCM_NONCE_MIN_SZ;
9724
0
#endif
9725
0
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9726
0
#ifdef WOLFSSL_AES_COUNTER
9727
0
        case WC_AES_128_CTR_TYPE :
9728
0
        case WC_AES_192_CTR_TYPE :
9729
0
        case WC_AES_256_CTR_TYPE :
9730
0
            WOLFSSL_MSG("AES CTR");
9731
0
            return WC_AES_BLOCK_SIZE;
9732
0
#endif
9733
0
#ifndef NO_DES3
9734
0
        case WC_DES_CBC_TYPE :
9735
0
            WOLFSSL_MSG("DES CBC");
9736
0
            return DES_BLOCK_SIZE;
9737
9738
0
        case WC_DES_EDE3_CBC_TYPE :
9739
0
            WOLFSSL_MSG("DES EDE3 CBC");
9740
0
            return DES_BLOCK_SIZE;
9741
0
#endif
9742
0
#ifndef NO_RC4
9743
0
        case WC_ARC4_TYPE :
9744
0
            WOLFSSL_MSG("ARC4");
9745
0
            return 0;
9746
0
#endif
9747
0
#ifdef WOLFSSL_AES_CFB
9748
0
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9749
0
        case WC_AES_128_CFB1_TYPE:
9750
0
        case WC_AES_192_CFB1_TYPE:
9751
0
        case WC_AES_256_CFB1_TYPE:
9752
0
            WOLFSSL_MSG("AES CFB1");
9753
0
            return WC_AES_BLOCK_SIZE;
9754
0
        case WC_AES_128_CFB8_TYPE:
9755
0
        case WC_AES_192_CFB8_TYPE:
9756
0
        case WC_AES_256_CFB8_TYPE:
9757
0
            WOLFSSL_MSG("AES CFB8");
9758
0
            return WC_AES_BLOCK_SIZE;
9759
0
#endif /* !HAVE_SELFTEST && !HAVE_FIPS */
9760
0
        case WC_AES_128_CFB128_TYPE:
9761
0
        case WC_AES_192_CFB128_TYPE:
9762
0
        case WC_AES_256_CFB128_TYPE:
9763
0
            WOLFSSL_MSG("AES CFB128");
9764
0
            return WC_AES_BLOCK_SIZE;
9765
0
#endif /* WOLFSSL_AES_CFB */
9766
0
#if defined(WOLFSSL_AES_OFB)
9767
0
        case WC_AES_128_OFB_TYPE:
9768
0
        case WC_AES_192_OFB_TYPE:
9769
0
        case WC_AES_256_OFB_TYPE:
9770
0
            WOLFSSL_MSG("AES OFB");
9771
0
            return WC_AES_BLOCK_SIZE;
9772
0
#endif /* WOLFSSL_AES_OFB */
9773
0
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9774
0
        case WC_AES_128_XTS_TYPE:
9775
0
        case WC_AES_256_XTS_TYPE:
9776
0
            WOLFSSL_MSG("AES XTS");
9777
0
            return WC_AES_BLOCK_SIZE;
9778
0
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9779
#ifdef HAVE_ARIA
9780
        case WC_ARIA_128_GCM_TYPE :
9781
        case WC_ARIA_192_GCM_TYPE :
9782
        case WC_ARIA_256_GCM_TYPE :
9783
            WOLFSSL_MSG("ARIA GCM");
9784
            if (ctx->ivSz != 0) {
9785
                return ctx->ivSz;
9786
            }
9787
            return GCM_NONCE_MID_SZ;
9788
#endif
9789
0
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9790
0
        case WC_CHACHA20_POLY1305_TYPE:
9791
0
            WOLFSSL_MSG("CHACHA20 POLY1305");
9792
0
            return CHACHA20_POLY1305_AEAD_IV_SIZE;
9793
0
#endif /* HAVE_CHACHA HAVE_POLY1305 */
9794
0
#ifdef HAVE_CHACHA
9795
0
        case WC_CHACHA20_TYPE:
9796
0
            WOLFSSL_MSG("CHACHA20");
9797
0
            return WOLFSSL_EVP_CHACHA_IV_BYTES;
9798
0
#endif /* HAVE_CHACHA */
9799
0
#ifdef WOLFSSL_SM4_CBC
9800
0
        case WC_SM4_CBC_TYPE :
9801
0
            WOLFSSL_MSG("SM4 CBC");
9802
0
            return SM4_BLOCK_SIZE;
9803
0
#endif
9804
0
#ifdef WOLFSSL_SM4_CTR
9805
0
        case WC_SM4_CTR_TYPE :
9806
0
            WOLFSSL_MSG("SM4 CTR");
9807
0
            return SM4_BLOCK_SIZE;
9808
0
#endif
9809
0
#ifdef WOLFSSL_SM4_GCM
9810
0
        case WC_SM4_GCM_TYPE :
9811
0
            WOLFSSL_MSG("SM4 GCM");
9812
0
            if (ctx->ivSz != 0) {
9813
0
                return ctx->ivSz;
9814
0
            }
9815
0
            return GCM_NONCE_MID_SZ;
9816
0
#endif
9817
0
#ifdef WOLFSSL_SM4_CCM
9818
0
        case WC_SM4_CCM_TYPE :
9819
0
            WOLFSSL_MSG("SM4 CCM");
9820
0
            if (ctx->ivSz != 0) {
9821
0
                return ctx->ivSz;
9822
0
            }
9823
0
            return CCM_NONCE_MIN_SZ;
9824
0
#endif
9825
9826
0
        case WC_NULL_CIPHER_TYPE :
9827
0
            WOLFSSL_MSG("NULL");
9828
0
            return 0;
9829
9830
0
        default: {
9831
0
            WOLFSSL_MSG("bad type");
9832
0
        }
9833
0
    }
9834
0
    return 0;
9835
0
}
9836
9837
int wolfSSL_EVP_CIPHER_iv_length(const WOLFSSL_EVP_CIPHER* cipher)
9838
5.05k
{
9839
5.05k
    const char *name = (const char *)cipher;
9840
5.05k
    WOLFSSL_MSG("wolfSSL_EVP_CIPHER_iv_length");
9841
9842
5.05k
#ifndef NO_AES
9843
5.05k
#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
9844
5.05k
    #ifdef WOLFSSL_AES_128
9845
5.05k
    if (XSTRCMP(name, EVP_AES_128_CBC) == 0)
9846
163
        return WC_AES_BLOCK_SIZE;
9847
4.88k
    #endif
9848
4.88k
    #ifdef WOLFSSL_AES_192
9849
4.88k
    if (XSTRCMP(name, EVP_AES_192_CBC) == 0)
9850
50
        return WC_AES_BLOCK_SIZE;
9851
4.83k
    #endif
9852
4.83k
    #ifdef WOLFSSL_AES_256
9853
4.83k
    if (XSTRCMP(name, EVP_AES_256_CBC) == 0)
9854
79
        return WC_AES_BLOCK_SIZE;
9855
4.75k
    #endif
9856
4.75k
#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
9857
4.75k
#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
9858
4.75k
    (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
9859
4.75k
#ifdef HAVE_AESGCM
9860
4.75k
    #ifdef WOLFSSL_AES_128
9861
4.75k
    if (XSTRCMP(name, EVP_AES_128_GCM) == 0)
9862
512
        return GCM_NONCE_MID_SZ;
9863
4.24k
    #endif
9864
4.24k
    #ifdef WOLFSSL_AES_192
9865
4.24k
    if (XSTRCMP(name, EVP_AES_192_GCM) == 0)
9866
176
        return GCM_NONCE_MID_SZ;
9867
4.07k
    #endif
9868
4.07k
    #ifdef WOLFSSL_AES_256
9869
4.07k
    if (XSTRCMP(name, EVP_AES_256_GCM) == 0)
9870
483
        return GCM_NONCE_MID_SZ;
9871
3.58k
    #endif
9872
3.58k
#endif /* HAVE_AESGCM */
9873
3.58k
#ifdef HAVE_AESCCM
9874
3.58k
    #ifdef WOLFSSL_AES_128
9875
3.58k
    if (XSTRCMP(name, EVP_AES_128_CCM) == 0)
9876
0
        return CCM_NONCE_MIN_SZ;
9877
3.58k
    #endif
9878
3.58k
    #ifdef WOLFSSL_AES_192
9879
3.58k
    if (XSTRCMP(name, EVP_AES_192_CCM) == 0)
9880
0
        return CCM_NONCE_MIN_SZ;
9881
3.58k
    #endif
9882
3.58k
    #ifdef WOLFSSL_AES_256
9883
3.58k
    if (XSTRCMP(name, EVP_AES_256_CCM) == 0)
9884
0
        return CCM_NONCE_MIN_SZ;
9885
3.58k
    #endif
9886
3.58k
#endif /* HAVE_AESCCM */
9887
3.58k
#endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
9888
3.58k
#ifdef WOLFSSL_AES_COUNTER
9889
3.58k
    #ifdef WOLFSSL_AES_128
9890
3.58k
    if (XSTRCMP(name, EVP_AES_128_CTR) == 0)
9891
73
        return WC_AES_BLOCK_SIZE;
9892
3.51k
    #endif
9893
3.51k
    #ifdef WOLFSSL_AES_192
9894
3.51k
    if (XSTRCMP(name, EVP_AES_192_CTR) == 0)
9895
418
        return WC_AES_BLOCK_SIZE;
9896
3.09k
    #endif
9897
3.09k
    #ifdef WOLFSSL_AES_256
9898
3.09k
    if (XSTRCMP(name, EVP_AES_256_CTR) == 0)
9899
62
        return WC_AES_BLOCK_SIZE;
9900
3.03k
    #endif
9901
3.03k
#endif
9902
3.03k
#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
9903
3.03k
    #ifdef WOLFSSL_AES_128
9904
3.03k
    if (XSTRCMP(name, EVP_AES_128_XTS) == 0)
9905
393
        return WC_AES_BLOCK_SIZE;
9906
2.64k
    #endif /* WOLFSSL_AES_128 */
9907
9908
2.64k
    #ifdef WOLFSSL_AES_256
9909
2.64k
    if (XSTRCMP(name, EVP_AES_256_XTS) == 0)
9910
99
        return WC_AES_BLOCK_SIZE;
9911
2.54k
    #endif /* WOLFSSL_AES_256 */
9912
2.54k
#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
9913
9914
2.54k
#endif
9915
#ifdef HAVE_ARIA
9916
    if (XSTRCMP(name, EVP_ARIA_128_GCM) == 0)
9917
        return GCM_NONCE_MID_SZ;
9918
    if (XSTRCMP(name, EVP_ARIA_192_GCM) == 0)
9919
        return GCM_NONCE_MID_SZ;
9920
    if (XSTRCMP(name, EVP_ARIA_256_GCM) == 0)
9921
        return GCM_NONCE_MID_SZ;
9922
#endif /* HAVE_ARIA */
9923
9924
2.54k
#ifndef NO_DES3
9925
2.54k
    if ((XSTRCMP(name, EVP_DES_CBC) == 0) ||
9926
2.33k
           (XSTRCMP(name, EVP_DES_EDE3_CBC) == 0)) {
9927
440
        return DES_BLOCK_SIZE;
9928
440
    }
9929
2.10k
#endif
9930
9931
2.10k
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
9932
2.10k
    if (XSTRCMP(name, EVP_CHACHA20_POLY1305) == 0)
9933
0
        return CHACHA20_POLY1305_AEAD_IV_SIZE;
9934
2.10k
#endif
9935
9936
2.10k
#ifdef HAVE_CHACHA
9937
2.10k
    if (XSTRCMP(name, EVP_CHACHA20) == 0)
9938
0
        return WOLFSSL_EVP_CHACHA_IV_BYTES;
9939
2.10k
#endif
9940
9941
2.10k
#ifdef WOLFSSL_SM4_CBC
9942
2.10k
    if (XSTRCMP(name, EVP_SM4_CBC) == 0)
9943
0
        return SM4_BLOCK_SIZE;
9944
2.10k
#endif
9945
2.10k
#ifdef WOLFSSL_SM4_CTR
9946
2.10k
    if (XSTRCMP(name, EVP_SM4_CTR) == 0)
9947
0
        return SM4_BLOCK_SIZE;
9948
2.10k
#endif
9949
2.10k
#ifdef WOLFSSL_SM4_GCM
9950
2.10k
    if (XSTRCMP(name, EVP_SM4_GCM) == 0)
9951
0
        return GCM_NONCE_MID_SZ;
9952
2.10k
#endif
9953
2.10k
#ifdef WOLFSSL_SM4_CCM
9954
2.10k
    if (XSTRCMP(name, EVP_SM4_CCM) == 0)
9955
0
        return CCM_NONCE_MIN_SZ;
9956
2.10k
#endif
9957
9958
2.10k
    (void)name;
9959
9960
2.10k
    return 0;
9961
2.10k
}
9962
9963
9964
int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx)
9965
0
{
9966
0
    WOLFSSL_MSG("wolfSSL_EVP_X_STATE_LEN");
9967
9968
0
    if (ctx) {
9969
0
        switch (ctx->cipherType) {
9970
0
            case WC_ARC4_TYPE:
9971
0
                WOLFSSL_MSG("returning arc4 state size");
9972
0
                return sizeof(Arc4);
9973
9974
0
            default:
9975
0
                WOLFSSL_MSG("bad x state type");
9976
0
                return 0;
9977
0
        }
9978
0
    }
9979
9980
0
    return 0;
9981
0
}
9982
9983
9984
/* return of pkey->type which will be WC_EVP_PKEY_RSA for example.
9985
 *
9986
 * type  type of EVP_PKEY
9987
 *
9988
 * returns type or if type is not found then WC_NID_undef
9989
 */
9990
int wolfSSL_EVP_PKEY_type(int type)
9991
0
{
9992
0
    WOLFSSL_MSG("wolfSSL_EVP_PKEY_type");
9993
9994
0
    switch (type) {
9995
0
        case WC_EVP_PKEY_RSA:
9996
0
            return WC_EVP_PKEY_RSA;
9997
0
        case WC_EVP_PKEY_DSA:
9998
0
            return WC_EVP_PKEY_DSA;
9999
0
        case WC_EVP_PKEY_EC:
10000
0
            return WC_EVP_PKEY_EC;
10001
0
        case WC_EVP_PKEY_DH:
10002
0
            return WC_EVP_PKEY_DH;
10003
0
        default:
10004
0
            return WC_NID_undef;
10005
0
    }
10006
0
}
10007
10008
10009
int wolfSSL_EVP_PKEY_id(const WOLFSSL_EVP_PKEY *pkey)
10010
0
{
10011
0
    if (pkey != NULL)
10012
0
        return pkey->type;
10013
0
    return 0;
10014
0
}
10015
10016
10017
int wolfSSL_EVP_PKEY_base_id(const WOLFSSL_EVP_PKEY *pkey)
10018
0
{
10019
0
    if (pkey == NULL)
10020
0
        return WC_NID_undef;
10021
0
    return wolfSSL_EVP_PKEY_type(pkey->type);
10022
0
}
10023
10024
int wolfSSL_EVP_PKEY_get_default_digest_nid(WOLFSSL_EVP_PKEY *pkey, int *pnid)
10025
0
{
10026
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get_default_digest_nid");
10027
10028
0
    if (!pkey || !pnid) {
10029
0
        WOLFSSL_MSG("Bad parameter");
10030
0
        return WOLFSSL_FAILURE;
10031
0
    }
10032
10033
0
    switch (pkey->type) {
10034
0
    case WC_EVP_PKEY_HMAC:
10035
#ifndef NO_DSA
10036
    case WC_EVP_PKEY_DSA:
10037
#endif
10038
0
#ifndef NO_RSA
10039
0
    case WC_EVP_PKEY_RSA:
10040
0
#endif
10041
0
#ifdef HAVE_ECC
10042
0
    case WC_EVP_PKEY_EC:
10043
0
#endif
10044
0
        *pnid = WC_NID_sha256;
10045
0
        return WOLFSSL_SUCCESS;
10046
0
    default:
10047
0
        return WOLFSSL_FAILURE;
10048
0
    }
10049
0
}
10050
10051
#if defined(OPENSSL_ALL) || defined(WOLFSSL_WPAS_SMALL)
10052
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKCS82PKEY(const WOLFSSL_PKCS8_PRIV_KEY_INFO* p8)
10053
0
{
10054
0
    if (p8 == NULL || p8->pkey.ptr == NULL) {
10055
0
        return NULL;
10056
0
    }
10057
10058
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&p8->pkey.ptr,
10059
0
        p8->pkey_sz);
10060
0
}
10061
10062
/* in wolf PKCS8_PRIV_KEY_INFO and WOLFSSL_EVP_PKEY are same type */
10063
/* this function just casts and returns pointer */
10064
WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_EVP_PKEY2PKCS8(const WOLFSSL_EVP_PKEY* pkey)
10065
0
{
10066
0
    if (pkey == NULL || pkey->pkey.ptr == NULL) {
10067
0
        return NULL;
10068
0
    }
10069
10070
0
    return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&pkey->pkey.ptr,
10071
0
        pkey->pkey_sz);
10072
0
}
10073
#endif
10074
10075
/* increments ref count of WOLFSSL_EVP_PKEY. Return 1 on success, 0 on error */
10076
int wolfSSL_EVP_PKEY_up_ref(WOLFSSL_EVP_PKEY* pkey)
10077
1.17k
{
10078
1.17k
    if (pkey) {
10079
1.17k
        int ret;
10080
1.17k
        wolfSSL_RefInc(&pkey->ref, &ret);
10081
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
10082
        if (ret != 0) {
10083
            WOLFSSL_MSG("Failed to lock pkey mutex");
10084
        }
10085
    #else
10086
1.17k
        (void)ret;
10087
1.17k
    #endif
10088
10089
1.17k
        return WOLFSSL_SUCCESS;
10090
1.17k
    }
10091
10092
0
    return WOLFSSL_FAILURE;
10093
1.17k
}
10094
10095
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_TO_DER)
10096
int wolfSSL_EVP_PKEY_assign_RSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_RSA* key)
10097
0
{
10098
0
    if (pkey == NULL || key == NULL)
10099
0
        return WOLFSSL_FAILURE;
10100
10101
0
    clearEVPPkeyKeys(pkey);
10102
0
    pkey->type = WC_EVP_PKEY_RSA;
10103
0
    pkey->rsa = key;
10104
0
    pkey->ownRsa = 1;
10105
10106
    /* try and populate pkey_sz and pkey.ptr */
10107
0
    if (key->internal) {
10108
0
        RsaKey* rsa = (RsaKey*)key->internal;
10109
0
        int ret = wc_RsaKeyToDer(rsa, NULL, 0);
10110
0
        if (ret > 0) {
10111
0
            word32 derSz = (word32)ret;
10112
0
            byte* derBuf = (byte*)XMALLOC((size_t)derSz, NULL,
10113
0
                DYNAMIC_TYPE_TMP_BUFFER);
10114
0
            if (derBuf != NULL) {
10115
0
                ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
10116
0
                if (ret >= 0) {
10117
0
                    pkey->pkey_sz = ret;
10118
0
                    pkey->pkey.ptr = (char*)derBuf;
10119
0
                }
10120
0
                else { /* failure - okay to ignore */
10121
0
                    XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
10122
0
                    derBuf = NULL;
10123
0
                }
10124
0
            }
10125
0
        }
10126
0
    }
10127
10128
0
    return WOLFSSL_SUCCESS;
10129
0
}
10130
#endif /* !NO_RSA && WOLFSSL_KEY_TO_DER */
10131
10132
#ifndef NO_DSA
10133
int wolfSSL_EVP_PKEY_assign_DSA(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DSA* key)
10134
{
10135
    if (pkey == NULL || key == NULL)
10136
        return WOLFSSL_FAILURE;
10137
10138
    clearEVPPkeyKeys(pkey);
10139
    pkey->type = WC_EVP_PKEY_DSA;
10140
    pkey->dsa = key;
10141
    pkey->ownDsa = 1;
10142
10143
    return WOLFSSL_SUCCESS;
10144
}
10145
#endif /* !NO_DSA */
10146
10147
#ifndef NO_DH
10148
int wolfSSL_EVP_PKEY_assign_DH(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_DH* key)
10149
0
{
10150
0
    if (pkey == NULL || key == NULL)
10151
0
        return WOLFSSL_FAILURE;
10152
10153
0
    clearEVPPkeyKeys(pkey);
10154
0
    pkey->type = WC_EVP_PKEY_DH;
10155
0
    pkey->dh = key;
10156
0
    pkey->ownDh = 1;
10157
10158
0
    return WOLFSSL_SUCCESS;
10159
0
}
10160
#endif /* !NO_DH */
10161
#endif /* OPENSSL_EXTRA */
10162
10163
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
10164
/* EVP Digest functions used with cURL build too */
10165
10166
static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md)
10167
44.6k
{
10168
44.6k
    if (md != NULL) {
10169
44.6k
        const struct s_ent *ent;
10170
210k
        for (ent = md_tbl; ent->name != NULL; ent++) {
10171
210k
            if (XSTRCMP((const char *)md, ent->name) == 0) {
10172
44.6k
                return ent->macType;
10173
44.6k
            }
10174
210k
        }
10175
44.6k
    }
10176
0
    return WC_HASH_TYPE_NONE;
10177
44.6k
}
10178
10179
int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
10180
                                     const WOLFSSL_EVP_MD* type,
10181
                                     WOLFSSL_ENGINE *impl)
10182
761
{
10183
761
    (void) impl;
10184
761
    WOLFSSL_ENTER("wolfSSL_EVP_DigestInit_ex");
10185
761
    return wolfSSL_EVP_DigestInit(ctx, type);
10186
761
}
10187
10188
/* this function makes the assumption that out buffer is big enough for digest*/
10189
int wolfSSL_EVP_Digest(const unsigned char* in, int inSz, unsigned char* out,
10190
                              unsigned int* outSz, const WOLFSSL_EVP_MD* evp,
10191
                              WOLFSSL_ENGINE* eng)
10192
0
{
10193
0
    int err;
10194
0
    int hashType = WC_HASH_TYPE_NONE;
10195
0
    int hashSz;
10196
10197
0
    WOLFSSL_ENTER("wolfSSL_EVP_Digest");
10198
0
    if (in == NULL || out == NULL || evp == NULL) {
10199
0
        WOLFSSL_MSG("Null argument passed in");
10200
0
        return WOLFSSL_FAILURE;
10201
0
    }
10202
10203
0
    err = wolfSSL_EVP_get_hashinfo(evp, &hashType, &hashSz);
10204
0
    if (err != WOLFSSL_SUCCESS)
10205
0
        return err;
10206
10207
0
    if (wc_Hash((enum wc_HashType)hashType, in, (word32)inSz, out,
10208
0
            (word32)hashSz) != 0) {
10209
0
        return WOLFSSL_FAILURE;
10210
0
    }
10211
10212
0
    if (outSz != NULL)
10213
0
        *outSz = (unsigned int)hashSz;
10214
10215
0
    (void)eng;
10216
0
    return WOLFSSL_SUCCESS;
10217
0
}
10218
10219
static const struct alias {
10220
            const char *name;
10221
            const char *alias;
10222
} digest_alias_tbl[] =
10223
{
10224
    {WC_SN_md4, "md4"},
10225
    {WC_SN_md5, "md5"},
10226
    {WC_SN_sha1, "sha1"},
10227
    {WC_SN_sha1, "SHA"},
10228
    {WC_SN_sha224, "sha224"},
10229
    {WC_SN_sha256, "sha256"},
10230
    {WC_SN_sha384, "sha384"},
10231
    {WC_SN_sha512, "sha512"},
10232
    {WC_SN_sha512_224, "sha512_224"},
10233
    {WC_SN_sha3_224, "sha3_224"},
10234
    {WC_SN_sha3_256, "sha3_256"},
10235
    {WC_SN_sha3_384, "sha3_384"},
10236
    {WC_SN_sha3_512, "sha3_512"},
10237
    {WC_SN_sm3, "sm3"},
10238
    {WC_SN_blake2b512, "blake2b512"},
10239
    {WC_SN_blake2s256, "blake2s256"},
10240
    {WC_SN_shake128, "shake128"},
10241
    {WC_SN_shake256, "shake256"},
10242
    { NULL, NULL}
10243
};
10244
10245
const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name)
10246
7
{
10247
7
    const struct alias  *al;
10248
7
    const struct s_ent *ent;
10249
10250
133
    for (al = digest_alias_tbl; al->name != NULL; al++) {
10251
126
        if(XSTRCMP(name, al->alias) == 0) {
10252
0
            name = al->name;
10253
0
            break;
10254
0
        }
10255
126
    }
10256
10257
32
    for (ent = md_tbl; ent->name != NULL; ent++) {
10258
32
        if(XSTRCMP(name, ent->name) == 0) {
10259
7
            return (WOLFSSL_EVP_MD *)ent->name;
10260
7
        }
10261
32
    }
10262
0
    return NULL;
10263
7
}
10264
10265
/* Returns the NID of the WOLFSSL_EVP_MD passed in.
10266
 *
10267
 * type - pointer to WOLFSSL_EVP_MD for which to return NID value
10268
 *
10269
 * Returns NID on success, or WC_NID_undef if none exists.
10270
 */
10271
int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type)
10272
0
{
10273
0
    const struct s_ent *ent ;
10274
0
    WOLFSSL_ENTER("EVP_MD_type");
10275
10276
0
    if (type == NULL) {
10277
0
        WOLFSSL_MSG("MD type arg is NULL");
10278
0
        return WC_NID_undef;
10279
0
    }
10280
10281
0
    for (ent = md_tbl; ent->name != NULL; ent++) {
10282
0
        if (XSTRCMP((const char *)type, ent->name) == 0) {
10283
0
            return ent->nid;
10284
0
        }
10285
0
    }
10286
0
    return WC_NID_undef;
10287
0
}
10288
10289
#ifndef NO_MD4
10290
10291
    /* return a pointer to MD4 EVP type */
10292
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void)
10293
1
    {
10294
1
        WOLFSSL_ENTER("EVP_md4");
10295
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md4);
10296
1
    }
10297
10298
#endif /* !NO_MD4 */
10299
10300
10301
#ifndef NO_MD5
10302
10303
    const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void)
10304
1
    {
10305
1
        WOLFSSL_ENTER("EVP_md5");
10306
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_md5);
10307
1
    }
10308
10309
#endif /* !NO_MD5 */
10310
10311
#ifdef HAVE_BLAKE2
10312
    /* return EVP_MD
10313
     * @param none
10314
     * @return "blake2b512"
10315
     */
10316
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2b512(void)
10317
0
    {
10318
0
        WOLFSSL_ENTER("wolfSSL_EVP_blake2b512");
10319
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_blake2b512);
10320
0
    }
10321
10322
#endif
10323
10324
#ifdef HAVE_BLAKE2S
10325
    /* return EVP_MD
10326
     * @param none
10327
     * @return "blake2s256"
10328
     */
10329
    const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2s256(void)
10330
0
    {
10331
0
        WOLFSSL_ENTER("EVP_blake2s256");
10332
0
        return wolfSSL_EVP_get_digestbyname("BLAKE2s256");
10333
0
    }
10334
10335
#endif
10336
10337
10338
#ifndef NO_WOLFSSL_STUB
10339
    void wolfSSL_EVP_set_pw_prompt(const char *prompt)
10340
0
    {
10341
0
        (void)prompt;
10342
0
        WOLFSSL_STUB("EVP_set_pw_prompt");
10343
0
    }
10344
#endif
10345
10346
#ifndef NO_WOLFSSL_STUB
10347
    const WOLFSSL_EVP_MD* wolfSSL_EVP_mdc2(void)
10348
1
    {
10349
1
        WOLFSSL_STUB("EVP_mdc2");
10350
1
        return NULL;
10351
1
    }
10352
#endif
10353
10354
#ifndef NO_SHA
10355
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void)
10356
1
    {
10357
1
        WOLFSSL_ENTER("EVP_sha1");
10358
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha1);
10359
1
    }
10360
#endif /* NO_SHA */
10361
10362
#ifdef WOLFSSL_SHA224
10363
10364
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void)
10365
1
    {
10366
1
        WOLFSSL_ENTER("EVP_sha224");
10367
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha224);
10368
1
    }
10369
10370
#endif /* WOLFSSL_SHA224 */
10371
10372
10373
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void)
10374
1
    {
10375
1
        WOLFSSL_ENTER("EVP_sha256");
10376
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha256);
10377
1
    }
10378
10379
#ifdef WOLFSSL_SHA384
10380
10381
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void)
10382
1
    {
10383
1
        WOLFSSL_ENTER("EVP_sha384");
10384
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha384);
10385
1
    }
10386
10387
#endif /* WOLFSSL_SHA384 */
10388
10389
#ifdef WOLFSSL_SHA512
10390
10391
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void)
10392
1
    {
10393
1
        WOLFSSL_ENTER("EVP_sha512");
10394
1
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512);
10395
1
    }
10396
10397
#ifndef WOLFSSL_NOSHA512_224
10398
10399
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_224(void)
10400
0
    {
10401
0
        WOLFSSL_ENTER("EVP_sha512_224");
10402
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_224);
10403
0
    }
10404
10405
#endif /* !WOLFSSL_NOSHA512_224 */
10406
10407
#ifndef WOLFSSL_NOSHA512_256
10408
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_256(void)
10409
0
    {
10410
0
        WOLFSSL_ENTER("EVP_sha512_256");
10411
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha512_256);
10412
0
    }
10413
10414
#endif /* !WOLFSSL_NOSHA512_224 */
10415
10416
#endif /* WOLFSSL_SHA512 */
10417
10418
#ifdef WOLFSSL_SHA3
10419
#ifndef WOLFSSL_NOSHA3_224
10420
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_224(void)
10421
0
    {
10422
0
        WOLFSSL_ENTER("EVP_sha3_224");
10423
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_224);
10424
0
    }
10425
#endif /* WOLFSSL_NOSHA3_224 */
10426
10427
10428
#ifndef WOLFSSL_NOSHA3_256
10429
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_256(void)
10430
0
    {
10431
0
        WOLFSSL_ENTER("EVP_sha3_256");
10432
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_256);
10433
0
    }
10434
#endif /* WOLFSSL_NOSHA3_256 */
10435
10436
#ifndef WOLFSSL_NOSHA3_384
10437
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void)
10438
0
    {
10439
0
        WOLFSSL_ENTER("EVP_sha3_384");
10440
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_384);
10441
0
    }
10442
#endif /* WOLFSSL_NOSHA3_384 */
10443
10444
#ifndef WOLFSSL_NOSHA3_512
10445
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void)
10446
0
    {
10447
0
        WOLFSSL_ENTER("EVP_sha3_512");
10448
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sha3_512);
10449
0
    }
10450
#endif /* WOLFSSL_NOSHA3_512 */
10451
10452
#ifdef WOLFSSL_SHAKE128
10453
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake128(void)
10454
0
    {
10455
0
        WOLFSSL_ENTER("EVP_shake128");
10456
0
        return wolfSSL_EVP_get_digestbyname("SHAKE128");
10457
0
    }
10458
#endif /* WOLFSSL_SHAKE128 */
10459
10460
#ifdef WOLFSSL_SHAKE256
10461
    const WOLFSSL_EVP_MD* wolfSSL_EVP_shake256(void)
10462
0
    {
10463
0
        WOLFSSL_ENTER("EVP_shake256");
10464
0
        return wolfSSL_EVP_get_digestbyname("SHAKE256");
10465
0
    }
10466
#endif /* WOLFSSL_SHAKE256 */
10467
10468
#endif /* WOLFSSL_SHA3 */
10469
10470
#ifdef WOLFSSL_SM3
10471
    const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void)
10472
0
    {
10473
0
        WOLFSSL_ENTER("EVP_sm3");
10474
0
        return wolfSSL_EVP_get_digestbyname(WC_SN_sm3);
10475
0
    }
10476
#endif /* WOLFSSL_SM3 */
10477
10478
10479
    WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void)
10480
1.72k
    {
10481
1.72k
        WOLFSSL_EVP_MD_CTX* ctx;
10482
1.72k
        WOLFSSL_ENTER("EVP_MD_CTX_new");
10483
1.72k
        ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof(*ctx), NULL,
10484
1.72k
                                                       DYNAMIC_TYPE_OPENSSL);
10485
1.72k
        if (ctx){
10486
1.72k
            wolfSSL_EVP_MD_CTX_init(ctx);
10487
1.72k
        }
10488
1.72k
        return ctx;
10489
1.72k
    }
10490
10491
    void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX *ctx)
10492
1.72k
    {
10493
1.72k
        if (ctx) {
10494
1.72k
            WOLFSSL_ENTER("EVP_MD_CTX_free");
10495
1.72k
            wolfSSL_EVP_MD_CTX_cleanup(ctx);
10496
1.72k
            XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
10497
1.72k
        }
10498
1.72k
    }
10499
10500
    /* returns the NID of message digest used by the ctx */
10501
    int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx)
10502
0
    {
10503
0
        WOLFSSL_ENTER("EVP_MD_CTX_type");
10504
10505
0
        if (ctx) {
10506
0
            const struct s_ent *ent;
10507
10508
0
            if (ctx->isHMAC) {
10509
0
                return WC_NID_hmac;
10510
0
            }
10511
10512
0
            for(ent = md_tbl; ent->name != NULL; ent++) {
10513
0
                if (ctx->macType == ent->macType) {
10514
0
                    return ent->nid;
10515
0
                }
10516
0
            }
10517
            /* Return whatever we got */
10518
0
            return ctx->macType;
10519
0
        }
10520
0
        return 0;
10521
0
    }
10522
10523
10524
    /* returns digest size */
10525
0
    int wolfSSL_EVP_MD_CTX_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10526
0
        return(wolfSSL_EVP_MD_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10527
0
    }
10528
    /* returns block size */
10529
0
    int wolfSSL_EVP_MD_CTX_block_size(const WOLFSSL_EVP_MD_CTX *ctx) {
10530
0
        return(wolfSSL_EVP_MD_block_size(wolfSSL_EVP_MD_CTX_md(ctx)));
10531
0
    }
10532
10533
    void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx)
10534
2.48k
    {
10535
2.48k
        WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_init");
10536
2.48k
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_MD_CTX));
10537
2.48k
    }
10538
10539
    const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx)
10540
42.8k
    {
10541
42.8k
        const struct s_ent *ent;
10542
42.8k
        if (ctx == NULL)
10543
0
            return NULL;
10544
42.8k
        WOLFSSL_ENTER("EVP_MD_CTX_md");
10545
42.8k
        if (ctx->isHMAC) {
10546
0
            return "HMAC";
10547
0
        }
10548
201k
        for(ent = md_tbl; ent->name != NULL; ent++) {
10549
201k
            if(ctx->macType == ent->macType) {
10550
42.8k
                return (const WOLFSSL_EVP_MD *)ent->name;
10551
42.8k
            }
10552
201k
        }
10553
0
        return (WOLFSSL_EVP_MD *)NULL;
10554
42.8k
    }
10555
10556
    /* return alias name if has
10557
     * @param n message digest type name
10558
     * @return alias name, otherwise NULL
10559
     */
10560
    static const char* getMdAliasName(const char* n)
10561
0
    {
10562
10563
0
        const char* aliasnm = NULL;
10564
0
        const struct alias  *al;
10565
10566
0
        for (al = digest_alias_tbl; al->name != NULL; al++)
10567
0
            if(XSTRCMP(n, al->name) == 0) {
10568
0
                aliasnm = al->alias;
10569
0
                break;
10570
0
            }
10571
10572
0
        return aliasnm;
10573
0
    }
10574
10575
10576
    struct do_all_md {
10577
        void *arg;
10578
        void (*fn) (const WOLFSSL_EVP_MD *m,
10579
                    const char* from, const char* to, void *arg);
10580
    };
10581
10582
    /* do all md algorithm
10583
     * @param nm a pointer to WOLFSSL_OBJ_NAME
10584
     * @param arg arguments to pass to the callback
10585
     * @return none
10586
     */
10587
    static void md_do_all_func(const WOLFSSL_OBJ_NAME* nm, void* arg)
10588
0
    {
10589
0
        struct do_all_md *md = (struct do_all_md*)arg;
10590
10591
        /* sanity check */
10592
0
        if (md == NULL || nm == NULL || md->fn == NULL ||
10593
0
            nm->type != WOLFSSL_OBJ_NAME_TYPE_MD_METH)
10594
0
            return;
10595
10596
0
        if (nm->alias)
10597
0
            md->fn(NULL, nm->name, nm->data, md->arg);
10598
0
        else
10599
0
            md->fn((const WOLFSSL_EVP_MD *)nm->data, nm->name, NULL, md->arg);
10600
0
    }
10601
10602
    /* call md_do_all function to do all md algorithm via a callback function
10603
     * @param fn a callback function to be called with all 'md'
10604
     * @param args arguments to pass to the callback
10605
     * @return none
10606
     */
10607
    void wolfSSL_EVP_MD_do_all(void (*fn) (const WOLFSSL_EVP_MD *m,
10608
                 const char* from, const char* to, void* xx), void* args)
10609
0
    {
10610
0
        struct do_all_md md;
10611
10612
0
        md.fn = fn;
10613
0
        md.arg = args;
10614
10615
0
        wolfSSL_OBJ_NAME_do_all(WOLFSSL_OBJ_NAME_TYPE_MD_METH,
10616
0
                        md_do_all_func, &md);
10617
0
    }
10618
10619
    /* call "fn" based on OBJ_NAME type
10620
     * @param type OBJ_NAME type
10621
     * @param fn a callback function
10622
     * @param args arguments to pass to the callback
10623
     * @return none
10624
     */
10625
    void wolfSSL_OBJ_NAME_do_all(int type,
10626
                void (*fn)(const WOLFSSL_OBJ_NAME*, void* arg), void* arg)
10627
0
    {
10628
0
        WOLFSSL_OBJ_NAME objnm;
10629
10630
        /* sanity check */
10631
0
        if (!fn)
10632
0
            return;
10633
10634
0
        switch(type) {
10635
0
            case WOLFSSL_OBJ_NAME_TYPE_MD_METH:
10636
0
                {
10637
0
                    const struct s_ent *ent;
10638
                    /* loop all md */
10639
0
                    for (ent = md_tbl; ent->name != NULL; ent++){
10640
0
                        XMEMSET(&objnm, 0, sizeof(objnm));
10641
10642
                        /* populate objnm with info about the md */
10643
0
                        objnm.type = WOLFSSL_OBJ_NAME_TYPE_MD_METH;
10644
0
                        objnm.name = ent->name;
10645
0
                        objnm.data = (const char*)
10646
0
                                wolfSSL_EVP_get_digestbyname(ent->name);
10647
0
                        fn(&objnm, arg);
10648
10649
                        /* check if the md has alias and also call fn with it */
10650
0
                        objnm.name = getMdAliasName(ent->name);
10651
0
                        if (objnm.name != NULL) {
10652
0
                            objnm.alias |= WOLFSSL_OBJ_NAME_ALIAS;
10653
0
                            objnm.data = ent->name;
10654
0
                            fn(&objnm, arg);
10655
0
                        }
10656
0
                    }
10657
0
                }
10658
0
                break;
10659
0
            case WOLFSSL_OBJ_NAME_TYPE_CIPHER_METH:
10660
0
            case WOLFSSL_OBJ_NAME_TYPE_PKEY_METH:
10661
0
            case WOLFSSL_OBJ_NAME_TYPE_COMP_METH:
10662
0
            case WOLFSSL_OBJ_NAME_TYPE_NUM:
10663
0
                WOLFSSL_MSG("not implemented");
10664
0
                FALL_THROUGH;
10665
0
            case WOLFSSL_OBJ_NAME_TYPE_UNDEF:
10666
0
            default:
10667
0
                break;
10668
0
        }
10669
0
    }
10670
10671
    int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx)
10672
1.72k
    {
10673
1.72k
        int ret = WOLFSSL_SUCCESS;
10674
1.72k
        WOLFSSL_ENTER("wolfSSL_EVP_MD_CTX_cleanup");
10675
1.72k
    #ifdef OPENSSL_EXTRA
10676
1.72k
        if (ctx->pctx != NULL)
10677
482
            wolfSSL_EVP_PKEY_CTX_free(ctx->pctx);
10678
1.72k
    #endif
10679
10680
1.72k
        if (ctx->isHMAC) {
10681
482
            wc_HmacFree(&ctx->hash.hmac);
10682
482
        }
10683
1.23k
        else {
10684
1.23k
            switch (ctx->macType) {
10685
85
                case WC_HASH_TYPE_MD5:
10686
85
            #ifndef NO_MD5
10687
85
                    wc_Md5Free((wc_Md5*)&ctx->hash.digest);
10688
85
            #endif /* !NO_MD5 */
10689
85
                    break;
10690
87
                case WC_HASH_TYPE_SHA:
10691
87
            #ifndef NO_SHA
10692
87
                    wc_ShaFree((wc_Sha*)&ctx->hash.digest);
10693
87
            #endif /* !NO_SHA */
10694
87
                    break;
10695
90
                case WC_HASH_TYPE_SHA224:
10696
90
            #ifdef WOLFSSL_SHA224
10697
90
                    wc_Sha224Free((wc_Sha224*)&ctx->hash.digest);
10698
90
            #endif /* WOLFSSL_SHA224 */
10699
90
                    break;
10700
134
                case WC_HASH_TYPE_SHA256:
10701
134
            #ifndef NO_SHA256
10702
134
                    wc_Sha256Free((wc_Sha256*)&ctx->hash.digest);
10703
134
            #endif /* !NO_SHA256 */
10704
134
                    break;
10705
84
                case WC_HASH_TYPE_SHA384:
10706
84
            #ifdef WOLFSSL_SHA384
10707
84
                    wc_Sha384Free((wc_Sha384*)&ctx->hash.digest);
10708
84
            #endif /* WOLFSSL_SHA384 */
10709
84
                    break;
10710
134
                case WC_HASH_TYPE_SHA512:
10711
134
            #ifdef WOLFSSL_SHA512
10712
134
                    wc_Sha512Free((wc_Sha512*)&ctx->hash.digest);
10713
134
            #endif /* WOLFSSL_SHA512 */
10714
134
                    break;
10715
0
                case WC_HASH_TYPE_SHA512_224:
10716
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10717
0
                defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10718
0
                    wc_Sha512_224Free((wc_Sha512*)&ctx->hash.digest);
10719
0
            #endif
10720
0
                    break;
10721
0
                case WC_HASH_TYPE_SHA512_256:
10722
0
            #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10723
0
                 defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10724
0
                    wc_Sha512_256Free((wc_Sha512*)&ctx->hash.digest);
10725
0
            #endif
10726
0
                    break;
10727
0
                case WC_HASH_TYPE_SHA3_224:
10728
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
10729
0
                    wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest);
10730
0
            #endif
10731
0
                    break;
10732
0
                case WC_HASH_TYPE_SHA3_256:
10733
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
10734
0
                    wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest);
10735
0
            #endif
10736
0
                    break;
10737
0
                case WC_HASH_TYPE_SHA3_384:
10738
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
10739
0
                    wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest);
10740
0
            #endif
10741
0
                    break;
10742
0
                case WC_HASH_TYPE_SHA3_512:
10743
0
            #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
10744
0
                    wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest);
10745
0
            #endif
10746
0
                    break;
10747
0
                case WC_HASH_TYPE_SM3:
10748
0
            #ifdef WOLFSSL_SM3
10749
0
                    wc_Sm3Free(&ctx->hash.digest.sm3);
10750
0
            #endif
10751
0
                    break;
10752
477
                case WC_HASH_TYPE_NONE:
10753
                    /* Not an error since an unused struct could be free'd or
10754
                     * reset. */
10755
477
                    break;
10756
0
                case WC_HASH_TYPE_SHAKE128:
10757
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
10758
0
                    wc_Shake128_Free(&ctx->hash.digest.shake);
10759
0
            #endif
10760
0
                    break;
10761
0
                case WC_HASH_TYPE_SHAKE256:
10762
0
            #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
10763
0
                    wc_Shake256_Free(&ctx->hash.digest.shake);
10764
0
            #endif
10765
0
                    break;
10766
0
                case WC_HASH_TYPE_MD2:
10767
147
                case WC_HASH_TYPE_MD4:
10768
147
                case WC_HASH_TYPE_MD5_SHA:
10769
147
                case WC_HASH_TYPE_BLAKE2B:
10770
147
                case WC_HASH_TYPE_BLAKE2S:
10771
147
                default:
10772
147
                    ret = WOLFSSL_FAILURE;
10773
147
                    break;
10774
1.23k
            }
10775
1.23k
        }
10776
1.72k
        ForceZero(ctx, sizeof(*ctx));
10777
1.72k
        ctx->macType = WC_HASH_TYPE_NONE;
10778
1.72k
        return ret;
10779
1.72k
    }
10780
10781
    /* WOLFSSL_SUCCESS on ok */
10782
    int wolfSSL_EVP_DigestInit(WOLFSSL_EVP_MD_CTX* ctx,
10783
                               const WOLFSSL_EVP_MD* md)
10784
761
    {
10785
761
        int ret = WOLFSSL_SUCCESS;
10786
    #ifdef WOLFSSL_ASYNC_CRYPT
10787
        wc_static_assert(WC_ASYNC_DEV_SIZE >= sizeof(WC_ASYNC_DEV));
10788
    #endif
10789
10790
761
        WOLFSSL_ENTER("EVP_DigestInit");
10791
10792
761
        if (ctx == NULL) {
10793
0
            return WOLFSSL_FAILURE;
10794
0
        }
10795
10796
761
        wolfSSL_EVP_MD_CTX_init(ctx);
10797
10798
        /* Set to 0 if no match */
10799
761
        ctx->macType = EvpMd2MacType(md);
10800
761
        if (md == NULL) {
10801
0
             XMEMSET(&ctx->hash.digest, 0, sizeof(WOLFSSL_Hasher));
10802
0
        } else
10803
761
    #ifndef NO_SHA
10804
761
        if ((XSTRCMP(md, "SHA") == 0) || (XSTRCMP(md, WC_SN_sha1) == 0)) {
10805
87
             ret = wolfSSL_SHA_Init(&(ctx->hash.digest.sha));
10806
87
        } else
10807
674
    #endif
10808
674
    #ifndef NO_SHA256
10809
674
        if (XSTRCMP(md, WC_SN_sha256) == 0) {
10810
134
             ret = wolfSSL_SHA256_Init(&(ctx->hash.digest.sha256));
10811
134
        } else
10812
540
    #endif
10813
540
    #ifdef WOLFSSL_SHA224
10814
540
        if (XSTRCMP(md, WC_SN_sha224) == 0) {
10815
90
             ret = wolfSSL_SHA224_Init(&(ctx->hash.digest.sha224));
10816
90
        } else
10817
450
    #endif
10818
450
    #ifdef WOLFSSL_SHA384
10819
450
        if (XSTRCMP(md, WC_SN_sha384) == 0) {
10820
84
             ret = wolfSSL_SHA384_Init(&(ctx->hash.digest.sha384));
10821
84
        } else
10822
366
    #endif
10823
366
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10824
366
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10825
366
        if (XSTRCMP(md, WC_SN_sha512_224) == 0) {
10826
0
             ret = wolfSSL_SHA512_224_Init(&(ctx->hash.digest.sha512));
10827
0
        } else
10828
366
    #endif
10829
366
    #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10830
366
        defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10831
366
        if (XSTRCMP(md, WC_SN_sha512_256) == 0) {
10832
0
             ret = wolfSSL_SHA512_256_Init(&(ctx->hash.digest.sha512));
10833
0
        } else
10834
366
    #endif
10835
366
    #ifdef WOLFSSL_SHA512
10836
366
        if (XSTRCMP(md, WC_SN_sha512) == 0) {
10837
134
             ret = wolfSSL_SHA512_Init(&(ctx->hash.digest.sha512));
10838
134
        } else
10839
232
    #endif
10840
232
    #ifndef NO_MD4
10841
232
        if (XSTRCMP(md, WC_SN_md4) == 0) {
10842
147
            wolfSSL_MD4_Init(&(ctx->hash.digest.md4));
10843
147
        } else
10844
85
    #endif
10845
85
    #ifndef NO_MD5
10846
85
        if (XSTRCMP(md, WC_SN_md5) == 0) {
10847
85
            ret = wolfSSL_MD5_Init(&(ctx->hash.digest.md5));
10848
85
        } else
10849
0
    #endif
10850
0
#ifdef WOLFSSL_SHA3
10851
0
    #ifndef WOLFSSL_NOSHA3_224
10852
0
        if (XSTRCMP(md, WC_SN_sha3_224) == 0) {
10853
0
             ret = wolfSSL_SHA3_224_Init(&(ctx->hash.digest.sha3_224));
10854
0
        } else
10855
0
    #endif
10856
0
    #ifndef WOLFSSL_NOSHA3_256
10857
0
        if (XSTRCMP(md, WC_SN_sha3_256) == 0) {
10858
0
             ret = wolfSSL_SHA3_256_Init(&(ctx->hash.digest.sha3_256));
10859
0
        } else
10860
0
    #endif
10861
0
    #ifndef WOLFSSL_NOSHA3_384
10862
0
        if (XSTRCMP(md, WC_SN_sha3_384) == 0) {
10863
0
             ret = wolfSSL_SHA3_384_Init(&(ctx->hash.digest.sha3_384));
10864
0
        } else
10865
0
    #endif
10866
0
    #ifndef WOLFSSL_NOSHA3_512
10867
0
        if (XSTRCMP(md, WC_SN_sha3_512) == 0) {
10868
0
             ret = wolfSSL_SHA3_512_Init(&(ctx->hash.digest.sha3_512));
10869
0
        } else
10870
0
    #endif
10871
0
    #ifdef WOLFSSL_SHAKE128
10872
0
        if (XSTRCMP(md, WC_SN_shake128) == 0) {
10873
0
            if (wc_InitShake128(&(ctx->hash.digest.shake), NULL,
10874
0
                INVALID_DEVID) != 0) {
10875
0
                ret = WOLFSSL_FAILURE;
10876
0
            }
10877
0
        } else
10878
0
    #endif
10879
0
    #ifdef WOLFSSL_SHAKE256
10880
0
        if (XSTRCMP(md, WC_SN_shake256) == 0) {
10881
0
            if (wc_InitShake256(&(ctx->hash.digest.shake), NULL,
10882
0
                INVALID_DEVID) != 0) {
10883
0
                ret = WOLFSSL_FAILURE;
10884
0
            }
10885
0
        } else
10886
0
    #endif
10887
0
#endif
10888
0
    #ifdef WOLFSSL_SM3
10889
0
        if (XSTRCMP(md, WC_SN_sm3) == 0) {
10890
0
             ret = wc_InitSm3(&ctx->hash.digest.sm3, NULL, INVALID_DEVID);
10891
0
             if (ret == 0) {
10892
0
                ret = WOLFSSL_SUCCESS;
10893
0
             }
10894
0
             else {
10895
0
                ret = WOLFSSL_FAILURE;
10896
0
             }
10897
0
        } else
10898
0
    #endif
10899
0
    #ifdef HAVE_BLAKE2
10900
0
        if (XSTRCMP(md, WC_SN_blake2b512) == 0) {
10901
0
            if (wc_InitBlake2b(&ctx->hash.digest.blake2b,
10902
0
                    WC_BLAKE2B_DIGEST_SIZE) != 0) {
10903
0
                ret = WOLFSSL_FAILURE;
10904
0
            }
10905
0
        } else
10906
0
    #endif
10907
0
    #ifdef HAVE_BLAKE2S
10908
0
        if (XSTRCMP(md, WC_SN_blake2s256) == 0) {
10909
0
            if (wc_InitBlake2s(&ctx->hash.digest.blake2s,
10910
0
                    WC_BLAKE2S_DIGEST_SIZE) != 0) {
10911
0
                ret = WOLFSSL_FAILURE;
10912
0
            }
10913
0
        } else
10914
0
    #endif
10915
0
        {
10916
0
             ctx->macType = WC_HASH_TYPE_NONE;
10917
0
             return WOLFSSL_FAILURE;
10918
0
        }
10919
10920
761
        return ret;
10921
761
    }
10922
10923
    /* WOLFSSL_SUCCESS on ok, WOLFSSL_FAILURE on failure */
10924
    int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data,
10925
                                size_t sz)
10926
42.0k
    {
10927
42.0k
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
10928
42.0k
        enum wc_HashType macType;
10929
10930
42.0k
        WOLFSSL_ENTER("EVP_DigestUpdate");
10931
10932
42.0k
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
10933
42.0k
        switch (macType) {
10934
6.96k
            case WC_HASH_TYPE_MD4:
10935
6.96k
        #ifndef NO_MD4
10936
6.96k
                wolfSSL_MD4_Update((WOLFSSL_MD4_CTX*)&ctx->hash, data,
10937
6.96k
                                  (unsigned long)sz);
10938
6.96k
                ret = WOLFSSL_SUCCESS;
10939
6.96k
        #endif
10940
6.96k
                break;
10941
4.73k
            case WC_HASH_TYPE_MD5:
10942
4.73k
        #ifndef NO_MD5
10943
4.73k
                ret = wolfSSL_MD5_Update((WOLFSSL_MD5_CTX*)&ctx->hash, data,
10944
4.73k
                                  (unsigned long)sz);
10945
4.73k
        #endif
10946
4.73k
                break;
10947
6.97k
            case WC_HASH_TYPE_SHA:
10948
6.97k
        #ifndef NO_SHA
10949
6.97k
                ret = wolfSSL_SHA_Update((WOLFSSL_SHA_CTX*)&ctx->hash, data,
10950
6.97k
                                  (unsigned long)sz);
10951
6.97k
        #endif
10952
6.97k
                break;
10953
3.92k
            case WC_HASH_TYPE_SHA224:
10954
3.92k
        #ifdef WOLFSSL_SHA224
10955
3.92k
                ret = wolfSSL_SHA224_Update((WOLFSSL_SHA224_CTX*)&ctx->hash, data,
10956
3.92k
                                     (unsigned long)sz);
10957
3.92k
        #endif
10958
3.92k
                break;
10959
3.10k
            case WC_HASH_TYPE_SHA256:
10960
3.10k
        #ifndef NO_SHA256
10961
3.10k
                ret = wolfSSL_SHA256_Update((WOLFSSL_SHA256_CTX*)&ctx->hash, data,
10962
3.10k
                                     (unsigned long)sz);
10963
3.10k
        #endif /* !NO_SHA256 */
10964
3.10k
                break;
10965
7.77k
            case WC_HASH_TYPE_SHA384:
10966
7.77k
        #ifdef WOLFSSL_SHA384
10967
7.77k
                ret = wolfSSL_SHA384_Update((WOLFSSL_SHA384_CTX*)&ctx->hash, data,
10968
7.77k
                                     (unsigned long)sz);
10969
7.77k
        #endif
10970
7.77k
                break;
10971
8.56k
            case WC_HASH_TYPE_SHA512:
10972
8.56k
        #ifdef WOLFSSL_SHA512
10973
8.56k
                ret = wolfSSL_SHA512_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10974
8.56k
                                     (unsigned long)sz);
10975
8.56k
        #endif /* WOLFSSL_SHA512 */
10976
8.56k
                break;
10977
10978
0
            case WC_HASH_TYPE_SHA512_224:
10979
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10980
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
10981
0
                ret = wolfSSL_SHA512_224_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10982
0
                                     (unsigned long)sz);
10983
        #else
10984
                ret = NOT_COMPILED_IN;
10985
        #endif
10986
0
                break;
10987
10988
0
            case WC_HASH_TYPE_SHA512_256:
10989
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
10990
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
10991
0
                ret = wolfSSL_SHA512_256_Update((WOLFSSL_SHA512_CTX*)&ctx->hash, data,
10992
0
                                     (unsigned long)sz);
10993
        #else
10994
                ret = NOT_COMPILED_IN;
10995
        #endif /* WOLFSSL_SHA512 */
10996
0
                break;
10997
10998
0
            case WC_HASH_TYPE_SHA3_224:
10999
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
11000
0
                ret = wolfSSL_SHA3_224_Update((WOLFSSL_SHA3_224_CTX*)&ctx->hash, data,
11001
0
                                     (unsigned long)sz);
11002
0
        #endif
11003
0
                break;
11004
0
            case WC_HASH_TYPE_SHA3_256:
11005
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
11006
0
                ret = wolfSSL_SHA3_256_Update((WOLFSSL_SHA3_256_CTX*)&ctx->hash, data,
11007
0
                                     (unsigned long)sz);
11008
0
        #endif
11009
0
                break;
11010
0
            case WC_HASH_TYPE_SHA3_384:
11011
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
11012
0
                ret = wolfSSL_SHA3_384_Update((WOLFSSL_SHA3_384_CTX*)&ctx->hash, data,
11013
0
                                     (unsigned long)sz);
11014
0
        #endif
11015
0
                break;
11016
0
            case WC_HASH_TYPE_SHA3_512:
11017
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
11018
0
                ret = wolfSSL_SHA3_512_Update((WOLFSSL_SHA3_512_CTX*)&ctx->hash, data,
11019
0
                                     (unsigned long)sz);
11020
0
        #endif
11021
0
                break;
11022
0
            case WC_HASH_TYPE_SM3:
11023
0
        #ifdef WOLFSSL_SM3
11024
0
                ret = wc_Sm3Update(&ctx->hash.digest.sm3, data, (word32)sz);
11025
0
                if (ret == 0) {
11026
0
                    ret = WOLFSSL_SUCCESS;
11027
0
                }
11028
0
                else {
11029
0
                    ret = WOLFSSL_FAILURE;
11030
0
                }
11031
        #else
11032
                ret = NOT_COMPILED_IN;
11033
        #endif
11034
0
                break;
11035
0
            case WC_HASH_TYPE_SHAKE128:
11036
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11037
0
                if (wc_Shake128_Update(&ctx->hash.digest.shake,
11038
0
                        (const byte*)data, (word32)sz) == 0) {
11039
11040
0
                    ret = WOLFSSL_SUCCESS;
11041
0
                }
11042
        #else
11043
                ret = NOT_COMPILED_IN;
11044
        #endif
11045
0
                break;
11046
0
            case WC_HASH_TYPE_SHAKE256:
11047
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11048
0
                if (wc_Shake256_Update(&ctx->hash.digest.shake,
11049
0
                        (const byte*)data, (word32)sz) == 0) {
11050
0
                    ret = WOLFSSL_SUCCESS;
11051
0
                }
11052
        #else
11053
                ret = NOT_COMPILED_IN;
11054
        #endif
11055
0
                break;
11056
0
        #ifdef HAVE_BLAKE2
11057
0
            case WC_HASH_TYPE_BLAKE2B:
11058
0
                if (wc_Blake2bUpdate(&ctx->hash.digest.blake2b,
11059
0
                        (const byte*)data, (word32)sz) == 0) {
11060
0
                    ret = WOLFSSL_SUCCESS;
11061
0
                }
11062
0
                break;
11063
0
        #endif
11064
0
        #ifdef HAVE_BLAKE2S
11065
0
            case WC_HASH_TYPE_BLAKE2S:
11066
0
                if (wc_Blake2sUpdate(&ctx->hash.digest.blake2s,
11067
0
                        (const byte*)data, (word32)sz) == 0) {
11068
0
                    ret = WOLFSSL_SUCCESS;
11069
0
                }
11070
0
                break;
11071
0
        #endif
11072
0
            case WC_HASH_TYPE_NONE:
11073
0
            case WC_HASH_TYPE_MD2:
11074
0
            case WC_HASH_TYPE_MD5_SHA:
11075
        #ifndef HAVE_BLAKE2
11076
            case WC_HASH_TYPE_BLAKE2B:
11077
        #endif
11078
        #ifndef HAVE_BLAKE2S
11079
            case WC_HASH_TYPE_BLAKE2S:
11080
        #endif
11081
0
            default:
11082
0
                return WOLFSSL_FAILURE;
11083
42.0k
        }
11084
11085
42.0k
        return ret;
11086
42.0k
    }
11087
11088
    /* WOLFSSL_SUCCESS on ok */
11089
    static int wolfSSL_EVP_DigestFinal_Common(WOLFSSL_EVP_MD_CTX* ctx,
11090
            unsigned char* md, unsigned int* s, enum wc_HashType macType)
11091
761
    {
11092
761
        int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11093
11094
761
        switch (macType) {
11095
147
            case WC_HASH_TYPE_MD4:
11096
147
        #ifndef NO_MD4
11097
147
                wolfSSL_MD4_Final(md, (WOLFSSL_MD4_CTX*)&ctx->hash);
11098
147
                if (s) *s = WC_MD4_DIGEST_SIZE;
11099
147
                ret = WOLFSSL_SUCCESS;
11100
147
        #endif
11101
147
                break;
11102
85
            case WC_HASH_TYPE_MD5:
11103
85
        #ifndef NO_MD5
11104
85
                ret = wolfSSL_MD5_Final(md, (WOLFSSL_MD5_CTX*)&ctx->hash);
11105
85
                if (s) *s = WC_MD5_DIGEST_SIZE;
11106
85
        #endif
11107
85
                break;
11108
87
            case WC_HASH_TYPE_SHA:
11109
87
        #ifndef NO_SHA
11110
87
                ret = wolfSSL_SHA_Final(md, (WOLFSSL_SHA_CTX*)&ctx->hash);
11111
87
                if (s) *s = WC_SHA_DIGEST_SIZE;
11112
87
        #endif
11113
87
                break;
11114
90
            case WC_HASH_TYPE_SHA224:
11115
90
        #ifdef WOLFSSL_SHA224
11116
90
                ret = wolfSSL_SHA224_Final(md, (WOLFSSL_SHA224_CTX*)&ctx->hash);
11117
90
                if (s) *s = WC_SHA224_DIGEST_SIZE;
11118
90
        #endif
11119
90
                break;
11120
134
            case WC_HASH_TYPE_SHA256:
11121
134
        #ifndef NO_SHA256
11122
134
                ret = wolfSSL_SHA256_Final(md, (WOLFSSL_SHA256_CTX*)&ctx->hash);
11123
134
                if (s) *s = WC_SHA256_DIGEST_SIZE;
11124
134
        #endif /* !NO_SHA256 */
11125
134
                break;
11126
84
            case WC_HASH_TYPE_SHA384:
11127
84
        #ifdef WOLFSSL_SHA384
11128
84
                ret = wolfSSL_SHA384_Final(md, (WOLFSSL_SHA384_CTX*)&ctx->hash);
11129
84
                if (s) *s = WC_SHA384_DIGEST_SIZE;
11130
84
        #endif
11131
84
                break;
11132
134
            case WC_HASH_TYPE_SHA512:
11133
134
        #ifdef WOLFSSL_SHA512
11134
134
                ret = wolfSSL_SHA512_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11135
134
                if (s) *s = WC_SHA512_DIGEST_SIZE;
11136
134
        #endif /* WOLFSSL_SHA512 */
11137
134
                break;
11138
0
            case WC_HASH_TYPE_SHA512_224:
11139
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11140
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
11141
0
                ret = wolfSSL_SHA512_224_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11142
0
                if (s) *s = WC_SHA512_224_DIGEST_SIZE;
11143
        #else
11144
                ret = NOT_COMPILED_IN;
11145
        #endif
11146
0
                break;
11147
0
            case WC_HASH_TYPE_SHA512_256:
11148
0
        #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
11149
0
            defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
11150
0
                ret = wolfSSL_SHA512_256_Final(md, (WOLFSSL_SHA512_CTX*)&ctx->hash);
11151
0
                if (s) *s = WC_SHA512_256_DIGEST_SIZE;
11152
        #else
11153
                ret = NOT_COMPILED_IN;
11154
        #endif
11155
0
                break;
11156
0
            case WC_HASH_TYPE_SHA3_224:
11157
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
11158
0
                ret = wolfSSL_SHA3_224_Final(md, (WOLFSSL_SHA3_224_CTX*)&ctx->hash);
11159
0
                if (s) *s = WC_SHA3_224_DIGEST_SIZE;
11160
0
        #endif
11161
0
                break;
11162
0
            case WC_HASH_TYPE_SHA3_256:
11163
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
11164
0
                ret = wolfSSL_SHA3_256_Final(md, (WOLFSSL_SHA3_256_CTX*)&ctx->hash);
11165
0
                if (s) *s = WC_SHA3_256_DIGEST_SIZE;
11166
0
        #endif
11167
0
                break;
11168
0
            case WC_HASH_TYPE_SHA3_384:
11169
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
11170
0
                ret = wolfSSL_SHA3_384_Final(md, (WOLFSSL_SHA3_384_CTX*)&ctx->hash);
11171
0
                if (s) *s = WC_SHA3_384_DIGEST_SIZE;
11172
0
        #endif
11173
0
                break;
11174
0
            case WC_HASH_TYPE_SHA3_512:
11175
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
11176
0
                ret = wolfSSL_SHA3_512_Final(md, (WOLFSSL_SHA3_512_CTX*)&ctx->hash);
11177
0
                if (s) *s = WC_SHA3_512_DIGEST_SIZE;
11178
0
        #endif
11179
0
                break;
11180
0
            case WC_HASH_TYPE_SM3:
11181
0
        #ifdef WOLFSSL_SM3
11182
0
                ret = wc_Sm3Final(&ctx->hash.digest.sm3, md);
11183
0
                if (ret == 0) {
11184
0
                    ret = WOLFSSL_SUCCESS;
11185
0
                }
11186
0
                else {
11187
0
                    ret = WOLFSSL_FAILURE;
11188
0
                }
11189
0
                if (s) *s = WC_SM3_DIGEST_SIZE;
11190
        #else
11191
                ret = NOT_COMPILED_IN;
11192
        #endif
11193
0
                break;
11194
0
            case WC_HASH_TYPE_SHAKE128:
11195
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11196
0
                if (wc_Shake128_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11197
0
                    ret = WOLFSSL_SUCCESS;
11198
0
                }
11199
        #else
11200
                ret = NOT_COMPILED_IN;
11201
        #endif
11202
0
                break;
11203
0
            case WC_HASH_TYPE_SHAKE256:
11204
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11205
0
                if (wc_Shake256_Final(&ctx->hash.digest.shake, md, *s) == 0) {
11206
0
                    ret = WOLFSSL_SUCCESS;
11207
0
                }
11208
        #else
11209
                ret = NOT_COMPILED_IN;
11210
        #endif
11211
0
                break;
11212
0
            case WC_HASH_TYPE_BLAKE2B:
11213
0
        #ifdef HAVE_BLAKE2
11214
0
                if (wc_Blake2bFinal(&ctx->hash.digest.blake2b, md,
11215
0
                        WC_BLAKE2B_DIGEST_SIZE) == 0) {
11216
0
                    if (s) *s = WC_BLAKE2B_DIGEST_SIZE;
11217
0
                    ret = WOLFSSL_SUCCESS;
11218
0
                }
11219
        #else
11220
                ret = NOT_COMPILED_IN;
11221
        #endif
11222
0
                break;
11223
0
            case WC_HASH_TYPE_BLAKE2S:
11224
0
        #ifdef HAVE_BLAKE2S
11225
0
                if (wc_Blake2sFinal(&ctx->hash.digest.blake2s, md,
11226
0
                        WC_BLAKE2S_DIGEST_SIZE) == 0) {
11227
0
                    if (s) *s = WC_BLAKE2S_DIGEST_SIZE;
11228
0
                    ret = WOLFSSL_SUCCESS;
11229
0
                }
11230
        #else
11231
                ret = NOT_COMPILED_IN;
11232
        #endif
11233
0
                break;
11234
0
            case WC_HASH_TYPE_NONE:
11235
0
            case WC_HASH_TYPE_MD2:
11236
0
            case WC_HASH_TYPE_MD5_SHA:
11237
0
            default:
11238
0
                return WOLFSSL_FAILURE;
11239
761
        }
11240
11241
761
        return ret;
11242
761
    }
11243
11244
    int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11245
                               unsigned int* s)
11246
761
    {
11247
761
        enum wc_HashType macType;
11248
11249
761
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinal");
11250
761
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11251
761
        switch (macType) {
11252
147
            case WC_HASH_TYPE_MD4:
11253
232
            case WC_HASH_TYPE_MD5:
11254
319
            case WC_HASH_TYPE_SHA:
11255
409
            case WC_HASH_TYPE_SHA224:
11256
543
            case WC_HASH_TYPE_SHA256:
11257
627
            case WC_HASH_TYPE_SHA384:
11258
761
            case WC_HASH_TYPE_SHA512:
11259
761
            case WC_HASH_TYPE_SHA512_224:
11260
761
            case WC_HASH_TYPE_SHA512_256:
11261
761
            case WC_HASH_TYPE_SHA3_224:
11262
761
            case WC_HASH_TYPE_SHA3_256:
11263
761
            case WC_HASH_TYPE_SHA3_384:
11264
761
            case WC_HASH_TYPE_SHA3_512:
11265
761
            case WC_HASH_TYPE_SM3:
11266
761
            case WC_HASH_TYPE_BLAKE2B:
11267
761
            case WC_HASH_TYPE_BLAKE2S:
11268
761
            case WC_HASH_TYPE_NONE:
11269
761
            case WC_HASH_TYPE_MD2:
11270
761
            case WC_HASH_TYPE_MD5_SHA:
11271
761
                break;
11272
11273
0
            case WC_HASH_TYPE_SHAKE128:
11274
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11275
0
                *s = 16; /* if mixing up XOF with plain digest 128 bit is
11276
                          * default for SHAKE128 */
11277
        #else
11278
                return WOLFSSL_FAILURE;
11279
        #endif
11280
0
                break;
11281
0
            case WC_HASH_TYPE_SHAKE256:
11282
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11283
0
                *s = 32; /* if mixing up XOF with plain digest 256 bit is
11284
                          * default for SHAKE256 */
11285
        #else
11286
                return WOLFSSL_FAILURE;
11287
        #endif
11288
0
                break;
11289
0
            default:
11290
0
                return WOLFSSL_FAILURE;
11291
761
        }
11292
761
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, s, macType);
11293
761
    }
11294
11295
    /* WOLFSSL_SUCCESS on ok */
11296
    int wolfSSL_EVP_DigestFinal_ex(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
11297
                                   unsigned int* s)
11298
761
    {
11299
761
        WOLFSSL_ENTER("EVP_DigestFinal_ex");
11300
761
        return wolfSSL_EVP_DigestFinal(ctx, md, s);
11301
761
    }
11302
11303
11304
    /* XOF stands for extendable-output functions. This is used for algos such
11305
     * as SHAKE256.
11306
     *
11307
     * returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on fail */
11308
    int wolfSSL_EVP_DigestFinalXOF(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *md,
11309
        size_t sz)
11310
0
    {
11311
0
        unsigned int len;
11312
0
        enum wc_HashType macType;
11313
11314
0
        WOLFSSL_ENTER("wolfSSL_EVP_DigestFinalXOF");
11315
0
        len = (unsigned int)sz;
11316
11317
0
        macType = EvpMd2MacType(wolfSSL_EVP_MD_CTX_md(ctx));
11318
0
        return wolfSSL_EVP_DigestFinal_Common(ctx, md, &len, macType);
11319
0
    }
11320
11321
11322
    unsigned long wolfSSL_EVP_MD_flags(const WOLFSSL_EVP_MD *md)
11323
0
    {
11324
0
        enum wc_HashType macType;
11325
11326
0
        macType = EvpMd2MacType(md);
11327
0
        switch ((int)macType) {
11328
0
            case WC_HASH_TYPE_BLAKE2B:
11329
0
            case WC_HASH_TYPE_BLAKE2S:
11330
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11331
0
            case WC_HASH_TYPE_SHAKE128:
11332
0
        #endif
11333
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11334
0
            case WC_HASH_TYPE_SHAKE256:
11335
0
        #endif
11336
0
                return WOLFSSL_EVP_MD_FLAG_XOF;
11337
0
            default:
11338
0
                return 0;
11339
0
        }
11340
0
    }
11341
11342
11343
    void wolfSSL_EVP_cleanup(void)
11344
0
    {
11345
        /* nothing to do here */
11346
0
    }
11347
11348
const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id)
11349
0
{
11350
0
    WOLFSSL_MSG("wolfSSL_get_digestbynid");
11351
11352
0
    switch(id) {
11353
0
#ifndef NO_MD4
11354
0
        case WC_NID_md4:
11355
0
            return wolfSSL_EVP_md4();
11356
0
#endif
11357
0
#ifndef NO_MD5
11358
0
        case WC_NID_md5:
11359
0
            return wolfSSL_EVP_md5();
11360
0
#endif
11361
0
#ifndef NO_SHA
11362
0
        case WC_NID_sha1:
11363
0
            return wolfSSL_EVP_sha1();
11364
0
#endif
11365
0
#ifdef WOLFSSL_SHA224
11366
0
        case WC_NID_sha224:
11367
0
            return wolfSSL_EVP_sha224();
11368
0
#endif
11369
0
#ifndef NO_SHA256
11370
0
        case WC_NID_sha256:
11371
0
            return wolfSSL_EVP_sha256();
11372
0
#endif
11373
0
#ifdef WOLFSSL_SHA384
11374
0
        case WC_NID_sha384:
11375
0
            return wolfSSL_EVP_sha384();
11376
0
#endif
11377
0
#ifdef WOLFSSL_SHA512
11378
0
        case WC_NID_sha512:
11379
0
            return wolfSSL_EVP_sha512();
11380
0
#endif
11381
0
#ifdef WOLFSSL_SM3
11382
0
        case WC_NID_sm3:
11383
0
            return wolfSSL_EVP_sm3();
11384
0
#endif
11385
0
#ifdef WOLFSSL_SHAKE128
11386
0
        case WC_NID_shake128:
11387
0
            return wolfSSL_EVP_shake128();
11388
0
#endif
11389
0
#ifdef WOLFSSL_SHAKE256
11390
0
        case WC_NID_shake256:
11391
0
            return wolfSSL_EVP_shake256();
11392
0
#endif
11393
0
        default:
11394
0
            WOLFSSL_MSG("Bad digest id value");
11395
0
    }
11396
11397
0
    return NULL;
11398
0
}
11399
int wolfSSL_EVP_MD_block_size(const WOLFSSL_EVP_MD* type)
11400
0
{
11401
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_block_size");
11402
11403
0
    if (type == NULL) {
11404
0
        WOLFSSL_MSG("No md type arg");
11405
0
        return WOLFSSL_FAILURE;
11406
0
    }
11407
11408
0
#ifndef NO_SHA
11409
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11410
0
        return WC_SHA_BLOCK_SIZE;
11411
0
    } else
11412
0
#endif
11413
0
#ifndef NO_SHA256
11414
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11415
0
        return WC_SHA256_BLOCK_SIZE;
11416
0
    } else
11417
0
#endif
11418
0
#ifndef NO_MD4
11419
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11420
0
        return WC_MD4_BLOCK_SIZE;
11421
0
    } else
11422
0
#endif
11423
0
#ifndef NO_MD5
11424
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11425
0
        return WC_MD5_BLOCK_SIZE;
11426
0
    } else
11427
0
#endif
11428
0
#ifdef WOLFSSL_SHA224
11429
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11430
0
        return WC_SHA224_BLOCK_SIZE;
11431
0
    } else
11432
0
#endif
11433
0
#ifdef WOLFSSL_SHA384
11434
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11435
0
        return WC_SHA384_BLOCK_SIZE;
11436
0
    } else
11437
0
#endif
11438
0
#ifdef WOLFSSL_SHA512
11439
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11440
0
        return WC_SHA512_BLOCK_SIZE;
11441
0
    } else
11442
0
#endif
11443
0
#ifdef WOLFSSL_SHA3
11444
0
#ifndef WOLFSSL_NOSHA3_224
11445
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11446
0
        return WC_SHA3_224_BLOCK_SIZE;
11447
0
    } else
11448
0
#endif
11449
0
#ifndef WOLFSSL_NOSHA3_256
11450
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11451
0
        return WC_SHA3_256_BLOCK_SIZE;
11452
0
    } else
11453
0
#endif
11454
0
#ifndef WOLFSSL_NOSHA3_384
11455
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11456
0
        return WC_SHA3_384_BLOCK_SIZE;
11457
0
    } else
11458
0
#endif
11459
0
#ifndef WOLFSSL_NOSHA3_512
11460
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11461
0
        return WC_SHA3_512_BLOCK_SIZE;
11462
0
    } else
11463
0
#endif
11464
0
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
11465
0
    if (XSTRCMP(type, WC_SN_shake128) == 0) {
11466
0
        return WC_SHA3_128_BLOCK_SIZE;
11467
0
    } else
11468
0
#endif
11469
0
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
11470
0
    if (XSTRCMP(type, WC_SN_shake256) == 0) {
11471
0
        return WC_SHA3_256_BLOCK_SIZE;
11472
0
    } else
11473
0
#endif
11474
0
#endif /* WOLFSSL_SHA3 */
11475
0
#ifdef WOLFSSL_SM3
11476
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11477
0
        return WC_SM3_BLOCK_SIZE;
11478
0
    } else
11479
0
#endif
11480
11481
0
    return WOLFSSL_FAILURE;
11482
0
}
11483
11484
int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type)
11485
0
{
11486
0
    WOLFSSL_MSG("wolfSSL_EVP_MD_size");
11487
11488
0
    if (type == NULL) {
11489
0
        WOLFSSL_MSG("No md type arg");
11490
0
        return WOLFSSL_FAILURE;
11491
0
    }
11492
11493
0
#ifndef NO_SHA
11494
0
    if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, WC_SN_sha1) == 0)) {
11495
0
        return WC_SHA_DIGEST_SIZE;
11496
0
    } else
11497
0
#endif
11498
0
#ifndef NO_SHA256
11499
0
    if (XSTRCMP(type, WC_SN_sha256) == 0) {
11500
0
        return WC_SHA256_DIGEST_SIZE;
11501
0
    } else
11502
0
#endif
11503
0
#ifndef NO_MD4
11504
0
    if (XSTRCMP(type, WC_SN_md4) == 0) {
11505
0
        return WC_MD4_DIGEST_SIZE;
11506
0
    } else
11507
0
#endif
11508
0
#ifndef NO_MD5
11509
0
    if (XSTRCMP(type, WC_SN_md5) == 0) {
11510
0
        return WC_MD5_DIGEST_SIZE;
11511
0
    } else
11512
0
#endif
11513
0
#ifdef WOLFSSL_SHA224
11514
0
    if (XSTRCMP(type, WC_SN_sha224) == 0) {
11515
0
        return WC_SHA224_DIGEST_SIZE;
11516
0
    } else
11517
0
#endif
11518
0
#ifdef WOLFSSL_SHA384
11519
0
    if (XSTRCMP(type, WC_SN_sha384) == 0) {
11520
0
        return WC_SHA384_DIGEST_SIZE;
11521
0
    } else
11522
0
#endif
11523
0
#ifdef WOLFSSL_SHA512
11524
0
    if (XSTRCMP(type, WC_SN_sha512) == 0) {
11525
0
        return WC_SHA512_DIGEST_SIZE;
11526
0
    } else
11527
0
#ifndef WOLFSSL_NOSHA512_224
11528
0
    if (XSTRCMP(type, WC_SN_sha512_224) == 0) {
11529
0
        return WC_SHA512_224_DIGEST_SIZE;
11530
0
    } else
11531
0
#endif
11532
0
#ifndef WOLFSSL_NOSHA512_256
11533
0
    if (XSTRCMP(type, WC_SN_sha512_256) == 0) {
11534
0
        return WC_SHA512_256_DIGEST_SIZE;
11535
0
    } else
11536
0
#endif
11537
0
#endif
11538
0
#ifdef WOLFSSL_SHA3
11539
0
#ifndef WOLFSSL_NOSHA3_224
11540
0
    if (XSTRCMP(type, WC_SN_sha3_224) == 0) {
11541
0
        return WC_SHA3_224_DIGEST_SIZE;
11542
0
    } else
11543
0
#endif
11544
0
#ifndef WOLFSSL_NOSHA3_256
11545
0
    if (XSTRCMP(type, WC_SN_sha3_256) == 0) {
11546
0
        return WC_SHA3_256_DIGEST_SIZE;
11547
0
    } else
11548
0
#endif
11549
0
#ifndef WOLFSSL_NOSHA3_384
11550
0
    if (XSTRCMP(type, WC_SN_sha3_384) == 0) {
11551
0
        return WC_SHA3_384_DIGEST_SIZE;
11552
0
    } else
11553
0
#endif
11554
0
#ifndef WOLFSSL_NOSHA3_512
11555
0
    if (XSTRCMP(type, WC_SN_sha3_512) == 0) {
11556
0
        return WC_SHA3_512_DIGEST_SIZE;
11557
0
    } else
11558
0
#endif
11559
0
#endif /* WOLFSSL_SHA3 */
11560
0
#ifdef WOLFSSL_SM3
11561
0
    if (XSTRCMP(type, WC_SN_sm3) == 0) {
11562
0
        return WC_SM3_DIGEST_SIZE;
11563
0
    }
11564
0
#endif
11565
11566
0
    return WOLFSSL_FAILURE;
11567
0
}
11568
11569
#endif /* OPENSSL_EXTRA  || HAVE_CURL */
11570
11571
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
11572
/* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the
11573
 * subset of X509 API */
11574
11575
2.04k
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new(void){
11576
2.04k
    return wolfSSL_EVP_PKEY_new_ex(NULL);
11577
2.04k
}
11578
11579
WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap)
11580
2.73k
{
11581
2.73k
    WOLFSSL_EVP_PKEY* pkey;
11582
2.73k
    int ret;
11583
2.73k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_ex");
11584
2.73k
    pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap,
11585
2.73k
            DYNAMIC_TYPE_PUBLIC_KEY);
11586
2.73k
    if (pkey != NULL) {
11587
2.73k
        XMEMSET(pkey, 0, sizeof(WOLFSSL_EVP_PKEY));
11588
2.73k
        pkey->heap = heap;
11589
2.73k
        pkey->type = WOLFSSL_EVP_PKEY_DEFAULT;
11590
11591
2.73k
#ifndef HAVE_FIPS
11592
2.73k
        ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID);
11593
#else
11594
        ret = wc_InitRng(&pkey->rng);
11595
#endif
11596
2.73k
        if (ret != 0){
11597
            /* Free directly since mutex for ref count not set yet */
11598
0
            XFREE(pkey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
11599
0
            WOLFSSL_MSG("Issue initializing RNG");
11600
0
            return NULL;
11601
0
        }
11602
11603
2.73k
        wolfSSL_RefInit(&pkey->ref, &ret);
11604
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11605
        if (ret != 0){
11606
            wolfSSL_EVP_PKEY_free(pkey);
11607
            WOLFSSL_MSG("Issue initializing mutex");
11608
            return NULL;
11609
        }
11610
    #else
11611
2.73k
        (void)ret;
11612
2.73k
    #endif
11613
2.73k
    }
11614
0
    else {
11615
0
        WOLFSSL_MSG("memory failure");
11616
0
    }
11617
11618
2.73k
    return pkey;
11619
2.73k
}
11620
11621
void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
11622
3.27k
{
11623
3.27k
    int doFree = 0;
11624
3.27k
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free");
11625
3.27k
    if (key != NULL) {
11626
2.37k
        int ret;
11627
2.37k
        wolfSSL_RefDec(&key->ref, &doFree, &ret);
11628
    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
11629
        if (ret != 0) {
11630
            WOLFSSL_MSG("Couldn't lock pkey mutex");
11631
        }
11632
    #else
11633
2.37k
        (void)ret;
11634
2.37k
    #endif
11635
11636
2.37k
        if (doFree) {
11637
1.20k
            wc_FreeRng(&key->rng);
11638
11639
1.20k
            if (key->pkey.ptr != NULL) {
11640
517
                XFREE(key->pkey.ptr, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11641
517
                key->pkey.ptr = NULL;
11642
517
            }
11643
1.20k
            switch(key->type)
11644
1.20k
            {
11645
0
                #ifndef NO_RSA
11646
0
                case WC_EVP_PKEY_RSA:
11647
0
                    if (key->rsa != NULL && key->ownRsa == 1) {
11648
0
                        wolfSSL_RSA_free(key->rsa);
11649
0
                        key->rsa = NULL;
11650
0
                    }
11651
0
                    break;
11652
0
                #endif /* NO_RSA */
11653
11654
0
                #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
11655
0
                case WC_EVP_PKEY_EC:
11656
0
                    if (key->ecc != NULL && key->ownEcc == 1) {
11657
0
                        wolfSSL_EC_KEY_free(key->ecc);
11658
0
                        key->ecc = NULL;
11659
0
                    }
11660
0
                    break;
11661
0
                #endif /* HAVE_ECC && OPENSSL_EXTRA */
11662
11663
                #ifndef NO_DSA
11664
                case WC_EVP_PKEY_DSA:
11665
                    if (key->dsa != NULL && key->ownDsa == 1) {
11666
                        wolfSSL_DSA_free(key->dsa);
11667
                        key->dsa = NULL;
11668
                    }
11669
                    break;
11670
                #endif /* NO_DSA */
11671
11672
0
                #if !defined(NO_DH) && (defined(WOLFSSL_QT) || \
11673
0
                       defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL))
11674
0
                case WC_EVP_PKEY_DH:
11675
0
                    if (key->dh != NULL && key->ownDh == 1) {
11676
0
                        wolfSSL_DH_free(key->dh);
11677
0
                        key->dh = NULL;
11678
0
                    }
11679
0
                    break;
11680
0
                #endif /* ! NO_DH ... */
11681
11682
0
                #ifdef HAVE_HKDF
11683
689
                case WC_EVP_PKEY_HKDF:
11684
689
                    XFREE(key->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
11685
689
                    key->hkdfSalt = NULL;
11686
689
                    XFREE(key->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
11687
689
                    key->hkdfKey = NULL;
11688
689
                    XFREE(key->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
11689
689
                    key->hkdfInfo = NULL;
11690
689
                    key->hkdfSaltSz = 0;
11691
689
                    key->hkdfKeySz = 0;
11692
689
                    key->hkdfInfoSz = 0;
11693
689
                    break;
11694
0
                #endif /* HAVE_HKDF */
11695
11696
0
                #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
11697
0
                    defined(WOLFSSL_AES_DIRECT)
11698
0
                case WC_EVP_PKEY_CMAC:
11699
0
                    if (key->cmacCtx != NULL) {
11700
0
                        wolfSSL_CMAC_CTX_free(key->cmacCtx);
11701
0
                        key->cmacCtx = NULL;
11702
0
                    }
11703
0
                    break;
11704
0
                #endif /* defined(WOLFSSL_CMAC) ... */
11705
11706
517
                default:
11707
517
                    break;
11708
1.20k
            }
11709
11710
1.20k
            wolfSSL_RefFree(&key->ref);
11711
1.20k
            XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11712
1.20k
        }
11713
2.37k
    }
11714
3.27k
}
11715
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
11716
11717
/* Indent writes white spaces of the number specified by "indents"
11718
 * to the BIO. The number of white spaces is limited from 0 to
11719
 * EVP_PKEY_PRINT_INDENT_MAX.
11720
 * returns the amount written to BIO.
11721
 */
11722
static int Indent(WOLFSSL_BIO* out, int indents)
11723
0
{
11724
0
    int i;
11725
0
    char space = ' ';
11726
0
    if (out == NULL) {
11727
0
        return 0;
11728
0
    }
11729
0
    if (indents > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11730
0
        indents = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11731
0
    }
11732
0
    for (i = 0; i < indents; i++) {
11733
0
        if (wolfSSL_BIO_write(out, &space, 1) < 0) {
11734
0
            break;
11735
0
        }
11736
0
    }
11737
0
    return indents -i;
11738
0
}
11739
/* PrintHexWithColon dump byte-data specified by "input" to the "out".
11740
 * Each line has leading white spaces( "indent" gives the number ) plus
11741
 * four spaces, then hex coded 15 byte data with separator ":" follow.
11742
 * Each line looks like:
11743
 * "    00:e6:ab: --- 9f:ef:"
11744
 * Parameters:
11745
 * out     bio to output dump data
11746
 * input   buffer holding data to dump
11747
 * inlen   input data size
11748
 * indent  the number of spaces for indent
11749
 * blower  true if lower case uses
11750
 * Returns 1 on success, 0 on failure.
11751
 */
11752
static int PrintHexWithColon(WOLFSSL_BIO* out, const byte* input,
11753
    int inlen, int indent, byte blower)
11754
0
{
11755
0
#ifdef WOLFSSL_SMALL_STACK
11756
0
    byte*  buff = NULL;
11757
#else
11758
    byte   buff[WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX] = { 0 };
11759
#endif /* WOLFSSL_SMALL_STACK */
11760
0
    int    ret = WOLFSSL_SUCCESS;
11761
0
    word32 in = 0;
11762
0
    word32 i;
11763
0
    int    idx;
11764
0
    const  byte* data;
11765
0
    word32 outSz;
11766
0
    byte   outHex[3];
11767
11768
0
    if (!out || !input || inlen <= 0) {
11769
0
        return WOLFSSL_FAILURE;
11770
0
    }
11771
11772
0
    if (indent < 0) {
11773
0
        indent = 0;
11774
0
    }
11775
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11776
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11777
0
    }
11778
11779
0
    data = input;
11780
11781
0
#ifdef WOLFSSL_SMALL_STACK
11782
0
    buff = (byte*)XMALLOC(WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX, NULL,
11783
0
        DYNAMIC_TYPE_TMP_BUFFER);
11784
0
    if (!buff) {
11785
0
        return WOLFSSL_FAILURE;
11786
0
    }
11787
0
#endif
11788
11789
    /* print pub element */
11790
0
    idx = 0;
11791
11792
0
    for (in = 0; in < (word32)inlen && ret == WOLFSSL_SUCCESS; in +=
11793
0
             WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE ) {
11794
0
        if (Indent(out, indent) < 0) {
11795
0
            ret = WOLFSSL_FAILURE;
11796
0
            break;
11797
0
        }
11798
0
        for (i = 0; (i < WOLFSSL_EVP_PKEY_PRINT_DIGITS_PER_LINE) &&
11799
0
                                        (in + i < (word32)inlen); i++) {
11800
11801
0
            if (ret == WOLFSSL_SUCCESS) {
11802
0
                outSz = sizeof(outHex);
11803
0
                ret = Base16_Encode((const byte*)&data[in + i], 1,
11804
0
                                                    outHex, &outSz) == 0;
11805
0
            }
11806
0
            if (ret == WOLFSSL_SUCCESS) {
11807
0
                if (blower) {
11808
0
                    outHex[0] = (byte)XTOLOWER(outHex[0]);
11809
0
                    outHex[1] = (byte)XTOLOWER(outHex[1]);
11810
0
                }
11811
0
                XMEMCPY(buff + idx, outHex, 2);
11812
0
                idx += 2;
11813
11814
0
                if (in + i != (word32)inlen -1) {
11815
0
                    XMEMSET(buff + idx, ':', 1);
11816
0
                    idx += 1;
11817
0
                }
11818
0
            }
11819
0
        }
11820
0
        if (ret == WOLFSSL_SUCCESS) {
11821
0
            ret = wolfSSL_BIO_write(out, buff, idx) > 0;
11822
0
        }
11823
0
        if (ret == WOLFSSL_SUCCESS) {
11824
0
            ret = wolfSSL_BIO_write(out, "\n", 1) > 0;
11825
0
        }
11826
0
        if (ret == WOLFSSL_SUCCESS) {
11827
0
            XMEMSET(buff, 0, WOLFSSL_EVP_PKEY_PRINT_LINE_WIDTH_MAX);
11828
0
            idx = 0;
11829
0
        }
11830
0
    }
11831
0
    WC_FREE_VAR_EX(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11832
0
    return ret;
11833
0
}
11834
#if !defined(NO_RSA)
11835
/* PrintPubKeyRSA is a helper function for wolfSSL_EVP_PKEY_print_public
11836
 * to parse a DER format RSA public key specified in the second parameter.
11837
 * Parameters:
11838
 * out     bio to output dump data
11839
 * pkey    buffer holding public key data
11840
 * pkeySz  public key data size
11841
 * indent  the number of spaces for indent
11842
 * bitlen  bit size of the given key
11843
 * pctx    context(not used)
11844
 * Returns 1 on success, 0 on failure.
11845
*/
11846
static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11847
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11848
0
{
11849
0
    byte   buff[8] = { 0 };
11850
0
    int    res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
11851
0
    word32 inOutIdx = 0;
11852
0
    word32 nSz;             /* size of modulus */
11853
0
    word32 eSz;             /* size of public exponent */
11854
0
    const byte*  n   = NULL;
11855
0
    const byte*  e   = NULL; /* pointer to modulus/exponent */
11856
0
    word32 i;
11857
0
    unsigned long exponent = 0;
11858
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
11859
0
    char line[32] = { 0 };
11860
11861
0
    (void)pctx;
11862
11863
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
11864
0
        return WOLFSSL_FAILURE);
11865
11866
0
    if( mp_init(a) != 0) {
11867
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11868
0
        return WOLFSSL_FAILURE;
11869
0
    }
11870
0
    if (indent < 0) {
11871
0
        indent = 0;
11872
0
    }
11873
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
11874
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
11875
0
    }
11876
11877
0
    do {
11878
0
        int idx;
11879
0
        int wsz;
11880
11881
        /* parse key to get modulus and exponent */
11882
0
        if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, (word32)pkeySz,
11883
0
                                                &n, &nSz, &e, &eSz) != 0) {
11884
0
            break;
11885
0
        }
11886
11887
        /* print out public key elements */
11888
0
        idx = 0;
11889
0
        XMEMSET(buff, 0, sizeof(buff));
11890
0
        Indent(out, indent);
11891
0
        XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
11892
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11893
0
            break;
11894
0
        }
11895
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
11896
0
            break;
11897
0
        }
11898
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11899
0
            break;
11900
0
        }
11901
0
        wsz = (int)XSTRLEN((const char*)buff);
11902
11903
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11904
0
            break;
11905
0
        }
11906
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
11907
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11908
0
            break;
11909
0
        }
11910
        /* print Modulus */
11911
0
        Indent(out, indent);
11912
0
        XSTRNCPY(line, "Modulus:\n", sizeof(line));
11913
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11914
0
            break;
11915
0
        }
11916
11917
        /* print modulus with leading zero if exists */
11918
0
        if (*n & 0x80 && *(n-1) == 0) {
11919
0
            n--;
11920
0
            nSz++;
11921
0
        }
11922
11923
0
        if (PrintHexWithColon(out, n, (int)nSz,
11924
0
                    indent + 4, 1/* lower case */) != WOLFSSL_SUCCESS) {
11925
0
            break;
11926
0
        }
11927
        /* print public Exponent */
11928
0
        idx = 0;
11929
0
        Indent(out, indent);
11930
0
        XSTRNCPY(line, "Exponent: ", sizeof(line));
11931
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11932
0
            break;
11933
0
        }
11934
0
        for (i = 0; i < eSz; i++) {
11935
0
            exponent <<= 8;
11936
0
            exponent += e[i];
11937
0
        }
11938
11939
0
        XMEMSET(buff, 0, sizeof(buff));
11940
0
        if (mp_set_int(a, exponent) != 0) {
11941
0
            break;
11942
0
        }
11943
0
        if (mp_todecimal(a, (char*)buff) != 0) {
11944
0
            break;
11945
0
        }
11946
0
        wsz = (int)XSTRLEN((const char*)buff);
11947
11948
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
11949
0
            break;
11950
0
        }
11951
0
        XSTRNCPY(line, " (0x", sizeof(line));
11952
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11953
0
            break;
11954
0
        }
11955
0
        XMEMSET(buff, 0, sizeof(buff));
11956
0
        if (mp_tohex(a, (char*)buff) != 0) {
11957
0
            break;
11958
0
        }
11959
0
        if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((char*)buff)) <= 0) {
11960
0
            break;
11961
0
        }
11962
0
        XSTRNCPY(line, ")\n", sizeof(line));
11963
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
11964
0
            break;
11965
0
        }
11966
11967
0
        res = WOLFSSL_SUCCESS;
11968
0
    } while (0);
11969
11970
0
    mp_free(a);
11971
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
11972
0
    return res;
11973
0
}
11974
#endif /* !NO_RSA */
11975
11976
#if defined(HAVE_ECC)
11977
/* PrintPubKeyEC is a helper function for wolfSSL_EVP_PKEY_print_public
11978
 * to parse a DER format ECC public key specified in the second parameter.
11979
 * Parameters:
11980
 * out     bio to output dump data
11981
 * pkey    buffer holding public key data
11982
 * pkeySz  public key data size
11983
 * indent  the number of spaces for indent
11984
 * bitlen  bit size of the given key
11985
 * pctx    context(not used)
11986
 * Returns 1 on success, 0 on failure.
11987
*/
11988
static int PrintPubKeyEC(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
11989
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
11990
0
{
11991
0
    byte*   pub = NULL;
11992
0
    word32  pubSz = 0;
11993
0
    byte    buff[8] = { 0 };
11994
0
    int     res = WOLFSSL_SUCCESS;
11995
0
    word32  inOutIdx = 0;
11996
0
    int     curveId = 0;
11997
0
    const byte* curveOID = NULL;
11998
0
    word32  oidSz = 0;
11999
0
    const char* OIDName = NULL;
12000
0
    const char* nistCurveName = NULL;
12001
0
    int idx = 0;
12002
0
    int wsz = 0;
12003
0
#ifdef WOLFSSL_SMALL_STACK
12004
0
    mp_int* a = NULL;
12005
0
    ecc_key* key = NULL;
12006
#else
12007
    mp_int  a[1];
12008
    ecc_key key[1];
12009
#endif
12010
0
    char line[32] = { 0 };
12011
0
    (void)pctx;
12012
12013
0
#ifdef WOLFSSL_SMALL_STACK
12014
0
    a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
12015
0
    if (a == NULL) {
12016
0
        WOLFSSL_MSG("Failed to allocate memory for mp_int");
12017
0
        return WOLFSSL_FAILURE;
12018
0
    }
12019
0
    XMEMSET(a, 0, sizeof(mp_int));
12020
12021
0
    key = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
12022
0
    if (key == NULL) {
12023
0
        WOLFSSL_MSG("Failed to allocate memory for ecc_key");
12024
0
        XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
12025
0
        return WOLFSSL_FAILURE;
12026
0
    }
12027
0
#endif
12028
12029
0
    if (mp_init(a) != 0) {
12030
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12031
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12032
0
        return WOLFSSL_FAILURE;
12033
0
    }
12034
12035
0
    if (wc_ecc_init(key) != 0) {
12036
        /* Return early so we don't have to remember if init succeeded
12037
         * or not. */
12038
0
        mp_free(a);
12039
0
        WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12040
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12041
0
        return WOLFSSL_FAILURE;
12042
0
    }
12043
12044
0
    if (indent < 0) {
12045
0
        indent = 0;
12046
0
    }
12047
0
    else if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12048
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12049
0
    }
12050
12051
0
    if (res == WOLFSSL_SUCCESS) {
12052
0
        res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, (word32)pkeySz) == 0;
12053
0
    }
12054
12055
0
    if (res == WOLFSSL_SUCCESS) {
12056
0
        curveId = wc_ecc_get_oid(key->dp->oidSum, &curveOID, &oidSz);
12057
0
        res = curveId > 0 && oidSz > 0;
12058
0
    }
12059
12060
    /* get NIST curve name */
12061
0
    if (res == WOLFSSL_SUCCESS) {
12062
0
        int nid = EccEnumToNID(curveId);
12063
0
        if (nid != -1) {
12064
            /* look up object name and nist curve name*/
12065
0
            OIDName = wolfSSL_OBJ_nid2sn(nid);
12066
0
            nistCurveName = wolfSSL_EC_curve_nid2nist(nid);
12067
0
            res = (nistCurveName != NULL) && (OIDName != NULL);
12068
0
        }
12069
0
        else {
12070
0
            res = WOLFSSL_FAILURE;
12071
0
        }
12072
0
    }
12073
0
    if (res == WOLFSSL_SUCCESS) {
12074
0
        pub = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
12075
0
        if (pub != NULL) {
12076
0
            pubSz = ECC_BUFSIZE;
12077
0
            XMEMSET(pub, 0, ECC_BUFSIZE);
12078
12079
0
            PRIVATE_KEY_UNLOCK();
12080
0
            res = wc_ecc_export_x963(key, pub, &pubSz) == 0;
12081
0
            PRIVATE_KEY_LOCK();
12082
0
        }
12083
0
        else {
12084
0
            res = WOLFSSL_FAILURE;
12085
0
        }
12086
0
    }
12087
0
    if (res == WOLFSSL_SUCCESS) {
12088
0
        idx = 0;
12089
0
        res = Indent(out, indent) >= 0;
12090
0
    }
12091
0
    if (res == WOLFSSL_SUCCESS) {
12092
0
        XSTRNCPY(line, "Public-Key: (", sizeof(line));
12093
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12094
0
    }
12095
0
    if (res == WOLFSSL_SUCCESS) {
12096
0
        res = mp_set_int(a, (unsigned long)bitlen) == 0;
12097
0
    }
12098
0
    if (res == WOLFSSL_SUCCESS) {
12099
0
        res = mp_todecimal(a, (char*)buff) == 0;
12100
0
    }
12101
0
    if (res == WOLFSSL_SUCCESS) {
12102
0
        wsz = (int)XSTRLEN((const char*)buff);
12103
0
    }
12104
0
    if (res == WOLFSSL_SUCCESS) {
12105
0
        res = wolfSSL_BIO_write(out, buff + idx, wsz) >= 0;
12106
0
    }
12107
0
    if (res == WOLFSSL_SUCCESS) {
12108
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
12109
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12110
0
    }
12111
0
    if (res == WOLFSSL_SUCCESS) {
12112
0
        res = Indent(out, indent) >= 0;
12113
0
    }
12114
0
    if (res == WOLFSSL_SUCCESS) {
12115
        /* print pub element */
12116
0
        XSTRNCPY(line, "pub:\n", sizeof(line));
12117
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12118
0
    }
12119
0
    if (res == WOLFSSL_SUCCESS) {
12120
        /* upper case */
12121
0
        res = PrintHexWithColon(out, pub, (int)pubSz, indent + 4, 0);
12122
0
    }
12123
0
    if (res == WOLFSSL_SUCCESS) {
12124
0
        res = Indent(out, indent) >= 0;
12125
0
    }
12126
0
    if (res == WOLFSSL_SUCCESS) {
12127
        /* print OID in name */
12128
0
        XSTRNCPY(line, "ASN1 OID: ", sizeof(line));
12129
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12130
0
    }
12131
0
    if (res == WOLFSSL_SUCCESS) {
12132
0
        res = wolfSSL_BIO_write(out, OIDName, (int)XSTRLEN(OIDName)) > 0;
12133
0
    }
12134
0
    if (res == WOLFSSL_SUCCESS) {
12135
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12136
0
    }
12137
0
    if (res == WOLFSSL_SUCCESS) {
12138
0
        res = Indent(out, indent) >= 0;
12139
0
    }
12140
0
    if (res == WOLFSSL_SUCCESS) {
12141
        /* print NIST curve name */
12142
0
        XSTRNCPY(line, "NIST CURVE: ", sizeof(line));
12143
0
        res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
12144
0
    }
12145
0
    if (res == WOLFSSL_SUCCESS) {
12146
0
        res = wolfSSL_BIO_write(out, nistCurveName,
12147
0
            (int)XSTRLEN(nistCurveName)) > 0;
12148
0
    }
12149
0
    if (res == WOLFSSL_SUCCESS) {
12150
0
        res = wolfSSL_BIO_write(out, "\n", 1) > 0;
12151
0
    }
12152
12153
0
    XFREE(pub, NULL, DYNAMIC_TYPE_ECC_BUFFER);
12154
0
    pub = NULL;
12155
12156
0
    wc_ecc_free(key);
12157
0
    mp_free(a);
12158
12159
0
    WC_FREE_VAR_EX(key, NULL, DYNAMIC_TYPE_ECC);
12160
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12161
12162
0
    return res;
12163
0
}
12164
#endif /* HAVE_ECC */
12165
12166
#if !defined(NO_DSA)
12167
/* PrintPubKeyDSA is a helper function for wolfSSL_EVP_PKEY_print_public
12168
 * to parse a DER format DSA public key specified in the second parameter.
12169
 * Parameters:
12170
 * out     bio to output dump data
12171
 * pkey    buffer holding public key data
12172
 * pkeySz  public key data size
12173
 * indent  the number of spaces for indent
12174
 * bitlen  bit size of the given key
12175
 * pctx    context(not used)
12176
 * Returns 1 on success, 0 on failure.
12177
*/
12178
static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12179
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12180
{
12181
12182
    byte    buff[8] = { 0 };
12183
    int     length;
12184
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12185
    word32  inOutIdx = 0;
12186
    word32  oid;
12187
    byte    tagFound;
12188
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12189
    char line[32] = { 0 };
12190
12191
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12192
        return WOLFSSL_FAILURE);
12193
12194
    if( mp_init(a) != 0) {
12195
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12196
        return WOLFSSL_FAILURE;
12197
    }
12198
12199
    inOutIdx = 0;
12200
    (void)pctx;
12201
12202
    if (indent < 0) {
12203
        indent = 0;
12204
    }
12205
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12206
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12207
    }
12208
12209
    do {
12210
        byte *p = NULL, * q = NULL, * g = NULL, * y = NULL;
12211
        int pSz, qSz, gSz, ySz;
12212
        int idx;
12213
        int wsz;
12214
12215
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12216
            break;
12217
        }
12218
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12219
            break;
12220
        }
12221
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) !=
12222
                0) {
12223
            break;
12224
        }
12225
        if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
12226
            break;
12227
        }
12228
        /* find P */
12229
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12230
            break;
12231
        }
12232
        if (tagFound != ASN_INTEGER) {
12233
            break;
12234
        }
12235
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12236
            break;
12237
        }
12238
        p   = (byte*)(pkey + inOutIdx);
12239
        pSz = length;
12240
12241
        if (bitlen == 0) {
12242
            if (*p == 0) {
12243
                bitlen = (pSz - 1) * 8;    /* remove leading zero */
12244
            }
12245
            else {
12246
                bitlen = pSz * 8;
12247
            }
12248
        }
12249
12250
        inOutIdx += (word32)length;
12251
        /* find Q */
12252
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12253
            break;
12254
        }
12255
        if (tagFound != ASN_INTEGER) {
12256
            break;
12257
        }
12258
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12259
            break;
12260
        }
12261
        q = (byte*)(pkey + inOutIdx);
12262
        qSz = length;
12263
        inOutIdx += (word32)length;
12264
12265
        /* find G */
12266
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12267
            break;
12268
        }
12269
        if (tagFound != ASN_INTEGER) {
12270
            break;
12271
        }
12272
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12273
            break;
12274
        }
12275
        g = (byte*)(pkey + inOutIdx);
12276
        gSz = length;
12277
        inOutIdx += (word32)length;
12278
        /* find Y */
12279
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12280
            break;
12281
        }
12282
        if (tagFound != ASN_BIT_STRING) {
12283
            break;
12284
        }
12285
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12286
            break;
12287
        }
12288
        inOutIdx++;     /* skip the first byte( unused byte number)*/
12289
12290
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12291
            break;
12292
        }
12293
        if (tagFound != ASN_INTEGER) {
12294
            break;
12295
        }
12296
        if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
12297
            break;
12298
        }
12299
        y = (byte*)(pkey + inOutIdx);
12300
        ySz = length;
12301
12302
        idx = 0;
12303
        XMEMSET(buff, 0, sizeof(buff));
12304
        Indent(out, indent);
12305
        XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
12306
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12307
            break;
12308
        }
12309
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12310
            break;
12311
        }
12312
        if (mp_todecimal(a, (char*)buff) != 0) {
12313
            break;
12314
        }
12315
        wsz = (int)XSTRLEN((const char*)buff);
12316
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12317
            break;
12318
        }
12319
        XSTRNCPY(line, " bit)\n", sizeof(line));
12320
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12321
            break;
12322
        }
12323
        /* print pub element */
12324
        Indent(out, indent);
12325
        XSTRNCPY(line, "pub:\n", sizeof(line));
12326
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12327
            break;
12328
        }
12329
        if (PrintHexWithColon(out, y, ySz, indent + 4, 0/* upper case */)
12330
                                                        != WOLFSSL_SUCCESS) {
12331
            break;
12332
        }
12333
        /* print P element */
12334
        Indent(out, indent);
12335
        XSTRNCPY(line, "P:\n", sizeof(line));
12336
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12337
            break;
12338
        }
12339
        if (PrintHexWithColon(out, p, pSz, indent + 4, 0/* upper case */)
12340
                                                        != WOLFSSL_SUCCESS) {
12341
            break;
12342
        }
12343
        /* print Q element */
12344
        Indent(out, indent);
12345
        XSTRNCPY(line, "Q:\n", sizeof(line));
12346
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12347
            break;
12348
        }
12349
        if (PrintHexWithColon(out, q, qSz, indent + 4, 0/* upper case */)
12350
                                                         != WOLFSSL_SUCCESS) {
12351
            break;
12352
        }
12353
        /* print G element */
12354
        Indent(out, indent);
12355
        XSTRNCPY(line, "G:\n", sizeof(line));
12356
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12357
            break;
12358
        }
12359
        if (PrintHexWithColon(out, g, gSz, indent + 4, 0/* upper case */)
12360
                                                        != WOLFSSL_SUCCESS) {
12361
            break;
12362
        }
12363
12364
        res = WOLFSSL_SUCCESS;
12365
    } while (0);
12366
12367
    mp_free(a);
12368
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12369
    return res;
12370
}
12371
#endif /* !NO_DSA */
12372
12373
#if defined(WOLFSSL_DH_EXTRA)
12374
/* PrintPubKeyDH is a helper function for wolfSSL_EVP_PKEY_print_public
12375
 * to parse a DER format DH public key specified in the second parameter.
12376
 * Parameters:
12377
 * out     bio to output dump data
12378
 * pkey    buffer holding public key data
12379
 * pkeySz  public key data size
12380
 * indent  the number of spaces for indent
12381
 * bitlen  bit size of the given key
12382
 * pctx    context(not used)
12383
 * Returns 1 on success, 0 on failure.
12384
*/
12385
static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
12386
    int indent, int bitlen, WOLFSSL_ASN1_PCTX* pctx)
12387
0
{
12388
12389
0
    byte    buff[8] = { 0 };
12390
0
    int     res = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
12391
0
    word32  length;
12392
0
    word32  inOutIdx;
12393
0
    word32  oid;
12394
0
    byte    tagFound;
12395
0
    byte*   prime = NULL;
12396
0
    byte    generator;
12397
0
    byte*   publicKey = NULL;
12398
0
    word32  outSz;
12399
0
    byte    outHex[3];
12400
0
    WC_DECLARE_VAR(a, mp_int, 1, 0);
12401
0
    char line[32] = { 0 };
12402
12403
0
    WC_ALLOC_VAR_EX(a, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT,
12404
0
        return WOLFSSL_FAILURE);
12405
12406
0
    if( mp_init(a) != 0) {
12407
0
        WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12408
0
        return WOLFSSL_FAILURE;
12409
0
    }
12410
12411
0
    inOutIdx = 0;
12412
0
    (void)pctx;
12413
12414
0
    if (indent < 0) {
12415
0
        indent = 0;
12416
0
    }
12417
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12418
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12419
0
    }
12420
12421
0
    do {
12422
0
        int primeSz;
12423
0
        int publicKeySz;
12424
0
        int idx;
12425
0
        int wsz;
12426
12427
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12428
0
            break;
12429
0
        }
12430
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12431
0
            break;
12432
0
        }
12433
0
        if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) <
12434
0
                0) {
12435
0
            break;
12436
0
        }
12437
0
        if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
12438
0
            break;
12439
0
        }
12440
        /* get prime element */
12441
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12442
0
            break;
12443
0
        }
12444
0
        if (tagFound != ASN_INTEGER) {
12445
0
            break;
12446
0
        }
12447
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12448
0
            break;
12449
0
        }
12450
0
        prime     = (byte*)(pkey + inOutIdx);
12451
0
        primeSz   = (int)length;
12452
0
        inOutIdx += length;
12453
12454
        /* get generator element */
12455
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12456
0
            break;
12457
0
        }
12458
0
        if (tagFound != ASN_INTEGER) {
12459
0
            break;
12460
0
        }
12461
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12462
0
            break;
12463
0
        }
12464
0
        if (length != 1) {
12465
0
            break;
12466
0
        }
12467
0
        generator = *(pkey + inOutIdx);
12468
0
        inOutIdx += length;
12469
12470
        /* get public-key element */
12471
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12472
0
            break;
12473
0
        }
12474
0
        if (tagFound != ASN_BIT_STRING) {
12475
0
            break;
12476
0
        }
12477
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12478
0
            break;
12479
0
        }
12480
0
        inOutIdx ++;
12481
0
        if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
12482
0
            break;
12483
0
        }
12484
0
        if (tagFound != ASN_INTEGER) {
12485
0
            break;
12486
0
        }
12487
0
        if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
12488
0
            break;
12489
0
        }
12490
0
        publicKeySz = (int)length;
12491
0
        publicKey = (byte*)(pkey + inOutIdx);
12492
12493
0
        if (bitlen == 0) {
12494
0
            if (*publicKey == 0) {
12495
0
                bitlen = (publicKeySz - 1) * 8;
12496
0
            }
12497
0
            else {
12498
0
                bitlen = publicKeySz * 8;
12499
0
            }
12500
0
        }
12501
12502
        /* print elements */
12503
0
        idx = 0;
12504
0
        Indent(out, indent);
12505
0
        XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
12506
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12507
0
            break;
12508
0
        }
12509
0
        if (mp_set_int(a, (unsigned long)bitlen) != 0) {
12510
0
            break;
12511
0
        }
12512
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12513
0
            break;
12514
0
        }
12515
0
        wsz = (int)XSTRLEN((const char*)buff);
12516
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12517
0
            break;
12518
0
        }
12519
0
        XSTRNCPY(line, " bit)\n", sizeof(line));
12520
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12521
0
            break;
12522
0
        }
12523
0
        Indent(out, indent);
12524
0
        XSTRNCPY(line, "public-key:\n", sizeof(line));
12525
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12526
0
            break;
12527
0
        }
12528
0
        if (PrintHexWithColon(out, publicKey,
12529
0
                                publicKeySz, indent + 4, 0/* upper case */)
12530
0
                                                    != WOLFSSL_SUCCESS) {
12531
0
            break;
12532
0
        }
12533
0
        Indent(out, indent);
12534
0
        XSTRNCPY(line, "prime:\n", sizeof(line));
12535
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12536
0
            break;
12537
0
        }
12538
0
        if (PrintHexWithColon(out, prime, primeSz,
12539
0
                                            indent + 4, 0/* upper case */)
12540
0
                != WOLFSSL_SUCCESS) {
12541
0
            break;
12542
0
        }
12543
0
        idx = 0;
12544
0
        XMEMSET(buff, 0, sizeof(buff));
12545
0
        Indent(out, indent);
12546
0
        XSTRNCPY(line, "generator: ", sizeof(line));
12547
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12548
0
            break;
12549
0
        }
12550
0
        if (mp_set_int(a, generator) != 0) {
12551
0
            break;
12552
0
        }
12553
0
        if (mp_todecimal(a, (char*)buff) != 0) {
12554
0
            break;
12555
0
        }
12556
0
        wsz = (int)XSTRLEN((const char*)buff);
12557
0
        if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
12558
0
            break;
12559
0
        }
12560
0
        XSTRNCPY(line, " (0x", sizeof(line));
12561
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12562
0
            break;
12563
0
        }
12564
0
        idx = 0;
12565
0
        XMEMSET(buff, 0, sizeof(buff));
12566
0
        outSz = sizeof(outHex);
12567
0
        if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
12568
0
            break;
12569
0
        }
12570
0
        if (idx + 2 < (int)sizeof(buff) ) {
12571
0
            XMEMCPY(buff + idx, outHex, 2);
12572
0
            idx += 2;
12573
0
        }
12574
0
        if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
12575
0
            break;
12576
0
        }
12577
0
        XSTRNCPY(line, ")\n", sizeof(line));
12578
0
        if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
12579
0
            break;
12580
0
        }
12581
12582
0
        res = WOLFSSL_SUCCESS;
12583
0
    } while (0);
12584
12585
0
    mp_free(a);
12586
0
    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
12587
0
    return res;
12588
0
}
12589
#endif /* WOLFSSL_DH_EXTRA */
12590
12591
/* wolfSSL_EVP_PKEY_print_public parses the specified key then
12592
 * outputs public key info in human readable format to the specified BIO.
12593
 * White spaces of the same number which 'indent" gives, will be added to
12594
 * each line to output and ignores pctx parameter.
12595
 * Parameters:
12596
 * out     bio to output dump data
12597
 * pkey    buffer holding public key data
12598
 * indent  the number of spaces for indent
12599
 * pctx    context(not used)
12600
 * Returns 1 on success, 0 or negative on error, -2 means specified key
12601
 * algo is not supported.
12602
 * Can handle RSA, ECC, DSA and DH public keys.
12603
 */
12604
int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
12605
    const WOLFSSL_EVP_PKEY* pkey, int indent, WOLFSSL_ASN1_PCTX* pctx)
12606
0
{
12607
0
    int res;
12608
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12609
0
    defined(WOLFSSL_DH_EXTRA)
12610
0
    int keybits;    /* bit length of the key */
12611
0
#endif
12612
12613
0
    WOLFSSL_ENTER("wolfSSL_EVP_PKEY_print_public");
12614
12615
0
    if (pkey == NULL || out == NULL) {
12616
0
        return 0;
12617
0
    }
12618
0
#if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
12619
0
    defined(WOLFSSL_DH_EXTRA)
12620
0
    if (indent < 0) {
12621
0
        indent = 0;
12622
0
    }
12623
0
    if (indent > WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX) {
12624
0
        indent = WOLFSSL_EVP_PKEY_PRINT_INDENT_MAX;
12625
0
    }
12626
0
#endif
12627
12628
0
    switch (pkey->type) {
12629
0
        case WC_EVP_PKEY_RSA:
12630
12631
0
#if !defined(NO_RSA)
12632
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12633
0
            res     = PrintPubKeyRSA(
12634
0
                        out,
12635
0
                        (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
12636
0
                        pkey->pkey_sz,           /* raw pkey size */
12637
0
                        indent,                  /* indent size */
12638
0
                        keybits,                 /* bit length of the key */
12639
0
                        pctx);                   /* not used */
12640
#else
12641
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12642
#endif
12643
0
            break;
12644
12645
0
        case WC_EVP_PKEY_EC:
12646
12647
0
#if defined(HAVE_ECC)
12648
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12649
0
            res     = PrintPubKeyEC(
12650
0
                        out,
12651
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12652
0
                        pkey->pkey_sz,            /* raw pkey size */
12653
0
                        indent,                   /* indent size */
12654
0
                        keybits,                  /* bit length of the key */
12655
0
                        pctx);                    /* not used */
12656
#else
12657
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12658
#endif
12659
0
            break;
12660
12661
0
        case WC_EVP_PKEY_DSA:
12662
12663
#if !defined(NO_DSA)
12664
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12665
            res     = PrintPubKeyDSA(
12666
                        out,
12667
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12668
                        pkey->pkey_sz,            /* raw pkey size */
12669
                        indent,                   /* indent size */
12670
                        keybits,                  /* bit length of the key */
12671
                        pctx);                    /* not used */
12672
#else
12673
0
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12674
0
#endif
12675
0
            break;
12676
12677
0
        case WC_EVP_PKEY_DH:
12678
12679
0
#if defined(WOLFSSL_DH_EXTRA)
12680
0
            keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
12681
0
            res     = PrintPubKeyDH(
12682
0
                        out,
12683
0
                        (byte*)(pkey->pkey.ptr),  /* buffer for pkey raw data */
12684
0
                        pkey->pkey_sz,            /* raw pkey size */
12685
0
                        indent,                   /* indent size */
12686
0
                        keybits,                  /* bit length of the key */
12687
0
                        pctx);                    /* not used */
12688
#else
12689
            res = WOLFSSL_UNKNOWN;       /* not supported algo */
12690
#endif
12691
0
            break;
12692
12693
0
        default:
12694
0
            res = WOLFSSL_UNKNOWN;      /* not supported algo */
12695
0
            break;
12696
0
    }
12697
0
    return res;
12698
0
}
12699
#endif /* OPENSSL_EXTRA && !NO_BIO */
12700
12701
int wolfSSL_EVP_get_hashinfo(const WOLFSSL_EVP_MD* evp,
12702
    int* pHash, int* pHashSz)
12703
0
{
12704
0
    enum wc_HashType hash = WC_HASH_TYPE_NONE;
12705
0
    int hashSz;
12706
12707
0
    if (XSTRLEN(evp) < 3) {
12708
        /* do not try comparing strings if size is too small */
12709
0
        return WOLFSSL_FAILURE;
12710
0
    }
12711
12712
0
#ifndef NO_SHA
12713
0
    if ((XSTRCMP("SHA", evp) == 0) || (XSTRCMP(WC_SN_sha1, evp) == 0)) {
12714
0
        hash = WC_HASH_TYPE_SHA;
12715
0
    } else
12716
0
#endif
12717
0
#ifdef WOLFSSL_SHA224
12718
0
    if (XSTRCMP(WC_SN_sha224, evp) == 0) {
12719
0
        hash = WC_HASH_TYPE_SHA224;
12720
0
    } else
12721
0
#endif
12722
0
#ifndef NO_SHA256
12723
0
    if (XSTRCMP(WC_SN_sha256, evp) == 0) {
12724
0
        hash = WC_HASH_TYPE_SHA256;
12725
0
    } else
12726
0
#endif
12727
0
#ifdef WOLFSSL_SHA384
12728
0
    if (XSTRCMP(WC_SN_sha384, evp) == 0) {
12729
0
        hash = WC_HASH_TYPE_SHA384;
12730
0
    } else
12731
0
#endif
12732
0
#ifdef WOLFSSL_SHA512
12733
0
    if (XSTRCMP(WC_SN_sha512, evp) == 0) {
12734
0
        hash = WC_HASH_TYPE_SHA512;
12735
0
    } else
12736
0
#ifndef WOLFSSL_NOSHA512_224
12737
0
    if (XSTRCMP(WC_SN_sha512_224, evp) == 0) {
12738
0
        hash = WC_HASH_TYPE_SHA512_224;
12739
0
    } else
12740
0
#endif
12741
0
#ifndef WOLFSSL_NOSHA512_256
12742
0
    if (XSTRCMP(WC_SN_sha512_256, evp) == 0) {
12743
0
        hash = WC_HASH_TYPE_SHA512_256;
12744
0
    } else
12745
0
#endif
12746
0
#endif
12747
0
#ifdef WOLFSSL_SHA3
12748
0
#ifndef WOLFSSL_NOSHA3_224
12749
0
    if (XSTRCMP(WC_SN_sha3_224, evp) == 0) {
12750
0
        hash = WC_HASH_TYPE_SHA3_224;
12751
0
    } else
12752
0
#endif
12753
0
#ifndef WOLFSSL_NOSHA3_256
12754
0
    if (XSTRCMP(WC_SN_sha3_256, evp) == 0) {
12755
0
        hash = WC_HASH_TYPE_SHA3_256;
12756
0
    } else
12757
0
#endif
12758
0
#ifndef WOLFSSL_NOSHA3_384
12759
0
    if (XSTRCMP(WC_SN_sha3_384, evp) == 0) {
12760
0
        hash = WC_HASH_TYPE_SHA3_384;
12761
0
    } else
12762
0
#endif
12763
0
#ifndef WOLFSSL_NOSHA3_512
12764
0
    if (XSTRCMP(WC_SN_sha3_512, evp) == 0) {
12765
0
        hash = WC_HASH_TYPE_SHA3_512;
12766
0
    } else
12767
0
#endif
12768
0
#endif /* WOLFSSL_SHA3 */
12769
0
#ifdef WOLFSSL_SM3
12770
0
    if (XSTRCMP(WC_SN_sm3, evp) == 0) {
12771
0
        hash = WC_HASH_TYPE_SM3;
12772
0
    } else
12773
0
#endif
12774
0
#ifdef WOLFSSL_MD2
12775
0
    if (XSTRCMP("MD2", evp) == 0) {
12776
0
        hash = WC_HASH_TYPE_MD2;
12777
0
    } else
12778
0
#endif
12779
0
#ifndef NO_MD4
12780
0
    if (XSTRCMP(WC_SN_md4, evp) == 0) {
12781
0
        hash = WC_HASH_TYPE_MD4;
12782
0
    } else
12783
0
#endif
12784
0
#ifndef NO_MD5
12785
0
    if (XSTRCMP(WC_SN_md5, evp) == 0) {
12786
0
        hash = WC_HASH_TYPE_MD5;
12787
0
    } else
12788
0
#endif
12789
0
    {
12790
0
        if (XSTRNCMP("SHA", evp, 3) == 0) {
12791
0
            WOLFSSL_MSG("Unknown SHA hash");
12792
0
        }
12793
0
        return WOLFSSL_FAILURE;
12794
0
    }
12795
12796
0
    if (pHash)
12797
0
        *pHash = hash;
12798
12799
0
    hashSz = wc_HashGetDigestSize(hash);
12800
0
    if (pHashSz)
12801
0
        *pHashSz = hashSz;
12802
12803
0
    if (hashSz < 0) {
12804
0
        return WOLFSSL_FAILURE;
12805
0
    }
12806
12807
0
    return WOLFSSL_SUCCESS;
12808
0
}
12809
12810
/* Base64 encoding APIs */
12811
#if defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)
12812
12813
/*  wolfSSL_EVP_ENCODE_CTX_new allocates WOLFSSL_EVP_ENCODE_CTX
12814
 *  Returns WOLFSSL_EVP_ENCODE_CTX structure on success, NULL on failure.
12815
 */
12816
struct WOLFSSL_EVP_ENCODE_CTX* wolfSSL_EVP_ENCODE_CTX_new(void)
12817
0
{
12818
0
    WOLFSSL_EVP_ENCODE_CTX* ctx = NULL;
12819
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_new");
12820
0
    ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_ENCODE_CTX),
12821
0
             NULL, DYNAMIC_TYPE_OPENSSL );
12822
12823
0
    if (ctx != NULL) {
12824
0
        XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_ENCODE_CTX) );
12825
0
        ctx->heap = NULL;
12826
0
        return ctx;
12827
0
    }
12828
0
    return NULL;
12829
0
}
12830
/*  wolfSSL_EVP_ENCODE_CTX_free frees specified WOLFSSL_EVP_ENCODE_CTX struct.
12831
 */
12832
void wolfSSL_EVP_ENCODE_CTX_free(WOLFSSL_EVP_ENCODE_CTX* ctx)
12833
0
{
12834
0
    WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_free");
12835
0
    if (ctx != NULL) {
12836
0
        XFREE(ctx, ctx->heap, DYNAMIC_TYPE_OPENSSL);
12837
0
    }
12838
0
}
12839
#endif /* WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE */
12840
#if defined(WOLFSSL_BASE64_ENCODE)
12841
12842
/* Assume that out has enough space */
12843
int wolfSSL_EVP_EncodeBlock(unsigned char *out, const unsigned char *in,
12844
                            int inLen)
12845
0
{
12846
0
    word32 ret = (word32)-1;
12847
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeBlock");
12848
12849
0
    if (out == NULL || in == NULL)
12850
0
        return WOLFSSL_FATAL_ERROR;
12851
12852
0
    if (Base64_Encode_NoNl(in, (word32)inLen, out, &ret) == 0)
12853
0
        return (int)ret;
12854
0
    else
12855
0
        return WOLFSSL_FATAL_ERROR;
12856
0
}
12857
12858
/* Assume that out has enough space */
12859
int wolfSSL_EVP_DecodeBlock(unsigned char *out, const unsigned char *in,
12860
                            int inLen)
12861
0
{
12862
0
    word32 ret = (word32)-1;
12863
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeBlock");
12864
12865
0
    if (out == NULL || in == NULL)
12866
0
        return WOLFSSL_FATAL_ERROR;
12867
12868
0
    if (Base64_Decode(in, (word32)inLen, out, &ret) == 0)
12869
0
        return (int)ret;
12870
0
    else
12871
0
        return WOLFSSL_FATAL_ERROR;
12872
12873
0
}
12874
12875
/*  wolfSSL_EVP_EncodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX object
12876
 *  for the subsequent wolfSSL_EVP_EncodeUpdate.
12877
 */
12878
void wolfSSL_EVP_EncodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
12879
0
{
12880
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeInit");
12881
12882
    /* clean up ctx */
12883
0
    if (ctx != NULL) {
12884
0
        ctx->remaining = 0;
12885
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12886
0
    }
12887
0
}
12888
/*  wolfSSL_EVP_EncodeUpdate encodes the input data in 48-byte units
12889
 *  and outputs it to out. If less than 48 bytes of data remain, save it in
12890
 *  ctx. The data given in the subsequent wolfSSL_EVP_EncodeUpdate
12891
 *  is combined with the data stored in CTX and used for encoding.
12892
 *  Returns 1 on success, 0 on error.
12893
 */
12894
int  wolfSSL_EVP_EncodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
12895
            unsigned char* out, int* outl, const unsigned char* in, int inl)
12896
0
{
12897
0
    int res;
12898
0
    word32 outsz = 0;
12899
12900
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeUpdate");
12901
12902
0
    if (ctx == NULL || out == NULL || in == NULL || outl == NULL)
12903
0
        return 0;
12904
12905
0
    *outl = 0;
12906
12907
    /* if the remaining data exists in the ctx, add input data to them
12908
     * to create a block(48bytes) for encoding
12909
     */
12910
0
    if (ctx->remaining > 0 && inl > 0) {
12911
0
        int cpysz = (int)min(
12912
0
            (word32)(BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
12913
0
        XMEMCPY(ctx->data + ctx->remaining, in, (size_t)cpysz);
12914
0
        ctx->remaining += cpysz;
12915
0
        in             += cpysz;
12916
0
        inl            -= cpysz;
12917
12918
        /* check if a block for encoding exists in ctx.data, if so encode it */
12919
0
        if (ctx->remaining >= BASE64_ENCODE_BLOCK_SIZE) {
12920
            /* Base64_Encode asks the out buff size via the 4th param*/
12921
0
            outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;
12922
0
            res = Base64_Encode(ctx->data, BASE64_ENCODE_BLOCK_SIZE, out,
12923
0
                &outsz);
12924
0
            if (res == 0) {
12925
0
                ctx->remaining = 0;
12926
0
                *outl = (int)outsz;
12927
0
            }
12928
0
            else
12929
0
                return 0;   /* return with error */
12930
0
        }
12931
0
        else {
12932
            /* could not create a block */
12933
0
            *outl = 0;
12934
0
            return  1;
12935
0
        }
12936
0
    }
12937
    /* Here, there is no data left in ctx, so try processing the data of
12938
     * the specified input data.
12939
     */
12940
12941
0
    while (inl >= BASE64_ENCODE_BLOCK_SIZE) {
12942
0
        outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;/* 64 byte and one for LF*/
12943
0
        res = Base64_Encode(in, BASE64_ENCODE_BLOCK_SIZE,out,&outsz);
12944
0
        if (res == 0) {
12945
0
            in    += BASE64_ENCODE_BLOCK_SIZE;
12946
0
            inl   -= BASE64_ENCODE_BLOCK_SIZE;
12947
0
            out   += outsz;
12948
0
            *outl += (int)outsz;
12949
0
        }
12950
0
        else {
12951
0
            *outl = 0;
12952
0
            return  0;
12953
0
        }
12954
0
    }
12955
12956
    /* if remaining data exists, copy them into ctx for the next call*/
12957
0
    if (inl > 0) {
12958
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
12959
0
        XMEMCPY(ctx->data, in, (size_t)inl);
12960
0
        ctx->remaining = inl;
12961
0
    }
12962
12963
0
    return 1;   /* returns 1 on success, 0 on error */
12964
0
}
12965
/*  wolfSSL_EVP_EncodeFinal encodes data in ctx and outputs to out.
12966
 */
12967
void wolfSSL_EVP_EncodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
12968
                unsigned char* out, int* outl)
12969
0
{
12970
0
    word32 outsz = 0;
12971
0
    int res;
12972
12973
0
    WOLFSSL_ENTER("wolfSSL_EVP_EncodeFinal");
12974
12975
0
    if (outl == NULL)
12976
0
        return;
12977
12978
0
    if (ctx == NULL || out == NULL) {
12979
0
        *outl = 0;
12980
0
        return;
12981
0
    }
12982
0
    if (ctx->remaining >= BASE64_ENCODE_RESULT_BLOCK_SIZE) {
12983
0
        *outl = 0;
12984
0
        return;
12985
0
    }
12986
    /* process remaining data in ctx */
12987
0
    outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; /* 64 byte and one for LF*/
12988
0
    res = Base64_Encode(ctx->data, (word32)ctx->remaining, out, &outsz);
12989
0
    if (res == 0)
12990
0
        *outl = (int)outsz;
12991
0
    else
12992
0
        *outl = 0;
12993
12994
0
    ctx->remaining = 0;
12995
0
    XMEMSET(ctx->data, 0, sizeof(ctx->data));
12996
12997
0
    return;
12998
0
}
12999
#endif /* WOLFSSL_BASE64_ENCODE */
13000
#if defined(WOLFSSL_BASE64_DECODE)
13001
13002
/*  wolfSSL_EVP_DecodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX struct
13003
 *  for subsequent wolfSSL_EVP_DecodeUpdate.
13004
 */
13005
void wolfSSL_EVP_DecodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
13006
0
{
13007
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeInit");
13008
    /* clean up ctx */
13009
0
    if (ctx != NULL) {
13010
0
        ctx->remaining = 0;
13011
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
13012
0
    }
13013
0
}
13014
/*  wolfSSL_EVP_DecodeUpdate encodes the input data in 4-byte units
13015
 *  and outputs it to out. If less than 4 bytes of data remain, save it in
13016
 *  ctx. The data given in the subsequent wolfSSL_EVP_DecodeUpdate
13017
 *  is combined with the data stored in CTX and used for decoding.
13018
 *  Returns 1 or 0 on success, -1 on error. Return value 0 indicates that
13019
 *  clients should call wolfSSL_EVP_DecodeFinal as next call.
13020
 */
13021
int  wolfSSL_EVP_DecodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
13022
            unsigned char* out, int* outl, const unsigned char* in, int inl)
13023
0
{
13024
0
    word32 outsz = 0;
13025
0
    word32 j = 0;
13026
0
    word32 inLen;
13027
0
    int    res;
13028
0
    int    pad = 0;
13029
0
    int    i;
13030
0
    unsigned char c;
13031
0
    int pad3 = 0;
13032
0
    int pad4 = 0;
13033
0
    byte e[4];
13034
13035
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeUpdate");
13036
13037
0
    if (outl == NULL)
13038
0
        return -1;
13039
13040
0
    if (ctx == NULL || out == NULL || in == NULL) {
13041
0
        *outl = 0;
13042
0
        return -1;
13043
0
    }
13044
13045
0
    if (inl == 0) {
13046
0
        *outl = 0;
13047
0
        return 1;
13048
0
    }
13049
13050
0
    inLen = (word32)inl;
13051
0
    *outl = 0;
13052
13053
    /* if the remaining data exist in the ctx, add input data to them to create
13054
    a block(4bytes) for decoding*/
13055
0
    if (ctx->remaining > 0 && inl > 0) {
13056
13057
0
        int cpySz = (int)min(
13058
0
            (word32)(BASE64_DECODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
13059
13060
0
        for ( i = 0; cpySz > 0 && inLen > 0; i++) {
13061
0
            if (Base64_SkipNewline(in, &inLen, &j) == WC_NO_ERR_TRACE(ASN_INPUT_E)) {
13062
0
                return -1;  /* detected an illegal char in input */
13063
0
            }
13064
0
            c = in[j++];
13065
13066
0
            if (c == '=')
13067
0
                pad = 1;
13068
13069
0
            *(ctx->data + ctx->remaining + i) = c;
13070
0
            inLen--;
13071
0
            cpySz--;
13072
0
        }
13073
13074
0
        outsz = sizeof(ctx->data);
13075
0
        res = Base64_Decode( ctx->data, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
13076
0
        if (res == 0) {
13077
0
            *outl += (int)outsz;
13078
0
            out   += outsz;
13079
13080
0
            ctx->remaining = 0;
13081
0
            XMEMSET(ctx->data, 0, sizeof(ctx->data));
13082
0
        }
13083
0
        else {
13084
0
            *outl = 0;
13085
0
            return -1;   /* return with error */
13086
0
        }
13087
0
    }
13088
13089
    /* Base64_Decode is not a streaming process, so it processes
13090
     * the input data and exits. If a line break or whitespace
13091
     * character is found in the input data, it will be skipped,
13092
     * but if the end point of the input data is reached as a result,
13093
     * Base64_Decode will stop processing there. The data cleansing is
13094
     * required before Base64_Decode so that the processing does not
13095
     * stop within 4 bytes, which is the unit of Base64 decoding processing.
13096
     * The logic that exists before calling Base64_Decode in a While Loop is
13097
     * a data cleansing process that removes line breaks and whitespace.
13098
     */
13099
0
    while (inLen > 3) {
13100
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13101
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13102
0
                break;
13103
0
            }
13104
0
            else {
13105
0
                *outl = 0;
13106
0
                return -1;
13107
0
            }
13108
0
        }
13109
0
        e[0] = in[j++];
13110
0
        if (e[0] == '\0') {
13111
0
            break;
13112
0
        }
13113
0
        inLen--;
13114
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13115
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13116
0
                break;
13117
0
            }
13118
0
            else {
13119
0
                *outl = 0;
13120
0
                return -1;
13121
0
            }
13122
0
        }
13123
0
        e[1] = in[j++];
13124
0
        inLen--;
13125
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13126
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13127
0
                break;
13128
0
            }
13129
0
            else {
13130
0
                *outl = 0;
13131
0
                return -1;
13132
0
            }
13133
0
        }
13134
0
        e[2] = in[j++];
13135
0
        inLen--;
13136
0
        if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
13137
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13138
0
                break;
13139
0
            }
13140
0
            else {
13141
0
                *outl = 0;
13142
0
                return -1;
13143
0
            }
13144
0
        }
13145
0
        e[3] = in[j++];
13146
0
        inLen--;
13147
13148
0
        if (e[0] == '=')
13149
0
            pad = 1;
13150
0
        if (e[1] == '=')
13151
0
            pad = 1;
13152
0
        if (e[2] == '=') {
13153
0
            pad = 1;
13154
0
            pad3 = 1;
13155
0
        }
13156
0
        if (e[3] == '=') {
13157
0
            pad = 1;
13158
0
            pad4 = 1;
13159
0
        }
13160
0
        if (pad3 && !pad4) {
13161
0
            *outl = 0;
13162
0
            return -1;
13163
0
        }
13164
13165
        /* decode four bytes */
13166
0
        outsz = sizeof(ctx->data);
13167
0
        res = Base64_Decode( e, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
13168
0
        if (res < 0) {
13169
0
            *outl = 0;
13170
0
            return -1;
13171
0
        }
13172
13173
0
        *outl += (int)outsz;
13174
0
        out   += outsz;
13175
0
    }
13176
    /* copy left data to ctx */
13177
0
    if (inLen > 0) {
13178
13179
0
        XMEMSET(ctx->data, 0, sizeof(ctx->data));
13180
13181
0
        i = 0;
13182
0
        while (inLen > 0) {
13183
0
            c = in[j++];
13184
0
            if (c== '\n' || c == '\r' || c == ' ') {
13185
0
                inLen--;
13186
0
                continue;
13187
0
            }
13188
0
            if (c == '=') {
13189
0
                pad = 1;
13190
0
            }
13191
0
            ctx->data[i++] = c;
13192
0
            ctx->remaining++;
13193
0
            inLen--;
13194
0
        }
13195
13196
0
        if (pad)
13197
0
            return 0;   /* indicates that clients should call DecodeFinal */
13198
0
        else
13199
0
            return 1;
13200
13201
0
    }
13202
    /* If the last data is '\n', remove it */
13203
0
    if (j > 0) {
13204
0
        c = in[j - 1];
13205
0
        if (c == '\n' && (j > 1)) {
13206
0
            c = (in[j - 2]);
13207
0
            if (c == '=')
13208
0
                return 0;
13209
0
            else
13210
0
                return 1;
13211
0
        } else if (c == '\n') {
13212
0
            return 1;
13213
0
        }
13214
0
        if (c == '=')
13215
0
            return 0;
13216
0
        else
13217
0
            return 1;
13218
0
    }
13219
13220
    /* j == 0 */
13221
0
    return 1;
13222
0
}
13223
/*  wolfSSL_EVP_DecodeFinal decode remaining data in ctx
13224
 *  to outputs to out.
13225
 *  Returns 1 on success, -1 on failure.
13226
 */
13227
int  wolfSSL_EVP_DecodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
13228
                unsigned char* out, int* outl)
13229
0
{
13230
0
    word32 outsz = 0;
13231
0
    word32 inLen;
13232
0
    word32 j = 0;
13233
13234
0
    WOLFSSL_ENTER("wolfSSL_EVP_DecodeFinal");
13235
13236
0
    if (outl == NULL)
13237
0
        return -1;
13238
13239
0
    if (ctx == NULL || out == NULL ) {
13240
0
        *outl = 0;
13241
0
        return -1;
13242
0
    }
13243
13244
0
    if (ctx->remaining > 0) {
13245
0
        int res;
13246
13247
0
        inLen = (word32)ctx->remaining;
13248
0
        if ((res = Base64_SkipNewline(ctx->data, &inLen, &j)) != 0) {
13249
0
            *outl = 0;
13250
0
            if (res == WC_NO_ERR_TRACE(BUFFER_E)) {
13251
                /* means no valid data to decode in buffer */
13252
0
                return  1; /* returns as success with no output */
13253
0
            }
13254
0
            else
13255
0
                return -1;
13256
0
        }
13257
13258
13259
0
        outsz = (word32)ctx->remaining;
13260
0
        res = Base64_Decode(ctx->data, (word32)ctx->remaining, out, &outsz);
13261
0
        if (res == 0) {
13262
0
            *outl = (int)outsz;
13263
0
            return 1;
13264
0
        }
13265
0
        else {
13266
0
            *outl = 0;
13267
0
            return -1;
13268
0
        }
13269
0
    }
13270
0
    else {
13271
0
        *outl = 0;
13272
0
        return 1;
13273
0
    }
13274
0
}
13275
#endif /* WOLFSSL_BASE64_DECODE */
13276
13277
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
13278
13279
#endif /* WOLFSSL_EVP_INCLUDED */