Skip to content

Commit fedf5f9

Browse files
committed
Provide sm2 algorithm support(#277)
This code is to enable tpm2-tss-engine to support the SMx algorithm. Signed-off-by: bangcheng <bangwangnj@163.com>
1 parent af8b26e commit fedf5f9

2 files changed

Lines changed: 72 additions & 4 deletions

File tree

src/tpm2-tss-engine-ecc.c

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ EC_KEY_METHOD *ecc_methods = NULL;
5454
#ifdef HAVE_OPENSSL_DIGEST_SIGN
5555
static int (*ecdsa_pkey_orig_copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
5656
static void (*ecdsa_pkey_orig_cleanup)(EVP_PKEY_CTX *ctx);
57+
static int (*sm2_digest_custom_default) (EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) = NULL;
58+
static int (*pkey_sm2_sign_default) (EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
59+
const unsigned char *tbs, size_t tbslen) = NULL;
5760
#endif /* HAVE_OPENSSL_DIGEST_SIGN */
5861

5962
static TPM2B_DATA allOutsideInfo = {
@@ -238,7 +241,7 @@ ecdsa_sign(ESYS_CONTEXT *esys_ctx, ESYS_TR key_handle,
238241
TPM2_ALG_ID hash_alg)
239242
{
240243
TPMT_SIG_SCHEME inScheme = {
241-
.scheme = TPM2_ALG_ECDSA,
244+
.scheme = (hash_alg == TPM2_ALG_SM3_256) ? TPM2_ALG_SM2 : TPM2_ALG_ECDSA,
242245
.details.ecdsa.hashAlg = hash_alg,
243246
};
244247
BIGNUM *bns = NULL, *bnr = NULL;
@@ -360,7 +363,10 @@ ecdsa_ec_key_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv,
360363
dgst_len = SHA_DIGEST_LENGTH;
361364
} else if (dgst_len == SHA256_DIGEST_LENGTH ||
362365
(curve_len <= SHA256_DIGEST_LENGTH && dgst_len > SHA256_DIGEST_LENGTH)) {
363-
hash_alg = TPM2_ALG_SHA256;
366+
if (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)) == NID_sm2)
367+
hash_alg = TPM2_ALG_SM3_256;
368+
else
369+
hash_alg = TPM2_ALG_SHA256;
364370
dgst_len = SHA256_DIGEST_LENGTH;
365371
} else if (dgst_len == SHA384_DIGEST_LENGTH ||
366372
(curve_len <= SHA384_DIGEST_LENGTH && dgst_len > SHA384_DIGEST_LENGTH)) {
@@ -516,6 +522,9 @@ populate_ecc(EC_KEY *key)
516522
case TPM2_ECC_NIST_P384:
517523
nid = EC_curve_nist2nid("P-384");
518524
break;
525+
case TPM2_ECC_SM2_P256:
526+
nid = NID_sm2;
527+
break;
519528
default:
520529
nid = -1;
521530
}
@@ -796,6 +805,42 @@ tpm2tss_ecc_genkey(EC_KEY *key, TPMI_ECC_CURVE curve, const char *password,
796805
return (r == TSS2_RC_SUCCESS);
797806
}
798807

808+
/** Customize the pkey_sm2_sign interface
809+
*
810+
* Customize the pkey_sm2_sign interface. When there is a tpm key extension value, call the ecdsa_ec_key_sign interface to sign.
811+
* @retval 1 on success
812+
* @retval 0 on failure
813+
*/
814+
static int pkey_sm2_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
815+
const unsigned char *tbs, size_t tbslen)
816+
{
817+
EC_KEY *ec = EVP_PKEY_get0_EC_KEY(EVP_PKEY_CTX_get0_pkey(ctx));
818+
819+
if (tpm2tss_ecc_getappdata(ec) == NULL) {
820+
// call pkey_sm2_sign_default
821+
return pkey_sm2_sign_default(ctx, sig, siglen, tbs, tbslen);
822+
}
823+
else {
824+
// call tpm sig function
825+
const int sig_sz = ECDSA_size(ec);
826+
if (sig_sz <= 0) {
827+
return 0;
828+
}
829+
if (sig == NULL) {
830+
*siglen = (size_t)sig_sz;
831+
return 1;
832+
}
833+
if (*siglen < (size_t)sig_sz) return 0;
834+
ECDSA_SIG *sig_res = ecdsa_ec_key_sign(tbs, tbslen, NULL, NULL, ec);
835+
int siglen_temp = i2d_ECDSA_SIG(sig_res, &sig);
836+
ECDSA_SIG_free(sig_res);
837+
if (siglen_temp < 0) return 0;
838+
*siglen = siglen_temp;
839+
}
840+
841+
return 1;
842+
}
843+
799844
/** Initialize the tpm2tss engine's ecc submodule
800845
*
801846
* Initialize the tpm2tss engine's submodule by setting function pointer.
@@ -869,6 +914,22 @@ init_ecc(ENGINE *e)
869914
EVP_PKEY_meth_set_signctx(pkey_ecc_methods, NULL, ecdsa_signctx);
870915
EVP_PKEY_meth_set_digest_custom(pkey_ecc_methods, ecdsa_digest_custom);
871916
EVP_PKEY_meth_add0(pkey_ecc_methods);
917+
918+
/* add engine for sm2*/
919+
EVP_PKEY_METHOD *pkey_sm2_methods = EVP_PKEY_meth_new(EVP_PKEY_SM2, 0);
920+
if (pkey_sm2_methods == NULL)
921+
return 0;
922+
EVP_PKEY_METHOD *pkey_orig_sm2_methods = EVP_PKEY_meth_find(EVP_PKEY_SM2);
923+
if (pkey_orig_sm2_methods == NULL)
924+
return 0;
925+
EVP_PKEY_meth_copy(pkey_sm2_methods, pkey_orig_sm2_methods);
926+
927+
EVP_PKEY_meth_get_digest_custom(pkey_orig_sm2_methods, &sm2_digest_custom_default);
928+
EVP_PKEY_meth_get_sign(pkey_orig_sm2_methods, NULL, &pkey_sm2_sign_default);
929+
930+
EVP_PKEY_meth_set_digest_custom(pkey_sm2_methods, sm2_digest_custom_default);
931+
EVP_PKEY_meth_set_sign(pkey_sm2_methods, NULL, pkey_sm2_sign);
932+
EVP_PKEY_meth_add0(pkey_sm2_methods);
872933
#endif /* HAVE_OPENSSL_DIGEST_SIGN */
873934

874935
return 1;

src/tpm2tss-genkey.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ char *help =
5252
"Arguments:\n"
5353
" <filename> storage for the encrypted private key\n"
5454
"Options:\n"
55-
" -a, --alg public key algorithm (rsa, ecdsa) (default: rsa)\n"
55+
" -a, --alg public key algorithm (rsa, ecdsa, sm2) (default: rsa)\n"
5656
" -c, --curve curve for ecc (default: nist_p256)\n"
5757
" -e, --exponent exponent for rsa (default: 65537)\n"
5858
" -h, --help print help\n"
@@ -148,6 +148,10 @@ parse_opts(int argc, char **argv)
148148
} else if (strcasecmp(optarg, "ecdsa") == 0) {
149149
opt.alg = TPM2_ALG_ECDSA;
150150
break;
151+
} else if (strcasecmp(optarg, "sm2") == 0) {
152+
opt.alg = TPM2_ALG_ECDSA;
153+
opt.curve = TPM2_ECC_SM2_P256;
154+
break;
151155
} else {
152156
ERR("Unknown algorithm.\n");
153157
exit(1);
@@ -387,7 +391,10 @@ main(int argc, char **argv)
387391
tpm2Data = genkey_rsa();
388392
break;
389393
case TPM2_ALG_ECDSA:
390-
VERB("Generating the ecdsa key\n");
394+
if (opt.curve == TPM2_ECC_SM2_P256)
395+
VERB("Generating the sm2 key\n");
396+
else
397+
VERB("Generating the ecdsa key\n");
391398
tpm2Data = genkey_ecdsa();
392399
break;
393400
default:

0 commit comments

Comments
 (0)