openssl_sign поддерживает ключи Ed25519? - PullRequest
0 голосов
/ 20 мая 2019

Согласно https://www.openssl.org/news/changelog.html OpenSSL 1.1.1 добавлена ​​поддержка EdDSA (которая включает в себя Ed25519). Я использую PHP 7.3.5 с OpenSSL 1.1.1b, поэтому кажется, что он должен его поддерживать. Я попытался использовать Ed25519 (из https://tools.ietf.org/html/rfc8410#section-10.3).), из-за которого у меня возникла следующая ошибка (возвращаемая openssl_error_string) с секретным ключом Ed25519 без открытого ключа : 1008 *

error:0608D096:digital envelope routines:EVP_PKEY_sign_init:operation not supported for this keytype

Закрытый ключ " Ed25519, закодированный с помощью атрибута и открытого ключа ", выдал мне другую ошибку:

Warning: openssl_sign(): supplied key param cannot be coerced into a private key in /path/to/test.php on line 3
bad
error:0D078094:asn1 encoding routines:asn1_item_embed_d2i:sequence length mismatch

Мой код:

<?php

$r = openssl_sign('hello, world!', $signature, '-----BEGIN PRIVATE KEY-----
MHICAQEwBQYDK2VwBCIEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC
oB8wHQYKKoZIhvcNAQkJFDEPDA1DdXJkbGUgQ2hhaXJzgSEAGb9ECWmEzf6FQbrB
Z9w7lshQhqowtrbLDFw4rXAxZuE=
-----END PRIVATE KEY-----');

echo $r ? 'good' : 'bad';

echo "\n";

echo openssl_error_string();

Полагаю, PHP просто еще не поддерживает Ed25519?

1 Ответ

1 голос
/ 20 мая 2019

Думаю, нет, если мы пойдем по документации , похоже, что требования подписи / проверки отличаются от нормального использования библиотеки openssl:

Реализация EVP_PKEY Ed25519 и Ed448 поддерживает генерацию ключей, Однократный дайджест-знак и дайджест-подтверждение с использованием PureEdDSA и Ed25519 или Ed448 (см. RFC8032).

и комментарии типа:

Алгоритм PureEdDSA не поддерживает механизм потоковой передачи другие алгоритмы подписи, использующие, например, EVP_DigestUpdate (). сообщение для подписи или проверки должно быть передано с использованием однократного Функции EVP_DigestSign () и EVP_DigestVerify ().

При вызове EVP_DigestSignInit () или EVP_DigestVerifyInit () тип дайджеста параметр ДОЛЖЕН быть установлен в NULL.

Таким образом, если вы не можете напрямую вызывать API openssl или можете добавить больше функций склейки openssl для поддержки поддержки подписи / проверки одним выстрелом, тогда я думаю, что нет.

...