@@ -50,8 +50,8 @@ private function TL($a)
50
50
$ d [$ e ++] = $ g >> 12 & 63 | 128 ;
51
51
} else {
52
52
$ d [$ e ++] = $ g >> 12 | 224 ;
53
- $ d [$ e ++] = $ g >> 6 & 63 | 128 ;
54
53
}
54
+ $ d [$ e ++] = $ g >> 6 & 63 | 128 ;
55
55
}
56
56
$ d [$ e ++] = $ g & 63 | 128 ;
57
57
}
@@ -62,7 +62,7 @@ private function TL($a)
62
62
$ a = $ this ->RL ($ a , '+-a^+6 ' );
63
63
}
64
64
$ a = $ this ->RL ($ a , '+-3^+b+-f ' );
65
- $ a ^= $ tkk [1 ];
65
+ $ a ^= $ tkk [1 ] ? $ tkk [ 1 ] + 0 : 0 ;
66
66
if (0 > $ a ) {
67
67
$ a = ($ a & 2147483647 ) + 2147483648 ;
68
68
}
@@ -81,51 +81,60 @@ private function TKK()
81
81
82
82
/**
83
83
* Process token data by applying multiple operations.
84
+ * (Params are safe, no need for multibyte functions)
84
85
*
85
- * @param $a
86
- * @param $b
86
+ * @param int $a
87
+ * @param string $b
87
88
*
88
89
* @return int
89
90
*/
90
91
private function RL ($ a , $ b )
91
92
{
92
93
for ($ c = 0 ; $ c < strlen ($ b ) - 2 ; $ c += 3 ) {
93
- $ d = $ b {$ c + 2 };
94
- $ d = $ d >= 'a ' ? $ this ->charCodeAt ($ d , 0 ) - 87 : intval ($ d );
95
- $ d = $ b {$ c + 1 }
96
- == '+ ' ? $ this ->shr32 ($ a , $ d ) : $ a << $ d ;
97
- $ a = $ b {$ c }
98
- == '+ ' ? ($ a + $ d & 4294967295 ) : $ a ^ $ d ;
94
+ $ d = $ b [$ c + 2 ];
95
+ $ d = 'a ' <= $ d ? ord ($ d [0 ]) - 87 : intval ($ d );
96
+ $ d = '+ ' == $ b [$ c + 1 ] ? $ this ->unsignedRightShift ($ a , $ d ) : $ a << $ d ;
97
+ $ a = '+ ' == $ b [$ c ] ? ($ a + $ d & 4294967295 ) : $ a ^ $ d ;
99
98
}
100
99
101
100
return $ a ;
102
101
}
103
102
104
103
/**
105
- * Crypto function.
104
+ * Unsigned right shift implementation
105
+ * https://msdn.microsoft.com/en-us/library/342xfs5s(v=vs.94).aspx
106
+ * http://stackoverflow.com/a/43359819/2953830
106
107
*
107
- * @param $x
108
- * @param $bits
108
+ * @param $a
109
+ * @param $b
109
110
*
110
111
* @return number
111
112
*/
112
- private function shr32 ( $ x , $ bits )
113
+ private function unsignedRightShift ( $ a , $ b )
113
114
{
114
- if ($ bits <= 0 ) {
115
- return $ x ;
115
+ if ($ b >= 32 || $ b < -32 ) {
116
+ $ m = (int )($ b / 32 );
117
+ $ b = $ b - ($ m * 32 );
116
118
}
117
- if ($ bits >= 32 ) {
118
- return 0 ;
119
+
120
+ if ($ b < 0 ) {
121
+ $ b = 32 + $ b ;
119
122
}
120
- $ bin = decbin ($ x );
121
- $ l = strlen ($ bin );
122
- if ($ l > 32 ) {
123
- $ bin = substr ($ bin , $ l - 32 , 32 );
124
- } elseif ($ l < 32 ) {
125
- $ bin = str_pad ($ bin , 32 , '0 ' , STR_PAD_LEFT );
123
+
124
+ if ($ b == 0 ) {
125
+ return (($ a >> 1 ) & 0x7fffffff ) * 2 + (($ a >> $ b ) & 1 );
126
+ }
127
+
128
+ if ($ a < 0 ) {
129
+ $ a = ($ a >> 1 );
130
+ $ a &= 2147483647 ;
131
+ $ a |= 0x40000000 ;
132
+ $ a = ($ a >> ($ b - 1 ));
133
+ } else {
134
+ $ a = ($ a >> $ b );
126
135
}
127
136
128
- return bindec ( str_pad ( substr ( $ bin , 0 , 32 - $ bits ), 32 , ' 0 ' , STR_PAD_LEFT )) ;
137
+ return $ a ;
129
138
}
130
139
131
140
/**
0 commit comments