0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于Linux Kernel非對(duì)稱密碼算法的實(shí)現(xiàn)

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2022-06-13 11:49 ? 次閱讀

作者簡(jiǎn)介:

baron (csdn:代碼改變世界ctw),九年手機(jī)安全/SOC底層安全開(kāi)發(fā)經(jīng)驗(yàn)。擅長(zhǎng)trustzone/tee安全產(chǎn)品的設(shè)計(jì)和開(kāi)發(fā)。

在默認(rèn)情況下,本文講述的都是ARMV8-aarch64架構(gòu),linux kernel 5.14

目錄

1、RSA 開(kāi)關(guān)

2、RSA 實(shí)現(xiàn)

3、其它非對(duì)稱密碼

4、非對(duì)稱密碼算法的使用示例

5、總結(jié)

1、RSA 開(kāi)關(guān)

RSA的實(shí)現(xiàn)由 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 實(shí)現(xiàn)

(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),  },};

主要實(shí)現(xiàn)了4個(gè)功能:

rsasetpriv_key

rsasetpub_key

rsa_enc

rsa_dec

其中 rsa_set_priv_key和 rsa_set_pub_key的實(shí)現(xiàn),主要就是接受raw格式的密鑰(DER格密鑰),將其轉(zhuǎn)換成nddpq等因子填充到密碼學(xué)結(jié)構(gòu)體中。rsa_enc和 rsa_dec ,主要就是 公鑰加密、私鑰解密的這種用法。

此類密碼學(xué)具體算法的實(shí)現(xiàn),都是由 linux/lib/mpi 第三方libary實(shí)現(xiàn)的,是一種C語(yǔ)言的實(shí)現(xiàn)方式。

3、其它非對(duì)稱密碼

(1)、實(shí)現(xiàn)了3個(gè)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),  },};

僅僅實(shí)現(xiàn)了兩個(gè)接口函數(shù):

ecdsa_verify : 公鑰驗(yàn)簽

ecdsasetpub_key :導(dǎo)入公鑰

(2)、實(shí)現(xiàn)了1個(gè)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),  },};

僅僅實(shí)現(xiàn)了兩個(gè)接口函數(shù):

sm2_verify : 公鑰驗(yàn)簽

sm2setpub_key :導(dǎo)入公鑰

(3)、實(shí)現(xiàn)了1個(gè)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),  },};

僅僅實(shí)現(xiàn)了兩個(gè)接口函數(shù):

ecrdsa_verify : 公鑰驗(yàn)簽

ecrdsasetpub_key :導(dǎo)入公鑰

4、非對(duì)稱密碼算法的使用示例

如下所示,實(shí)現(xiàn)了 public_key_verify_signature(key,signature), 這個(gè)函數(shù)的實(shí)現(xiàn),也被export出來(lái),相當(dāng)于又封裝了一層。另外其它模塊如果有對(duì)非對(duì)稱密碼學(xué)算法的需求,也可以直接調(diào)用非對(duì)稱密碼學(xué)算法的API,例如直接調(diào)用如下這樣的函數(shù):

crypto_akcipher_verify()

crypto_akcipher_set_pub_key()

如下是 public_key_verify_signature(key,signature)的實(shí)現(xiàn),也可以當(dāng)作非對(duì)稱密碼學(xué)算法的使用示例:

(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、總結(jié)

Linux Kernel非對(duì)稱密碼算法的實(shí)現(xiàn)總結(jié)如下:

實(shí)現(xiàn)了RSA的:“導(dǎo)入公鑰、導(dǎo)入私鑰、公鑰加密私鑰解密” 功能

實(shí)現(xiàn)了ecdsa的:”導(dǎo)入公鑰、公鑰驗(yàn)簽” 功能

實(shí)現(xiàn)了sm2的:”導(dǎo)入公鑰、公鑰驗(yàn)簽” 功能

實(shí)現(xiàn)了ecr的:”導(dǎo)入公鑰、公鑰驗(yàn)簽” 功能

原文標(biāo)題:Linux Kernel中非對(duì)稱密碼算法的實(shí)現(xiàn)

文章出處:【微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11181

    瀏覽量

    208507
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4262

    瀏覽量

    62243
  • RSA
    RSA
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    18840
  • 密碼算法
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    7374

原文標(biāo)題:Linux Kernel中非對(duì)稱密碼算法的實(shí)現(xiàn)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    快充充電器基于非對(duì)稱橢圓曲線加密算法的單芯片認(rèn)證方案

    基于非對(duì)稱橢圓曲線加密算法的單芯片認(rèn)證方案
    發(fā)表于 08-15 10:41 ?1913次閱讀
    快充充電器基于<b class='flag-5'>非對(duì)稱</b>橢圓曲線加密<b class='flag-5'>算法</b>的單芯片認(rèn)證方案

    算法科普:非對(duì)稱算法

    非對(duì)稱算法,你了解多少呢?
    的頭像 發(fā)表于 09-05 21:07 ?5137次閱讀
    <b class='flag-5'>算法</b>科普:<b class='flag-5'>非對(duì)稱</b><b class='flag-5'>算法</b>

    單片機(jī)處理非對(duì)稱加密算法

    普通單片機(jī)可以處理非對(duì)稱加密算法嗎?速度如何?求大神解答
    發(fā)表于 09-17 12:38

    對(duì)稱性加密算法

    對(duì)稱性加密算法對(duì)稱式加密就是加密和解密使用同一個(gè)密鑰。信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是對(duì)數(shù)據(jù)進(jìn)行加解密了。對(duì)稱
    發(fā)表于 07-19 06:32

    對(duì)稱加密算法是什么

    對(duì)稱加密算法也叫私鑰加密算法,其特征是收信方和發(fā)信方使用相同的密鑰,即加密密鑰和解密密鑰是相同或等價(jià)的。非對(duì)稱加密算法也叫公鑰加密
    發(fā)表于 07-22 07:09

    密碼學(xué)系列 - 國(guó)密算法 精選資料分享

    時(shí),需要通過(guò)加密芯片的接口進(jìn)行調(diào)用。采用該算法已經(jīng)研制了系列芯片、智能IC卡、智能密碼鑰匙、加密卡、加密機(jī)等安全產(chǎn)品,廣泛應(yīng)用于電子政務(wù)、電子商務(wù)及國(guó)民經(jīng)濟(jì)的各個(gè)應(yīng)用領(lǐng)域(包括國(guó)家政務(wù)通、警務(wù)通等重要領(lǐng)域)。該算法不公開(kāi)SM2:
    發(fā)表于 07-23 07:07

    淺談對(duì)稱加密算法非對(duì)稱密鑰加密算法

    什么是對(duì)稱密鑰密碼體制?對(duì)稱密鑰密碼體制的缺點(diǎn)是什么?非對(duì)稱加密算法又是什么?
    發(fā)表于 12-23 06:05

    求分享使用Crypto模塊導(dǎo)入非對(duì)稱密鑰的示例

    我想知道 NXP 是否提供了使用加密模塊實(shí)現(xiàn)非對(duì)稱密鑰導(dǎo)入(RSA 或 ECC)的示例? RTD 中的示例僅實(shí)現(xiàn)對(duì)稱密鑰導(dǎo)入 (AES)。
    發(fā)表于 04-28 06:54

    “國(guó)產(chǎn)雙系統(tǒng)”出爐,RK3568J非對(duì)稱AMP:Linux+RTOS/裸機(jī)

    多處理架構(gòu)?!?b class='flag-5'>非對(duì)稱AMP”雙系統(tǒng)是指多個(gè)核心相對(duì)獨(dú)立運(yùn)行不同的操作系統(tǒng)或裸機(jī)應(yīng)用程序,如Linux + RTOS/裸機(jī),但需一個(gè)主核心來(lái)控制整個(gè)系統(tǒng)以及其它從核心。每個(gè)處理器核心相互隔離,擁有屬于自己的內(nèi)存
    發(fā)表于 12-01 09:35

    什么是非對(duì)稱加密?非對(duì)稱加密概念

    對(duì)稱加密算法在加密和解密時(shí)使用的是同一個(gè)秘鑰;而非對(duì)稱加密算法需要兩個(gè)密鑰來(lái)進(jìn)行加密和解密,這兩個(gè)秘鑰是公開(kāi)密鑰(public key,簡(jiǎn)稱公鑰)和私有密鑰(private key,簡(jiǎn)
    發(fā)表于 12-10 10:38 ?2.2w次閱讀
    什么是<b class='flag-5'>非對(duì)稱</b>加密?<b class='flag-5'>非對(duì)稱</b>加密概念

    java實(shí)現(xiàn)非對(duì)稱加密算法的過(guò)程

    對(duì)稱式加密:解密方式是加密方式的逆運(yùn)算,即加密和解密使用的是同一個(gè)密鑰(初等加密算法)。非對(duì)稱式加密:加密和解密需要兩個(gè)密鑰進(jìn)行,這兩個(gè)密鑰是公鑰和私鑰(高等加密算法)。
    發(fā)表于 12-10 10:54 ?5366次閱讀
    java<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>非對(duì)稱</b>加密<b class='flag-5'>算法</b>的過(guò)程

    如何理解區(qū)塊鏈密碼學(xué)中的非對(duì)稱加密

    當(dāng)前密碼學(xué)中的加密解密方式主要能分成兩類,分別是對(duì)稱加密和非對(duì)稱加密。這兩個(gè)加密體系的構(gòu)成都是一樣的,都包括:加解密算法、加密密鑰、解密密鑰。
    發(fā)表于 11-29 11:36 ?2281次閱讀

    利用EVPN實(shí)現(xiàn)子網(wǎng)間路由的非對(duì)稱對(duì)稱模型

    和外部網(wǎng)絡(luò)可以通過(guò) EVPN 外部路由到達(dá)。 Cumulus Linux 3.6 版本支持帶有非對(duì)稱模型的 EVPN 外部路由,僅將 L3VNI 用于外部路由。
    的頭像 發(fā)表于 04-08 15:29 ?2652次閱讀
    利用EVPN<b class='flag-5'>實(shí)現(xiàn)</b>子網(wǎng)間路由的<b class='flag-5'>非對(duì)稱</b>或<b class='flag-5'>對(duì)稱</b>模型

    密碼學(xué):如何使用非對(duì)稱密鑰算法來(lái)交換共享私鑰

    在我們的密碼學(xué)系列教程的最后兩期中,我們介紹了密碼學(xué)的基本概念和兩種基本類型。本節(jié)討論最常見(jiàn)的加密算法的具體實(shí)現(xiàn)細(xì)節(jié),從基本的 XOR 函數(shù)開(kāi)始,然后進(jìn)入當(dāng)今使用的更復(fù)雜的
    的頭像 發(fā)表于 12-19 15:28 ?1866次閱讀
    <b class='flag-5'>密碼</b>學(xué):如何使用<b class='flag-5'>非對(duì)稱</b>密鑰<b class='flag-5'>算法</b>來(lái)交換共享私鑰

    “國(guó)產(chǎn)雙系統(tǒng)”出爐,RK3568J非對(duì)稱AMP:Linux+RTOS/裸機(jī)

    非對(duì)稱AMP”雙系統(tǒng)是什么AMP(AsymmetricMulti-Processing),即非對(duì)稱多處理架構(gòu)。“非對(duì)稱AMP”雙系統(tǒng)是指多個(gè)核心相對(duì)獨(dú)立運(yùn)行不同的操作系統(tǒng)或裸機(jī)應(yīng)用程序,如
    的頭像 發(fā)表于 09-13 08:07 ?1323次閱讀
    “國(guó)產(chǎn)雙系統(tǒng)”出爐,RK3568J<b class='flag-5'>非對(duì)稱</b>AMP:<b class='flag-5'>Linux</b>+RTOS/裸機(jī)