SM2数字签名

typedef struct {
	uint8_t r[32];
	uint8_t s[32];
} SM2_SIGNATURE;

SM2数字签名表示为SM2_SIGNATURE结构,包含两个256位整数$(r,s)$。

int sm2_signature_to_der(const SM2_SIGNATURE *sig, uint8_t **out, size_t *outlen);
int sm2_signature_from_der(SM2_SIGNATURE *sig, const uint8_t **in, size_t *inlen);

sm2_signature_to_dersm2_signature_from_der函数实现SM2签名在SM2_SIGNATURE结构和DER格式间的相互转换。

sm2_signature_to_der函数执行成功返回1,失败返回-1。sm2_signature_from_der函数函数执行成功返回1,失败返回-1,输入签名$(r,s)$中存在长度错误返回-2。

int sm2_do_sign(const SM2_KEY *key, const uint8_t dgst[32], SM2_SIGNATURE *sig);
int sm2_do_verify(const SM2_KEY *key, const uint8_t dgst[32], const SM2_SIGNATURE *sig);

sm2_do_sign函数中,SM2密钥key应为SM2_KEY格式,消息哈希值dgst应为256位整数,函数通过这两个参数计算出消息的SM2签名并存放至签名结构sig;函数执行成功返回1,失败返回-1。

sm2_do_verify函数的参数与此类似,但签名sig由调用者提供,并由函数验证其正确性。函数返回非负整数表示验签成功,其中签名正确返回1,签名错误返回0;执行失败返回-1。

int sm2_sign(const SM2_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen);
int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sig, size_t siglen);

sm2_sign函数与sm2_do_sign函数类似,但最后计算出的签名被转换为DER格式存放到sig中,长度信息存放到siglen中。

sm2_verify函数与sm2_do_verify函数类似,但读取DER格式的签名sig和长度信息siglen并进行验证。

sm2_sign函数执行成功返回1,失败返回-1;sm2_verify函数若返回非负数,则与sm2_do_verify函数相同,将DER格式签名转换为结构体时失败返回-2,其他步骤执行失败返回-1。

以下函数与SM3哈希函数的使用类似,允许调用者增量添加消息,并在消息全部添加完成后对其进行签名或验签:

typedef struct {
	SM2_KEY key;
	SM3_CTX sm3_ctx;
	int flags;
} SM2_SIGN_CTX;

int sm2_sign_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen);
int sm2_sign_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen);
int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen);

int sm2_verify_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_t idlen);
int sm2_verify_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen);
int sm2_verify_finish(SM2_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen);

SM2_SIGN_CTX结构中增加了一个SM3_CTX结构,其用法与在SM3哈希函数的用法相同。

sm2_sign_init函数的参数包括:

  • SM2_SIGN_CTX类型的ctx,用于存放结果。

  • SM2_KEY类型的key,计算签名使用的密钥。

  • 字符串类型的id及其整数类型长度的idlen,要求长度不超过SM2_MAX_ID_SIZE(8191,否则返回失败),用于计算$z$值供哈希函数使用。

  • 函数将给定的SM2密钥复制到ctx中,并将计算出的$z$值存放到sm3_ctx中,等待在其后添加消息。

sm2_sign_update函数接收给定的字符串格式消息data及其长度datalen,并通过sm3_update将消息添加到ctx中。

sm2_sign_finish函数依次调用sm3_finishsm2_sign函数来完成签名操作,并将DER格式的签名值存放在sig中。

sm2_verify_initsm2_verify_updatesm2_verify_finish的使用方式与对应签名函数相同。

以上除sm2_verify_finish以外的函数执行成功返回1,失败返回-1;sm2_verify_finish的返回值与sm2_verify相同。