2016-09-23 59 views
0

問題SMIME與BIO,char *與二進制數據

1 - 我想創建一個MIME消息。是這樣的:

MIME-Version: 1.0 
Content-Type: multipart/mixed; 
     boundary="---12345" 

This is a multipart message in MIME format. 

---12345 
Content-Type: text/plain 

This is the plain text 

---12345 
Content-Type: application/pdf 

>> PDF binary code here << 

---12345 

2-然後我需要將它傳遞給OpenSSL的功能中的BIO * data形式。

PKCS7 *PKCS7_sign(..., ..., ..., BIO *data, ...); 

第一種方法

負載從文件系統中的純文本和附件數據,並將其分配給char * data,操縱數據以添加的各MIME頭,最後將其與BIO_puts(memoryBIO, data);分配給BIO * memoryBIO

但是這種方法不起作用,因爲二進制數據包含「\ 0」(NULL),它不適用於char類型。

第二種方法

分配純文本和附接至BIO每個,然後「拼接」起來。但找不到辦法做到這一點。

結論

我想知道是否有完成這樣壯舉的方式。 我也想避免使用中間文件並在內存中構建所有內容。

+1

你看過[openssl smime](https://www.openssl.org/docs/manmaster/apps/smime.html)命令行工具的源代碼嗎? – PnotNP

+2

如果您有嵌入式空值,則無法使用['BIO_puts'](https://www.openssl.org/docs/manmaster/crypto/BIO_puts.html)。相反,您可以使用['BIO_write'](https://www.openssl.org/docs/manmaster/crypto/BIO_puts.html),它同時具有指針和長度。你必須使用正確的工具來完成這項工作。你不能把那個方形釘子砸到一個圓洞裏。 – jww

+0

或者,如果您將所有內容放在一個緩衝區中(並且不會進一步修改它),請使用帶有「BIO_new_mem_buf」的緩衝區創建一個memBIO。還要注意,像PDF這樣的二進制數據放在多部分中是很脆弱的; CTE:base64會更好。 –

回答

0

按照jww的建議,我最終使用的是BIO_write();

BIO * inBIO = NULL; 
std::vector<unsigned char> data = GetData(); 
inBIO = BIO_new(BIO_s_mem()); 
BIO_write(inBIO, data.data(), data.size()); 

再次感謝jww對於這個答案以及所有關於OpenSSL的其他答案,您已經幫了我很大的忙。