3

Linux カーネルで整数配列の SHA1 を計算しようとしています。crypto.c/crypto.hを実行しましたが、SHA1 コンピューターを実行security/integrity/ima/ima_crypto.cする方法がわかりません。誰かがこれを行う方法についてのチュートリアルまたはガイドを教えてもらえますか?initupdate

4

1 に答える 1

10

Documentation/crypto/api-intro.txtには、Linux 暗号化 API のかなり良い紹介があります。関数がどのように使用されているかの実際の例については、fs/ecryptfs/crypto.cもチェックしてください。

ここでは、簡単な要約を示します。

ステップ 1: 宣言

いくつかのローカル変数を作成します。

struct scatterlist sg;
struct hash_desc desc;
char *plaintext = "plaintext goes here";
size_t len = strlen(plaintext);
u8 hashval[20];
  • は関数が理解できるstruct scatterlist形式でプレーンテキストを保持するために使用され、aはハッシュを構成するために使用されます。crypto.hstruct hash_desc
  • 変数plaintextは平文文字列を保持し、平文hashvalのハッシュを保持します。
  • 最後にlen、平文文字列の長さを保持します。

この例では ASCII プレーンテキストを使用していますが、整数配列も渡すことができることに注意してください。合計メモリ サイズを格納し、 のlenすべてのインスタンスをplaintext整数配列に置き換えるだけです。

int myarr[4] = { 1, 3, 3, 7 };
size_t len = sizeof(myarr);

ただし、注意してください:int通常、要素のサイズは 1 バイトよりも大きいため、整数値をint配列に格納すると、配列と同じ内部表現にはなりませんchar。値の間のパディングとして null バイトが発生する可能性があります。

さらに、整数の ASCII 表現をハッシュする場合は、最初に配列内の値を文字列の文字列に変換する必要があります(おそらく を使用sprintf)。

ステップ 2: 初期化

初期化sgしてdesc:

sg_init_one(&sg, plaintext, len);
desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);

"sha1"に渡されることに注意してくださいcrypto_alloc_hash。これは"md5"、MD5 ハッシュ、またはそれぞれのハッシュ方法を使用するためにサポートされているその他の文字列に対して設定できます。

ステップ 3: ハッシュ

次に、3 つの関数呼び出しでハッシュを実行します。

crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, len);
crypto_hash_final(&desc, hashval);
  • crypto_hash_init提供された に従ってハッシュエンジンを構成しますstruct hash_desc
  • crypto_hash_update平文に対して実際のハッシュ方法を実行します。
  • 最後にcrypto_hash_final、ハッシュを文字配列にコピーします。

ステップ 4: クリーンアップ

によって保持されている割り当てられたメモリを解放しますdesc.tfm:

crypto_free_hash(desc.tfm);

こちらもご覧ください

Linux カーネル 2.6 での CryptoAPI の使用方法

于 2013-05-31T18:33:47.603 に答える