Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenSSL 1.1通过IANA ID获取密码套件_C_Openssl - Fatal编程技术网

C OpenSSL 1.1通过IANA ID获取密码套件

C OpenSSL 1.1通过IANA ID获取密码套件,c,openssl,C,Openssl,在OpenSSL1.0.2中,我们使用s3\u lib.c中的ssl3\u get\u cipher\u by\u id()函数使用IANA id获取密码套件(SSL\u cipher*) 例如,ID0x00,0x2F将为我们提供TLS\u RSA\u和\u AES\u 128\u CBC\u SHA密码套件作为SSL\u密码结构 但是,该函数未在1.0.2及更高版本的OpenSSL文档中列出,虽然该函数在1.1.1中仍然可用,但它似乎不适用于较新的密码套件,例如,为以下两个密码套件返回NULL

在OpenSSL1.0.2中,我们使用
s3\u lib.c
中的
ssl3\u get\u cipher\u by\u id()
函数使用IANA id获取密码套件(
SSL\u cipher*

例如,ID
0x00,0x2F
将为我们提供
TLS\u RSA\u和\u AES\u 128\u CBC\u SHA
密码套件作为
SSL\u密码
结构

但是,该函数未在1.0.2及更高版本的OpenSSL文档中列出,虽然该函数在1.1.1中仍然可用,但它似乎不适用于较新的密码套件,例如,为以下两个密码套件返回NULL:

0xC0,0x2F TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
0xC0,0x14 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
我的问题:有没有一种现代方法可以通过IANA ID获取密码套件(
SSL\u cipher
或更新的结构)

我已经看到了,但它没有回答如何从IANA十六进制ID获取密码套件对象

注意:IANA ID指的是如下页面上的第一个十六进制列:


您可以使用SSL\u CIPHER\u find(),它

。。。返回密码ID存储在ptr中的SSL_密码结构。ptr参数是一个字符的两元素数组,它以网络字节顺序存储两字节的TLS密码ID(由IANA分配)

C程序

两个示例的C代码可能如下所示:

#include <stdio.h>
#include <openssl/err.h>
#include <openssl/ssl.h>

static void print_name(unsigned char iana[], const SSL_CIPHER *cipher);

int main(void) {
    SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
    SSL *ssl = SSL_new(ctx);
    if (ssl == NULL) {
        ERR_print_errors_fp(stderr);
        exit(1);
    }

    unsigned char iana1[] = {0xC0, 0x2F};
    const SSL_CIPHER *cipher = SSL_CIPHER_find(ssl, iana1);
    if (cipher) {
        print_name(iana1, cipher);
    }

    unsigned char iana2[] = {0xC0, 0x14};
    cipher = SSL_CIPHER_find(ssl, iana2);
    if (cipher) {
        print_name(iana2, cipher);
    }
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    return 0;
}

static void print_name(unsigned char iana[], const SSL_CIPHER *cipher) {
    const char *name = SSL_CIPHER_standard_name(cipher);
    if (name == NULL)
        name = "?";
    printf("0x%02X,0x%02X -> %s\n", iana[0], iana[1], name);
}

谢谢,这正是我们需要的@NealEastwood你知道如何通过编程获得密码的IANA ID吗?@Ilykom取决于你的起点。如果您已经有一个
SSL\u CIPHER*
,那么您可以检查
int SSL\u CIPHER\u get\u CIPHER\u nid(const SSL\u CIPHER*c)的API描述
查看它是否符合您的要求。避免
uint32\t SSL\u CIPHER\u get\u id(const SSL\u CIPHER*c)
因为“该ID与IANA特定ID不同”。如果您还没有
SSL\u密码*
,则取决于您的数据源。在我的例子中,它是对包含TLS记录的libpcap网络数据包的直接解析,因此我可以直接从数据包中提取密码套件ID字节。@Nealestwood感谢您的回复。其思想是使用WinApi获取受支持的密码,然后将它们映射到OpenSSL密码。有两种方法,第一种是使用testssl中的映射表,第二种是动态执行。第二种方法相当复杂,因为我知道如何获取Win密码名称,但不知道如何获取ID。如果我有ID,我就可以使用SSL\u cipher\u find。也许这是另一个问题。
0xC0,0x2F -> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
0xC0,0x14 -> TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA