sig.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Public Key Signature Algorithm
  4. *
  5. * Copyright (c) 2023 Herbert Xu <herbert@gondor.apana.org.au>
  6. */
  7. #include <crypto/internal/sig.h>
  8. #include <linux/cryptouser.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/seq_file.h>
  12. #include <linux/string.h>
  13. #include <net/netlink.h>
  14. #include "internal.h"
  15. static void crypto_sig_exit_tfm(struct crypto_tfm *tfm)
  16. {
  17. struct crypto_sig *sig = __crypto_sig_tfm(tfm);
  18. struct sig_alg *alg = crypto_sig_alg(sig);
  19. alg->exit(sig);
  20. }
  21. static int crypto_sig_init_tfm(struct crypto_tfm *tfm)
  22. {
  23. struct crypto_sig *sig = __crypto_sig_tfm(tfm);
  24. struct sig_alg *alg = crypto_sig_alg(sig);
  25. if (alg->exit)
  26. sig->base.exit = crypto_sig_exit_tfm;
  27. if (alg->init)
  28. return alg->init(sig);
  29. return 0;
  30. }
  31. static void crypto_sig_free_instance(struct crypto_instance *inst)
  32. {
  33. struct sig_instance *sig = sig_instance(inst);
  34. sig->free(sig);
  35. }
  36. static void __maybe_unused crypto_sig_show(struct seq_file *m,
  37. struct crypto_alg *alg)
  38. {
  39. seq_puts(m, "type : sig\n");
  40. }
  41. static int __maybe_unused crypto_sig_report(struct sk_buff *skb,
  42. struct crypto_alg *alg)
  43. {
  44. struct crypto_report_sig rsig = {};
  45. strscpy(rsig.type, "sig", sizeof(rsig.type));
  46. return nla_put(skb, CRYPTOCFGA_REPORT_SIG, sizeof(rsig), &rsig);
  47. }
  48. static const struct crypto_type crypto_sig_type = {
  49. .extsize = crypto_alg_extsize,
  50. .init_tfm = crypto_sig_init_tfm,
  51. .free = crypto_sig_free_instance,
  52. #ifdef CONFIG_PROC_FS
  53. .show = crypto_sig_show,
  54. #endif
  55. #if IS_ENABLED(CONFIG_CRYPTO_USER)
  56. .report = crypto_sig_report,
  57. #endif
  58. .maskclear = ~CRYPTO_ALG_TYPE_MASK,
  59. .maskset = CRYPTO_ALG_TYPE_MASK,
  60. .type = CRYPTO_ALG_TYPE_SIG,
  61. .tfmsize = offsetof(struct crypto_sig, base),
  62. .algsize = offsetof(struct sig_alg, base),
  63. };
  64. struct crypto_sig *crypto_alloc_sig(const char *alg_name, u32 type, u32 mask)
  65. {
  66. return crypto_alloc_tfm(alg_name, &crypto_sig_type, type, mask);
  67. }
  68. EXPORT_SYMBOL_GPL(crypto_alloc_sig);
  69. static int sig_default_sign(struct crypto_sig *tfm,
  70. const void *src, unsigned int slen,
  71. void *dst, unsigned int dlen)
  72. {
  73. return -ENOSYS;
  74. }
  75. static int sig_default_verify(struct crypto_sig *tfm,
  76. const void *src, unsigned int slen,
  77. const void *dst, unsigned int dlen)
  78. {
  79. return -ENOSYS;
  80. }
  81. static int sig_default_set_key(struct crypto_sig *tfm,
  82. const void *key, unsigned int keylen)
  83. {
  84. return -ENOSYS;
  85. }
  86. static unsigned int sig_default_size(struct crypto_sig *tfm)
  87. {
  88. return DIV_ROUND_UP_POW2(crypto_sig_keysize(tfm), BITS_PER_BYTE);
  89. }
  90. static int sig_prepare_alg(struct sig_alg *alg)
  91. {
  92. struct crypto_alg *base = &alg->base;
  93. if (!alg->sign)
  94. alg->sign = sig_default_sign;
  95. if (!alg->verify)
  96. alg->verify = sig_default_verify;
  97. if (!alg->set_priv_key)
  98. alg->set_priv_key = sig_default_set_key;
  99. if (!alg->set_pub_key)
  100. return -EINVAL;
  101. if (!alg->key_size)
  102. return -EINVAL;
  103. if (!alg->max_size)
  104. alg->max_size = sig_default_size;
  105. if (!alg->digest_size)
  106. alg->digest_size = sig_default_size;
  107. base->cra_type = &crypto_sig_type;
  108. base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
  109. base->cra_flags |= CRYPTO_ALG_TYPE_SIG;
  110. return 0;
  111. }
  112. int crypto_register_sig(struct sig_alg *alg)
  113. {
  114. struct crypto_alg *base = &alg->base;
  115. int err;
  116. err = sig_prepare_alg(alg);
  117. if (err)
  118. return err;
  119. return crypto_register_alg(base);
  120. }
  121. EXPORT_SYMBOL_GPL(crypto_register_sig);
  122. void crypto_unregister_sig(struct sig_alg *alg)
  123. {
  124. crypto_unregister_alg(&alg->base);
  125. }
  126. EXPORT_SYMBOL_GPL(crypto_unregister_sig);
  127. int sig_register_instance(struct crypto_template *tmpl,
  128. struct sig_instance *inst)
  129. {
  130. int err;
  131. if (WARN_ON(!inst->free))
  132. return -EINVAL;
  133. err = sig_prepare_alg(&inst->alg);
  134. if (err)
  135. return err;
  136. return crypto_register_instance(tmpl, sig_crypto_instance(inst));
  137. }
  138. EXPORT_SYMBOL_GPL(sig_register_instance);
  139. int crypto_grab_sig(struct crypto_sig_spawn *spawn,
  140. struct crypto_instance *inst,
  141. const char *name, u32 type, u32 mask)
  142. {
  143. spawn->base.frontend = &crypto_sig_type;
  144. return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
  145. }
  146. EXPORT_SYMBOL_GPL(crypto_grab_sig);
  147. MODULE_LICENSE("GPL");
  148. MODULE_DESCRIPTION("Public Key Signature Algorithms");