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