/* ****************************************************************************** * INTERPEAK SOURCE FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ip8021x_rc4.c,v $ $Revision: 1.3 $ * $Source: /home/interpeak/CVSRoot/ip8021x/src/ip8021x_rc4.c,v $ * $Author: myakan $ * $State: Exp $ $Locker: $ * * Copyright 2000-2006 Interpeak AB (http://www.interpeak.se). All rights reserved. * Design and implementation by Roger Boden ****************************************************************************** */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ip8021x_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include #include #include "ip8021x.h" #include "ip8021x_h.h" /* **************************************************************************** * 4 DEFINES **************************************************************************** */ #define IP8021X_RC4_SWAP(a,b) do { Ip_u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 8 DATA **************************************************************************** */ /* **************************************************************************** * 9 STATIC FUNCTIONS **************************************************************************** */ /* **************************************************************************** * 10 GLOBAL FUNCTIONS **************************************************************************** */ /* *=========================================================================== * ip8021x_rc4_skip *=========================================================================== * Description: * Parameters: * Returns: * */ IP_GLOBAL void ip8021x_rc4_skip(Ip_u8 *key, Ip_size_t keylen, Ip_size_t skip, Ip_u8 *data, Ip_size_t data_len) { Ip_u32 i; Ip_u32 j; Ip_u32 k; Ip_u8 S[256]; unsigned int pos; /* Initialize RC4 S-box */ for (i = 0; i < 256; i++) S[i] = i; /*lint !e734*/ j = 0; pos = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + key[pos]) & 0xff; pos++; if (pos >= keylen) pos = 0; IP8021X_RC4_SWAP(i, j); } /* Skip the first 'skip' bytes of the key stream */ i = 0; j = 0; for (k = 0; k < skip; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; IP8021X_RC4_SWAP(i, j); } /* Encrypt/decrypt the data */ for (k = 0; k < data_len; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; IP8021X_RC4_SWAP(i, j); *data++ ^= S[(S[i] + S[j]) & 0xff]; } } /* *=========================================================================== * ip8021x_rc4 *=========================================================================== * Description: * Parameters: * Returns: * */ IP_GLOBAL void ip8021x_rc4(Ip_u8 *key, Ip_size_t key_len, Ip_u8 *buf, Ip_size_t len) { ip8021x_rc4_skip(key, key_len, 0, buf, len); } /* **************************************************************************** * 11 PUBLIC FUNCTIONS **************************************************************************** */ /* **************************************************************************** * END OF FILE **************************************************************************** */