Posterous theme by Cory Watilo

Filed under: crypt::rsa

Perl. Crypt::RSA. Найденные мною баги пофиксины.

Найденные мною баги в модуле Crypt::RSA пофискины в версии 1.95 от 6 июля 2008. Ура!!! :)
Список изменений тут. Описание багов тут и тут.
1.95                                     Jul 06, 2008 * Remove STDERR error output in Crypt::RSA::SS::PSS.   (http://rt.cpan.org/Public/Bug/Display.html?id=29048) * Allow symmetric cipher specification in Crypt::RSA::Key.   (http://rt.cpan.org/Public/Bug/Display.html?id=27929)

Original post http://sharifulin.livejournal.com/31546.html

Perl. Crypt::RSA. Баг. 2.

Не так давно в модуле Crypt::RSA мной был найден баг.

Сегодня в модуле Crypt::RSA::SS::PSS, который отвечает за создание и проверку подписи, был найден баг.

# функция проверки подписи
sub verify {
my ($self, %params) = @_;    ...    return 1 if $self->verify_with_salt_recovery ($M, $em1);    print $self->errstr; # баг :)    return $self->error ("Invalid signature.", \$M, \$S, $key, \%params);}

Если все проверки выполнились успешно, то функция verify возращает 1.
Если произошли какие-то ошибки (т.е. подпись не верна), функция verify возращает ''.
Сообщение об ошибке всегда можно получить $rsa->errstr.

БАГ: почему-то автору Crypt::RSA именно в Crypt::RSA::SS::PSS, если подпись не верна,
захотелось вывести сообщение об ошибке в STDOUT :).

При использовании этого модуля в CGI-скрипте этот баг сказывается самым интересным способом.
Сообщение об ошибке выводится в STDOUT, если еще не было вывода HTTP-заголовка,
то ошибка расценивается как неизвестный заголовок и скрипт падает :)

ФИКС БАГА: комментирование строки вывода ошибки в STDOUT.

Как все просто, но я минут 5 не мог понять, почему мой скрипт падает, если подпись не верна, даже eval не спасал :)

UPD: http://rt.cpan.org/Ticket/Display.html?id=29048

Original post http://sharifulin.livejournal.com/16220.html

Perl. Crypt::RSA. Баг.

Модуль Crypt::RSA позволяет создавать и работать с public/private-ключами по алгоритму асимметричного шифрования RSA.
Модуль позволяет сохранят ключи на диск, причем private-ключ шифрует алгоритмом симметричного шифрования (который доступен через Crypt::CBC). По умолчанию используется алгоритм Blowish.
Так вот появилась необходимость поменять алгоритм шифрации/дешифрации private-ключей на Rijndael.
В документации по Crypt::RSA сказано, что есть ключ Cipher:
Cipher
The block cipher which is used for encrypting the private key. Defaults to `Blowfish'. Cipher could be set to any value that works with Crypt::CBC(3) and Tie::EncryptedHash(3).

my ($public, $private) = $rsa->keygen (
'Identity'  => 'crypt-rsa-rijndael',        'Cipher'    => 'Rijndael',        'Size'      => 1024,        'Password'  => 'secret',        'Filename' => 'key') or die $rsa->errstr();

В результате были созданы ключи, только private-ключ зашифрован алгоритмом по умолчанию Blowish.
После 10 минутного изучения документации и дистрибутива Crypt::RSA, был найден баг, допущенный автором модуля.

Модуль Crypt::RSA::Key.pm строка 82:

my $prikey = $self->_load ((%$priload), Args => ['Password', $params{Password} ])
Именно здесь при инициализации private-ключа не учитывается ключ Cipher.
Изменив эту строку:
my $prikey = $self->_load ((%$priload), Args => ['Cipher' => $params{Cipher}, 'Password' => $params{Password}])

все заработало! :)

UPD:
Оставил заявку на CPAN Bugs
Original post http://sharifulin.livejournal.com/14267.html