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 | {
|
---|
44 | BLOCK_CIPHER_ecb_loop()
|
---|
45 | IDEA_ecb_encrypt(in + i, out + i, &EVP_C_DATA(EVP_IDEA_KEY,ctx)->ks);
|
---|
46 | return 1;
|
---|
47 | }
|
---|
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 | {
|
---|
60 | if (!enc) {
|
---|
61 | if (EVP_CIPHER_CTX_get_mode(ctx) == EVP_CIPH_OFB_MODE)
|
---|
62 | enc = 1;
|
---|
63 | else if (EVP_CIPHER_CTX_get_mode(ctx) == EVP_CIPH_CFB_MODE)
|
---|
64 | enc = 1;
|
---|
65 | }
|
---|
66 | if (enc)
|
---|
67 | IDEA_set_encrypt_key(key, &EVP_C_DATA(EVP_IDEA_KEY,ctx)->ks);
|
---|
68 | else {
|
---|
69 | IDEA_KEY_SCHEDULE tmp;
|
---|
70 |
|
---|
71 | IDEA_set_encrypt_key(key, &tmp);
|
---|
72 | IDEA_set_decrypt_key(&tmp, &EVP_C_DATA(EVP_IDEA_KEY,ctx)->ks);
|
---|
73 | OPENSSL_cleanse((unsigned char *)&tmp, sizeof(IDEA_KEY_SCHEDULE));
|
---|
74 | }
|
---|
75 | return 1;
|
---|
76 | }
|
---|
77 |
|
---|
78 | #endif
|
---|