]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/evp/e_rc4.c
94107c72c34751383a86bc8df69bfc622e4d92ef
[thirdparty/openssl.git] / crypto / evp / e_rc4.c
1 /*
2 * Copyright 1995-2020 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 * RC4 low level APIs are deprecated for public use, but still ok for internal
12 * use.
13 */
14 #include "internal/deprecated.h"
15
16 #include <stdio.h>
17 #include "internal/cryptlib.h"
18
19 #ifndef OPENSSL_NO_RC4
20
21 # include <openssl/evp.h>
22 # include <openssl/objects.h>
23 # include <openssl/rc4.h>
24
25 # include "crypto/evp.h"
26
27 typedef struct {
28 RC4_KEY ks; /* working key */
29 } EVP_RC4_KEY;
30
31 # define data(ctx) ((EVP_RC4_KEY *)EVP_CIPHER_CTX_get_cipher_data(ctx))
32
33 static int rc4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
34 const unsigned char *iv, int enc);
35 static int rc4_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
36 const unsigned char *in, size_t inl);
37 static const EVP_CIPHER r4_cipher = {
38 NID_rc4,
39 1, EVP_RC4_KEY_SIZE, 0,
40 EVP_CIPH_VARIABLE_LENGTH,
41 rc4_init_key,
42 rc4_cipher,
43 NULL,
44 sizeof(EVP_RC4_KEY),
45 NULL,
46 NULL,
47 NULL,
48 NULL
49 };
50
51 static const EVP_CIPHER r4_40_cipher = {
52 NID_rc4_40,
53 1, 5 /* 40 bit */ , 0,
54 EVP_CIPH_VARIABLE_LENGTH,
55 rc4_init_key,
56 rc4_cipher,
57 NULL,
58 sizeof(EVP_RC4_KEY),
59 NULL,
60 NULL,
61 NULL,
62 NULL
63 };
64
65 const EVP_CIPHER *EVP_rc4(void)
66 {
67 return &r4_cipher;
68 }
69
70 const EVP_CIPHER *EVP_rc4_40(void)
71 {
72 return &r4_40_cipher;
73 }
74
75 static int rc4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
76 const unsigned char *iv, int enc)
77 {
78 int keylen;
79
80 if ((keylen = EVP_CIPHER_CTX_key_length(ctx)) <= 0)
81 return 0;
82 RC4_set_key(&data(ctx)->ks, keylen, key);
83 return 1;
84 }
85
86 static int rc4_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
87 const unsigned char *in, size_t inl)
88 {
89 RC4(&data(ctx)->ks, inl, in, out);
90 return 1;
91 }
92 #endif