34
34
#include <linux/cryptohash.h>
35
35
#include <linux/types.h>
36
36
#include <crypto/sha.h>
37
- #include <asm/byteorder .h>
37
+ #include <crypto/sha512_base .h>
38
38
#include <asm/i387.h>
39
39
#include <asm/xcr.h>
40
40
#include <asm/xsave.h>
41
41
42
42
#include <linux/string.h>
43
43
44
- asmlinkage void sha512_transform_ssse3 (const char * data , u64 * digest ,
45
- u64 rounds );
44
+ asmlinkage void sha512_transform_ssse3 (u64 * digest , const char * data ,
45
+ u64 rounds );
46
46
#ifdef CONFIG_AS_AVX
47
- asmlinkage void sha512_transform_avx (const char * data , u64 * digest ,
47
+ asmlinkage void sha512_transform_avx (u64 * digest , const char * data ,
48
48
u64 rounds );
49
49
#endif
50
50
#ifdef CONFIG_AS_AVX2
51
- asmlinkage void sha512_transform_rorx (const char * data , u64 * digest ,
52
- u64 rounds );
51
+ asmlinkage void sha512_transform_rorx (u64 * digest , const char * data ,
52
+ u64 rounds );
53
53
#endif
54
54
55
- static asmlinkage void (* sha512_transform_asm )(const char * , u64 * , u64 );
56
-
57
-
58
- static int sha512_ssse3_init (struct shash_desc * desc )
59
- {
60
- struct sha512_state * sctx = shash_desc_ctx (desc );
61
-
62
- sctx -> state [0 ] = SHA512_H0 ;
63
- sctx -> state [1 ] = SHA512_H1 ;
64
- sctx -> state [2 ] = SHA512_H2 ;
65
- sctx -> state [3 ] = SHA512_H3 ;
66
- sctx -> state [4 ] = SHA512_H4 ;
67
- sctx -> state [5 ] = SHA512_H5 ;
68
- sctx -> state [6 ] = SHA512_H6 ;
69
- sctx -> state [7 ] = SHA512_H7 ;
70
- sctx -> count [0 ] = sctx -> count [1 ] = 0 ;
71
-
72
- return 0 ;
73
- }
55
+ static void (* sha512_transform_asm )(u64 * , const char * , u64 );
74
56
75
- static int __sha512_ssse3_update (struct shash_desc * desc , const u8 * data ,
76
- unsigned int len , unsigned int partial )
57
+ static int sha512_ssse3_update (struct shash_desc * desc , const u8 * data ,
58
+ unsigned int len )
77
59
{
78
60
struct sha512_state * sctx = shash_desc_ctx (desc );
79
- unsigned int done = 0 ;
80
-
81
- sctx -> count [0 ] += len ;
82
- if (sctx -> count [0 ] < len )
83
- sctx -> count [1 ]++ ;
84
61
85
- if (partial ) {
86
- done = SHA512_BLOCK_SIZE - partial ;
87
- memcpy (sctx -> buf + partial , data , done );
88
- sha512_transform_asm (sctx -> buf , sctx -> state , 1 );
89
- }
90
-
91
- if (len - done >= SHA512_BLOCK_SIZE ) {
92
- const unsigned int rounds = (len - done ) / SHA512_BLOCK_SIZE ;
62
+ if (!irq_fpu_usable () ||
63
+ (sctx -> count [0 ] % SHA512_BLOCK_SIZE ) + len < SHA512_BLOCK_SIZE )
64
+ return crypto_sha512_update (desc , data , len );
93
65
94
- sha512_transform_asm (data + done , sctx -> state , (u64 ) rounds );
95
-
96
- done += rounds * SHA512_BLOCK_SIZE ;
97
- }
66
+ /* make sure casting to sha512_block_fn() is safe */
67
+ BUILD_BUG_ON (offsetof(struct sha512_state , state ) != 0 );
98
68
99
- memcpy (sctx -> buf , data + done , len - done );
69
+ kernel_fpu_begin ();
70
+ sha512_base_do_update (desc , data , len ,
71
+ (sha512_block_fn * )sha512_transform_asm );
72
+ kernel_fpu_end ();
100
73
101
74
return 0 ;
102
75
}
103
76
104
- static int sha512_ssse3_update (struct shash_desc * desc , const u8 * data ,
105
- unsigned int len )
77
+ static int sha512_ssse3_finup (struct shash_desc * desc , const u8 * data ,
78
+ unsigned int len , u8 * out )
106
79
{
107
- struct sha512_state * sctx = shash_desc_ctx (desc );
108
- unsigned int partial = sctx -> count [0 ] % SHA512_BLOCK_SIZE ;
109
- int res ;
110
-
111
- /* Handle the fast case right here */
112
- if (partial + len < SHA512_BLOCK_SIZE ) {
113
- sctx -> count [0 ] += len ;
114
- if (sctx -> count [0 ] < len )
115
- sctx -> count [1 ]++ ;
116
- memcpy (sctx -> buf + partial , data , len );
117
-
118
- return 0 ;
119
- }
80
+ if (!irq_fpu_usable ())
81
+ return crypto_sha512_finup (desc , data , len , out );
120
82
121
- if (!irq_fpu_usable ()) {
122
- res = crypto_sha512_update (desc , data , len );
123
- } else {
124
- kernel_fpu_begin ();
125
- res = __sha512_ssse3_update (desc , data , len , partial );
126
- kernel_fpu_end ();
127
- }
83
+ kernel_fpu_begin ();
84
+ if (len )
85
+ sha512_base_do_update (desc , data , len ,
86
+ (sha512_block_fn * )sha512_transform_asm );
87
+ sha512_base_do_finalize (desc , (sha512_block_fn * )sha512_transform_asm );
88
+ kernel_fpu_end ();
128
89
129
- return res ;
90
+ return sha512_base_finish ( desc , out ) ;
130
91
}
131
92
132
-
133
93
/* Add padding and return the message digest. */
134
94
static int sha512_ssse3_final (struct shash_desc * desc , u8 * out )
135
95
{
136
- struct sha512_state * sctx = shash_desc_ctx (desc );
137
- unsigned int i , index , padlen ;
138
- __be64 * dst = (__be64 * )out ;
139
- __be64 bits [2 ];
140
- static const u8 padding [SHA512_BLOCK_SIZE ] = { 0x80 , };
141
-
142
- /* save number of bits */
143
- bits [1 ] = cpu_to_be64 (sctx -> count [0 ] << 3 );
144
- bits [0 ] = cpu_to_be64 (sctx -> count [1 ] << 3 | sctx -> count [0 ] >> 61 );
145
-
146
- /* Pad out to 112 mod 128 and append length */
147
- index = sctx -> count [0 ] & 0x7f ;
148
- padlen = (index < 112 ) ? (112 - index ) : ((128 + 112 ) - index );
149
-
150
- if (!irq_fpu_usable ()) {
151
- crypto_sha512_update (desc , padding , padlen );
152
- crypto_sha512_update (desc , (const u8 * )& bits , sizeof (bits ));
153
- } else {
154
- kernel_fpu_begin ();
155
- /* We need to fill a whole block for __sha512_ssse3_update() */
156
- if (padlen <= 112 ) {
157
- sctx -> count [0 ] += padlen ;
158
- if (sctx -> count [0 ] < padlen )
159
- sctx -> count [1 ]++ ;
160
- memcpy (sctx -> buf + index , padding , padlen );
161
- } else {
162
- __sha512_ssse3_update (desc , padding , padlen , index );
163
- }
164
- __sha512_ssse3_update (desc , (const u8 * )& bits ,
165
- sizeof (bits ), 112 );
166
- kernel_fpu_end ();
167
- }
168
-
169
- /* Store state in digest */
170
- for (i = 0 ; i < 8 ; i ++ )
171
- dst [i ] = cpu_to_be64 (sctx -> state [i ]);
172
-
173
- /* Wipe context */
174
- memset (sctx , 0 , sizeof (* sctx ));
175
-
176
- return 0 ;
177
- }
178
-
179
- static int sha512_ssse3_export (struct shash_desc * desc , void * out )
180
- {
181
- struct sha512_state * sctx = shash_desc_ctx (desc );
182
-
183
- memcpy (out , sctx , sizeof (* sctx ));
184
-
185
- return 0 ;
186
- }
187
-
188
- static int sha512_ssse3_import (struct shash_desc * desc , const void * in )
189
- {
190
- struct sha512_state * sctx = shash_desc_ctx (desc );
191
-
192
- memcpy (sctx , in , sizeof (* sctx ));
193
-
194
- return 0 ;
195
- }
196
-
197
- static int sha384_ssse3_init (struct shash_desc * desc )
198
- {
199
- struct sha512_state * sctx = shash_desc_ctx (desc );
200
-
201
- sctx -> state [0 ] = SHA384_H0 ;
202
- sctx -> state [1 ] = SHA384_H1 ;
203
- sctx -> state [2 ] = SHA384_H2 ;
204
- sctx -> state [3 ] = SHA384_H3 ;
205
- sctx -> state [4 ] = SHA384_H4 ;
206
- sctx -> state [5 ] = SHA384_H5 ;
207
- sctx -> state [6 ] = SHA384_H6 ;
208
- sctx -> state [7 ] = SHA384_H7 ;
209
-
210
- sctx -> count [0 ] = sctx -> count [1 ] = 0 ;
211
-
212
- return 0 ;
213
- }
214
-
215
- static int sha384_ssse3_final (struct shash_desc * desc , u8 * hash )
216
- {
217
- u8 D [SHA512_DIGEST_SIZE ];
218
-
219
- sha512_ssse3_final (desc , D );
220
-
221
- memcpy (hash , D , SHA384_DIGEST_SIZE );
222
- memzero_explicit (D , SHA512_DIGEST_SIZE );
223
-
224
- return 0 ;
96
+ return sha512_ssse3_finup (desc , NULL , 0 , out );
225
97
}
226
98
227
99
static struct shash_alg algs [] = { {
228
100
.digestsize = SHA512_DIGEST_SIZE ,
229
- .init = sha512_ssse3_init ,
101
+ .init = sha512_base_init ,
230
102
.update = sha512_ssse3_update ,
231
103
.final = sha512_ssse3_final ,
232
- .export = sha512_ssse3_export ,
233
- .import = sha512_ssse3_import ,
104
+ .finup = sha512_ssse3_finup ,
234
105
.descsize = sizeof (struct sha512_state ),
235
- .statesize = sizeof (struct sha512_state ),
236
106
.base = {
237
107
.cra_name = "sha512" ,
238
108
.cra_driver_name = "sha512-ssse3" ,
@@ -243,13 +113,11 @@ static struct shash_alg algs[] = { {
243
113
}
244
114
}, {
245
115
.digestsize = SHA384_DIGEST_SIZE ,
246
- .init = sha384_ssse3_init ,
116
+ .init = sha384_base_init ,
247
117
.update = sha512_ssse3_update ,
248
- .final = sha384_ssse3_final ,
249
- .export = sha512_ssse3_export ,
250
- .import = sha512_ssse3_import ,
118
+ .final = sha512_ssse3_final ,
119
+ .finup = sha512_ssse3_finup ,
251
120
.descsize = sizeof (struct sha512_state ),
252
- .statesize = sizeof (struct sha512_state ),
253
121
.base = {
254
122
.cra_name = "sha384" ,
255
123
.cra_driver_name = "sha384-ssse3" ,
0 commit comments