SSLドキュメント分析
この質問は、OpenSSLでのHMACルーチンの使用に関するものです。
OpenSSLのドキュメントは特定の領域では少し弱いので、プロファイリングにより、次のことを使用していることが明らかになりました。
unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
int key_len, const unsigned char *d, int n,
unsigned char *md, unsigned int *md_len);
ここから、私のライブラリランタイムの40%が、舞台裏でHMAC_CTXの作成と削除に費やされていることを示しています。
HMAC_CTXを明示的に作成および破棄するための2つの追加関数もあります。
HMAC_CTX_init()は、最初に使用する前にHMAC_CTXを初期化します。呼び出す必要があります。
HMAC_CTX_cleanup()は、HMAC_CTXからキーとその他のデータを消去し、関連するリソースを解放します。HMAC_CTXが不要になったときに呼び出す必要があります。
これらの2つの関数呼び出しには、接頭辞として次のものが付いています。
メッセージがメモリに完全に保存されていない場合は、次の関数を使用できます
私のデータは完全にメモリに収まるので、HMAC関数(署名が上に示されている関数)を選択します。
マニュアルページで説明されているように、コンテキストは次の2つの関数を使用して使用されます。
HMAC_Update()は、認証されるメッセージのチャンク(データでのlenバイト)を使用して繰り返し呼び出すことができます。
HMAC_Final()は、メッセージ認証コードをmdに配置します。このコードには、ハッシュ関数出力用のスペースが必要です。
アプリケーションの範囲
私のアプリケーションは、本物の(HMAC、ナンスも使用されます)、CBC-BF暗号化プロトコルバッファ文字列を生成します。このコードは、OSとしてのWindows / Linux、Webサーバーとしてのnginx、Apache、IIS、およびPython/.NETおよびC++WebサーバーフィルターとしてのさまざまなWebサーバーおよびフレームワークとインターフェイスします。
上記の説明は、ライブラリがスレッドセーフである必要があり、潜在的に再開可能な処理状態を持つ必要があることを明確にする必要があります。つまり、OSスレッドを共有する軽量スレッド(スレッドローカルメモリが画像から外れる可能性があります)。
質問
(1)スレッドセーフ/(2)再開可能な状態の方法で各呼び出しの40%のオーバーヘッドを取り除くにはどうすればよいですか?(2)すべてのソースデータが一度に存在するためオプションであり、ダイジェスト作成の途中でスレッドの制御を放棄することなく、ダイジェストが適切に作成されていることを確認できます。それで、
(1)おそらくスレッドローカルメモリを使用して実行できますが、CTXを再利用するにはどうすればよいですか?HMAC_final ()呼び出しはCTXを再利用可能にしますか?
(2)オプション:この場合、CTXのプールを作成する必要があります。
(3)HMAC関数はこれをどのように実行しますか?関数呼び出しのスコープ内にCTXを作成し、それを破棄しますか?
擬似コードと解説が役立ちます。