Как использовать мой файл pkcs # 8 для получения строки ecdsa - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь получить строку подписи локально из файла PKCS # 8, который имеет формат .p8. Когда я открываю его, я вижу строку между утверждением

 -----BEGIN PRIVATE KEY-----
// strings line 64 characters
// strings line 64 characters
// strings line 64 characters
// strings line 8 characters
-----END PRIVATE KEY-----

Я хочу конвертировать этот файл и войти в ecdsa, чтобы получить подпись.

Как мне добиться этого на языке c, используя openssl

1 Ответ

1 голос
/ 03 июля 2019

Считайте данные ключа из вашего файла 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 */
...