diff options
| author | Jakub Zelenka <bukka@php.net> | 2016-11-20 20:08:34 +0000 |
|---|---|---|
| committer | Jakub Zelenka <bukka@php.net> | 2016-11-20 20:08:34 +0000 |
| commit | b98357823a816a55097fc7f6f833db88722efeea (patch) | |
| tree | 6a3a5692855158e8532be85f037b8c20773be189 /ext | |
| parent | e3feeba3aedd8e4347fefa315effd7d4f9fa0ca1 (diff) | |
| parent | ce4869f0388e500abf39094ab48ae6769a2ed71f (diff) | |
| download | php-git-b98357823a816a55097fc7f6f833db88722efeea.tar.gz | |
Merge branch 'PHP-7.1'
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/openssl/openssl.c | 48 | ||||
| -rw-r--r-- | ext/openssl/tests/bug73478.phpt | 25 |
2 files changed, 73 insertions, 0 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 39f32bb08c..329080c9b8 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4091,6 +4091,47 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data) } /* }}} */ +/* {{{ php_openssl_dh_pub_from_priv */ +static BIGNUM *php_openssl_dh_pub_from_priv(DH *dh, BIGNUM *priv_key, BIGNUM *g, BIGNUM *p) +{ + BIGNUM *pub_key, *priv_key_const_time; + BN_CTX *ctx; + + pub_key = BN_new(); + if (pub_key == NULL) { + php_openssl_store_errors(); + return NULL; + } + + priv_key_const_time = BN_new(); + if (priv_key_const_time == NULL) { + BN_free(pub_key); + php_openssl_store_errors(); + return NULL; + } + ctx = BN_CTX_new(); + if (priv_key_const_time == NULL) { + BN_free(pub_key); + BN_free(priv_key_const_time); + php_openssl_store_errors(); + return NULL; + } + + BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME); + + if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) { + BN_free(pub_key); + php_openssl_store_errors(); + pub_key = NULL; + } + + BN_free(priv_key_const_time); + BN_CTX_free(ctx); + + return pub_key; +} +/* }}} */ + /* {{{ php_openssl_pkey_init_dh */ zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data) { @@ -4108,6 +4149,13 @@ zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data) if (pub_key) { return DH_set0_key(dh, pub_key, priv_key); } + if (priv_key) { + pub_key = php_openssl_dh_pub_from_priv(dh, priv_key, g, p); + if (pub_key == NULL) { + return 0; + } + return DH_set0_key(dh, pub_key, priv_key); + } /* generate key */ PHP_OPENSSL_RAND_ADD_TIME(); diff --git a/ext/openssl/tests/bug73478.phpt b/ext/openssl/tests/bug73478.phpt new file mode 100644 index 0000000000..1dfc584164 --- /dev/null +++ b/ext/openssl/tests/bug73478.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #73478: openssl_pkey_new() generates wrong pub/priv keys with Diffie Hellman +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip openssl not loaded"); +?> +--FILE-- +<?php +$details = [ + 'p' => base64_decode('3Pk6C4g5cuwOGZiaxaLOMQ4dN3F+jZVxu3Yjcxhm5h73Wi4niYsFf5iRwuJ6Y5w/KbYIFFgc07LKOYbSaDcFV31FwuflLcgcehcYduXOp0sUSL/frxiCjv0lGfFOReOCZjSvGUnltTXMgppIO4p2Ij5dSQolfwW9/xby+yLFg6s='), + 'g' => base64_decode('Ag=='), + 'priv_key' => base64_decode('jUdcV++P/m7oUodWiqKqKXZVenHRuj92Ig6Fmzs7QlqVdUc5mNBxmEWjug+ObffanPpOeab/LyXwjNMzevtBz3tW4oROau++9EIMJVVQr8fW9zdYBJcYieC5l4t8nRj5/Uu/Z0G2rWVLBleSi28mqqNEvnUs7uxYxrar69lwQYs=') +]; + +$opensslKeyResource = openssl_pkey_new(['dh' => $details]); +$data = openssl_pkey_get_details($opensslKeyResource); + +printf("Private key:\n%s\n", base64_encode($data['dh']['priv_key'])); +printf("Public key:\n%s\n", base64_encode($data['dh']['pub_key'])); +?> +--EXPECT-- +Private key: +jUdcV++P/m7oUodWiqKqKXZVenHRuj92Ig6Fmzs7QlqVdUc5mNBxmEWjug+ObffanPpOeab/LyXwjNMzevtBz3tW4oROau++9EIMJVVQr8fW9zdYBJcYieC5l4t8nRj5/Uu/Z0G2rWVLBleSi28mqqNEvnUs7uxYxrar69lwQYs= +Public key: +0DmJUe9dr02pAtVoGyLHdC+rfBU3mDCelKGPXRDFHofx6mFfN2gcZCmp/ab4ezDXfpIBOatpVdbn2fTNUGo64DtKE2WGTsZCl90RgrGUv8XW/4WDPXeE7g5u7KWHBG/LCE5+XsilE5P5/GIyqr9gsiudTmk+H/hiYZl9Smar9k0= |
