140 lines
4.5 KiB
C
140 lines
4.5 KiB
C
/****************************************************************************
|
|
* Ralink Tech Inc.
|
|
* Taiwan, R.O.C.
|
|
*
|
|
* (c) Copyright 2002, Ralink Technology, Inc.
|
|
*
|
|
* All rights reserved. Ralink's source code is an unpublished work and the
|
|
* use of a copyright notice does not imply otherwise. This source code
|
|
* contains confidential trade secret material of Ralink Tech. Any attemp
|
|
* or participation in deciphering, decoding, reverse engineering or in any
|
|
* way altering the source code is stricitly prohibited, unless the prior
|
|
* written consent of Ralink Technology, Inc. is obtained.
|
|
***************************************************************************/
|
|
|
|
|
|
/****************************************************************************
|
|
Module Name:
|
|
RC4
|
|
|
|
Abstract:
|
|
|
|
Revision History:
|
|
Who When What
|
|
-------- ---------- ------------------------------------------
|
|
Eddy 2009/05/13 ARC4
|
|
***************************************************************************/
|
|
|
|
#include "crypt_arc4.h"
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
ARC4 initialize the key block
|
|
|
|
Arguments:
|
|
pARC4_CTX Pointer to ARC4 CONTEXT
|
|
Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)
|
|
KeyLength The length of cipher key in bytes
|
|
|
|
========================================================================
|
|
*/
|
|
VOID ARC4_INIT (
|
|
IN ARC4_CTX_STRUC *pARC4_CTX,
|
|
IN PUCHAR pKey,
|
|
IN UINT KeyLength)
|
|
{
|
|
UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0;
|
|
UINT8 TempValue = 0;
|
|
|
|
/*Initialize the block value*/
|
|
pARC4_CTX->BlockIndex1 = 0;
|
|
pARC4_CTX->BlockIndex2 = 0;
|
|
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
|
pARC4_CTX->KeyBlock[BlockIndex] = (UINT8) BlockIndex;
|
|
|
|
/*Key schedule*/
|
|
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
|
{
|
|
TempValue = pARC4_CTX->KeyBlock[BlockIndex];
|
|
KeyIndex = BlockIndex % KeyLength;
|
|
SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff;
|
|
pARC4_CTX->KeyBlock[BlockIndex] = pARC4_CTX->KeyBlock[SWAPIndex];
|
|
pARC4_CTX->KeyBlock[SWAPIndex] = TempValue;
|
|
} /* End of for */
|
|
|
|
} /* End of ARC4_INIT */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
ARC4 encryption/decryption
|
|
|
|
Arguments:
|
|
pARC4_CTX Pointer to ARC4 CONTEXT
|
|
InputText Input text
|
|
InputTextLength The length of input text in bytes
|
|
|
|
Return Value:
|
|
OutputBlock Return output text
|
|
========================================================================
|
|
*/
|
|
VOID ARC4_Compute (
|
|
IN ARC4_CTX_STRUC *pARC4_CTX,
|
|
IN UINT8 InputBlock[],
|
|
IN UINT InputBlockSize,
|
|
OUT UINT8 OutputBlock[])
|
|
{
|
|
UINT InputIndex = 0;
|
|
UINT8 TempValue = 0;
|
|
|
|
for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++)
|
|
{
|
|
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
|
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
|
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
|
|
|
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
|
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
|
|
|
TempValue = (TempValue + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & 0xff;
|
|
OutputBlock[InputIndex] = InputBlock[InputIndex]^pARC4_CTX->KeyBlock[TempValue];
|
|
|
|
} /* End of for */
|
|
} /* End of ARC4_Compute */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Discard the key length
|
|
|
|
Arguments:
|
|
pARC4_CTX Pointer to ARC4 CONTEXT
|
|
Length Discard the key length
|
|
|
|
========================================================================
|
|
*/
|
|
VOID ARC4_Discard_KeyLength (
|
|
IN ARC4_CTX_STRUC *pARC4_CTX,
|
|
IN UINT Length)
|
|
{
|
|
UINT Index = 0;
|
|
UINT8 TempValue = 0;
|
|
|
|
for (Index = 0; Index < Length; Index++)
|
|
{
|
|
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
|
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
|
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
|
|
|
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
|
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
|
} /* End of for */
|
|
|
|
} /* End of ARC4_Discard_KeyLength */
|
|
|
|
|