вторник, июля 16, 2013

Wget c поддержкой ГОСТ


Собственно wget с поддержкой шифра ГОСТ, собранный на CentOS 6.4:
Далее привожу пошаговую инструкцию как пропатчить wget и получить приведенные выше файлы самостоятельно.


И так, нам понадобятся:
Давайте сначала проведем подготовительную работу: создадим рабочий каталог и скажем rpmbuild работать внутри этого каталога.

$ mkdir ~/pkgs
$ echo '%_topdir %(echo $HOME)/pkgs/rpmbuild' >> ~/.rpmmacros

Теперь загрузим патч от Криптокома и оригинальный srpm пакет в ~/pkgs и распакуем их.

$ cd ~/pkgs
$ wget http://www.cryptocom.ru/opensource/wget.diff.gz
$ gunzip wget.diff.gz
$ wget http://vault.centos.org/6.4/os/Source/SPackages/wget-1.12-1.8.el6.src.rpm
$ rpm -ihv wget-1.12-1.8.el6.src.rpm

После последней команды содержимое пакета будет разложено по подкаталогам ~/pkgs/rpmbuild: исходники с патчами в SOURCES, а spec-файл в SPECS. Прежде чем делать наш патч, давайте сначала посмотрим на патч от Криптокома (хоть он и от старой версии). Он делает следующее:
  1. добавляет в начало файла src/openssl.c (там, где много include'ов):

    #if OPENSSL_VERSION_NUMBER >= 0x00907000
    #include <openssl/conf.h>
    #endif

  2. в том же файле в начало функции ssl_init() перед инициализацией SSL, вставляет:

    #if OPENSSL_VERSION_NUMBER >= 0x00907000
    OPENSSL_config(NULL);
    #endif
Именно эти изменения нам и предстоит внести в src/openssl.c. Теперь посмотрим в spec-файл. Напомню путь до него ~/pkgs/rpmbuild/SPECS/wget.spec. Кстати, распаковать rpm'ку можно и такой командой:

$ rpm2cpio wget-1.12-1.8.el6.src.rpm | cpio -idmv

В начале спека (строка 10) можно заметить, что во время сборки на исходники накладывается ряд патчей. Среди них есть wget-1.12-openssl_timeout.patch (за номером 3 в spec-файле), который модифицирует интересующий нас src/openssl.c, поэтому первым делом применим его:

$ cd rpmbuild/SOURCES
$ tar -xjf wget-1.12.tar.bz2
$ patch -p0 < wget-1.12-openssl_timeout.patch

patching file wget-1.12/src/openssl.c

Теперь в пропатченный openssl.c добавляем изменения для включения ГОСТ'а, предварительно сделав его копию, чтобы было относительно чего формировать патч. Для удобства можно открыть в vim'е openssl.c и Криптокомовский патч "лицом к лицу", что я и делаю второй командой:

$ cp wget-1.12/src/openssl.c{,.orig}
$ vim -O ~/pkgs/wget.diff wget-1.12/src/openssl.c

Получаем долгожданный патч:

$ diff -u wget-1.12/src/openssl.c{.orig,} > wget-1.12-openssl_gost.patch

Следующий шаг - это исправить spec-файл так, чтобы во время сборки наш патч применялся после wget-1.12-openssl_timeout.patch (я заодно увеличил номер релиза пакета). Переходим в каталог ~/pkgs/rpmbuild/SPECS, а далее можно воспользоваться патчем для wget.spec или внести изменения вручную. При ручном вмешательстве меняем список содержащихся в пакете патчей и порядок их применения следующим образом:

Release: 1.9%{?dist}
...
Patch3: wget-1.12-openssl_timeout.patch
Patch4: wget-1.12-openssl_gost.patch
Patch5: wget-1.12-fuzzed_response_seg_fault.patch
...
%patch3 -p1 -b .ssl_timeout
%patch4 -p1
%patch5 -p1 -b .fuzzed

И так, патч получили, в spec-файле его прописали, можно переходить непосредственно к сборке wget'а: устанавливаем build-зависимости (предполагаю, что gcc сотоварищи уже установлены) и запускаем сборку:

$ sudo yum-builddep wget.spec
$ rpmbuild -ba wget.spec

По завершению сборки, в каталоге ~/pkgs/rpmbuild/SRPMS появится, как следует из названия каталога, srpm-пакет, а в ~/pkgs/rpmbuild/RPMS/<архитектура> будет лежать пакет готовый для установки.

Комментариев нет:

Отправить комментарий