summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/e_rc4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/e_rc4.c')
-rw-r--r--src/lib/libcrypto/evp/e_rc4.c75
1 files changed, 42 insertions, 33 deletions
diff --git a/src/lib/libcrypto/evp/e_rc4.c b/src/lib/libcrypto/evp/e_rc4.c
index 7e9790a94c..4064cc5fa0 100644
--- a/src/lib/libcrypto/evp/e_rc4.c
+++ b/src/lib/libcrypto/evp/e_rc4.c
@@ -56,72 +56,81 @@
56 * [including the GNU Public Licence.] 56 * [including the GNU Public Licence.]
57 */ 57 */
58 58
59#ifndef NO_RC4 59#ifndef OPENSSL_NO_RC4
60 60
61#include <stdio.h> 61#include <stdio.h>
62#include "cryptlib.h" 62#include "cryptlib.h"
63#include "evp.h" 63#include <openssl/evp.h>
64#include "objects.h" 64#include <openssl/objects.h>
65#include <openssl/rc4.h>
65 66
66#ifndef NOPROTO 67/* FIXME: surely this is available elsewhere? */
67static void rc4_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, 68#define EVP_RC4_KEY_SIZE 16
68 unsigned char *iv,int enc); 69
69static void rc4_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 70typedef struct
70 unsigned char *in, unsigned int inl); 71 {
71#else 72 /* FIXME: what is the key for? */
72static void rc4_init_key(); 73 unsigned char key[EVP_RC4_KEY_SIZE];
73static void rc4_cipher(); 74 RC4_KEY ks; /* working key */
74#endif 75 } EVP_RC4_KEY;
76
77#define data(ctx) ((EVP_RC4_KEY *)(ctx)->cipher_data)
75 78
76static EVP_CIPHER r4_cipher= 79static int rc4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
80 const unsigned char *iv,int enc);
81static int rc4_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
82 const unsigned char *in, unsigned int inl);
83static const EVP_CIPHER r4_cipher=
77 { 84 {
78 NID_rc4, 85 NID_rc4,
79 1,EVP_RC4_KEY_SIZE,0, 86 1,EVP_RC4_KEY_SIZE,0,
87 EVP_CIPH_VARIABLE_LENGTH,
80 rc4_init_key, 88 rc4_init_key,
81 rc4_cipher, 89 rc4_cipher,
82 NULL, 90 NULL,
83 sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ 91 sizeof(EVP_RC4_KEY),
84 sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc4)),
85 NULL, 92 NULL,
86 NULL, 93 NULL,
94 NULL
87 }; 95 };
88 96
89static EVP_CIPHER r4_40_cipher= 97static const EVP_CIPHER r4_40_cipher=
90 { 98 {
91 NID_rc4_40, 99 NID_rc4_40,
92 1,5 /* 40 bit */,0, 100 1,5 /* 40 bit */,0,
101 EVP_CIPH_VARIABLE_LENGTH,
93 rc4_init_key, 102 rc4_init_key,
94 rc4_cipher, 103 rc4_cipher,
104 NULL,
105 sizeof(EVP_RC4_KEY),
106 NULL,
107 NULL,
108 NULL
95 }; 109 };
96 110
97EVP_CIPHER *EVP_rc4() 111const EVP_CIPHER *EVP_rc4(void)
98 { 112 {
99 return(&r4_cipher); 113 return(&r4_cipher);
100 } 114 }
101 115
102EVP_CIPHER *EVP_rc4_40() 116const EVP_CIPHER *EVP_rc4_40(void)
103 { 117 {
104 return(&r4_40_cipher); 118 return(&r4_40_cipher);
105 } 119 }
106 120
107static void rc4_init_key(ctx,key,iv,enc) 121static int rc4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
108EVP_CIPHER_CTX *ctx; 122 const unsigned char *iv, int enc)
109unsigned char *key;
110unsigned char *iv;
111int enc;
112 { 123 {
113 if (key != NULL) 124 memcpy(&data(ctx)->key[0],key,EVP_CIPHER_CTX_key_length(ctx));
114 memcpy(&(ctx->c.rc4.key[0]),key,EVP_CIPHER_CTX_key_length(ctx)); 125 RC4_set_key(&data(ctx)->ks,EVP_CIPHER_CTX_key_length(ctx),
115 RC4_set_key(&(ctx->c.rc4.ks),EVP_CIPHER_CTX_key_length(ctx), 126 data(ctx)->key);
116 ctx->c.rc4.key); 127 return 1;
117 } 128 }
118 129
119static void rc4_cipher(ctx,out,in,inl) 130static int rc4_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
120EVP_CIPHER_CTX *ctx; 131 const unsigned char *in, unsigned int inl)
121unsigned char *out;
122unsigned char *in;
123unsigned int inl;
124 { 132 {
125 RC4(&(ctx->c.rc4.ks),inl,in,out); 133 RC4(&data(ctx)->ks,inl,in,out);
134 return 1;
126 } 135 }
127#endif 136#endif