资源简介
openssl库,纯C语言写的SM2-SM3国密相关的内容,封装加解密签名验签等函数,可配合openssl动态库内使用
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int ec_field_inverse_mod_ord(const EC_GROUP *group BIGNUM *r
const BIGNUM *x BN_CTX *ctx)
{
BIGNUM *e = NULL;
BN_CTX *new_ctx = NULL;
int ret = 0;
if (group->mont_data == NULL)
return 0;
if (ctx == NULL && (ctx = new_ctx = BN_CTX_secure_new()) == NULL)
return 0;
BN_CTX_start(ctx);
if ((e = BN_CTX_get(ctx)) == NULL)
goto err;
/*-
* We want inverse in constant time therefore we utilize the fact
* order must be prime and use Fermats Little Theorem instead.
*/
if (!BN_set_word(e 2))
goto err;
if (!BN_sub(e group->order e))
goto err;
/*-
* Exponent e is public.
* No need for scatter-gather or BN_FLG_CONSTTIME.
*/
if (!BN_mod_exp_mont(r x e group->order ctx group->mont_data))
goto err;
ret = 1;
err:
BN_CTX_end(ctx);
BN_CTX_free(new_ctx);
return ret;
}
static int ec_group_do_inverse_ord(const EC_GROUP *group BIGNUM *res
const BIGNUM *x BN_CTX *ctx)
{
if (group->meth->field_inverse_mod_ord != NULL)
return group->meth->field_inverse_mod_ord(group res x ctx);
else
return ec_field_inverse_mod_ord(group res x ctx);
}
static int sm2_compute_z_digest(uint8_t *out
const EVP_MD *digest
const uint8_t *id
const size_t id_len
const EC_KEY *key)
{
int rc = 0;
const EC_GROUP *group = EC_KEY_get0_group(key);
BN_CTX *ctx = NULL;
EVP_MD_CTX *hash = NULL;
BIGNUM *p = NULL;
BIGNUM *a = NULL;
BIGNUM *b = NULL;
BIGNUM *xG = NULL;
BIGNUM *yG = NULL;
BIGNUM *xA = NULL;
BIGNUM *yA = NULL;
int p_bytes = 0;
uint8_t *buf = NULL;
uint16_t entl = 0;
uint8_t e_byte = 0;
hash = EVP_MD_CTX_new();
ctx = BN_CTX_new();
if (hash == NULL || ctx == NULL) {
goto done;
}
p = BN_CTX_get(ctx);
a = BN_CTX_get(ctx);
b = BN_CTX_get(ctx);
xG = BN_CTX_get(ctx);
yG = BN_CTX_get(ctx);
xA = BN_CTX_get(ctx);
yA = BN_CTX_get(ctx);
if (yA == NULL) {
goto done;
}
if (!EVP_DigestInit(hash digest)) {
goto done;
}
/* Z = h(ENTL || ID || a || b || xG || yG || xA || yA) */
if (id_len >= (UINT16_MAX / 8)) {
/* too large */
goto done;
}
entl = (uint16_t)(8 * id_len);
e_byte = entl >> 8;
if (!EVP_DigestUpdate(hash &e_byte 1)) {
goto done;
}
e_byte = entl & 0xFF;
if (!EVP_DigestUpdate(hash
- 上一篇:c++版学生成绩管理系统实验报告及源码
- 下一篇:MFC智能停车场管理系统
相关资源
- SM4(ECB、CBC、CTR、CFB、OFB)加密算法
- SM2算法C语言实现
- sm2算法源码实现
- sm2算法签名验签实现
- 杂凑算法SM3的C++实现
- 国密SM9算法测试工具
- 国密SM2非对称算法C语言实现
- 支持国密的OpenSSL 2.0
- c语言实现国密SM2
- c编译器,将C语言编译成masm32汇编语言
- C语言实现的SM2数字签名验证
- SM3算法C语言实现
- 国密SM2算法C代码
- 国密SM3摘要算法工具
- SM3算法IP核
- SM2/SM3算法C语言实现
- 国密算法--Openssl 实现国密算法加密和
- 国密SM4算法的C语言实现
- 国密SM4的5中模式C语言实现,vs工程,
- SM2_SM3_SM4_C语言实现+SM3_C++实现+国家密
- c 编译器 masm32 汇编 可自举
- 国密SM4加密解密51单片机版C源程序.
- 基于Gmssl的SM2加解密算法Demo
- sm2加密,解密,签名,验签sm3哈希基
- 国密SM4的5种加密模式(ECB CBC CFB OFB
- SM2_SM3_SM4_C语言实现
- SM3密码算法C语言实现
- 国密SM4对称算法C实现源码
- SM2SM3SM4国密算法C语言实现VS2008
- 国密算法 SM2_SM3_SM4 C语言实现
评论
共有 条评论