13

私はしばらくの間探していましたが、syscallの作成/カーネルランドでLinuxに付属するCryptoAPIを使用する方法に関する十分なドキュメント/例の近くを見つけられませんでした。

誰かが良い情報源を知っているなら、私に知らせてください、私はカーネル空間内でのみSHA1/MD5とBlowfish/AESを行う方法を知りたいです。

4

7 に答える 7

11
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/crypto.h>
#include <linux/err.h>
#include <linux/scatterlist.h>

#define SHA1_LENGTH     20

static int __init sha1_init(void)
{
    struct scatterlist sg;
    struct crypto_hash *tfm;
    struct hash_desc desc;
    unsigned char output[SHA1_LENGTH];
    unsigned char buf[10];
    int i;

    printk(KERN_INFO "sha1: %s\n", __FUNCTION__);

    memset(buf, 'A', 10);
    memset(output, 0x00, SHA1_LENGTH);

    tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);

    desc.tfm = tfm;
    desc.flags = 0;

    sg_init_one(&sg, buf, 10);
    crypto_hash_init(&desc);

    crypto_hash_update(&desc, &sg, 10);
    crypto_hash_final(&desc, output);

    for (i = 0; i < 20; i++) {
        printk(KERN_ERR "%d-%d\n", output[i], i);
    }

    crypto_free_hash(tfm);

    return 0;
}

static void __exit sha1_exit(void)
{
    printk(KERN_INFO "sha1: %s\n", __FUNCTION__);
}

module_init(sha1_init);
module_exit(sha1_exit);

MODULE_LICENSE("Dual MIT/GPL");
MODULE_AUTHOR("Me");
于 2013-03-14T09:16:06.027 に答える
6

もう1つの良い例は、security/seclvl.cの2.6.18カーネルソースからのものです。

注:必要に応じて、CRYPTO_TFM_REQ_MAY_SLEEPを変更できます

static int
plaintext_to_sha1(unsigned char *hash, const char *plaintext, unsigned int len)
{
  struct crypto_tfm *tfm;
  struct scatterlist sg;
  if (len > PAGE_SIZE) {
    seclvl_printk(0, KERN_ERR, "Plaintext password too large (%d "
            "characters).  Largest possible is %lu "
            "bytes.\n", len, PAGE_SIZE);
    return -EINVAL;
  }
  tfm = crypto_alloc_tfm("sha1", CRYPTO_TFM_REQ_MAY_SLEEP);
  if (tfm == NULL) {
    seclvl_printk(0, KERN_ERR,
            "Failed to load transform for SHA1\n");
    return -EINVAL;
  }
  sg_init_one(&sg, (u8 *)plaintext, len);
  crypto_digest_init(tfm);
  crypto_digest_update(tfm, &sg, 1);
  crypto_digest_final(tfm, hash);
  crypto_free_tfm(tfm);
  return 0;
}
于 2011-07-18T23:45:45.157 に答える
6

カーネルには、暗号化モジュールを使用する場所がいくつかあります。eCryptfsファイルシステム(linux / fs / ecryptfs /)と802.11ワイヤレススタック(linux / drivers / staging / rtl8187se / ieee80211 /)です。これらは両方ともAESを使用しますが、そこで見つけたものをMD5に外挿できる場合があります。

于 2010-10-06T20:38:42.000 に答える
2

Cryptodev-linux

https://github.com/cryptodev-linux/cryptodev-linux

これは、を介してカーネル暗号化APIをユーザースペースに公開するカーネルモジュールです/dev/crypto

SHAの計算例:https ://github.com/cryptodev-linux/cryptodev-linux/blob/da730106c2558c8e0c8e1b1b1812d32ef9574ab7/examples/sha.c

他の人が述べているように、カーネルは暗号APIをユーザースペース自体に公開していないようです。これは、カーネルがすでにネイティブハードウェアアクセラレーションされた暗号機能を内部で使用できるため、残念です。

暗号操作cryptodevがサポートするもの:https ://github.com/nmav/cryptodev-linux/blob/383922cabeea7dca354415e8c590f8e932f4d7a8/crypto/cryptodev.h

Linux x86がサポートする暗号化操作:https ://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/crypto?id = refs / tags / v4.0

于 2015-04-24T08:13:12.197 に答える
1

開始するのに最適な場所は、カーネルソースのDocumentation/crytpoです。dm-cryptは、おそらくカーネル暗号化APIを使用する多くのコンポーネントの1つであり、それを参照して使用法についてのアイデアを得ることができます。

于 2010-10-06T16:52:21.950 に答える
1

カーネルスペース内でのみSHA1/MD5およびBlowfish/AESを実行する方法。

2要素のスキャッターリストを使用してデータをハッシュする例:

struct crypto_hash * tfm = crypto_alloc_hash( "sha1"、0、CRYPTO_ALG_ASYNC);
if(tfm == NULL)
    不合格;
char * output_buf = kmalloc(crypto_hash_digestsize(tfm)、GFP_KERNEL);
if(output_buf == NULL)
    不合格;
struct scatterlist sg [2];
struct hash_desc desc = {.tfm = tfm};
ret = crypto_hash_init(&desc);
if(ret!= 0)
    不合格;
sg_init_table(sg、ARRAY_SIZE(sg));
sg_set_buf(&sg [0]、 "Hello"、5);
sg_set_buf(&sg [1]、 "World"、6);
ret = crypto_hash_digest(&desc、sg、11、output_buf);
if(ret!= 0)
    不合格;
于 2010-11-21T13:31:57.100 に答える
1

1つの重要な注意:

crypto_alloc_hash障害を検出するために、関数の戻り値をNULLと比較しないでください。

手順:

IS_ERRこの目的のために常に関数を使用してください。と比較しNULLてもエラーはキャプチャされないため、後でセグメンテーション違反が発生します。

IS_ERRが失敗を返す場合は、カーネルイメージに(またはモジュールとして)コンパイルされた暗号化アルゴリズムが欠落している可能性があります。適切な暗号アルゴリズムを選択していることを確認してください。フォームmake menuconfig

于 2014-08-26T07:14:07.517 に答える