166 lines
4.5 KiB
C
166 lines
4.5 KiB
C
/*
|
|
******************************************************************************
|
|
* 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 <roger@interpeak.se>
|
|
******************************************************************************
|
|
*/
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 1 DESCRIPTION
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 2 CONFIGURATION
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include "ip8021x_config.h"
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 3 INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include <ipcom_type.h>
|
|
#include <ipcom_cstyle.h>
|
|
|
|
#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
|
|
****************************************************************************
|
|
*/
|
|
|