Match Zend behavior on openssl_pkey_get_details

Zend PHP populates an extra field in the details array
with some more information about the resource it is passed,
while HHVM leaves this information out.

Closes #815
Esse commit está contido em:
Eric Caruso
2013-06-18 18:13:39 -07:00
commit de Sara Golemon
commit 320babafb9
9 arquivos alterados com 196 adições e 3 exclusões
+66 -3
Ver Arquivo
@@ -1655,6 +1655,35 @@ static const StaticString s_alias("alias");
static const StaticString s_purposes("purposes");
static const StaticString s_extensions("extensions");
static const StaticString s_rsa("rsa");
static const StaticString s_dsa("dsa");
static const StaticString s_dh("dh");
static const StaticString s_n("n");
static const StaticString s_e("e");
static const StaticString s_d("d");
static const StaticString s_p("p");
static const StaticString s_q("q");
static const StaticString s_g("g");
static const StaticString s_dmp1("dmp1");
static const StaticString s_dmq1("dmq1");
static const StaticString s_iqmp("iqmp");
static const StaticString s_priv_key("priv_key");
static const StaticString s_pub_key("pub_key");
static void add_bignum_as_string(Array &arr,
StaticString key,
BIGNUM *bn) {
if (!bn) {
return;
}
int num_bytes = BN_num_bytes(bn);
unsigned char *out = (unsigned char *)smart_malloc(num_bytes);
BN_bn2bin(bn, out);
arr.set(key, String((const char *)out, num_bytes, CopyString));
smart_free(out);
}
Array f_openssl_pkey_get_details(CObjRef key) {
EVP_PKEY *pkey = key.getTyped<Key>()->m_key;
BIO *out = BIO_new(BIO_s_mem());
@@ -1666,14 +1695,48 @@ Array f_openssl_pkey_get_details(CObjRef key) {
ret.set(s_bits, EVP_PKEY_bits(pkey));
ret.set(s_key, String(pbio, pbio_len, CopyString));
long ktype = -1;
Array details;
RSA *rsa = pkey->pkey.rsa;
DSA *dsa = pkey->pkey.dsa;
DH *dh = pkey->pkey.dh;
switch (EVP_PKEY_type(pkey->type)) {
case EVP_PKEY_RSA:
case EVP_PKEY_RSA2: ktype = k_OPENSSL_KEYTYPE_RSA; break;
case EVP_PKEY_RSA2:
ktype = k_OPENSSL_KEYTYPE_RSA;
assert(rsa);
add_bignum_as_string(details, s_n, rsa->n);
add_bignum_as_string(details, s_e, rsa->e);
add_bignum_as_string(details, s_d, rsa->d);
add_bignum_as_string(details, s_p, rsa->p);
add_bignum_as_string(details, s_q, rsa->q);
add_bignum_as_string(details, s_dmp1, rsa->dmp1);
add_bignum_as_string(details, s_dmq1, rsa->dmq1);
add_bignum_as_string(details, s_iqmp, rsa->iqmp);
ret.set(s_rsa, details);
break;
case EVP_PKEY_DSA:
case EVP_PKEY_DSA2:
case EVP_PKEY_DSA3:
case EVP_PKEY_DSA4: ktype = k_OPENSSL_KEYTYPE_DSA; break;
case EVP_PKEY_DH: ktype = k_OPENSSL_KEYTYPE_DH; break;
case EVP_PKEY_DSA4:
ktype = k_OPENSSL_KEYTYPE_DSA;
assert(dsa);
add_bignum_as_string(details, s_p, dsa->p);
add_bignum_as_string(details, s_q, dsa->q);
add_bignum_as_string(details, s_g, dsa->g);
add_bignum_as_string(details, s_priv_key, dsa->priv_key);
add_bignum_as_string(details, s_pub_key, dsa->pub_key);
ret.set(s_dsa, details);
break;
case EVP_PKEY_DH:
ktype = k_OPENSSL_KEYTYPE_DH;
assert(dh);
add_bignum_as_string(details, s_p, dh->p);
add_bignum_as_string(details, s_g, dh->g);
add_bignum_as_string(details, s_priv_key, dh->priv_key);
add_bignum_as_string(details, s_pub_key, dh->pub_key);
ret.set(s_dh, details);
break;
#ifdef EVP_PKEY_EC
case EVP_PKEY_EC: ktype = k_OPENSSL_KEYTYPE_EC; break;
#endif
@@ -0,0 +1,16 @@
<?php
$key = <<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXX/MsKEBLcLeKA1d/i7ufG1qs
qS97xFkIRSeX3TwmHic843AfVrzoh2pZUeOvK9ZLZQpHSM7DoHMYDGD1273+FvZX
Ypf5LiFtecfxko/Cku16zy6WAeCYVFjjlveBhwPmPCIk+qDRYeiIW05QE2XK+CuD
nJ7sxxXIJSSgD3Jo5wIDAQAB
-----END PUBLIC KEY-----
EOF;
print $key;
$res = openssl_pkey_get_public($key);
var_dump(openssl_pkey_get_details($res));
?>
Arquivo binário não exibido.
@@ -0,0 +1,24 @@
<?php
$key = <<<EOF
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALxTCsLc9GVvv9Hj
riy0tyAS4LCuQvmca0NkJYAyWO3VoJ68oic+6qqCCeJZUw0itpcuzuaF73/8AmDN
ULjXvvHIkrjdkx0E24AUyjbqtdFyBH2BsidLyEbhBSFFwVnxtkGR1WS+BLD2UQCN
jeMhaqfnvJ7Blb+X8UFd1qYM4BXLAgMBAAECgYAIUC4gbfqH48f27vMIXC3dR5gN
lJO2SxZdEjWplA9i6FQ/zZnm25smTbk7+a912/ttbw6JFI5++tPsDAQtNLDkDf1r
SIYzpj/wvbwEMj8Ezod8agRG1/Gayo/YKtKfE+rnlwnyHWPf5au7UARoXNz+9Zjg
BiDsYaQpa0gWJOh+6QJBAO/vEvgHg2+NKeBK9gupMrjCakh/V+473jEpWP4LSoDd
TX3KhW0eYvm/oNPbzXSmI7vRZJIKYwDPoE1DbIy3gA0CQQDI70hHox9thaS5V1nN
VRaUEQ6T1ssZMehczJYMLS0JfkuZb+nnr8ULjjCVLJvjsBdG7Dv0hs236bLP2DVu
Oh83AkAQGP0v0Ok7mb/+gWkCnUZ+6ORSmuCeZjvhFoIXAVDtVmu1jdnn2UsQsI+s
xymAswjguArEVZgQ3N1HccedpU4dAkBuuXzpDPi6j5SQFZSE08iXWzbfPNO6VIgo
6wwcNaDFxHTAXq1UYMWCcp5O9cAJnfWVvYPkYYxnNj60zf3Tee/NAkBhjaquRQ8b
Ol3NL1UvZIzrhb8pFemgqPktS+AYgmYaOiEJEJp2NcGN1JCCR7zPsfDHo/heSY+w
bHgjQ5gI077k
-----END PRIVATE KEY-----
EOF;
$res = openssl_pkey_get_private($key);
var_dump(openssl_pkey_get_details($res));
?>
@@ -0,0 +1,46 @@
<?php
$key = <<<EOF
-----BEGIN PUBLIC KEY-----
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
UtKU+GNOjOgR2xYv12w=
-----END PUBLIC KEY-----
EOF;
print $key;
$res = openssl_pkey_get_public($key);
var_dump(openssl_pkey_get_details($res));
?>
@@ -0,0 +1,44 @@
<?php
$key = <<<EOF
-----BEGIN DSA PRIVATE KEY-----
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
rNJ35snOanui1OPjE7TRtZwQ
-----END DSA PRIVATE KEY-----
EOF;
$res = openssl_pkey_get_private($key);
var_dump(openssl_pkey_get_details($res));
?>