openssl_sign支持Ed25519键吗?

时间:2019-05-20 13:34:09

标签: php openssl php-openssl

根据ReactDOM.createPortal,OpenSSL 1.1.1添加了对EdDSA(包括Ed25519)的支持。我正在运行带有OpenSSL 1.1.1b的PHP 7.3.5,因此似乎它应该支持它。我尝试使用Ed25519(来自Here is a demo的版本)。这给我带来了以下错误(由openssl_error_string返回),错误为“ Ed25519私钥,没有公钥”:

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 个答案:

答案 0 :(得分:1)

我想不是,如果我们通过documentation,看起来签名/验证要求与openssl库的常规用法不同:

  

Ed25519和Ed448 EVP_PKEY实现支持密钥生成,   使用PureEdDSA和Ed25519一次完成摘要签名并进行摘要验证,或者   Ed448(请参阅RFC8032)。

和类似的评论:

  

PureEdDSA算法不支持   其他签名算法,例如使用EVP_DigestUpdate()。的   要签名或验证的消息必须一键传递   EVP_DigestSign()和EVP_DigestVerify()函数。

     

在调用EVP_DigestSignInit()或EVP_DigestVerifyInit()时,摘要类型   参数必须设置为NULL。

因此,除非您可以直接调用openssl api或可以添加更多的openssl胶合功能来支持一个镜头签名/验证支持,否则我猜不是。