Move RC4 into crypto.h as a replaceable crypto function

This allows crypto library wrappers to override the internal RC4
implementation in the same way as can already be done for other crypto
algorithms.
This commit is contained in:
Jouni Malinen 2009-08-16 20:13:14 +03:00
parent 8ef1683115
commit ac73690c06
13 changed files with 45 additions and 46 deletions

View file

@ -89,7 +89,6 @@ OBJS += ctrl_iface.o
endif endif
OBJS += ../src/crypto/md5.o OBJS += ../src/crypto/md5.o
OBJS += ../src/crypto/rc4.o
AESOBJS = # none so far AESOBJS = # none so far
@ -437,6 +436,7 @@ ifdef NEED_FIPS186_2_PRF
OBJS += ../src/crypto/fips_prf_openssl.o OBJS += ../src/crypto/fips_prf_openssl.o
OBJS_p += ../src/crypto/fips_prf_openssl.o OBJS_p += ../src/crypto/fips_prf_openssl.o
endif endif
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_TLS), gnutls) ifeq ($(CONFIG_TLS), gnutls)
OBJS += ../src/crypto/crypto_gnutls.o OBJS += ../src/crypto/crypto_gnutls.o
@ -447,12 +447,14 @@ OBJS += ../src/crypto/fips_prf_gnutls.o
OBJS_p += ../src/crypto/fips_prf_gnutls.o OBJS_p += ../src/crypto/fips_prf_gnutls.o
endif endif
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_TLS), internal) ifeq ($(CONFIG_TLS), internal)
ifeq ($(CONFIG_CRYPTO), libtomcrypt) ifeq ($(CONFIG_CRYPTO), libtomcrypt)
OBJS += ../src/crypto/crypto_libtomcrypt.o OBJS += ../src/crypto/crypto_libtomcrypt.o
OBJS_p += ../src/crypto/crypto_libtomcrypt.o OBJS_p += ../src/crypto/crypto_libtomcrypt.o
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_CRYPTO), internal) ifeq ($(CONFIG_CRYPTO), internal)
OBJS += ../src/crypto/crypto_internal.o ../src/tls/rsa.o ../src/tls/bignum.o OBJS += ../src/crypto/crypto_internal.o ../src/tls/rsa.o ../src/tls/bignum.o
@ -473,6 +475,7 @@ CONFIG_INTERNAL_SHA1=y
CONFIG_INTERNAL_MD4=y CONFIG_INTERNAL_MD4=y
CONFIG_INTERNAL_MD5=y CONFIG_INTERNAL_MD5=y
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
endif endif
else else
@ -480,6 +483,7 @@ CONFIG_INTERNAL_AES=y
CONFIG_INTERNAL_SHA1=y CONFIG_INTERNAL_SHA1=y
CONFIG_INTERNAL_MD5=y CONFIG_INTERNAL_MD5=y
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifdef CONFIG_INTERNAL_AES ifdef CONFIG_INTERNAL_AES
@ -500,6 +504,9 @@ endif
ifdef CONFIG_INTERNAL_DES ifdef CONFIG_INTERNAL_DES
OBJS += ../src/crypto/des-internal.o OBJS += ../src/crypto/des-internal.o
endif endif
ifdef CONFIG_INTERNAL_RC4
OBJS += ../src/crypto/rc4.o
endif
ifdef NEED_SHA256 ifdef NEED_SHA256
OBJS += ../src/crypto/sha256.o OBJS += ../src/crypto/sha256.o

View file

@ -28,7 +28,7 @@
#include "radius/radius_client.h" #include "radius/radius_client.h"
#include "ieee802_11_auth.h" #include "ieee802_11_auth.h"
#include "sta_info.h" #include "sta_info.h"
#include "rc4.h" #include "crypto.h"
#include "ieee802_1x.h" #include "ieee802_1x.h"
#include "wpa.h" #include "wpa.h"
#include "wme.h" #include "wme.h"

View file

@ -21,7 +21,7 @@
#include "radius/radius_client.h" #include "radius/radius_client.h"
#include "eapol_sm.h" #include "eapol_sm.h"
#include "md5.h" #include "md5.h"
#include "rc4.h" #include "crypto.h"
#include "eloop.h" #include "eloop.h"
#include "sta_info.h" #include "sta_info.h"
#include "wpa.h" #include "wpa.h"

View file

@ -22,7 +22,6 @@
#include "wpa.h" #include "wpa.h"
#include "sha1.h" #include "sha1.h"
#include "sha256.h" #include "sha256.h"
#include "rc4.h"
#include "aes_wrap.h" #include "aes_wrap.h"
#include "crypto.h" #include "crypto.h"
#include "eloop.h" #include "eloop.h"

View file

@ -448,4 +448,20 @@ int __must_check crypto_mod_exp(const u8 *base, size_t base_len,
const u8 *modulus, size_t modulus_len, const u8 *modulus, size_t modulus_len,
u8 *result, size_t *result_len); u8 *result, size_t *result_len);
/**
* rc4_skip - XOR RC4 stream to given data with skip-stream-start
* @key: RC4 key
* @keylen: RC4 key length
* @skip: number of bytes to skip from the beginning of the RC4 stream
* @data: data to be XOR'ed with RC4 stream
* @data_len: buf length
* Returns: 0 on success, -1 on failure
*
* Generate RC4 pseudo random stream for the given key, skip beginning of the
* stream, and XOR the end result with the data buffer to perform RC4
* encryption/decryption.
*/
int rc4_skip(const u8 *key, size_t keylen, size_t skip,
u8 *data, size_t data_len);
#endif /* CRYPTO_H */ #endif /* CRYPTO_H */

View file

@ -18,7 +18,6 @@
#include "crypto.h" #include "crypto.h"
#include "md5.h" #include "md5.h"
#include "sha1.h" #include "sha1.h"
#include "rc4.h"
#include "aes.h" #include "aes.h"
#include "tls/rsa.h" #include "tls/rsa.h"
#include "tls/bignum.h" #include "tls/bignum.h"

View file

@ -16,7 +16,6 @@
#include <tomcrypt.h> #include <tomcrypt.h>
#include "common.h" #include "common.h"
#include "rc4.h"
#include "crypto.h" #include "crypto.h"
#ifndef mp_init_multi #ifndef mp_init_multi

View file

@ -18,7 +18,6 @@
#include "sha1.h" #include "sha1.h"
#include "ms_funcs.h" #include "ms_funcs.h"
#include "crypto.h" #include "crypto.h"
#include "rc4.h"
/** /**

View file

@ -15,24 +15,12 @@
#include "includes.h" #include "includes.h"
#include "common.h" #include "common.h"
#include "rc4.h" #include "crypto.h"
#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) #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,
* rc4 - XOR RC4 stream to given data with skip-stream-start u8 *data, size_t data_len)
* @key: RC4 key
* @keylen: RC4 key length
* @skip: number of bytes to skip from the beginning of the RC4 stream
* @data: data to be XOR'ed with RC4 stream
* @data_len: buf length
*
* Generate RC4 pseudo random stream for the given key, skip beginning of the
* stream, and XOR the end result with the data buffer to perform RC4
* encryption/decryption.
*/
void rc4_skip(const u8 *key, size_t keylen, size_t skip,
u8 *data, size_t data_len)
{ {
u32 i, j, k; u32 i, j, k;
u8 S[256], *pos; u8 S[256], *pos;
@ -67,4 +55,6 @@ void rc4_skip(const u8 *key, size_t keylen, size_t skip,
S_SWAP(i, j); S_SWAP(i, j);
*pos++ ^= S[(S[i] + S[j]) & 0xff]; *pos++ ^= S[(S[i] + S[j]) & 0xff];
} }
return 0;
} }

View file

@ -1,21 +0,0 @@
/*
* 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.
*/
#ifndef RC4_H
#define RC4_H
void rc4_skip(const u8 *key, size_t keylen, size_t skip,
u8 *data, size_t data_len);
#endif /* RC4_H */

View file

@ -20,7 +20,7 @@
#include "eloop.h" #include "eloop.h"
#include "eapol_common.h" #include "eapol_common.h"
#include "md5.h" #include "md5.h"
#include "rc4.h" #include "crypto.h"
#include "state_machine.h" #include "state_machine.h"
#include "wpabuf.h" #include "wpabuf.h"

View file

@ -15,7 +15,7 @@
#include "includes.h" #include "includes.h"
#include "common.h" #include "common.h"
#include "rc4.h" #include "crypto.h"
#include "aes_wrap.h" #include "aes_wrap.h"
#include "wpa.h" #include "wpa.h"
#include "eloop.h" #include "eloop.h"

View file

@ -52,7 +52,6 @@ OBJS = config.o
OBJS += ../src/utils/common.o OBJS += ../src/utils/common.o
OBJS += ../src/utils/wpa_debug.o OBJS += ../src/utils/wpa_debug.o
OBJS += ../src/utils/wpabuf.o OBJS += ../src/utils/wpabuf.o
OBJS += ../src/crypto/rc4.o
OBJS_p = wpa_passphrase.o OBJS_p = wpa_passphrase.o
OBJS_p += ../src/utils/common.o OBJS_p += ../src/utils/common.o
OBJS_p += ../src/utils/wpa_debug.o OBJS_p += ../src/utils/wpa_debug.o
@ -677,6 +676,7 @@ CONFIG_INTERNAL_AES=y
CONFIG_INTERNAL_SHA1=y CONFIG_INTERNAL_SHA1=y
CONFIG_INTERNAL_MD5=y CONFIG_INTERNAL_MD5=y
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifdef CONFIG_SMARTCARD ifdef CONFIG_SMARTCARD
ifndef CONFIG_NATIVE_WINDOWS ifndef CONFIG_NATIVE_WINDOWS
@ -732,6 +732,7 @@ OBJS_p += ../src/crypto/crypto_openssl.o
ifdef NEED_FIPS186_2_PRF ifdef NEED_FIPS186_2_PRF
OBJS += ../src/crypto/fips_prf_openssl.o OBJS += ../src/crypto/fips_prf_openssl.o
endif endif
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_TLS), gnutls) ifeq ($(CONFIG_TLS), gnutls)
OBJS += ../src/crypto/crypto_gnutls.o OBJS += ../src/crypto/crypto_gnutls.o
@ -740,17 +741,20 @@ ifdef NEED_FIPS186_2_PRF
OBJS += ../src/crypto/fips_prf_gnutls.o OBJS += ../src/crypto/fips_prf_gnutls.o
endif endif
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_TLS), schannel) ifeq ($(CONFIG_TLS), schannel)
OBJS += ../src/crypto/crypto_cryptoapi.o OBJS += ../src/crypto/crypto_cryptoapi.o
OBJS_p += ../src/crypto/crypto_cryptoapi.o OBJS_p += ../src/crypto/crypto_cryptoapi.o
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_TLS), internal) ifeq ($(CONFIG_TLS), internal)
ifeq ($(CONFIG_CRYPTO), libtomcrypt) ifeq ($(CONFIG_CRYPTO), libtomcrypt)
OBJS += ../src/crypto/crypto_libtomcrypt.o OBJS += ../src/crypto/crypto_libtomcrypt.o
OBJS_p += ../src/crypto/crypto_libtomcrypt.o OBJS_p += ../src/crypto/crypto_libtomcrypt.o
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_CRYPTO), internal) ifeq ($(CONFIG_CRYPTO), internal)
OBJS += ../src/crypto/crypto_internal.o ../src/tls/bignum.o OBJS += ../src/crypto/crypto_internal.o ../src/tls/bignum.o
@ -771,18 +775,21 @@ CONFIG_INTERNAL_SHA1=y
CONFIG_INTERNAL_MD4=y CONFIG_INTERNAL_MD4=y
CONFIG_INTERNAL_MD5=y CONFIG_INTERNAL_MD5=y
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
ifeq ($(CONFIG_CRYPTO), cryptoapi) ifeq ($(CONFIG_CRYPTO), cryptoapi)
OBJS += ../src/crypto/crypto_cryptoapi.o OBJS += ../src/crypto/crypto_cryptoapi.o
OBJS_p += ../src/crypto/crypto_cryptoapi.o OBJS_p += ../src/crypto/crypto_cryptoapi.o
CFLAGS += -DCONFIG_CRYPTO_CRYPTOAPI CFLAGS += -DCONFIG_CRYPTO_CRYPTOAPI
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
endif endif
ifeq ($(CONFIG_TLS), none) ifeq ($(CONFIG_TLS), none)
OBJS += ../src/crypto/crypto_none.o OBJS += ../src/crypto/crypto_none.o
OBJS_p += ../src/crypto/crypto_none.o OBJS_p += ../src/crypto/crypto_none.o
CONFIG_INTERNAL_SHA256=y CONFIG_INTERNAL_SHA256=y
CONFIG_INTERNAL_RC4=y
endif endif
else else
CONFIG_INTERNAL_AES=y CONFIG_INTERNAL_AES=y
@ -812,6 +819,10 @@ ifdef CONFIG_INTERNAL_DES
DESOBJS += ../src/crypto/des-internal.o DESOBJS += ../src/crypto/des-internal.o
endif endif
ifdef CONFIG_INTERNAL_RC4
OBJS += ../src/crypto/rc4.o
endif
ifdef CONFIG_IEEE80211R ifdef CONFIG_IEEE80211R
NEED_SHA256=y NEED_SHA256=y
endif endif