eip93-cipher.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2019 - 2021
  4. *
  5. * Richard van Schagen <vschagen@icloud.com>
  6. * Christian Marangi <ansuelsmth@gmail.com
  7. */
  8. #include <crypto/aes.h>
  9. #include <crypto/ctr.h>
  10. #include <crypto/internal/des.h>
  11. #include <linux/dma-mapping.h>
  12. #include "eip93-aes.h"
  13. #include "eip93-cipher.h"
  14. #include "eip93-common.h"
  15. #include "eip93-des.h"
  16. #include "eip93-regs.h"
  17. void eip93_skcipher_handle_result(struct crypto_async_request *async, int err)
  18. {
  19. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(async->tfm);
  20. struct eip93_device *eip93 = ctx->eip93;
  21. struct skcipher_request *req = skcipher_request_cast(async);
  22. struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
  23. eip93_unmap_dma(eip93, rctx, req->src, req->dst);
  24. eip93_handle_result(eip93, rctx, req->iv);
  25. skcipher_request_complete(req, err);
  26. }
  27. static int eip93_skcipher_send_req(struct crypto_async_request *async)
  28. {
  29. struct skcipher_request *req = skcipher_request_cast(async);
  30. struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
  31. int err;
  32. err = check_valid_request(rctx);
  33. if (err) {
  34. skcipher_request_complete(req, err);
  35. return err;
  36. }
  37. return eip93_send_req(async, req->iv, rctx);
  38. }
  39. /* Crypto skcipher API functions */
  40. static int eip93_skcipher_cra_init(struct crypto_tfm *tfm)
  41. {
  42. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
  43. struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,
  44. struct eip93_alg_template, alg.skcipher.base);
  45. crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm),
  46. sizeof(struct eip93_cipher_reqctx));
  47. memset(ctx, 0, sizeof(*ctx));
  48. ctx->eip93 = tmpl->eip93;
  49. ctx->type = tmpl->type;
  50. ctx->sa_record = kzalloc_obj(*ctx->sa_record);
  51. if (!ctx->sa_record)
  52. return -ENOMEM;
  53. return 0;
  54. }
  55. static void eip93_skcipher_cra_exit(struct crypto_tfm *tfm)
  56. {
  57. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
  58. dma_unmap_single(ctx->eip93->dev, ctx->sa_record_base,
  59. sizeof(*ctx->sa_record), DMA_TO_DEVICE);
  60. kfree(ctx->sa_record);
  61. }
  62. static int eip93_skcipher_setkey(struct crypto_skcipher *ctfm, const u8 *key,
  63. unsigned int len)
  64. {
  65. struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
  66. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
  67. struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,
  68. struct eip93_alg_template,
  69. alg.skcipher.base);
  70. struct sa_record *sa_record = ctx->sa_record;
  71. unsigned int keylen = len;
  72. u32 flags = tmpl->flags;
  73. u32 nonce = 0;
  74. int ret;
  75. if (!key || !keylen)
  76. return -EINVAL;
  77. if (IS_RFC3686(flags)) {
  78. if (len < CTR_RFC3686_NONCE_SIZE)
  79. return -EINVAL;
  80. keylen = len - CTR_RFC3686_NONCE_SIZE;
  81. memcpy(&nonce, key + keylen, CTR_RFC3686_NONCE_SIZE);
  82. }
  83. if (flags & EIP93_ALG_DES) {
  84. ctx->blksize = DES_BLOCK_SIZE;
  85. ret = verify_skcipher_des_key(ctfm, key);
  86. if (ret)
  87. return ret;
  88. }
  89. if (flags & EIP93_ALG_3DES) {
  90. ctx->blksize = DES3_EDE_BLOCK_SIZE;
  91. ret = verify_skcipher_des3_key(ctfm, key);
  92. if (ret)
  93. return ret;
  94. }
  95. if (flags & EIP93_ALG_AES) {
  96. struct crypto_aes_ctx aes;
  97. ctx->blksize = AES_BLOCK_SIZE;
  98. ret = aes_expandkey(&aes, key, keylen);
  99. if (ret)
  100. return ret;
  101. }
  102. eip93_set_sa_record(sa_record, keylen, flags);
  103. memcpy(sa_record->sa_key, key, keylen);
  104. ctx->sa_nonce = nonce;
  105. sa_record->sa_nonce = nonce;
  106. return 0;
  107. }
  108. static int eip93_skcipher_crypt(struct skcipher_request *req)
  109. {
  110. struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
  111. struct crypto_async_request *async = &req->base;
  112. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
  113. struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
  114. int ret;
  115. if (!req->cryptlen)
  116. return 0;
  117. /*
  118. * ECB and CBC algorithms require message lengths to be
  119. * multiples of block size.
  120. */
  121. if (IS_ECB(rctx->flags) || IS_CBC(rctx->flags))
  122. if (!IS_ALIGNED(req->cryptlen,
  123. crypto_skcipher_blocksize(skcipher)))
  124. return -EINVAL;
  125. ctx->sa_record_base = dma_map_single(ctx->eip93->dev, ctx->sa_record,
  126. sizeof(*ctx->sa_record), DMA_TO_DEVICE);
  127. ret = dma_mapping_error(ctx->eip93->dev, ctx->sa_record_base);
  128. if (ret)
  129. return ret;
  130. rctx->assoclen = 0;
  131. rctx->textsize = req->cryptlen;
  132. rctx->authsize = 0;
  133. rctx->sg_src = req->src;
  134. rctx->sg_dst = req->dst;
  135. rctx->ivsize = crypto_skcipher_ivsize(skcipher);
  136. rctx->blksize = ctx->blksize;
  137. rctx->desc_flags = EIP93_DESC_SKCIPHER;
  138. rctx->sa_record_base = ctx->sa_record_base;
  139. return eip93_skcipher_send_req(async);
  140. }
  141. static int eip93_skcipher_encrypt(struct skcipher_request *req)
  142. {
  143. struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
  144. struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
  145. struct eip93_alg_template, alg.skcipher.base);
  146. rctx->flags = tmpl->flags;
  147. rctx->flags |= EIP93_ENCRYPT;
  148. return eip93_skcipher_crypt(req);
  149. }
  150. static int eip93_skcipher_decrypt(struct skcipher_request *req)
  151. {
  152. struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
  153. struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
  154. struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
  155. struct eip93_alg_template, alg.skcipher.base);
  156. ctx->sa_record->sa_cmd0_word |= EIP93_SA_CMD_DIRECTION_IN;
  157. rctx->flags = tmpl->flags;
  158. rctx->flags |= EIP93_DECRYPT;
  159. return eip93_skcipher_crypt(req);
  160. }
  161. /* Available algorithms in this module */
  162. struct eip93_alg_template eip93_alg_ecb_aes = {
  163. .type = EIP93_ALG_TYPE_SKCIPHER,
  164. .flags = EIP93_MODE_ECB | EIP93_ALG_AES,
  165. .alg.skcipher = {
  166. .setkey = eip93_skcipher_setkey,
  167. .encrypt = eip93_skcipher_encrypt,
  168. .decrypt = eip93_skcipher_decrypt,
  169. .min_keysize = AES_MIN_KEY_SIZE,
  170. .max_keysize = AES_MAX_KEY_SIZE,
  171. .ivsize = 0,
  172. .base = {
  173. .cra_name = "ecb(aes)",
  174. .cra_driver_name = "ecb(aes-eip93)",
  175. .cra_priority = EIP93_CRA_PRIORITY,
  176. .cra_flags = CRYPTO_ALG_ASYNC |
  177. CRYPTO_ALG_NEED_FALLBACK |
  178. CRYPTO_ALG_KERN_DRIVER_ONLY,
  179. .cra_blocksize = AES_BLOCK_SIZE,
  180. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  181. .cra_alignmask = 0xf,
  182. .cra_init = eip93_skcipher_cra_init,
  183. .cra_exit = eip93_skcipher_cra_exit,
  184. .cra_module = THIS_MODULE,
  185. },
  186. },
  187. };
  188. struct eip93_alg_template eip93_alg_cbc_aes = {
  189. .type = EIP93_ALG_TYPE_SKCIPHER,
  190. .flags = EIP93_MODE_CBC | EIP93_ALG_AES,
  191. .alg.skcipher = {
  192. .setkey = eip93_skcipher_setkey,
  193. .encrypt = eip93_skcipher_encrypt,
  194. .decrypt = eip93_skcipher_decrypt,
  195. .min_keysize = AES_MIN_KEY_SIZE,
  196. .max_keysize = AES_MAX_KEY_SIZE,
  197. .ivsize = AES_BLOCK_SIZE,
  198. .base = {
  199. .cra_name = "cbc(aes)",
  200. .cra_driver_name = "cbc(aes-eip93)",
  201. .cra_priority = EIP93_CRA_PRIORITY,
  202. .cra_flags = CRYPTO_ALG_ASYNC |
  203. CRYPTO_ALG_NEED_FALLBACK |
  204. CRYPTO_ALG_KERN_DRIVER_ONLY,
  205. .cra_blocksize = AES_BLOCK_SIZE,
  206. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  207. .cra_alignmask = 0xf,
  208. .cra_init = eip93_skcipher_cra_init,
  209. .cra_exit = eip93_skcipher_cra_exit,
  210. .cra_module = THIS_MODULE,
  211. },
  212. },
  213. };
  214. struct eip93_alg_template eip93_alg_ctr_aes = {
  215. .type = EIP93_ALG_TYPE_SKCIPHER,
  216. .flags = EIP93_MODE_CTR | EIP93_ALG_AES,
  217. .alg.skcipher = {
  218. .setkey = eip93_skcipher_setkey,
  219. .encrypt = eip93_skcipher_encrypt,
  220. .decrypt = eip93_skcipher_decrypt,
  221. .min_keysize = AES_MIN_KEY_SIZE,
  222. .max_keysize = AES_MAX_KEY_SIZE,
  223. .ivsize = AES_BLOCK_SIZE,
  224. .base = {
  225. .cra_name = "ctr(aes)",
  226. .cra_driver_name = "ctr(aes-eip93)",
  227. .cra_priority = EIP93_CRA_PRIORITY,
  228. .cra_flags = CRYPTO_ALG_ASYNC |
  229. CRYPTO_ALG_NEED_FALLBACK |
  230. CRYPTO_ALG_KERN_DRIVER_ONLY,
  231. .cra_blocksize = 1,
  232. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  233. .cra_alignmask = 0xf,
  234. .cra_init = eip93_skcipher_cra_init,
  235. .cra_exit = eip93_skcipher_cra_exit,
  236. .cra_module = THIS_MODULE,
  237. },
  238. },
  239. };
  240. struct eip93_alg_template eip93_alg_rfc3686_aes = {
  241. .type = EIP93_ALG_TYPE_SKCIPHER,
  242. .flags = EIP93_MODE_CTR | EIP93_MODE_RFC3686 | EIP93_ALG_AES,
  243. .alg.skcipher = {
  244. .setkey = eip93_skcipher_setkey,
  245. .encrypt = eip93_skcipher_encrypt,
  246. .decrypt = eip93_skcipher_decrypt,
  247. .min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
  248. .max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
  249. .ivsize = CTR_RFC3686_IV_SIZE,
  250. .base = {
  251. .cra_name = "rfc3686(ctr(aes))",
  252. .cra_driver_name = "rfc3686(ctr(aes-eip93))",
  253. .cra_priority = EIP93_CRA_PRIORITY,
  254. .cra_flags = CRYPTO_ALG_ASYNC |
  255. CRYPTO_ALG_NEED_FALLBACK |
  256. CRYPTO_ALG_KERN_DRIVER_ONLY,
  257. .cra_blocksize = 1,
  258. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  259. .cra_alignmask = 0xf,
  260. .cra_init = eip93_skcipher_cra_init,
  261. .cra_exit = eip93_skcipher_cra_exit,
  262. .cra_module = THIS_MODULE,
  263. },
  264. },
  265. };
  266. struct eip93_alg_template eip93_alg_ecb_des = {
  267. .type = EIP93_ALG_TYPE_SKCIPHER,
  268. .flags = EIP93_MODE_ECB | EIP93_ALG_DES,
  269. .alg.skcipher = {
  270. .setkey = eip93_skcipher_setkey,
  271. .encrypt = eip93_skcipher_encrypt,
  272. .decrypt = eip93_skcipher_decrypt,
  273. .min_keysize = DES_KEY_SIZE,
  274. .max_keysize = DES_KEY_SIZE,
  275. .ivsize = 0,
  276. .base = {
  277. .cra_name = "ecb(des)",
  278. .cra_driver_name = "ebc(des-eip93)",
  279. .cra_priority = EIP93_CRA_PRIORITY,
  280. .cra_flags = CRYPTO_ALG_ASYNC |
  281. CRYPTO_ALG_KERN_DRIVER_ONLY,
  282. .cra_blocksize = DES_BLOCK_SIZE,
  283. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  284. .cra_alignmask = 0,
  285. .cra_init = eip93_skcipher_cra_init,
  286. .cra_exit = eip93_skcipher_cra_exit,
  287. .cra_module = THIS_MODULE,
  288. },
  289. },
  290. };
  291. struct eip93_alg_template eip93_alg_cbc_des = {
  292. .type = EIP93_ALG_TYPE_SKCIPHER,
  293. .flags = EIP93_MODE_CBC | EIP93_ALG_DES,
  294. .alg.skcipher = {
  295. .setkey = eip93_skcipher_setkey,
  296. .encrypt = eip93_skcipher_encrypt,
  297. .decrypt = eip93_skcipher_decrypt,
  298. .min_keysize = DES_KEY_SIZE,
  299. .max_keysize = DES_KEY_SIZE,
  300. .ivsize = DES_BLOCK_SIZE,
  301. .base = {
  302. .cra_name = "cbc(des)",
  303. .cra_driver_name = "cbc(des-eip93)",
  304. .cra_priority = EIP93_CRA_PRIORITY,
  305. .cra_flags = CRYPTO_ALG_ASYNC |
  306. CRYPTO_ALG_KERN_DRIVER_ONLY,
  307. .cra_blocksize = DES_BLOCK_SIZE,
  308. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  309. .cra_alignmask = 0,
  310. .cra_init = eip93_skcipher_cra_init,
  311. .cra_exit = eip93_skcipher_cra_exit,
  312. .cra_module = THIS_MODULE,
  313. },
  314. },
  315. };
  316. struct eip93_alg_template eip93_alg_ecb_des3_ede = {
  317. .type = EIP93_ALG_TYPE_SKCIPHER,
  318. .flags = EIP93_MODE_ECB | EIP93_ALG_3DES,
  319. .alg.skcipher = {
  320. .setkey = eip93_skcipher_setkey,
  321. .encrypt = eip93_skcipher_encrypt,
  322. .decrypt = eip93_skcipher_decrypt,
  323. .min_keysize = DES3_EDE_KEY_SIZE,
  324. .max_keysize = DES3_EDE_KEY_SIZE,
  325. .ivsize = 0,
  326. .base = {
  327. .cra_name = "ecb(des3_ede)",
  328. .cra_driver_name = "ecb(des3_ede-eip93)",
  329. .cra_priority = EIP93_CRA_PRIORITY,
  330. .cra_flags = CRYPTO_ALG_ASYNC |
  331. CRYPTO_ALG_KERN_DRIVER_ONLY,
  332. .cra_blocksize = DES3_EDE_BLOCK_SIZE,
  333. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  334. .cra_alignmask = 0,
  335. .cra_init = eip93_skcipher_cra_init,
  336. .cra_exit = eip93_skcipher_cra_exit,
  337. .cra_module = THIS_MODULE,
  338. },
  339. },
  340. };
  341. struct eip93_alg_template eip93_alg_cbc_des3_ede = {
  342. .type = EIP93_ALG_TYPE_SKCIPHER,
  343. .flags = EIP93_MODE_CBC | EIP93_ALG_3DES,
  344. .alg.skcipher = {
  345. .setkey = eip93_skcipher_setkey,
  346. .encrypt = eip93_skcipher_encrypt,
  347. .decrypt = eip93_skcipher_decrypt,
  348. .min_keysize = DES3_EDE_KEY_SIZE,
  349. .max_keysize = DES3_EDE_KEY_SIZE,
  350. .ivsize = DES3_EDE_BLOCK_SIZE,
  351. .base = {
  352. .cra_name = "cbc(des3_ede)",
  353. .cra_driver_name = "cbc(des3_ede-eip93)",
  354. .cra_priority = EIP93_CRA_PRIORITY,
  355. .cra_flags = CRYPTO_ALG_ASYNC |
  356. CRYPTO_ALG_KERN_DRIVER_ONLY,
  357. .cra_blocksize = DES3_EDE_BLOCK_SIZE,
  358. .cra_ctxsize = sizeof(struct eip93_crypto_ctx),
  359. .cra_alignmask = 0,
  360. .cra_init = eip93_skcipher_cra_init,
  361. .cra_exit = eip93_skcipher_cra_exit,
  362. .cra_module = THIS_MODULE,
  363. },
  364. },
  365. };