OpenSSL для ARM

Форум программистов
Voxel
Сообщения: 35
Зарегистрирован: 29 фев 2016, 12:34

Сообщение Voxel » 28 июн 2016, 11:34

Добрый день,

Я несколько месяцев назад описывал свои мучения с железкой Netgear R7500:

Entware-ng - основные сведения

В общем, как-то так получилось, что все это вылилось в то, что Нетгир забросил поддержку этой железки (статус end-of-life из-за проблемных драйверов Quantenna), а я продолжил эту поддержку. Надо же как-то выкручиваться. Сейчас моя модификация прошивки приобрела како-то удобоваримый вид, удалось заменить проблемные драйвера Quantenna, выдрав их в бинарном виде из како-то беты, обновил тулчейн, заменил кучу пакетов прошивки, использующей OpenWRT AA, на новые OpenWRT-шные и из Вашей Entware, ориентировал прошивку на использование Entware-NG (еще раз спасибо за этот проект). И как-то вышло, что люди стали использовать мою прошивку. Немного народа, но есть.

Вопрос к знатокам OpenWRT, ARM: если коротко, как включить харверную акселерацию в OpenSSL? Процессор в железке IPQ8064, Krait, то есть аналог Cortex A15. В стоковой прошивке вообще использовалась версия OpenSSL 0.9.8. Я заменил на 1.0.2h но получилосб без хардверной акселерации. Я тут подзапутался, заблудился в трех соснах. Я все же новичок в OpenWRT, OpenSSL и в ARM-ах. Если я правильно понимаю, в Makefile OpenSSL для OpenWRT выключена эта акселерация, закоментированы строки:

Код: Выделить всё

ifeq ($(CONFIG_x86_64),y)
  OPENSSL_TARGET:=linux-x86_64-openwrt
  OPENSSL_MAKEFLAGS += LIBDIR=lib
else
  OPENSSL_OPTIONS+=no-sse2
  ifeq ($(CONFIG_mips)$(CONFIG_mipsel),y)
    OPENSSL_TARGET:=linux-mips-openwrt
 # else ifeq ($(CONFIG_arm)$(CONFIG_armeb),y)
 #   OPENSSL_TARGET:=linux-armv4-openwrt
  else
    OPENSSL_TARGET:=linux-generic-openwrt
    OPENSSL_OPTIONS+=no-perlasm
  endif
endif


то есть, испрользуется linux-generic-openwrt. Если я убираю коментарии, получаю неразрешенные ссылки при линковке. Используется ассемблер, вижу. Что здесь за проблема, почему закоментировано в OpenWRT и почему неразрешенные ссылки? Может, нужна еще поддержка на уровне ядра? Тут у меня загвоздка, Нетгир использует свою модификацию ядра 3.4.103 и бинарные (прекомпилированные) драйверы прошивки привязаны к этому конкретному ядру...

Сообщения при линковке:

Код: Выделить всё

s_socket.o: In function `do_server':
s_socket.c:(.text+0x698): warning: gethostbyaddr is obsolescent, use getaddrinfo() instead.
s_socket.o: In function `GetHostByName':
s_socket.c:(.text+0xd4): warning: gethostbyname is obsolescent, use getnameinfo() instead.
../libcrypto.so: undefined reference to `bsaes_ctr32_encrypt_blocks'
../libcrypto.so: undefined reference to `aes_v8_ctr32_encrypt_blocks'
../libcrypto.so: undefined reference to `_armv7_tick'
../libcrypto.so: undefined reference to `aes_v8_encrypt'
../libcrypto.so: undefined reference to `_armv7_neon_probe'
../libcrypto.so: undefined reference to `_armv8_pmull_probe'
../libcrypto.so: undefined reference to `bsaes_xts_encrypt'
../libcrypto.so: undefined reference to `bsaes_xts_decrypt'
../libcrypto.so: undefined reference to `_armv8_sha1_probe'
../libcrypto.so: undefined reference to `aes_v8_set_decrypt_key'
../libcrypto.so: undefined reference to `bsaes_cbc_encrypt'
../libcrypto.so: undefined reference to `aes_v8_set_encrypt_key'
../libcrypto.so: undefined reference to `gcm_ghash_neon'
../libcrypto.so: undefined reference to `aes_v8_cbc_encrypt'
../libcrypto.so: undefined reference to `gcm_gmult_neon'
../libcrypto.so: undefined reference to `aes_v8_decrypt'
../libcrypto.so: undefined reference to `_armv8_aes_probe'
../libcrypto.so: undefined reference to `gcm_init_neon'
../libcrypto.so: undefined reference to `_armv8_sha256_probe'
collect2: error: ld returned 1 exit status


В общем, есть возможность вклюжить хардверное криптование для ARM в OpenSSL не трогая коды ядра? В Entware-ng тоже закоментированы эти строки.

Заранее спасибо,
Voxel.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1209
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 28 июн 2016, 13:42

Никогда этим не занимался.
Единствеено, что могу предложить. Прописать у traget

Код: Выделить всё

CPU_SUBTYPE:=neon

или

Код: Выделить всё

CPU_SUBTYPE:=neon-vfpv4

в зависимости от поддержки железом
ну и, естественно, отключить softfloat.
https://github.com/Entware-ng/Entware-n ... et.mk#L244

Voxel
Сообщения: 35
Зарегистрирован: 29 фев 2016, 12:34

Сообщение Voxel » 28 июн 2016, 15:11

Спасибо за ответ, но это не совсем то. Я уже включил поддержку neon-vfpv4, также компилировал всю прошивку с опциями:

-O2 -pipe -mcpu=cortex-a15 -mfpu=neon-vfpv4 -mtune=cortex-a15 -mfloat-abi=hard

однако, я имел в виду то, что называется "ARM assembly acceleration". Вот здесь, например, что-то сказано про это:

https://gitlab.labs.nic.cz/turris/openw ... d5dcc82a53

однако, вот это и не срабатывает. Неразрешенные ссылки. Используется ассемблер, но неразрешенные ссылки.

Я просто знаю, что для более крутого аналога моего R7500, с процессором IPQ8065 при использовании ассемблера OpenSSL тест на DD-WRT выдает результаты раза в 1.5-2 круче.

И, вроде, Александр Рыжов чем-то подобным занимался для MIPS:

http://www.linksysinfo.org/index.php?th ... ion.49216/

Все же, это, наверное, на уровне ядра. Которое я не могу поменять из-за пропретарных драйверов. Или я ошибаюсь?

Voxel.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1209
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 28 июн 2016, 15:22

Мой гугл меня навел на патч - http://linux-crypto.vger.kernel.narkive ... ild-errors
Посмотрел, и правда в openssl-1.0.2h/crypto/aes//bsaes-armv7.pl есть строка
# define __ARM_ARCH__ __LINUX_ARM_ARCH__

Voxel
Сообщения: 35
Зарегистрирован: 29 фев 2016, 12:34

Сообщение Voxel » 28 июн 2016, 15:58

Да, это я уже находил. То есть все же ядро. Проблема в том, что в 3.4.0 и в 3.4.103 нет такой директории (arch/arm/crypto).

Кстати, по Вашей ссылке на Entware-NG и softfloat, пять строчек выше:

Код: Выделить всё

 CPU_CFLAGS_cortex-a15 = -march=armv7-a -mtune=cortex-a15


мне кажется, это не совсем верно. Команды Cortex-A15 выходят за рамки ARMV7-A, так что опция -march=armv7-a ограничивает набор инструкций, разрешенных для данного типа процессора. Долго изучал этот вопрос для Krait, который по инструкциям Cortex-A15, так вот, вроде нужно заменить -march=armv7-a просто на -mcpu=cortex-a15. Даже компилятор выдает ворнинги, что опции -mcpu=cortex-a15 и -march-armv7-a несовместимы.

Voxel.

Voxel
Сообщения: 35
Зарегистрирован: 29 фев 2016, 12:34

Сообщение Voxel » 01 июл 2016, 21:32

Если интересно, мне все же удалось применить эту ассемблерную акселерацию в Entware-ng. Я перекомпилировал Entware-ng с нуля с ядром 3.4.103 (ну оно используется в прошивке), потом взял ядро 3.18.36 (там уже есть /arch/arm/crypto с ассемблерными кодами) и собрал только пакет OpenSSL, убрав комментарии в Makefile. Результат достаточно впечатляет. Пока не пробовал на своей OpenVPN, но должно неплохо ускориться.

Было (до применения ассемблерной акселерации, Entware, тест OpenSSL):

Код: Выделить всё

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5               6484.94k    22414.88k    62388.40k   112649.90k   147072.43k
sha1              5612.70k    18752.30k    46857.16k    75064.01k    90426.03k
des cbc          21560.90k    22420.63k    22804.21k    22913.63k    22899.24k
des ede3          8423.97k     8586.75k     8673.35k     8615.25k     8665.99k
aes-128 cbc      43707.08k    48836.26k    50496.73k    50789.38k    50872.59k
aes-192 cbc      36966.49k    41938.32k    43277.10k    43413.85k    43606.65k
aes-256 cbc      34206.93k    36612.95k    37643.73k    37784.92k    37839.37k
sha256            6972.91k    17469.50k    32550.96k    41760.71k    45428.61k
sha512            1270.71k     5078.05k     7560.45k    10519.12k    11826.52k
                  sign    verify    sign/s verify/s
rsa 2048 bits 0.026332s 0.000678s     38.0   1474.8
                  sign    verify    sign/s verify/s
dsa 2048 bits 0.006750s 0.008101s    148.1    123.4


стало (все та же Entware-ng, ассемблерная акселерация):

Код: Выделить всё

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5               6996.87k    26885.70k    73259.07k   130391.67k   167409.37k
sha1              8914.26k    30654.01k    87920.97k   160928.81k   213757.71k
des cbc          21707.06k    23081.62k    23557.50k    23925.00k    23667.33k
des ede3          8507.03k     8643.38k     8757.02k     8848.83k     8768.78k
aes-128 cbc      60333.23k    66956.01k    69110.05k    69995.05k    71539.76k
aes-192 cbc      52226.88k    57080.51k    59177.61k    59301.87k    59487.80k
aes-256 cbc      46080.67k    49964.60k    51772.11k    52132.43k    52677.64k
sha256           19981.40k    47786.67k    85657.77k   109407.04k   119275.52k
sha512            6703.77k    26708.34k    39904.33k    54885.71k    61868.97k
                  sign    verify    sign/s verify/s
rsa 2048 bits 0.008290s 0.000185s    120.6   5402.9
                  sign    verify    sign/s verify/s
dsa 2048 bits 0.001728s 0.002011s    578.6    497.3


Может, имеет смысл подумать как все это вставить в Entware-ng? Там не только NEON используется, АРМы попроще тоже должны ускориться. Не говорю, что надо менять ядро, но переиспользовать частично для конкретного пакета...

Voxel.


Вернуться в «Собираем софт сами (пакеты, прошивки)»

Кто сейчас на конференции

Всего 0 посетителей :: 0 зарегистрированных, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей