Статус: Участник
Группы: Участники
Зарегистрирован: 17.11.2020(UTC) Сообщений: 17 Поблагодарили: 2 раз в 2 постах
|
Автор: pd Автор: Norguhtar Вы мне предлагаете подключать вашу либу напрямую? Ну такое себе решение. Учитывая что sign между прочим работает. Просто не хватает только этого. Вы приводите пример вызова "openssl smime -encrypt", вам в ответ вроде равнозначное предложение "cryptcp -encr". Куда напрямую подключать нашу либу? Уточните постановку вопроса тогда. Поясняю у меня есть биндинг на golang к openssl. Я дописал туда функции Код:
func LoadPrivateKeyFromEngine(engine *Engine, key_id string) (PrivateKey, error) {
if engine == nil {
return nil, errors.New("engine not found")
}
ckey_id := C.CString(key_id)
defer C.free(unsafe.Pointer(ckey_id))
key := C.ENGINE_load_private_key(engine.e, ckey_id, nil, nil)
if key == nil {
return nil, errors.New("ENGINE_load_private_key() failed")
}
p := &pKey{key: key}
runtime.SetFinalizer(p, func(p *pKey) {
C.X_EVP_PKEY_free(p.key)
})
return p, nil
}
Эта функция вынимает приватный ключ и позволяет использовать его. Эта часть работает нормально Далее вынув приватный ключ я подписываю данные Код:
func PKCS7Sign(certificate *Certificate, key PrivateKey, data []byte, flags int) (*PKCS7, error) {
if certificate == nil {
return nil, errors.New("sign certificate not found")
}
if len(data) == 0 {
return nil, errors.New("empty data block")
}
bio := C.BIO_new_mem_buf(unsafe.Pointer(&data[0]),
C.int(len(data)))
if bio == nil {
return nil, errors.New("failed creating bio")
}
defer C.BIO_free(bio)
pkcs7 := C.PKCS7_sign(certificate.x, key.evpPKey(), nil, bio, C.int(flags))
if pkcs7 == nil {
return nil, errors.New("failed create signature pkcs7")
}
p := &PKCS7{pkcs7: pkcs7}
return p, nil
}
Эта часть так же работает отлично. Далее я сделал функцию для шифрования Код:
func PKCS7Encrypt(certs []*Certificate, data []byte, cipher Cipher, flags int) (*PKCS7, error) {
if len(certs) == 0 {
return nil, errors.New("recipient certificates not found")
}
if len(data) == 0 {
return nil, errors.New("empty data block")
}
// var sk *C.struct_stack_st_X509
sk := C.X_sk_X509_new_null()
if sk == nil {
return nil, errors.New("can't create new stack")
}
for _, cert := range certs {
res := C.X_sk_X509_push(sk, cert.x)
if res == 0 {
return nil, errors.New("can't add cert into stack")
}
}
bio := C.BIO_new_mem_buf(unsafe.Pointer(&data[0]),
C.int(len(data)))
if bio == nil {
return nil, errors.New("failed creating bio")
}
defer C.BIO_free(bio)
pkcs7 := C.PKCS7_encrypt(sk, bio, cipher.ptr, C.int(flags))
if pkcs7 == nil {
return nil, errors.New("failed create encrypt pkcs7")
}
p := &PKCS7{pkcs7: pkcs7}
return p, nil
}
Эта функция отлично работает с референсным gost, но работает с вашей реализацией. Код выглядит так Код:
func TestPKCS7Encrypt(t *testing.T) {
certBytes, err := ioutil.ReadFile("test.cer")
if err != nil {
t.Fatal(err)
}
cert, err := LoadCertificateFromPEM(certBytes)
if err != nil {
t.Fatal(err)
}
cipher, err := GetCipherByName("gost89")
if err != nil {
t.Fatal(err)
}
data, err := ioutil.ReadFile("pkcs7_test.go")
if err != nil {
t.Fatal(err)
}
pkcs7, err := PKCS7Encrypt([]*Certificate{cert}, data, *cipher, PKCS7_DETACHED|PKCS7_BINARY|PKCS7_PARTIAL)
if err != nil {
t.Fatal(err)
}
encryptBytes, err := pkcs7.MarshalPKCS7DER()
if err != nil {
t.Fatal(err)
}
err = ioutil.WriteFile("pkcs7_test.enc", encryptBytes, 0644)
if err != nil {
t.Fatal(err)
}
}
И код у меня ломается на PKCS7Encrypt. А именно на C.PKCS7_encrypt(sk, bio, cipher.ptr, C.int(flags)) Как я вижу в него не верно отдается алгоритм шифрования. Как я понимаю это или связано с отсутствием реализации с вашей стороны или с тем что я неверно указываю алгоритм. Отредактировано пользователем 4 декабря 2020 г. 14:29:35(UTC)
| Причина: Не указана
|