• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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