EVP_PKEY-SM2(7ossl)

πŸ“¦ version 14.5, in freebsd 14.5

πŸ’… EVP_PKEY-SM2 β€” the OpenSSL manpage, bestie edition ✨

okay so this is page EVP_PKEY-SM2(7ossl) from OpenSSL, and it's literally all about the EVP_PKEY keytype support for the Chinese SM2 signature and encryption algorithms. you also might see it called EVP_KEYMGMT-SM2 or just plain SM2 β€” same girl, different name tag πŸŽ€


🌸 NAME 🌸

EVP_PKEY-SM2, EVP_KEYMGMT-SM2, SM2 β€” the EVP_PKEY keytype support for the Chinese SM2 signature and encryption algorithms. slay πŸ’–


✨ DESCRIPTION ✨

so the SM2 algorithm was first defined by the Chinese national standard GM/T 0003-2012, and bestie, it later got standardized by ISO as ISO/IEC 14888. iconic behavior honestly πŸ‘‘

and here's the thing β€” SM2 is actually an elliptic curve based algorithm. the current implementation in OpenSSL supports both signature and encryption schemes via the EVP interface. versatile queen 🌈

when you're doing the SM2 signature algorithm, it requires a distinguishing identifier to form the message prefix which is hashed before the real message is hashed. like a little pre-game ritual before the actual hashing happens, iykyk πŸ’«

πŸ¦‹ Common SM2 parameters πŸ¦‹

SM2 uses the parameters defined in "Common EC parameters" in EVP_PKEY-EC(7). but the following ones are different β€” pay attention bestie πŸ‘€

  • "cofactor" (OSSL_PKEY_PARAM_EC_COFACTOR) <unsigned integer> β€” this parameter is ignored for SM2. yeah she just doesn't care about it πŸ™ˆ
  • (OSSL_PKEY_PARAM_DEFAULT_DIGEST) <UTF8 string> β€” a getter that returns the default digest name. (currently returns "SM3" as of OpenSSL 3.0). cute consistent queen πŸ’…

πŸ”₯ NOTES πŸ”₯

SM2 signatures can be generated by using the 'DigestSign' series of APIs β€” for instance, EVP_DigestSignInit(), EVP_DigestSignUpdate() and EVP_DigestSignFinal(). ditto for the verification process by calling the 'DigestVerify' series of APIs. fr fr 🫢

⚠️ okay important: the SM2 algorithm requires the presence of the public key for signatures, so the OSSL_PKEY_PARAM_PUB_KEY option must be set on any key used in signature generation. no public key = no signature, periodt πŸ’€

before computing an SM2 signature, an EVP_PKEY_CTX needs to be created, and an SM2 ID must be set for it, like this:

EVP_PKEY_CTX_set1_id(pctx, id, id_len);

and before calling the EVP_DigestSignInit() or EVP_DigestVerifyInit() functions, that EVP_PKEY_CTX should be assigned to the EVP_MD_CTX, like this:

EVP_MD_CTX_set_pkey_ctx(mctx, pctx);

there is normally no need to pass a pctx parameter to EVP_DigestSignInit() or EVP_DigestVerifyInit() in such a scenario. so like, don't overthink it bestie πŸ’–

SM2 can be tested with the openssl-speed(1) application since version 3.0. currently, the only valid algorithm name is sm2. that's it, that's the one πŸŽ€

since version 3.0, SM2 keys can be generated and loaded only when the domain parameters specify the SM2 elliptic curve. like, the curve has to be the SM2 curve, no substitutions 😀


🌟 EXAMPLES 🌟

this example demonstrates the calling sequence for using an EVP_PKEY to verify a message with the SM2 signature algorithm and the SM3 hash algorithm. it's giving tutorial realness ✨

#include <openssl/evp.h>

/* obtain an EVP_PKEY using whatever methods... */
mctx = EVP_MD_CTX_new();
pctx = EVP_PKEY_CTX_new(pkey, NULL);
EVP_PKEY_CTX_set1_id(pctx, id, id_len);
EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
EVP_DigestVerifyInit(mctx, NULL, EVP_sm3(), NULL, pkey);
EVP_DigestVerifyUpdate(mctx, msg, msg_len);
EVP_DigestVerifyFinal(mctx, sig, sig_len)

look at her go πŸ˜­πŸ’œ


🧚 SEE ALSO 🧚

go read these too, bestie, they're all linked up:


Copyright 2018-2024 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.


and that's the whole page, bestie!! πŸ’–βœ¨πŸŽ€πŸ¦‹πŸŒΈπŸ’…πŸ«Ά

this lil masterpiece is from OpenSSL version 3.0.21, dated 2026-06-09, and it's filed under EVP_PKEY-SM2(7ossl) β€” go forth and SM2 responsibly, ily πŸŒˆβ­πŸ’œ

πŸ“¦ where this page comes from