Coverage Report

Created: 2022-11-30 06:20

/src/openssl/crypto/evp/evp_enc.c
Line
Count
Source (jump to first uncovered line)
1
/* crypto/evp/evp_enc.c */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3
 * All rights reserved.
4
 *
5
 * This package is an SSL implementation written
6
 * by Eric Young (eay@cryptsoft.com).
7
 * The implementation was written so as to conform with Netscapes SSL.
8
 *
9
 * This library is free for commercial and non-commercial use as long as
10
 * the following conditions are aheared to.  The following conditions
11
 * apply to all code found in this distribution, be it the RC4, RSA,
12
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13
 * included with this distribution is covered by the same copyright terms
14
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
 *
16
 * Copyright remains Eric Young's, and as such any Copyright notices in
17
 * the code are not to be removed.
18
 * If this package is used in a product, Eric Young should be given attribution
19
 * as the author of the parts of the library used.
20
 * This can be in the form of a textual message at program startup or
21
 * in documentation (online or textual) provided with the package.
22
 *
23
 * Redistribution and use in source and binary forms, with or without
24
 * modification, are permitted provided that the following conditions
25
 * are met:
26
 * 1. Redistributions of source code must retain the copyright
27
 *    notice, this list of conditions and the following disclaimer.
28
 * 2. Redistributions in binary form must reproduce the above copyright
29
 *    notice, this list of conditions and the following disclaimer in the
30
 *    documentation and/or other materials provided with the distribution.
31
 * 3. All advertising materials mentioning features or use of this software
32
 *    must display the following acknowledgement:
33
 *    "This product includes cryptographic software written by
34
 *     Eric Young (eay@cryptsoft.com)"
35
 *    The word 'cryptographic' can be left out if the rouines from the library
36
 *    being used are not cryptographic related :-).
37
 * 4. If you include any Windows specific code (or a derivative thereof) from
38
 *    the apps directory (application code) you must include an acknowledgement:
39
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
 *
41
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
 * SUCH DAMAGE.
52
 *
53
 * The licence and distribution terms for any publically available version or
54
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55
 * copied and put under another distribution licence
56
 * [including the GNU Public Licence.]
57
 */
58
59
#include <stdio.h>
60
#include "cryptlib.h"
61
#include <openssl/evp.h>
62
#include <openssl/err.h>
63
#include <openssl/rand.h>
64
#ifndef OPENSSL_NO_ENGINE
65
# include <openssl/engine.h>
66
#endif
67
#ifdef OPENSSL_FIPS
68
# include <openssl/fips.h>
69
#endif
70
#include "evp_locl.h"
71
72
#ifdef OPENSSL_FIPS
73
# define M_do_cipher(ctx, out, in, inl) FIPS_cipher(ctx, out, in, inl)
74
#else
75
0
# define M_do_cipher(ctx, out, in, inl) ctx->cipher->do_cipher(ctx, out, in, inl)
76
#endif
77
78
const char EVP_version[] = "EVP" OPENSSL_VERSION_PTEXT;
79
80
void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
81
0
{
82
0
    memset(ctx, 0, sizeof(EVP_CIPHER_CTX));
83
    /* ctx->cipher=NULL; */
84
0
}
85
86
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
87
0
{
88
0
    EVP_CIPHER_CTX *ctx = OPENSSL_malloc(sizeof *ctx);
89
0
    if (ctx)
90
0
        EVP_CIPHER_CTX_init(ctx);
91
0
    return ctx;
92
0
}
93
94
int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
95
                   const unsigned char *key, const unsigned char *iv, int enc)
96
0
{
97
0
    if (cipher)
98
0
        EVP_CIPHER_CTX_init(ctx);
99
0
    return EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc);
100
0
}
101
102
int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
103
                      ENGINE *impl, const unsigned char *key,
104
                      const unsigned char *iv, int enc)
105
0
{
106
0
    if (enc == -1)
107
0
        enc = ctx->encrypt;
108
0
    else {
109
0
        if (enc)
110
0
            enc = 1;
111
0
        ctx->encrypt = enc;
112
0
    }
113
0
#ifndef OPENSSL_NO_ENGINE
114
    /*
115
     * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so
116
     * this context may already have an ENGINE! Try to avoid releasing the
117
     * previous handle, re-querying for an ENGINE, and having a
118
     * reinitialisation, when it may all be unecessary.
119
     */
120
0
    if (ctx->engine && ctx->cipher && (!cipher ||
121
0
                                       (cipher
122
0
                                        && (cipher->nid ==
123
0
                                            ctx->cipher->nid))))
124
0
        goto skip_to_init;
125
0
#endif
126
0
    if (cipher) {
127
        /*
128
         * Ensure a context left lying around from last time is cleared (the
129
         * previous check attempted to avoid this if the same ENGINE and
130
         * EVP_CIPHER could be used).
131
         */
132
0
        if (ctx->cipher) {
133
0
            unsigned long flags = ctx->flags;
134
0
            EVP_CIPHER_CTX_cleanup(ctx);
135
            /* Restore encrypt and flags */
136
0
            ctx->encrypt = enc;
137
0
            ctx->flags = flags;
138
0
        }
139
0
#ifndef OPENSSL_NO_ENGINE
140
0
        if (impl) {
141
0
            if (!ENGINE_init(impl)) {
142
0
                EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
143
0
                return 0;
144
0
            }
145
0
        } else
146
            /* Ask if an ENGINE is reserved for this job */
147
0
            impl = ENGINE_get_cipher_engine(cipher->nid);
148
0
        if (impl) {
149
            /* There's an ENGINE for this job ... (apparently) */
150
0
            const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
151
0
            if (!c) {
152
                /*
153
                 * One positive side-effect of US's export control history,
154
                 * is that we should at least be able to avoid using US
155
                 * mispellings of "initialisation"?
156
                 */
157
0
                EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
158
0
                return 0;
159
0
            }
160
            /* We'll use the ENGINE's private cipher definition */
161
0
            cipher = c;
162
            /*
163
             * Store the ENGINE functional reference so we know 'cipher' came
164
             * from an ENGINE and we need to release it when done.
165
             */
166
0
            ctx->engine = impl;
167
0
        } else
168
0
            ctx->engine = NULL;
169
0
#endif
170
171
#ifdef OPENSSL_FIPS
172
        if (FIPS_mode()) {
173
            const EVP_CIPHER *fcipher = NULL;
174
            if (cipher)
175
                fcipher = evp_get_fips_cipher(cipher);
176
            if (fcipher)
177
                cipher = fcipher;
178
            return FIPS_cipherinit(ctx, cipher, key, iv, enc);
179
        }
180
#endif
181
0
        ctx->cipher = cipher;
182
0
        if (ctx->cipher->ctx_size) {
183
0
            ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size);
184
0
            if (!ctx->cipher_data) {
185
0
                ctx->cipher = NULL;
186
0
                EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
187
0
                return 0;
188
0
            }
189
0
        } else {
190
0
            ctx->cipher_data = NULL;
191
0
        }
192
0
        ctx->key_len = cipher->key_len;
193
        /* Preserve wrap enable flag, zero everything else */
194
0
        ctx->flags &= EVP_CIPHER_CTX_FLAG_WRAP_ALLOW;
195
0
        if (ctx->cipher->flags & EVP_CIPH_CTRL_INIT) {
196
0
            if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) {
197
0
                ctx->cipher = NULL;
198
0
                EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
199
0
                return 0;
200
0
            }
201
0
        }
202
0
    } else if (!ctx->cipher) {
203
0
        EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
204
0
        return 0;
205
0
    }
206
0
#ifndef OPENSSL_NO_ENGINE
207
0
 skip_to_init:
208
0
#endif
209
#ifdef OPENSSL_FIPS
210
    if (FIPS_mode())
211
        return FIPS_cipherinit(ctx, cipher, key, iv, enc);
212
#endif
213
    /* we assume block size is a power of 2 in *cryptUpdate */
214
0
    OPENSSL_assert(ctx->cipher->block_size == 1
215
0
                   || ctx->cipher->block_size == 8
216
0
                   || ctx->cipher->block_size == 16);
217
218
0
    if (!(ctx->flags & EVP_CIPHER_CTX_FLAG_WRAP_ALLOW)
219
0
        && EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_WRAP_MODE) {
220
0
        EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_WRAP_MODE_NOT_ALLOWED);
221
0
        return 0;
222
0
    }
223
224
0
    if (!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
225
0
        switch (EVP_CIPHER_CTX_mode(ctx)) {
226
227
0
        case EVP_CIPH_STREAM_CIPHER:
228
0
        case EVP_CIPH_ECB_MODE:
229
0
            break;
230
231
0
        case EVP_CIPH_CFB_MODE:
232
0
        case EVP_CIPH_OFB_MODE:
233
234
0
            ctx->num = 0;
235
            /* fall-through */
236
237
0
        case EVP_CIPH_CBC_MODE:
238
239
0
            OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
240
0
                           (int)sizeof(ctx->iv));
241
0
            if (iv)
242
0
                memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
243
0
            memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
244
0
            break;
245
246
0
        case EVP_CIPH_CTR_MODE:
247
0
            ctx->num = 0;
248
            /* Don't reuse IV for CTR mode */
249
0
            if (iv)
250
0
                memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
251
0
            break;
252
253
0
        default:
254
0
            return 0;
255
0
            break;
256
0
        }
257
0
    }
258
259
0
    if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
260
0
        if (!ctx->cipher->init(ctx, key, iv, enc))
261
0
            return 0;
262
0
    }
263
0
    ctx->buf_len = 0;
264
0
    ctx->final_used = 0;
265
0
    ctx->block_mask = ctx->cipher->block_size - 1;
266
0
    return 1;
267
0
}
268
269
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
270
                     const unsigned char *in, int inl)
271
0
{
272
0
    if (ctx->encrypt)
273
0
        return EVP_EncryptUpdate(ctx, out, outl, in, inl);
274
0
    else
275
0
        return EVP_DecryptUpdate(ctx, out, outl, in, inl);
276
0
}
277
278
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
279
0
{
280
0
    if (ctx->encrypt)
281
0
        return EVP_EncryptFinal_ex(ctx, out, outl);
282
0
    else
283
0
        return EVP_DecryptFinal_ex(ctx, out, outl);
284
0
}
285
286
int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
287
0
{
288
0
    if (ctx->encrypt)
289
0
        return EVP_EncryptFinal(ctx, out, outl);
290
0
    else
291
0
        return EVP_DecryptFinal(ctx, out, outl);
292
0
}
293
294
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
295
                    const unsigned char *key, const unsigned char *iv)
296
0
{
297
0
    return EVP_CipherInit(ctx, cipher, key, iv, 1);
298
0
}
299
300
int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
301
                       ENGINE *impl, const unsigned char *key,
302
                       const unsigned char *iv)
303
0
{
304
0
    return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
305
0
}
306
307
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
308
                    const unsigned char *key, const unsigned char *iv)
309
0
{
310
0
    return EVP_CipherInit(ctx, cipher, key, iv, 0);
311
0
}
312
313
int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
314
                       ENGINE *impl, const unsigned char *key,
315
                       const unsigned char *iv)
316
0
{
317
0
    return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
318
0
}
319
320
int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
321
                      const unsigned char *in, int inl)
322
0
{
323
0
    int i, j, bl;
324
325
0
    if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
326
0
        i = M_do_cipher(ctx, out, in, inl);
327
0
        if (i < 0)
328
0
            return 0;
329
0
        else
330
0
            *outl = i;
331
0
        return 1;
332
0
    }
333
334
0
    if (inl <= 0) {
335
0
        *outl = 0;
336
0
        return inl == 0;
337
0
    }
338
339
0
    if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) {
340
0
        if (M_do_cipher(ctx, out, in, inl)) {
341
0
            *outl = inl;
342
0
            return 1;
343
0
        } else {
344
0
            *outl = 0;
345
0
            return 0;
346
0
        }
347
0
    }
348
0
    i = ctx->buf_len;
349
0
    bl = ctx->cipher->block_size;
350
0
    OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
351
0
    if (i != 0) {
352
0
        if (bl - i > inl) {
353
0
            memcpy(&(ctx->buf[i]), in, inl);
354
0
            ctx->buf_len += inl;
355
0
            *outl = 0;
356
0
            return 1;
357
0
        } else {
358
0
            j = bl - i;
359
0
            memcpy(&(ctx->buf[i]), in, j);
360
0
            if (!M_do_cipher(ctx, out, ctx->buf, bl))
361
0
                return 0;
362
0
            inl -= j;
363
0
            in += j;
364
0
            out += bl;
365
0
            *outl = bl;
366
0
        }
367
0
    } else
368
0
        *outl = 0;
369
0
    i = inl & (bl - 1);
370
0
    inl -= i;
371
0
    if (inl > 0) {
372
0
        if (!M_do_cipher(ctx, out, in, inl))
373
0
            return 0;
374
0
        *outl += inl;
375
0
    }
376
377
0
    if (i != 0)
378
0
        memcpy(ctx->buf, &(in[inl]), i);
379
0
    ctx->buf_len = i;
380
0
    return 1;
381
0
}
382
383
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
384
0
{
385
0
    int ret;
386
0
    ret = EVP_EncryptFinal_ex(ctx, out, outl);
387
0
    return ret;
388
0
}
389
390
int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
391
0
{
392
0
    int n, ret;
393
0
    unsigned int i, b, bl;
394
395
0
    if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
396
0
        ret = M_do_cipher(ctx, out, NULL, 0);
397
0
        if (ret < 0)
398
0
            return 0;
399
0
        else
400
0
            *outl = ret;
401
0
        return 1;
402
0
    }
403
404
0
    b = ctx->cipher->block_size;
405
0
    OPENSSL_assert(b <= sizeof ctx->buf);
406
0
    if (b == 1) {
407
0
        *outl = 0;
408
0
        return 1;
409
0
    }
410
0
    bl = ctx->buf_len;
411
0
    if (ctx->flags & EVP_CIPH_NO_PADDING) {
412
0
        if (bl) {
413
0
            EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,
414
0
                   EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
415
0
            return 0;
416
0
        }
417
0
        *outl = 0;
418
0
        return 1;
419
0
    }
420
421
0
    n = b - bl;
422
0
    for (i = bl; i < b; i++)
423
0
        ctx->buf[i] = n;
424
0
    ret = M_do_cipher(ctx, out, ctx->buf, b);
425
426
0
    if (ret)
427
0
        *outl = b;
428
429
0
    return ret;
430
0
}
431
432
int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
433
                      const unsigned char *in, int inl)
434
0
{
435
0
    int fix_len;
436
0
    unsigned int b;
437
438
0
    if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
439
0
        fix_len = M_do_cipher(ctx, out, in, inl);
440
0
        if (fix_len < 0) {
441
0
            *outl = 0;
442
0
            return 0;
443
0
        } else
444
0
            *outl = fix_len;
445
0
        return 1;
446
0
    }
447
448
0
    if (inl <= 0) {
449
0
        *outl = 0;
450
0
        return inl == 0;
451
0
    }
452
453
0
    if (ctx->flags & EVP_CIPH_NO_PADDING)
454
0
        return EVP_EncryptUpdate(ctx, out, outl, in, inl);
455
456
0
    b = ctx->cipher->block_size;
457
0
    OPENSSL_assert(b <= sizeof ctx->final);
458
459
0
    if (ctx->final_used) {
460
0
        memcpy(out, ctx->final, b);
461
0
        out += b;
462
0
        fix_len = 1;
463
0
    } else
464
0
        fix_len = 0;
465
466
0
    if (!EVP_EncryptUpdate(ctx, out, outl, in, inl))
467
0
        return 0;
468
469
    /*
470
     * if we have 'decrypted' a multiple of block size, make sure we have a
471
     * copy of this last block
472
     */
473
0
    if (b > 1 && !ctx->buf_len) {
474
0
        *outl -= b;
475
0
        ctx->final_used = 1;
476
0
        memcpy(ctx->final, &out[*outl], b);
477
0
    } else
478
0
        ctx->final_used = 0;
479
480
0
    if (fix_len)
481
0
        *outl += b;
482
483
0
    return 1;
484
0
}
485
486
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
487
0
{
488
0
    int ret;
489
0
    ret = EVP_DecryptFinal_ex(ctx, out, outl);
490
0
    return ret;
491
0
}
492
493
int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
494
0
{
495
0
    int i, n;
496
0
    unsigned int b;
497
0
    *outl = 0;
498
499
0
    if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
500
0
        i = M_do_cipher(ctx, out, NULL, 0);
501
0
        if (i < 0)
502
0
            return 0;
503
0
        else
504
0
            *outl = i;
505
0
        return 1;
506
0
    }
507
508
0
    b = ctx->cipher->block_size;
509
0
    if (ctx->flags & EVP_CIPH_NO_PADDING) {
510
0
        if (ctx->buf_len) {
511
0
            EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,
512
0
                   EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
513
0
            return 0;
514
0
        }
515
0
        *outl = 0;
516
0
        return 1;
517
0
    }
518
0
    if (b > 1) {
519
0
        if (ctx->buf_len || !ctx->final_used) {
520
0
            EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_WRONG_FINAL_BLOCK_LENGTH);
521
0
            return (0);
522
0
        }
523
0
        OPENSSL_assert(b <= sizeof ctx->final);
524
525
        /*
526
         * The following assumes that the ciphertext has been authenticated.
527
         * Otherwise it provides a padding oracle.
528
         */
529
0
        n = ctx->final[b - 1];
530
0
        if (n == 0 || n > (int)b) {
531
0
            EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
532
0
            return (0);
533
0
        }
534
0
        for (i = 0; i < n; i++) {
535
0
            if (ctx->final[--b] != n) {
536
0
                EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
537
0
                return (0);
538
0
            }
539
0
        }
540
0
        n = ctx->cipher->block_size - n;
541
0
        for (i = 0; i < n; i++)
542
0
            out[i] = ctx->final[i];
543
0
        *outl = n;
544
0
    } else
545
0
        *outl = 0;
546
0
    return (1);
547
0
}
548
549
void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
550
0
{
551
0
    if (ctx) {
552
0
        EVP_CIPHER_CTX_cleanup(ctx);
553
0
        OPENSSL_free(ctx);
554
0
    }
555
0
}
556
557
int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
558
0
{
559
0
#ifndef OPENSSL_FIPS
560
0
    if (c->cipher != NULL) {
561
0
        if (c->cipher->cleanup && !c->cipher->cleanup(c))
562
0
            return 0;
563
        /* Cleanse cipher context data */
564
0
        if (c->cipher_data)
565
0
            OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
566
0
    }
567
0
    if (c->cipher_data)
568
0
        OPENSSL_free(c->cipher_data);
569
0
#endif
570
0
#ifndef OPENSSL_NO_ENGINE
571
0
    if (c->engine)
572
        /*
573
         * The EVP_CIPHER we used belongs to an ENGINE, release the
574
         * functional reference we held for this reason.
575
         */
576
0
        ENGINE_finish(c->engine);
577
0
#endif
578
#ifdef OPENSSL_FIPS
579
    FIPS_cipher_ctx_cleanup(c);
580
#endif
581
0
    memset(c, 0, sizeof(EVP_CIPHER_CTX));
582
0
    return 1;
583
0
}
584
585
int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
586
0
{
587
0
    if (c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
588
0
        return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
589
0
    if (c->key_len == keylen)
590
0
        return 1;
591
0
    if ((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH)) {
592
0
        c->key_len = keylen;
593
0
        return 1;
594
0
    }
595
0
    EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH, EVP_R_INVALID_KEY_LENGTH);
596
0
    return 0;
597
0
}
598
599
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
600
0
{
601
0
    if (pad)
602
0
        ctx->flags &= ~EVP_CIPH_NO_PADDING;
603
0
    else
604
0
        ctx->flags |= EVP_CIPH_NO_PADDING;
605
0
    return 1;
606
0
}
607
608
int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
609
0
{
610
0
    int ret;
611
0
    if (!ctx->cipher) {
612
0
        EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
613
0
        return 0;
614
0
    }
615
616
0
    if (!ctx->cipher->ctrl) {
617
0
        EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
618
0
        return 0;
619
0
    }
620
621
0
    ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
622
0
    if (ret == -1) {
623
0
        EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL,
624
0
               EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
625
0
        return 0;
626
0
    }
627
0
    return ret;
628
0
}
629
630
int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
631
0
{
632
0
    if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
633
0
        return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
634
0
    if (RAND_bytes(key, ctx->key_len) <= 0)
635
0
        return 0;
636
0
    return 1;
637
0
}
638
639
int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
640
0
{
641
0
    if ((in == NULL) || (in->cipher == NULL)) {
642
0
        EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_INPUT_NOT_INITIALIZED);
643
0
        return 0;
644
0
    }
645
0
#ifndef OPENSSL_NO_ENGINE
646
    /* Make sure it's safe to copy a cipher context using an ENGINE */
647
0
    if (in->engine && !ENGINE_init(in->engine)) {
648
0
        EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_ENGINE_LIB);
649
0
        return 0;
650
0
    }
651
0
#endif
652
653
0
    EVP_CIPHER_CTX_cleanup(out);
654
0
    memcpy(out, in, sizeof *out);
655
656
0
    if (in->cipher_data && in->cipher->ctx_size) {
657
0
        out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
658
0
        if (!out->cipher_data) {
659
0
            out->cipher = NULL;
660
0
            EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_MALLOC_FAILURE);
661
0
            return 0;
662
0
        }
663
0
        memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size);
664
0
    }
665
666
0
    if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
667
0
        if (!in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out)) {
668
0
            out->cipher = NULL;
669
0
            EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_INITIALIZATION_ERROR);
670
0
            return 0;
671
0
        }
672
0
    return 1;
673
0
}