go-gmsm cgo库
介绍
基于github.com/emmansun/gmsm库编写的SM2对C
开放的库
特性:非对称加密、不支持跨平台编译
git地址:https://gitee.com/state-secret-series/go-gmsm.git
软件架构
Go、Cgo、mod
安装教程
克隆仓库
git clone https://gitee.com/state-secret-series/go-gmsm.git
进入go-gmsm目录
cd go-gmsm
下载依赖
go mod tidy
cgo静态编译
go build -x -buildmode=c-archive -o libgosm2.a
编译完成后生成 libgosm2.a 、libgosm2.h 文件
使用教程
在C语言中调用
int main() {
GO_SM2_KEY_PAIR key_pair;
GO_SM2_SIGNATURE_STRUCT sm2_sig;
GO_SM2_ENCRYPT_STRUCT ciphertext;
GO_SM2_DECRYPT_STRUCT plaintext;
GO_SM2_ERROR_STRUCT error;
unsigned char msg[] = {"这是测试数据"};
int msg_len = (int) (strlen((char *) msg));
unsigned char user_id[] = {"1234567812345678"};
int user_id_len = (int) (strlen((char *) user_id));
// unsigned char *ciphertext = NULL;
// int ciphertext_len=0;
int error_code;
error_code = GenerateKeyPair(&key_pair,&error);
if(error_code){
printf("GenerateKeyPair failed!%s\n", error.error);
return error_code;
}
print_hex("公钥", key_pair.pub_key, GO_SM2_PUBKEY_LEN);
print_hex("私钥", key_pair.pri_key, GO_SM2_PRIKEY_LEN);
GoSm2SignData(key_pair.pri_key, GO_SM2_PRIKEY_LEN, msg, msg_len, user_id, user_id_len,GO_SM2_MODE_DEFAULT, &sm2_sig,&error);
print_hex("签名", sm2_sig.sig, sm2_sig.sig_len);
error_code = Sm2SignVerify(key_pair.pub_key, GO_SM2_PUBKEY_LEN, msg, msg_len, user_id, user_id_len, &sm2_sig,&error);
if (error_code) {
printf("Verify SM2 signature failed!%d\n", error_code);
return error_code;
}
printf("Verify SM2 signature succeeded!\n");
error_code = Sm2Encrypt(key_pair.pub_key, GO_SM2_PUBKEY_LEN, msg, msg_len, GO_SM2_MODE_ANS1, GO_SM2_ORDER_C1C2C3, &ciphertext,&error);
if (error_code) {
printf("Sm2Encrypt SM2 Sm2Encrypt failed!%d\n", error_code);
return error_code;
}
printf("Sm2Encrypt SM2 Sm2Encrypt succeeded!\n");
print_hex("加密结果", ciphertext.ciphertext, ciphertext.ciphertext_len);
error_code = Sm2Decrypt(key_pair.pri_key,GO_SM2_PRIKEY_LEN,ciphertext.ciphertext, ciphertext.ciphertext_len,GO_SM2_ORDER_C1C2C3,&plaintext,&error);
if (error_code) {
printf("Sm2Decrypt SM2 Sm2Decrypt failed!%d\n", error_code);
return error_code;
}
printf("Sm2Decrypt SM2 Sm2Decrypt succeeded!\n");
print_hex("解密结果", plaintext.plaintext, plaintext.plaintext_len);
printf("文明:%s\n", plaintext.plaintext);
return 0;
}