0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Linux Kernel非对称密码算法的实现

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-06-13 11:49 次阅读

作者简介:

baron (csdn:代码改变世界ctw),九年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。

在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 5.14

目录

1、RSA 开关

2、RSA 实现

3、其它非对称密码

4、非对称密码算法的使用示例

5、总结

1、RSA 开关

RSA的实现由 CONFIG_CRYPTO_RSA 宏控制,该宏依赖于:

CONFIG_CRYPTO_AKCIPHER

CONFIG_CRYPTO_MANAGER

CONFIG_MPILIB

CONFIG_ASN1

(linux/crypto/Kconfig)
config CRYPTO_RSA  tristate "RSA algorithm"  select CRYPTO_AKCIPHER  select CRYPTO_MANAGER  select MPILIB  select ASN1  helpGenericimplementationoftheRSApublickeyalgorithm.

2、RSA 实现

(linux/crypto/rsa.c)
static struct akcipher_alg rsa = {  .encrypt = rsa_enc,  .decrypt = rsa_dec,  .set_priv_key = rsa_set_priv_key,  .set_pub_key = rsa_set_pub_key,  .max_size = rsa_max_size,  .exit = rsa_exit_tfm,  .base = {    .cra_name = "rsa",    .cra_driver_name = "rsa-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct rsa_mpi_key),  },};

主要实现了4个功能:

rsasetpriv_key

rsasetpub_key

rsa_enc

rsa_dec

其中 rsa_set_priv_key和 rsa_set_pub_key的实现,主要就是接受raw格式的密钥(DER格密钥),将其转换成nddpq等因子填充到密码学结构体中。rsa_enc和 rsa_dec ,主要就是 公钥加密、私钥解密的这种用法。

此类密码学具体算法的实现,都是由 linux/lib/mpi 第三方libary实现的,是一种C语言的实现方式。

3、其它非对称密码

(1)、实现了3个ecdsa的密码算法

ecdsanistp192

ecdsanistp256

ecdsanistp384

以为ecdsanistp192 为例:

(linux/crypto/ecdsa.c)
static struct akcipher_alg ecdsa_nist_p192 = {  .verify = ecdsa_verify,  .set_pub_key = ecdsa_set_pub_key,  .max_size = ecdsa_max_size,  .init = ecdsa_nist_p192_init_tfm,  .exit = ecdsa_exit_tfm,  .base = {    .cra_name = "ecdsa-nist-p192",    .cra_driver_name = "ecdsa-nist-p192-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct ecc_ctx),  },};

仅仅实现了两个接口函数:

ecdsa_verify : 公钥验签

ecdsasetpub_key :导入公钥

(2)、实现了1个sm2的密码算法

(linux/crypto/sm2.c)
static struct akcipher_alg sm2 = {  .verify = sm2_verify,  .set_pub_key = sm2_set_pub_key,  .max_size = sm2_max_size,  .init = sm2_init_tfm,  .exit = sm2_exit_tfm,  .base = {    .cra_name = "sm2",    .cra_driver_name = "sm2-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct mpi_ec_ctx),  },};

仅仅实现了两个接口函数:

sm2_verify : 公钥验签

sm2setpub_key :导入公钥

(3)、实现了1个ecr的密码算法

(linux/crypto/ecrdsa.c)
static struct akcipher_alg ecrdsa_alg = {  .verify    = ecrdsa_verify,  .set_pub_key  = ecrdsa_set_pub_key,  .max_size  = ecrdsa_max_size,  .exit    = ecrdsa_exit_tfm,  .base = {    .cra_name   = "ecrdsa",    .cra_driver_name = "ecrdsa-generic",    .cra_priority   = 100,    .cra_module   = THIS_MODULE,    .cra_ctxsize   = sizeof(struct ecrdsa_ctx),  },};

仅仅实现了两个接口函数:

ecrdsa_verify : 公钥验签

ecrdsasetpub_key :导入公钥

4、非对称密码算法的使用示例

如下所示,实现了 public_key_verify_signature(key,signature), 这个函数的实现,也被export出来,相当于又封装了一层。另外其它模块如果有对非对称密码学算法的需求,也可以直接调用非对称密码学算法的API,例如直接调用如下这样的函数:

crypto_akcipher_verify()

crypto_akcipher_set_pub_key()

如下是 public_key_verify_signature(key,signature)的实现,也可以当作非对称密码学算法的使用示例:

(linux/crypto/asymmetric_keys/public_key.c)


/* * Verify a signature using a public key. */int public_key_verify_signature(const struct public_key *pkey,        const struct public_key_signature *sig){  struct crypto_wait cwait;  struct crypto_akcipher *tfm;  struct akcipher_request *req;  struct scatterlist src_sg[2];  char alg_name[CRYPTO_MAX_ALG_NAME];  char *key, *ptr;  int ret;
  pr_devel("==>%s()
", __func__);
  BUG_ON(!pkey);  BUG_ON(!sig);  BUG_ON(!sig->s);
  ret = software_key_determine_akcipher(sig->encoding,                sig->hash_algo,                pkey, alg_name);  if (ret < 0)    return ret;
  tfm = crypto_alloc_akcipher(alg_name, 0, 0);  if (IS_ERR(tfm))    return PTR_ERR(tfm);
  ret = -ENOMEM;  req = akcipher_request_alloc(tfm, GFP_KERNEL);  if (!req)    goto error_free_tfm;
  key = kmalloc(pkey->keylen + sizeof(u32) * 2 + pkey->paramlen,          GFP_KERNEL);  if (!key)    goto error_free_req;
  memcpy(key, pkey->key, pkey->keylen);  ptr = key + pkey->keylen;  ptr = pkey_pack_u32(ptr, pkey->algo);  ptr = pkey_pack_u32(ptr, pkey->paramlen);  memcpy(ptr, pkey->params, pkey->paramlen);
  if (pkey->key_is_private)    ret = crypto_akcipher_set_priv_key(tfm, key, pkey->keylen);  else    ret = crypto_akcipher_set_pub_key(tfm, key, pkey->keylen);  if (ret)    goto error_free_key;
  if (sig->pkey_algo && strcmp(sig->pkey_algo, "sm2") == 0 &&      sig->data_size) {    ret = cert_sig_digest_update(sig, tfm);    if (ret)      goto error_free_key;  }
  sg_init_table(src_sg, 2);  sg_set_buf(&src_sg[0], sig->s, sig->s_size);  sg_set_buf(&src_sg[1], sig->digest, sig->digest_size);  akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size,           sig->digest_size);  crypto_init_wait(&cwait);  akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |              CRYPTO_TFM_REQ_MAY_SLEEP,              crypto_req_done, &cwait);  ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait);
error_free_key:  kfree(key);error_free_req:  akcipher_request_free(req);error_free_tfm:  crypto_free_akcipher(tfm);  pr_devel("<==%s() = %d
", __func__, ret);  if (WARN_ON_ONCE(ret > 0))    ret = -EINVAL;  return ret;}EXPORT_SYMBOL_GPL(public_key_verify_signature);

5、总结

Linux Kernel非对称密码算法的实现总结如下:

实现了RSA的:“导入公钥、导入私钥、公钥加密私钥解密” 功能

实现了ecdsa的:”导入公钥、公钥验签” 功能

实现了sm2的:”导入公钥、公钥验签” 功能

实现了ecr的:”导入公钥、公钥验签” 功能

原文标题:Linux Kernel中非对称密码算法的实现

文章出处:【微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10943

    浏览量

    206546
  • 函数
    +关注

    关注

    3

    文章

    3846

    浏览量

    61228
  • RSA
    RSA
    +关注

    关注

    0

    文章

    59

    浏览量

    18752
  • 密码算法
    +关注

    关注

    0

    文章

    18

    浏览量

    7353

原文标题:Linux Kernel中非对称密码算法的实现

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    快充充电器基于非对称椭圆曲线加密算法的单芯片认证方案

    基于非对称椭圆曲线加密算法的单芯片认证方案
    发表于 08-15 10:41 1807次阅读
    快充充电器基于<b class='flag-5'>非对称</b>椭圆曲线加密<b class='flag-5'>算法</b>的单芯片认证方案

    算法科普:非对称算法

    非对称算法,你了解多少呢?
    的头像 发表于 09-05 21:07 3842次阅读
    <b class='flag-5'>算法</b>科普:<b class='flag-5'>非对称</b><b class='flag-5'>算法</b>

    6.5kV非对称晶闸管的优化设计与工艺研究

    本文简述了非对称晶闸管的结构特点及其工作原理,分析了非对称晶闸管的关键结构参数对其特性的影响,以及结构参数之间的相互制约关系。对6.5kV非对称晶闸管进行了特性模拟与优化,给出优化设计的纵向结构参数
    发表于 05-04 08:06

    单片机处理非对称加密算法

    普通单片机可以处理非对称加密算法吗?速度如何?求大神解答
    发表于 09-17 12:38

    对称性加密算法

    对称性加密算法对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称
    发表于 07-19 06:32

    对称加密算法是什么

    对称加密算法也叫私钥加密算法,其特征是收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的。非对称加密算法也叫公钥加密
    发表于 07-22 07:09

    密码学系列 - 国密算法 精选资料分享

    时,需要通过加密芯片的接口进行调用。采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。该算法不公开SM2:
    发表于 07-23 07:07

    浅谈对称加密算法非对称密钥加密算法

    什么是对称密钥密码体制?对称密钥密码体制的缺点是什么?非对称加密算法又是什么?
    发表于 12-23 06:05

    求分享使用Crypto模块导入非对称密钥的示例

    我想知道 NXP 是否提供了使用加密模块实现非对称密钥导入(RSA 或 ECC)的示例? RTD 中的示例仅实现对称密钥导入 (AES)。
    发表于 04-28 06:54

    “国产双系统”出炉,RK3568J非对称AMP:Linux+RTOS/裸机

    多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的内存
    发表于 12-01 09:35

    什么是非对称加密?非对称加密概念

    对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简
    发表于 12-10 10:38 2.1w次阅读
    什么是<b class='flag-5'>非对称</b>加密?<b class='flag-5'>非对称</b>加密概念

    java实现非对称加密算法的过程

    对称式加密:解密方式是加密方式的逆运算,即加密和解密使用的是同一个密钥(初等加密算法)。非对称式加密:加密和解密需要两个密钥进行,这两个密钥是公钥和私钥(高等加密算法)。
    发表于 12-10 10:54 4989次阅读
    java<b class='flag-5'>实现</b><b class='flag-5'>非对称</b>加密<b class='flag-5'>算法</b>的过程

    基于FPGA状态机非对称高斯拟合寻峰算法的研究

    针对光纤光栅反射谱不对称所导致的寻峰算法误差问题,提出了一种基于FPCA状态机的非对称高斯拟合寻峰算法算法通过状态机之间的相互转换完成对数
    发表于 01-09 10:58 3次下载

    如何理解区块链密码学中的非对称加密

    当前密码学中的加密解密方式主要能分成两类,分别是对称加密和非对称加密。这两个加密体系的构成都是一样的,都包括:加解密算法、加密密钥、解密密钥。
    发表于 11-29 11:36 2157次阅读

    密码学:如何使用非对称密钥算法来交换共享私钥

    在我们的密码学系列教程的最后两期中,我们介绍了密码学的基本概念和两种基本类型。本节讨论最常见的加密算法的具体实现细节,从基本的 XOR 函数开始,然后进入当今使用的更复杂的
    的头像 发表于 12-19 15:28 1288次阅读
    <b class='flag-5'>密码</b>学:如何使用<b class='flag-5'>非对称</b>密钥<b class='flag-5'>算法</b>来交换共享私钥