New experimental plugin 'secure mail'
[friendica-addons.git/.git] / securemail / php-gpg / libs / GPG / globals.php
1 <?php\r
2 /** @package    php-gpg::GPG */\r
3 \r
4 /** assign globals */\r
5 global $bs;\r
6 global $bx2;\r
7 global $bm;\r
8 global $bx;\r
9 global $bd;\r
10 global $bdm;\r
11 \r
12 $bs = 28;\r
13 $bx2 = 1 << $bs;\r
14 $bm = $bx2 - 1;\r
15 $bx = $bx2 >> 1;\r
16 $bd = $bs >> 1;\r
17 $bdm = (1 << $bd) - 1;\r
18 \r
19 /**\r
20  */\r
21 function mpi2b($s)\r
22 {\r
23     global $bs;\r
24     global $bx2;\r
25     global $bm;\r
26     global $bx;\r
27     global $bd;\r
28     global $bdm;\r
29 \r
30     $bn = 1;\r
31     $r = array(0);\r
32     $rn = 0;\r
33     $sb = 256;\r
34     $c = 0;\r
35     $sn = strlen($s);\r
36     if($sn < 2) {\r
37         echo("string too short, not a MPI");\r
38         return 0;\r
39     }\r
40 \r
41     $len = ($sn - 2) * 8;\r
42     $bits = ord($s[0]) * 256 + ord($s[1]);\r
43     if ($bits > $len || $bits < $len - 8) {\r
44         echo("not a MPI, bits = $bits, len = $len");\r
45         return 0;\r
46     }\r
47 \r
48     for ($n = 0; $n < $len; $n++) {\r
49         if (($sb <<= 1) > 255) {\r
50             $sb = 1; $c = ord($s[--$sn]);\r
51         }\r
52         if ($bn > $bm) {\r
53             $bn = 1;\r
54             $r[++$rn]=0;\r
55         }\r
56         if ($c & $sb) $r[$rn] |= $bn;\r
57         $bn <<= 1;\r
58     }\r
59 \r
60     return $r;\r
61 }\r
62 \r
63 /**\r
64  */\r
65 function b2mpi($b)\r
66 {\r
67     global $bs;\r
68     global $bx2;\r
69     global $bm;\r
70     global $bx;\r
71     global $bd;\r
72     global $bdm;\r
73 \r
74     $bn = 1;\r
75     $bc = 0;\r
76     $r = array(0);\r
77     $rb = 1;\r
78     $rn = 0;\r
79     $bits = count($b) * $bs;\r
80     $n = 0;\r
81     $rr = "";\r
82 \r
83     for ($n = 0; $n < $bits; $n++) {\r
84         if ($b[$bc] & $bn) $r[$rn] |= $rb;\r
85         if(($rb <<= 1) > 255) {\r
86             $rb = 1; $r[++$rn]=0;\r
87         }\r
88         if (($bn <<= 1) > $bm) {\r
89             $bn=1; $bc++;\r
90         }\r
91     }\r
92 \r
93     while ($rn && $r[$rn]==0) $rn--;\r
94 \r
95     $bn=256;\r
96     for($bits = 8; $bits > 0; $bits--) if ($r[$rn] & ($bn >>= 1)) break;\r
97     $bits += $rn * 8;\r
98 \r
99     $rr .= chr($bits / 256 ) . chr($bits % 256);\r
100     if ($bits) for($n = $rn; $n >= 0; $n--) $rr .= chr($r[$n]);\r
101 \r
102     return $rr;\r
103 }\r
104 \r
105 /**\r
106  */\r
107 function bmodexp($xx, $y, $m) {\r
108     global $bs;\r
109     global $bx2;\r
110     global $bm;\r
111     global $bx;\r
112     global $bd;\r
113     global $bdm;\r
114 \r
115     $r = array(1);\r
116     $an = 0;\r
117     $a = 0;\r
118     $x = array_merge((array)$xx);\r
119     $n = count($m) * 2;\r
120     $mu = array_fill(0, $n + 1, 0);\r
121 \r
122     $mu[$n--] = 1;\r
123     for(; $n >= 0; $n--) $mu[$n] = 0;\r
124     $dd = new bdiv($mu, $m);\r
125     $mu = $dd->q;\r
126 \r
127     for($n = 0; $n < count($y); $n++) {\r
128         for ($a = 1, $an = 0; $an < $bs; $an++, $a <<= 1) {\r
129             if ($y[$n] & $a) $r = bmod2(bmul($r, $x), $m, $mu);\r
130             $x = bmod2(bmul($x, $x), $m, $mu);\r
131         }\r
132     }\r
133 \r
134     return $r;\r
135 }\r
136 \r
137 /**\r
138  */\r
139 function simplemod($i, $m) // returns the mod where m < 2^bd\r
140 {\r
141     $c = 0;\r
142     $v = 0;\r
143     for ($n = count($i) - 1; $n >= 0; $n--)\r
144     {\r
145         $v = $i[$n];\r
146         $c = (($v >> $bd) + ($c << $bd)) % $m;\r
147         $c = (($v & $bdm) + ($c << $bd)) % $m;\r
148     }\r
149 \r
150     return $c;\r
151 }\r
152 \r
153 /**\r
154  */\r
155 function bmod($p, $m) // binary modulo\r
156 {\r
157     global $bdm;\r
158 \r
159     if (count($m) == 1) {\r
160         if(count($p) == 1) return array($p[0] % $m[0]);\r
161         if($m[0] < $bdm) return array(simplemod($p, $m[0]));\r
162     }\r
163 \r
164     $r = new bdiv($p, $m);\r
165     return $r->mod;\r
166 }\r
167 \r
168 /**\r
169  */\r
170 function bmod2($x, $m, $mu) {\r
171     $xl = count($x) - (count($m) << 1);\r
172     if ($xl > 0) return bmod2(array_concat(array_slice($x, 0, $xl), bmod2(array_slice($x, $xl), $m, $mu)), $m, $mu);\r
173 \r
174     $ml1 = count($m) + 1;\r
175     $ml2 = count($m) - 1;\r
176     $rr = 0;\r
177 \r
178     $q3 = array_slice(bmul(array_slice($x, $ml2), $mu), $ml1);\r
179     $r1 = array_slice($x, 0, $ml1);\r
180     $r2 = array_slice(bmul($q3, $m), 0, $ml1);\r
181 \r
182     $r = bsub($r1, $r2);\r
183     if (count($r) == 0) {\r
184         $r1[$ml1] = 1;\r
185         $r = bsub($r1, $r2);\r
186     }\r
187     for ($n = 0;; $n++) {\r
188         $rr = bsub($r, $m);\r
189         if(count($rr) == 0) break;\r
190         $r = $rr;\r
191         if($n >= 3) return bmod2($r, $m, $mu);\r
192     }\r
193 \r
194     return $r;\r
195 }\r
196 \r
197 /**\r
198  */\r
199 function toppart($x, $start, $len) {\r
200     global $bx2;\r
201 \r
202     $n = 0;\r
203     while ($start >= 0 && $len-- > 0) $n = $n * $bx2 + $x[$start--];\r
204 \r
205     return $n;\r
206 }\r
207 \r
208 /**\r
209  */\r
210 function zeros($n) {\r
211     $r = array_fill(0, $n, 0);\r
212     while ($n-- > 0) $r[$n] = 0;\r
213     return $r;\r
214 }\r
215 \r
216 /**\r
217  * @package    verysimple::Encryption\r
218  */\r
219 class bdiv {\r
220         var $q;\r
221         var $mod;\r
222         function bdiv($x, $y)\r
223         {\r
224                 global $bs;\r
225                 global $bx2;\r
226                 global $bm;\r
227                 global $bx;\r
228                 global $bd;\r
229                 global $bdm;\r
230 \r
231                 $n = count($x) - 1;\r
232                 $t = count($y) - 1;\r
233                 $nmt = $n - $t;\r
234 \r
235                 if ($n < $t || $n == $t && ($x[$n] < $y[$n] || $n > 0 && $x[$n] == $y[$n] && $x[$n - 1] < $y[$n - 1])) {\r
236                         $this->q = array(0);\r
237                         $this->mod = array($x);\r
238                         return;\r
239                 }\r
240 \r
241                 if ($n == $t && toppart($x, $t, 2) / toppart($y, $t, 2) < 4) {\r
242                         $qq = 0;\r
243                         $xx = 0;\r
244                         for(;;) {\r
245                                 $xx = bsub($x, $y);\r
246                                 if(count($xx) == 0) break;\r
247                                 $x = $xx; $qq++;\r
248                         }\r
249                         $this->q = array($qq);\r
250                         $this->mod = $x;\r
251                         return;\r
252                 }\r
253 \r
254                 $shift2 = floor(log($y[$t]) / M_LN2) + 1;\r
255                 $shift = $bs - $shift2;\r
256                 if ($shift) {\r
257                         $x = array_merge((array)$x); $y = array_merge((array)$y);\r
258                         for($i = $t; $i > 0; $i--) $y[$i] = (($y[$i] << $shift) & $bm) | ($y[$i - 1] >> $shift2);\r
259                         $y[0] = ($y[0] << $shift) & $bm;\r
260                         if($x[$n] & (($bm << $shift2) & $bm)) {\r
261                                 $x[++$n] = 0; $nmt++;\r
262                         }\r
263                         for($i = $n; $i > 0; $i--) $x[$i] = (($x[$i] << $shift) & $bm) | ($x[$i - 1] >> $shift2);\r
264                         $x[0] = ($x[0] << $shift) & $bm;\r
265                 }\r
266 \r
267                 $i = 0;\r
268                 $j = 0;\r
269                 $x2 = 0;\r
270                 $q = zeros($nmt + 1);\r
271                 $y2 = array_merge(zeros($nmt), (array)$y);\r
272                 for (;;) {\r
273                         $x2 = bsub($x, $y2);\r
274                         if(count($x2) == 0) break;\r
275                         $q[$nmt]++;\r
276                         $x = $x2;\r
277                 }\r
278 \r
279                 $yt = $y[$t];\r
280                 $top =toppart($y, $t, 2);\r
281                 for ($i = $n; $i > $t; $i--) {\r
282                         $m = $i - $t - 1;\r
283                         if ($i >= count($x)) $q[$m] = 1;\r
284                         else if($x[$i] == $yt) $q[$m] = $bm;\r
285                         else $q[$m] = floor(toppart($x, $i, 2) / $yt);\r
286 \r
287                         $topx = toppart($x, $i, 3);\r
288                         while ($q[$m] * $top > $topx) $q[$m]--;\r
289 \r
290                         $y2 = array_slice($y2, 1);\r
291                         $x2 = bsub($x, bmul(array($q[$m]), $y2));\r
292                         if (count($x2) == 0) {\r
293                                 $q[$m]--;\r
294                                 $x2 =bsub($x, bmul(array($q[m]), $y2));\r
295                         }\r
296                         $x = $x2;\r
297                 }\r
298 \r
299                 if ($shift) {\r
300                         for($i = 0; $i < count($x) - 1; $i++) $x[$i] = ($x[$i] >> $shift) | (($x[$i + 1] << $shift2) & $bm);\r
301                         $x[count($x) - 1] >>= $shift;\r
302                 }\r
303                 $n = count($q);\r
304                 while ($n > 1 && $q[$n - 1] == 0) $n--;\r
305                 $this->q = array_slice($q, 0, $n);\r
306                 $n = count($x);\r
307                 while ($n > 1 && $x[$n - 1] == 0) $n--;\r
308                 $this->mod = array_slice($x, 0, $n);\r
309         }\r
310 }\r
311 \r
312 /**\r
313  */\r
314 function bsub($a, $b) {\r
315     global $bs;\r
316     global $bx2;\r
317     global $bm;\r
318     global $bx;\r
319     global $bd;\r
320     global $bdm;\r
321 \r
322     $al = count($a);\r
323     $bl = count($b);\r
324 \r
325     if ($bl > $al) return array();\r
326     if ($bl == $al) {\r
327         if($b[$bl - 1] > $a[$bl - 1]) return array();\r
328         if($bl == 1) return array($a[0] - $b[0]);\r
329     }\r
330 \r
331     $r = array_fill(0, $al, 0);\r
332     $c = 0;\r
333 \r
334     for ($n = 0; $n < $bl; $n++) {\r
335         $c += $a[$n] - $b[$n];\r
336         $r[$n] = $c & $bm;\r
337         $c >>= $bs;\r
338     }\r
339     for (; $n < $al; $n++) {\r
340         $c += $a[$n];\r
341         $r[$n] = $c & $bm;\r
342         $c >>= $bs;\r
343     }\r
344     if ($c) return array();\r
345 \r
346     if ($r[$n - 1]) return $r;\r
347     while ($n > 1 && $r[$n - 1] == 0) $n--;\r
348 \r
349     return array_slice($r, 0, $n);\r
350 }\r
351 \r
352 /**\r
353  */\r
354 function bmul($a, $b) {\r
355     global $bs;\r
356     global $bx2;\r
357     global $bm;\r
358     global $bx;\r
359     global $bd;\r
360     global $bdm;\r
361 \r
362     $b = array_merge((array)$b, array(0));\r
363     $al = count($a);\r
364     $bl = count($b);\r
365     $n = 0;\r
366     $nn = 0;\r
367     $aa = 0;\r
368     $c = 0;\r
369     $m = 0;\r
370     $g = 0;\r
371     $gg = 0;\r
372     $h = 0;\r
373     $hh = 0;\r
374     $ghh = 0;\r
375     $ghhb = 0;\r
376 \r
377     $r = zeros($al + $bl + 1);\r
378 \r
379     for ($n = 0; $n < $al; $n++) {\r
380         $aa = $a[$n];\r
381         if ($aa) {\r
382             $c = 0;\r
383             $hh = $aa >> $bd; $h = $aa & $bdm;\r
384             $m = $n;\r
385             for ($nn = 0; $nn < $bl; $nn++, $m++) {\r
386                 $g = $b[$nn]; $gg = $g >> $bd; $g = $g & $bdm;\r
387                 $ghh = $g * $hh + $h * $gg;\r
388                 $ghhb = $ghh >> $bd; $ghh &= $bdm;\r
389                 $c += $r[$m] + $h * $g + ($ghh << $bd);\r
390                 $r[$m] = $c & $bm;\r
391                 $c = ($c >> $bs) + $gg * $hh + $ghhb;\r
392             }\r
393         }\r
394     }\r
395     $n = count($r);\r
396 \r
397     if ($r[$n - 1]) return $r;\r
398     while ($n > 1 && $r[$n - 1] == 0) $n--;\r
399 \r
400     return array_slice($r, 0, $n);\r
401 }\r
402 \r
403 ?>\r