xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/hcrypto/evp-hcrypto.c (revision afab4e300d3a9fb07dd8c80daf53d0feb3345706)
1 /*	$NetBSD: evp-hcrypto.c,v 1.3 2023/06/19 21:41:43 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include <config.h>
37 #include <krb5/roken.h>
38 
39 #define HC_DEPRECATED
40 
41 #include <assert.h>
42 
43 #include <evp.h>
44 #include <evp-hcrypto.h>
45 
46 #include <krb5/krb5-types.h>
47 
48 #include <des.h>
49 #include "camellia.h"
50 #include <aes.h>
51 
52 #include <rc2.h>
53 #include <rc4.h>
54 
55 #include <sha.h>
56 #include <md4.h>
57 #include <md5.h>
58 
59 /*
60  *
61  */
62 
63 static int
aes_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int encp)64 aes_init(EVP_CIPHER_CTX *ctx,
65 	 const unsigned char * key,
66 	 const unsigned char * iv,
67 	 int encp)
68 {
69     AES_KEY *k = ctx->cipher_data;
70     if (ctx->encrypt || EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE)
71 	AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k);
72     else
73 	AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k);
74     return 1;
75 }
76 
77 static int
aes_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)78 aes_do_cipher(EVP_CIPHER_CTX *ctx,
79 	      unsigned char *out,
80 	      const unsigned char *in,
81 	      unsigned int size)
82 {
83     AES_KEY *k = ctx->cipher_data;
84     if (EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE)
85         AES_cfb8_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
86     else
87         AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
88     return 1;
89 }
90 
91 /**
92  * The AES-128 cipher type (hcrypto)
93  *
94  * @return the AES-128 EVP_CIPHER pointer.
95  *
96  * @ingroup hcrypto_evp
97  */
98 
99 const EVP_CIPHER *
EVP_hcrypto_aes_128_cbc(void)100 EVP_hcrypto_aes_128_cbc(void)
101 {
102     static const EVP_CIPHER aes_128_cbc = {
103 	0,
104 	16,
105 	16,
106 	16,
107 	EVP_CIPH_CBC_MODE,
108 	aes_init,
109 	aes_do_cipher,
110 	NULL,
111 	sizeof(AES_KEY),
112 	NULL,
113 	NULL,
114 	NULL,
115 	NULL
116     };
117 
118     return &aes_128_cbc;
119 }
120 
121 /**
122  * The AES-192 cipher type (hcrypto)
123  *
124  * @return the AES-192 EVP_CIPHER pointer.
125  *
126  * @ingroup hcrypto_evp
127  */
128 
129 const EVP_CIPHER *
EVP_hcrypto_aes_192_cbc(void)130 EVP_hcrypto_aes_192_cbc(void)
131 {
132     static const EVP_CIPHER aes_192_cbc = {
133 	0,
134 	16,
135 	24,
136 	16,
137 	EVP_CIPH_CBC_MODE,
138 	aes_init,
139 	aes_do_cipher,
140 	NULL,
141 	sizeof(AES_KEY),
142 	NULL,
143 	NULL,
144 	NULL,
145 	NULL
146     };
147     return &aes_192_cbc;
148 }
149 
150 /**
151  * The AES-256 cipher type (hcrypto)
152  *
153  * @return the AES-256 EVP_CIPHER pointer.
154  *
155  * @ingroup hcrypto_evp
156  */
157 
158 const EVP_CIPHER *
EVP_hcrypto_aes_256_cbc(void)159 EVP_hcrypto_aes_256_cbc(void)
160 {
161     static const EVP_CIPHER aes_256_cbc = {
162 	0,
163 	16,
164 	32,
165 	16,
166 	EVP_CIPH_CBC_MODE,
167 	aes_init,
168 	aes_do_cipher,
169 	NULL,
170 	sizeof(AES_KEY),
171 	NULL,
172 	NULL,
173 	NULL,
174 	NULL
175     };
176     return &aes_256_cbc;
177 }
178 
179 /**
180  * The AES-128 CFB8 cipher type (hcrypto)
181  *
182  * @return the AES-128 EVP_CIPHER pointer.
183  *
184  * @ingroup hcrypto_evp
185  */
186 
187 const EVP_CIPHER *
EVP_hcrypto_aes_128_cfb8(void)188 EVP_hcrypto_aes_128_cfb8(void)
189 {
190     static const EVP_CIPHER aes_128_cfb8 = {
191 	0,
192 	1,
193 	16,
194 	16,
195 	EVP_CIPH_CFB8_MODE,
196 	aes_init,
197 	aes_do_cipher,
198 	NULL,
199 	sizeof(AES_KEY),
200 	NULL,
201 	NULL,
202 	NULL,
203 	NULL
204     };
205 
206     return &aes_128_cfb8;
207 }
208 
209 /**
210  * The AES-192 CFB8 cipher type (hcrypto)
211  *
212  * @return the AES-192 EVP_CIPHER pointer.
213  *
214  * @ingroup hcrypto_evp
215  */
216 
217 const EVP_CIPHER *
EVP_hcrypto_aes_192_cfb8(void)218 EVP_hcrypto_aes_192_cfb8(void)
219 {
220     static const EVP_CIPHER aes_192_cfb8 = {
221 	0,
222 	1,
223 	24,
224 	16,
225 	EVP_CIPH_CFB8_MODE,
226 	aes_init,
227 	aes_do_cipher,
228 	NULL,
229 	sizeof(AES_KEY),
230 	NULL,
231 	NULL,
232 	NULL,
233 	NULL
234     };
235     return &aes_192_cfb8;
236 }
237 
238 /**
239  * The AES-256 CFB8 cipher type (hcrypto)
240  *
241  * @return the AES-256 EVP_CIPHER pointer.
242  *
243  * @ingroup hcrypto_evp
244  */
245 
246 const EVP_CIPHER *
EVP_hcrypto_aes_256_cfb8(void)247 EVP_hcrypto_aes_256_cfb8(void)
248 {
249     static const EVP_CIPHER aes_256_cfb8 = {
250 	0,
251 	1,
252 	32,
253 	16,
254 	EVP_CIPH_CFB8_MODE,
255 	aes_init,
256 	aes_do_cipher,
257 	NULL,
258 	sizeof(AES_KEY),
259 	NULL,
260 	NULL,
261 	NULL,
262 	NULL
263     };
264     return &aes_256_cfb8;
265 }
266 
267 /**
268  * The message digest SHA256 - hcrypto
269  *
270  * @return the message digest type.
271  *
272  * @ingroup hcrypto_evp
273  */
274 
275 const EVP_MD *
EVP_hcrypto_sha256(void)276 EVP_hcrypto_sha256(void)
277 {
278     static const struct hc_evp_md sha256 = {
279 	32,
280 	64,
281 	sizeof(SHA256_CTX),
282 	(hc_evp_md_init)SHA256_Init,
283 	(hc_evp_md_update)SHA256_Update,
284 	(hc_evp_md_final)SHA256_Final,
285 	NULL
286     };
287     return &sha256;
288 }
289 
290 /**
291  * The message digest SHA384 - hcrypto
292  *
293  * @return the message digest type.
294  *
295  * @ingroup hcrypto_evp
296  */
297 
298 const EVP_MD *
EVP_hcrypto_sha384(void)299 EVP_hcrypto_sha384(void)
300 {
301     static const struct hc_evp_md sha384 = {
302 	48,
303 	128,
304 	sizeof(SHA384_CTX),
305 	(hc_evp_md_init)SHA384_Init,
306 	(hc_evp_md_update)SHA384_Update,
307 	(hc_evp_md_final)SHA384_Final,
308 	NULL
309     };
310     return &sha384;
311 }
312 
313 /**
314  * The message digest SHA512 - hcrypto
315  *
316  * @return the message digest type.
317  *
318  * @ingroup hcrypto_evp
319  */
320 
321 const EVP_MD *
EVP_hcrypto_sha512(void)322 EVP_hcrypto_sha512(void)
323 {
324     static const struct hc_evp_md sha512 = {
325 	64,
326 	128,
327 	sizeof(SHA512_CTX),
328 	(hc_evp_md_init)SHA512_Init,
329 	(hc_evp_md_update)SHA512_Update,
330 	(hc_evp_md_final)SHA512_Final,
331 	NULL
332     };
333     return &sha512;
334 }
335 
336 /**
337  * The message digest SHA1 - hcrypto
338  *
339  * @return the message digest type.
340  *
341  * @ingroup hcrypto_evp
342  */
343 
344 const EVP_MD *
EVP_hcrypto_sha1(void)345 EVP_hcrypto_sha1(void)
346 {
347     static const struct hc_evp_md sha1 = {
348 	20,
349 	64,
350 	sizeof(SHA_CTX),
351 	(hc_evp_md_init)SHA1_Init,
352 	(hc_evp_md_update)SHA1_Update,
353 	(hc_evp_md_final)SHA1_Final,
354 	NULL
355     };
356     return &sha1;
357 }
358 
359 /**
360  * The message digest MD5 - hcrypto
361  *
362  * @return the message digest type.
363  *
364  * @ingroup hcrypto_evp
365  */
366 
367 const EVP_MD *
EVP_hcrypto_md5(void)368 EVP_hcrypto_md5(void)
369 {
370     static const struct hc_evp_md md5 = {
371 	16,
372 	64,
373 	sizeof(MD5_CTX),
374 	(hc_evp_md_init)MD5_Init,
375 	(hc_evp_md_update)MD5_Update,
376 	(hc_evp_md_final)MD5_Final,
377 	NULL
378     };
379     return &md5;
380 }
381 
382 /**
383  * The message digest MD4 - hcrypto
384  *
385  * @return the message digest type.
386  *
387  * @ingroup hcrypto_evp
388  */
389 
390 const EVP_MD *
EVP_hcrypto_md4(void)391 EVP_hcrypto_md4(void)
392 {
393     static const struct hc_evp_md md4 = {
394 	16,
395 	64,
396 	sizeof(MD4_CTX),
397 	(hc_evp_md_init)MD4_Init,
398 	(hc_evp_md_update)MD4_Update,
399 	(hc_evp_md_final)MD4_Final,
400 	NULL
401     };
402     return &md4;
403 }
404 
405 
406 /*
407  *
408  */
409 
410 static int
des_cbc_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int encp)411 des_cbc_init(EVP_CIPHER_CTX *ctx,
412 	     const unsigned char * key,
413 	     const unsigned char * iv,
414 	     int encp)
415 {
416     DES_key_schedule *k = ctx->cipher_data;
417     DES_cblock deskey;
418     memcpy(&deskey, key, sizeof(deskey));
419     DES_set_key_unchecked(&deskey, k);
420     return 1;
421 }
422 
423 static int
des_cbc_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)424 des_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
425 		  unsigned char *out,
426 		  const unsigned char *in,
427 		  unsigned int size)
428 {
429     DES_key_schedule *k = ctx->cipher_data;
430     DES_cbc_encrypt(in, out, size,
431 		    k, (DES_cblock *)ctx->iv, ctx->encrypt);
432     return 1;
433 }
434 
435 /**
436  * The DES cipher type
437  *
438  * @return the DES-CBC EVP_CIPHER pointer.
439  *
440  * @ingroup hcrypto_evp
441  */
442 
443 const EVP_CIPHER *
EVP_hcrypto_des_cbc(void)444 EVP_hcrypto_des_cbc(void)
445 {
446     static const EVP_CIPHER des_cbc = {
447 	0,
448 	8,
449 	8,
450 	8,
451 	EVP_CIPH_CBC_MODE,
452 	des_cbc_init,
453 	des_cbc_do_cipher,
454 	NULL,
455 	sizeof(DES_key_schedule),
456 	NULL,
457 	NULL,
458 	NULL,
459 	NULL
460     };
461     return &des_cbc;
462 }
463 
464 /*
465  *
466  */
467 
468 struct des_ede3_cbc {
469     DES_key_schedule ks[3];
470 };
471 
472 static int
des_ede3_cbc_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int encp)473 des_ede3_cbc_init(EVP_CIPHER_CTX *ctx,
474 		  const unsigned char * key,
475 		  const unsigned char * iv,
476 		  int encp)
477 {
478     struct des_ede3_cbc *k = ctx->cipher_data;
479     DES_cblock deskey;
480 
481     memcpy(&deskey, key, sizeof(deskey));
482     DES_set_odd_parity(&deskey);
483     DES_set_key_unchecked(&deskey, &k->ks[0]);
484 
485     memcpy(&deskey, key + 8, sizeof(deskey));
486     DES_set_odd_parity(&deskey);
487     DES_set_key_unchecked(&deskey, &k->ks[1]);
488 
489     memcpy(&deskey, key + 16, sizeof(deskey));
490     DES_set_odd_parity(&deskey);
491     DES_set_key_unchecked(&deskey, &k->ks[2]);
492 
493     return 1;
494 }
495 
496 static int
des_ede3_cbc_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)497 des_ede3_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
498 		       unsigned char *out,
499 		       const unsigned char *in,
500 		       unsigned int size)
501 {
502     struct des_ede3_cbc *k = ctx->cipher_data;
503     DES_ede3_cbc_encrypt(in, out, size,
504 			 &k->ks[0], &k->ks[1], &k->ks[2],
505 			 (DES_cblock *)ctx->iv, ctx->encrypt);
506     return 1;
507 }
508 
509 /**
510  * The triple DES cipher type - hcrypto
511  *
512  * @return the DES-EDE3-CBC EVP_CIPHER pointer.
513  *
514  * @ingroup hcrypto_evp
515  */
516 
517 const EVP_CIPHER *
EVP_hcrypto_des_ede3_cbc(void)518 EVP_hcrypto_des_ede3_cbc(void)
519 {
520     static const EVP_CIPHER des_ede3_cbc = {
521 	0,
522 	8,
523 	24,
524 	8,
525 	EVP_CIPH_CBC_MODE,
526 	des_ede3_cbc_init,
527 	des_ede3_cbc_do_cipher,
528 	NULL,
529 	sizeof(struct des_ede3_cbc),
530 	NULL,
531 	NULL,
532 	NULL,
533 	NULL
534     };
535     return &des_ede3_cbc;
536 }
537 
538 /*
539  *
540  */
541 
542 struct rc2_cbc {
543     unsigned int maximum_effective_key;
544     RC2_KEY key;
545 };
546 
547 static int
rc2_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int encp)548 rc2_init(EVP_CIPHER_CTX *ctx,
549 	 const unsigned char * key,
550 	 const unsigned char * iv,
551 	 int encp)
552 {
553     struct rc2_cbc *k = ctx->cipher_data;
554     k->maximum_effective_key = EVP_CIPHER_CTX_key_length(ctx) * 8;
555     RC2_set_key(&k->key,
556 		EVP_CIPHER_CTX_key_length(ctx),
557 		key,
558 		k->maximum_effective_key);
559     return 1;
560 }
561 
562 static int
rc2_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)563 rc2_do_cipher(EVP_CIPHER_CTX *ctx,
564 	      unsigned char *out,
565 	      const unsigned char *in,
566 	      unsigned int size)
567 {
568     struct rc2_cbc *k = ctx->cipher_data;
569     RC2_cbc_encrypt(in, out, size, &k->key, ctx->iv, ctx->encrypt);
570     return 1;
571 }
572 
573 /**
574  * The RC2 cipher type - hcrypto
575  *
576  * @return the RC2 EVP_CIPHER pointer.
577  *
578  * @ingroup hcrypto_evp
579  */
580 
581 const EVP_CIPHER *
EVP_hcrypto_rc2_cbc(void)582 EVP_hcrypto_rc2_cbc(void)
583 {
584     static const EVP_CIPHER rc2_cbc = {
585 	0,
586 	RC2_BLOCK_SIZE,
587 	RC2_KEY_LENGTH,
588 	RC2_BLOCK_SIZE,
589 	EVP_CIPH_CBC_MODE|EVP_CIPH_VARIABLE_LENGTH,
590 	rc2_init,
591 	rc2_do_cipher,
592 	NULL,
593 	sizeof(struct rc2_cbc),
594 	NULL,
595 	NULL,
596 	NULL,
597 	NULL
598     };
599     return &rc2_cbc;
600 }
601 
602 /**
603  * The RC2-40 cipher type
604  *
605  * @return the RC2-40 EVP_CIPHER pointer.
606  *
607  * @ingroup hcrypto_evp
608  */
609 
610 const EVP_CIPHER *
EVP_hcrypto_rc2_40_cbc(void)611 EVP_hcrypto_rc2_40_cbc(void)
612 {
613     static const EVP_CIPHER rc2_40_cbc = {
614 	0,
615 	RC2_BLOCK_SIZE,
616 	5,
617 	RC2_BLOCK_SIZE,
618 	EVP_CIPH_CBC_MODE,
619 	rc2_init,
620 	rc2_do_cipher,
621 	NULL,
622 	sizeof(struct rc2_cbc),
623 	NULL,
624 	NULL,
625 	NULL,
626 	NULL
627     };
628     return &rc2_40_cbc;
629 }
630 
631 /**
632  * The RC2-64 cipher type
633  *
634  * @return the RC2-64 EVP_CIPHER pointer.
635  *
636  * @ingroup hcrypto_evp
637  */
638 
639 const EVP_CIPHER *
EVP_hcrypto_rc2_64_cbc(void)640 EVP_hcrypto_rc2_64_cbc(void)
641 {
642     static const EVP_CIPHER rc2_64_cbc = {
643 	0,
644 	RC2_BLOCK_SIZE,
645 	8,
646 	RC2_BLOCK_SIZE,
647 	EVP_CIPH_CBC_MODE,
648 	rc2_init,
649 	rc2_do_cipher,
650 	NULL,
651 	sizeof(struct rc2_cbc),
652 	NULL,
653 	NULL,
654 	NULL,
655 	NULL
656     };
657     return &rc2_64_cbc;
658 }
659 
660 static int
camellia_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int encp)661 camellia_init(EVP_CIPHER_CTX *ctx,
662 	 const unsigned char * key,
663 	 const unsigned char * iv,
664 	 int encp)
665 {
666     CAMELLIA_KEY *k = ctx->cipher_data;
667     k->bits = ctx->cipher->key_len * 8;
668     CAMELLIA_set_key(key, ctx->cipher->key_len * 8, k);
669     return 1;
670 }
671 
672 static int
camellia_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)673 camellia_do_cipher(EVP_CIPHER_CTX *ctx,
674 	      unsigned char *out,
675 	      const unsigned char *in,
676 	      unsigned int size)
677 {
678     CAMELLIA_KEY *k = ctx->cipher_data;
679     CAMELLIA_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt);
680     return 1;
681 }
682 
683 /**
684  * The Camellia-128 cipher type - hcrypto
685  *
686  * @return the Camellia-128 EVP_CIPHER pointer.
687  *
688  * @ingroup hcrypto_evp
689  */
690 
691 const EVP_CIPHER *
EVP_hcrypto_camellia_128_cbc(void)692 EVP_hcrypto_camellia_128_cbc(void)
693 {
694     static const EVP_CIPHER cipher = {
695 	0,
696 	16,
697 	16,
698 	16,
699 	EVP_CIPH_CBC_MODE,
700 	camellia_init,
701 	camellia_do_cipher,
702 	NULL,
703 	sizeof(CAMELLIA_KEY),
704 	NULL,
705 	NULL,
706 	NULL,
707 	NULL
708     };
709     return &cipher;
710 }
711 
712 /**
713  * The Camellia-198 cipher type - hcrypto
714  *
715  * @return the Camellia-198 EVP_CIPHER pointer.
716  *
717  * @ingroup hcrypto_evp
718  */
719 
720 const EVP_CIPHER *
EVP_hcrypto_camellia_192_cbc(void)721 EVP_hcrypto_camellia_192_cbc(void)
722 {
723     static const EVP_CIPHER cipher = {
724 	0,
725 	16,
726 	24,
727 	16,
728 	EVP_CIPH_CBC_MODE,
729 	camellia_init,
730 	camellia_do_cipher,
731 	NULL,
732 	sizeof(CAMELLIA_KEY),
733 	NULL,
734 	NULL,
735 	NULL,
736 	NULL
737     };
738     return &cipher;
739 }
740 
741 /**
742  * The Camellia-256 cipher type - hcrypto
743  *
744  * @return the Camellia-256 EVP_CIPHER pointer.
745  *
746  * @ingroup hcrypto_evp
747  */
748 
749 const EVP_CIPHER *
EVP_hcrypto_camellia_256_cbc(void)750 EVP_hcrypto_camellia_256_cbc(void)
751 {
752     static const EVP_CIPHER cipher = {
753 	0,
754 	16,
755 	32,
756 	16,
757 	EVP_CIPH_CBC_MODE,
758 	camellia_init,
759 	camellia_do_cipher,
760 	NULL,
761 	sizeof(CAMELLIA_KEY),
762 	NULL,
763 	NULL,
764 	NULL,
765 	NULL
766     };
767     return &cipher;
768 }
769 
770 static int
rc4_init(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc)771 rc4_init(EVP_CIPHER_CTX *ctx,
772 	 const unsigned char *key,
773 	 const unsigned char *iv,
774 	 int enc)
775 {
776     RC4_KEY *k = ctx->cipher_data;
777     RC4_set_key(k, ctx->key_len, key);
778     return 1;
779 }
780 
781 static int
rc4_do_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,unsigned int size)782 rc4_do_cipher(EVP_CIPHER_CTX *ctx,
783 	      unsigned char *out,
784 	      const unsigned char *in,
785 	      unsigned int size)
786 {
787     RC4_KEY *k = ctx->cipher_data;
788     RC4(k, size, in, out);
789     return 1;
790 }
791 
792 const EVP_CIPHER *
EVP_hcrypto_rc4(void)793 EVP_hcrypto_rc4(void)
794 {
795     static const EVP_CIPHER rc4 = {
796 	0,
797 	1,
798 	16,
799 	0,
800 	EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH,
801 	rc4_init,
802 	rc4_do_cipher,
803 	NULL,
804 	sizeof(RC4_KEY),
805 	NULL,
806 	NULL,
807 	NULL,
808 	NULL
809     };
810     return &rc4;
811 }
812 
813 
814 const EVP_CIPHER *
EVP_hcrypto_rc4_40(void)815 EVP_hcrypto_rc4_40(void)
816 {
817     static const EVP_CIPHER rc4_40 = {
818 	0,
819 	1,
820 	5,
821 	0,
822 	EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH,
823 	rc4_init,
824 	rc4_do_cipher,
825 	NULL,
826 	sizeof(RC4_KEY),
827 	NULL,
828 	NULL,
829 	NULL,
830 	NULL
831     };
832     return &rc4_40;
833 }
834