C++ 如何使用Openssl编码ASN.1特定于上下文的内容
我正在尝试对pkcs7封装的内容信息进行编码:C++ 如何使用Openssl编码ASN.1特定于上下文的内容,c++,encoding,openssl,pkcs#7,C++,Encoding,Openssl,Pkcs#7,我正在尝试对pkcs7封装的内容信息进行编码: Sequence: OID [0] Context-specific OCTET STRING 我的第一个问题是编码特定于上下文的内容: [0] Context-specific 因此,我尝试使用“八位字节字符串”创建一个“特定于设置上下文”,但没有成功: // Create ASN1_OCTET ASN1_OCTET_STRING *obj = ASN1_OCTET_STRING_new(); const BYTE* ptr
Sequence:
OID
[0] Context-specific
OCTET STRING
我的第一个问题是编码特定于上下文的内容:
[0] Context-specific
因此,我尝试使用“八位字节字符串”创建一个“特定于设置上下文”,但没有成功:
// Create ASN1_OCTET
ASN1_OCTET_STRING *obj = ASN1_OCTET_STRING_new();
const BYTE* ptr = dataToSign.getData();
ASN1_OCTET_STRING_set(obj, ptr, dataToSign.getSize());
// Create ASN1_TYPE using ASN1_OCTET
ASN1_TYPE *asn1Type = ASN1_TYPE_new();
asn1Type->type = V_ASN1_OCTET_STRING;
asn1Type->value.octet_string = obj;
// Using i2d_ASN1_SET_OF_ASN1_TYPE
stack_st_ASN1_TYPE* sk = sk_ASN1_TYPE_new_null();
sk_ASN1_TYPE_push(sk,asn1Type);
int tamanho = i2d_ASN1_SET_OF_ASN1_TYPE(sk,(unsigned char **) NULL, i2d_ASN1_TYPE,V_ASN1_SET, V_ASN1_CONTEXT_SPECIFIC, IS_SET);
unsigned char* data = new BYTE[tamanho];
tamanho = i2d_ASN1_SET_OF_ASN1_TYPE(sk,(unsigned char **) &data, i2d_ASN1_TYPE,V_ASN1_SET, V_ASN1_CONTEXT_SPECIFIC, IS_SET);
我在的网站上没有找到文档。
这个地方更好
我走对了吗
如何使用Openssl编码ASN.1特定于上下文的内容
从asn1.h
:
#define V_ASN1_UNIVERSAL 0x00
#define V_ASN1_APPLICATION 0x40
#define V_ASN1_CONTEXT_SPECIFIC 0x80
#define V_ASN1_PRIVATE 0xc0
...
#define V_ASN1_BOOLEAN 1 /**/
#define V_ASN1_INTEGER 2
...
#define V_ASN1_UTF8STRING 12
#define V_ASN1_SEQUENCE 16
#define V_ASN1_SET 17
...
因此,您需要使用标签V\u ASN1\u CONTEXT\u SPECIFIC
我的第一个问题是编码特定于上下文的内容
摘自(第12页):
然后,本文档继续讨论
ContentInfo
、标识符八位字节、基于ContentInfo
的ANY
编码等。使用i2d\u ASN1\u字节函数:
// Initialize ASN1_STRING inplace (no need to free)
ASN1_STRING s = { 0, 0, NULL, 0};
// Initialize with our data
ASN1_STRING_set0(&obj, dataToSign.getData(), dataToSign.getSize());
// Get resulting object length
int data_len = i2d_ASN1_bytes(obj, NULL, 0, V_ASN1_CONTEXT_SPECIFIC)
// Encode object with context tag 0
unsigned char* data = new BYTE[data_len];
unsigned char* p = data;
i2d_ASN1_bytes(obj, &p, 0, V_ASN1_CONTEXT_SPECIFIC);
// Initialize ASN1_STRING inplace (no need to free)
ASN1_STRING s = { 0, 0, NULL, 0};
// Initialize with our data
ASN1_STRING_set0(&obj, dataToSign.getData(), dataToSign.getSize());
// Get resulting object length
int data_len = i2d_ASN1_bytes(obj, NULL, 0, V_ASN1_CONTEXT_SPECIFIC)
// Encode object with context tag 0
unsigned char* data = new BYTE[data_len];
unsigned char* p = data;
i2d_ASN1_bytes(obj, &p, 0, V_ASN1_CONTEXT_SPECIFIC);