ID: 28525
User updated by: pickett at sumu dot org
Reported By: pickett at sumu dot org
Status: Open
Bug Type: *Math Functions
PHP Version: 4.3.7RC1
New Comment:
Since I think I failed to explain the problem with just a simple
gmp_powm() call, here's the entire diffie hellman implementation:
$x = "0x98dd1dc9405f6d49b3ede0b8fb59d4db"; // random
$y = "0x950ba32bc15861f13fe579b29a329ae3"; // random
$n =
"0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF";
// prime (ISAKMP/Oakley group1)
$g = "0x2"; // generator for $n
$X = gmp_powm($g, $x, $n);
$Y = gmp_powm($g, $y, $n);
$keyX = gmp_powm($X, $y, $n);
$keyY = gmp_powm($Y, $x, $n);
var_dump(gmp_strval($keyX, 16));
var_dump(gmp_strval($keyY, 16));
var_dump(gmp_cmp($keyX, $keyY));
Now, with php 4.3.4 and earlier the above code worked fine, but with
4.3.6 and later it fails (all gmp_powm() calls return false). There is
no way to express $n as a normal php integer, but gmp_powm() still
tries to convert it into one just to see if it is zero (and believes it
is, as it starts with 0x...).
Using gmp_sgn(*gmpnum_mod) to check if it is zero will work on large
numbers, and is probably faster as well since it is a macro that just
checks for _mp_size in the gmp mpz structure.
The workaround is simple, just gmp_init() the modulo first, but I
believe this still is a bug that should be fixed.
Previous Comments:
------------------------------------------------------------------------
[2004-05-28 11:59:57] pickett at sumu dot org
Here's a fix
--- php-4.3.7RC1/ext/gmp/gmp.c 2004-02-16 17:13:49.000000000 +0200
+++ php-4.3.7RC1/ext/gmp/gmp.c 2004-05-28 12:56:59.000000000 +0300
@@ -830,8 +830,7 @@
}
FETCH_GMP_ZVAL(gmpnum_mod, mod_arg);
- convert_to_long_ex(mod_arg);
- if (!Z_LVAL_PP(mod_arg)) {
+ if(mpz_cmp_ui(*gmpnum_mod, 0) == 0) {
RETURN_FALSE;
}
------------------------------------------------------------------------
[2004-05-26 19:39:50] pickett at sumu dot org
I used "0x1" here for brevity. In real world I use gmp_powm() for
diffie-hellman key exchange with vastly larger numbers that can't be
represented as normal integers in php.
------------------------------------------------------------------------
[2004-05-26 19:24:09] [EMAIL PROTECTED]
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php
Do not pass hex numbers as strings.
var_dump(gmp_powm(0x1, 0x1, 0x1));
works fine.
------------------------------------------------------------------------
[2004-05-26 11:08:10] pickett at sumu dot org
Description:
------------
Fix for bug #27172 broke hexadecimal string modulos for gmp_powm().
Reproduce code:
---------------
var_dump(gmp_powm("0x1", "0x1", "0x1"))
Expected result:
----------------
resource(4) of type (GMP integer)
Actual result:
--------------
bool(false)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=28525&edit=1