1

Linux 暗号の例を解決し、aead 暗号を正しく呼び出すことができたので、興味深い問題に遭遇しました。

スキャッタリストを次のように定義します。

struct scatterlist sg[2];
sg_init_table(sg, 2 );
sg_set_buf(&sg[0], address, 512);
sg_set_buf(&sg[1], mac, 16);
aead_request_set_crypt(req, sg, sg, 512, iv);
crypto_aead_encrypt(req);

そしてそれはうまくいきます。ただし、バッファ サイズを 512 から 131072 に増やすと、「非常に頻繁に」パニックが発生します。

 BUG: unable to handle kernel paging request at ffffeb04000cea80
 IP: [<ffffffff812f4880>] scatterwalk_done+0x50/0x60

さて、すべての暗号は scatterwalk_ 関数を呼び出すことになるので、 sg- >length を何か大きい値に設定することに問題があると思います。おそらく大きすぎて、次のページにまたがることがあります。

ここで何をするのが適切ですか?それぞれが次のページに移動しないように、多くのスキャッタリストに分割する必要がありますか? それは面倒に思えますが、これを行う機能はありますか? それとも、各ページが「利用可能」であることを確認する必要がありますか?

4

1 に答える 1

0

わかりました、実際、ここで私を悩ませていることが2つありました。1 つ目は、私に渡されたメモリが、実際には vmalloc() で割り当てられたメモリからのものである場合があったことです。つまり、代わりに sg_set_page( , vmalloc_to_page() ) を使用する必要があります。

2 番目の問題は、スキャッターウォーク関数が正しくないことです。Mac も生成する暗号を 2 番目のバッファーとして設定すると、テストが容易になります。

cipherout = kmalloc( size, ...
macout = kmalloc( maclen, ...

新しく割り当てられたメモリはページ境界にあるため、これは通常は機能します。ただし、次のように変更します。

 macout = kmalloc( maclen + 16, ...
 macout += 16;

私がすることは、より大きなバッファを割り当て、メモリを 16 バイトから開始することだけです。(+1024 または +3480 は関係ありません) これにより、スキャッタウォーク パニックが発生します。linux-crypto メーリング リストに提案されたパッチがあります。これは将来的には素晴らしいものですが、現時点では役に立ちません。MACアドレスが揃っていることを確認する必要があります。そうでない場合は、一時バッファーを割り当てます(少なくとも小さいです)。

于 2012-11-17T06:47:13.527 に答える