2

一度にいくつかのデータを (解読) する必要があります。ターゲット データ バイトの最初と最後に追加のパディング バイトを追加する必要がある場合があります。struct scatterlistブロック暗号の暗号化メソッドの定義でわかるように、組み込みの crypto API はオブジェクトに対して機能します。

int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
           struct scatterlist *src, unsigned int nbytes);

今、暗号化操作のために私が従っている手順:

  1. データ バッファbufを取得します(長さL )
  2. 左パディングと右パディングのバイトを計算します ( rpadlpad )
  3. 全体を暗号化する ( lpadbufrpad )
  4. 結果のパディング バイトを取り除く

最も単純で効率の悪い解決策は、L + rpad + lpadバイトを割り当て、バッファの内容をこの新しい領域に適切にコピーすることです。しかし、API はこれらのscatterlistオブジェクトを使用するため、この純粋なリソースの浪費を回避する方法があるかどうか疑問に思っていました。

チェーンに関する LWN の記事をいくつか読みましたscatterlistが、ヘッダー ファイルをざっと見ただけで心配になります。全体を手動で設定する必要があるようです。これはかなり悪い習慣です ...

scatterlistAPI を適切に使用する方法についての手がかりはありますか? 理想的には、私は次のことをしたいと思います:

  1. 入力と出力の両方のパディング バイトにバッファを割り当てます。
  2. 「有用な」暗号化されたバイトのみを格納する「ペイロード」バッファを割り当てます
  3. scatterlistパディング バッファーとターゲット バッファーを含むオブジェクトを作成します。
  4. 全体を暗号化し、結果を出力パディング バッファ + 出力「ペイロード」バッファに格納します
  5. 入力および出力パディング バッファを破棄する
  6. 暗号化された「ペイロード」バッファをユーザーに返します
4

3 に答える 3

2

最初に、英語で申し訳ありません。私はネイティブの英語話者ではありません。カーネル "blkcipher_walk_virt" でこの API を探していると思います。ecb.c "crypto_ecb_crypt" でこの API の使用法を見つけることができます。また、padlock_aes.c も表示されます。

于 2013-02-22T09:58:22.970 に答える
2

コードを調べた後、適切な解決策を見つけました。いくつかの微妙な違いがありますが、質問に記載した手順に非常によく従っています。

JohnsonD ​​iao が提案したように、私はscatterwalk.cファイルに飛び込んで、Crypto API がscatterlistオブジェクトをどのように利用しているかを確認しました。

発生した問題は、後続の 2 つの間の「境界」scatterlistです。2 つ連鎖しているとしましょうscatterlist。最初のものは 12 バイトのバッファに関する情報を保持し、2 番目のものは 20 バイトのバッファに関する情報を保持します。AES128-CTR を使用して 2 つのバッファー全体を暗号化したい。この特定のケースでは、API は次のことを行います。

  1. 最初の によって参照されるバッファの 12 バイトを暗号化しますscatterlist
  2. カウンターをインクリメントする
  3. 2 番目のスキャッタリストの最初の 16 バイトを暗号化する
  4. カウンターをインクリメントする
  5. 最後の残りの 4 バイトを暗号化する

私が期待していた動作は次のとおりです。

  1. 最初のバッファーの 12 バイト + 2 番目のバッファーの最初の 4 バイトを暗号化します。
  2. カウンターをインクリメントする
  3. 2 番目のバッファーの最後の 16 バイトを暗号化する

したがって、これを強制するには、パターンに 16 バイトのアラインされたパディング バッファーを割り当てる必要があります。

要求された暗号化に必要なパディング バイト数をnパディングします。次に、次のようになります。バフの長さ

ここで、 l bufはパディング バッファーの全長です。ここで、最後のl buf - n padバイトを最初の入力データ バイトで埋める必要があります。入力が短すぎて完全なコピーを確保できない場合、それは問題ではありません。

したがって、最初のl cpy = min(l buf - n pad , l data )バイトをパディング バッファーのオフセットn padにコピーします。

要するに、手順は次のとおりです。

  1. 長さl bufの適切なパディング バッファを割り当てます
  2. ペイロード バッファの最初のl cpyバイトをパディング バッファのオフセットn padにコピーします
  3. でパディング バッファを参照します。scatterlist
  4. 別のペイロード バッファを参照するscatterlist( l cpyシフトを使用)
  5. 暗号化を依頼する
  6. パディング バッファに存在するペイロード バイトを抽出する
  7. パディング バッファを破棄する

これをテストしたところ、完全に機能するように見えました。

于 2013-02-22T13:06:24.720 に答える
1

この部分も学んでいます。これが私の分析です:

暗号化デバイスが一度に 16 バイトの暗号化を必要とする場合は、アライメントを (16-1) に設定する必要があります。padlock_aes.c と同様に、ecb_aes_alg.cra_alignmask を参照してください。カーネルはこれを blkcipher_next_copy と blkcipher_next_slow で処理します。しかし、私は困惑しています.aes_generic.cでは、alignmaskは3ですが、カーネルはblkcipher_next_copyなしでこれをどのように処理しますか?

于 2013-02-23T02:56:52.270 に答える