回答
pclass参数表示对象类型的Tag Number所在的Tag Class。
说明
首先,关于 ASN.1 对象的一些背景知识。为了解释起见,我将在这里简化很多。当使用 BER/DER 编码对 ASN.1 对象进行编码时,它通常采用以下结构:
+-------------------+---------------+-----------------+
| Identifier octets | Length octets | Contents octets |
| (Type) | (Length) | (Value) |
+-------------------+---------------+-----------------+
标识符八位字节是 8 位,用于指定值的类型。标识符八位字节通常编码如下:
+-----+-----+-----+-----+-----+-----+-----+-----+
Bits | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+-----------+-----+-----------------------------+
| Tag class | P/C | Tag number |
+-----------+-----+-----------------------------+
标记类可以是 4 种事物之一 - 通用、应用程序、
特定于上下文的或私有的。通用类包含类型
它们是 ASN.1 的本机(如整数和字符串)。除非你是
处理自定义类型,您可以期望该类是通用的,
由00 指定。这是通过pclass 返回的内容
参数。
标签号是 5 位,用于指定该类中的类型。这通过ptag 参数返回。例如,Universal 类中的 Integer 具有标记号 00010。
因此,例如,您可以通过以下方式测试您从 ASN1_get_object 获得的 ASN.1 整数:
ASN1_get_object(&pp, &plength, &ptag, &pclass, omax);
if (pclass == V_ASN1_UNIVERSAL && ptag == V_ASN1_INTEGER)
{
// this is the native ASN.1 Integer type
}
如果您知道自己纯粹是在处理通用类型,您可能会认为测试 pclass 变量有点多余。
文档
您对参数作用的一些定义有些偏差。这是我对函数文档的尝试。我应该指出我已经尝试通过查看代码和 ASN.1 规范自行解决这个问题,所以如果我有任何错误,我欢迎任何编辑。
int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, int *pclass, long omax)
总结:将 BER/DER 编码的 ASN.1 对象解码为其值的类型、长度和起始位置。
参数:
**pp:指向 BER/DER 编码对象开始的指针。当函数返回时,这个指针被调整为指向 ASN.1 值的开始(内容字节)。
*plength:指向long 的指针。当函数返回时,它包含 ASN.1 值的长度,指定为字节数。如果长度以不定形式编码,plength 将为 0。
*ptag:指向int 的指针。当函数返回时,它包含 ASN.1 标记号,它定义了值的类型。请注意,这只是标记号,不包括标记类或原始/构造指示符。
*pclass:指向int 的指针。当函数返回时,它包含 ASN.1 Tag 的类。
omax:BER/DER 编码对象的最大长度。如果对象比这个长,就会发生错误。
返回:一个整数。如果设置了第 8 位 (0x80),则发生错误。如果设置了第 6 位 (0x20),则类型为构造类型(即内容八位字节编码一个或多个数据值)。如果设置了第 1 位 (0x01),则该值的长度是不确定的,并且该值将以 'end-of-contents octets' 结尾。