Coverage Report

Created: 2025-06-13 06:55

/src/openssl/crypto/evp/e_idea.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
/*
11
 * IDEA low level APIs are deprecated for public use, but still ok for internal
12
 * use where we're using them to implement the higher level EVP interface, as is
13
 * the case here.
14
 */
15
#include "internal/deprecated.h"
16
17
#include <stdio.h>
18
#include "internal/cryptlib.h"
19
20
#ifndef OPENSSL_NO_IDEA
21
# include <openssl/evp.h>
22
# include <openssl/objects.h>
23
# include "crypto/evp.h"
24
# include <openssl/idea.h>
25
# include "evp_local.h"
26
27
/* Can't use IMPLEMENT_BLOCK_CIPHER because IDEA_ecb_encrypt is different */
28
29
typedef struct {
30
    IDEA_KEY_SCHEDULE ks;
31
} EVP_IDEA_KEY;
32
33
static int idea_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
34
                         const unsigned char *iv, int enc);
35
36
/*
37
 * NB IDEA_ecb_encrypt doesn't take an 'encrypt' argument so we treat it as a
38
 * special case
39
 */
40
41
static int idea_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
42
                           const unsigned char *in, size_t inl)
43
0
{
44
0
    BLOCK_CIPHER_ecb_loop()
45
0
        IDEA_ecb_encrypt(in + i, out + i, &EVP_C_DATA(EVP_IDEA_KEY, ctx)->ks);
46
0
    return 1;
47
0
}
48
49
BLOCK_CIPHER_func_cbc(idea, IDEA, EVP_IDEA_KEY, ks)
50
BLOCK_CIPHER_func_ofb(idea, IDEA, 64, EVP_IDEA_KEY, ks)
51
BLOCK_CIPHER_func_cfb(idea, IDEA, 64, EVP_IDEA_KEY, ks)
52
53
BLOCK_CIPHER_defs(idea, IDEA_KEY_SCHEDULE, NID_idea, 8, 16, 8, 64,
54
                  0, idea_init_key, NULL,
55
                  EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, NULL)
56
57
static int idea_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
58
                         const unsigned char *iv, int enc)
59
0
{
60
0
    if (!enc) {
61
0
        if (EVP_CIPHER_CTX_get_mode(ctx) == EVP_CIPH_OFB_MODE)
62
0
            enc = 1;
63
0
        else if (EVP_CIPHER_CTX_get_mode(ctx) == EVP_CIPH_CFB_MODE)
64
0
            enc = 1;
65
0
    }
66
0
    if (enc)
67
0
        IDEA_set_encrypt_key(key, &EVP_C_DATA(EVP_IDEA_KEY, ctx)->ks);
68
0
    else {
69
0
        IDEA_KEY_SCHEDULE tmp;
70
71
0
        IDEA_set_encrypt_key(key, &tmp);
72
0
        IDEA_set_decrypt_key(&tmp, &EVP_C_DATA(EVP_IDEA_KEY, ctx)->ks);
73
0
        OPENSSL_cleanse((unsigned char *)&tmp, sizeof(IDEA_KEY_SCHEDULE));
74
0
    }
75
0
    return 1;
76
0
}
77
78
#endif