<p>有相同的需求,最后派生M2Crypto来添加一个新函数,该函数将创建一个退化的PKCS7对象。<a href="https://github.com/HanSooloo/M2Crypto-martinpaljak" rel="nofollow">https://github.com/HanSooloo/M2Crypto-martinpaljak</a></p>
<p>所涉及的步骤如下:</p>
<ol>
<li>将M2Crypto从Martin Paljak的回购中取出,换成新的。在</li>
<li>修改<code>_pkcs7.i</code>SWIG接口文件以添加下面的函数。在</li>
</ol>
<h2>_pkcs7.i修改</h2>
<pre class="lang-c prettyprint-override"><code>// Adding X.509 related header files to be able to use their data types.
#include <openssl/x509.h>
#include <openssl/x509v3.h>
// Adding PKCS7_SIGNED data type to help create the degenerate data structure.
%apply Pointer NONNULL { PKCS7_SIGNED * };
// Additional interface definitions for degenerate PKCS#7 object creation.
// Inspired by the crl2p7.c file from OpenSSL. Will need to clean up a bit for function returns.
%threadallow pkcs7_create_degenerate;
%inline %{
int pkcs7_create_degenerate(STACK_OF(X509) *cert_stack, BIO *bio) {
int ret=1;
PKCS7 *p7=NULL;
PKCS7_SIGNED *p7s=NULL;
X509_CRL *crl=NULL;
STACK_OF(X509_CRL) *crl_stack=NULL;
if ((p7=PKCS7_new()) == NULL) goto end;
if ((p7s=PKCS7_SIGNED_new()) == NULL) goto end;
p7->type=OBJ_nid2obj(NID_pkcs7_signed);
p7->d.sign=p7s;
p7s->contents->type=OBJ_nid2obj(NID_pkcs7_data);
if (!ASN1_INTEGER_set(p7s->version,1)) goto end;
if ((crl_stack=sk_X509_CRL_new_null()) == NULL) goto end;
p7s->crl=crl_stack;
p7s->cert=cert_stack;
ret=i2d_PKCS7_bio(bio, p7);
end:
p7s->cert=NULL;
if (p7 != NULL) {
// printf("about to free p7: ");
PKCS7_free(p7);
// printf("freed.\n");
}
return ret;
}
%}
</code></pre>
<h2>功能详细信息</h2>
<p>该函数接受X509堆栈指针和BIO指针作为输入,并返回一个表示成功的整数。在</p>
<p>X509堆栈指针需要指向一个堆栈,其中包含要放入退化PKCS#7对象中的证书。在</p>
<p>BIO指针需要指向一个空的BIO结构,该BIO结构稍后将用PKCS#7对象填充。在</p>
<h2>使用上述函数的Python代码示例:</h2>
^{pr2}$