diff options
-rw-r--r-- | drivers/crypto/n2_core.c | 95 |
1 files changed, 48 insertions, 47 deletions
diff --git a/drivers/crypto/n2_core.c b/drivers/crypto/n2_core.c index 5613b8affe11..23163fda5035 100644 --- a/drivers/crypto/n2_core.c +++ b/drivers/crypto/n2_core.c | |||
@@ -251,16 +251,10 @@ static void n2_base_ctx_init(struct n2_base_ctx *ctx) | |||
251 | struct n2_hash_ctx { | 251 | struct n2_hash_ctx { |
252 | struct n2_base_ctx base; | 252 | struct n2_base_ctx base; |
253 | 253 | ||
254 | struct crypto_ahash *fallback; | 254 | struct crypto_ahash *fallback_tfm; |
255 | }; | ||
255 | 256 | ||
256 | /* These next three members must match the layout created by | 257 | struct n2_hash_req_ctx { |
257 | * crypto_init_shash_ops_async. This allows us to properly | ||
258 | * plumb requests we can't do in hardware down to the fallback | ||
259 | * operation, providing all of the data structures and layouts | ||
260 | * expected by those paths. | ||
261 | */ | ||
262 | struct ahash_request fallback_req; | ||
263 | struct shash_desc fallback_desc; | ||
264 | union { | 258 | union { |
265 | struct md5_state md5; | 259 | struct md5_state md5; |
266 | struct sha1_state sha1; | 260 | struct sha1_state sha1; |
@@ -269,56 +263,62 @@ struct n2_hash_ctx { | |||
269 | 263 | ||
270 | unsigned char hash_key[64]; | 264 | unsigned char hash_key[64]; |
271 | unsigned char keyed_zero_hash[32]; | 265 | unsigned char keyed_zero_hash[32]; |
266 | |||
267 | struct ahash_request fallback_req; | ||
272 | }; | 268 | }; |
273 | 269 | ||
274 | static int n2_hash_async_init(struct ahash_request *req) | 270 | static int n2_hash_async_init(struct ahash_request *req) |
275 | { | 271 | { |
272 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); | ||
276 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 273 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); |
277 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 274 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); |
278 | 275 | ||
279 | ctx->fallback_req.base.tfm = crypto_ahash_tfm(ctx->fallback); | 276 | ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm); |
280 | ctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 277 | rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; |
281 | 278 | ||
282 | return crypto_ahash_init(&ctx->fallback_req); | 279 | return crypto_ahash_init(&rctx->fallback_req); |
283 | } | 280 | } |
284 | 281 | ||
285 | static int n2_hash_async_update(struct ahash_request *req) | 282 | static int n2_hash_async_update(struct ahash_request *req) |
286 | { | 283 | { |
284 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); | ||
287 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 285 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); |
288 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 286 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); |
289 | 287 | ||
290 | ctx->fallback_req.base.tfm = crypto_ahash_tfm(ctx->fallback); | 288 | ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm); |
291 | ctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 289 | rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; |
292 | ctx->fallback_req.nbytes = req->nbytes; | 290 | rctx->fallback_req.nbytes = req->nbytes; |
293 | ctx->fallback_req.src = req->src; | 291 | rctx->fallback_req.src = req->src; |
294 | 292 | ||
295 | return crypto_ahash_update(&ctx->fallback_req); | 293 | return crypto_ahash_update(&rctx->fallback_req); |
296 | } | 294 | } |
297 | 295 | ||
298 | static int n2_hash_async_final(struct ahash_request *req) | 296 | static int n2_hash_async_final(struct ahash_request *req) |
299 | { | 297 | { |
298 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); | ||
300 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 299 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); |
301 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 300 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); |
302 | 301 | ||
303 | ctx->fallback_req.base.tfm = crypto_ahash_tfm(ctx->fallback); | 302 | ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm); |
304 | ctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 303 | rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; |
305 | ctx->fallback_req.result = req->result; | 304 | rctx->fallback_req.result = req->result; |
306 | 305 | ||
307 | return crypto_ahash_final(&ctx->fallback_req); | 306 | return crypto_ahash_final(&rctx->fallback_req); |
308 | } | 307 | } |
309 | 308 | ||
310 | static int n2_hash_async_finup(struct ahash_request *req) | 309 | static int n2_hash_async_finup(struct ahash_request *req) |
311 | { | 310 | { |
311 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); | ||
312 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 312 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); |
313 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 313 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); |
314 | 314 | ||
315 | ctx->fallback_req.base.tfm = crypto_ahash_tfm(ctx->fallback); | 315 | ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm); |
316 | ctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 316 | rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; |
317 | ctx->fallback_req.nbytes = req->nbytes; | 317 | rctx->fallback_req.nbytes = req->nbytes; |
318 | ctx->fallback_req.src = req->src; | 318 | rctx->fallback_req.src = req->src; |
319 | ctx->fallback_req.result = req->result; | 319 | rctx->fallback_req.result = req->result; |
320 | 320 | ||
321 | return crypto_ahash_finup(&ctx->fallback_req); | 321 | return crypto_ahash_finup(&rctx->fallback_req); |
322 | } | 322 | } |
323 | 323 | ||
324 | static int n2_hash_cra_init(struct crypto_tfm *tfm) | 324 | static int n2_hash_cra_init(struct crypto_tfm *tfm) |
@@ -338,7 +338,10 @@ static int n2_hash_cra_init(struct crypto_tfm *tfm) | |||
338 | goto out; | 338 | goto out; |
339 | } | 339 | } |
340 | 340 | ||
341 | ctx->fallback = fallback_tfm; | 341 | crypto_ahash_set_reqsize(ahash, (sizeof(struct n2_hash_req_ctx) + |
342 | crypto_ahash_reqsize(fallback_tfm))); | ||
343 | |||
344 | ctx->fallback_tfm = fallback_tfm; | ||
342 | return 0; | 345 | return 0; |
343 | 346 | ||
344 | out: | 347 | out: |
@@ -350,7 +353,7 @@ static void n2_hash_cra_exit(struct crypto_tfm *tfm) | |||
350 | struct crypto_ahash *ahash = __crypto_ahash_cast(tfm); | 353 | struct crypto_ahash *ahash = __crypto_ahash_cast(tfm); |
351 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash); | 354 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash); |
352 | 355 | ||
353 | crypto_free_ahash(ctx->fallback); | 356 | crypto_free_ahash(ctx->fallback_tfm); |
354 | } | 357 | } |
355 | 358 | ||
356 | static unsigned long wait_for_tail(struct spu_queue *qp) | 359 | static unsigned long wait_for_tail(struct spu_queue *qp) |
@@ -399,14 +402,16 @@ static int n2_hash_async_digest(struct ahash_request *req, | |||
399 | * exceed 2^16. | 402 | * exceed 2^16. |
400 | */ | 403 | */ |
401 | if (unlikely(req->nbytes > (1 << 16))) { | 404 | if (unlikely(req->nbytes > (1 << 16))) { |
402 | ctx->fallback_req.base.tfm = crypto_ahash_tfm(ctx->fallback); | 405 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); |
403 | ctx->fallback_req.base.flags = | 406 | |
407 | ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm); | ||
408 | rctx->fallback_req.base.flags = | ||
404 | req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; | 409 | req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP; |
405 | ctx->fallback_req.nbytes = req->nbytes; | 410 | rctx->fallback_req.nbytes = req->nbytes; |
406 | ctx->fallback_req.src = req->src; | 411 | rctx->fallback_req.src = req->src; |
407 | ctx->fallback_req.result = req->result; | 412 | rctx->fallback_req.result = req->result; |
408 | 413 | ||
409 | return crypto_ahash_digest(&ctx->fallback_req); | 414 | return crypto_ahash_digest(&rctx->fallback_req); |
410 | } | 415 | } |
411 | 416 | ||
412 | n2_base_ctx_init(&ctx->base); | 417 | n2_base_ctx_init(&ctx->base); |
@@ -472,9 +477,8 @@ out: | |||
472 | 477 | ||
473 | static int n2_md5_async_digest(struct ahash_request *req) | 478 | static int n2_md5_async_digest(struct ahash_request *req) |
474 | { | 479 | { |
475 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 480 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); |
476 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 481 | struct md5_state *m = &rctx->u.md5; |
477 | struct md5_state *m = &ctx->u.md5; | ||
478 | 482 | ||
479 | if (unlikely(req->nbytes == 0)) { | 483 | if (unlikely(req->nbytes == 0)) { |
480 | static const char md5_zero[MD5_DIGEST_SIZE] = { | 484 | static const char md5_zero[MD5_DIGEST_SIZE] = { |
@@ -497,9 +501,8 @@ static int n2_md5_async_digest(struct ahash_request *req) | |||
497 | 501 | ||
498 | static int n2_sha1_async_digest(struct ahash_request *req) | 502 | static int n2_sha1_async_digest(struct ahash_request *req) |
499 | { | 503 | { |
500 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 504 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); |
501 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 505 | struct sha1_state *s = &rctx->u.sha1; |
502 | struct sha1_state *s = &ctx->u.sha1; | ||
503 | 506 | ||
504 | if (unlikely(req->nbytes == 0)) { | 507 | if (unlikely(req->nbytes == 0)) { |
505 | static const char sha1_zero[SHA1_DIGEST_SIZE] = { | 508 | static const char sha1_zero[SHA1_DIGEST_SIZE] = { |
@@ -524,9 +527,8 @@ static int n2_sha1_async_digest(struct ahash_request *req) | |||
524 | 527 | ||
525 | static int n2_sha256_async_digest(struct ahash_request *req) | 528 | static int n2_sha256_async_digest(struct ahash_request *req) |
526 | { | 529 | { |
527 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 530 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); |
528 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 531 | struct sha256_state *s = &rctx->u.sha256; |
529 | struct sha256_state *s = &ctx->u.sha256; | ||
530 | 532 | ||
531 | if (req->nbytes == 0) { | 533 | if (req->nbytes == 0) { |
532 | static const char sha256_zero[SHA256_DIGEST_SIZE] = { | 534 | static const char sha256_zero[SHA256_DIGEST_SIZE] = { |
@@ -555,9 +557,8 @@ static int n2_sha256_async_digest(struct ahash_request *req) | |||
555 | 557 | ||
556 | static int n2_sha224_async_digest(struct ahash_request *req) | 558 | static int n2_sha224_async_digest(struct ahash_request *req) |
557 | { | 559 | { |
558 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 560 | struct n2_hash_req_ctx *rctx = ahash_request_ctx(req); |
559 | struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm); | 561 | struct sha256_state *s = &rctx->u.sha256; |
560 | struct sha256_state *s = &ctx->u.sha256; | ||
561 | 562 | ||
562 | if (req->nbytes == 0) { | 563 | if (req->nbytes == 0) { |
563 | static const char sha224_zero[SHA224_DIGEST_SIZE] = { | 564 | static const char sha224_zero[SHA224_DIGEST_SIZE] = { |