akcipher-nettle.c.inc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /*
  2. * QEMU Crypto akcipher algorithms
  3. *
  4. * Copyright (c) 2022 Bytedance
  5. * Author: lei he <helei.sig11@bytedance.com>
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  19. *
  20. */
  21. #include <nettle/rsa.h>
  22. #include "qemu/osdep.h"
  23. #include "qemu/host-utils.h"
  24. #include "crypto/akcipher.h"
  25. #include "crypto/random.h"
  26. #include "qapi/error.h"
  27. #include "sysemu/cryptodev.h"
  28. #include "rsakey.h"
  29. typedef struct QCryptoNettleRSA {
  30. QCryptoAkCipher akcipher;
  31. struct rsa_public_key pub;
  32. struct rsa_private_key priv;
  33. QCryptoRSAPaddingAlgorithm padding_alg;
  34. QCryptoHashAlgorithm hash_alg;
  35. } QCryptoNettleRSA;
  36. static void qcrypto_nettle_rsa_free(QCryptoAkCipher *akcipher)
  37. {
  38. QCryptoNettleRSA *rsa = (QCryptoNettleRSA *)akcipher;
  39. if (!rsa) {
  40. return;
  41. }
  42. rsa_public_key_clear(&rsa->pub);
  43. rsa_private_key_clear(&rsa->priv);
  44. g_free(rsa);
  45. }
  46. static QCryptoAkCipher *qcrypto_nettle_rsa_new(
  47. const QCryptoAkCipherOptionsRSA *opt,
  48. QCryptoAkCipherKeyType type,
  49. const uint8_t *key, size_t keylen,
  50. Error **errp);
  51. QCryptoAkCipher *qcrypto_akcipher_new(const QCryptoAkCipherOptions *opts,
  52. QCryptoAkCipherKeyType type,
  53. const uint8_t *key, size_t keylen,
  54. Error **errp)
  55. {
  56. switch (opts->alg) {
  57. case QCRYPTO_AKCIPHER_ALG_RSA:
  58. return qcrypto_nettle_rsa_new(&opts->u.rsa, type, key, keylen, errp);
  59. default:
  60. error_setg(errp, "Unsupported algorithm: %u", opts->alg);
  61. return NULL;
  62. }
  63. return NULL;
  64. }
  65. static void qcrypto_nettle_rsa_set_akcipher_size(QCryptoAkCipher *akcipher,
  66. int key_size)
  67. {
  68. akcipher->max_plaintext_len = key_size;
  69. akcipher->max_ciphertext_len = key_size;
  70. akcipher->max_signature_len = key_size;
  71. akcipher->max_dgst_len = key_size;
  72. }
  73. static int qcrypt_nettle_parse_rsa_private_key(QCryptoNettleRSA *rsa,
  74. const uint8_t *key,
  75. size_t keylen,
  76. Error **errp)
  77. {
  78. g_autoptr(QCryptoAkCipherRSAKey) rsa_key = qcrypto_akcipher_rsakey_parse(
  79. QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE, key, keylen, errp);
  80. if (!rsa_key) {
  81. return -1;
  82. }
  83. nettle_mpz_init_set_str_256_u(rsa->pub.n, rsa_key->n.len, rsa_key->n.data);
  84. nettle_mpz_init_set_str_256_u(rsa->pub.e, rsa_key->e.len, rsa_key->e.data);
  85. nettle_mpz_init_set_str_256_u(rsa->priv.d, rsa_key->d.len, rsa_key->d.data);
  86. nettle_mpz_init_set_str_256_u(rsa->priv.p, rsa_key->p.len, rsa_key->p.data);
  87. nettle_mpz_init_set_str_256_u(rsa->priv.q, rsa_key->q.len, rsa_key->q.data);
  88. nettle_mpz_init_set_str_256_u(rsa->priv.a, rsa_key->dp.len,
  89. rsa_key->dp.data);
  90. nettle_mpz_init_set_str_256_u(rsa->priv.b, rsa_key->dq.len,
  91. rsa_key->dq.data);
  92. nettle_mpz_init_set_str_256_u(rsa->priv.c, rsa_key->u.len, rsa_key->u.data);
  93. if (!rsa_public_key_prepare(&rsa->pub)) {
  94. error_setg(errp, "Failed to check RSA key");
  95. return -1;
  96. }
  97. /**
  98. * Since in the kernel's unit test, the p, q, a, b, c of some
  99. * private keys is 0, only the simplest length check is done here
  100. */
  101. if (rsa_key->p.len > 1 &&
  102. rsa_key->q.len > 1 &&
  103. rsa_key->dp.len > 1 &&
  104. rsa_key->dq.len > 1 &&
  105. rsa_key->u.len > 1) {
  106. if (!rsa_private_key_prepare(&rsa->priv)) {
  107. error_setg(errp, "Failed to check RSA key");
  108. return -1;
  109. }
  110. } else {
  111. rsa->priv.size = rsa->pub.size;
  112. }
  113. qcrypto_nettle_rsa_set_akcipher_size(
  114. (QCryptoAkCipher *)rsa, rsa->priv.size);
  115. return 0;
  116. }
  117. static int qcrypt_nettle_parse_rsa_public_key(QCryptoNettleRSA *rsa,
  118. const uint8_t *key,
  119. size_t keylen,
  120. Error **errp)
  121. {
  122. g_autoptr(QCryptoAkCipherRSAKey) rsa_key = qcrypto_akcipher_rsakey_parse(
  123. QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC, key, keylen, errp);
  124. if (!rsa_key) {
  125. return -1;
  126. }
  127. nettle_mpz_init_set_str_256_u(rsa->pub.n, rsa_key->n.len, rsa_key->n.data);
  128. nettle_mpz_init_set_str_256_u(rsa->pub.e, rsa_key->e.len, rsa_key->e.data);
  129. if (!rsa_public_key_prepare(&rsa->pub)) {
  130. error_setg(errp, "Failed to check RSA key");
  131. return -1;
  132. }
  133. qcrypto_nettle_rsa_set_akcipher_size(
  134. (QCryptoAkCipher *)rsa, rsa->pub.size);
  135. return 0;
  136. }
  137. static void wrap_nettle_random_func(void *ctx, size_t len, uint8_t *out)
  138. {
  139. qcrypto_random_bytes(out, len, &error_abort);
  140. }
  141. static int qcrypto_nettle_rsa_encrypt(QCryptoAkCipher *akcipher,
  142. const void *data, size_t data_len,
  143. void *enc, size_t enc_len,
  144. Error **errp)
  145. {
  146. QCryptoNettleRSA *rsa = (QCryptoNettleRSA *)akcipher;
  147. mpz_t c;
  148. int ret = -1;
  149. if (data_len > rsa->pub.size) {
  150. error_setg(errp, "Plaintext length %zu is greater than key size: %zu",
  151. data_len, rsa->pub.size);
  152. return ret;
  153. }
  154. if (enc_len < rsa->pub.size) {
  155. error_setg(errp, "Ciphertext buffer length %zu is less than "
  156. "key size: %zu", enc_len, rsa->pub.size);
  157. return ret;
  158. }
  159. /* Nettle do not support RSA encryption without any padding */
  160. switch (rsa->padding_alg) {
  161. case QCRYPTO_RSA_PADDING_ALG_RAW:
  162. error_setg(errp, "RSA with raw padding is not supported");
  163. break;
  164. case QCRYPTO_RSA_PADDING_ALG_PKCS1:
  165. mpz_init(c);
  166. if (rsa_encrypt(&rsa->pub, NULL, wrap_nettle_random_func,
  167. data_len, (uint8_t *)data, c) != 1) {
  168. error_setg(errp, "Failed to encrypt");
  169. } else {
  170. nettle_mpz_get_str_256(enc_len, (uint8_t *)enc, c);
  171. ret = nettle_mpz_sizeinbase_256_u(c);
  172. }
  173. mpz_clear(c);
  174. break;
  175. default:
  176. error_setg(errp, "Unknown padding");
  177. }
  178. return ret;
  179. }
  180. static int qcrypto_nettle_rsa_decrypt(QCryptoAkCipher *akcipher,
  181. const void *enc, size_t enc_len,
  182. void *data, size_t data_len,
  183. Error **errp)
  184. {
  185. QCryptoNettleRSA *rsa = (QCryptoNettleRSA *)akcipher;
  186. mpz_t c;
  187. int ret = -1;
  188. if (enc_len > rsa->priv.size) {
  189. error_setg(errp, "Ciphertext length %zu is greater than key size: %zu",
  190. enc_len, rsa->priv.size);
  191. return ret;
  192. }
  193. switch (rsa->padding_alg) {
  194. case QCRYPTO_RSA_PADDING_ALG_RAW:
  195. error_setg(errp, "RSA with raw padding is not supported");
  196. break;
  197. case QCRYPTO_RSA_PADDING_ALG_PKCS1:
  198. nettle_mpz_init_set_str_256_u(c, enc_len, enc);
  199. if (!rsa_decrypt(&rsa->priv, &data_len, (uint8_t *)data, c)) {
  200. error_setg(errp, "Failed to decrypt");
  201. } else {
  202. ret = data_len;
  203. }
  204. mpz_clear(c);
  205. break;
  206. default:
  207. error_setg(errp, "Unknown padding algorithm: %d", rsa->padding_alg);
  208. }
  209. return ret;
  210. }
  211. static int qcrypto_nettle_rsa_sign(QCryptoAkCipher *akcipher,
  212. const void *data, size_t data_len,
  213. void *sig, size_t sig_len, Error **errp)
  214. {
  215. QCryptoNettleRSA *rsa = (QCryptoNettleRSA *)akcipher;
  216. int ret = -1, rv;
  217. mpz_t s;
  218. /**
  219. * The RSA algorithm cannot be used for signature/verification
  220. * without padding.
  221. */
  222. if (rsa->padding_alg == QCRYPTO_RSA_PADDING_ALG_RAW) {
  223. error_setg(errp, "Try to make signature without padding");
  224. return ret;
  225. }
  226. if (data_len > rsa->priv.size) {
  227. error_setg(errp, "Data length %zu is greater than key size: %zu",
  228. data_len, rsa->priv.size);
  229. return ret;
  230. }
  231. if (sig_len < rsa->priv.size) {
  232. error_setg(errp, "Signature buffer length %zu is less than "
  233. "key size: %zu", sig_len, rsa->priv.size);
  234. return ret;
  235. }
  236. mpz_init(s);
  237. switch (rsa->hash_alg) {
  238. case QCRYPTO_HASH_ALG_MD5:
  239. rv = rsa_md5_sign_digest(&rsa->priv, data, s);
  240. break;
  241. case QCRYPTO_HASH_ALG_SHA1:
  242. rv = rsa_sha1_sign_digest(&rsa->priv, data, s);
  243. break;
  244. case QCRYPTO_HASH_ALG_SHA256:
  245. rv = rsa_sha256_sign_digest(&rsa->priv, data, s);
  246. break;
  247. case QCRYPTO_HASH_ALG_SHA512:
  248. rv = rsa_sha512_sign_digest(&rsa->priv, data, s);
  249. break;
  250. default:
  251. error_setg(errp, "Unknown hash algorithm: %d", rsa->hash_alg);
  252. goto cleanup;
  253. }
  254. if (rv != 1) {
  255. error_setg(errp, "Failed to make signature");
  256. goto cleanup;
  257. }
  258. nettle_mpz_get_str_256(sig_len, (uint8_t *)sig, s);
  259. ret = nettle_mpz_sizeinbase_256_u(s);
  260. cleanup:
  261. mpz_clear(s);
  262. return ret;
  263. }
  264. static int qcrypto_nettle_rsa_verify(QCryptoAkCipher *akcipher,
  265. const void *sig, size_t sig_len,
  266. const void *data, size_t data_len,
  267. Error **errp)
  268. {
  269. QCryptoNettleRSA *rsa = (QCryptoNettleRSA *)akcipher;
  270. int ret = -1, rv;
  271. mpz_t s;
  272. /**
  273. * The RSA algorithm cannot be used for signature/verification
  274. * without padding.
  275. */
  276. if (rsa->padding_alg == QCRYPTO_RSA_PADDING_ALG_RAW) {
  277. error_setg(errp, "Try to verify signature without padding");
  278. return ret;
  279. }
  280. if (data_len > rsa->pub.size) {
  281. error_setg(errp, "Data length %zu is greater than key size: %zu",
  282. data_len, rsa->pub.size);
  283. return ret;
  284. }
  285. if (sig_len < rsa->pub.size) {
  286. error_setg(errp, "Signature length %zu is greater than key size: %zu",
  287. sig_len, rsa->pub.size);
  288. return ret;
  289. }
  290. nettle_mpz_init_set_str_256_u(s, sig_len, sig);
  291. switch (rsa->hash_alg) {
  292. case QCRYPTO_HASH_ALG_MD5:
  293. rv = rsa_md5_verify_digest(&rsa->pub, data, s);
  294. break;
  295. case QCRYPTO_HASH_ALG_SHA1:
  296. rv = rsa_sha1_verify_digest(&rsa->pub, data, s);
  297. break;
  298. case QCRYPTO_HASH_ALG_SHA256:
  299. rv = rsa_sha256_verify_digest(&rsa->pub, data, s);
  300. break;
  301. case QCRYPTO_HASH_ALG_SHA512:
  302. rv = rsa_sha512_verify_digest(&rsa->pub, data, s);
  303. break;
  304. default:
  305. error_setg(errp, "Unsupported hash algorithm: %d", rsa->hash_alg);
  306. goto cleanup;
  307. }
  308. if (rv != 1) {
  309. error_setg(errp, "Failed to verify signature");
  310. goto cleanup;
  311. }
  312. ret = 0;
  313. cleanup:
  314. mpz_clear(s);
  315. return ret;
  316. }
  317. QCryptoAkCipherDriver nettle_rsa = {
  318. .encrypt = qcrypto_nettle_rsa_encrypt,
  319. .decrypt = qcrypto_nettle_rsa_decrypt,
  320. .sign = qcrypto_nettle_rsa_sign,
  321. .verify = qcrypto_nettle_rsa_verify,
  322. .free = qcrypto_nettle_rsa_free,
  323. };
  324. static QCryptoAkCipher *qcrypto_nettle_rsa_new(
  325. const QCryptoAkCipherOptionsRSA *opt,
  326. QCryptoAkCipherKeyType type,
  327. const uint8_t *key, size_t keylen,
  328. Error **errp)
  329. {
  330. QCryptoNettleRSA *rsa = g_new0(QCryptoNettleRSA, 1);
  331. rsa->padding_alg = opt->padding_alg;
  332. rsa->hash_alg = opt->hash_alg;
  333. rsa->akcipher.driver = &nettle_rsa;
  334. rsa_public_key_init(&rsa->pub);
  335. rsa_private_key_init(&rsa->priv);
  336. switch (type) {
  337. case QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE:
  338. if (qcrypt_nettle_parse_rsa_private_key(rsa, key, keylen, errp) != 0) {
  339. goto error;
  340. }
  341. break;
  342. case QCRYPTO_AKCIPHER_KEY_TYPE_PUBLIC:
  343. if (qcrypt_nettle_parse_rsa_public_key(rsa, key, keylen, errp) != 0) {
  344. goto error;
  345. }
  346. break;
  347. default:
  348. error_setg(errp, "Unknown akcipher key type %d", type);
  349. goto error;
  350. }
  351. return (QCryptoAkCipher *)rsa;
  352. error:
  353. qcrypto_nettle_rsa_free((QCryptoAkCipher *)rsa);
  354. return NULL;
  355. }
  356. bool qcrypto_akcipher_supports(QCryptoAkCipherOptions *opts)
  357. {
  358. switch (opts->alg) {
  359. case QCRYPTO_AKCIPHER_ALG_RSA:
  360. switch (opts->u.rsa.padding_alg) {
  361. case QCRYPTO_RSA_PADDING_ALG_PKCS1:
  362. switch (opts->u.rsa.hash_alg) {
  363. case QCRYPTO_HASH_ALG_MD5:
  364. case QCRYPTO_HASH_ALG_SHA1:
  365. case QCRYPTO_HASH_ALG_SHA256:
  366. case QCRYPTO_HASH_ALG_SHA512:
  367. return true;
  368. default:
  369. return false;
  370. }
  371. case QCRYPTO_RSA_PADDING_ALG_RAW:
  372. default:
  373. return false;
  374. }
  375. break;
  376. default:
  377. return false;
  378. }
  379. }