@@ -54,6 +54,9 @@ EC_KEY_METHOD *ecc_methods = NULL;
5454#ifdef HAVE_OPENSSL_DIGEST_SIGN
5555static int (* ecdsa_pkey_orig_copy )(EVP_PKEY_CTX * dst , EVP_PKEY_CTX * src );
5656static 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
5962static 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 ;
0 commit comments