blake2b.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Crypto API support for BLAKE2b
  4. *
  5. * Copyright 2025 Google LLC
  6. */
  7. #include <crypto/blake2b.h>
  8. #include <crypto/internal/hash.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. struct blake2b_tfm_ctx {
  12. unsigned int keylen;
  13. u8 key[BLAKE2B_KEY_SIZE];
  14. };
  15. static int crypto_blake2b_setkey(struct crypto_shash *tfm,
  16. const u8 *key, unsigned int keylen)
  17. {
  18. struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(tfm);
  19. if (keylen > BLAKE2B_KEY_SIZE)
  20. return -EINVAL;
  21. memcpy(tctx->key, key, keylen);
  22. tctx->keylen = keylen;
  23. return 0;
  24. }
  25. #define BLAKE2B_CTX(desc) ((struct blake2b_ctx *)shash_desc_ctx(desc))
  26. static int crypto_blake2b_init(struct shash_desc *desc)
  27. {
  28. const struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
  29. unsigned int digestsize = crypto_shash_digestsize(desc->tfm);
  30. blake2b_init_key(BLAKE2B_CTX(desc), digestsize,
  31. tctx->key, tctx->keylen);
  32. return 0;
  33. }
  34. static int crypto_blake2b_update(struct shash_desc *desc,
  35. const u8 *data, unsigned int len)
  36. {
  37. blake2b_update(BLAKE2B_CTX(desc), data, len);
  38. return 0;
  39. }
  40. static int crypto_blake2b_final(struct shash_desc *desc, u8 *out)
  41. {
  42. blake2b_final(BLAKE2B_CTX(desc), out);
  43. return 0;
  44. }
  45. static int crypto_blake2b_digest(struct shash_desc *desc,
  46. const u8 *data, unsigned int len, u8 *out)
  47. {
  48. const struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
  49. unsigned int digestsize = crypto_shash_digestsize(desc->tfm);
  50. blake2b(tctx->key, tctx->keylen, data, len, out, digestsize);
  51. return 0;
  52. }
  53. #define BLAKE2B_ALG(name, digest_size) \
  54. { \
  55. .base.cra_name = name, \
  56. .base.cra_driver_name = name "-lib", \
  57. .base.cra_priority = 300, \
  58. .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
  59. .base.cra_blocksize = BLAKE2B_BLOCK_SIZE, \
  60. .base.cra_ctxsize = sizeof(struct blake2b_tfm_ctx), \
  61. .base.cra_module = THIS_MODULE, \
  62. .digestsize = digest_size, \
  63. .setkey = crypto_blake2b_setkey, \
  64. .init = crypto_blake2b_init, \
  65. .update = crypto_blake2b_update, \
  66. .final = crypto_blake2b_final, \
  67. .digest = crypto_blake2b_digest, \
  68. .descsize = sizeof(struct blake2b_ctx), \
  69. }
  70. static struct shash_alg algs[] = {
  71. BLAKE2B_ALG("blake2b-160", BLAKE2B_160_HASH_SIZE),
  72. BLAKE2B_ALG("blake2b-256", BLAKE2B_256_HASH_SIZE),
  73. BLAKE2B_ALG("blake2b-384", BLAKE2B_384_HASH_SIZE),
  74. BLAKE2B_ALG("blake2b-512", BLAKE2B_512_HASH_SIZE),
  75. };
  76. static int __init crypto_blake2b_mod_init(void)
  77. {
  78. return crypto_register_shashes(algs, ARRAY_SIZE(algs));
  79. }
  80. module_init(crypto_blake2b_mod_init);
  81. static void __exit crypto_blake2b_mod_exit(void)
  82. {
  83. crypto_unregister_shashes(algs, ARRAY_SIZE(algs));
  84. }
  85. module_exit(crypto_blake2b_mod_exit);
  86. MODULE_LICENSE("GPL");
  87. MODULE_DESCRIPTION("Crypto API support for BLAKE2b");
  88. MODULE_ALIAS_CRYPTO("blake2b-160");
  89. MODULE_ALIAS_CRYPTO("blake2b-160-lib");
  90. MODULE_ALIAS_CRYPTO("blake2b-256");
  91. MODULE_ALIAS_CRYPTO("blake2b-256-lib");
  92. MODULE_ALIAS_CRYPTO("blake2b-384");
  93. MODULE_ALIAS_CRYPTO("blake2b-384-lib");
  94. MODULE_ALIAS_CRYPTO("blake2b-512");
  95. MODULE_ALIAS_CRYPTO("blake2b-512-lib");