使用 CryptoAPI 将 UTF8String 编码为 ASN1
Encode UTF8String to ASN1 with CryptoAPI
我使用此代码在 ASN1 中对 UTF8String 进行编码:
const char *charExtensionValue = "test value тест тест with some cyrillic symbols";
CERT_NAME_VALUE myNameValue;
myNameValue.dwValueType = CERT_RDN_UTF8_STRING;
myNameValue.Value.cbData = (DWORD)(strlen(charExtensionValue)+1)*2;
myNameValue.Value.pbData = (LPBYTE)charExtensionValue;
CERT_BLOB encodedBlob;
bool checkASN1Encoding = CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, X509_ANY_STRING, &myNameValue, CRYPT_ENCODE_ALLOC_FLAG, NULL, &encodedBlob.pbData, &encodedBlob.cbData);
CryptEncodeObjectEx 运行良好,没有任何错误,但结果不是预期的:
OCTET STRING, encapsulates {
UTF8String "ø§³û¦© Ґѐô´
我做错了什么?
文档说 CERT_RDN_UTF8_STRING 意味着值成员必须是 "An array of 16 bit Unicode characters UTF8 encoded on the wire as a sequence of one, two, or three, eight-bit characters." 但 charExtensionValue 指向一个 8 位字符数组。此外,您正在计算字符串,就好像它不是 UTF-16 字符串一样。 – 斯图尔特
我使用此代码在 ASN1 中对 UTF8String 进行编码:
const char *charExtensionValue = "test value тест тест with some cyrillic symbols";
CERT_NAME_VALUE myNameValue;
myNameValue.dwValueType = CERT_RDN_UTF8_STRING;
myNameValue.Value.cbData = (DWORD)(strlen(charExtensionValue)+1)*2;
myNameValue.Value.pbData = (LPBYTE)charExtensionValue;
CERT_BLOB encodedBlob;
bool checkASN1Encoding = CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, X509_ANY_STRING, &myNameValue, CRYPT_ENCODE_ALLOC_FLAG, NULL, &encodedBlob.pbData, &encodedBlob.cbData);
CryptEncodeObjectEx 运行良好,没有任何错误,但结果不是预期的:
OCTET STRING, encapsulates {
UTF8String "ø§³û¦© Ґѐô´
我做错了什么?
文档说 CERT_RDN_UTF8_STRING 意味着值成员必须是 "An array of 16 bit Unicode characters UTF8 encoded on the wire as a sequence of one, two, or three, eight-bit characters." 但 charExtensionValue 指向一个 8 位字符数组。此外,您正在计算字符串,就好像它不是 UTF-16 字符串一样。 – 斯图尔特