17
17
*/
18
18
#include <crypto/internal/hash.h>
19
19
#include <crypto/md5.h>
20
- #include <linux/init .h>
20
+ #include <linux/kernel .h>
21
21
#include <linux/module.h>
22
22
#include <linux/string.h>
23
- #include <linux/types.h>
24
- #include <asm/byteorder.h>
25
23
26
24
const u8 md5_zero_message_hash [MD5_DIGEST_SIZE ] = {
27
25
0xd4 , 0x1d , 0x8c , 0xd9 , 0x8f , 0x00 , 0xb2 , 0x04 ,
@@ -120,10 +118,11 @@ static void md5_transform(__u32 *hash, __u32 const *in)
120
118
hash [3 ] += d ;
121
119
}
122
120
123
- static inline void md5_transform_helper (struct md5_state * ctx )
121
+ static inline void md5_transform_helper (struct md5_state * ctx ,
122
+ u32 block [MD5_BLOCK_WORDS ])
124
123
{
125
- le32_to_cpu_array (ctx -> block , sizeof ( ctx -> block ) / sizeof ( u32 ) );
126
- md5_transform (ctx -> hash , ctx -> block );
124
+ le32_to_cpu_array (block , MD5_BLOCK_WORDS );
125
+ md5_transform (ctx -> hash , block );
127
126
}
128
127
129
128
static int md5_init (struct shash_desc * desc )
@@ -142,91 +141,66 @@ static int md5_init(struct shash_desc *desc)
142
141
static int md5_update (struct shash_desc * desc , const u8 * data , unsigned int len )
143
142
{
144
143
struct md5_state * mctx = shash_desc_ctx (desc );
145
- const u32 avail = sizeof ( mctx -> block ) - ( mctx -> byte_count & 0x3f ) ;
144
+ u32 block [ MD5_BLOCK_WORDS ] ;
146
145
147
146
mctx -> byte_count += len ;
148
-
149
- if (avail > len ) {
150
- memcpy ((char * )mctx -> block + (sizeof (mctx -> block ) - avail ),
151
- data , len );
152
- return 0 ;
153
- }
154
-
155
- memcpy ((char * )mctx -> block + (sizeof (mctx -> block ) - avail ),
156
- data , avail );
157
-
158
- md5_transform_helper (mctx );
159
- data += avail ;
160
- len -= avail ;
161
-
162
- while (len >= sizeof (mctx -> block )) {
163
- memcpy (mctx -> block , data , sizeof (mctx -> block ));
164
- md5_transform_helper (mctx );
165
- data += sizeof (mctx -> block );
166
- len -= sizeof (mctx -> block );
167
- }
168
-
169
- memcpy (mctx -> block , data , len );
170
-
171
- return 0 ;
147
+ do {
148
+ memcpy (block , data , sizeof (block ));
149
+ md5_transform_helper (mctx , block );
150
+ data += sizeof (block );
151
+ len -= sizeof (block );
152
+ } while (len >= sizeof (block ));
153
+ memzero_explicit (block , sizeof (block ));
154
+ mctx -> byte_count -= len ;
155
+ return len ;
172
156
}
173
157
174
- static int md5_final (struct shash_desc * desc , u8 * out )
158
+ static int md5_finup (struct shash_desc * desc , const u8 * data , unsigned int len ,
159
+ u8 * out )
175
160
{
176
161
struct md5_state * mctx = shash_desc_ctx (desc );
177
- const unsigned int offset = mctx -> byte_count & 0x3f ;
178
- char * p = (char * )mctx -> block + offset ;
179
- int padding = 56 - (offset + 1 );
162
+ u32 block [MD5_BLOCK_WORDS ];
163
+ unsigned int offset ;
164
+ int padding ;
165
+ char * p ;
166
+
167
+ memcpy (block , data , len );
168
+
169
+ offset = len ;
170
+ p = (char * )block + offset ;
171
+ padding = 56 - (offset + 1 );
180
172
181
173
* p ++ = 0x80 ;
182
174
if (padding < 0 ) {
183
175
memset (p , 0x00 , padding + sizeof (u64 ));
184
- md5_transform_helper (mctx );
185
- p = (char * )mctx -> block ;
176
+ md5_transform_helper (mctx , block );
177
+ p = (char * )block ;
186
178
padding = 56 ;
187
179
}
188
180
189
181
memset (p , 0 , padding );
190
- mctx -> block [14 ] = mctx -> byte_count << 3 ;
191
- mctx -> block [15 ] = mctx -> byte_count >> 29 ;
192
- le32_to_cpu_array (mctx -> block , (sizeof (mctx -> block ) -
193
- sizeof (u64 )) / sizeof (u32 ));
194
- md5_transform (mctx -> hash , mctx -> block );
182
+ mctx -> byte_count += len ;
183
+ block [14 ] = mctx -> byte_count << 3 ;
184
+ block [15 ] = mctx -> byte_count >> 29 ;
185
+ le32_to_cpu_array (block , (sizeof (block ) - sizeof (u64 )) / sizeof (u32 ));
186
+ md5_transform (mctx -> hash , block );
187
+ memzero_explicit (block , sizeof (block ));
195
188
cpu_to_le32_array (mctx -> hash , sizeof (mctx -> hash ) / sizeof (u32 ));
196
189
memcpy (out , mctx -> hash , sizeof (mctx -> hash ));
197
- memset (mctx , 0 , sizeof (* mctx ));
198
-
199
- return 0 ;
200
- }
201
-
202
- static int md5_export (struct shash_desc * desc , void * out )
203
- {
204
- struct md5_state * ctx = shash_desc_ctx (desc );
205
-
206
- memcpy (out , ctx , sizeof (* ctx ));
207
- return 0 ;
208
- }
209
-
210
- static int md5_import (struct shash_desc * desc , const void * in )
211
- {
212
- struct md5_state * ctx = shash_desc_ctx (desc );
213
190
214
- memcpy (ctx , in , sizeof (* ctx ));
215
191
return 0 ;
216
192
}
217
193
218
194
static struct shash_alg alg = {
219
195
.digestsize = MD5_DIGEST_SIZE ,
220
196
.init = md5_init ,
221
197
.update = md5_update ,
222
- .final = md5_final ,
223
- .export = md5_export ,
224
- .import = md5_import ,
225
- .descsize = sizeof (struct md5_state ),
226
- .statesize = sizeof (struct md5_state ),
198
+ .finup = md5_finup ,
199
+ .descsize = MD5_STATE_SIZE ,
227
200
.base = {
228
201
.cra_name = "md5" ,
229
202
.cra_driver_name = "md5-generic" ,
203
+ .cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY ,
230
204
.cra_blocksize = MD5_HMAC_BLOCK_SIZE ,
231
205
.cra_module = THIS_MODULE ,
232
206
}
0 commit comments