/src/hostap/src/crypto/rc4.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * RC4 stream cipher |
3 | | * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi> |
4 | | * |
5 | | * This software may be distributed under the terms of the BSD license. |
6 | | * See README for more details. |
7 | | */ |
8 | | |
9 | | #include "includes.h" |
10 | | |
11 | | #include "common.h" |
12 | | #include "crypto.h" |
13 | | |
14 | 0 | #define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) |
15 | | |
16 | | int rc4_skip(const u8 *key, size_t keylen, size_t skip, |
17 | | u8 *data, size_t data_len) |
18 | 0 | { |
19 | 0 | u32 i, j, k; |
20 | 0 | u8 S[256], *pos; |
21 | 0 | size_t kpos; |
22 | | |
23 | | /* Setup RC4 state */ |
24 | 0 | for (i = 0; i < 256; i++) |
25 | 0 | S[i] = i; |
26 | 0 | j = 0; |
27 | 0 | kpos = 0; |
28 | 0 | for (i = 0; i < 256; i++) { |
29 | 0 | j = (j + S[i] + key[kpos]) & 0xff; |
30 | 0 | kpos++; |
31 | 0 | if (kpos >= keylen) |
32 | 0 | kpos = 0; |
33 | 0 | S_SWAP(i, j); |
34 | 0 | } |
35 | | |
36 | | /* Skip the start of the stream */ |
37 | 0 | i = j = 0; |
38 | 0 | for (k = 0; k < skip; k++) { |
39 | 0 | i = (i + 1) & 0xff; |
40 | 0 | j = (j + S[i]) & 0xff; |
41 | 0 | S_SWAP(i, j); |
42 | 0 | } |
43 | | |
44 | | /* Apply RC4 to data */ |
45 | 0 | pos = data; |
46 | 0 | for (k = 0; k < data_len; k++) { |
47 | 0 | i = (i + 1) & 0xff; |
48 | 0 | j = (j + S[i]) & 0xff; |
49 | 0 | S_SWAP(i, j); |
50 | 0 | *pos++ ^= S[(S[i] + S[j]) & 0xff]; |
51 | 0 | } |
52 | |
|
53 | 0 | return 0; |
54 | 0 | } |