2016-03-18 2 views
2

Ядро Linux добавило API пользовательского пространства к своим криптографическим функциям в 2.6 через новое новое семейство гнезд AF_ALG. Также см. crypto: af_alg - User-space interface for Crypto API на LWN.Определить наличие гнезд AF_ALG в ядре Linux для пользовательского криптования?

Я работаю с Gentoo, и для этого нужно настроить и построить ядро. Кажется, что настройки по умолчанию опускают AF_ALG, поэтому я [в настоящее время] работает с ядром, которому не хватает поддержки. OpenSSL 1.1.0 имеет интерфейс Engine в криптографическом API. Его отказ от самотестирования из-за отсутствия поддержки для AF_ALG.

Я хотел бы знать, как определить наличие AF_ALG как во время компиляции, так и во время выполнения. Я не нашел способ обнаружить доступность во время компиляции. Я думаю, мы можем использовать alg_get_type, чтобы обнаружить доступность во время выполнения, но я не уверен.

Как определить наличие AF_ALG во время компиляции и во время выполнения?


The socket(2) человек страниц имеет это сказать: «Некоторые типы сокетов могут быть не реализованы все семейства протоколов.» Но он не обсуждает, как определить доступность.

Документы ядра охватывают API в Chapter 4. User Space Interface, но, похоже, не обсуждаются способы определения доступности.


Для полноты, похоже, должны быть установлены для Gentoo следующие параметры конфигурации ядра (от Utilizing the crypto accelerators Марек Васут в):

  • CONFIG_CRYPTO_USER_API=m
  • CONFIG_CRYPTO_USER_API_HASH=m
  • CONFIG_CRYPTO_USER_API_SKCIPHER=m
+2

На стороне записки, я задаюсь вопросом, кто решил, что это было разумно сделать основной точкой входа для своего нового криптографического API быть * адрес семьи *. – immibis

+0

@immibis - Я просто догадываюсь, но я думаю, что это как-то связано с асинхронными вводами-выводами, 'syscall',' __NR_io_setup', '__NR_eventfd' и' __NR_io_destroy'. – jww

ответ

1

Я думаю, что могу ответить на некоторые второй вопрос, доступность выполнения, со следующими:

int ret = socket(AF_ALG, SOCK_SEQPACKET, 0); 
if (ret != -1) 
    close(ret); 

int supported = !!(ret != -1);