jh7110-hash.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Hash function and HMAC support for StarFive driver
  4. *
  5. * Copyright (c) 2022 StarFive Technology
  6. *
  7. */
  8. #include <crypto/engine.h>
  9. #include <crypto/internal/hash.h>
  10. #include <crypto/scatterwalk.h>
  11. #include "jh7110-cryp.h"
  12. #include <linux/amba/pl080.h>
  13. #include <linux/clk.h>
  14. #include <linux/dma-direct.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/iopoll.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/pm_runtime.h>
  21. #include <linux/reset.h>
  22. #define STARFIVE_HASH_REGS_OFFSET 0x300
  23. #define STARFIVE_HASH_SHACSR (STARFIVE_HASH_REGS_OFFSET + 0x0)
  24. #define STARFIVE_HASH_SHAWDR (STARFIVE_HASH_REGS_OFFSET + 0x4)
  25. #define STARFIVE_HASH_SHARDR (STARFIVE_HASH_REGS_OFFSET + 0x8)
  26. #define STARFIVE_HASH_SHAWSR (STARFIVE_HASH_REGS_OFFSET + 0xC)
  27. #define STARFIVE_HASH_SHAWLEN3 (STARFIVE_HASH_REGS_OFFSET + 0x10)
  28. #define STARFIVE_HASH_SHAWLEN2 (STARFIVE_HASH_REGS_OFFSET + 0x14)
  29. #define STARFIVE_HASH_SHAWLEN1 (STARFIVE_HASH_REGS_OFFSET + 0x18)
  30. #define STARFIVE_HASH_SHAWLEN0 (STARFIVE_HASH_REGS_OFFSET + 0x1C)
  31. #define STARFIVE_HASH_SHAWKR (STARFIVE_HASH_REGS_OFFSET + 0x20)
  32. #define STARFIVE_HASH_SHAWKLEN (STARFIVE_HASH_REGS_OFFSET + 0x24)
  33. #define STARFIVE_HASH_BUFLEN SHA512_BLOCK_SIZE
  34. #define STARFIVE_HASH_RESET 0x2
  35. static inline int starfive_hash_wait_busy(struct starfive_cryp_dev *cryp)
  36. {
  37. u32 status;
  38. return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status,
  39. !(status & STARFIVE_HASH_BUSY), 10, 100000);
  40. }
  41. static inline int starfive_hash_wait_hmac_done(struct starfive_cryp_dev *cryp)
  42. {
  43. u32 status;
  44. return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status,
  45. (status & STARFIVE_HASH_HMAC_DONE), 10, 100000);
  46. }
  47. static inline int starfive_hash_wait_key_done(struct starfive_cryp_ctx *ctx)
  48. {
  49. struct starfive_cryp_dev *cryp = ctx->cryp;
  50. u32 status;
  51. return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status,
  52. (status & STARFIVE_HASH_KEY_DONE), 10, 100000);
  53. }
  54. static int starfive_hash_hmac_key(struct starfive_cryp_ctx *ctx)
  55. {
  56. struct starfive_cryp_request_ctx *rctx = ctx->rctx;
  57. struct starfive_cryp_dev *cryp = ctx->cryp;
  58. int klen = ctx->keylen, loop;
  59. unsigned int *key = (unsigned int *)ctx->key;
  60. unsigned char *cl;
  61. writel(ctx->keylen, cryp->base + STARFIVE_HASH_SHAWKLEN);
  62. rctx->csr.hash.hmac = 1;
  63. rctx->csr.hash.key_flag = 1;
  64. writel(rctx->csr.hash.v, cryp->base + STARFIVE_HASH_SHACSR);
  65. for (loop = 0; loop < klen / sizeof(unsigned int); loop++, key++)
  66. writel(*key, cryp->base + STARFIVE_HASH_SHAWKR);
  67. if (klen & 0x3) {
  68. cl = (unsigned char *)key;
  69. for (loop = 0; loop < (klen & 0x3); loop++, cl++)
  70. writeb(*cl, cryp->base + STARFIVE_HASH_SHAWKR);
  71. }
  72. if (starfive_hash_wait_key_done(ctx))
  73. return dev_err_probe(cryp->dev, -ETIMEDOUT, "starfive_hash_wait_key_done error\n");
  74. return 0;
  75. }
  76. static void starfive_hash_start(struct starfive_cryp_dev *cryp)
  77. {
  78. union starfive_hash_csr csr;
  79. csr.v = readl(cryp->base + STARFIVE_HASH_SHACSR);
  80. csr.firstb = 0;
  81. csr.final = 1;
  82. writel(csr.v, cryp->base + STARFIVE_HASH_SHACSR);
  83. }
  84. static void starfive_hash_dma_callback(void *param)
  85. {
  86. struct starfive_cryp_dev *cryp = param;
  87. complete(&cryp->dma_done);
  88. }
  89. static void starfive_hash_dma_init(struct starfive_cryp_dev *cryp)
  90. {
  91. cryp->cfg_in.src_addr_width = DMA_SLAVE_BUSWIDTH_16_BYTES;
  92. cryp->cfg_in.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
  93. cryp->cfg_in.src_maxburst = cryp->dma_maxburst;
  94. cryp->cfg_in.dst_maxburst = cryp->dma_maxburst;
  95. cryp->cfg_in.dst_addr = cryp->phys_base + STARFIVE_ALG_FIFO_OFFSET;
  96. dmaengine_slave_config(cryp->tx, &cryp->cfg_in);
  97. init_completion(&cryp->dma_done);
  98. }
  99. static int starfive_hash_dma_xfer(struct starfive_cryp_dev *cryp,
  100. struct scatterlist *sg)
  101. {
  102. struct dma_async_tx_descriptor *in_desc;
  103. union starfive_alg_cr alg_cr;
  104. int ret = 0;
  105. alg_cr.v = 0;
  106. alg_cr.start = 1;
  107. alg_cr.hash_dma_en = 1;
  108. writel(alg_cr.v, cryp->base + STARFIVE_ALG_CR_OFFSET);
  109. writel(sg_dma_len(sg), cryp->base + STARFIVE_DMA_IN_LEN_OFFSET);
  110. sg_dma_len(sg) = ALIGN(sg_dma_len(sg), sizeof(u32));
  111. in_desc = dmaengine_prep_slave_sg(cryp->tx, sg, 1, DMA_MEM_TO_DEV,
  112. DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
  113. if (!in_desc) {
  114. ret = -EINVAL;
  115. goto end;
  116. }
  117. reinit_completion(&cryp->dma_done);
  118. in_desc->callback = starfive_hash_dma_callback;
  119. in_desc->callback_param = cryp;
  120. dmaengine_submit(in_desc);
  121. dma_async_issue_pending(cryp->tx);
  122. if (!wait_for_completion_timeout(&cryp->dma_done,
  123. msecs_to_jiffies(1000)))
  124. ret = -ETIMEDOUT;
  125. end:
  126. alg_cr.v = 0;
  127. alg_cr.clear = 1;
  128. writel(alg_cr.v, cryp->base + STARFIVE_ALG_CR_OFFSET);
  129. return ret;
  130. }
  131. static int starfive_hash_copy_hash(struct ahash_request *req)
  132. {
  133. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  134. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
  135. int count, *data;
  136. int mlen;
  137. if (!req->result)
  138. return 0;
  139. mlen = rctx->digsize / sizeof(u32);
  140. data = (u32 *)req->result;
  141. for (count = 0; count < mlen; count++)
  142. put_unaligned(readl(ctx->cryp->base + STARFIVE_HASH_SHARDR),
  143. &data[count]);
  144. return 0;
  145. }
  146. static void starfive_hash_done_task(struct starfive_cryp_dev *cryp)
  147. {
  148. int err = cryp->err;
  149. if (!err)
  150. err = starfive_hash_copy_hash(cryp->req.hreq);
  151. crypto_finalize_hash_request(cryp->engine, cryp->req.hreq, err);
  152. }
  153. static int starfive_hash_one_request(struct crypto_engine *engine, void *areq)
  154. {
  155. struct ahash_request *req = container_of(areq, struct ahash_request,
  156. base);
  157. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
  158. struct starfive_cryp_request_ctx *rctx = ctx->rctx;
  159. struct starfive_cryp_dev *cryp = ctx->cryp;
  160. struct scatterlist *tsg;
  161. int ret, src_nents, i;
  162. writel(STARFIVE_HASH_RESET, cryp->base + STARFIVE_HASH_SHACSR);
  163. if (starfive_hash_wait_busy(cryp))
  164. return dev_err_probe(cryp->dev, -ETIMEDOUT, "Error resetting hardware\n");
  165. rctx->csr.hash.v = 0;
  166. rctx->csr.hash.mode = ctx->hash_mode;
  167. if (ctx->is_hmac) {
  168. ret = starfive_hash_hmac_key(ctx);
  169. if (ret)
  170. return ret;
  171. } else {
  172. rctx->csr.hash.start = 1;
  173. rctx->csr.hash.firstb = 1;
  174. writel(rctx->csr.hash.v, cryp->base + STARFIVE_HASH_SHACSR);
  175. }
  176. /* No input message, get digest and end. */
  177. if (!rctx->total)
  178. goto hash_start;
  179. starfive_hash_dma_init(cryp);
  180. for_each_sg(rctx->in_sg, tsg, rctx->in_sg_len, i) {
  181. src_nents = dma_map_sg(cryp->dev, tsg, 1, DMA_TO_DEVICE);
  182. if (src_nents == 0)
  183. return dev_err_probe(cryp->dev, -ENOMEM,
  184. "dma_map_sg error\n");
  185. ret = starfive_hash_dma_xfer(cryp, tsg);
  186. dma_unmap_sg(cryp->dev, tsg, 1, DMA_TO_DEVICE);
  187. if (ret)
  188. return ret;
  189. }
  190. hash_start:
  191. starfive_hash_start(cryp);
  192. if (starfive_hash_wait_busy(cryp))
  193. return dev_err_probe(cryp->dev, -ETIMEDOUT, "Error generating digest\n");
  194. if (ctx->is_hmac)
  195. cryp->err = starfive_hash_wait_hmac_done(cryp);
  196. starfive_hash_done_task(cryp);
  197. return 0;
  198. }
  199. static int starfive_hash_init(struct ahash_request *req)
  200. {
  201. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  202. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  203. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  204. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  205. ahash_request_set_callback(&rctx->ahash_fbk_req,
  206. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  207. req->base.complete, req->base.data);
  208. ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src,
  209. req->result, req->nbytes);
  210. return crypto_ahash_init(&rctx->ahash_fbk_req);
  211. }
  212. static int starfive_hash_update(struct ahash_request *req)
  213. {
  214. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  215. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  216. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  217. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  218. ahash_request_set_callback(&rctx->ahash_fbk_req,
  219. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  220. req->base.complete, req->base.data);
  221. ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src,
  222. req->result, req->nbytes);
  223. return crypto_ahash_update(&rctx->ahash_fbk_req);
  224. }
  225. static int starfive_hash_final(struct ahash_request *req)
  226. {
  227. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  228. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  229. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  230. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  231. ahash_request_set_callback(&rctx->ahash_fbk_req,
  232. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  233. req->base.complete, req->base.data);
  234. ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src,
  235. req->result, req->nbytes);
  236. return crypto_ahash_final(&rctx->ahash_fbk_req);
  237. }
  238. static int starfive_hash_finup(struct ahash_request *req)
  239. {
  240. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  241. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  242. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  243. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  244. ahash_request_set_callback(&rctx->ahash_fbk_req,
  245. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  246. req->base.complete, req->base.data);
  247. ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src,
  248. req->result, req->nbytes);
  249. return crypto_ahash_finup(&rctx->ahash_fbk_req);
  250. }
  251. static int starfive_hash_digest(struct ahash_request *req)
  252. {
  253. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  254. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  255. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  256. struct starfive_cryp_dev *cryp = ctx->cryp;
  257. memset(rctx, 0, sizeof(struct starfive_cryp_request_ctx));
  258. cryp->req.hreq = req;
  259. rctx->total = req->nbytes;
  260. rctx->in_sg = req->src;
  261. rctx->blksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
  262. rctx->digsize = crypto_ahash_digestsize(tfm);
  263. rctx->in_sg_len = sg_nents_for_len(rctx->in_sg, rctx->total);
  264. ctx->rctx = rctx;
  265. return crypto_transfer_hash_request_to_engine(cryp->engine, req);
  266. }
  267. static int starfive_hash_export(struct ahash_request *req, void *out)
  268. {
  269. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  270. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  271. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  272. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  273. ahash_request_set_callback(&rctx->ahash_fbk_req,
  274. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  275. req->base.complete, req->base.data);
  276. return crypto_ahash_export(&rctx->ahash_fbk_req, out);
  277. }
  278. static int starfive_hash_import(struct ahash_request *req, const void *in)
  279. {
  280. struct starfive_cryp_request_ctx *rctx = ahash_request_ctx(req);
  281. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  282. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(tfm);
  283. ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk);
  284. ahash_request_set_callback(&rctx->ahash_fbk_req,
  285. req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP,
  286. req->base.complete, req->base.data);
  287. return crypto_ahash_import(&rctx->ahash_fbk_req, in);
  288. }
  289. static int starfive_hash_init_tfm(struct crypto_ahash *hash,
  290. const char *alg_name,
  291. unsigned int mode,
  292. bool is_hmac)
  293. {
  294. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(hash);
  295. ctx->cryp = starfive_cryp_find_dev(ctx);
  296. if (!ctx->cryp)
  297. return -ENODEV;
  298. ctx->ahash_fbk = crypto_alloc_ahash(alg_name, 0,
  299. CRYPTO_ALG_NEED_FALLBACK);
  300. if (IS_ERR(ctx->ahash_fbk))
  301. return dev_err_probe(ctx->cryp->dev, PTR_ERR(ctx->ahash_fbk),
  302. "starfive_hash: Could not load fallback driver.\n");
  303. crypto_ahash_set_statesize(hash, crypto_ahash_statesize(ctx->ahash_fbk));
  304. crypto_ahash_set_reqsize(hash, sizeof(struct starfive_cryp_request_ctx) +
  305. crypto_ahash_reqsize(ctx->ahash_fbk));
  306. ctx->is_hmac = is_hmac;
  307. ctx->hash_mode = mode;
  308. return 0;
  309. }
  310. static void starfive_hash_exit_tfm(struct crypto_ahash *hash)
  311. {
  312. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(hash);
  313. crypto_free_ahash(ctx->ahash_fbk);
  314. }
  315. static int starfive_hash_long_setkey(struct starfive_cryp_ctx *ctx,
  316. const u8 *key, unsigned int keylen,
  317. const char *alg_name)
  318. {
  319. struct crypto_wait wait;
  320. struct ahash_request *req;
  321. struct scatterlist sg;
  322. struct crypto_ahash *ahash_tfm;
  323. u8 *buf;
  324. int ret;
  325. ahash_tfm = crypto_alloc_ahash(alg_name, 0, 0);
  326. if (IS_ERR(ahash_tfm))
  327. return PTR_ERR(ahash_tfm);
  328. req = ahash_request_alloc(ahash_tfm, GFP_KERNEL);
  329. if (!req) {
  330. ret = -ENOMEM;
  331. goto err_free_ahash;
  332. }
  333. crypto_init_wait(&wait);
  334. ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  335. crypto_req_done, &wait);
  336. crypto_ahash_clear_flags(ahash_tfm, ~0);
  337. buf = kzalloc(keylen + STARFIVE_HASH_BUFLEN, GFP_KERNEL);
  338. if (!buf) {
  339. ret = -ENOMEM;
  340. goto err_free_req;
  341. }
  342. memcpy(buf, key, keylen);
  343. sg_init_one(&sg, buf, keylen);
  344. ahash_request_set_crypt(req, &sg, ctx->key, keylen);
  345. ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
  346. kfree(buf);
  347. err_free_req:
  348. ahash_request_free(req);
  349. err_free_ahash:
  350. crypto_free_ahash(ahash_tfm);
  351. return ret;
  352. }
  353. static int starfive_hash_setkey(struct crypto_ahash *hash,
  354. const u8 *key, unsigned int keylen)
  355. {
  356. struct starfive_cryp_ctx *ctx = crypto_ahash_ctx(hash);
  357. unsigned int digestsize = crypto_ahash_digestsize(hash);
  358. unsigned int blocksize = crypto_ahash_blocksize(hash);
  359. const char *alg_name;
  360. crypto_ahash_setkey(ctx->ahash_fbk, key, keylen);
  361. if (keylen <= blocksize) {
  362. memcpy(ctx->key, key, keylen);
  363. ctx->keylen = keylen;
  364. return 0;
  365. }
  366. ctx->keylen = digestsize;
  367. switch (digestsize) {
  368. case SHA224_DIGEST_SIZE:
  369. alg_name = "sha224-starfive";
  370. break;
  371. case SHA256_DIGEST_SIZE:
  372. if (ctx->hash_mode == STARFIVE_HASH_SM3)
  373. alg_name = "sm3-starfive";
  374. else
  375. alg_name = "sha256-starfive";
  376. break;
  377. case SHA384_DIGEST_SIZE:
  378. alg_name = "sha384-starfive";
  379. break;
  380. case SHA512_DIGEST_SIZE:
  381. alg_name = "sha512-starfive";
  382. break;
  383. default:
  384. return -EINVAL;
  385. }
  386. return starfive_hash_long_setkey(ctx, key, keylen, alg_name);
  387. }
  388. static int starfive_sha224_init_tfm(struct crypto_ahash *hash)
  389. {
  390. return starfive_hash_init_tfm(hash, "sha224-generic",
  391. STARFIVE_HASH_SHA224, 0);
  392. }
  393. static int starfive_sha256_init_tfm(struct crypto_ahash *hash)
  394. {
  395. return starfive_hash_init_tfm(hash, "sha256-generic",
  396. STARFIVE_HASH_SHA256, 0);
  397. }
  398. static int starfive_sha384_init_tfm(struct crypto_ahash *hash)
  399. {
  400. return starfive_hash_init_tfm(hash, "sha384-generic",
  401. STARFIVE_HASH_SHA384, 0);
  402. }
  403. static int starfive_sha512_init_tfm(struct crypto_ahash *hash)
  404. {
  405. return starfive_hash_init_tfm(hash, "sha512-generic",
  406. STARFIVE_HASH_SHA512, 0);
  407. }
  408. static int starfive_sm3_init_tfm(struct crypto_ahash *hash)
  409. {
  410. return starfive_hash_init_tfm(hash, "sm3-generic",
  411. STARFIVE_HASH_SM3, 0);
  412. }
  413. static int starfive_hmac_sha224_init_tfm(struct crypto_ahash *hash)
  414. {
  415. return starfive_hash_init_tfm(hash, "hmac(sha224-generic)",
  416. STARFIVE_HASH_SHA224, 1);
  417. }
  418. static int starfive_hmac_sha256_init_tfm(struct crypto_ahash *hash)
  419. {
  420. return starfive_hash_init_tfm(hash, "hmac(sha256-generic)",
  421. STARFIVE_HASH_SHA256, 1);
  422. }
  423. static int starfive_hmac_sha384_init_tfm(struct crypto_ahash *hash)
  424. {
  425. return starfive_hash_init_tfm(hash, "hmac(sha384-generic)",
  426. STARFIVE_HASH_SHA384, 1);
  427. }
  428. static int starfive_hmac_sha512_init_tfm(struct crypto_ahash *hash)
  429. {
  430. return starfive_hash_init_tfm(hash, "hmac(sha512-generic)",
  431. STARFIVE_HASH_SHA512, 1);
  432. }
  433. static int starfive_hmac_sm3_init_tfm(struct crypto_ahash *hash)
  434. {
  435. return starfive_hash_init_tfm(hash, "hmac(sm3-generic)",
  436. STARFIVE_HASH_SM3, 1);
  437. }
  438. static struct ahash_engine_alg algs_sha2_sm3[] = {
  439. {
  440. .base.init = starfive_hash_init,
  441. .base.update = starfive_hash_update,
  442. .base.final = starfive_hash_final,
  443. .base.finup = starfive_hash_finup,
  444. .base.digest = starfive_hash_digest,
  445. .base.export = starfive_hash_export,
  446. .base.import = starfive_hash_import,
  447. .base.init_tfm = starfive_sha224_init_tfm,
  448. .base.exit_tfm = starfive_hash_exit_tfm,
  449. .base.halg = {
  450. .digestsize = SHA224_DIGEST_SIZE,
  451. .statesize = sizeof(struct sha256_state),
  452. .base = {
  453. .cra_name = "sha224",
  454. .cra_driver_name = "sha224-starfive",
  455. .cra_priority = 200,
  456. .cra_flags = CRYPTO_ALG_ASYNC |
  457. CRYPTO_ALG_TYPE_AHASH |
  458. CRYPTO_ALG_NEED_FALLBACK,
  459. .cra_blocksize = SHA224_BLOCK_SIZE,
  460. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  461. .cra_module = THIS_MODULE,
  462. }
  463. },
  464. .op = {
  465. .do_one_request = starfive_hash_one_request,
  466. },
  467. }, {
  468. .base.init = starfive_hash_init,
  469. .base.update = starfive_hash_update,
  470. .base.final = starfive_hash_final,
  471. .base.finup = starfive_hash_finup,
  472. .base.digest = starfive_hash_digest,
  473. .base.export = starfive_hash_export,
  474. .base.import = starfive_hash_import,
  475. .base.init_tfm = starfive_hmac_sha224_init_tfm,
  476. .base.exit_tfm = starfive_hash_exit_tfm,
  477. .base.setkey = starfive_hash_setkey,
  478. .base.halg = {
  479. .digestsize = SHA224_DIGEST_SIZE,
  480. .statesize = sizeof(struct sha256_state),
  481. .base = {
  482. .cra_name = "hmac(sha224)",
  483. .cra_driver_name = "sha224-hmac-starfive",
  484. .cra_priority = 200,
  485. .cra_flags = CRYPTO_ALG_ASYNC |
  486. CRYPTO_ALG_TYPE_AHASH |
  487. CRYPTO_ALG_NEED_FALLBACK,
  488. .cra_blocksize = SHA224_BLOCK_SIZE,
  489. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  490. .cra_module = THIS_MODULE,
  491. }
  492. },
  493. .op = {
  494. .do_one_request = starfive_hash_one_request,
  495. },
  496. }, {
  497. .base.init = starfive_hash_init,
  498. .base.update = starfive_hash_update,
  499. .base.final = starfive_hash_final,
  500. .base.finup = starfive_hash_finup,
  501. .base.digest = starfive_hash_digest,
  502. .base.export = starfive_hash_export,
  503. .base.import = starfive_hash_import,
  504. .base.init_tfm = starfive_sha256_init_tfm,
  505. .base.exit_tfm = starfive_hash_exit_tfm,
  506. .base.halg = {
  507. .digestsize = SHA256_DIGEST_SIZE,
  508. .statesize = sizeof(struct sha256_state),
  509. .base = {
  510. .cra_name = "sha256",
  511. .cra_driver_name = "sha256-starfive",
  512. .cra_priority = 200,
  513. .cra_flags = CRYPTO_ALG_ASYNC |
  514. CRYPTO_ALG_TYPE_AHASH |
  515. CRYPTO_ALG_NEED_FALLBACK,
  516. .cra_blocksize = SHA256_BLOCK_SIZE,
  517. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  518. .cra_module = THIS_MODULE,
  519. }
  520. },
  521. .op = {
  522. .do_one_request = starfive_hash_one_request,
  523. },
  524. }, {
  525. .base.init = starfive_hash_init,
  526. .base.update = starfive_hash_update,
  527. .base.final = starfive_hash_final,
  528. .base.finup = starfive_hash_finup,
  529. .base.digest = starfive_hash_digest,
  530. .base.export = starfive_hash_export,
  531. .base.import = starfive_hash_import,
  532. .base.init_tfm = starfive_hmac_sha256_init_tfm,
  533. .base.exit_tfm = starfive_hash_exit_tfm,
  534. .base.setkey = starfive_hash_setkey,
  535. .base.halg = {
  536. .digestsize = SHA256_DIGEST_SIZE,
  537. .statesize = sizeof(struct sha256_state),
  538. .base = {
  539. .cra_name = "hmac(sha256)",
  540. .cra_driver_name = "sha256-hmac-starfive",
  541. .cra_priority = 200,
  542. .cra_flags = CRYPTO_ALG_ASYNC |
  543. CRYPTO_ALG_TYPE_AHASH |
  544. CRYPTO_ALG_NEED_FALLBACK,
  545. .cra_blocksize = SHA256_BLOCK_SIZE,
  546. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  547. .cra_module = THIS_MODULE,
  548. }
  549. },
  550. .op = {
  551. .do_one_request = starfive_hash_one_request,
  552. },
  553. }, {
  554. .base.init = starfive_hash_init,
  555. .base.update = starfive_hash_update,
  556. .base.final = starfive_hash_final,
  557. .base.finup = starfive_hash_finup,
  558. .base.digest = starfive_hash_digest,
  559. .base.export = starfive_hash_export,
  560. .base.import = starfive_hash_import,
  561. .base.init_tfm = starfive_sha384_init_tfm,
  562. .base.exit_tfm = starfive_hash_exit_tfm,
  563. .base.halg = {
  564. .digestsize = SHA384_DIGEST_SIZE,
  565. .statesize = sizeof(struct sha512_state),
  566. .base = {
  567. .cra_name = "sha384",
  568. .cra_driver_name = "sha384-starfive",
  569. .cra_priority = 200,
  570. .cra_flags = CRYPTO_ALG_ASYNC |
  571. CRYPTO_ALG_TYPE_AHASH |
  572. CRYPTO_ALG_NEED_FALLBACK,
  573. .cra_blocksize = SHA384_BLOCK_SIZE,
  574. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  575. .cra_module = THIS_MODULE,
  576. }
  577. },
  578. .op = {
  579. .do_one_request = starfive_hash_one_request,
  580. },
  581. }, {
  582. .base.init = starfive_hash_init,
  583. .base.update = starfive_hash_update,
  584. .base.final = starfive_hash_final,
  585. .base.finup = starfive_hash_finup,
  586. .base.digest = starfive_hash_digest,
  587. .base.export = starfive_hash_export,
  588. .base.import = starfive_hash_import,
  589. .base.init_tfm = starfive_hmac_sha384_init_tfm,
  590. .base.exit_tfm = starfive_hash_exit_tfm,
  591. .base.setkey = starfive_hash_setkey,
  592. .base.halg = {
  593. .digestsize = SHA384_DIGEST_SIZE,
  594. .statesize = sizeof(struct sha512_state),
  595. .base = {
  596. .cra_name = "hmac(sha384)",
  597. .cra_driver_name = "sha384-hmac-starfive",
  598. .cra_priority = 200,
  599. .cra_flags = CRYPTO_ALG_ASYNC |
  600. CRYPTO_ALG_TYPE_AHASH |
  601. CRYPTO_ALG_NEED_FALLBACK,
  602. .cra_blocksize = SHA384_BLOCK_SIZE,
  603. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  604. .cra_module = THIS_MODULE,
  605. }
  606. },
  607. .op = {
  608. .do_one_request = starfive_hash_one_request,
  609. },
  610. }, {
  611. .base.init = starfive_hash_init,
  612. .base.update = starfive_hash_update,
  613. .base.final = starfive_hash_final,
  614. .base.finup = starfive_hash_finup,
  615. .base.digest = starfive_hash_digest,
  616. .base.export = starfive_hash_export,
  617. .base.import = starfive_hash_import,
  618. .base.init_tfm = starfive_sha512_init_tfm,
  619. .base.exit_tfm = starfive_hash_exit_tfm,
  620. .base.halg = {
  621. .digestsize = SHA512_DIGEST_SIZE,
  622. .statesize = sizeof(struct sha512_state),
  623. .base = {
  624. .cra_name = "sha512",
  625. .cra_driver_name = "sha512-starfive",
  626. .cra_priority = 200,
  627. .cra_flags = CRYPTO_ALG_ASYNC |
  628. CRYPTO_ALG_TYPE_AHASH |
  629. CRYPTO_ALG_NEED_FALLBACK,
  630. .cra_blocksize = SHA512_BLOCK_SIZE,
  631. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  632. .cra_module = THIS_MODULE,
  633. }
  634. },
  635. .op = {
  636. .do_one_request = starfive_hash_one_request,
  637. },
  638. }, {
  639. .base.init = starfive_hash_init,
  640. .base.update = starfive_hash_update,
  641. .base.final = starfive_hash_final,
  642. .base.finup = starfive_hash_finup,
  643. .base.digest = starfive_hash_digest,
  644. .base.export = starfive_hash_export,
  645. .base.import = starfive_hash_import,
  646. .base.init_tfm = starfive_hmac_sha512_init_tfm,
  647. .base.exit_tfm = starfive_hash_exit_tfm,
  648. .base.setkey = starfive_hash_setkey,
  649. .base.halg = {
  650. .digestsize = SHA512_DIGEST_SIZE,
  651. .statesize = sizeof(struct sha512_state),
  652. .base = {
  653. .cra_name = "hmac(sha512)",
  654. .cra_driver_name = "sha512-hmac-starfive",
  655. .cra_priority = 200,
  656. .cra_flags = CRYPTO_ALG_ASYNC |
  657. CRYPTO_ALG_TYPE_AHASH |
  658. CRYPTO_ALG_NEED_FALLBACK,
  659. .cra_blocksize = SHA512_BLOCK_SIZE,
  660. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  661. .cra_module = THIS_MODULE,
  662. }
  663. },
  664. .op = {
  665. .do_one_request = starfive_hash_one_request,
  666. },
  667. }, {
  668. .base.init = starfive_hash_init,
  669. .base.update = starfive_hash_update,
  670. .base.final = starfive_hash_final,
  671. .base.finup = starfive_hash_finup,
  672. .base.digest = starfive_hash_digest,
  673. .base.export = starfive_hash_export,
  674. .base.import = starfive_hash_import,
  675. .base.init_tfm = starfive_sm3_init_tfm,
  676. .base.exit_tfm = starfive_hash_exit_tfm,
  677. .base.halg = {
  678. .digestsize = SM3_DIGEST_SIZE,
  679. .statesize = sizeof(struct sm3_state),
  680. .base = {
  681. .cra_name = "sm3",
  682. .cra_driver_name = "sm3-starfive",
  683. .cra_priority = 200,
  684. .cra_flags = CRYPTO_ALG_ASYNC |
  685. CRYPTO_ALG_TYPE_AHASH |
  686. CRYPTO_ALG_NEED_FALLBACK,
  687. .cra_blocksize = SM3_BLOCK_SIZE,
  688. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  689. .cra_module = THIS_MODULE,
  690. }
  691. },
  692. .op = {
  693. .do_one_request = starfive_hash_one_request,
  694. },
  695. }, {
  696. .base.init = starfive_hash_init,
  697. .base.update = starfive_hash_update,
  698. .base.final = starfive_hash_final,
  699. .base.finup = starfive_hash_finup,
  700. .base.digest = starfive_hash_digest,
  701. .base.export = starfive_hash_export,
  702. .base.import = starfive_hash_import,
  703. .base.init_tfm = starfive_hmac_sm3_init_tfm,
  704. .base.exit_tfm = starfive_hash_exit_tfm,
  705. .base.setkey = starfive_hash_setkey,
  706. .base.halg = {
  707. .digestsize = SM3_DIGEST_SIZE,
  708. .statesize = sizeof(struct sm3_state),
  709. .base = {
  710. .cra_name = "hmac(sm3)",
  711. .cra_driver_name = "sm3-hmac-starfive",
  712. .cra_priority = 200,
  713. .cra_flags = CRYPTO_ALG_ASYNC |
  714. CRYPTO_ALG_TYPE_AHASH |
  715. CRYPTO_ALG_NEED_FALLBACK,
  716. .cra_blocksize = SM3_BLOCK_SIZE,
  717. .cra_ctxsize = sizeof(struct starfive_cryp_ctx),
  718. .cra_module = THIS_MODULE,
  719. }
  720. },
  721. .op = {
  722. .do_one_request = starfive_hash_one_request,
  723. },
  724. },
  725. };
  726. int starfive_hash_register_algs(void)
  727. {
  728. return crypto_engine_register_ahashes(algs_sha2_sm3, ARRAY_SIZE(algs_sha2_sm3));
  729. }
  730. void starfive_hash_unregister_algs(void)
  731. {
  732. crypto_engine_unregister_ahashes(algs_sha2_sm3, ARRAY_SIZE(algs_sha2_sm3));
  733. }