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