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

    文章

    11304

    浏览量

    209502
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62618
  • RSA
    RSA
    +关注

    关注

    0

    文章

    59

    浏览量

    18892
  • 密码算法
    +关注

    关注

    0

    文章

    19

    浏览量

    7385

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    算法科普:非对称算法

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

    “双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

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

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

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

    对称性加密算法

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

    对称加密算法是什么

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

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

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

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

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

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

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

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

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

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

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

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

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

    利用EVPN实现子网间路由的非对称对称模型

    和外部网络可以通过 EVPN 外部路由到达。 Cumulus Linux 3.6 版本支持带有非对称模型的 EVPN 外部路由,仅将 L3VNI 用于外部路由。
    的头像 发表于 04-08 15:29 2864次阅读
    利用EVPN<b class='flag-5'>实现</b>子网间路由的<b class='flag-5'>非对称</b>或<b class='flag-5'>对称</b>模型

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

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

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

    非对称AMP”双系统是什么AMP(AsymmetricMulti-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如
    的头像 发表于 09-13 08:07 1491次阅读
    “国产双系统”出炉,RK3568J<b class='flag-5'>非对称</b>AMP:<b class='flag-5'>Linux</b>+RTOS/裸机