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