3

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

私が目にする問題の 1 つ (他にもあると思います) は、PKCS7_sign から結果を解放していないことです。この場合、m.smsg を解放するにはどうすればよいですか? BIO_free を試してみましたが、もちろんうまくいきません。PKCS7 構造を解放する機能がどこかにあるはずです。

私が気に入らないもう 1 つの点は、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)

今、私は終わったと思います。

4

0 に答える 0