]>
Commit | Line | Data |
---|---|---|
ca97b838 BZ |
1 | /* |
2 | ************************************************************************* | |
3 | * Ralink Tech Inc. | |
4 | * 5F., No.36, Taiyuan St., Jhubei City, | |
5 | * Hsinchu County 302, | |
6 | * Taiwan, R.O.C. | |
7 | * | |
8 | * (c) Copyright 2002-2007, Ralink Technology, Inc. | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify * | |
11 | * it under the terms of the GNU General Public License as published by * | |
12 | * the Free Software Foundation; either version 2 of the License, or * | |
13 | * (at your option) any later version. * | |
14 | * * | |
15 | * This program is distributed in the hope that it will be useful, * | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
18 | * GNU General Public License for more details. * | |
19 | * * | |
20 | * You should have received a copy of the GNU General Public License * | |
21 | * along with this program; if not, write to the * | |
22 | * Free Software Foundation, Inc., * | |
23 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |
24 | * * | |
25 | *************************************************************************/ | |
26 | ||
27 | #include "../crypt_hmac.h" | |
28 | ||
ca97b838 BZ |
29 | #ifdef HMAC_SHA1_SUPPORT |
30 | /* | |
31 | ======================================================================== | |
32 | Routine Description: | |
33 | HMAC using SHA1 hash function | |
34 | ||
35 | Arguments: | |
36 | key Secret key | |
37 | key_len The length of the key in bytes | |
38 | message Message context | |
39 | message_len The length of message in bytes | |
40 | macLen Request the length of message authentication code | |
41 | ||
42 | Return Value: | |
43 | mac Message authentication code | |
44 | ||
45 | Note: | |
46 | None | |
47 | ======================================================================== | |
48 | */ | |
51126deb BZ |
49 | void HMAC_SHA1(IN const u8 Key[], |
50 | u32 KeyLen, | |
51 | IN const u8 Message[], | |
52 | u32 MessageLen, u8 MAC[], u32 MACLen) | |
ca97b838 | 53 | { |
62eb734b BZ |
54 | struct rt_sha1_ctx sha_ctx1; |
55 | struct rt_sha1_ctx sha_ctx2; | |
51126deb BZ |
56 | u8 K0[SHA1_BLOCK_SIZE]; |
57 | u8 Digest[SHA1_DIGEST_SIZE]; | |
58 | u32 index; | |
96b3c83d | 59 | |
62eb734b BZ |
60 | NdisZeroMemory(&sha_ctx1, sizeof(struct rt_sha1_ctx)); |
61 | NdisZeroMemory(&sha_ctx2, sizeof(struct rt_sha1_ctx)); | |
96b3c83d BZ |
62 | /* |
63 | * If the length of K = B(Block size): K0 = K. | |
64 | * If the length of K > B: hash K to obtain an L byte string, | |
65 | * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). | |
66 | * If the length of K < B: append zeros to the end of K to create a B-byte string K0 | |
67 | */ | |
68 | NdisZeroMemory(K0, SHA1_BLOCK_SIZE); | |
69 | if (KeyLen <= SHA1_BLOCK_SIZE) | |
70 | NdisMoveMemory(K0, Key, KeyLen); | |
71 | else | |
72 | RT_SHA1(Key, KeyLen, K0); | |
73 | /* End of if */ | |
74 | ||
75 | /* Exclusive-Or K0 with ipad */ | |
76 | /* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */ | |
77 | for (index = 0; index < SHA1_BLOCK_SIZE; index++) | |
78 | K0[index] ^= 0x36; | |
79 | /* End of for */ | |
80 | ||
81 | RT_SHA1_Init(&sha_ctx1); | |
82 | /* H(K0^ipad) */ | |
83 | SHA1_Append(&sha_ctx1, K0, sizeof(K0)); | |
84 | /* H((K0^ipad)||text) */ | |
85 | SHA1_Append(&sha_ctx1, Message, MessageLen); | |
86 | SHA1_End(&sha_ctx1, Digest); | |
87 | ||
88 | /* Exclusive-Or K0 with opad and remove ipad */ | |
89 | /* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */ | |
90 | for (index = 0; index < SHA1_BLOCK_SIZE; index++) | |
91 | K0[index] ^= 0x36 ^ 0x5c; | |
92 | /* End of for */ | |
93 | ||
94 | RT_SHA1_Init(&sha_ctx2); | |
95 | /* H(K0^opad) */ | |
96 | SHA1_Append(&sha_ctx2, K0, sizeof(K0)); | |
97 | /* H( (K0^opad) || H((K0^ipad)||text) ) */ | |
98 | SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE); | |
99 | SHA1_End(&sha_ctx2, Digest); | |
100 | ||
101 | if (MACLen > SHA1_DIGEST_SIZE) | |
102 | NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE); | |
103 | else | |
104 | NdisMoveMemory(MAC, Digest, MACLen); | |
105 | } /* End of HMAC_SHA1 */ | |
ca97b838 BZ |
106 | #endif /* HMAC_SHA1_SUPPORT */ |
107 | ||
108 | #ifdef HMAC_MD5_SUPPORT | |
109 | /* | |
110 | ======================================================================== | |
111 | Routine Description: | |
112 | HMAC using MD5 hash function | |
113 | ||
114 | Arguments: | |
115 | key Secret key | |
116 | key_len The length of the key in bytes | |
117 | message Message context | |
118 | message_len The length of message in bytes | |
119 | macLen Request the length of message authentication code | |
120 | ||
121 | Return Value: | |
122 | mac Message authentication code | |
123 | ||
124 | Note: | |
125 | None | |
126 | ======================================================================== | |
127 | */ | |
51126deb BZ |
128 | void HMAC_MD5(IN const u8 Key[], |
129 | u32 KeyLen, | |
130 | IN const u8 Message[], | |
131 | u32 MessageLen, u8 MAC[], u32 MACLen) | |
ca97b838 | 132 | { |
62eb734b BZ |
133 | struct rt_md5_ctx_struc md5_ctx1; |
134 | struct rt_md5_ctx_struc md5_ctx2; | |
51126deb BZ |
135 | u8 K0[MD5_BLOCK_SIZE]; |
136 | u8 Digest[MD5_DIGEST_SIZE]; | |
137 | u32 index; | |
96b3c83d | 138 | |
62eb734b BZ |
139 | NdisZeroMemory(&md5_ctx1, sizeof(struct rt_md5_ctx_struc)); |
140 | NdisZeroMemory(&md5_ctx2, sizeof(struct rt_md5_ctx_struc)); | |
96b3c83d BZ |
141 | /* |
142 | * If the length of K = B(Block size): K0 = K. | |
143 | * If the length of K > B: hash K to obtain an L byte string, | |
144 | * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00). | |
145 | * If the length of K < B: append zeros to the end of K to create a B-byte string K0 | |
146 | */ | |
147 | NdisZeroMemory(K0, MD5_BLOCK_SIZE); | |
148 | if (KeyLen <= MD5_BLOCK_SIZE) { | |
149 | NdisMoveMemory(K0, Key, KeyLen); | |
150 | } else { | |
151 | RT_MD5(Key, KeyLen, K0); | |
152 | } | |
153 | ||
154 | /* Exclusive-Or K0 with ipad */ | |
155 | /* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */ | |
156 | for (index = 0; index < MD5_BLOCK_SIZE; index++) | |
157 | K0[index] ^= 0x36; | |
158 | /* End of for */ | |
159 | ||
160 | MD5_Init(&md5_ctx1); | |
161 | /* H(K0^ipad) */ | |
162 | MD5_Append(&md5_ctx1, K0, sizeof(K0)); | |
163 | /* H((K0^ipad)||text) */ | |
164 | MD5_Append(&md5_ctx1, Message, MessageLen); | |
165 | MD5_End(&md5_ctx1, Digest); | |
166 | ||
167 | /* Exclusive-Or K0 with opad and remove ipad */ | |
168 | /* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */ | |
169 | for (index = 0; index < MD5_BLOCK_SIZE; index++) | |
170 | K0[index] ^= 0x36 ^ 0x5c; | |
171 | /* End of for */ | |
172 | ||
173 | MD5_Init(&md5_ctx2); | |
174 | /* H(K0^opad) */ | |
175 | MD5_Append(&md5_ctx2, K0, sizeof(K0)); | |
176 | /* H( (K0^opad) || H((K0^ipad)||text) ) */ | |
177 | MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE); | |
178 | MD5_End(&md5_ctx2, Digest); | |
179 | ||
180 | if (MACLen > MD5_DIGEST_SIZE) | |
181 | NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE); | |
182 | else | |
183 | NdisMoveMemory(MAC, Digest, MACLen); | |
184 | } /* End of HMAC_SHA256 */ | |
ca97b838 BZ |
185 | #endif /* HMAC_MD5_SUPPORT */ |
186 | ||
187 | /* End of crypt_hmac.c */ |