我正在尝试在 FoxPro 中使用来自 libeay32 的 PKCS7_sign,但对加密知之甚少。
我有以下内容:
具有此(公钥)的字符串变量:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCai5tzRyUbP32sY/16acr+isSBTW/k/t6DA5lcTKQ3P9r+Wlns
...
na1O9rEZAskh7LeVKVMGxszSFfR91EuQpkw3HT5ynCU=
-----END RSA PRIVATE KEY-----
带有此(证书)的字符串变量:
-----BEGIN CERTIFICATE-----
Yjs6K/HUQzQQ0fnRhpKYLHY2kOUB5SwNwNEC7isEUBkDNnuh52ZEpSI/fN+4PONN
...
HvCAaD4WhNInP+kwYAKx+5nOHXhL8omgpKgvRGX8
-----END CERTIFICATE-----
带有如下消息的字符串变量:
<?xml version="1.0" encoding="UTF8"?>
<loginTicketRequest version="1.0">
...
</loginTicketRequest>
如何使用 PKCS7_sign 获得签名消息?
我试图遵循我发现的一些代码片段,但在调用 PKCS7_sign 时我不断收到异常。
我用过:
BIO_new(BIO_s_mem())
PEM_read_bio_PrivateKey
PEM_read_bio_X509_AUX
BIO_new_mem_buf
但真的没有太多想法或理解我在做什么或为什么做。PKCS7_sign 的签名是
PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, BIO *data, int flags)
我认为问题在于获取我所拥有的密钥和证书数据,我理解的是 PEM 格式,X509 和 EVP_PKEY 格式。
稍后更新几个小时和 1000 杯咖啡:
我终于设法把它拉出来了。由于我基本上是在黑暗中拍摄,我不知道代码是否有问题,这是我到目前为止所拥有的,它的工作原理:
Lparameters pXml
Declare SSL_library_init In 'ssleay32.dll'
Declare BIO_free In 'libeay32.dll' Integer bio
Declare Integer BIO_s_mem In 'libeay32.dll'
Declare Integer BIO_new In 'libeay32.dll' Integer Type
Declare EVP_PKEY_free In 'libeay32.dll' Integer ikey
Declare X509_free In 'libeay32.dll' Integer a
Declare Integer PKCS7_sign In 'libeay32.dll' Integer signcert, Integer ikey, Integer certs, Integer bio, Integer iflags
Declare Integer PEM_read_bio_PrivateKey In 'libeay32.dll' Integer bio, Integer x, Integer cb, String u
Declare Integer PEM_read_bio_X509 In 'libeay32.dll' Integer bio, Integer x, Integer cb, Integer u
Declare Integer BIO_new_mem_buf In 'libeay32.dll' String buf, Integer ilen
Declare Integer PEM_write_bio_PKCS7 In 'libeay32.dll' Integer bio, Integer x
Declare Integer BIO_read In 'libeay32.dll' Integer bio, String @buf, Integer ilen
SSL_library_init()
m.cbuf = Filetostr(This.UtilGetPath() + This.Cuit + '.crt')
m.kbuf = Filetostr(This.UtilGetPath() + This.Cuit + '.key')
m.bioc = BIO_new_mem_buf(m.cbuf, Len(m.cbuf))
m.fc = PEM_read_bio_X509(m.bioc, 0, 0, 0)
m.biok = BIO_new_mem_buf(m.kbuf, Len(m.kbuf))
m.fk = PEM_read_bio_PrivateKey(m.biok, 0, 0, 0)
m.biom = BIO_new_mem_buf(m.pXml, Len(pXml))
m.smsg = PKCS7_sign(m.fc, m.fk, 0, m.biom, PKCS7_NOATTR)
m.bios = BIO_new(BIO_s_mem())
PEM_write_bio_PKCS7(m.bios, m.smsg)
m.buf = Space(4096)
m.nlen = BIO_read(bios, @m.buf, Len(m.buf))
m.buf = Left(m.buf, nlen)
BIO_free(m.bios)
BIO_free(m.biok)
BIO_free(m.bioc)
BIO_free(m.biom)
X509_free(m.fc)
EVP_PKEY_free(m.fk)
m.buf = Strextract(m.buf, '-----BEGIN PKCS7-----' + 0h0a, '-----END PKCS7-----')
Return m.buf
我看到的问题之一(我确信还有其他问题)是我没有从 PKCS7_sign 中释放结果。在这种情况下如何释放 m.smsg?我在它上面试过 BIO_free 但它当然不起作用,一定有一些函数可以释放 PKCS7 结构。
我不喜欢的另一件事是使用 BIO_read,但我无法使用 BIO_get_mem_data。
更新 2
我发现 PKCS7_free 并发现 BIO_get_mem_data 是 BIO_ctrl 的宏,所以我现在有:
m.lnLen = BIO_ctrl(m.bios, BIO_CTRL_INFO, 0, @m.parg)
要获取指向数据和长度的指针,最后我也会这样做
PKCS7_free(m.smsg)
现在我想我已经完成了。