mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
9ec363a25d
A lot of internally used crypto headers are publicly includeable in user projects. This leads to bug reports when these headers are incorrectly used or the API's are not used as intended. Move all crypto headers into private crypto src folder, also move crypto_ops into Supplicant to remove dependecy on crypto headers. Closes IDF-476
62 lines
1.2 KiB
C
62 lines
1.2 KiB
C
/*
|
|
* RC4 stream cipher
|
|
* Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* Alternatively, this software may be distributed under the terms of BSD
|
|
* license.
|
|
*
|
|
* See README and COPYING for more details.
|
|
*/
|
|
|
|
#include "utils/includes.h"
|
|
|
|
#include "utils/common.h"
|
|
#include "crypto.h"
|
|
|
|
#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0)
|
|
|
|
int
|
|
rc4_skip(const u8 *key, size_t keylen, size_t skip,
|
|
u8 *data, size_t data_len)
|
|
{
|
|
u32 i, j, k;
|
|
u8 S[256], *pos;
|
|
size_t kpos;
|
|
|
|
/* Setup RC4 state */
|
|
for (i = 0; i < 256; i++)
|
|
S[i] = i;
|
|
j = 0;
|
|
kpos = 0;
|
|
for (i = 0; i < 256; i++) {
|
|
j = (j + S[i] + key[kpos]) & 0xff;
|
|
kpos++;
|
|
if (kpos >= keylen)
|
|
kpos = 0;
|
|
S_SWAP(i, j);
|
|
}
|
|
|
|
/* Skip the start of the stream */
|
|
i = j = 0;
|
|
for (k = 0; k < skip; k++) {
|
|
i = (i + 1) & 0xff;
|
|
j = (j + S[i]) & 0xff;
|
|
S_SWAP(i, j);
|
|
}
|
|
|
|
/* Apply RC4 to data */
|
|
pos = data;
|
|
for (k = 0; k < data_len; k++) {
|
|
i = (i + 1) & 0xff;
|
|
j = (j + S[i]) & 0xff;
|
|
S_SWAP(i, j);
|
|
*pos++ ^= S[(S[i] + S[j]) & 0xff];
|
|
}
|
|
|
|
return 0;
|
|
}
|