Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
Openssl 1.1.0中的c2i_ASN1_整数函数_Openssl - Fatal编程技术网

Openssl 1.1.0中的c2i_ASN1_整数函数

Openssl 1.1.0中的c2i_ASN1_整数函数,openssl,Openssl,我最近在linux系统中将openssl从1.0.2n更新为1.1.0g 早些时候我用的是 ASN1\u INTEGER*c2i\u ASN1\u INTEGER(ASN1\u INTEGER**a,const unsigned char**pp,long len)函数。由于这个函数在openssl 1.1.0中被删除,现在我用 ASN1\u INTEGER*d2i\u ASN1\u UINTEGER(ASN1\u INTEGER**a,常量无符号字符**pp,长长度) 现在,当我运行我的应用程

我最近在linux系统中将openssl从1.0.2n更新为1.1.0g

早些时候我用的是

ASN1\u INTEGER*c2i\u ASN1\u INTEGER(ASN1\u INTEGER**a,const unsigned char**pp,long len)
函数。由于这个函数在openssl 1.1.0中被删除,现在我用

ASN1\u INTEGER*d2i\u ASN1\u UINTEGER(ASN1\u INTEGER**a,常量无符号字符**pp,长长度)

现在,当我运行我的应用程序时,我会收到如下警告:

警告:0:--SSL错误队列报告--
警告:0:-asn1编码例程| d2i_asn1_UINTEGER |应为整数:218718323


这个问题的解决方案是什么?

ASN.1整数编码(如BER或DER)由1个或多个“标识符”八位字节(通常为1)组成,后跟1个或多个“长度”八位字节,后跟“内容”八位字节(其长度由之前的“长度”八位字节决定)

函数
c2i_ASN1_INTEGER
假设您已经解析了“标识符”和“长度”八位字节,并将“内容”字节转换为整数。这是从OpenSSL 1.1.0中删除的,因为这被认为是一个非常低级的解析操作,应用程序不应该直接调用它

函数
d2i\u ASN1\u UINTEGER
不能直接替代
c2i\u ASN1\u INTEGER
。它解析整个整数(包括“标识符”和“长度”八位字节)。如果只传递内容八位字节,则它将第一个字节解释为“标识符”八位字节。这可能会有一个错误的整数值,因此这可能就是为什么您会看到“期望整数”错误


您需要重写代码以将整个整数传递给
d2i\u ASN1\u UINTEGER

以下是一些使用c2i\u ASN1\u integer()的代码示例

下面是我如何修改代码以改为使用d2i_ASN1_UINTEGER()


首先,我在save_ptr中保存了ptr。ASN1_get_object()获取指向BER/DER开头的ptr。ASN1_get_object()更新ptr以指向内容。c2i_ASN1_INTEGER()获取指向内容的ptr,将ptr推进到内容之外以指向下一个BER/DER的开头,并返回一个ASN1_整数。现在d2i_ASN1_UINTEGER()也返回一个ASN1_整数,但它需要获取指向BER/DER开头的ptr。所以我只是在调用ASN1_get_object()之前将ptr设置回它的值。d2i_ASN1_UINTEGER()获取指向BER/DER开头的ptr,将ptr前进到下一个BER/DER开头,并返回一个ASN1_整数。

Hi@Matt感谢您的回答。当我浏览一些链接时,我想我可以直接用d2i函数替换c2i。你能告诉我如何解析整数的长度和长度吗?这是一个很难回答的问题。基本上,为了用d2i_ASN1_UINTEGER替换c2i_ASN_INTEGER,您必须删除用于解析标识符和长度的所有代码。因为我不知道你的代码是什么样子的,所以我不能真正建议如何删除解析。好的,谢谢你的回复。我想可能会有一个新的解析API。无论如何,我会试试看。谢谢again@Matt根据本文,如何让d2i_ASN1_UINTEGER在1.1.0以上的openssl中工作?谢谢这是一个单独的问题,可能不属于这个答案的评论部分。很好的解释。这对我很有用。谢谢你,克格伯德。
ASN1_get_object(&ptr, &length, &type, &xclass, end - ptr);
if (type == V_ASN1_INTEGER) {
    integer = c2i_ASN1_INTEGER(NULL, &ptr, length);
    value = ASN1_INTEGER_get(integer);
    ASN1_INTEGER_free(integer);

    // do something with value
} else
    ptr += length;
save_ptr = ptr;
ASN1_get_object(&ptr, &length, &type, &xclass, end - ptr);
if (type == V_ASN1_INTEGER) {
    ptr = save_ptr;
    integer = d2i_ASN1_UINTEGER(NULL, &ptr, end - ptr);
    value = ASN1_INTEGER_get(integer);
    ASN1_INTEGER_free(integer);

    // do something with value
} else
    ptr += length;