检测 Linux 内核的 AF_ALG 用户空间加密套接字的可用性?

Detect availability of Linux kernel's AF_ALG sockets for userland crypto?

Linux 内核通过新的套接字系列 AF_ALG[=53 在 2.6 中将用户 space API 添加到其加密功能=].另见 LWN 上的 crypto: af_alg - User-space interface for Crypto API

我正在使用 Gentoo,它需要一个来配置和构建内核。默认设置似乎省略了 AF_ALG,所以我 [当前] 使用的内核缺乏支持。 OpenSSL 1.1.0 有一个进入加密 API 的引擎接口。由于缺乏对 AF_ALG.

的支持,其自测失败

我想知道如何在编译时和运行时检测 AF_ALG 的可用性。我还没有找到一种在编译时检测可用性的方法。我认为我们可以使用 alg_get_type 来检测运行时可用性,但我不确定。

如何确定 AF_ALG 在编译时和运行时的可用性?


socket(2) 手册页是这样说的:"Some socket types may not be implemented by all protocol families." 但它没有讨论如何检测可用性。

内核文档涵盖了 Chapter 4. User Space Interface 中的 API,但似乎没有讨论如何检测可用性。


为了完整起见,似乎需要为 Gentoo 设置以下内核配置参数(来自 Marek Vašut 的 Utilizing the crypto accelerators):

  • CONFIG_CRYPTO_USER_API=m
  • CONFIG_CRYPTO_USER_API_HASH=m
  • CONFIG_CRYPTO_USER_API_SKCIPHER=m

我想我可以用以下内容回答第二个问题,运行时可用性:

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

int supported = ret != -1;

我想说在编译时检测的唯一方法是编写一个单独的程序,该程序将对 AF_ALG 套接字进行 运行 时间检查,并创建一个头文件,其中包含这样的定义作为 #define AF_ALG_AVAILABLE.

扩展您对第二个问题的回答,您可能需要确保 errno 成立 EAFNOSUPPORT。否则,另一个错误(例如超出文件描述符)将使您的程序错误地认为不支持 AF_ALG,如果您使用我的方法在编译时检查 AF_ALG,这可能会很糟糕。

编译时检查:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if_alg.h>

int main(){
    //Alternatively you can set the path to argv[1]
    FILE *f = fopen("/path/to/output/file", "w");
    if(f == NULL){
        //Handle error
    }
    int sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
    if(sockfd == -1){
        if(errno == EAFNOSUPPORT){
            //Unavailable, put whatever you want here
            fprintf(f, "#define AF_ALG_UNAVAILABLE\n");
        } else {
            //Unable to detect for some other error
        }
    } else { //AF_ALG is available
        fprintf(f, "#define AF_ALG_AVAILABLE\n");
    }
    close(sockfd);
    fclose(f);
    return 0;
}

然后只需编译并 运行 在您的 makefile 中,您将在放置它的位置找到您的头文件。然后你可以简单地 select 使用 #ifdef AF_ALG_AVAILABLE.

使用什么代码