我最近在Linux系统中将openssl从1.0.2n更新为1.1.0g。
之前我在用
ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, long len) 功能。由于在openssl 1.1.0中删除了此功能,现在我将其替换为
ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, long length) 。
现在,当我运行我的应用程序时,我得到警告
Warning:0:-- SSL Error queue report --
Warning:0: - asn1 encoding routines|d2i_ASN1_UINTEGER|expecting an integer:218718323
这个问题有什么解决方案?
下面是一些使用c2i_ASN1_INTEGER().
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;
Run Code Online (Sandbox Code Playgroud)
以下是我修改代码以d2i_ASN1_UINTEGER()代替使用的方法。
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;
Run Code Online (Sandbox Code Playgroud)
首先我保存ptr在save_ptr. ASN1_get_object()指向ptrBER/DER 的开头。ASN1_get_object()更新ptr以指向内容。c2i_ASN1_INTEGER()指向ptr内容,超出ptr内容指向下一个 BER/DER 的开头,并返回ASN1_INTEGER.
现在也d2i_ASN1_UINTEGER()返回一个ASN1_INTEGER,但它需要指向ptrBER/DER 的开头。所以我只是将其设置回被调用ptr之前的值。指向BER/DER 的开头,前进到下一个 BER/DER 的开头,并返回.ASN1_get_object()d2i_ASN1_UINTEGER()ptrptrASN1_INTEGER
INTEGER的ASN.1编码(如BER或DER)由1个或多个“标识符”八位字节(通常为1个)组成,后跟1个或多个“ length”八位字节,再由“ content”八位字节(其长度确定)由之前的“长度”八位字节组成)。
该函数c2i_ASN1_INTEGER假定您已经解析了“标识符”和“长度”八位字节,并将“内容”字节转换为整数。它已从OpenSSL 1.1.0中删除,因为这被认为是应用程序不应该直接调用的非常低级的解析操作。
该功能d2i_ASN1_UINTEGER并非直接替代c2i_ASN1_INTEGER。它解析整个整数(包括“标识符”和“长度”八位位组)。如果仅传递内容字节,则它将第一个字节解释为“标识符”字节。对于整数,这可能具有错误的值,因此,这可能就是为什么您看到“期望整数”错误的原因。
您将需要重写代码以将整个整数传递给d2i_ASN1_UINTEGER。
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |