C++ 如何使用Openssl编码ASN.1特定于上下文的内容

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

我正在尝试对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 = 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);