From 320babafb9fb25f157d1a69dd56021f4dd0e54bc Mon Sep 17 00:00:00 2001 From: Eric Caruso Date: Tue, 18 Jun 2013 18:13:39 -0700 Subject: [PATCH] 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 --- hphp/runtime/ext/ext_openssl.cpp | 69 +++++++++++++++++- .../ext_openssl/openssl_pkey_get_details.php | 16 ++++ .../openssl_pkey_get_details.php.expect | Bin 0 -> 853 bytes .../openssl_pkey_get_details_2.php | 24 ++++++ .../openssl_pkey_get_details_2.php.expect | Bin 0 -> 1219 bytes .../openssl_pkey_get_details_3.php | 46 ++++++++++++ .../openssl_pkey_get_details_3.php.expect | Bin 0 -> 6240 bytes .../openssl_pkey_get_details_4.php | 44 +++++++++++ .../openssl_pkey_get_details_4.php.expect | Bin 0 -> 4079 bytes 9 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details.php create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details.php.expect create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php.expect create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_3.php create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_3.php.expect create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php create mode 100644 hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php.expect diff --git a/hphp/runtime/ext/ext_openssl.cpp b/hphp/runtime/ext/ext_openssl.cpp index 945c449b0..575b182a3 100644 --- a/hphp/runtime/ext/ext_openssl.cpp +++ b/hphp/runtime/ext/ext_openssl.cpp @@ -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()->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 diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details.php b/hphp/test/slow/ext_openssl/openssl_pkey_get_details.php new file mode 100644 index 000000000..cb3f259a0 --- /dev/null +++ b/hphp/test/slow/ext_openssl/openssl_pkey_get_details.php @@ -0,0 +1,16 @@ + + diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details.php.expect b/hphp/test/slow/ext_openssl/openssl_pkey_get_details.php.expect new file mode 100644 index 0000000000000000000000000000000000000000..a92cd31e2b89f21d3eb95e14c92dcfdf0bb266ac GIT binary patch literal 853 zcmdPZ1p+5mcTYcsfKVqNPiF;h*GQ0u%&s0TefFVaB75c zNO`VDX0nBev13|TQB{71Q9)E_s(+ccWt2};V1Y-luenRUhi{~dyNjWbxv{oeSyTj9 zWI>v#Po`T*YI0gdcD}xIcB!FRRi#PFbo`MtMMPfU{?|cA-m9WNM~o zxPfV)t5JlvwsWZqSDu%7aYaRhr&n-rx{I+_zG=Cqi({ap6BpQru6{1)o=z+(O03i{ z(Nw7BQc#FiO3ExLR*JQ?19CF+N;C`&j7&7a64|MhQ1RlDqRhN>4I^_SO$8;ev7@00 zPeMxIz$z+Ega#HQc!41W3SLkE=RqYD6rkZ~Xk-Bl$LsN*bu=8j3$}MLhu3%So-ZA> zW~F}hkw^|#_33wQ)a2A{9v8@m?Rn9j6&d(=z4kTlR4#XqbB7lcOYkIoy}kFJ*thVc z=|A-pb1RR3oYa44(%Y)@deaym%m|5iJneg9JM%LeC6!+bE+)R{i1rH*PCfNQyLryM xH^)U!sH!aBFUoihayQ6%sp!r#20D(Bfe|EM3-(({WdTePD1{hka@BHi0RYB241xdv literal 0 HcmV?d00001 diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php new file mode 100644 index 000000000..523f68c31 --- /dev/null +++ b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php @@ -0,0 +1,24 @@ + diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php.expect b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_2.php.expect new file mode 100644 index 0000000000000000000000000000000000000000..d9381b8e0a8c2662f5d7a87f9e47030e1b788b66 GIT binary patch literal 1219 zcmYc+DoU)>Fws<~=2B3IR!Yh&DOQTLwF7c8^GY-f4U9}Q!4lc2l~D2GlA_GKbPXeO zBTWS*T@Y|`b@%jB2ncoZ@pM-3c8vrJa`}3?r};V>xH|_Ix(9nE8M_3!IynZ0Iy#!T z`#HKeJ7orXJEaFYTZEPuIU5HAgR&tX(e!A6%{8! z11k|6ycUq)1qE;(R6;=k8jglWKv|_d!CZ&#d`ZpUfAR4;oh{oHgdS{I=k#+-#>Qn6%^WWLcKm4I-z^ zUTwWt#8TV1N!|N|+e21G*MpHCw>eI{nzD~&!?!?&-rmQGS<9dAnRjsN{^=hbW3Mga zc_4Zk%JQfWe`kHqP&48mw^zem-`Z2H zxpGNA_b<47`)tWF<=q!kCUGS*oL}JUoYS+tffr_aAy(5*y!UWlET7xDWM_Ef*-)`5 zf_#&&ot89w5p!l5kFG9fo%hWAm(SN9sx$lX264AH)?eDrZhyJy{0-AQD|vI6 z=_$DdhFC2Skoc>A;idJ={r?&>ndZ9Hy?7Ed>%qJ<>xW`Z;*0@r!?L&b-h6)3TVO-~ zn&X-cn>ilr;5rgIL*UL`_rl|Im-@*fEGWcoLEg@qmpngq^-q}~I;G|EiRsa1_iZlk z3hB^z%_C#F;OLQ(1959Z5{@<%&GY+ufOGEGse7BBB=)46*=;%d_j2X?voH%X3v;nY zKw|Hzb*}u + diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details_3.php.expect b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_3.php.expect new file mode 100644 index 0000000000000000000000000000000000000000..c7f89413baae2a322b7e88a4ac1cf84f802f7698 GIT binary patch literal 6240 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 G0R9{PhU+~5 literal 0 HcmV?d00001 diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php new file mode 100644 index 000000000..aa08f5bbd --- /dev/null +++ b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php @@ -0,0 +1,44 @@ + diff --git a/hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php.expect b/hphp/test/slow/ext_openssl/openssl_pkey_get_details_4.php.expect new file mode 100644 index 0000000000000000000000000000000000000000..a427cc7d8d152260aa7db3455040e61c6951dadc GIT binary patch literal 4079 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