Home

29 Авг, 2007

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
Метки: ,

3 Июл, 2007

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
Метки: , ,
sharifulin

Декабрь 2009

Вс Пн Вт Ср Чт Пт Сб
  12345
6789101112
13141516171819
20212223242526
2728293031  

Реклама

Метки

Трансляция

RSS Atom
Разработано LiveJournal.com