Rev 300 | Blame | Last modification | View Log | RSS feed
<html>
<head>
<title>File Source for DiffieHellmanUtil.php</title>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
<link rel="stylesheet" type="text/css" href="../media/style.css">
</head>
<body>
<table border="0" cellspacing="0" cellpadding="0" height="48" width="100%">
<tr>
<td class="header_top">Framework</td>
</tr>
<tr><td class="header_line"><img src="../media/empty.png" width="1" height="1" border="0" alt="" /></td></tr>
<tr>
<td class="header_menu">
[ <a href="../classtrees_Framework.html" class="menu">class tree: Framework</a> ]
[ <a href="../elementindex_Framework.html" class="menu">index: Framework</a> ]
[ <a href="../elementindex.html" class="menu">all elements</a> ]
</td>
</tr>
<tr><td class="header_line"><img src="../media/empty.png" width="1" height="1" border="0" alt="" /></td></tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr valign="top">
<td width="200" class="menu">
<div id="todolist">
<p><a href="../todolist.html">Todo List</a></p>
</div>
<b>Packages:</b><br />
<a href="../li_Framework.html">Framework</a><br />
<a href="../li_Utilitaire.html">Utilitaire</a><br />
<a href="../li_Zend_OpenId.html">Zend_OpenId</a><br />
<br /><br />
</td>
<td>
<table cellpadding="10" cellspacing="0" width="100%" border="0"><tr><td valign="top">
<h1 align="center">Source for file DiffieHellmanUtil.php</h1>
<p>Documentation is available at <a href="../Framework/_utilitaires---DiffieHellmanUtil.php.html">DiffieHellmanUtil.php</a></p>
<div class="src-code">
<ol><li><div class="src-line"><a name="a1"></a><span class="src-php"><?php</span></div></li>
<li><div class="src-line"><a name="a2"></a> </div></li>
<li><div class="src-line"><a name="a3"></a><span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a4"></a><span class="src-doc"> * Classe utilitaire proposant des fonctions permettant la réalisation d'un</span></div></li>
<li><div class="src-line"><a name="a5"></a><span class="src-doc"> * échange de clé Diffie Hellman</span></div></li>
<li><div class="src-line"><a name="a6"></a><span class="src-doc"> * </span></div></li>
<li><div class="src-line"><a name="a7"></a><span class="src-doc"> * "En cryptographie, l'échange de clés Diffie-Hellman, du nom de ses auteurs</span></div></li>
<li><div class="src-line"><a name="a8"></a><span class="src-doc"> * Whitfield Diffie et Martin Hellman, est une méthode par laquelle deux</span></div></li>
<li><div class="src-line"><a name="a9"></a><span class="src-doc"> * personnes peuvent se mettre d'accord sur un nombre (qu'ils peuvent utiliser</span></div></li>
<li><div class="src-line"><a name="a10"></a><span class="src-doc"> * comme clé pour chiffrer la conversation suivante) sans qu'une troisième</span></div></li>
<li><div class="src-line"><a name="a11"></a><span class="src-doc"> * personne appelée Ève puisse découvrir le nombre, même en ayant écouté tous</span></div></li>
<li><div class="src-line"><a name="a12"></a><span class="src-doc"> * leurs échanges."</span></div></li>
<li><div class="src-line"><a name="a13"></a><span class="src-doc"> * </span></div></li>
<li><div class="src-line"><a name="a14"></a><span class="src-doc"> * Voir http://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9s_Diffie-Hellman</span></div></li>
<li><div class="src-line"><a name="a15"></a><span class="src-doc"> * </span></div></li>
<li><div class="src-line"><a name="a16"></a><span class="src-doc"> * */</span></div></li>
<li><div class="src-line"><a name="a16"></a> </div></li>
<li><div class="src-line"><a name="a17"></a><span class="src-key">class </span><a href="../Framework/DiffieHellmanUtil.html">DiffieHellmanUtil</a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a18"></a> </div></li>
<li><div class="src-line"><a name="a19"></a> <span class="src-comm">// Default Diffie-Hellman key generator (1024 bit) </span></div></li>
<li><div class="src-line"><a name="a20"></a> <span class="src-key">const </span><span class="src-id">DH_P </span>= <span class="src-str">'dcf93a0b883972ec0e19989ac5a2ce310e1d37717e8d9571bb7623731866e61ef75a2e27898b057f9891c2e27a639c3f29b60814581cd3b2ca3986d2683705577d45c2e7e52dc81c7a171876e5cea74b1448bfdfaf18828efd2519f14e45e3826634af1949e5b535cc829a483b8a76223e5d490a257f05bdff16f2fb22c583ab'</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a21"></a> </div></li>
<li><div class="src-line"><a name="a22"></a> <span class="src-comm">//Default Diffie-Hellman prime number (should be 2 or 5)</span></div></li>
<li><div class="src-line"><a name="a23"></a> <span class="src-key">const </span><span class="src-id">DH_G </span>= <span class="src-str">'02'</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a24"></a> </div></li>
<li><div class="src-line"><a name="a25"></a> </div></li>
<li><div class="src-line"><a name="a26"></a> </div></li>
<li><div class="src-line"><a name="a27"></a> </div></li>
<li><div class="src-line"><a name="a28"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a29"></a><span class="src-doc"> * Performs the first step of a Diffie-Hellman key exchange by generating</span></div></li>
<li><div class="src-line"><a name="a30"></a><span class="src-doc"> * private and public DH values based on given prime number $p and</span></div></li>
<li><div class="src-line"><a name="a31"></a><span class="src-doc"> * generator $g. Both sides of key exchange MUST have the same prime number</span></div></li>
<li><div class="src-line"><a name="a32"></a><span class="src-doc"> * and generator. In this case they will able to create a random shared</span></div></li>
<li><div class="src-line"><a name="a33"></a><span class="src-doc"> * secret that is never send from one to the other.</span></div></li>
<li><div class="src-line"><a name="a34"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a35"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$p </span><span class="src-doc">prime number in binary representation</span></div></li>
<li><div class="src-line"><a name="a36"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$g </span><span class="src-doc">generator in binary representation</span></div></li>
<li><div class="src-line"><a name="a37"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$priv_key </span><span class="src-doc">private key in binary representation</span></div></li>
<li><div class="src-line"><a name="a38"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">mixed </span></div></li>
<li><div class="src-line"><a name="a39"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a40"></a> <span class="src-key">public </span><span class="src-key">static </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodcreateDhKey">createDhKey</a><span class="src-sym">(</span><span class="src-var">$p</span><span class="src-sym">, </span><span class="src-var">$g</span><span class="src-sym">, </span><span class="src-var">$priv_key </span>= <span class="src-id">null</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a41"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a42"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'openssl_dh_compute_key'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a43"></a> <span class="src-var">$dh_details </span>= <span class="src-key">array</span><span class="src-sym">(</span></div></li>
<li><div class="src-line"><a name="a44"></a> <span class="src-str">'p' </span>=> <span class="src-var">$p</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a45"></a> <span class="src-str">'g' </span>=> <span class="src-var">$g</span></div></li>
<li><div class="src-line"><a name="a46"></a> <span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a47"></a> <span class="src-key">if </span><span class="src-sym">(</span><span class="src-var">$priv_key </span>!== <span class="src-id">null</span><span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a48"></a> <span class="src-var">$dh_details</span><span class="src-sym">[</span><span class="src-str">'priv_key'</span><span class="src-sym">] </span>= <span class="src-var">$priv_key</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a49"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a50"></a> <span class="src-key">return </span><a href="http://www.php.net/openssl_pkey_new">openssl_pkey_new</a><span class="src-sym">(</span><span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'dh'</span>=><span class="src-var">$dh_details</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a51"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a52"></a> <span class="src-var">$bn_p </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">binToBigNum</span><span class="src-sym">(</span><span class="src-var">$p</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a53"></a> <span class="src-var">$bn_g </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">binToBigNum</span><span class="src-sym">(</span><span class="src-var">$g</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a54"></a> <span class="src-key">if </span><span class="src-sym">(</span><span class="src-var">$priv_key </span>=== <span class="src-id">null</span><span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a55"></a> <span class="src-var">$priv_key </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">randomBytes</span><span class="src-sym">(</span><span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">strlen</span><span class="src-sym">(</span><span class="src-var">$p</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a56"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a57"></a> <span class="src-var">$bn_priv_key </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">binToBigNum</span><span class="src-sym">(</span><span class="src-var">$priv_key</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a58"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'gmp'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a59"></a> <span class="src-var">$bn_pub_key </span>= <span class="src-id">gmp_powm</span><span class="src-sym">(</span><span class="src-var">$bn_g</span><span class="src-sym">, </span><span class="src-var">$bn_priv_key</span><span class="src-sym">, </span><span class="src-var">$bn_p</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a60"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'bcmath'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a61"></a> <span class="src-var">$bn_pub_key </span>= <a href="http://www.php.net/bcpowmod">bcpowmod</a><span class="src-sym">(</span><span class="src-var">$bn_g</span><span class="src-sym">, </span><span class="src-var">$bn_priv_key</span><span class="src-sym">, </span><span class="src-var">$bn_p</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a62"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a63"></a> <span class="src-var">$pub_key </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">bigNumToBin</span><span class="src-sym">(</span><span class="src-var">$bn_pub_key</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a64"></a> </div></li>
<li><div class="src-line"><a name="a65"></a> <span class="src-key">return </span><span class="src-key">array</span><span class="src-sym">(</span></div></li>
<li><div class="src-line"><a name="a66"></a> <span class="src-str">'p' </span>=> <span class="src-var">$bn_p</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a67"></a> <span class="src-str">'g' </span>=> <span class="src-var">$bn_g</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a68"></a> <span class="src-str">'priv_key' </span>=> <span class="src-var">$bn_priv_key</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a69"></a> <span class="src-str">'pub_key' </span>=> <span class="src-var">$bn_pub_key</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a70"></a> <span class="src-str">'details' </span>=> <span class="src-key">array</span><span class="src-sym">(</span></div></li>
<li><div class="src-line"><a name="a71"></a> <span class="src-str">'p' </span>=> <span class="src-var">$p</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a72"></a> <span class="src-str">'g' </span>=> <span class="src-var">$g</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a73"></a> <span class="src-str">'priv_key' </span>=> <span class="src-var">$priv_key</span><span class="src-sym">,</span></div></li>
<li><div class="src-line"><a name="a74"></a> <span class="src-str">'pub_key' </span>=> <span class="src-var">$pub_key</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a75"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a76"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a77"></a> </div></li>
<li><div class="src-line"><a name="a78"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a79"></a><span class="src-doc"> * Returns an associative array with Diffie-Hellman key components in</span></div></li>
<li><div class="src-line"><a name="a80"></a><span class="src-doc"> * binary representation. The array includes original prime number 'p' and</span></div></li>
<li><div class="src-line"><a name="a81"></a><span class="src-doc"> * generator 'g', random private key 'priv_key' and corresponding public</span></div></li>
<li><div class="src-line"><a name="a82"></a><span class="src-doc"> * key 'pub_key'.</span></div></li>
<li><div class="src-line"><a name="a83"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a84"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">mixed </span><span class="src-doc-var">$dh </span><span class="src-doc">Diffie-Hellman key</span></div></li>
<li><div class="src-line"><a name="a85"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">array </span></div></li>
<li><div class="src-line"><a name="a86"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a87"></a> <span class="src-key">public </span><span class="src-key">static </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodgetDhKeyDetails">getDhKeyDetails</a><span class="src-sym">(</span><span class="src-var">$dh</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a88"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a89"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'openssl_dh_compute_key'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a90"></a> <span class="src-var">$details </span>= <a href="http://www.php.net/openssl_pkey_get_details">openssl_pkey_get_details</a><span class="src-sym">(</span><span class="src-var">$dh</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a91"></a> <span class="src-key">if </span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$details</span><span class="src-sym">[</span><span class="src-str">'dh'</span><span class="src-sym">]</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a92"></a> <span class="src-key">return </span><span class="src-var">$details</span><span class="src-sym">[</span><span class="src-str">'dh'</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a93"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a94"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a95"></a> <span class="src-key">return </span><span class="src-var">$dh</span><span class="src-sym">[</span><span class="src-str">'details'</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a96"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a97"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a98"></a> </div></li>
<li><div class="src-line"><a name="a99"></a> </div></li>
<li><div class="src-line"><a name="a100"></a> </div></li>
<li><div class="src-line"><a name="a101"></a><span class="src-comm">// Depuis OpenId.php, les fonctions de Diffie-Hellman</span></div></li>
<li><div class="src-line"><a name="a102"></a> <span class="src-comm">// TODO : voir si ça peut être externaliser pour être réutilisé ? => dans utilitaires</span></div></li>
<li><div class="src-line"><a name="a103"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a104"></a><span class="src-doc"> * Computes the shared secret from the private DH value $dh and the other</span></div></li>
<li><div class="src-line"><a name="a105"></a><span class="src-doc"> * party's public value in $pub_key</span></div></li>
<li><div class="src-line"><a name="a106"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a107"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$pub_key </span><span class="src-doc">other party's public value</span></div></li>
<li><div class="src-line"><a name="a108"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">mixed </span><span class="src-doc-var">$dh </span><span class="src-doc">Diffie-Hellman key</span></div></li>
<li><div class="src-line"><a name="a109"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">string </span></div></li>
<li><div class="src-line"><a name="a110"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@throws</span><span class="src-doc"> Zend_OpenId_Exception</span></div></li>
<li><div class="src-line"><a name="a111"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a112"></a> <span class="src-key">public </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodcomputeDhSecret">computeDhSecret</a><span class="src-sym">(</span><span class="src-var">$pub_key</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a113"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a114"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'openssl_dh_compute_key'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a115"></a> <span class="src-var">$ret </span>= <span class="src-id">openssl_dh_compute_key</span><span class="src-sym">(</span><span class="src-var">$pub_key</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a116"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/ord">ord</a><span class="src-sym">(</span><span class="src-var">$ret</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">) </span>> <span class="src-num">127</span><span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a117"></a> <span class="src-var">$ret </span>= <span class="src-str">"\0" </span>. <span class="src-var">$ret</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a118"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a119"></a> <span class="src-key">return </span><span class="src-var">$ret</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a120"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'gmp'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a121"></a> <span class="src-var">$bn_pub_key </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">binToBigNum</span><span class="src-sym">(</span><span class="src-var">$pub_key</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a122"></a> <span class="src-var">$bn_secret </span>= <span class="src-id">gmp_powm</span><span class="src-sym">(</span><span class="src-var">$bn_pub_key</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">[</span><span class="src-str">'priv_key'</span><span class="src-sym">]</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">[</span><span class="src-str">'p'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a123"></a> <span class="src-key">return </span><span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">bigNumToBin</span><span class="src-sym">(</span><span class="src-var">$bn_secret</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a124"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'bcmath'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a125"></a> <span class="src-var">$bn_pub_key </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">binToBigNum</span><span class="src-sym">(</span><span class="src-var">$pub_key</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a126"></a> <span class="src-var">$bn_secret </span>= <a href="http://www.php.net/bcpowmod">bcpowmod</a><span class="src-sym">(</span><span class="src-var">$bn_pub_key</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">[</span><span class="src-str">'priv_key'</span><span class="src-sym">]</span><span class="src-sym">, </span><span class="src-var">$dh</span><span class="src-sym">[</span><span class="src-str">'p'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a127"></a> <span class="src-key">return </span><span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">bigNumToBin</span><span class="src-sym">(</span><span class="src-var">$bn_secret</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a128"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a129"></a> <span class="src-comm">/*require_once "Zend/OpenId/Exception.php";</span></div></li>
<li><div class="src-line"><a name="a130"></a><span class="src-comm"> throw new Zend_OpenId_Exception(</span></div></li>
<li><div class="src-line"><a name="a131"></a><span class="src-comm"> 'The system doesn\'t have proper big integer extension',</span></div></li>
<li><div class="src-line"><a name="a132"></a><span class="src-comm"> Zend_OpenId_Exception::UNSUPPORTED_LONG_MATH);*/</span></div></li>
<li><div class="src-line"><a name="a133"></a> </div></li>
<li><div class="src-line"><a name="a134"></a> <a href="http://www.php.net/trigger_error">trigger_error</a><span class="src-sym">(</span><span class="src-str">'Le système ne gère pas les nombre de taille arbitraire'</span><span class="src-sym">, </span><span class="src-id">E_STRICT</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a135"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a136"></a> </div></li>
<li><div class="src-line"><a name="a137"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a138"></a><span class="src-doc"> * Takes an arbitrary precision integer and returns its shortest big-endian</span></div></li>
<li><div class="src-line"><a name="a139"></a><span class="src-doc"> * two's complement representation.</span></div></li>
<li><div class="src-line"><a name="a140"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a141"></a><span class="src-doc"> * Arbitrary precision integers MUST be encoded as big-endian signed two's</span></div></li>
<li><div class="src-line"><a name="a142"></a><span class="src-doc"> * complement binary strings. Henceforth, "btwoc" is a function that takes</span></div></li>
<li><div class="src-line"><a name="a143"></a><span class="src-doc"> * an arbitrary precision integer and returns its shortest big-endian two's</span></div></li>
<li><div class="src-line"><a name="a144"></a><span class="src-doc"> * complement representation. All integers that are used with</span></div></li>
<li><div class="src-line"><a name="a145"></a><span class="src-doc"> * Diffie-Hellman Key Exchange are positive. This means that the left-most</span></div></li>
<li><div class="src-line"><a name="a146"></a><span class="src-doc"> * bit of the two's complement representation MUST be zero. If it is not,</span></div></li>
<li><div class="src-line"><a name="a147"></a><span class="src-doc"> * implementations MUST add a zero byte at the front of the string.</span></div></li>
<li><div class="src-line"><a name="a148"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a149"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$str </span><span class="src-doc">binary representation of arbitrary precision integer</span></div></li>
<li><div class="src-line"><a name="a150"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">string </span><span class="src-doc">big-endian signed representation</span></div></li>
<li><div class="src-line"><a name="a151"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a152"></a> <span class="src-key">public </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodbtwoc">btwoc</a><span class="src-sym">(</span><span class="src-var">$str</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a153"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a154"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/ord">ord</a><span class="src-sym">(</span><span class="src-var">$str</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">) </span>> <span class="src-num">127</span><span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a155"></a> <span class="src-key">return </span><span class="src-str">"\0" </span>. <span class="src-var">$str</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a156"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a157"></a> <span class="src-key">return </span><span class="src-var">$str</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a158"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a159"></a> </div></li>
<li><div class="src-line"><a name="a160"></a> </div></li>
<li><div class="src-line"><a name="a161"></a> </div></li>
<li><div class="src-line"><a name="a162"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a163"></a><span class="src-doc"> * Produces string of random byte of given length.</span></div></li>
<li><div class="src-line"><a name="a164"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a165"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">integer </span><span class="src-doc-var">$len </span><span class="src-doc">length of requested string</span></div></li>
<li><div class="src-line"><a name="a166"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">string </span><span class="src-doc">RAW random binary string</span></div></li>
<li><div class="src-line"><a name="a167"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a168"></a> <span class="src-key">public </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodrandomBytes">randomBytes</a><span class="src-sym">(</span><span class="src-var">$len</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a169"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a170"></a> <span class="src-var">$key </span>= <span class="src-str">''</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a171"></a> <span class="src-key">for</span><span class="src-sym">(</span><span class="src-var">$i</span>=<span class="src-num">0</span><span class="src-sym">; </span><span class="src-var">$i </span>< <span class="src-var">$len</span><span class="src-sym">; </span><span class="src-var">$i</span>++<span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a172"></a> <span class="src-var">$key </span>.= <a href="http://www.php.net/chr">chr</a><span class="src-sym">(</span><a href="http://www.php.net/mt_rand">mt_rand</a><span class="src-sym">(</span><span class="src-num">0</span><span class="src-sym">, </span><span class="src-num">255</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a173"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a174"></a> <span class="src-key">return </span><span class="src-var">$key</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a175"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a176"></a> </div></li>
<li><div class="src-line"><a name="a177"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a178"></a><span class="src-doc"> * Returns lenght of binary string in bytes</span></div></li>
<li><div class="src-line"><a name="a179"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a180"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$str </span></div></li>
<li><div class="src-line"><a name="a181"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">int </span><span class="src-doc">the string lenght</span></div></li>
<li><div class="src-line"><a name="a182"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a183"></a> <span class="src-key">static </span><span class="src-key">public </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodstrlen">strlen</a><span class="src-sym">(</span><span class="src-var">$str</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a184"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a185"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'mbstring'</span><span class="src-sym">) </span>&&</div></li>
<li><div class="src-line"><a name="a186"></a> <span class="src-sym">((</span>(int)<a href="http://www.php.net/ini_get">ini_get</a><span class="src-sym">(</span><span class="src-str">'mbstring.func_overload'</span><span class="src-sym">)) </span><span class="src-sym">& </span><span class="src-num">2</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a187"></a> <span class="src-key">return </span><a href="http://www.php.net/mb_strlen">mb_strlen</a><span class="src-sym">(</span><span class="src-var">$str</span><span class="src-sym">, </span><span class="src-str">'latin1'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a188"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a189"></a> <span class="src-key">return </span><a href="../Framework/DiffieHellmanUtil.html#methodstrlen">strlen</a><span class="src-sym">(</span><span class="src-var">$str</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a190"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a191"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a192"></a> </div></li>
<li><div class="src-line"><a name="a193"></a> </div></li>
<li><div class="src-line"><a name="a194"></a> <span class="src-doc">/**</span></div></li>
<li><div class="src-line"><a name="a195"></a><span class="src-doc"> * Converts binary representation into ext/gmp or ext/bcmath big integer</span></div></li>
<li><div class="src-line"><a name="a196"></a><span class="src-doc"> * representation.</span></div></li>
<li><div class="src-line"><a name="a197"></a><span class="src-doc"> *</span></div></li>
<li><div class="src-line"><a name="a198"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@param </span><span class="src-doc-type">string </span><span class="src-doc-var">$bin </span><span class="src-doc">binary representation of big number</span></div></li>
<li><div class="src-line"><a name="a199"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@return </span><span class="src-doc-type">mixed </span></div></li>
<li><div class="src-line"><a name="a200"></a><span class="src-doc"> * </span><span class="src-doc-coretag">@throws</span><span class="src-doc"> Zend_OpenId_Exception</span></div></li>
<li><div class="src-line"><a name="a201"></a><span class="src-doc"> */</span></div></li>
<li><div class="src-line"><a name="a202"></a> <span class="src-key">protected </span><span class="src-key">function </span><a href="../Framework/DiffieHellmanUtil.html#methodbinToBigNum">binToBigNum</a><span class="src-sym">(</span><span class="src-var">$bin</span><span class="src-sym">)</span></div></li>
<li><div class="src-line"><a name="a203"></a> <span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a204"></a> <span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'gmp'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a205"></a> <span class="src-key">return </span><span class="src-id">gmp_init</span><span class="src-sym">(</span><a href="http://www.php.net/bin2hex">bin2hex</a><span class="src-sym">(</span><span class="src-var">$bin</span><span class="src-sym">)</span><span class="src-sym">, </span><span class="src-num">16</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a206"></a> <span class="src-sym">} </span><span class="src-key">else </span><span class="src-key">if </span><span class="src-sym">(</span><a href="http://www.php.net/extension_loaded">extension_loaded</a><span class="src-sym">(</span><span class="src-str">'bcmath'</span><span class="src-sym">)) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a207"></a> <span class="src-var">$bn </span>= <span class="src-num">0</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a208"></a> <span class="src-var">$len </span>= <span class="src-id">self</span><span class="src-sym">::</span><span class="src-id">strlen</span><span class="src-sym">(</span><span class="src-var">$bin</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a209"></a> <span class="src-key">for </span><span class="src-sym">(</span><span class="src-var">$i </span>= <span class="src-num">0</span><span class="src-sym">; </span><span class="src-var">$i </span>< <span class="src-var">$len</span><span class="src-sym">; </span><span class="src-var">$i</span>++<span class="src-sym">) </span><span class="src-sym">{</span></div></li>
<li><div class="src-line"><a name="a210"></a> <span class="src-var">$bn </span>= <a href="http://www.php.net/bcmul">bcmul</a><span class="src-sym">(</span><span class="src-var">$bn</span><span class="src-sym">, </span><span class="src-num">256</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a211"></a> <span class="src-var">$bn </span>= <a href="http://www.php.net/bcadd">bcadd</a><span class="src-sym">(</span><span class="src-var">$bn</span><span class="src-sym">, </span><a href="http://www.php.net/ord">ord</a><span class="src-sym">(</span><span class="src-var">$bin</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a212"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a213"></a> <span class="src-key">return </span><span class="src-var">$bn</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a214"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a215"></a> <span class="src-comm">/*require_once "Zend/OpenId/Exception.php";</span></div></li>
<li><div class="src-line"><a name="a216"></a><span class="src-comm"> throw new Zend_OpenId_Exception(</span></div></li>
<li><div class="src-line"><a name="a217"></a><span class="src-comm"> 'The system doesn\'t have proper big integer extension',</span></div></li>
<li><div class="src-line"><a name="a218"></a><span class="src-comm"> Zend_OpenId_Exception::UNSUPPORTED_LONG_MATH);*/</span></div></li>
<li><div class="src-line"><a name="a219"></a> </div></li>
<li><div class="src-line"><a name="a220"></a> <a href="http://www.php.net/trigger_error">trigger_error</a><span class="src-sym">(</span><span class="src-str">'Le système ne gère pas les nombre de taille arbitraire'</span><span class="src-sym">, </span><span class="src-id">E_STRICT</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
<li><div class="src-line"><a name="a221"></a> <span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a222"></a> </div></li>
<li><div class="src-line"><a name="a223"></a><span class="src-sym">}</span></div></li>
<li><div class="src-line"><a name="a224"></a><span class="src-php">?></span></div></li>
</ol>
</div>
<div class="credit">
<hr />
Documentation generated on Tue, 18 Jan 2011 15:31:16 +0100 by <a href="http://www.phpdoc.org">phpDocumentor 1.4.3</a>
</div>
</td></tr></table>
</td>
</tr>
</table>
</body>
</html>