-
Notifications
You must be signed in to change notification settings - Fork 22
/
Base58.class.php
129 lines (116 loc) · 2.71 KB
/
Base58.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/*
* Object Oriented implimentation to Base58.
* For use with Bitcoin and Zetacoin compatable crypto currency using the secp256k1 ECC curve
*
* @author Daniel Morante
* Some parts may contain work based on Jan Moritz Lindemann, Matyas Danter, and Joey Hewitt
*/
class Base58 {
/***
* Permutation table used for Base58 encoding and decoding.
*
* @param $char
* @param bool $reverse
* @return null
*/
private static function permutation_lookup($char, $reverse = false){
$table = array('1','2','3','4','5','6','7','8','9','A','B','C','D',
'E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W',
'X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z'
);
if($reverse)
{
$reversedTable = array();
foreach($table as $key => $element)
{
$reversedTable[$element] = $key;
}
if(isset($reversedTable[$char]))
return $reversedTable[$char];
else
return null;
}
if(isset($table[$char]))
return $table[$char];
else
return null;
}
/***
* encode a hexadecimal string in Base58.
*
* @param String Hex $data
* @param bool $littleEndian
* @return String Base58
* @throws \Exception
*/
public static function Encode($data, $littleEndian = true){
$res = '';
$dataIntVal = gmp_init($data, 16);
while(gmp_cmp($dataIntVal, gmp_init(0, 10)) > 0)
{
$qr = gmp_div_qr($dataIntVal, gmp_init(58, 10));
$dataIntVal = $qr[0];
$reminder = gmp_strval($qr[1]);
if(!self::permutation_lookup($reminder))
{
throw new \Exception('Something went wrong during base58 encoding');
}
$res .= self::permutation_lookup($reminder);
}
//get number of leading zeros
$leading = '';
$i=0;
while(substr($data, $i, 1) == '0')
{
if($i!= 0 && $i%2)
{
$leading .= '1';
}
$i++;
}
if($littleEndian)
return strrev($res . $leading);
else
return $res.$leading;
}
/***
* Decode a Base58 encoded string and returns it's value as a hexadecimal string
*
* @param $encodedData
* @param bool $littleEndian
* @return String Hex
*/
public static function Decode($encodedData, $littleEndian = true){
$res = gmp_init(0, 10);
$length = strlen($encodedData);
if($littleEndian)
{
$encodedData = strrev($encodedData);
}
for($i = $length - 1; $i >= 0; $i--)
{
$res = gmp_add(
gmp_mul(
$res,
gmp_init(58, 10)
),
self::permutation_lookup(substr($encodedData, $i, 1), true)
);
}
$res = gmp_strval($res, 16);
$i = $length - 1;
while(substr($encodedData, $i, 1) == '1')
{
$res = '00' . $res;
$i--;
}
if(strlen($res)%2 != 0)
{
$res = '0' . $res;
}
return $res;
}
}
?>