1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/crypto.h>
3 #include <linux/kernel.h>
4 #include <linux/module.h>
5 #include <linux/printk.h>
7 #include <crypto/aes.h>
8 #include <crypto/skcipher.h>
9 #include <crypto/ctr.h>
10 #include <crypto/des.h>
11 #include <crypto/xts.h>
13 #include "nitrox_dev.h"
14 #include "nitrox_common.h"
15 #include "nitrox_req.h"
19 struct nitrox_cipher
{
21 enum flexi_cipher value
;
25 * supported cipher list
27 static const struct nitrox_cipher flexi_cipher_table
[] = {
28 { "null", CIPHER_NULL
},
29 { "cbc(des3_ede)", CIPHER_3DES_CBC
},
30 { "ecb(des3_ede)", CIPHER_3DES_ECB
},
31 { "cbc(aes)", CIPHER_AES_CBC
},
32 { "ecb(aes)", CIPHER_AES_ECB
},
33 { "cfb(aes)", CIPHER_AES_CFB
},
34 { "rfc3686(ctr(aes))", CIPHER_AES_CTR
},
35 { "xts(aes)", CIPHER_AES_XTS
},
36 { "cts(cbc(aes))", CIPHER_AES_CBC_CTS
},
37 { NULL
, CIPHER_INVALID
}
40 static enum flexi_cipher
flexi_cipher_type(const char *name
)
42 const struct nitrox_cipher
*cipher
= flexi_cipher_table
;
44 while (cipher
->name
) {
45 if (!strcmp(cipher
->name
, name
))
52 static int flexi_aes_keylen(int keylen
)
73 static int nitrox_skcipher_init(struct crypto_skcipher
*tfm
)
75 struct nitrox_crypto_ctx
*nctx
= crypto_skcipher_ctx(tfm
);
78 /* get the first device */
79 nctx
->ndev
= nitrox_get_first_device();
83 /* allocate nitrox crypto context */
84 fctx
= crypto_alloc_context(nctx
->ndev
);
86 nitrox_put_device(nctx
->ndev
);
89 nctx
->u
.ctx_handle
= (uintptr_t)fctx
;
90 crypto_skcipher_set_reqsize(tfm
, crypto_skcipher_reqsize(tfm
) +
91 sizeof(struct nitrox_kcrypt_request
));
95 static void nitrox_skcipher_exit(struct crypto_skcipher
*tfm
)
97 struct nitrox_crypto_ctx
*nctx
= crypto_skcipher_ctx(tfm
);
99 /* free the nitrox crypto context */
100 if (nctx
->u
.ctx_handle
) {
101 struct flexi_crypto_context
*fctx
= nctx
->u
.fctx
;
103 memset(&fctx
->crypto
, 0, sizeof(struct crypto_keys
));
104 memset(&fctx
->auth
, 0, sizeof(struct auth_keys
));
105 crypto_free_context((void *)fctx
);
107 nitrox_put_device(nctx
->ndev
);
109 nctx
->u
.ctx_handle
= 0;
113 static inline int nitrox_skcipher_setkey(struct crypto_skcipher
*cipher
,
114 int aes_keylen
, const u8
*key
,
117 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
118 struct nitrox_crypto_ctx
*nctx
= crypto_tfm_ctx(tfm
);
119 struct flexi_crypto_context
*fctx
;
120 enum flexi_cipher cipher_type
;
123 name
= crypto_tfm_alg_name(tfm
);
124 cipher_type
= flexi_cipher_type(name
);
125 if (unlikely(cipher_type
== CIPHER_INVALID
)) {
126 pr_err("unsupported cipher: %s\n", name
);
130 /* fill crypto context */
133 fctx
->w0
.cipher_type
= cipher_type
;
134 fctx
->w0
.aes_keylen
= aes_keylen
;
135 fctx
->w0
.iv_source
= IV_FROM_DPTR
;
136 fctx
->flags
= cpu_to_be64(*(u64
*)&fctx
->w0
);
137 /* copy the key to context */
138 memcpy(fctx
->crypto
.u
.key
, key
, keylen
);
143 static int nitrox_aes_setkey(struct crypto_skcipher
*cipher
, const u8
*key
,
148 aes_keylen
= flexi_aes_keylen(keylen
);
149 if (aes_keylen
< 0) {
150 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
153 return nitrox_skcipher_setkey(cipher
, aes_keylen
, key
, keylen
);
156 static void nitrox_skcipher_callback(struct skcipher_request
*skreq
,
160 pr_err_ratelimited("request failed status 0x%0x\n", err
);
163 skcipher_request_complete(skreq
, err
);
166 static int nitrox_skcipher_crypt(struct skcipher_request
*skreq
, bool enc
)
168 struct crypto_skcipher
*cipher
= crypto_skcipher_reqtfm(skreq
);
169 struct nitrox_crypto_ctx
*nctx
= crypto_skcipher_ctx(cipher
);
170 struct nitrox_kcrypt_request
*nkreq
= skcipher_request_ctx(skreq
);
171 int ivsize
= crypto_skcipher_ivsize(cipher
);
172 struct se_crypto_request
*creq
;
175 creq
->flags
= skreq
->base
.flags
;
176 creq
->gfp
= (skreq
->base
.flags
& CRYPTO_TFM_REQ_MAY_SLEEP
) ?
177 GFP_KERNEL
: GFP_ATOMIC
;
179 /* fill the request */
180 creq
->ctrl
.value
= 0;
181 creq
->opcode
= FLEXI_CRYPTO_ENCRYPT_HMAC
;
182 creq
->ctrl
.s
.arg
= (enc
? ENCRYPT
: DECRYPT
);
183 /* param0: length of the data to be encrypted */
184 creq
->gph
.param0
= cpu_to_be16(skreq
->cryptlen
);
185 creq
->gph
.param1
= 0;
186 /* param2: encryption data offset */
187 creq
->gph
.param2
= cpu_to_be16(ivsize
);
188 creq
->gph
.param3
= 0;
190 creq
->ctx_handle
= nctx
->u
.ctx_handle
;
191 creq
->ctrl
.s
.ctxl
= sizeof(struct flexi_crypto_context
);
194 memcpy(creq
->iv
, skreq
->iv
, ivsize
);
195 creq
->ivsize
= ivsize
;
196 creq
->src
= skreq
->src
;
197 creq
->dst
= skreq
->dst
;
200 nkreq
->skreq
= skreq
;
202 /* send the crypto request */
203 return nitrox_process_se_request(nctx
->ndev
, creq
,
204 nitrox_skcipher_callback
, skreq
);
207 static int nitrox_aes_encrypt(struct skcipher_request
*skreq
)
209 return nitrox_skcipher_crypt(skreq
, true);
212 static int nitrox_aes_decrypt(struct skcipher_request
*skreq
)
214 return nitrox_skcipher_crypt(skreq
, false);
217 static int nitrox_3des_setkey(struct crypto_skcipher
*cipher
,
218 const u8
*key
, unsigned int keylen
)
220 if (keylen
!= DES3_EDE_KEY_SIZE
) {
221 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
225 return nitrox_skcipher_setkey(cipher
, 0, key
, keylen
);
228 static int nitrox_3des_encrypt(struct skcipher_request
*skreq
)
230 return nitrox_skcipher_crypt(skreq
, true);
233 static int nitrox_3des_decrypt(struct skcipher_request
*skreq
)
235 return nitrox_skcipher_crypt(skreq
, false);
238 static int nitrox_aes_xts_setkey(struct crypto_skcipher
*cipher
,
239 const u8
*key
, unsigned int keylen
)
241 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
242 struct nitrox_crypto_ctx
*nctx
= crypto_tfm_ctx(tfm
);
243 struct flexi_crypto_context
*fctx
;
246 ret
= xts_check_key(tfm
, key
, keylen
);
252 aes_keylen
= flexi_aes_keylen(keylen
);
253 if (aes_keylen
< 0) {
254 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
260 memcpy(fctx
->auth
.u
.key2
, (key
+ keylen
), keylen
);
262 return nitrox_skcipher_setkey(cipher
, aes_keylen
, key
, keylen
);
265 static int nitrox_aes_ctr_rfc3686_setkey(struct crypto_skcipher
*cipher
,
266 const u8
*key
, unsigned int keylen
)
268 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
269 struct nitrox_crypto_ctx
*nctx
= crypto_tfm_ctx(tfm
);
270 struct flexi_crypto_context
*fctx
;
273 if (keylen
< CTR_RFC3686_NONCE_SIZE
)
278 memcpy(fctx
->crypto
.iv
, key
+ (keylen
- CTR_RFC3686_NONCE_SIZE
),
279 CTR_RFC3686_NONCE_SIZE
);
281 keylen
-= CTR_RFC3686_NONCE_SIZE
;
283 aes_keylen
= flexi_aes_keylen(keylen
);
284 if (aes_keylen
< 0) {
285 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
288 return nitrox_skcipher_setkey(cipher
, aes_keylen
, key
, keylen
);
291 static struct skcipher_alg nitrox_skciphers
[] = { {
293 .cra_name
= "cbc(aes)",
294 .cra_driver_name
= "n5_cbc(aes)",
295 .cra_priority
= PRIO
,
296 .cra_flags
= CRYPTO_ALG_ASYNC
,
297 .cra_blocksize
= AES_BLOCK_SIZE
,
298 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
300 .cra_module
= THIS_MODULE
,
302 .min_keysize
= AES_MIN_KEY_SIZE
,
303 .max_keysize
= AES_MAX_KEY_SIZE
,
304 .ivsize
= AES_BLOCK_SIZE
,
305 .setkey
= nitrox_aes_setkey
,
306 .encrypt
= nitrox_aes_encrypt
,
307 .decrypt
= nitrox_aes_decrypt
,
308 .init
= nitrox_skcipher_init
,
309 .exit
= nitrox_skcipher_exit
,
312 .cra_name
= "ecb(aes)",
313 .cra_driver_name
= "n5_ecb(aes)",
314 .cra_priority
= PRIO
,
315 .cra_flags
= CRYPTO_ALG_ASYNC
,
316 .cra_blocksize
= AES_BLOCK_SIZE
,
317 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
319 .cra_module
= THIS_MODULE
,
321 .min_keysize
= AES_MIN_KEY_SIZE
,
322 .max_keysize
= AES_MAX_KEY_SIZE
,
323 .ivsize
= AES_BLOCK_SIZE
,
324 .setkey
= nitrox_aes_setkey
,
325 .encrypt
= nitrox_aes_encrypt
,
326 .decrypt
= nitrox_aes_decrypt
,
327 .init
= nitrox_skcipher_init
,
328 .exit
= nitrox_skcipher_exit
,
331 .cra_name
= "cfb(aes)",
332 .cra_driver_name
= "n5_cfb(aes)",
333 .cra_priority
= PRIO
,
334 .cra_flags
= CRYPTO_ALG_ASYNC
,
335 .cra_blocksize
= AES_BLOCK_SIZE
,
336 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
338 .cra_module
= THIS_MODULE
,
340 .min_keysize
= AES_MIN_KEY_SIZE
,
341 .max_keysize
= AES_MAX_KEY_SIZE
,
342 .ivsize
= AES_BLOCK_SIZE
,
343 .setkey
= nitrox_aes_setkey
,
344 .encrypt
= nitrox_aes_encrypt
,
345 .decrypt
= nitrox_aes_decrypt
,
346 .init
= nitrox_skcipher_init
,
347 .exit
= nitrox_skcipher_exit
,
350 .cra_name
= "xts(aes)",
351 .cra_driver_name
= "n5_xts(aes)",
352 .cra_priority
= PRIO
,
353 .cra_flags
= CRYPTO_ALG_ASYNC
,
354 .cra_blocksize
= AES_BLOCK_SIZE
,
355 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
357 .cra_module
= THIS_MODULE
,
359 .min_keysize
= 2 * AES_MIN_KEY_SIZE
,
360 .max_keysize
= 2 * AES_MAX_KEY_SIZE
,
361 .ivsize
= AES_BLOCK_SIZE
,
362 .setkey
= nitrox_aes_xts_setkey
,
363 .encrypt
= nitrox_aes_encrypt
,
364 .decrypt
= nitrox_aes_decrypt
,
365 .init
= nitrox_skcipher_init
,
366 .exit
= nitrox_skcipher_exit
,
369 .cra_name
= "rfc3686(ctr(aes))",
370 .cra_driver_name
= "n5_rfc3686(ctr(aes))",
371 .cra_priority
= PRIO
,
372 .cra_flags
= CRYPTO_ALG_ASYNC
,
374 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
376 .cra_module
= THIS_MODULE
,
378 .min_keysize
= AES_MIN_KEY_SIZE
+ CTR_RFC3686_NONCE_SIZE
,
379 .max_keysize
= AES_MAX_KEY_SIZE
+ CTR_RFC3686_NONCE_SIZE
,
380 .ivsize
= CTR_RFC3686_IV_SIZE
,
381 .init
= nitrox_skcipher_init
,
382 .exit
= nitrox_skcipher_exit
,
383 .setkey
= nitrox_aes_ctr_rfc3686_setkey
,
384 .encrypt
= nitrox_aes_encrypt
,
385 .decrypt
= nitrox_aes_decrypt
,
388 .cra_name
= "cts(cbc(aes))",
389 .cra_driver_name
= "n5_cts(cbc(aes))",
390 .cra_priority
= PRIO
,
391 .cra_flags
= CRYPTO_ALG_ASYNC
,
392 .cra_blocksize
= AES_BLOCK_SIZE
,
393 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
395 .cra_type
= &crypto_ablkcipher_type
,
396 .cra_module
= THIS_MODULE
,
398 .min_keysize
= AES_MIN_KEY_SIZE
,
399 .max_keysize
= AES_MAX_KEY_SIZE
,
400 .ivsize
= AES_BLOCK_SIZE
,
401 .setkey
= nitrox_aes_setkey
,
402 .encrypt
= nitrox_aes_encrypt
,
403 .decrypt
= nitrox_aes_decrypt
,
404 .init
= nitrox_skcipher_init
,
405 .exit
= nitrox_skcipher_exit
,
408 .cra_name
= "cbc(des3_ede)",
409 .cra_driver_name
= "n5_cbc(des3_ede)",
410 .cra_priority
= PRIO
,
411 .cra_flags
= CRYPTO_ALG_ASYNC
,
412 .cra_blocksize
= DES3_EDE_BLOCK_SIZE
,
413 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
415 .cra_module
= THIS_MODULE
,
417 .min_keysize
= DES3_EDE_KEY_SIZE
,
418 .max_keysize
= DES3_EDE_KEY_SIZE
,
419 .ivsize
= DES3_EDE_BLOCK_SIZE
,
420 .setkey
= nitrox_3des_setkey
,
421 .encrypt
= nitrox_3des_encrypt
,
422 .decrypt
= nitrox_3des_decrypt
,
423 .init
= nitrox_skcipher_init
,
424 .exit
= nitrox_skcipher_exit
,
427 .cra_name
= "ecb(des3_ede)",
428 .cra_driver_name
= "n5_ecb(des3_ede)",
429 .cra_priority
= PRIO
,
430 .cra_flags
= CRYPTO_ALG_ASYNC
,
431 .cra_blocksize
= DES3_EDE_BLOCK_SIZE
,
432 .cra_ctxsize
= sizeof(struct nitrox_crypto_ctx
),
434 .cra_module
= THIS_MODULE
,
436 .min_keysize
= DES3_EDE_KEY_SIZE
,
437 .max_keysize
= DES3_EDE_KEY_SIZE
,
438 .ivsize
= DES3_EDE_BLOCK_SIZE
,
439 .setkey
= nitrox_3des_setkey
,
440 .encrypt
= nitrox_3des_encrypt
,
441 .decrypt
= nitrox_3des_decrypt
,
442 .init
= nitrox_skcipher_init
,
443 .exit
= nitrox_skcipher_exit
,
448 int nitrox_crypto_register(void)
450 return crypto_register_skciphers(nitrox_skciphers
,
451 ARRAY_SIZE(nitrox_skciphers
));
454 void nitrox_crypto_unregister(void)
456 crypto_unregister_skciphers(nitrox_skciphers
,
457 ARRAY_SIZE(nitrox_skciphers
));