rsa.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * RSA internal helpers
  4. *
  5. * Copyright (c) 2015, Intel Corporation
  6. * Authors: Tadeusz Struk <tadeusz.struk@intel.com>
  7. */
  8. #ifndef _RSA_HELPER_
  9. #define _RSA_HELPER_
  10. #include <linux/types.h>
  11. #include <crypto/akcipher.h>
  12. /**
  13. * rsa_key - RSA key structure
  14. * @n : RSA modulus raw byte stream
  15. * @e : RSA public exponent raw byte stream
  16. * @d : RSA private exponent raw byte stream
  17. * @p : RSA prime factor p of n raw byte stream
  18. * @q : RSA prime factor q of n raw byte stream
  19. * @dp : RSA exponent d mod (p - 1) raw byte stream
  20. * @dq : RSA exponent d mod (q - 1) raw byte stream
  21. * @qinv : RSA CRT coefficient q^(-1) mod p raw byte stream
  22. * @n_sz : length in bytes of RSA modulus n
  23. * @e_sz : length in bytes of RSA public exponent
  24. * @d_sz : length in bytes of RSA private exponent
  25. * @p_sz : length in bytes of p field
  26. * @q_sz : length in bytes of q field
  27. * @dp_sz : length in bytes of dp field
  28. * @dq_sz : length in bytes of dq field
  29. * @qinv_sz : length in bytes of qinv field
  30. */
  31. struct rsa_key {
  32. const u8 *n;
  33. const u8 *e;
  34. const u8 *d;
  35. const u8 *p;
  36. const u8 *q;
  37. const u8 *dp;
  38. const u8 *dq;
  39. const u8 *qinv;
  40. size_t n_sz;
  41. size_t e_sz;
  42. size_t d_sz;
  43. size_t p_sz;
  44. size_t q_sz;
  45. size_t dp_sz;
  46. size_t dq_sz;
  47. size_t qinv_sz;
  48. };
  49. int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key,
  50. unsigned int key_len);
  51. int rsa_parse_priv_key(struct rsa_key *rsa_key, const void *key,
  52. unsigned int key_len);
  53. #define RSA_PUB (true)
  54. #define RSA_PRIV (false)
  55. static inline int rsa_set_key(struct crypto_akcipher *child,
  56. unsigned int *key_size, bool is_pubkey,
  57. const void *key, unsigned int keylen)
  58. {
  59. int err;
  60. *key_size = 0;
  61. if (is_pubkey)
  62. err = crypto_akcipher_set_pub_key(child, key, keylen);
  63. else
  64. err = crypto_akcipher_set_priv_key(child, key, keylen);
  65. if (err)
  66. return err;
  67. /* Find out new modulus size from rsa implementation */
  68. err = crypto_akcipher_maxsize(child);
  69. if (err > PAGE_SIZE)
  70. return -ENOTSUPP;
  71. *key_size = err;
  72. return 0;
  73. }
  74. extern struct crypto_template rsa_pkcs1pad_tmpl;
  75. extern struct crypto_template rsassa_pkcs1_tmpl;
  76. #endif