mcryptの動作がマニュアルと違うように見える件
PHPからも利用できる汎用的な暗号化ライブラリのMCryptが思ったように動いていない。
普通に使う分には問題ないのですが、エラー処理を書いていたらどうも挙動がおかしい。
具体的には暗号モジュールの初期化を行うmcrypt_generic_initの戻り値です。
この関数には暗号鍵などのデータを渡すのですが、それらが不正な場合にはエラーを返すことになっています。
http://jp.php.net/manual/ja/function.mcrypt-generic-init.php
この関数は、エラー時に負の値を返します。キー長が不正な場合に -3、メモリの確保に問題があった場合に -4、そしてそれ以外の返り値は その他のエラーとなります。エラーが警告を発生させた場合、それが 表示されます。間違ったパラメータが渡された場合には FALSE が返されます。
つまり負の値とFALSEを捕まえればエラー判定ができるはずなのですが・・・。
下記のように不正な鍵などをパラメータに与えるコードを実行してみます。
結果
Warning: mcrypt_generic_init(): Key size too large; supplied length: 34, max: 32 in /a/ndev01/usr/local/www/_PERSONAL/ts-yando/test/mcrypt.php on line 19 Warning: mcrypt_generic_init(): Iv size incorrect; supplied length: 3, needed: 32 in /a/ndev01/usr/local/www/_PERSONAL/ts-yando/test/mcrypt.php on line 19 int(0)
intの0が返ってきました。
正常実行時も0です。パラメータや暗号ロジックの組み合わせも変えてみましたがやはり0が返ってきます。
どういうことになっているのかということでPHPのソースも確認してみました。
result = mcrypt_generic_init(pm->td, key_s, key_size, iv_s); /* If this function fails, close the mcrypt module to prevent crashes * when further functions want to access this resource */ if (result < 0) { zend_list_delete(Z_LVAL_PP(mcryptind)); switch (result) { case -3: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Key length incorrect"); break; case -4: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Memory allocation error"); break; case -1: default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error"); break; } } pm->init = 1; RETVAL_LONG(result);
ソースにも痕跡があるのでPHPとしての仕様は変わっていないようです。
ただそもそもこれってlibmcryptの戻り値に依存しているようにも思います。
うーん、PHP分かる人に聞いてみたい。
あとはこうすれば「-3」などが返ってくる方法が分かる方もいればぜひ教えて頂きたいです。
追記)解決しました!