This repository has been archived by the owner on Oct 5, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
crypt_arc4.c
139 lines (113 loc) · 4.84 KB
/
crypt_arc4.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
*************************************************************************
* Ralink Tech Inc.
* 5F., No.36, Taiyuan St., Jhubei City,
* Hsinchu County 302,
* Taiwan, R.O.C.
*
* (c) Copyright 2002-2010, Ralink Technology, Inc.
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*************************************************************************/
#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 */