Считайте данные ключа из вашего файла PKCS # 8, используя PEM_read_PrivateKey()
(или PEM_read_bio_PrivateKey()
. Это даст вам ключ как объект EVP_PKEY
. Документация для этих функций здесь:
https://www.openssl.org/docs/man1.1.1/man3/PEM_read_PrivateKey.html
Обычно при подписании обычно требуется переварить данные, которые должны быть подписаны, сначала с помощью некоторой функции дайджеста (например, SHA256), а затем операции подписи (в данном случае ECDSA). Предполагая, что это то, что вы хотите сделать, вы должны использовать семейство функций EVP_DigestSign*
. Документация для этих функций здесь:
https://www.openssl.org/docs/man1.1.1/man3/EVP_DigestSign.html
Код может выглядеть примерно так (не проверено):
EVP_PKEY *pkey = PEM_read_PrivateKey(myfile, NULL, NULL, NULL);
EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
size_t siglen = 0;
unsigned char *sig;
if (mdctx == NULL || pkey == NULL)
goto err;
if (!EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, pkey))
goto err;
if(!EVP_DigestSignUpdate(mdctx, tobesigned, tobesignedlen))
goto err;
/* Find out the signature length */
if(!EVP_DigestSignFinal(mdctx, NULL, &siglen))
goto err;
/* Allocate memory for the signature length */
sig = OPENSSL_malloc(siglen);
if (sig == NULL)
goto err;
/* Now get the signature */
if(!EVP_DigestSignFinal(mdctx, sig, &siglen))
goto err;
EVP_MD_CTX_free(mdctx);
EVP_PKEY_free(pkey);
/* Free "sig" when you've finished with it */