.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /** |
---|
2 | 3 | * AMCC SoC PPC4xx Crypto Driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2008 Applied Micro Circuits Corporation. |
---|
5 | 6 | * All rights reserved. James Hsiao <jhsiao@amcc.com> |
---|
6 | | - * |
---|
7 | | - * This program is free software; you can redistribute it and/or modify |
---|
8 | | - * it under the terms of the GNU General Public License as published by |
---|
9 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
10 | | - * (at your option) any later version. |
---|
11 | | - * |
---|
12 | | - * This program is distributed in the hope that it will be useful, |
---|
13 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
14 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
15 | | - * GNU General Public License for more details. |
---|
16 | 7 | * |
---|
17 | 8 | * This file implements the Linux crypto algorithms. |
---|
18 | 9 | */ |
---|
.. | .. |
---|
64 | 55 | sa->sa_command_1.w = 0; |
---|
65 | 56 | sa->sa_command_1.bf.crypto_mode31 = (cm & 4) >> 2; |
---|
66 | 57 | sa->sa_command_1.bf.crypto_mode9_8 = cm & 3; |
---|
67 | | - sa->sa_command_1.bf.feedback_mode = cfb, |
---|
| 58 | + sa->sa_command_1.bf.feedback_mode = cfb; |
---|
68 | 59 | sa->sa_command_1.bf.sa_rev = 1; |
---|
69 | 60 | sa->sa_command_1.bf.hmac_muting = hmac_mc; |
---|
70 | 61 | sa->sa_command_1.bf.extended_seq_num = esn; |
---|
.. | .. |
---|
137 | 128 | struct dynamic_sa_ctl *sa; |
---|
138 | 129 | int rc; |
---|
139 | 130 | |
---|
140 | | - if (keylen != AES_KEYSIZE_256 && |
---|
141 | | - keylen != AES_KEYSIZE_192 && keylen != AES_KEYSIZE_128) { |
---|
142 | | - crypto_skcipher_set_flags(cipher, |
---|
143 | | - CRYPTO_TFM_RES_BAD_KEY_LEN); |
---|
| 131 | + if (keylen != AES_KEYSIZE_256 && keylen != AES_KEYSIZE_192 && |
---|
| 132 | + keylen != AES_KEYSIZE_128) |
---|
144 | 133 | return -EINVAL; |
---|
145 | | - } |
---|
146 | 134 | |
---|
147 | 135 | /* Create SA */ |
---|
148 | 136 | if (ctx->sa_in || ctx->sa_out) |
---|
.. | .. |
---|
278 | 266 | * overlow. |
---|
279 | 267 | */ |
---|
280 | 268 | if (counter + nblks < counter) { |
---|
281 | | - struct skcipher_request *subreq = skcipher_request_ctx(req); |
---|
| 269 | + SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->sw_cipher.cipher); |
---|
282 | 270 | int ret; |
---|
283 | 271 | |
---|
284 | | - skcipher_request_set_tfm(subreq, ctx->sw_cipher.cipher); |
---|
| 272 | + skcipher_request_set_sync_tfm(subreq, ctx->sw_cipher.cipher); |
---|
285 | 273 | skcipher_request_set_callback(subreq, req->base.flags, |
---|
286 | 274 | NULL, NULL); |
---|
287 | 275 | skcipher_request_set_crypt(subreq, req->src, req->dst, |
---|
.. | .. |
---|
301 | 289 | const u8 *key, |
---|
302 | 290 | unsigned int keylen) |
---|
303 | 291 | { |
---|
304 | | - int rc; |
---|
305 | | - |
---|
306 | | - crypto_skcipher_clear_flags(ctx->sw_cipher.cipher, |
---|
| 292 | + crypto_sync_skcipher_clear_flags(ctx->sw_cipher.cipher, |
---|
307 | 293 | CRYPTO_TFM_REQ_MASK); |
---|
308 | | - crypto_skcipher_set_flags(ctx->sw_cipher.cipher, |
---|
| 294 | + crypto_sync_skcipher_set_flags(ctx->sw_cipher.cipher, |
---|
309 | 295 | crypto_skcipher_get_flags(cipher) & CRYPTO_TFM_REQ_MASK); |
---|
310 | | - rc = crypto_skcipher_setkey(ctx->sw_cipher.cipher, key, keylen); |
---|
311 | | - crypto_skcipher_clear_flags(cipher, CRYPTO_TFM_RES_MASK); |
---|
312 | | - crypto_skcipher_set_flags(cipher, |
---|
313 | | - crypto_skcipher_get_flags(ctx->sw_cipher.cipher) & |
---|
314 | | - CRYPTO_TFM_RES_MASK); |
---|
315 | | - |
---|
316 | | - return rc; |
---|
| 296 | + return crypto_sync_skcipher_setkey(ctx->sw_cipher.cipher, key, keylen); |
---|
317 | 297 | } |
---|
318 | 298 | |
---|
319 | 299 | int crypto4xx_setkey_aes_ctr(struct crypto_skcipher *cipher, |
---|
.. | .. |
---|
388 | 368 | const u8 *key, |
---|
389 | 369 | unsigned int keylen) |
---|
390 | 370 | { |
---|
391 | | - int rc; |
---|
392 | | - |
---|
393 | 371 | crypto_aead_clear_flags(ctx->sw_cipher.aead, CRYPTO_TFM_REQ_MASK); |
---|
394 | 372 | crypto_aead_set_flags(ctx->sw_cipher.aead, |
---|
395 | 373 | crypto_aead_get_flags(cipher) & CRYPTO_TFM_REQ_MASK); |
---|
396 | | - rc = crypto_aead_setkey(ctx->sw_cipher.aead, key, keylen); |
---|
397 | | - crypto_aead_clear_flags(cipher, CRYPTO_TFM_RES_MASK); |
---|
398 | | - crypto_aead_set_flags(cipher, |
---|
399 | | - crypto_aead_get_flags(ctx->sw_cipher.aead) & |
---|
400 | | - CRYPTO_TFM_RES_MASK); |
---|
401 | | - |
---|
402 | | - return rc; |
---|
| 374 | + return crypto_aead_setkey(ctx->sw_cipher.aead, key, keylen); |
---|
403 | 375 | } |
---|
404 | 376 | |
---|
405 | 377 | /** |
---|
.. | .. |
---|
536 | 508 | static int crypto4xx_compute_gcm_hash_key_sw(__le32 *hash_start, const u8 *key, |
---|
537 | 509 | unsigned int keylen) |
---|
538 | 510 | { |
---|
539 | | - struct crypto_cipher *aes_tfm = NULL; |
---|
| 511 | + struct crypto_aes_ctx ctx; |
---|
540 | 512 | uint8_t src[16] = { 0 }; |
---|
541 | | - int rc = 0; |
---|
| 513 | + int rc; |
---|
542 | 514 | |
---|
543 | | - aes_tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC | |
---|
544 | | - CRYPTO_ALG_NEED_FALLBACK); |
---|
545 | | - if (IS_ERR(aes_tfm)) { |
---|
546 | | - rc = PTR_ERR(aes_tfm); |
---|
547 | | - pr_warn("could not load aes cipher driver: %d\n", rc); |
---|
| 515 | + rc = aes_expandkey(&ctx, key, keylen); |
---|
| 516 | + if (rc) { |
---|
| 517 | + pr_err("aes_expandkey() failed: %d\n", rc); |
---|
548 | 518 | return rc; |
---|
549 | 519 | } |
---|
550 | 520 | |
---|
551 | | - rc = crypto_cipher_setkey(aes_tfm, key, keylen); |
---|
552 | | - if (rc) { |
---|
553 | | - pr_err("setkey() failed: %d\n", rc); |
---|
554 | | - goto out; |
---|
555 | | - } |
---|
556 | | - |
---|
557 | | - crypto_cipher_encrypt_one(aes_tfm, src, src); |
---|
| 521 | + aes_encrypt(&ctx, src, src); |
---|
558 | 522 | crypto4xx_memcpy_to_le32(hash_start, src, 16); |
---|
559 | | -out: |
---|
560 | | - crypto_free_cipher(aes_tfm); |
---|
561 | | - return rc; |
---|
| 523 | + memzero_explicit(&ctx, sizeof(ctx)); |
---|
| 524 | + return 0; |
---|
562 | 525 | } |
---|
563 | 526 | |
---|
564 | 527 | int crypto4xx_setkey_aes_gcm(struct crypto_aead *cipher, |
---|
.. | .. |
---|
569 | 532 | struct dynamic_sa_ctl *sa; |
---|
570 | 533 | int rc = 0; |
---|
571 | 534 | |
---|
572 | | - if (crypto4xx_aes_gcm_validate_keylen(keylen) != 0) { |
---|
573 | | - crypto_aead_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN); |
---|
| 535 | + if (crypto4xx_aes_gcm_validate_keylen(keylen) != 0) |
---|
574 | 536 | return -EINVAL; |
---|
575 | | - } |
---|
576 | 537 | |
---|
577 | 538 | rc = crypto4xx_aead_setup_fallback(ctx, cipher, key, keylen); |
---|
578 | 539 | if (rc) |
---|