检测 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
.
使用什么代码
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
.