0001-Mitigate-the-Bleichenbacher-timing-attacks-in-the-RSA-decryption-API-CVE-2020-25657.patch 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. From 84c53958def0f510e92119fca14d74f94215827a Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
  3. Date: Tue, 28 Jun 2022 21:17:01 +0200
  4. Subject: [PATCH] Mitigate the Bleichenbacher timing attacks in the RSA
  5. decryption API (CVE-2020-25657)
  6. Fixes #282
  7. [Retrieved from:
  8. https://gitlab.com/m2crypto/m2crypto/-/commit/84c53958def0f510e92119fca14d74f94215827a]
  9. Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
  10. ---
  11. src/SWIG/_m2crypto_wrap.c | 20 ++++++++++++--------
  12. src/SWIG/_rsa.i | 20 ++++++++++++--------
  13. tests/test_rsa.py | 15 +++++++--------
  14. 3 files changed, 31 insertions(+), 24 deletions(-)
  15. diff --git a/src/SWIG/_m2crypto_wrap.c b/src/SWIG/_m2crypto_wrap.c
  16. index aba9eb6d..a9f30da9 100644
  17. --- a/src/SWIG/_m2crypto_wrap.c
  18. +++ b/src/SWIG/_m2crypto_wrap.c
  19. @@ -7040,9 +7040,10 @@ PyObject *rsa_private_encrypt(RSA *rsa, PyObject *from, int padding) {
  20. tlen = RSA_private_encrypt(flen, (unsigned char *)fbuf,
  21. (unsigned char *)tbuf, rsa, padding);
  22. if (tlen == -1) {
  23. - m2_PyErr_Msg(_rsa_err);
  24. + ERR_clear_error();
  25. + PyErr_Clear();
  26. PyMem_Free(tbuf);
  27. - return NULL;
  28. + Py_RETURN_NONE;
  29. }
  30. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  31. @@ -7070,9 +7071,10 @@ PyObject *rsa_public_decrypt(RSA *rsa, PyObject *from, int padding) {
  32. tlen = RSA_public_decrypt(flen, (unsigned char *)fbuf,
  33. (unsigned char *)tbuf, rsa, padding);
  34. if (tlen == -1) {
  35. - m2_PyErr_Msg(_rsa_err);
  36. + ERR_clear_error();
  37. + PyErr_Clear();
  38. PyMem_Free(tbuf);
  39. - return NULL;
  40. + Py_RETURN_NONE;
  41. }
  42. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  43. @@ -7097,9 +7099,10 @@ PyObject *rsa_public_encrypt(RSA *rsa, PyObject *from, int padding) {
  44. tlen = RSA_public_encrypt(flen, (unsigned char *)fbuf,
  45. (unsigned char *)tbuf, rsa, padding);
  46. if (tlen == -1) {
  47. - m2_PyErr_Msg(_rsa_err);
  48. + ERR_clear_error();
  49. + PyErr_Clear();
  50. PyMem_Free(tbuf);
  51. - return NULL;
  52. + Py_RETURN_NONE;
  53. }
  54. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  55. @@ -7124,9 +7127,10 @@ PyObject *rsa_private_decrypt(RSA *rsa, PyObject *from, int padding) {
  56. tlen = RSA_private_decrypt(flen, (unsigned char *)fbuf,
  57. (unsigned char *)tbuf, rsa, padding);
  58. if (tlen == -1) {
  59. - m2_PyErr_Msg(_rsa_err);
  60. + ERR_clear_error();
  61. + PyErr_Clear();
  62. PyMem_Free(tbuf);
  63. - return NULL;
  64. + Py_RETURN_NONE;
  65. }
  66. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  67. diff --git a/src/SWIG/_rsa.i b/src/SWIG/_rsa.i
  68. index bc714e01..1377b8be 100644
  69. --- a/src/SWIG/_rsa.i
  70. +++ b/src/SWIG/_rsa.i
  71. @@ -239,9 +239,10 @@ PyObject *rsa_private_encrypt(RSA *rsa, PyObject *from, int padding) {
  72. tlen = RSA_private_encrypt(flen, (unsigned char *)fbuf,
  73. (unsigned char *)tbuf, rsa, padding);
  74. if (tlen == -1) {
  75. - m2_PyErr_Msg(_rsa_err);
  76. + ERR_clear_error();
  77. + PyErr_Clear();
  78. PyMem_Free(tbuf);
  79. - return NULL;
  80. + Py_RETURN_NONE;
  81. }
  82. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  83. @@ -269,9 +270,10 @@ PyObject *rsa_public_decrypt(RSA *rsa, PyObject *from, int padding) {
  84. tlen = RSA_public_decrypt(flen, (unsigned char *)fbuf,
  85. (unsigned char *)tbuf, rsa, padding);
  86. if (tlen == -1) {
  87. - m2_PyErr_Msg(_rsa_err);
  88. + ERR_clear_error();
  89. + PyErr_Clear();
  90. PyMem_Free(tbuf);
  91. - return NULL;
  92. + Py_RETURN_NONE;
  93. }
  94. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  95. @@ -296,9 +298,10 @@ PyObject *rsa_public_encrypt(RSA *rsa, PyObject *from, int padding) {
  96. tlen = RSA_public_encrypt(flen, (unsigned char *)fbuf,
  97. (unsigned char *)tbuf, rsa, padding);
  98. if (tlen == -1) {
  99. - m2_PyErr_Msg(_rsa_err);
  100. + ERR_clear_error();
  101. + PyErr_Clear();
  102. PyMem_Free(tbuf);
  103. - return NULL;
  104. + Py_RETURN_NONE;
  105. }
  106. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  107. @@ -323,9 +326,10 @@ PyObject *rsa_private_decrypt(RSA *rsa, PyObject *from, int padding) {
  108. tlen = RSA_private_decrypt(flen, (unsigned char *)fbuf,
  109. (unsigned char *)tbuf, rsa, padding);
  110. if (tlen == -1) {
  111. - m2_PyErr_Msg(_rsa_err);
  112. + ERR_clear_error();
  113. + PyErr_Clear();
  114. PyMem_Free(tbuf);
  115. - return NULL;
  116. + Py_RETURN_NONE;
  117. }
  118. ret = PyBytes_FromStringAndSize((const char *)tbuf, tlen);
  119. diff --git a/tests/test_rsa.py b/tests/test_rsa.py
  120. index 7bb3af75..5e75d681 100644
  121. --- a/tests/test_rsa.py
  122. +++ b/tests/test_rsa.py
  123. @@ -109,8 +109,9 @@ class RSATestCase(unittest.TestCase):
  124. # The other paddings.
  125. for padding in self.s_padding_nok:
  126. p = getattr(RSA, padding)
  127. - with self.assertRaises(RSA.RSAError):
  128. - priv.private_encrypt(self.data, p)
  129. + # Exception disabled as a part of mitigation against CVE-2020-25657
  130. + # with self.assertRaises(RSA.RSAError):
  131. + priv.private_encrypt(self.data, p)
  132. # Type-check the data to be encrypted.
  133. with self.assertRaises(TypeError):
  134. priv.private_encrypt(self.gen_callback, RSA.pkcs1_padding)
  135. @@ -127,10 +128,12 @@ class RSATestCase(unittest.TestCase):
  136. self.assertEqual(ptxt, self.data)
  137. # no_padding
  138. - with six.assertRaisesRegex(self, RSA.RSAError, 'data too small'):
  139. - priv.public_encrypt(self.data, RSA.no_padding)
  140. + # Exception disabled as a part of mitigation against CVE-2020-25657
  141. + # with six.assertRaisesRegex(self, RSA.RSAError, 'data too small'):
  142. + priv.public_encrypt(self.data, RSA.no_padding)
  143. # Type-check the data to be encrypted.
  144. + # Exception disabled as a part of mitigation against CVE-2020-25657
  145. with self.assertRaises(TypeError):
  146. priv.public_encrypt(self.gen_callback, RSA.pkcs1_padding)
  147. @@ -146,10 +149,6 @@ class RSATestCase(unittest.TestCase):
  148. b'\000\000\000\003\001\000\001') # aka 65537 aka 0xf4
  149. with self.assertRaises(RSA.RSAError):
  150. setattr(rsa, 'e', '\000\000\000\003\001\000\001')
  151. - with self.assertRaises(RSA.RSAError):
  152. - rsa.private_encrypt(1)
  153. - with self.assertRaises(RSA.RSAError):
  154. - rsa.private_decrypt(1)
  155. assert rsa.check_key()
  156. def test_loadpub_bad(self):
  157. --
  158. GitLab