2009年7月8日水曜日

openssl の multithread 絡みではまっていたっぽい

ここんところ、仕事のコーディングで、問題箇所は、おおまかに特定できるけど、原因不明な問題ではまっていた。ヒステリックな挙動を示したのは、OpenSSL の d2i_RSAPublicKey をコールした戻り値。全く同じデータを渡しており、その渡したデータはログに記録していて正しく表示されている状態であっても(72バイト長のバイト列)、RSA 構造体のポインタに null がセットされる。あーん???
もしかして・・・と調べてみると、こんな情報を見つけた。他にも検索していて、libpq が openssl の初期化を考慮していない等、いろいろ情報が交錯している模様だ。OpenSSL の情報自体も少ない。C/C++セキュア・プログラミング・クックブックに、いろいろと載っているが、マルチスレッドに関するコーディングの記載は見当たらない。だいたい、今の時代において、マルチスレッドはデフォルトで考えておいてほしい所だ。これらの初期化を行うのは誰の責任か?例えば、A.DLL と B.DLL が気を利かせて OpenSSL マルチスレッド対応のコードを実装していたらバッティングしてしまう。そうするとアプリケーションの仕事って事になるのだろうが、どのタイミングで処理を行えばOKなのか不安だ。
ちなみに、OpenSSL のマルチスレッド対応のコードをインプリメントしてみたが、状況は変わらなかった。こうなると、opensslを利用するライブラリが競合して、何かが起こっているのではないか?と勘ぐりたくなってくる。

結論

OpenSSL は標準でマルチスレッドに対応すべきである。

 余計なファクターを取り除くために今回決断した事は、openssl を捨てて、windows の cryptograph api を利用するか、マルチスレッドを考慮した車輪の開発を行うかの2択で、とりあえず windows api を使う方向で考える事にした。疲れた・・・

0 件のコメント: