@@ -157,375 +157,6 @@ static void teardown_sgtable(struct sg_table *sgt)
157
157
sg_free_table (sgt );
158
158
}
159
159
160
- static int ceph_aes_encrypt (const void * key , int key_len ,
161
- void * dst , size_t * dst_len ,
162
- const void * src , size_t src_len )
163
- {
164
- struct scatterlist sg_in [2 ], prealloc_sg ;
165
- struct sg_table sg_out ;
166
- struct crypto_skcipher * tfm = ceph_crypto_alloc_cipher ();
167
- SKCIPHER_REQUEST_ON_STACK (req , tfm );
168
- int ret ;
169
- char iv [AES_BLOCK_SIZE ];
170
- size_t zero_padding = (0x10 - (src_len & 0x0f ));
171
- char pad [16 ];
172
-
173
- if (IS_ERR (tfm ))
174
- return PTR_ERR (tfm );
175
-
176
- memset (pad , zero_padding , zero_padding );
177
-
178
- * dst_len = src_len + zero_padding ;
179
-
180
- sg_init_table (sg_in , 2 );
181
- sg_set_buf (& sg_in [0 ], src , src_len );
182
- sg_set_buf (& sg_in [1 ], pad , zero_padding );
183
- ret = setup_sgtable (& sg_out , & prealloc_sg , dst , * dst_len );
184
- if (ret )
185
- goto out_tfm ;
186
-
187
- crypto_skcipher_setkey ((void * )tfm , key , key_len );
188
- memcpy (iv , aes_iv , AES_BLOCK_SIZE );
189
-
190
- skcipher_request_set_tfm (req , tfm );
191
- skcipher_request_set_callback (req , 0 , NULL , NULL );
192
- skcipher_request_set_crypt (req , sg_in , sg_out .sgl ,
193
- src_len + zero_padding , iv );
194
-
195
- /*
196
- print_hex_dump(KERN_ERR, "enc key: ", DUMP_PREFIX_NONE, 16, 1,
197
- key, key_len, 1);
198
- print_hex_dump(KERN_ERR, "enc src: ", DUMP_PREFIX_NONE, 16, 1,
199
- src, src_len, 1);
200
- print_hex_dump(KERN_ERR, "enc pad: ", DUMP_PREFIX_NONE, 16, 1,
201
- pad, zero_padding, 1);
202
- */
203
- ret = crypto_skcipher_encrypt (req );
204
- skcipher_request_zero (req );
205
- if (ret < 0 ) {
206
- pr_err ("ceph_aes_crypt failed %d\n" , ret );
207
- goto out_sg ;
208
- }
209
- /*
210
- print_hex_dump(KERN_ERR, "enc out: ", DUMP_PREFIX_NONE, 16, 1,
211
- dst, *dst_len, 1);
212
- */
213
-
214
- out_sg :
215
- teardown_sgtable (& sg_out );
216
- out_tfm :
217
- crypto_free_skcipher (tfm );
218
- return ret ;
219
- }
220
-
221
- static int ceph_aes_encrypt2 (const void * key , int key_len , void * dst ,
222
- size_t * dst_len ,
223
- const void * src1 , size_t src1_len ,
224
- const void * src2 , size_t src2_len )
225
- {
226
- struct scatterlist sg_in [3 ], prealloc_sg ;
227
- struct sg_table sg_out ;
228
- struct crypto_skcipher * tfm = ceph_crypto_alloc_cipher ();
229
- SKCIPHER_REQUEST_ON_STACK (req , tfm );
230
- int ret ;
231
- char iv [AES_BLOCK_SIZE ];
232
- size_t zero_padding = (0x10 - ((src1_len + src2_len ) & 0x0f ));
233
- char pad [16 ];
234
-
235
- if (IS_ERR (tfm ))
236
- return PTR_ERR (tfm );
237
-
238
- memset (pad , zero_padding , zero_padding );
239
-
240
- * dst_len = src1_len + src2_len + zero_padding ;
241
-
242
- sg_init_table (sg_in , 3 );
243
- sg_set_buf (& sg_in [0 ], src1 , src1_len );
244
- sg_set_buf (& sg_in [1 ], src2 , src2_len );
245
- sg_set_buf (& sg_in [2 ], pad , zero_padding );
246
- ret = setup_sgtable (& sg_out , & prealloc_sg , dst , * dst_len );
247
- if (ret )
248
- goto out_tfm ;
249
-
250
- crypto_skcipher_setkey ((void * )tfm , key , key_len );
251
- memcpy (iv , aes_iv , AES_BLOCK_SIZE );
252
-
253
- skcipher_request_set_tfm (req , tfm );
254
- skcipher_request_set_callback (req , 0 , NULL , NULL );
255
- skcipher_request_set_crypt (req , sg_in , sg_out .sgl ,
256
- src1_len + src2_len + zero_padding , iv );
257
-
258
- /*
259
- print_hex_dump(KERN_ERR, "enc key: ", DUMP_PREFIX_NONE, 16, 1,
260
- key, key_len, 1);
261
- print_hex_dump(KERN_ERR, "enc src1: ", DUMP_PREFIX_NONE, 16, 1,
262
- src1, src1_len, 1);
263
- print_hex_dump(KERN_ERR, "enc src2: ", DUMP_PREFIX_NONE, 16, 1,
264
- src2, src2_len, 1);
265
- print_hex_dump(KERN_ERR, "enc pad: ", DUMP_PREFIX_NONE, 16, 1,
266
- pad, zero_padding, 1);
267
- */
268
- ret = crypto_skcipher_encrypt (req );
269
- skcipher_request_zero (req );
270
- if (ret < 0 ) {
271
- pr_err ("ceph_aes_crypt2 failed %d\n" , ret );
272
- goto out_sg ;
273
- }
274
- /*
275
- print_hex_dump(KERN_ERR, "enc out: ", DUMP_PREFIX_NONE, 16, 1,
276
- dst, *dst_len, 1);
277
- */
278
-
279
- out_sg :
280
- teardown_sgtable (& sg_out );
281
- out_tfm :
282
- crypto_free_skcipher (tfm );
283
- return ret ;
284
- }
285
-
286
- static int ceph_aes_decrypt (const void * key , int key_len ,
287
- void * dst , size_t * dst_len ,
288
- const void * src , size_t src_len )
289
- {
290
- struct sg_table sg_in ;
291
- struct scatterlist sg_out [2 ], prealloc_sg ;
292
- struct crypto_skcipher * tfm = ceph_crypto_alloc_cipher ();
293
- SKCIPHER_REQUEST_ON_STACK (req , tfm );
294
- char pad [16 ];
295
- char iv [AES_BLOCK_SIZE ];
296
- int ret ;
297
- int last_byte ;
298
-
299
- if (IS_ERR (tfm ))
300
- return PTR_ERR (tfm );
301
-
302
- sg_init_table (sg_out , 2 );
303
- sg_set_buf (& sg_out [0 ], dst , * dst_len );
304
- sg_set_buf (& sg_out [1 ], pad , sizeof (pad ));
305
- ret = setup_sgtable (& sg_in , & prealloc_sg , src , src_len );
306
- if (ret )
307
- goto out_tfm ;
308
-
309
- crypto_skcipher_setkey ((void * )tfm , key , key_len );
310
- memcpy (iv , aes_iv , AES_BLOCK_SIZE );
311
-
312
- skcipher_request_set_tfm (req , tfm );
313
- skcipher_request_set_callback (req , 0 , NULL , NULL );
314
- skcipher_request_set_crypt (req , sg_in .sgl , sg_out ,
315
- src_len , iv );
316
-
317
- /*
318
- print_hex_dump(KERN_ERR, "dec key: ", DUMP_PREFIX_NONE, 16, 1,
319
- key, key_len, 1);
320
- print_hex_dump(KERN_ERR, "dec in: ", DUMP_PREFIX_NONE, 16, 1,
321
- src, src_len, 1);
322
- */
323
- ret = crypto_skcipher_decrypt (req );
324
- skcipher_request_zero (req );
325
- if (ret < 0 ) {
326
- pr_err ("ceph_aes_decrypt failed %d\n" , ret );
327
- goto out_sg ;
328
- }
329
-
330
- if (src_len <= * dst_len )
331
- last_byte = ((char * )dst )[src_len - 1 ];
332
- else
333
- last_byte = pad [src_len - * dst_len - 1 ];
334
- if (last_byte <= 16 && src_len >= last_byte ) {
335
- * dst_len = src_len - last_byte ;
336
- } else {
337
- pr_err ("ceph_aes_decrypt got bad padding %d on src len %d\n" ,
338
- last_byte , (int )src_len );
339
- return - EPERM ; /* bad padding */
340
- }
341
- /*
342
- print_hex_dump(KERN_ERR, "dec out: ", DUMP_PREFIX_NONE, 16, 1,
343
- dst, *dst_len, 1);
344
- */
345
-
346
- out_sg :
347
- teardown_sgtable (& sg_in );
348
- out_tfm :
349
- crypto_free_skcipher (tfm );
350
- return ret ;
351
- }
352
-
353
- static int ceph_aes_decrypt2 (const void * key , int key_len ,
354
- void * dst1 , size_t * dst1_len ,
355
- void * dst2 , size_t * dst2_len ,
356
- const void * src , size_t src_len )
357
- {
358
- struct sg_table sg_in ;
359
- struct scatterlist sg_out [3 ], prealloc_sg ;
360
- struct crypto_skcipher * tfm = ceph_crypto_alloc_cipher ();
361
- SKCIPHER_REQUEST_ON_STACK (req , tfm );
362
- char pad [16 ];
363
- char iv [AES_BLOCK_SIZE ];
364
- int ret ;
365
- int last_byte ;
366
-
367
- if (IS_ERR (tfm ))
368
- return PTR_ERR (tfm );
369
-
370
- sg_init_table (sg_out , 3 );
371
- sg_set_buf (& sg_out [0 ], dst1 , * dst1_len );
372
- sg_set_buf (& sg_out [1 ], dst2 , * dst2_len );
373
- sg_set_buf (& sg_out [2 ], pad , sizeof (pad ));
374
- ret = setup_sgtable (& sg_in , & prealloc_sg , src , src_len );
375
- if (ret )
376
- goto out_tfm ;
377
-
378
- crypto_skcipher_setkey ((void * )tfm , key , key_len );
379
- memcpy (iv , aes_iv , AES_BLOCK_SIZE );
380
-
381
- skcipher_request_set_tfm (req , tfm );
382
- skcipher_request_set_callback (req , 0 , NULL , NULL );
383
- skcipher_request_set_crypt (req , sg_in .sgl , sg_out ,
384
- src_len , iv );
385
-
386
- /*
387
- print_hex_dump(KERN_ERR, "dec key: ", DUMP_PREFIX_NONE, 16, 1,
388
- key, key_len, 1);
389
- print_hex_dump(KERN_ERR, "dec in: ", DUMP_PREFIX_NONE, 16, 1,
390
- src, src_len, 1);
391
- */
392
- ret = crypto_skcipher_decrypt (req );
393
- skcipher_request_zero (req );
394
- if (ret < 0 ) {
395
- pr_err ("ceph_aes_decrypt failed %d\n" , ret );
396
- goto out_sg ;
397
- }
398
-
399
- if (src_len <= * dst1_len )
400
- last_byte = ((char * )dst1 )[src_len - 1 ];
401
- else if (src_len <= * dst1_len + * dst2_len )
402
- last_byte = ((char * )dst2 )[src_len - * dst1_len - 1 ];
403
- else
404
- last_byte = pad [src_len - * dst1_len - * dst2_len - 1 ];
405
- if (last_byte <= 16 && src_len >= last_byte ) {
406
- src_len -= last_byte ;
407
- } else {
408
- pr_err ("ceph_aes_decrypt got bad padding %d on src len %d\n" ,
409
- last_byte , (int )src_len );
410
- return - EPERM ; /* bad padding */
411
- }
412
-
413
- if (src_len < * dst1_len ) {
414
- * dst1_len = src_len ;
415
- * dst2_len = 0 ;
416
- } else {
417
- * dst2_len = src_len - * dst1_len ;
418
- }
419
- /*
420
- print_hex_dump(KERN_ERR, "dec out1: ", DUMP_PREFIX_NONE, 16, 1,
421
- dst1, *dst1_len, 1);
422
- print_hex_dump(KERN_ERR, "dec out2: ", DUMP_PREFIX_NONE, 16, 1,
423
- dst2, *dst2_len, 1);
424
- */
425
-
426
- out_sg :
427
- teardown_sgtable (& sg_in );
428
- out_tfm :
429
- crypto_free_skcipher (tfm );
430
- return ret ;
431
- }
432
-
433
-
434
- int ceph_decrypt (struct ceph_crypto_key * secret , void * dst , size_t * dst_len ,
435
- const void * src , size_t src_len )
436
- {
437
- switch (secret -> type ) {
438
- case CEPH_CRYPTO_NONE :
439
- if (* dst_len < src_len )
440
- return - ERANGE ;
441
- memcpy (dst , src , src_len );
442
- * dst_len = src_len ;
443
- return 0 ;
444
-
445
- case CEPH_CRYPTO_AES :
446
- return ceph_aes_decrypt (secret -> key , secret -> len , dst ,
447
- dst_len , src , src_len );
448
-
449
- default :
450
- return - EINVAL ;
451
- }
452
- }
453
-
454
- int ceph_decrypt2 (struct ceph_crypto_key * secret ,
455
- void * dst1 , size_t * dst1_len ,
456
- void * dst2 , size_t * dst2_len ,
457
- const void * src , size_t src_len )
458
- {
459
- size_t t ;
460
-
461
- switch (secret -> type ) {
462
- case CEPH_CRYPTO_NONE :
463
- if (* dst1_len + * dst2_len < src_len )
464
- return - ERANGE ;
465
- t = min (* dst1_len , src_len );
466
- memcpy (dst1 , src , t );
467
- * dst1_len = t ;
468
- src += t ;
469
- src_len -= t ;
470
- if (src_len ) {
471
- t = min (* dst2_len , src_len );
472
- memcpy (dst2 , src , t );
473
- * dst2_len = t ;
474
- }
475
- return 0 ;
476
-
477
- case CEPH_CRYPTO_AES :
478
- return ceph_aes_decrypt2 (secret -> key , secret -> len ,
479
- dst1 , dst1_len , dst2 , dst2_len ,
480
- src , src_len );
481
-
482
- default :
483
- return - EINVAL ;
484
- }
485
- }
486
-
487
- int ceph_encrypt (struct ceph_crypto_key * secret , void * dst , size_t * dst_len ,
488
- const void * src , size_t src_len )
489
- {
490
- switch (secret -> type ) {
491
- case CEPH_CRYPTO_NONE :
492
- if (* dst_len < src_len )
493
- return - ERANGE ;
494
- memcpy (dst , src , src_len );
495
- * dst_len = src_len ;
496
- return 0 ;
497
-
498
- case CEPH_CRYPTO_AES :
499
- return ceph_aes_encrypt (secret -> key , secret -> len , dst ,
500
- dst_len , src , src_len );
501
-
502
- default :
503
- return - EINVAL ;
504
- }
505
- }
506
-
507
- int ceph_encrypt2 (struct ceph_crypto_key * secret , void * dst , size_t * dst_len ,
508
- const void * src1 , size_t src1_len ,
509
- const void * src2 , size_t src2_len )
510
- {
511
- switch (secret -> type ) {
512
- case CEPH_CRYPTO_NONE :
513
- if (* dst_len < src1_len + src2_len )
514
- return - ERANGE ;
515
- memcpy (dst , src1 , src1_len );
516
- memcpy (dst + src1_len , src2 , src2_len );
517
- * dst_len = src1_len + src2_len ;
518
- return 0 ;
519
-
520
- case CEPH_CRYPTO_AES :
521
- return ceph_aes_encrypt2 (secret -> key , secret -> len , dst , dst_len ,
522
- src1 , src1_len , src2 , src2_len );
523
-
524
- default :
525
- return - EINVAL ;
526
- }
527
- }
528
-
529
160
static int ceph_aes_crypt (const struct ceph_crypto_key * key , bool encrypt ,
530
161
void * buf , int buf_len , int in_len , int * pout_len )
531
162
{
0 commit comments