You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

CVE-2021-3711.patch 2.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. diff --git a/crypto/sm2/sm2_crypt.c b/crypto/sm2/sm2_crypt.c
  2. index ef505f6441..1188abfc6b 100644
  3. --- a/crypto/sm2/sm2_crypt.c
  4. +++ b/crypto/sm2/sm2_crypt.c
  5. @@ -61,29 +61,20 @@ static size_t ec_field_size(const EC_GROUP *group)
  6. return field_size;
  7. }
  8. -int sm2_plaintext_size(const EC_KEY *key, const EVP_MD *digest, size_t msg_len,
  9. - size_t *pt_size)
  10. +int sm2_plaintext_size(const unsigned char *ct, size_t ct_size, size_t *pt_size)
  11. {
  12. - const size_t field_size = ec_field_size(EC_KEY_get0_group(key));
  13. - const int md_size = EVP_MD_size(digest);
  14. - size_t overhead;
  15. + struct SM2_Ciphertext_st *sm2_ctext = NULL;
  16. - if (md_size < 0) {
  17. - SM2err(SM2_F_SM2_PLAINTEXT_SIZE, SM2_R_INVALID_DIGEST);
  18. - return 0;
  19. - }
  20. - if (field_size == 0) {
  21. - SM2err(SM2_F_SM2_PLAINTEXT_SIZE, SM2_R_INVALID_FIELD);
  22. - return 0;
  23. - }
  24. + sm2_ctext = d2i_SM2_Ciphertext(NULL, &ct, ct_size);
  25. - overhead = 10 + 2 * field_size + (size_t)md_size;
  26. - if (msg_len <= overhead) {
  27. + if (sm2_ctext == NULL) {
  28. SM2err(SM2_F_SM2_PLAINTEXT_SIZE, SM2_R_INVALID_ENCODING);
  29. return 0;
  30. }
  31. - *pt_size = msg_len - overhead;
  32. + *pt_size = sm2_ctext->C2->length;
  33. + SM2_Ciphertext_free(sm2_ctext);
  34. +
  35. return 1;
  36. }
  37. diff --git a/crypto/sm2/sm2_pmeth.c b/crypto/sm2/sm2_pmeth.c
  38. index b42a14c32f..27025fbf3a 100644
  39. --- a/crypto/sm2/sm2_pmeth.c
  40. +++ b/crypto/sm2/sm2_pmeth.c
  41. @@ -151,7 +151,7 @@ static int pkey_sm2_decrypt(EVP_PKEY_CTX *ctx,
  42. const EVP_MD *md = (dctx->md == NULL) ? EVP_sm3() : dctx->md;
  43. if (out == NULL) {
  44. - if (!sm2_plaintext_size(ec, md, inlen, outlen))
  45. + if (!sm2_plaintext_size(in, inlen, outlen))
  46. return -1;
  47. else
  48. return 1;
  49. diff --git a/include/crypto/sm2.h b/include/crypto/sm2.h
  50. index 76ee80baff..50851a83ce 100644
  51. --- a/include/crypto/sm2.h
  52. +++ b/include/crypto/sm2.h
  53. @@ -60,8 +60,7 @@ int sm2_verify(const unsigned char *dgst, int dgstlen,
  54. int sm2_ciphertext_size(const EC_KEY *key, const EVP_MD *digest, size_t msg_len,
  55. size_t *ct_size);
  56. -int sm2_plaintext_size(const EC_KEY *key, const EVP_MD *digest, size_t msg_len,
  57. - size_t *pt_size);
  58. +int sm2_plaintext_size(const unsigned char *ct, size_t ct_size, size_t *pt_size);
  59. int sm2_encrypt(const EC_KEY *key,
  60. const EVP_MD *digest,
  61. diff --git a/test/sm2_internal_test.c b/test/sm2_internal_test.c
  62. index 2bb73947ff..41827bb82f 100644
  63. --- a/test/sm2_internal_test.c
  64. +++ b/test/sm2_internal_test.c
  65. @@ -185,7 +185,7 @@ static int test_sm2_crypt(const EC_GROUP *group,
  66. if (!TEST_mem_eq(ctext, ctext_len, expected, ctext_len))
  67. goto done;
  68. - if (!TEST_true(sm2_plaintext_size(key, digest, ctext_len, &ptext_len))
  69. + if (!TEST_true(sm2_plaintext_size(ctext, ctext_len, &ptext_len))
  70. || !TEST_int_eq(ptext_len, msg_len))
  71. goto done;