K2.6 patches and update.
[tomato.git] / release / src-rt / bcmcrypto / rc4.c
blob30a838a1c1c8f430ce49e45ee463eeda0bb28741
1 /*
2 * rc4.c
3 * RC4 stream cipher
5 * Copyright (C) 2010, Broadcom Corporation
6 * All Rights Reserved.
7 *
8 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
9 * the contents of this file may not be disclosed to third parties, copied
10 * or duplicated in any form, in whole or in part, without the prior
11 * written permission of Broadcom Corporation.
13 * $Id: rc4.c,v 1.10 2006-06-14 21:07:54 Exp $
16 #include <typedefs.h>
17 #include <bcmcrypto/rc4.h>
19 void
20 BCMROMFN(prepare_key)(uint8 *key_data, int key_data_len, rc4_ks_t *ks)
22 unsigned int counter, index1 = 0, index2 = 0;
23 uint8 key_byte, temp;
24 uint8 *key_state = ks->state;
26 for (counter = 0; counter < RC4_STATE_NBYTES; counter++) {
27 key_state[counter] = (uint8) counter;
30 for (counter = 0; counter < RC4_STATE_NBYTES; counter++) {
31 key_byte = key_data[index1];
32 index2 = (key_byte + key_state[counter] + index2) % RC4_STATE_NBYTES;
33 temp = key_state[counter];
34 key_state[counter] = key_state[index2];
35 key_state[index2] = temp;
36 index1 = (index1 + 1) % key_data_len;
39 ks->x = 0;
40 ks->y = 0;
43 /* encrypt or decrypt using RC4 */
44 void
45 BCMROMFN(rc4)(uint8 *buf, int data_len, rc4_ks_t *ks)
47 uint8 tmp;
48 uint8 xor_ind, x = ks->x, y = ks->y, *key_state = ks->state;
49 int i;
51 for (i = 0; i < data_len; i++) {
52 y += key_state[++x]; /* mod RC4_STATE_NBYTES */
53 tmp = key_state[x];
54 key_state[x] = key_state[y];
55 key_state[y] = tmp;
56 xor_ind = key_state[x] + key_state[y];
57 buf[i] ^= key_state[xor_ind];
60 ks->x = x;
61 ks->y = y;
64 #ifdef BCMRC4_TEST
65 #include <stdio.h>
67 #if defined(__GNUC__)
68 extern void bcopy(const void *src, void *dst, int len);
69 extern int bcmp(const void *b1, const void *b2, int len);
70 extern void bzero(void *b, int len);
71 #else
72 #define bcopy(src, dst, len) memcpy((dst), (src), (len))
73 #define bcmp(b1, b2, len) memcmp((b1), (b2), (len))
74 #define bzero(b, len) memset((b), 0, (len))
75 #endif
77 #include "rc4_vectors.h"
78 #define NUM_VECTORS (sizeof(rc4_vec)/sizeof(rc4_vec[0]))
80 int main(int argc, char **argv)
82 int k, fail = 0;
83 uint8 data[RC4_STATE_NBYTES];
84 rc4_ks_t ks;
85 for (k = 0; k < NUM_VECTORS; k++) {
86 bzero(data, RC4_STATE_NBYTES);
87 bcopy(rc4_vec[k].input, data, rc4_vec[k].il);
89 prepare_key(rc4_vec[k].key, rc4_vec[k].kl, &ks);
90 rc4(data, rc4_vec[k].il, &ks);
91 if (bcmp(data, rc4_vec[k].ref, rc4_vec[k].il) != 0) {
92 printf("%s: rc4 encrypt failed\n", *argv);
93 fail++;
94 } else {
95 printf("%s: rc4 encrypt %d passed\n", *argv, k);
98 bzero(data, RC4_STATE_NBYTES);
99 bcopy(rc4_vec[k].ref, data, rc4_vec[k].il);
101 prepare_key(rc4_vec[k].key, rc4_vec[k].kl, &ks);
102 rc4(data, rc4_vec[k].il, &ks);
103 if (bcmp(data, rc4_vec[k].input, rc4_vec[k].il) != 0) {
104 printf("%s: rc4 decrypt failed\n", *argv);
105 fail++;
106 } else {
107 printf("%s: rc4 decrypt %d passed\n", *argv, k);
111 printf("%s: %s\n", *argv, fail?"FAILED":"PASSED");
112 return (fail);
114 #endif /* BCMRC4_TEST */