oracle_ebs_authentication 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +458 -0
- data/README.md +32 -0
- data/lib/oracle_ebs_authentication.rb +6 -0
- data/lib/oracle_ebs_authentication/authenticator.rb +25 -0
- data/lib/oracle_ebs_authentication/security.rb +2170 -0
- data/lib/oracle_ebs_authentication/version.rb +3 -0
- data/spec/authenticator_spec.rb +37 -0
- data/spec/security_spec.rb +94 -0
- data/spec/spec_helper.rb +7 -0
- metadata +151 -0
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Oracle E-Business Suite authentication
|
2
|
+
======================================
|
3
|
+
|
4
|
+
This plugin provides Oracle E-Business Suite user authentication functionality.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
gem install oracle_ebs_authentication
|
9
|
+
|
10
|
+
## Setup
|
11
|
+
|
12
|
+
1. Grant execute on `apps.fnd_encrypted_pwd` to your database user.
|
13
|
+
2. Setup [ruby-plsql](https://rubygems.org/gems/ruby-plsql) connection for your database.
|
14
|
+
|
15
|
+
## Examples
|
16
|
+
|
17
|
+
Simple example how to use the plugin for Oracle E-Business Suite user authentication:
|
18
|
+
|
19
|
+
authenticator = OracleEbsAuthentication::Authenticator.new
|
20
|
+
if authenticator.validate_user_password(username, password)
|
21
|
+
FndUser.find_by_username(username.upcase)
|
22
|
+
end
|
23
|
+
|
24
|
+
See other usage examples in RSpec examples in `spec/`.
|
25
|
+
|
26
|
+
## Credits
|
27
|
+
|
28
|
+
Copyright (C) 2007-2011 Raimonds Simanovskis, Edgars Beigarts.
|
29
|
+
|
30
|
+
Oracle E-Business Suite authentication encryption algorythm was taken from
|
31
|
+
[Jira eBusiness Suite Authenticator](http://code.google.com/p/jebusinessauth/) and
|
32
|
+
rewritten in Ruby by Raimonds Simanovskis.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "ruby_plsql"
|
2
|
+
|
3
|
+
module OracleEbsAuthentication
|
4
|
+
class Authenticator
|
5
|
+
def initialize
|
6
|
+
@security = OracleEbsAuthentication::Security.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_fnd_password(username, password)
|
10
|
+
username &&= username.upcase
|
11
|
+
result = plsql.apps.fnd_security_pkg.fnd_encrypted_pwd(username, nil, nil, nil)
|
12
|
+
if result[:p_password]
|
13
|
+
@security.decrypt(username + "/" + password, result[:p_password], false)
|
14
|
+
end
|
15
|
+
rescue OCIError
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate_user_password(username, password)
|
20
|
+
if username && password
|
21
|
+
!! get_fnd_password(username, password)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,2170 @@
|
|
1
|
+
# The Java original source code was taken form http://www.milci.com/eappsjira
|
2
|
+
# Original Java source is included in comments followed by corresponding Ruby code.
|
3
|
+
# As original Java source is not documented then Ruby source code was done
|
4
|
+
# as similar as possible to Java code to avoid differences in functionality.
|
5
|
+
#
|
6
|
+
# http://code.google.com/p/jebusinessauth/source/browse/trunk/src/com/milci/ebusinesssuite/eBusinessSuiteSecurity.java
|
7
|
+
#
|
8
|
+
|
9
|
+
require "digest/sha1"
|
10
|
+
|
11
|
+
module OracleEbsAuthentication
|
12
|
+
|
13
|
+
# public class eBusinessSuiteSecurity {
|
14
|
+
class Security
|
15
|
+
|
16
|
+
# public eBusinessSuiteSecurity() {
|
17
|
+
# }
|
18
|
+
def initialize
|
19
|
+
end
|
20
|
+
|
21
|
+
# static String control(String s1, int i1, String s2) {
|
22
|
+
# return newControl(s1, s2, i1, 0);
|
23
|
+
# }
|
24
|
+
def control(s1, i1, s2)
|
25
|
+
return new_control(s1, s2, i1, 0)
|
26
|
+
end
|
27
|
+
|
28
|
+
#private static int[] a(byte abyte0[], int i1) {
|
29
|
+
def a(abyte0, i1)
|
30
|
+
# int ai[] = new int[16];
|
31
|
+
ai = [nil]*16
|
32
|
+
# int ai1[] = new int[5];
|
33
|
+
ai1 = [nil]*5
|
34
|
+
# u(ai1, null);
|
35
|
+
u(ai1, nil)
|
36
|
+
# int l1 = ai.length;
|
37
|
+
l1 = ai.length
|
38
|
+
# int k1 = 0;
|
39
|
+
k1 = 0
|
40
|
+
# int j2 = 0;
|
41
|
+
j2 = 0
|
42
|
+
# int j1;
|
43
|
+
# for (j1 = 0; j1 < (i1 & -4); j1 += 4) {
|
44
|
+
j1 = 0
|
45
|
+
while j1 < (i1 & -4)
|
46
|
+
# ai[k1] = abyte0[j2] | abyte0[j2 + 1] << 8 | abyte0[j2 + 2] << 16 |
|
47
|
+
# abyte0[j2 + 3] << 24;
|
48
|
+
ai[k1] = (abyte0[j2] | abyte0[j2 + 1] << 8 | abyte0[j2 + 2] << 16 |
|
49
|
+
abyte0[j2 + 3] << 24) & 0xffffffff
|
50
|
+
# if (++k1 == l1) {
|
51
|
+
# u(ai1, ai);
|
52
|
+
# k1 = 0;
|
53
|
+
# }
|
54
|
+
k1 +=1
|
55
|
+
if (k1 == l1)
|
56
|
+
u(ai1, ai)
|
57
|
+
k1 = 0
|
58
|
+
end
|
59
|
+
# j2 += 4;
|
60
|
+
j2 += 4
|
61
|
+
# }
|
62
|
+
j1 += 4
|
63
|
+
end
|
64
|
+
#
|
65
|
+
# j1 = i1 - j1;
|
66
|
+
j1 = i1 - j1
|
67
|
+
# if (j1 == 1) {
|
68
|
+
# ai[k1] = abyte0[j2] & 0xff | 0x8000;
|
69
|
+
# }
|
70
|
+
if (j1 == 1)
|
71
|
+
ai[k1] = abyte0[j2] & 0xff | 0x8000
|
72
|
+
# else
|
73
|
+
# if (j1 == 2) {
|
74
|
+
# ai[k1] = abyte0[j2] | abyte0[j2 + 1] << 8 | 0x800000;
|
75
|
+
# }
|
76
|
+
elsif (j1 == 2)
|
77
|
+
ai[k1] = (abyte0[j2] | abyte0[j2 + 1] << 8 | 0x800000) & 0xffffffff
|
78
|
+
# else
|
79
|
+
# if (j1 == 3) {
|
80
|
+
# ai[k1] = abyte0[j2] | abyte0[j2 + 1] << 8 | abyte0[j2 + 2] << 16 |
|
81
|
+
# 0x80000000;
|
82
|
+
# }
|
83
|
+
elsif (j1 == 3)
|
84
|
+
ai[k1] = (abyte0[j2] | abyte0[j2 + 1] << 8 | abyte0[j2 + 2] << 16 | 0x80000000) & 0xffffffff
|
85
|
+
# else {
|
86
|
+
# ai[k1] = 128;
|
87
|
+
# }
|
88
|
+
else
|
89
|
+
ai[k1] = 128
|
90
|
+
end
|
91
|
+
# if (++k1 >= l1 - 2) {
|
92
|
+
# while (k1 < l1) {
|
93
|
+
# ai[k1++] = 0;
|
94
|
+
# }
|
95
|
+
# u(ai1, ai);
|
96
|
+
# k1 = 0;
|
97
|
+
# }
|
98
|
+
k1 += 1
|
99
|
+
if (k1 >= l1 - 2)
|
100
|
+
while (k1 < l1)
|
101
|
+
ai[k1] = 0
|
102
|
+
k1 += 1
|
103
|
+
end
|
104
|
+
u(ai1,ai)
|
105
|
+
k1 = 0
|
106
|
+
end
|
107
|
+
# while (k1 < l1 - 2) {
|
108
|
+
# ai[k1++] = 0;
|
109
|
+
# }
|
110
|
+
while (k1 < l1 - 2)
|
111
|
+
ai[k1] = 0
|
112
|
+
k1 += 1
|
113
|
+
end
|
114
|
+
# int i2 = i1;
|
115
|
+
i2 = i1
|
116
|
+
# ai[k1++] = i2 >> 29 & 7;
|
117
|
+
ai[k1] = i2 >> 29 & 7
|
118
|
+
k1 += 1
|
119
|
+
# ai[k1] = i2 << 3;
|
120
|
+
ai[k1] = (i2 << 3) & 0xffffffff
|
121
|
+
# u(ai1, ai);
|
122
|
+
u(ai1, ai)
|
123
|
+
# return ai1;
|
124
|
+
return ai1
|
125
|
+
#}
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
# static String newCheck(String s1, String s2, boolean flag) {
|
130
|
+
def new_check(s1, s2, flag)
|
131
|
+
# if (s1 == null || s2 == null ||
|
132
|
+
# s2.length() >= "ZG_ENCRYPT_FAILED_".length() &&
|
133
|
+
# s2.substring(0,
|
134
|
+
# "ZG_ENCRYPT_FAILED_".length()).equals("ZG_ENCRYPT_FAILED_")) {
|
135
|
+
# return null;
|
136
|
+
# }
|
137
|
+
if (s1 == nil || s2 == nil ||
|
138
|
+
s2.length >= "ZG_ENCRYPT_FAILED_".length &&
|
139
|
+
s2[0, "ZG_ENCRYPT_FAILED_".length] == "ZG_ENCRYPT_FAILED_")
|
140
|
+
return nil
|
141
|
+
end
|
142
|
+
# byte abyte0[];
|
143
|
+
# try {
|
144
|
+
# abyte0 = s1.getBytes("UTF8");
|
145
|
+
# }
|
146
|
+
# catch (UnsupportedEncodingException _ex) {
|
147
|
+
# return null;
|
148
|
+
# }
|
149
|
+
abyte0 = s1.dup
|
150
|
+
# int l2 = abyte0.length;
|
151
|
+
l2 = abyte0.length
|
152
|
+
# int i3 = s2.length();
|
153
|
+
i3 = s2.length
|
154
|
+
# int i1 = 1;
|
155
|
+
i1 = 1
|
156
|
+
# byte byte0 = 2;
|
157
|
+
byte0 = 2
|
158
|
+
# int j1 = i3 - 2 - i1 * 2;
|
159
|
+
j1 = i3 - 2 - i1 * 2
|
160
|
+
# if (j1 <= 0) {
|
161
|
+
# return null;
|
162
|
+
# }
|
163
|
+
if (j1 <= 0)
|
164
|
+
return nil
|
165
|
+
end
|
166
|
+
# int k1 = (j1 / 16) * 8;
|
167
|
+
k1 = (j1 / 16) * 8
|
168
|
+
# if (k1 <= 0) {
|
169
|
+
# return null;
|
170
|
+
# }
|
171
|
+
if (k1 <= 0)
|
172
|
+
return nil
|
173
|
+
end
|
174
|
+
# int l1 = (j1 % 16) / 2;
|
175
|
+
l1 = (j1 % 16) / 2
|
176
|
+
# int i2 = l1 + i1;
|
177
|
+
i2 = l1 + i1
|
178
|
+
# int j2 = k1 - 1 - byte0;
|
179
|
+
j2 = k1 - 1 - byte0
|
180
|
+
# if (j2 <= 0) {
|
181
|
+
# return null;
|
182
|
+
# }
|
183
|
+
if (j2 <= 0)
|
184
|
+
return nil
|
185
|
+
end
|
186
|
+
# if (!s2.substring(0, 2).equals("ZG")) {
|
187
|
+
# return null;
|
188
|
+
# }
|
189
|
+
if (not s2[0, 2] == "ZG")
|
190
|
+
return nil
|
191
|
+
end
|
192
|
+
# String s3 = s2.substring(2);
|
193
|
+
s3 = s2[2..-1]
|
194
|
+
# byte abyte1[] = p(s3);
|
195
|
+
abyte1 = p(s3)
|
196
|
+
# byte abyte2[] = new byte[abyte1.length - i2];
|
197
|
+
abyte2 = "\0"*(abyte1.length - i2)
|
198
|
+
# byte abyte3[] = new byte[i2];
|
199
|
+
abyte3 = "\0"*i2
|
200
|
+
# System.arraycopy(abyte1, 0, abyte2, 0, abyte1.length - i2);
|
201
|
+
abyte2[0, abyte1.length - i2] = abyte1[0, abyte1.length - i2]
|
202
|
+
# System.arraycopy(abyte1, abyte1.length - i2, abyte3, 0, i2);
|
203
|
+
abyte3[0, i2] = abyte1[abyte1.length - i2, i2]
|
204
|
+
# byte abyte4[] = new byte[i2 + l2];
|
205
|
+
abyte4 = "\0"*(i2 + l2)
|
206
|
+
# System.arraycopy(abyte3, 0, abyte4, 0, i2);
|
207
|
+
abyte4[0, i2] = abyte3[0, i2]
|
208
|
+
# System.arraycopy(abyte0, 0, abyte4, i2, l2);
|
209
|
+
abyte4[i2, l2] = abyte0[0, l2]
|
210
|
+
# byte abyte5[] = v(null, abyte4, abyte2);
|
211
|
+
# puts "<br/>DEBUG new_check: abyte4=#{abyte4.inspect} abyte2=#{abyte2.unpack("H*")[0]}"
|
212
|
+
abyte5 = v(nil, abyte4, abyte2)
|
213
|
+
# if (abyte5 == null) {
|
214
|
+
# return null;
|
215
|
+
# }
|
216
|
+
if (abyte5 == nil)
|
217
|
+
# puts "<br/>DEBUG new_check: :nil6"
|
218
|
+
return nil
|
219
|
+
end
|
220
|
+
# int j3 = abyte5.length;
|
221
|
+
j3 = abyte5.length
|
222
|
+
# for (int k2 = byte0; k2 < abyte5.length; k2++) {
|
223
|
+
# if (abyte5[k2] != 0) {
|
224
|
+
# continue;
|
225
|
+
# }
|
226
|
+
# j3 = k2;
|
227
|
+
# break;
|
228
|
+
# }
|
229
|
+
for k2 in byte0...abyte5.length
|
230
|
+
if (abyte5[k2] != 0)
|
231
|
+
next
|
232
|
+
end
|
233
|
+
j3 = k2
|
234
|
+
break
|
235
|
+
end
|
236
|
+
#
|
237
|
+
# byte abyte6[] = new byte[j3 - byte0];
|
238
|
+
abyte6 = "\0"*(j3 - byte0)
|
239
|
+
# System.arraycopy(abyte5, byte0, abyte6, 0, j3 - byte0);
|
240
|
+
abyte6[0, j3 - byte0] = abyte5[byte0, j3 - byte0]
|
241
|
+
# String s4;
|
242
|
+
# try {
|
243
|
+
# s4 = new String(abyte6, "UTF8");
|
244
|
+
# }
|
245
|
+
# catch (UnsupportedEncodingException _ex) {
|
246
|
+
# return null;
|
247
|
+
# }
|
248
|
+
s4 = abyte6
|
249
|
+
# if (s4 != null && flag) {
|
250
|
+
# return w(s4, 0, flag);
|
251
|
+
# }
|
252
|
+
if (s4 != nil && flag)
|
253
|
+
return w(s4, 0, flag)
|
254
|
+
# else {
|
255
|
+
# return s4;
|
256
|
+
# }
|
257
|
+
else
|
258
|
+
return s4
|
259
|
+
end
|
260
|
+
# }
|
261
|
+
end
|
262
|
+
|
263
|
+
# private static void c(int ai[]) {
|
264
|
+
# ai[4] = j(ai[0], 5) + s(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x8f1bbcdc;
|
265
|
+
# ai[2] = j(ai[1], 30);
|
266
|
+
# }
|
267
|
+
def c(ai)
|
268
|
+
ai[4] = j(ai[0], 5) + s(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x8f1bbcdc
|
269
|
+
ai[2] = j(ai[1], 30)
|
270
|
+
end
|
271
|
+
|
272
|
+
# private static void d(byte abyte0[], int ai[]) {
|
273
|
+
# int ai1[] = new int[2];
|
274
|
+
# t(abyte0, ai1);
|
275
|
+
# F(ai1, ai);
|
276
|
+
# x(ai1, abyte0);
|
277
|
+
# }
|
278
|
+
def d(abyte0, ai)
|
279
|
+
ai1 = [nil]*2
|
280
|
+
t(abyte0, ai1)
|
281
|
+
# puts "<br/>DEBUG d: after t abyte0=#{abyte0.unpack("H*")[0]}"
|
282
|
+
# puts "<br/>DEBUG d: after t ai1=#{ai1.join(",")}"
|
283
|
+
f_(ai1, ai)
|
284
|
+
# puts "<br/>DEBUG d: after F ai1=#{ai1.join(",")}"
|
285
|
+
# puts "<br/>DEBUG d: after F ai=#{ai.join(",")}"
|
286
|
+
x(ai1, abyte0)
|
287
|
+
# puts "<br/>DEBUG d: after x ai1=#{ai1.join(",")}"
|
288
|
+
# puts "<br/>DEBUG d: after x abyte0=#{abyte0.unpack("H*")[0]}"
|
289
|
+
end
|
290
|
+
|
291
|
+
# private static byte[] e(int ai[]) {
|
292
|
+
# byte abyte0[] = new byte[4];
|
293
|
+
# byte abyte1[] = null;
|
294
|
+
# if (ai != null) {
|
295
|
+
# abyte1 = new byte[ai.length];
|
296
|
+
# for (int i1 = 0; i1 < ai.length; i1++) {
|
297
|
+
# abyte0[3] = (byte) (ai[i1] & 0xff);
|
298
|
+
# abyte0[2] = (byte) ( (ai[i1] & 0xff00) >> 8);
|
299
|
+
# abyte0[1] = (byte) ( (ai[i1] & 0xff0000) >> 16);
|
300
|
+
# abyte0[0] = (byte) ( (ai[i1] & 0xff000000) >> 24);
|
301
|
+
# abyte1[i1] = (byte) (abyte0[0] ^ abyte0[1] ^ abyte0[2] ^ abyte0[3]);
|
302
|
+
# }
|
303
|
+
#
|
304
|
+
# }
|
305
|
+
# return abyte1;
|
306
|
+
# }
|
307
|
+
def e(ai)
|
308
|
+
abyte0 = "\0"*4
|
309
|
+
abyte1 = nil
|
310
|
+
if (ai != nil)
|
311
|
+
abyte1 = "\0"*(ai.length)
|
312
|
+
for i1 in 0...ai.length
|
313
|
+
abyte0[3] = (ai[i1] & 0xff)
|
314
|
+
abyte0[2] = ( (ai[i1] & 0xff00) >> 8)
|
315
|
+
abyte0[1] = ( (ai[i1] & 0xff0000) >> 16)
|
316
|
+
abyte0[0] = ( (ai[i1] & 0xff000000) >> 24)
|
317
|
+
abyte1[i1] = (abyte0[0] ^ abyte0[1] ^ abyte0[2] ^ abyte0[3])
|
318
|
+
end
|
319
|
+
end
|
320
|
+
return abyte1
|
321
|
+
end
|
322
|
+
|
323
|
+
# private static byte f(int i1) {
|
324
|
+
# byte byte0 = 0;
|
325
|
+
# int j1 = (char) i1 & 0x40;
|
326
|
+
# if (j1 >= 1) {
|
327
|
+
# byte0 = (byte) ( (char) i1 - 55);
|
328
|
+
# }
|
329
|
+
# else {
|
330
|
+
# byte0 = (byte) ( (char) i1 & 0xf);
|
331
|
+
# }
|
332
|
+
# return byte0;
|
333
|
+
# }
|
334
|
+
def f(i1)
|
335
|
+
byte0 = 0
|
336
|
+
j1 = i1 & 0x40
|
337
|
+
if (j1 >= 1)
|
338
|
+
byte0 = i1 - 55
|
339
|
+
else
|
340
|
+
byte0 = i1 & 0xf
|
341
|
+
end
|
342
|
+
return byte0
|
343
|
+
end
|
344
|
+
|
345
|
+
# private static byte[] g(byte abyte0[], byte abyte1[]) {
|
346
|
+
def g(abyte0, abyte1)
|
347
|
+
# if (abyte0.length < 32) {
|
348
|
+
# return null;
|
349
|
+
# }
|
350
|
+
if (abyte0.length < 32)
|
351
|
+
# puts "<br/>DEBUG g: nil1"
|
352
|
+
return nil
|
353
|
+
end
|
354
|
+
# if (abyte1.length % 8 != 0) {
|
355
|
+
# return null;
|
356
|
+
# }
|
357
|
+
if (abyte1.length % 8 != 0)
|
358
|
+
# puts "<br/>DEBUG g: nil2"
|
359
|
+
return nil
|
360
|
+
end
|
361
|
+
# int i1 = abyte1.length / 8;
|
362
|
+
i1 = abyte1.length / 8
|
363
|
+
# byte abyte3[] = new byte[8];
|
364
|
+
abyte3 = "\0"*8
|
365
|
+
# byte abyte4[] = new byte[8];
|
366
|
+
abyte4 = "\0"*8
|
367
|
+
# byte abyte5[] = new byte[8];
|
368
|
+
abyte5 = "\0"*8
|
369
|
+
# byte abyte2[] = new byte[8];
|
370
|
+
abyte2 = "\0"*8
|
371
|
+
# System.arraycopy(abyte0, 0, abyte3, 0, 8);
|
372
|
+
abyte3[0,8] = abyte0[0, 8]
|
373
|
+
# System.arraycopy(abyte0, 8, abyte4, 0, 8);
|
374
|
+
abyte4[0,8] = abyte0[8, 8]
|
375
|
+
# System.arraycopy(abyte0, 16, abyte5, 0, 8);
|
376
|
+
abyte5[0,8] = abyte0[16, 8]
|
377
|
+
# System.arraycopy(abyte0, 24, abyte2, 0, 8);
|
378
|
+
abyte2[0,8] = abyte0[24, 8]
|
379
|
+
# int ai[] = l(abyte3, false);
|
380
|
+
ai = l(abyte3, false)
|
381
|
+
# int ai1[] = l(abyte4, true);
|
382
|
+
ai1 = l(abyte4, true)
|
383
|
+
# int ai2[] = l(abyte5, false);
|
384
|
+
ai2 = l(abyte5, false)
|
385
|
+
# byte abyte6[] = new byte[abyte1.length];
|
386
|
+
abyte6 = "\0"*(abyte1.length)
|
387
|
+
# int j1 = 0;
|
388
|
+
j1 = 0
|
389
|
+
# for (int k1 = 0; j1 < i1; k1 += 8) {
|
390
|
+
k1 = 0
|
391
|
+
while (j1 < i1)
|
392
|
+
# q(abyte1, k1, abyte6, k1, ai, ai1, ai2, abyte2, false);
|
393
|
+
q(abyte1, k1, abyte6, k1, ai, ai1, ai2, abyte2, false)
|
394
|
+
# puts "<br/>DEBUG g: after q() abyte6=#{abyte6.unpack("H*")[0]}"
|
395
|
+
# j1++;
|
396
|
+
j1 += 1
|
397
|
+
# }
|
398
|
+
k1 += 8
|
399
|
+
end
|
400
|
+
#
|
401
|
+
# byte byte0 = abyte6[abyte1.length - 1];
|
402
|
+
byte0 = abyte6[abyte1.length - 1]
|
403
|
+
# puts "<br/>DEBUG g: abyte1=#{abyte1.unpack("H*")[0]}"
|
404
|
+
# puts "<br/>DEBUG g: abyte1.length=#{abyte1.length}"
|
405
|
+
# puts "<br/>DEBUG g: abyte6=#{abyte6.unpack("H*")[0]}"
|
406
|
+
# if (byte0 < 1 || byte0 > 8) {
|
407
|
+
# return null;
|
408
|
+
# }
|
409
|
+
if (byte0 < 1 || byte0 > 8)
|
410
|
+
# puts "<br/>DEBUG g: nil3"
|
411
|
+
# puts "<br/>DEBUG g: byte0=#{byte0}"
|
412
|
+
return nil
|
413
|
+
end
|
414
|
+
# for (int l1 = abyte1.length - byte0; l1 < abyte1.length; l1++) {
|
415
|
+
for l1 in (abyte1.length-byte0)...abyte1.length
|
416
|
+
# if (abyte6[l1] != byte0) {
|
417
|
+
# return null;
|
418
|
+
# }
|
419
|
+
if (abyte6[l1] != byte0)
|
420
|
+
# puts "<br/>DEBUG g: nil4"
|
421
|
+
return nil
|
422
|
+
end
|
423
|
+
# }
|
424
|
+
end
|
425
|
+
#
|
426
|
+
# byte abyte7[] = new byte[abyte1.length - byte0];
|
427
|
+
abyte7 = "\0"*(abyte1.length - byte0)
|
428
|
+
# System.arraycopy(abyte6, 0, abyte7, 0, abyte1.length - byte0);
|
429
|
+
abyte7[0, abyte1.length - byte0] = abyte6[0, abyte1.length - byte0]
|
430
|
+
# return abyte7;
|
431
|
+
# puts "<br/>DEBUG g: abyte7=#{abyte7.unpack("H*")[0]}"
|
432
|
+
return abyte7
|
433
|
+
# }
|
434
|
+
end
|
435
|
+
|
436
|
+
# private static void h(int ai[]) {
|
437
|
+
# ai[4] = j(ai[0], 5) + o(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0xca62c1d6;
|
438
|
+
# ai[2] = j(ai[1], 30);
|
439
|
+
# }
|
440
|
+
def h(ai)
|
441
|
+
ai[4] = j(ai[0], 5) + o(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0xca62c1d6
|
442
|
+
ai[2] = j(ai[1], 30)
|
443
|
+
end
|
444
|
+
|
445
|
+
# private static byte[] i(byte abyte0[], byte abyte1[], byte abyte2[]) {
|
446
|
+
# return G(y(abyte0, abyte1), abyte2);
|
447
|
+
# }
|
448
|
+
def i(abyte0, abyte1, abyte2)
|
449
|
+
return g_(y(abyte0, abyte1), abyte2)
|
450
|
+
end
|
451
|
+
|
452
|
+
# private static int j(int i1, int j1) {
|
453
|
+
# return i1 << j1 | i1 >>> 32 - j1;
|
454
|
+
# }
|
455
|
+
# TODO: check impact of >>> substitution with >>
|
456
|
+
def j(i1, j1)
|
457
|
+
return (i1 << j1 | i1 >> 32 - j1) & 0xffffffff
|
458
|
+
end
|
459
|
+
|
460
|
+
# private static byte[] k(byte abyte0[], byte abyte1[], int i1) {
|
461
|
+
def k(abyte0, abyte1, i1)
|
462
|
+
# if (abyte0 == null || abyte1 == null) {
|
463
|
+
# return null;
|
464
|
+
# }
|
465
|
+
if (abyte0 == nil || abyte1 == nil)
|
466
|
+
return nil
|
467
|
+
# else {
|
468
|
+
# int ai[] = a(abyte0, abyte0.length);
|
469
|
+
# byte abyte2[] = e(ai);
|
470
|
+
# byte abyte3[] = new byte[258];
|
471
|
+
# B(abyte3, abyte2, null, 5);
|
472
|
+
# byte abyte4[] = new byte[i1];
|
473
|
+
# B(abyte3, abyte1, abyte4, i1);
|
474
|
+
# return abyte4;
|
475
|
+
# }
|
476
|
+
else
|
477
|
+
ai = a(abyte0, abyte0.length)
|
478
|
+
abyte2 = e(ai)
|
479
|
+
abyte3 = "\0"*258
|
480
|
+
b_(abyte3, abyte2, nil, 5)
|
481
|
+
abyte4 = "\0"*i1
|
482
|
+
b_(abyte3, abyte1, abyte4, i1)
|
483
|
+
return abyte4
|
484
|
+
end
|
485
|
+
# }
|
486
|
+
end
|
487
|
+
|
488
|
+
# private static int[] l(byte abyte0[], boolean flag) {
|
489
|
+
def l(abyte0, flag)
|
490
|
+
# byte abyte1[] = new byte[56];
|
491
|
+
abyte1 = "\0"*56
|
492
|
+
# byte abyte2[] = new byte[56];
|
493
|
+
abyte2 = "\0"*56
|
494
|
+
# int ai[] = new int[32];
|
495
|
+
ai = [nil]*32
|
496
|
+
# for (int j1 = 0; j1 < 56; j1++) {
|
497
|
+
# byte byte0 = V[j1];
|
498
|
+
# int l2 = byte0 & 7;
|
499
|
+
# abyte1[j1] = (byte) ( (abyte0[byte0 >>> 3] & bi[l2]) == 0 ? 0 : 1);
|
500
|
+
# }
|
501
|
+
# TODO: check impact of >>> substitution with >>
|
502
|
+
for j1 in 0...56
|
503
|
+
byte0 = V[j1]
|
504
|
+
l2 = byte0 & 7
|
505
|
+
abyte1[j1] = ( (abyte0[byte0 >> 3] & Bi[l2]) == 0 ? 0 : 1)
|
506
|
+
end
|
507
|
+
#
|
508
|
+
# for (int i1 = 0; i1 < 16; i1++) {
|
509
|
+
for i1 in 0...16
|
510
|
+
# int i3;
|
511
|
+
# if (flag) {
|
512
|
+
# i3 = i1 << 1;
|
513
|
+
# }
|
514
|
+
if (flag)
|
515
|
+
i3 = i1 << 1
|
516
|
+
# else {
|
517
|
+
# i3 = 15 - i1 << 1;
|
518
|
+
# }
|
519
|
+
else
|
520
|
+
i3 = 15 - i1 << 1
|
521
|
+
end
|
522
|
+
# int j3 = i3 + 1;
|
523
|
+
j3 = i3 + 1
|
524
|
+
# ai[i3] = ai[j3] = 0;
|
525
|
+
ai[i3] = ai[j3] = 0
|
526
|
+
# for (int k1 = 0; k1 < 28; k1++) {
|
527
|
+
for k1 in 0...28
|
528
|
+
# int j2 = k1 + bb[i1];
|
529
|
+
j2 = k1 + Bb[i1]
|
530
|
+
# if (j2 < 28) {
|
531
|
+
# abyte2[k1] = abyte1[j2];
|
532
|
+
# }
|
533
|
+
if (j2 < 28)
|
534
|
+
abyte2[k1] = abyte1[j2]
|
535
|
+
# else {
|
536
|
+
# abyte2[k1] = abyte1[j2 - 28];
|
537
|
+
# }
|
538
|
+
else
|
539
|
+
abyte2[k1] = abyte1[j2 - 28]
|
540
|
+
end
|
541
|
+
# }
|
542
|
+
end
|
543
|
+
#
|
544
|
+
# for (int l1 = 28; l1 < 56; l1++) {
|
545
|
+
for l1 in 28...56
|
546
|
+
# int k2 = l1 + bb[i1];
|
547
|
+
k2 = l1 + Bb[i1]
|
548
|
+
# if (k2 < 56) {
|
549
|
+
# abyte2[l1] = abyte1[k2];
|
550
|
+
# }
|
551
|
+
if (k2 < 56)
|
552
|
+
abyte2[l1] = abyte1[k2]
|
553
|
+
# else {
|
554
|
+
# abyte2[l1] = abyte1[k2 - 28];
|
555
|
+
# }
|
556
|
+
else
|
557
|
+
abyte2[l1] = abyte1[k2 - 28]
|
558
|
+
end
|
559
|
+
# }
|
560
|
+
end
|
561
|
+
#
|
562
|
+
# for (int i2 = 0; i2 < 24; i2++) {
|
563
|
+
for i2 in 0...24
|
564
|
+
# if (abyte2[S[i2]] != 0) {
|
565
|
+
# ai[i3] |= W[i2];
|
566
|
+
# }
|
567
|
+
if (abyte2[S[i2]] != 0)
|
568
|
+
ai[i3] |= W[i2]
|
569
|
+
end
|
570
|
+
# if (abyte2[S[i2 + 24]] != 0) {
|
571
|
+
# ai[j3] |= W[i2];
|
572
|
+
# }
|
573
|
+
if (abyte2[S[i2 + 24]] != 0)
|
574
|
+
ai[j3] |= W[i2]
|
575
|
+
end
|
576
|
+
# }
|
577
|
+
end
|
578
|
+
#
|
579
|
+
# }
|
580
|
+
end
|
581
|
+
#
|
582
|
+
# return C(ai);
|
583
|
+
return c_(ai)
|
584
|
+
# }
|
585
|
+
end
|
586
|
+
|
587
|
+
# static String oldControl(String s1, String s2, int i1) {
|
588
|
+
def old_control(s1, s2, i1)
|
589
|
+
# if (s1 == null || s2 == null) {
|
590
|
+
# return null;
|
591
|
+
# }
|
592
|
+
if (s1 == nil || s2 == nil)
|
593
|
+
return nil
|
594
|
+
end
|
595
|
+
# byte abyte0[] = A(s1.toCharArray());
|
596
|
+
abyte0 = a_(s1.dup)
|
597
|
+
# int j1 = s2.length();
|
598
|
+
#j1 = s2.mb_chars.length
|
599
|
+
j1 = s2.length
|
600
|
+
|
601
|
+
# if (j1 > i1 - 1) {
|
602
|
+
# j1 = i1 - 1;
|
603
|
+
# }
|
604
|
+
if (j1 > i1 - 1)
|
605
|
+
j1 = i1 - 1
|
606
|
+
end
|
607
|
+
# Random random = new Random();
|
608
|
+
# RSI: no need to create object here
|
609
|
+
# int k1 = i1 - j1 - 1;
|
610
|
+
k1 = i1 - j1 - 1
|
611
|
+
# int ai[] = new int[k1];
|
612
|
+
ai = [nil]*k1
|
613
|
+
# for (int l1 = 0; l1 < k1; l1++) {
|
614
|
+
# ai[l1] = random.nextInt();
|
615
|
+
#
|
616
|
+
# }
|
617
|
+
# TODO: substitute Java random.nextInt() with ruby
|
618
|
+
for l1 in 0..k1
|
619
|
+
# simulation of random.nextInt()
|
620
|
+
ai[l1] = rand(2**32)-2**31
|
621
|
+
end
|
622
|
+
# byte abyte1[] = e(ai);
|
623
|
+
abyte1 = e(ai)
|
624
|
+
# byte abyte2[] = A( (new String(s2 + '\0')).toCharArray());
|
625
|
+
abyte2 = a_( (s2 + "\0") )
|
626
|
+
# byte abyte3[] = new byte[k1 + abyte2.length];
|
627
|
+
abyte3 = "\0"*(k1 + abyte2.length)
|
628
|
+
# System.arraycopy(abyte2, 0, abyte3, 0, abyte2.length);
|
629
|
+
abyte3[0, abyte2.length] = abyte2[0, abyte2.length]
|
630
|
+
# System.arraycopy(abyte1, 0, abyte3, abyte2.length, k1);
|
631
|
+
abyte3[abyte2.length, k1] = abyte1[0, k1]
|
632
|
+
# byte abyte4[] = k(abyte0, abyte3, i1);
|
633
|
+
abyte4 = k(abyte0, abyte3, i1)
|
634
|
+
# return z(abyte4);
|
635
|
+
return z(abyte4)
|
636
|
+
# }
|
637
|
+
end
|
638
|
+
|
639
|
+
# private static char[] m(byte abyte0[]) {
|
640
|
+
def m(abyte0)
|
641
|
+
# char ac1[];
|
642
|
+
# label0: {
|
643
|
+
while true
|
644
|
+
# if (abyte0 == null) {
|
645
|
+
# return null;
|
646
|
+
# }
|
647
|
+
if (abyte0 == nil)
|
648
|
+
return nil
|
649
|
+
end
|
650
|
+
# char ac[] = new char[abyte0.length];
|
651
|
+
ac = "\0"*(abyte0.length)
|
652
|
+
# int i1 = 0;
|
653
|
+
i1 = 0
|
654
|
+
# boolean flag = false;
|
655
|
+
flag = false
|
656
|
+
# boolean flag1 = false;
|
657
|
+
flag1 = false
|
658
|
+
# ac1 = null;
|
659
|
+
ac1 = nil
|
660
|
+
# try {
|
661
|
+
begin
|
662
|
+
# for (int j1 = 0; j1 < abyte0.length; j1++) {
|
663
|
+
break_value = for j1 in 0...abyte0.length do
|
664
|
+
# byte byte0 = abyte0[j1];
|
665
|
+
byte0 = abyte0[j1]
|
666
|
+
# if ( (byte0 & 0x80) == 0) {
|
667
|
+
# ac[i1++] = (char) byte0;
|
668
|
+
# if ( (char) byte0 == 0) {
|
669
|
+
# break;
|
670
|
+
# }
|
671
|
+
# continue;
|
672
|
+
# }
|
673
|
+
if ( (byte0 & 0x80) == 0)
|
674
|
+
ac[i1] = byte0
|
675
|
+
i1 += 1
|
676
|
+
if ( byte0 == 0)
|
677
|
+
break
|
678
|
+
end
|
679
|
+
next
|
680
|
+
end
|
681
|
+
# if ( (byte0 & 0xe0) == 192) {
|
682
|
+
# char c1 = (char) ( (byte0 & 0x1f) << 6 & 0x7c0);
|
683
|
+
# byte0 = abyte0[++j1];
|
684
|
+
# if ( (byte0 & 0x80) == 128) {
|
685
|
+
# c1 |= byte0 & 0x3f;
|
686
|
+
# ac[i1++] = c1;
|
687
|
+
# continue;
|
688
|
+
# }
|
689
|
+
# break label0;
|
690
|
+
# }
|
691
|
+
if ( (byte0 & 0xe0) == 192)
|
692
|
+
c1 = ( (byte0 & 0x1f) << 6 & 0x7c0)
|
693
|
+
j1 += 1
|
694
|
+
byte0 = abyte0[j1]
|
695
|
+
if ( (byte0 & 0x80) == 128)
|
696
|
+
c1 |= byte0 & 0x3f
|
697
|
+
ac[i1] = c1
|
698
|
+
i1 += 1
|
699
|
+
next
|
700
|
+
end
|
701
|
+
break :label0
|
702
|
+
end
|
703
|
+
# if ( (byte0 & 0xf0) != 224) {
|
704
|
+
# continue;
|
705
|
+
# }
|
706
|
+
if ( (byte0 & 0xf0) != 224)
|
707
|
+
continue
|
708
|
+
end
|
709
|
+
# char c2 = (char) ( (byte0 & 0xf) << 12 & 0xf000);
|
710
|
+
c2 = ( (byte0 & 0xf) << 12 & 0xf000)
|
711
|
+
# byte0 = abyte0[++j1];
|
712
|
+
j1 += 1
|
713
|
+
byte0 = abyte0[j1]
|
714
|
+
# if ( (byte0 & 0x80) != 128) {
|
715
|
+
# break label0;
|
716
|
+
# }
|
717
|
+
if ( (byte0 & 0x80) != 128)
|
718
|
+
break :label0
|
719
|
+
end
|
720
|
+
# c2 |= (byte0 & 0x3f) << 6 & 0xfc0;
|
721
|
+
c2 |= (byte0 & 0x3f) << 6 & 0xfc0
|
722
|
+
# byte0 = abyte0[++j1];
|
723
|
+
j1 += 1
|
724
|
+
byte0 = abyte0[j1]
|
725
|
+
# if ( (byte0 & 0x80) != 128) {
|
726
|
+
# break label0;
|
727
|
+
# }
|
728
|
+
if ( (byte0 & 0x80) != 128)
|
729
|
+
break :label0
|
730
|
+
end
|
731
|
+
# c2 |= byte0 & 0x3f;
|
732
|
+
c2 |= byte0 & 0x3f
|
733
|
+
# ac[i1++] = c2;
|
734
|
+
ac[i1] = c2
|
735
|
+
i1 += 1
|
736
|
+
# }
|
737
|
+
end
|
738
|
+
# RSI: jump back to label0 if brake was called with :label0
|
739
|
+
if break_value == :label0
|
740
|
+
next
|
741
|
+
end
|
742
|
+
#
|
743
|
+
# ac1 = new char[i1];
|
744
|
+
ac1 = "\0"*i1
|
745
|
+
# System.arraycopy(ac, 0, ac1, 0, i1);
|
746
|
+
ac1[0,i1] = ac[0,i1]
|
747
|
+
# }
|
748
|
+
# catch (ArrayIndexOutOfBoundsException _ex) {
|
749
|
+
# ac1 = null;
|
750
|
+
# }
|
751
|
+
end
|
752
|
+
# TODO: when this exception could happen?
|
753
|
+
# }
|
754
|
+
# return ac1;
|
755
|
+
# }
|
756
|
+
# RSI: if we are here then we should return value and escape endless loop
|
757
|
+
return ac1
|
758
|
+
end
|
759
|
+
end
|
760
|
+
|
761
|
+
|
762
|
+
# private static int n(int i1, int j1, int k1) {
|
763
|
+
# return i1 ^ j1 ^ k1;
|
764
|
+
# }
|
765
|
+
def n(i1, j1, k1)
|
766
|
+
return i1 ^ j1 ^ k1
|
767
|
+
end
|
768
|
+
|
769
|
+
# private static int o(int i1, int j1, int k1) {
|
770
|
+
# return i1 ^ j1 ^ k1;
|
771
|
+
# }
|
772
|
+
def o(i1, j1, k1)
|
773
|
+
return i1 ^ j1 ^ k1
|
774
|
+
end
|
775
|
+
|
776
|
+
# static String control(String s1, String s2, int i1) {
|
777
|
+
# return newControl(s1, s2, 0, i1);
|
778
|
+
# }
|
779
|
+
def control(s1, s2, i1)
|
780
|
+
return new_control(s1, s2, 0, i1)
|
781
|
+
end
|
782
|
+
|
783
|
+
# private static byte[] p(String s1) {
|
784
|
+
def p(s1)
|
785
|
+
# boolean flag = false;
|
786
|
+
flag = false
|
787
|
+
# boolean flag1 = false;
|
788
|
+
flag1 = false
|
789
|
+
# int i1 = 0;
|
790
|
+
i1 = 0
|
791
|
+
# int j1 = 0;
|
792
|
+
j1 = 0
|
793
|
+
# byte abyte0[] = null;
|
794
|
+
abyte0 = nil
|
795
|
+
# if (s1 == null) {
|
796
|
+
# return null;
|
797
|
+
# }
|
798
|
+
if (s1 == nil)
|
799
|
+
return nil
|
800
|
+
end
|
801
|
+
# int k1 = s1.length() / 2;
|
802
|
+
k1 = s1.length / 2
|
803
|
+
# if (k1 > 0) {
|
804
|
+
if (k1 > 0)
|
805
|
+
# abyte0 = new byte[k1];
|
806
|
+
abyte0 = "\0"*k1
|
807
|
+
# for (; k1 > 0; k1--) {
|
808
|
+
while (k1 > 0)
|
809
|
+
# char c1 = s1.charAt(i1++);
|
810
|
+
#c1 = s1.chars[i1]
|
811
|
+
c1 = s1[i1]
|
812
|
+
i1 += 1
|
813
|
+
# char c2 = s1.charAt(i1++);
|
814
|
+
#c2 = s1.chars[i1]
|
815
|
+
c2 = s1[i1]
|
816
|
+
i1 += 1
|
817
|
+
# abyte0[j1++] = (byte) (f(c1) << 4 | f(c2));
|
818
|
+
abyte0[j1] = (f(c1) << 4 | f(c2)) & 0xffffffff
|
819
|
+
j1 += 1
|
820
|
+
# }
|
821
|
+
k1 -= 1
|
822
|
+
end
|
823
|
+
#
|
824
|
+
# }
|
825
|
+
end
|
826
|
+
# return abyte0;
|
827
|
+
return abyte0
|
828
|
+
# }
|
829
|
+
end
|
830
|
+
|
831
|
+
# private static void q(byte abyte0[], int i1, byte abyte1[], int j1, int ai[],
|
832
|
+
# int ai1[], int ai2[], byte abyte2[],
|
833
|
+
# boolean flag) {
|
834
|
+
def q(abyte0, i1, abyte1, j1, ai,
|
835
|
+
ai1, ai2, abyte2,
|
836
|
+
flag)
|
837
|
+
# byte abyte3[] = new byte[8];
|
838
|
+
abyte3 = "\0"*8
|
839
|
+
# System.arraycopy(abyte0, i1, abyte3, 0, 8);
|
840
|
+
abyte3[0, 8] = abyte0[i1, 8]
|
841
|
+
# if (!flag) {
|
842
|
+
# d(abyte3, ai2);
|
843
|
+
# d(abyte3, ai1);
|
844
|
+
# d(abyte3, ai);
|
845
|
+
# D(abyte3, abyte2, abyte1, j1);
|
846
|
+
# System.arraycopy(abyte0, i1, abyte2, 0, 8);
|
847
|
+
# return;
|
848
|
+
# }
|
849
|
+
if (!flag)
|
850
|
+
# puts "<br/>DEBUG q: initial abyte3=#{abyte3.unpack("H*")[0]}"
|
851
|
+
# puts "<br/>DEBUG q: initial ai2=#{ai2.join(',')}"
|
852
|
+
# puts "<br/>DEBUG q: initial ai1=#{ai1.join(',')}"
|
853
|
+
# puts "<br/>DEBUG q: initial ai=#{ai.join(',')}"
|
854
|
+
d(abyte3, ai2)
|
855
|
+
# puts "<br/>DEBUG q: abyte3=#{abyte3.unpack("H*")[0]}"
|
856
|
+
d(abyte3, ai1)
|
857
|
+
# puts "<br/>DEBUG q: abyte3=#{abyte3.unpack("H*")[0]}"
|
858
|
+
d(abyte3, ai)
|
859
|
+
# puts "<br/>DEBUG q: abyte3=#{abyte3.unpack("H*")[0]}"
|
860
|
+
d_(abyte3, abyte2, abyte1, j1)
|
861
|
+
# puts "<br/>DEBUG q: abyte3=#{abyte3.unpack("H*")[0]}"
|
862
|
+
# puts "<br/>DEBUG q: abyte2=#{abyte2.unpack("H*")[0]}"
|
863
|
+
# puts "<br/>DEBUG q: abyte1=#{abyte1.unpack("H*")[0]}"
|
864
|
+
abyte2[0, 8] = abyte0[i1, 8]
|
865
|
+
return
|
866
|
+
# else {
|
867
|
+
# D(abyte3, abyte2, abyte3, 0);
|
868
|
+
# d(abyte3, ai);
|
869
|
+
# d(abyte3, ai1);
|
870
|
+
# d(abyte3, ai2);
|
871
|
+
# System.arraycopy(abyte3, 0, abyte2, 0, 8);
|
872
|
+
# System.arraycopy(abyte3, 0, abyte1, j1, 8);
|
873
|
+
# return;
|
874
|
+
# }
|
875
|
+
else
|
876
|
+
d_(abyte3, abyte2, abyte3, 0);
|
877
|
+
d(abyte3, ai);
|
878
|
+
d(abyte3, ai1);
|
879
|
+
d(abyte3, ai2);
|
880
|
+
abyte2[0, 8] = abyte3[0, 8]
|
881
|
+
abyte1[j1, 8] = abyte3[0, 8]
|
882
|
+
return
|
883
|
+
end
|
884
|
+
# }
|
885
|
+
end
|
886
|
+
|
887
|
+
# private static int r(int i1, int j1, int k1) {
|
888
|
+
# return i1 & j1 | ~i1 & k1;
|
889
|
+
# }
|
890
|
+
def r(i1, j1, k1)
|
891
|
+
return i1 & j1 | ~i1 & k1
|
892
|
+
end
|
893
|
+
|
894
|
+
# private static int s(int i1, int j1, int k1) {
|
895
|
+
# return i1 & j1 | i1 & k1 | j1 & k1;
|
896
|
+
# }
|
897
|
+
def s(i1, j1, k1)
|
898
|
+
return i1 & j1 | i1 & k1 | j1 & k1
|
899
|
+
end
|
900
|
+
|
901
|
+
# static String hash(String s1) {
|
902
|
+
def hash(s1)
|
903
|
+
# if (s1 == null) {
|
904
|
+
# return null;
|
905
|
+
# }
|
906
|
+
if (s1 == nil)
|
907
|
+
return nil
|
908
|
+
end
|
909
|
+
# byte abyte0[];
|
910
|
+
# try {
|
911
|
+
# abyte0 = s1.getBytes("UTF8");
|
912
|
+
# }
|
913
|
+
# catch (UnsupportedEncodingException _ex) {
|
914
|
+
# return null;
|
915
|
+
# }
|
916
|
+
abyte0 = s1.dup
|
917
|
+
# byte abyte1[] = y(null, abyte0);
|
918
|
+
abyte1 = y(nil, abyte0)
|
919
|
+
# return z(abyte1);
|
920
|
+
return z(abyte1)
|
921
|
+
# }
|
922
|
+
end
|
923
|
+
|
924
|
+
# static String newControl(String s1, String s2, int i1, int j1) {
|
925
|
+
def new_control(s1, s2, i1, j1)
|
926
|
+
# if (s1 == null || s2 == null) {
|
927
|
+
# return "ZG_ENCRYPT_FAILED_BADINPUT";
|
928
|
+
# }
|
929
|
+
if (s1 == nil || s2 == nil)
|
930
|
+
return "ZG_ENCRYPT_FAILED_BADINPUT"
|
931
|
+
end
|
932
|
+
# int k1;
|
933
|
+
# if (i1 > 0) {
|
934
|
+
# k1 = i1;
|
935
|
+
# }
|
936
|
+
if (i1 > 0)
|
937
|
+
k1 = i1
|
938
|
+
# else
|
939
|
+
# if (j1 == 32) {
|
940
|
+
# k1 = 100;
|
941
|
+
# }
|
942
|
+
elsif (j1 == 32)
|
943
|
+
k1 = 100
|
944
|
+
# else
|
945
|
+
# if (j1 < 32 && j1 == s2.length()) {
|
946
|
+
# k1 = 100;
|
947
|
+
# }
|
948
|
+
elsif (j1 < 32 && j1 == s2.length())
|
949
|
+
k1 = 100
|
950
|
+
# else {
|
951
|
+
# byte abyte1[];
|
952
|
+
# try {
|
953
|
+
# abyte1 = s2.getBytes("UTF8");
|
954
|
+
# }
|
955
|
+
# catch (UnsupportedEncodingException _ex) {
|
956
|
+
# return "ZG_ENCRYPT_FAILED_MISC";
|
957
|
+
# }
|
958
|
+
# k1 = ( (abyte1.length + 10) / 8) * 16 + 4 + 14;
|
959
|
+
# }
|
960
|
+
else
|
961
|
+
abyte1 = s2.dup
|
962
|
+
k1 = ( (abyte1.length + 10) / 8) * 16 + 4 + 14
|
963
|
+
end
|
964
|
+
# int l1 = 1;
|
965
|
+
l1 = 1
|
966
|
+
# byte byte0 = 2;
|
967
|
+
byte0 = 2
|
968
|
+
# int i2 = k1 - 2 - l1 * 2;
|
969
|
+
i2 = k1 - 2 - l1 * 2
|
970
|
+
# if (i2 <= 0) {
|
971
|
+
# return "ZG_ENCRYPT_FAILED_SMALLBUF";
|
972
|
+
# }
|
973
|
+
if (i2 <= 0)
|
974
|
+
return "ZG_ENCRYPT_FAILED_SMALLBUF"
|
975
|
+
end
|
976
|
+
# int j2 = (i2 / 16) * 8;
|
977
|
+
j2 = (i2 / 16) * 8
|
978
|
+
# if (j2 <= 0) {
|
979
|
+
# return "ZG_ENCRYPT_FAILED_SMALLBUF";
|
980
|
+
# }
|
981
|
+
if (j2 <= 0)
|
982
|
+
return "ZG_ENCRYPT_FAILED_SMALLBUF"
|
983
|
+
end
|
984
|
+
# int k2 = (i2 % 16) / 2;
|
985
|
+
k2 = (i2 % 16) / 2
|
986
|
+
# int l2 = k2 + l1;
|
987
|
+
l2 = k2 + l1
|
988
|
+
# int i3 = j2 - 1 - byte0;
|
989
|
+
i3 = j2 - 1 - byte0
|
990
|
+
# if (i3 <= 0) {
|
991
|
+
# return "ZG_ENCRYPT_FAILED_SMALLBUF";
|
992
|
+
# }
|
993
|
+
if (i3 <= 0)
|
994
|
+
return "ZG_ENCRYPT_FAILED_SMALLBUF"
|
995
|
+
end
|
996
|
+
# byte abyte0[];
|
997
|
+
# byte abyte2[];
|
998
|
+
# try {
|
999
|
+
# abyte0 = s1.getBytes("UTF8");
|
1000
|
+
# abyte2 = s2.getBytes("UTF8");
|
1001
|
+
# }
|
1002
|
+
# catch (UnsupportedEncodingException _ex) {
|
1003
|
+
# return "ZG_ENCRYPT_FAILED_MISC";
|
1004
|
+
# }
|
1005
|
+
abyte0 = s1.dup
|
1006
|
+
abyte2 = s2.dup
|
1007
|
+
# int j3 = abyte0.length;
|
1008
|
+
j3 = abyte0.length
|
1009
|
+
# int k3 = abyte2.length;
|
1010
|
+
k3 = abyte2.length
|
1011
|
+
# if (k3 > i3) {
|
1012
|
+
# return "ZG_ENCRYPT_FAILED_CHARSET_CLIP";
|
1013
|
+
# }
|
1014
|
+
if (k3 > i3)
|
1015
|
+
return "ZG_ENCRYPT_FAILED_CHARSET_CLIP"
|
1016
|
+
end
|
1017
|
+
# Random random = new Random();
|
1018
|
+
# int ai[] = new int[l2];
|
1019
|
+
ai = [nil]*l2
|
1020
|
+
# for (int l3 = 0; l3 < l2; l3++) {
|
1021
|
+
# ai[l3] = random.nextInt();
|
1022
|
+
#
|
1023
|
+
# }
|
1024
|
+
for l3 in 0...l2
|
1025
|
+
ai[l3] = rand(2**32)-2**31
|
1026
|
+
end
|
1027
|
+
# byte abyte3[] = e(ai);
|
1028
|
+
abyte3 = e(ai)
|
1029
|
+
# ai = null;
|
1030
|
+
ai = nil
|
1031
|
+
# byte byte1 = byte0;
|
1032
|
+
byte1 = byte0
|
1033
|
+
# ai = new int[byte1];
|
1034
|
+
ai = [nil]*byte1
|
1035
|
+
# for (int i4 = 0; i4 < byte1; i4++) {
|
1036
|
+
# ai[i4] = random.nextInt();
|
1037
|
+
#
|
1038
|
+
# }
|
1039
|
+
for i4 in 0...byte1
|
1040
|
+
ai[i4] = rand(2**32)-2**31
|
1041
|
+
end
|
1042
|
+
# byte abyte4[] = e(ai);
|
1043
|
+
abyte4 = e(ai)
|
1044
|
+
# ai = null;
|
1045
|
+
ai = nil
|
1046
|
+
# int j4 = i3 - k3;
|
1047
|
+
j4 = i3 - k3
|
1048
|
+
# ai = new int[j4];
|
1049
|
+
ai = [nil]*j4
|
1050
|
+
# for (int k4 = 0; k4 < j4; k4++) {
|
1051
|
+
for k4 in 0...j4
|
1052
|
+
# if (k4 == 0) {
|
1053
|
+
# ai[k4] = 0;
|
1054
|
+
# }
|
1055
|
+
if (k4 == 0)
|
1056
|
+
ai[k4] = 0
|
1057
|
+
# else {
|
1058
|
+
# ai[k4] = random.nextInt();
|
1059
|
+
#
|
1060
|
+
# }
|
1061
|
+
else
|
1062
|
+
ai[k4] = rand(2**32)-2**31
|
1063
|
+
end
|
1064
|
+
# }
|
1065
|
+
end
|
1066
|
+
# byte abyte5[] = e(ai);
|
1067
|
+
abyte5 = e(ai)
|
1068
|
+
# ai = null;
|
1069
|
+
ai = nil
|
1070
|
+
# byte abyte6[] = new byte[byte1 + j4 + k3];
|
1071
|
+
abyte6 = "\0"*(byte1 + j4 + k3)
|
1072
|
+
# System.arraycopy(abyte4, 0, abyte6, 0, byte1);
|
1073
|
+
abyte6[0, byte1] = abyte4[0, byte1]
|
1074
|
+
# System.arraycopy(abyte2, 0, abyte6, byte1, k3);
|
1075
|
+
abyte6[byte1, k3] = abyte2[0, k3]
|
1076
|
+
# System.arraycopy(abyte5, 0, abyte6, byte1 + k3, j4);
|
1077
|
+
abyte6[byte1+k3, j4] = abyte5[0, j4]
|
1078
|
+
# byte abyte7[] = new byte[l2 + j3];
|
1079
|
+
abyte7 = "\0"*(l2 + j3)
|
1080
|
+
# System.arraycopy(abyte3, 0, abyte7, 0, l2);
|
1081
|
+
abyte7[0, l2] = abyte3[0, l2]
|
1082
|
+
# System.arraycopy(abyte0, 0, abyte7, l2, j3);
|
1083
|
+
abyte7[l2, j3] = abyte0[0, j3]
|
1084
|
+
# byte abyte8[] = i(null, abyte7, abyte6);
|
1085
|
+
abyte8 = i(nil, abyte7, abyte6)
|
1086
|
+
# if (abyte8 == null) {
|
1087
|
+
# return "ZG_ENCRYPT_FAILED_MISC";
|
1088
|
+
# }
|
1089
|
+
if (abyte8 == nil)
|
1090
|
+
return "ZG_ENCRYPT_FAILED_MISC"
|
1091
|
+
# else {
|
1092
|
+
# byte abyte9[] = new byte[abyte8.length + l2];
|
1093
|
+
# System.arraycopy(abyte8, 0, abyte9, 0, abyte8.length);
|
1094
|
+
# System.arraycopy(abyte3, 0, abyte9, abyte8.length, l2);
|
1095
|
+
# String s3 = z(abyte9);
|
1096
|
+
# return "ZG" + s3;
|
1097
|
+
# }
|
1098
|
+
else
|
1099
|
+
abyte9 = "\0"*(abyte8.length + l2)
|
1100
|
+
abyte9[0, abyte8.length] = abyte8[0, abyte8.length]
|
1101
|
+
abyte9[abyte8.length, l2] = abyte3[0, l2]
|
1102
|
+
s3 = z(abyte9)
|
1103
|
+
return "ZG" + s3
|
1104
|
+
end
|
1105
|
+
# }
|
1106
|
+
end
|
1107
|
+
|
1108
|
+
# private static void t(byte abyte0[], int ai[]) {
|
1109
|
+
def t(abyte0, ai)
|
1110
|
+
# int i1 = 0;
|
1111
|
+
i1 = 0
|
1112
|
+
# ai[0] = (abyte0[i1] & 0xff) << 24;
|
1113
|
+
ai[0] = ((abyte0[i1] & 0xff) << 24) & 0xffffffff
|
1114
|
+
# i1++;
|
1115
|
+
i1 += 1
|
1116
|
+
# ai[0] |= (abyte0[i1] & 0xff) << 16;
|
1117
|
+
ai[0] |= ((abyte0[i1] & 0xff) << 16) & 0xffffffff
|
1118
|
+
# i1++;
|
1119
|
+
i1 += 1
|
1120
|
+
# ai[0] |= (abyte0[i1] & 0xff) << 8;
|
1121
|
+
ai[0] |= ((abyte0[i1] & 0xff) << 8) & 0xffffffff
|
1122
|
+
# i1++;
|
1123
|
+
i1 += 1
|
1124
|
+
# ai[0] |= abyte0[i1] & 0xff;
|
1125
|
+
ai[0] |= abyte0[i1] & 0xff
|
1126
|
+
# i1++;
|
1127
|
+
i1 += 1
|
1128
|
+
# ai[1] = (abyte0[i1] & 0xff) << 24;
|
1129
|
+
ai[1] = ((abyte0[i1] & 0xff) << 24) & 0xffffffff
|
1130
|
+
# i1++;
|
1131
|
+
i1 += 1
|
1132
|
+
# ai[1] |= (abyte0[i1] & 0xff) << 16;
|
1133
|
+
ai[1] |= ((abyte0[i1] & 0xff) << 16) & 0xffffffff
|
1134
|
+
# i1++;
|
1135
|
+
i1 += 1
|
1136
|
+
# ai[1] |= (abyte0[i1] & 0xff) << 8;
|
1137
|
+
ai[1] |= ((abyte0[i1] & 0xff) << 8) & 0xffffffff
|
1138
|
+
# i1++;
|
1139
|
+
i1 += 1
|
1140
|
+
# ai[1] |= abyte0[i1] & 0xff;
|
1141
|
+
ai[1] |= abyte0[i1] & 0xff
|
1142
|
+
# }
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
# private static int u(int ai[], int ai1[]) {
|
1146
|
+
def u(ai, ai1)
|
1147
|
+
# boolean flag = false;
|
1148
|
+
flag = false
|
1149
|
+
# boolean flag1 = false;
|
1150
|
+
flag1 = false
|
1151
|
+
# int ai2[] = new int[80];
|
1152
|
+
ai2 = [nil]*80
|
1153
|
+
# int l1 = 0;
|
1154
|
+
l1 = 0
|
1155
|
+
# int ai3[] = new int[5];
|
1156
|
+
ai3 = [nil]*5
|
1157
|
+
# int ai4[] = new int[6];
|
1158
|
+
ai4 = [nil]*6
|
1159
|
+
# int ai5[] = new int[5];
|
1160
|
+
ai5 = [nil]*5
|
1161
|
+
# ai3[0] = 0x67452301;
|
1162
|
+
# ai3[1] = 0xefcdab89;
|
1163
|
+
# ai3[2] = 0x98badcfe;
|
1164
|
+
# ai3[3] = 0x10325476;
|
1165
|
+
# ai3[4] = 0xc3d2e1f0;
|
1166
|
+
ai3[0] = 0x67452301
|
1167
|
+
ai3[1] = 0xefcdab89
|
1168
|
+
ai3[2] = 0x98badcfe
|
1169
|
+
ai3[3] = 0x10325476
|
1170
|
+
ai3[4] = 0xc3d2e1f0
|
1171
|
+
# if (ai1 != null) {
|
1172
|
+
if (ai1 != nil)
|
1173
|
+
# if (ai != null) {
|
1174
|
+
# System.arraycopy(ai, 0, ai4, 0, 5);
|
1175
|
+
# }
|
1176
|
+
if (ai != nil)
|
1177
|
+
ai4[0, 5] = ai[0, 5]
|
1178
|
+
end
|
1179
|
+
# byte byte0 = 80;
|
1180
|
+
byte0 = 80
|
1181
|
+
# int i1;
|
1182
|
+
# for (i1 = 0; i1 < 16; i1++) {
|
1183
|
+
# ai2[i1] = ai1[i1];
|
1184
|
+
#
|
1185
|
+
# }
|
1186
|
+
for i1 in 0...16
|
1187
|
+
ai2[i1] = ai1[i1]
|
1188
|
+
end
|
1189
|
+
# for (; i1 < byte0; i1++) {
|
1190
|
+
# ai2[i1] = ai2[i1 - 3] ^ ai2[i1 - 8] ^ ai2[i1 - 14] ^ ai2[i1 - 16];
|
1191
|
+
#
|
1192
|
+
# }
|
1193
|
+
while (i1 < byte0)
|
1194
|
+
ai2[i1] = ai2[i1 - 3] ^ ai2[i1 - 8] ^ ai2[i1 - 14] ^ ai2[i1 - 16]
|
1195
|
+
i1 += 1
|
1196
|
+
end
|
1197
|
+
# for (int j1 = 0; j1 < 80; j1++) {
|
1198
|
+
for j1 in 0...80
|
1199
|
+
# if (j1 != 0) {
|
1200
|
+
# System.arraycopy(ai4, 0, ai5, 0, 5);
|
1201
|
+
# ai4[0] = ai5[4];
|
1202
|
+
# ai4[1] = ai5[0];
|
1203
|
+
# ai4[2] = ai5[1];
|
1204
|
+
# ai4[3] = ai5[2];
|
1205
|
+
# ai4[4] = ai5[3];
|
1206
|
+
# }
|
1207
|
+
if (j1 != 0)
|
1208
|
+
ai5[0, 5] = ai4[0, 5]
|
1209
|
+
ai4[0] = ai5[4];
|
1210
|
+
ai4[1] = ai5[0];
|
1211
|
+
ai4[2] = ai5[1];
|
1212
|
+
ai4[3] = ai5[2];
|
1213
|
+
ai4[4] = ai5[3];
|
1214
|
+
end
|
1215
|
+
# ai4[5] = ai2[j1];
|
1216
|
+
ai4[5] = ai2[j1]
|
1217
|
+
# if (j1 < 20) {
|
1218
|
+
# H(ai4);
|
1219
|
+
# }
|
1220
|
+
if (j1 < 20)
|
1221
|
+
h_(ai4)
|
1222
|
+
# else
|
1223
|
+
# if (j1 < 40) {
|
1224
|
+
# I(ai4);
|
1225
|
+
# }
|
1226
|
+
elsif (j1 < 40)
|
1227
|
+
i_(ai4)
|
1228
|
+
# else
|
1229
|
+
# if (j1 < 60) {
|
1230
|
+
# c(ai4);
|
1231
|
+
# }
|
1232
|
+
elsif (j1 < 60)
|
1233
|
+
c(ai4)
|
1234
|
+
# else
|
1235
|
+
# if (j1 < 80) {
|
1236
|
+
# h(ai4);
|
1237
|
+
# }
|
1238
|
+
elsif (j1 < 80)
|
1239
|
+
h(ai4)
|
1240
|
+
end
|
1241
|
+
# }
|
1242
|
+
end
|
1243
|
+
#
|
1244
|
+
# ai3[0] = ai4[4];
|
1245
|
+
# ai3[1] = ai4[0];
|
1246
|
+
# ai3[2] = ai4[1];
|
1247
|
+
# ai3[3] = ai4[2];
|
1248
|
+
# ai3[4] = ai4[3];
|
1249
|
+
ai3[0] = ai4[4];
|
1250
|
+
ai3[1] = ai4[0];
|
1251
|
+
ai3[2] = ai4[1];
|
1252
|
+
ai3[3] = ai4[2];
|
1253
|
+
ai3[4] = ai4[3];
|
1254
|
+
# for (int k1 = 0; k1 < byte0; k1++) {
|
1255
|
+
# ai2[k1] = 0;
|
1256
|
+
#
|
1257
|
+
# }
|
1258
|
+
for k1 in 0...byte0
|
1259
|
+
ai2[k1] = 0
|
1260
|
+
end
|
1261
|
+
# }
|
1262
|
+
end
|
1263
|
+
# if (ai != null) {
|
1264
|
+
# ai[0] = ai3[0];
|
1265
|
+
# ai[1] = ai3[1];
|
1266
|
+
# ai[2] = ai3[2];
|
1267
|
+
# ai[3] = ai3[3];
|
1268
|
+
# ai[4] = ai3[4];
|
1269
|
+
# }
|
1270
|
+
if (ai != nil)
|
1271
|
+
ai[0] = ai3[0];
|
1272
|
+
ai[1] = ai3[1];
|
1273
|
+
ai[2] = ai3[2];
|
1274
|
+
ai[3] = ai3[3];
|
1275
|
+
ai[4] = ai3[4];
|
1276
|
+
end
|
1277
|
+
# l1 = ai3[0] ^ ai3[1] ^ ai3[2] ^ ai3[3] ^ ai3[4];
|
1278
|
+
l1 = ai3[0] ^ ai3[1] ^ ai3[2] ^ ai3[3] ^ ai3[4]
|
1279
|
+
# return l1;
|
1280
|
+
return l1
|
1281
|
+
# }
|
1282
|
+
end
|
1283
|
+
|
1284
|
+
# private static byte[] v(byte abyte0[], byte abyte1[], byte abyte2[]) {
|
1285
|
+
# return g(y(abyte0, abyte1), abyte2);
|
1286
|
+
# }
|
1287
|
+
def v(abyte0, abyte1, abyte2)
|
1288
|
+
return g(y(abyte0, abyte1), abyte2)
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
# private static String w(String s1, int i1, boolean flag) {
|
1292
|
+
def w(s1, i1, flag)
|
1293
|
+
# if (s1 == null) {
|
1294
|
+
# return "";
|
1295
|
+
# }
|
1296
|
+
if (s1 == nil)
|
1297
|
+
return ""
|
1298
|
+
end
|
1299
|
+
# int j1 = s1.length();
|
1300
|
+
# TODO: should String be converted to Ruby Unicode chars string?
|
1301
|
+
j1 = s1.length
|
1302
|
+
# int k1 = s1.indexOf('\0');
|
1303
|
+
k1 = s1.index("\0")
|
1304
|
+
# if (k1 > -1) {
|
1305
|
+
# j1 = k1;
|
1306
|
+
# }
|
1307
|
+
if (k1 > -1)
|
1308
|
+
j1 = k1
|
1309
|
+
end
|
1310
|
+
# int l1;
|
1311
|
+
# if (j1 > i1 && i1 > 0) {
|
1312
|
+
# l1 = i1;
|
1313
|
+
# }
|
1314
|
+
if (j1 > i1 && i1 > 0)
|
1315
|
+
l1 = i1
|
1316
|
+
# else {
|
1317
|
+
# l1 = j1;
|
1318
|
+
# }
|
1319
|
+
else
|
1320
|
+
l1 = j1
|
1321
|
+
end
|
1322
|
+
# if (flag) {
|
1323
|
+
# return new String(s1.substring(0, l1).toUpperCase(Locale.US));
|
1324
|
+
# }
|
1325
|
+
if (flag)
|
1326
|
+
# TODO: should we do Unicode upcase?
|
1327
|
+
return s1[0, l1].upcase
|
1328
|
+
# else {
|
1329
|
+
# return new String(s1.substring(0, l1));
|
1330
|
+
# }
|
1331
|
+
else
|
1332
|
+
return s1[0, l1]
|
1333
|
+
end
|
1334
|
+
# }
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
# private static void x(int ai[], byte abyte0[]) {
|
1338
|
+
def x(ai, abyte0)
|
1339
|
+
# int i1 = 0;
|
1340
|
+
i1 = 0
|
1341
|
+
# abyte0[i1] = (byte) (ai[0] >> 24 & 0xff);
|
1342
|
+
abyte0[i1] = (ai[0] >> 24 & 0xff)
|
1343
|
+
# i1++;
|
1344
|
+
i1 += 1
|
1345
|
+
# abyte0[i1] = (byte) (ai[0] >> 16 & 0xff);
|
1346
|
+
abyte0[i1] = (ai[0] >> 16 & 0xff)
|
1347
|
+
# i1++;
|
1348
|
+
i1 += 1
|
1349
|
+
# abyte0[i1] = (byte) (ai[0] >> 8 & 0xff);
|
1350
|
+
abyte0[i1] = (ai[0] >> 8 & 0xff)
|
1351
|
+
# i1++;
|
1352
|
+
i1 += 1
|
1353
|
+
# abyte0[i1] = (byte) (ai[0] & 0xff);
|
1354
|
+
abyte0[i1] = (ai[0] & 0xff)
|
1355
|
+
# i1++;
|
1356
|
+
i1 += 1
|
1357
|
+
# abyte0[i1] = (byte) (ai[1] >> 24 & 0xff);
|
1358
|
+
abyte0[i1] = (ai[1] >> 24 & 0xff)
|
1359
|
+
# i1++;
|
1360
|
+
i1 += 1
|
1361
|
+
# abyte0[i1] = (byte) (ai[1] >> 16 & 0xff);
|
1362
|
+
abyte0[i1] = (ai[1] >> 16 & 0xff)
|
1363
|
+
# i1++;
|
1364
|
+
i1 += 1
|
1365
|
+
# abyte0[i1] = (byte) (ai[1] >> 8 & 0xff);
|
1366
|
+
abyte0[i1] = (ai[1] >> 8 & 0xff)
|
1367
|
+
# i1++;
|
1368
|
+
i1 += 1
|
1369
|
+
# abyte0[i1] = (byte) (ai[1] & 0xff);
|
1370
|
+
abyte0[i1] = (ai[1] & 0xff)
|
1371
|
+
# }
|
1372
|
+
end
|
1373
|
+
|
1374
|
+
# static String oldCheck(String s1, String s2, boolean flag) {
|
1375
|
+
def old_check(s1, s2, flag)
|
1376
|
+
# byte abyte0[] = A(s1.toCharArray());
|
1377
|
+
abyte0 = a_(s1.dup)
|
1378
|
+
# byte abyte1[] = p(s2);
|
1379
|
+
abyte1 = p(s2)
|
1380
|
+
# byte abyte2[] = k(abyte0, abyte1, abyte1.length);
|
1381
|
+
abyte2 = k(abyte0, abyte1, abyte1.length)
|
1382
|
+
# char ac[] = m(abyte2);
|
1383
|
+
ac = m(abyte2)
|
1384
|
+
# if (ac != null) {
|
1385
|
+
# String s3 = new String(ac);
|
1386
|
+
# return w(s3, 0, flag);
|
1387
|
+
# }
|
1388
|
+
if (ac != nil)
|
1389
|
+
s3 = ac.to_s
|
1390
|
+
# else {
|
1391
|
+
# return null;
|
1392
|
+
# }
|
1393
|
+
else
|
1394
|
+
return nil
|
1395
|
+
end
|
1396
|
+
# }
|
1397
|
+
end
|
1398
|
+
|
1399
|
+
# private static byte[] y(byte abyte0[], byte abyte1[]) {
|
1400
|
+
def y(abyte0, abyte1)
|
1401
|
+
# puts "<br/>DEBUG y: abyte0=#{abyte0.nil? ? "nil" : abyte0.unpack("H*")[0]}"
|
1402
|
+
# puts "<br/>DEBUG y: abyte1=#{abyte1.nil? ? "nil" : abyte1.unpack("H*")[0]}"
|
1403
|
+
# byte abyte2[] = new byte[32];
|
1404
|
+
abyte2 = "\0"*32
|
1405
|
+
# MessageDigest messagedigest;
|
1406
|
+
# try {
|
1407
|
+
# messagedigest = MessageDigest.getInstance("SHA");
|
1408
|
+
# }
|
1409
|
+
# catch (NoSuchAlgorithmException _ex) {
|
1410
|
+
# return null;
|
1411
|
+
# }
|
1412
|
+
messagedigest = Digest::SHA1.new
|
1413
|
+
# messagedigest.reset();
|
1414
|
+
messagedigest.reset
|
1415
|
+
# byte byte0 = 20;
|
1416
|
+
byte0 = 20
|
1417
|
+
# if (abyte0 != null && abyte0.length > 0) {
|
1418
|
+
# messagedigest.update(abyte0);
|
1419
|
+
# }
|
1420
|
+
if (abyte0 != nil && abyte0.length > 0)
|
1421
|
+
messagedigest.update(abyte0)
|
1422
|
+
end
|
1423
|
+
# if (abyte1 != null && abyte1.length > 0) {
|
1424
|
+
# messagedigest.update(abyte1);
|
1425
|
+
# }
|
1426
|
+
if (abyte1 != nil && abyte1.length > 0)
|
1427
|
+
messagedigest.update(abyte1)
|
1428
|
+
end
|
1429
|
+
# messagedigest.update( (byte) 1);
|
1430
|
+
messagedigest.update(1.chr)
|
1431
|
+
# byte abyte3[] = messagedigest.digest();
|
1432
|
+
abyte3 = messagedigest.digest
|
1433
|
+
# puts "<br/>DEBUG y: abyte3=#{abyte3.nil? ? "nil" : abyte3.unpack("H*")[0]}"
|
1434
|
+
# System.arraycopy(abyte3, 0, abyte2, 0, byte0);
|
1435
|
+
abyte2[0, byte0] = abyte3[0, byte0]
|
1436
|
+
# messagedigest.reset();
|
1437
|
+
messagedigest.reset()
|
1438
|
+
# if (abyte0 != null && abyte0.length > 0) {
|
1439
|
+
# messagedigest.update(abyte0);
|
1440
|
+
# }
|
1441
|
+
if (abyte0 != nil && abyte0.length > 0)
|
1442
|
+
messagedigest.update(abyte0)
|
1443
|
+
end
|
1444
|
+
# if (abyte1 != null && abyte1.length > 0) {
|
1445
|
+
# messagedigest.update(abyte1);
|
1446
|
+
# }
|
1447
|
+
if (abyte1 != nil && abyte1.length > 0)
|
1448
|
+
messagedigest.update(abyte1)
|
1449
|
+
end
|
1450
|
+
# messagedigest.update( (byte) 2);
|
1451
|
+
messagedigest.update( 2.chr )
|
1452
|
+
# abyte3 = messagedigest.digest();
|
1453
|
+
abyte3 = messagedigest.digest
|
1454
|
+
# System.arraycopy(abyte3, 0, abyte2, byte0, 32 - byte0);
|
1455
|
+
abyte2[byte0, 32 - byte0] = abyte3[0, 32 - byte0]
|
1456
|
+
# return abyte2;
|
1457
|
+
# puts "<br/>DEBUG y: abyte2=#{abyte2.unpack("H*")[0]}"
|
1458
|
+
return abyte2
|
1459
|
+
# }
|
1460
|
+
end
|
1461
|
+
|
1462
|
+
# private static String z(byte abyte0[]) {
|
1463
|
+
def z(abyte0)
|
1464
|
+
# # if (abyte0 == null) {
|
1465
|
+
# # return null;
|
1466
|
+
# # }
|
1467
|
+
# if (abyte0 == nil)
|
1468
|
+
# return nil
|
1469
|
+
# end
|
1470
|
+
# # String s1 = "0123456789ABCDEF";
|
1471
|
+
# s1 = "0123456789ABCDEF"
|
1472
|
+
# # StringBuffer stringbuffer = new StringBuffer(abyte0.length * 2);
|
1473
|
+
# stringbuffer = ""
|
1474
|
+
# # int i1 = 0;
|
1475
|
+
# i1 = 0
|
1476
|
+
# # for (int j1 = abyte0.length; j1 > 0; ) {
|
1477
|
+
# j1 = abyte0.length
|
1478
|
+
# while (j1 > 0)
|
1479
|
+
# # byte byte0 = abyte0[i1];
|
1480
|
+
# byte0 = abyte0[i1]
|
1481
|
+
# # stringbuffer.append(s1.charAt(byte0 >> 4 & 0xf));
|
1482
|
+
# stringbuffer << s1[byte0 >> 4 & 0xf]
|
1483
|
+
# # stringbuffer.append(s1.charAt(byte0 & 0xf));
|
1484
|
+
# stringbuffer << s1[byte0 & 0xf]
|
1485
|
+
# # j1--;
|
1486
|
+
# j1 -= 1
|
1487
|
+
# # i1++;
|
1488
|
+
# i1 += 1
|
1489
|
+
# # }
|
1490
|
+
# end
|
1491
|
+
# #
|
1492
|
+
# # return stringbuffer.toString();
|
1493
|
+
# return stringbuffer
|
1494
|
+
# # }
|
1495
|
+
abyte0.unpack("H*")[0].upcase
|
1496
|
+
end
|
1497
|
+
|
1498
|
+
# private static byte[] A(char ac[]) {
|
1499
|
+
def a_(ac)
|
1500
|
+
# RSI: if we receive String then return the same value (as it should already be in UTF-8)
|
1501
|
+
return ac if ac.is_a? String
|
1502
|
+
# byte abyte0[] = new byte[ac.length * 3];
|
1503
|
+
abyte0 = "\0"*(ac.length * 3)
|
1504
|
+
# int i1 = 0;
|
1505
|
+
i1 = 0
|
1506
|
+
# boolean flag = false;
|
1507
|
+
flag = false
|
1508
|
+
# for (int j1 = 0; j1 < ac.length; j1++) {
|
1509
|
+
for j1 in 0...ac.length
|
1510
|
+
# char c1 = ac[j1];
|
1511
|
+
c1 = ac[j1]
|
1512
|
+
# if (c1 >= 0 && c1 <= '\177') {
|
1513
|
+
# abyte0[i1++] = (byte) (c1 & 0x7f);
|
1514
|
+
# }
|
1515
|
+
if (c1 >= 0 && c1 <= 0177)
|
1516
|
+
abyte0[i1] = (c1 & 0x7f)
|
1517
|
+
i1 += 1
|
1518
|
+
# else
|
1519
|
+
# if (c1 >= '\200' && c1 <= '\u07FF') {
|
1520
|
+
# abyte0[i1++] = (byte) ( (c1 & 0x7c0) >> 6 | 0xc0);
|
1521
|
+
# abyte0[i1++] = (byte) (c1 & 0x3f | 0x80);
|
1522
|
+
# }
|
1523
|
+
elsif (c1 >= 0200 && c1 <= 0x07FF)
|
1524
|
+
abyte0[i1] = ( (c1 & 0x7c0) >> 6 | 0xc0)
|
1525
|
+
i1 += 1
|
1526
|
+
abyte0[i1] = (c1 & 0x3f | 0x80)
|
1527
|
+
i1 += 1
|
1528
|
+
# else
|
1529
|
+
# if (c1 >= '\u0800' && c1 <= '\uFFFF') {
|
1530
|
+
# abyte0[i1++] = (byte) ( (c1 & 0xf000) >> 12 | 0xe0);
|
1531
|
+
# abyte0[i1++] = (byte) ( (c1 & 0xfc0) >> 6 | 0x80);
|
1532
|
+
# abyte0[i1++] = (byte) (c1 & 0x3f | 0x80);
|
1533
|
+
# }
|
1534
|
+
elsif (c1 >= 0x0800 && c1 <= 0xFFFF)
|
1535
|
+
abyte0[i1] = ( (c1 & 0xf000) >> 12 | 0xe0)
|
1536
|
+
i1 += 1
|
1537
|
+
abyte0[i1] = ( (c1 & 0xfc0) >> 6 | 0x80)
|
1538
|
+
i1 += 1
|
1539
|
+
abyte0[i1] = (c1 & 0x3f | 0x80)
|
1540
|
+
i1 += 1
|
1541
|
+
end
|
1542
|
+
# }
|
1543
|
+
end
|
1544
|
+
#
|
1545
|
+
# byte abyte1[] = new byte[i1];
|
1546
|
+
abyte1 = "\0"*i1
|
1547
|
+
# System.arraycopy(abyte0, 0, abyte1, 0, i1);
|
1548
|
+
abyte1[0, i1] = abyte0[0, i1]
|
1549
|
+
# return abyte1;
|
1550
|
+
abyte1
|
1551
|
+
# }
|
1552
|
+
end
|
1553
|
+
|
1554
|
+
# private static void B(byte abyte0[], byte abyte1[], byte abyte2[], int i1) {
|
1555
|
+
def b_(abyte0, abyte1, abyte2, i1)
|
1556
|
+
# if (abyte0 == null) {
|
1557
|
+
if (abyte0 == nil)
|
1558
|
+
# if (i1 > 0 && abyte1 != null && abyte2 != null) {
|
1559
|
+
if (i1 > 0 && abyte1 != nil && abyte2 != nil)
|
1560
|
+
# for (int j1 = 0; j1 < i1; j1++) {
|
1561
|
+
# abyte2[j1] = abyte1[j1];
|
1562
|
+
#
|
1563
|
+
# }
|
1564
|
+
for j1 in 0...i1
|
1565
|
+
abyte2[j1] = abyte1[j1]
|
1566
|
+
end
|
1567
|
+
# return;
|
1568
|
+
return
|
1569
|
+
# }
|
1570
|
+
end
|
1571
|
+
# }
|
1572
|
+
# else {
|
1573
|
+
# if (abyte2 == null) {
|
1574
|
+
else
|
1575
|
+
if (abyte2 == nil)
|
1576
|
+
# for (int k1 = 0; k1 < 256; k1++) {
|
1577
|
+
# abyte0[k1] = (byte) k1;
|
1578
|
+
#
|
1579
|
+
# }
|
1580
|
+
for k1 in 0...256
|
1581
|
+
abyte0[k1] = k1
|
1582
|
+
end
|
1583
|
+
# if (abyte1 != null && i1 > 0) {
|
1584
|
+
if (abyte1 != nil && i1 > 0)
|
1585
|
+
# int j2 = 0;
|
1586
|
+
j2 = 0
|
1587
|
+
# int l2 = 0;
|
1588
|
+
l2 = 0
|
1589
|
+
# for (int l1 = 0; l1 < 256; l1++) {
|
1590
|
+
# int j3 = (new Byte(abyte0[l1])).intValue() & 0xff;
|
1591
|
+
# j2 = j2 + j3 + ( (new Byte(abyte1[l2])).intValue() & 0xff) & 0xff;
|
1592
|
+
# abyte0[l1] = abyte0[j2];
|
1593
|
+
# abyte0[j2] = (new Integer(j3 & 0xff)).byteValue();
|
1594
|
+
# l2 = (l2 + 1) % i1;
|
1595
|
+
# }
|
1596
|
+
for l1 in 0...256
|
1597
|
+
j3 = abyte0[l1] & 0xff
|
1598
|
+
j2 = j2 + j3 + ( abyte1[l2] & 0xff) & 0xff
|
1599
|
+
abyte0[l1] = abyte0[j2]
|
1600
|
+
abyte0[j2] = j3 & 0xff
|
1601
|
+
l2 = (l2 + 1) % i1
|
1602
|
+
end
|
1603
|
+
#
|
1604
|
+
# }
|
1605
|
+
end
|
1606
|
+
# abyte0[256] = 0;
|
1607
|
+
abyte0[256] = 0
|
1608
|
+
# abyte0[257] = 0;
|
1609
|
+
abyte0[257] = 0
|
1610
|
+
# return;
|
1611
|
+
return
|
1612
|
+
# }
|
1613
|
+
end
|
1614
|
+
# int i2 = (new Byte(abyte0[256])).intValue() & 0xff;
|
1615
|
+
i2 = abyte0[256] & 0xff
|
1616
|
+
# int k2 = (new Byte(abyte0[257])).intValue() & 0xff;
|
1617
|
+
k2 = abyte0[257] & 0xff
|
1618
|
+
# for (int i3 = 0; i3 < i1; i3++) {
|
1619
|
+
for i3 in 0...i1
|
1620
|
+
# i2 = i2 + 1 & 0xff;
|
1621
|
+
i2 = i2 + 1 & 0xff
|
1622
|
+
# int k3 = (new Byte(abyte0[i2])).intValue() & 0xff;
|
1623
|
+
k3 = abyte0[i2] & 0xff
|
1624
|
+
# k2 = k2 + k3 & 0xff;
|
1625
|
+
k2 = k2 + k3 & 0xff
|
1626
|
+
# abyte0[i2] = abyte0[k2];
|
1627
|
+
abyte0[i2] = abyte0[k2]
|
1628
|
+
# abyte0[k2] = (new Integer(k3 & 0xff)).byteValue();
|
1629
|
+
abyte0[k2] = k3 & 0xff
|
1630
|
+
# k3 += (new Byte(abyte0[i2])).intValue() & 0xff;
|
1631
|
+
k3 += abyte0[i2] & 0xff
|
1632
|
+
# abyte2[i3] = (byte) (abyte1[i3] ^ abyte0[k3 & 0xff]);
|
1633
|
+
abyte2[i3] = (abyte1[i3] ^ abyte0[k3 & 0xff])
|
1634
|
+
# new String("");
|
1635
|
+
""
|
1636
|
+
# }
|
1637
|
+
end
|
1638
|
+
#
|
1639
|
+
# abyte0[256] = (byte) (i2 & 0xff);
|
1640
|
+
abyte0[256] = (i2 & 0xff)
|
1641
|
+
# abyte0[257] = (byte) (k2 & 0xff);
|
1642
|
+
abyte0[257] = (k2 & 0xff)
|
1643
|
+
# }
|
1644
|
+
end
|
1645
|
+
# }
|
1646
|
+
end
|
1647
|
+
|
1648
|
+
# static boolean check(String s1, String s2, boolean flag) {
|
1649
|
+
def check(s1, s2, flag)
|
1650
|
+
return true if decrypt(s1, s2, flag)
|
1651
|
+
false
|
1652
|
+
end
|
1653
|
+
|
1654
|
+
def decrypt(s1, s2, flag)
|
1655
|
+
# String cid;
|
1656
|
+
# if (s2 != null && s2.length() > 0) {
|
1657
|
+
if (s2 != nil && s2.length() > 0)
|
1658
|
+
# if (s2.substring(0, 2).equals("ZG")) {
|
1659
|
+
# cid = newCheck(s1, s2, flag);
|
1660
|
+
# }
|
1661
|
+
if (s2[0, 2] == "ZG")
|
1662
|
+
# EBEI: Upcase case-insensitive passwords
|
1663
|
+
cid = new_check(s1.mb_chars.upcase.to_s, s2, flag)
|
1664
|
+
# EBEI: Support case sensitive passwords in R12
|
1665
|
+
elsif s2[0, 2] == "ZH"
|
1666
|
+
cid = new_check(s1, s2.gsub(/^ZH/, 'ZG'), flag)
|
1667
|
+
# else {
|
1668
|
+
# cid= oldCheck(s1, s2, flag);
|
1669
|
+
# }
|
1670
|
+
else
|
1671
|
+
cid = old_check(s1, s2, flag)
|
1672
|
+
end
|
1673
|
+
# }
|
1674
|
+
# else {
|
1675
|
+
# return false;
|
1676
|
+
# }
|
1677
|
+
else
|
1678
|
+
return false
|
1679
|
+
end
|
1680
|
+
# if (cid==null) {
|
1681
|
+
# return false;
|
1682
|
+
# } else {
|
1683
|
+
# return true;
|
1684
|
+
# }
|
1685
|
+
return cid
|
1686
|
+
# }
|
1687
|
+
end
|
1688
|
+
|
1689
|
+
# private static int[] C(int ai[]) {
|
1690
|
+
def c_(ai)
|
1691
|
+
# int ai1[] = new int[32];
|
1692
|
+
ai1 = [nil]*32
|
1693
|
+
# int ai2[] = ai;
|
1694
|
+
ai2 = ai
|
1695
|
+
# int i1 = 0;
|
1696
|
+
i1 = 0
|
1697
|
+
# boolean flag = false;
|
1698
|
+
flag = false
|
1699
|
+
# int k1 = 0;
|
1700
|
+
k1 = 0
|
1701
|
+
# int l1 = 0;
|
1702
|
+
l1 = 0
|
1703
|
+
# while (i1 < 16) {
|
1704
|
+
while (i1 < 16)
|
1705
|
+
# int j1 = k1++;
|
1706
|
+
j1 = k1
|
1707
|
+
k1 += 1
|
1708
|
+
# ai1[l1] = (ai2[j1] & 0xfc0000) << 6;
|
1709
|
+
ai1[l1] = (ai2[j1] & 0xfc0000) << 6
|
1710
|
+
# ai1[l1] |= (ai2[j1] & 0xfc0) << 10;
|
1711
|
+
ai1[l1] |= (ai2[j1] & 0xfc0) << 10
|
1712
|
+
# ai1[l1] |= (ai[k1] & 0xfc0000) >> 10;
|
1713
|
+
ai1[l1] |= (ai[k1] & 0xfc0000) >> 10
|
1714
|
+
# ai1[l1] |= (ai[k1] & 0xfc0) >> 6;
|
1715
|
+
ai1[l1] |= (ai[k1] & 0xfc0) >> 6
|
1716
|
+
# l1++;
|
1717
|
+
l1 += 1
|
1718
|
+
# ai1[l1] = (ai2[j1] & 0x3f000) << 12;
|
1719
|
+
ai1[l1] = (ai2[j1] & 0x3f000) << 12
|
1720
|
+
# ai1[l1] |= (ai2[j1] & 0x3f) << 16;
|
1721
|
+
ai1[l1] |= (ai2[j1] & 0x3f) << 16
|
1722
|
+
# ai1[l1] |= (ai[k1] & 0x3f000) >> 4;
|
1723
|
+
ai1[l1] |= (ai[k1] & 0x3f000) >> 4
|
1724
|
+
# ai1[l1] |= ai[k1] & 0x3f;
|
1725
|
+
ai1[l1] |= ai[k1] & 0x3f
|
1726
|
+
# l1++;
|
1727
|
+
l1 += 1
|
1728
|
+
# i1++;
|
1729
|
+
i1 += 1
|
1730
|
+
# k1++;
|
1731
|
+
k1 += 1
|
1732
|
+
# }
|
1733
|
+
end
|
1734
|
+
# return ai1;
|
1735
|
+
return ai1
|
1736
|
+
# }
|
1737
|
+
end
|
1738
|
+
|
1739
|
+
# private static void D(byte abyte0[], byte abyte1[], byte abyte2[], int i1) {
|
1740
|
+
def d_(abyte0, abyte1, abyte2, i1)
|
1741
|
+
# for (int j1 = 0; j1 < 8; j1++) {
|
1742
|
+
# abyte2[j1 + i1] = (byte) (abyte0[j1] ^ abyte1[j1]);
|
1743
|
+
#
|
1744
|
+
# }
|
1745
|
+
for j1 in 0...8
|
1746
|
+
abyte2[j1 + i1] = (abyte0[j1] ^ abyte1[j1])
|
1747
|
+
end
|
1748
|
+
# }
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
# private static void E(String s1) {
|
1752
|
+
# }
|
1753
|
+
def e_(s1)
|
1754
|
+
end
|
1755
|
+
|
1756
|
+
# private static void F(int ai[], int ai1[]) {
|
1757
|
+
def f_(ai, ai1)
|
1758
|
+
# int j2 = 0;
|
1759
|
+
j2 = 0
|
1760
|
+
# int l1 = ai[0];
|
1761
|
+
l1 = ai[0]
|
1762
|
+
# int k1 = ai[1];
|
1763
|
+
k1 = ai[1]
|
1764
|
+
# int j1 = (l1 >>> 4 ^ k1) & 0xf0f0f0f;
|
1765
|
+
# TODO: check that it is safe to replace >>> with >>
|
1766
|
+
j1 = (l1 >> 4 ^ k1) & 0xf0f0f0f
|
1767
|
+
# k1 ^= j1;
|
1768
|
+
k1 ^= j1
|
1769
|
+
# l1 ^= j1 << 4;
|
1770
|
+
l1 ^= (j1 << 4) & 0xffffffff
|
1771
|
+
# j1 = (l1 >>> 16 ^ k1) & 0xffff;
|
1772
|
+
# TODO: check that it is safe to replace >>> with >>
|
1773
|
+
j1 = (l1 >> 16 ^ k1) & 0xffff
|
1774
|
+
# k1 ^= j1;
|
1775
|
+
k1 ^= j1
|
1776
|
+
# l1 ^= j1 << 16;
|
1777
|
+
l1 ^= (j1 << 16) & 0xffffffff
|
1778
|
+
# j1 = (k1 >>> 2 ^ l1) & 0x33333333;
|
1779
|
+
# TODO: check that it is safe to replace >>> with >>
|
1780
|
+
j1 = (k1 >> 2 ^ l1) & 0x33333333
|
1781
|
+
# l1 ^= j1;
|
1782
|
+
l1 ^= j1
|
1783
|
+
# k1 ^= j1 << 2;
|
1784
|
+
k1 ^= (j1 << 2) & 0xffffffff
|
1785
|
+
# j1 = (k1 >>> 8 ^ l1) & 0xff00ff;
|
1786
|
+
j1 = (k1 >> 8 ^ l1) & 0xff00ff
|
1787
|
+
# l1 ^= j1;
|
1788
|
+
l1 ^= j1
|
1789
|
+
# k1 ^= j1 << 8;
|
1790
|
+
k1 ^= (j1 << 8) & 0xffffffff
|
1791
|
+
# k1 = (k1 << 1 | k1 >>> 31 & 1) & -1;
|
1792
|
+
# TODO: check that it is safe to replace >>> with >>
|
1793
|
+
k1 = (k1 << 1 | k1 >> 31 & 1) & 0xffffffff
|
1794
|
+
# j1 = (l1 ^ k1) & 0xaaaaaaaa;
|
1795
|
+
j1 = (l1 ^ k1) & 0xaaaaaaaa
|
1796
|
+
# l1 ^= j1;
|
1797
|
+
l1 ^= j1
|
1798
|
+
# k1 ^= j1;
|
1799
|
+
k1 ^= j1
|
1800
|
+
# l1 = (l1 << 1 | l1 >>> 31 & 1) & -1;
|
1801
|
+
# TODO: check that it is safe to replace >>> with >>
|
1802
|
+
l1 = (l1 << 1 | l1 >> 31 & 1) & 0xffffffff
|
1803
|
+
# for (int i2 = 0; i2 < 8; i2++) {
|
1804
|
+
for i2 in 0...8
|
1805
|
+
# j1 = k1 << 28 | k1 >>> 4;
|
1806
|
+
# TODO: check that it is safe to replace >>> with >>
|
1807
|
+
j1 = (k1 << 28 | k1 >> 4) & 0xffffffff
|
1808
|
+
# long l2 = 0L;
|
1809
|
+
# TODO: check if long integeres are processed automatically
|
1810
|
+
l2 = 0
|
1811
|
+
# l2 = ai1[j2];
|
1812
|
+
l2 = ai1[j2]
|
1813
|
+
# j1 ^= ai1[j2];
|
1814
|
+
j1 ^= ai1[j2]
|
1815
|
+
# j2++;
|
1816
|
+
j2 += 1
|
1817
|
+
# int i1 = bj[j1 & 0x3f];
|
1818
|
+
i1 = Bj[j1 & 0x3f]
|
1819
|
+
# i1 |= L[j1 >>> 8 & 0x3f];
|
1820
|
+
# TODO: check if long integeres are processed automatically
|
1821
|
+
i1 |= L[j1 >> 8 & 0x3f]
|
1822
|
+
# i1 |= P[j1 >>> 16 & 0x3f];
|
1823
|
+
i1 |= P[j1 >> 16 & 0x3f]
|
1824
|
+
# i1 |= T[j1 >>> 24 & 0x3f];
|
1825
|
+
i1 |= T[j1 >> 24 & 0x3f]
|
1826
|
+
# j1 = k1 ^ ai1[j2];
|
1827
|
+
j1 = k1 ^ ai1[j2]
|
1828
|
+
# j2++;
|
1829
|
+
j2 += 1
|
1830
|
+
# i1 |= bg[j1 & 0x3f];
|
1831
|
+
i1 |= Bg[j1 & 0x3f]
|
1832
|
+
# i1 |= bm[j1 >>> 8 & 0x3f];
|
1833
|
+
i1 |= Bm[j1 >> 8 & 0x3f]
|
1834
|
+
# i1 |= N[j1 >>> 16 & 0x3f];
|
1835
|
+
i1 |= N[j1 >> 16 & 0x3f]
|
1836
|
+
# i1 |= R[j1 >>> 24 & 0x3f];
|
1837
|
+
i1 |= R[j1 >> 24 & 0x3f]
|
1838
|
+
# l1 ^= i1;
|
1839
|
+
l1 ^= i1
|
1840
|
+
# j1 = l1 << 28 | l1 >>> 4;
|
1841
|
+
j1 = (l1 << 28 | l1 >> 4) & 0xffffffff
|
1842
|
+
# j1 ^= ai1[j2];
|
1843
|
+
j1 ^= ai1[j2]
|
1844
|
+
# j2++;
|
1845
|
+
j2 += 1
|
1846
|
+
# i1 = bj[j1 & 0x3f];
|
1847
|
+
i1 = Bj[j1 & 0x3f]
|
1848
|
+
# i1 |= L[j1 >>> 8 & 0x3f];
|
1849
|
+
i1 |= L[j1 >> 8 & 0x3f]
|
1850
|
+
# i1 |= P[j1 >>> 16 & 0x3f];
|
1851
|
+
i1 |= P[j1 >> 16 & 0x3f]
|
1852
|
+
# i1 |= T[j1 >>> 24 & 0x3f];
|
1853
|
+
i1 |= T[j1 >> 24 & 0x3f]
|
1854
|
+
# j1 = l1 ^ ai1[j2];
|
1855
|
+
j1 = l1 ^ ai1[j2]
|
1856
|
+
# j2++;
|
1857
|
+
j2 += 1
|
1858
|
+
# i1 |= bg[j1 & 0x3f];
|
1859
|
+
i1 |= Bg[j1 & 0x3f]
|
1860
|
+
# i1 |= bm[j1 >>> 8 & 0x3f];
|
1861
|
+
i1 |= Bm[j1 >> 8 & 0x3f]
|
1862
|
+
# i1 |= N[j1 >>> 16 & 0x3f];
|
1863
|
+
i1 |= N[j1 >> 16 & 0x3f]
|
1864
|
+
# i1 |= R[j1 >>> 24 & 0x3f];
|
1865
|
+
i1 |= R[j1 >> 24 & 0x3f]
|
1866
|
+
# k1 ^= i1;
|
1867
|
+
k1 ^= i1
|
1868
|
+
# }
|
1869
|
+
end
|
1870
|
+
#
|
1871
|
+
# k1 = k1 << 31 | k1 >>> 1;
|
1872
|
+
k1 = (k1 << 31 | k1 >> 1) & 0xffffffff
|
1873
|
+
# j1 = (l1 ^ k1) & 0xaaaaaaaa;
|
1874
|
+
j1 = (l1 ^ k1) & 0xaaaaaaaa
|
1875
|
+
# l1 ^= j1;
|
1876
|
+
l1 ^= j1
|
1877
|
+
# k1 ^= j1;
|
1878
|
+
k1 ^= j1
|
1879
|
+
# l1 = l1 << 31 | l1 >>> 1;
|
1880
|
+
l1 = l1 << 31 | l1 >> 1
|
1881
|
+
# j1 = (l1 >>> 8 ^ k1) & 0xff00ff;
|
1882
|
+
j1 = (l1 >> 8 ^ k1) & 0xff00ff
|
1883
|
+
# k1 ^= j1;
|
1884
|
+
k1 ^= j1
|
1885
|
+
# l1 ^= j1 << 8;
|
1886
|
+
l1 ^= (j1 << 8) & 0xffffffff
|
1887
|
+
# j1 = (l1 >>> 2 ^ k1) & 0x33333333;
|
1888
|
+
j1 = (l1 >> 2 ^ k1) & 0x33333333
|
1889
|
+
# k1 ^= j1;
|
1890
|
+
k1 ^= j1
|
1891
|
+
# l1 ^= j1 << 2;
|
1892
|
+
l1 ^= (j1 << 2) & 0xffffffff
|
1893
|
+
# j1 = (k1 >>> 16 ^ l1) & 0xffff;
|
1894
|
+
j1 = (k1 >> 16 ^ l1) & 0xffff
|
1895
|
+
# l1 ^= j1;
|
1896
|
+
l1 ^= j1
|
1897
|
+
# k1 ^= j1 << 16;
|
1898
|
+
k1 ^= (j1 << 16) & 0xffffffff
|
1899
|
+
# j1 = (k1 >>> 4 ^ l1) & 0xf0f0f0f;
|
1900
|
+
j1 = (k1 >> 4 ^ l1) & 0xf0f0f0f
|
1901
|
+
# l1 ^= j1;
|
1902
|
+
l1 ^= j1
|
1903
|
+
# k1 ^= j1 << 4;
|
1904
|
+
k1 ^= (j1 << 4) & 0xffffffff
|
1905
|
+
# ai[0] = k1;
|
1906
|
+
ai[0] = k1
|
1907
|
+
# ai[1] = l1;
|
1908
|
+
ai[1] = l1
|
1909
|
+
# }
|
1910
|
+
end
|
1911
|
+
|
1912
|
+
# private static byte[] G(byte abyte0[], byte abyte1[]) {
|
1913
|
+
def g_(abyte0, abyte1)
|
1914
|
+
# if (abyte0.length < 32) {
|
1915
|
+
# return null;
|
1916
|
+
# }
|
1917
|
+
if (abyte0.length < 32)
|
1918
|
+
return nil
|
1919
|
+
end
|
1920
|
+
# byte abyte3[] = new byte[8];
|
1921
|
+
abyte3 = "\0"*8
|
1922
|
+
# byte abyte4[] = new byte[8];
|
1923
|
+
abyte4 = "\0"*8
|
1924
|
+
# byte abyte5[] = new byte[8];
|
1925
|
+
abyte5 = "\0"*8
|
1926
|
+
# byte abyte2[] = new byte[8];
|
1927
|
+
abyte2 = "\0"*8
|
1928
|
+
# System.arraycopy(abyte0, 0, abyte3, 0, 8);
|
1929
|
+
abyte3[0, 8] = abyte0[0, 8]
|
1930
|
+
# System.arraycopy(abyte0, 8, abyte4, 0, 8);
|
1931
|
+
abyte4[0, 8] = abyte0[8, 8]
|
1932
|
+
# System.arraycopy(abyte0, 16, abyte5, 0, 8);
|
1933
|
+
abyte5[0, 8] = abyte0[16, 8]
|
1934
|
+
# System.arraycopy(abyte0, 24, abyte2, 0, 8);
|
1935
|
+
abyte2[0, 8] = abyte0[24, 0]
|
1936
|
+
# int ai[] = l(abyte3, true);
|
1937
|
+
ai = l(abyte3, true)
|
1938
|
+
# int ai1[] = l(abyte4, false);
|
1939
|
+
ai1 = l(abyte4, false)
|
1940
|
+
# int ai2[] = l(abyte5, true);
|
1941
|
+
ai2 = l(abyte5, true)
|
1942
|
+
# int i1 = abyte1.length % 8;
|
1943
|
+
i1 = abyte1.length % 8
|
1944
|
+
# byte byte0 = (byte) (8 - i1);
|
1945
|
+
byte0 = (8 - i1)
|
1946
|
+
# byte abyte6[] = new byte[abyte1.length + byte0];
|
1947
|
+
abyte6 = "\0"*(abyte1.length + byte0)
|
1948
|
+
# int j1 = abyte6.length / 8 - 1;
|
1949
|
+
j1 = abyte6.length / 8 - 1
|
1950
|
+
# int k1 = 8 * j1;
|
1951
|
+
k1 = 8 * j1
|
1952
|
+
# byte abyte7[] = new byte[8];
|
1953
|
+
abyte7 = "\0"*8
|
1954
|
+
# System.arraycopy(abyte1, k1, abyte7, 0, i1);
|
1955
|
+
abyte7[0, i1] = abyte1[k1, i1]
|
1956
|
+
# for (int l1 = i1; l1 < 8; l1++) {
|
1957
|
+
# abyte7[l1] = byte0;
|
1958
|
+
#
|
1959
|
+
# }
|
1960
|
+
for l1 in i1...8
|
1961
|
+
abyte7[l1] = byte0
|
1962
|
+
end
|
1963
|
+
# int i2 = 0;
|
1964
|
+
i2 = 0
|
1965
|
+
# for (int j2 = 0; i2 < j1; j2 += 8) {
|
1966
|
+
# q(abyte1, j2, abyte6, j2, ai, ai1, ai2, abyte2, true);
|
1967
|
+
# i2++;
|
1968
|
+
# }
|
1969
|
+
j2 = 0
|
1970
|
+
while (i2 < j1)
|
1971
|
+
q(abyte1, j2, abyte6, j2, ai, ai1, ai2, abyte2, true)
|
1972
|
+
i2 += 1
|
1973
|
+
j2 += 8
|
1974
|
+
end
|
1975
|
+
#
|
1976
|
+
# q(abyte7, 0, abyte6, k1, ai, ai1, ai2, abyte2, true);
|
1977
|
+
q(abyte7, 0, abyte6, k1, ai, ai1, ai2, abyte2, true)
|
1978
|
+
# return abyte6;
|
1979
|
+
return abyte6
|
1980
|
+
# }
|
1981
|
+
end
|
1982
|
+
|
1983
|
+
# private static void H(int ai[]) {
|
1984
|
+
# ai[4] = j(ai[0], 5) + r(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x5a827999;
|
1985
|
+
# ai[2] = j(ai[1], 30);
|
1986
|
+
# }
|
1987
|
+
def h_(ai)
|
1988
|
+
ai[4] = j(ai[0], 5) + r(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x5a827999
|
1989
|
+
ai[2] = j(ai[1], 30)
|
1990
|
+
end
|
1991
|
+
|
1992
|
+
# private static void I(int ai[]) {
|
1993
|
+
# ai[4] = j(ai[0], 5) + n(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x6ed9eba1;
|
1994
|
+
# ai[2] = j(ai[1], 30);
|
1995
|
+
# }
|
1996
|
+
def i_(ai)
|
1997
|
+
ai[4] = j(ai[0], 5) + n(ai[1], ai[2], ai[3]) + ai[4] + ai[5] + 0x6ed9eba1
|
1998
|
+
ai[2] = j(ai[1], 30)
|
1999
|
+
end
|
2000
|
+
|
2001
|
+
J = 2
|
2002
|
+
K = 4
|
2003
|
+
|
2004
|
+
L = [
|
2005
|
+
256, 0x2080100, 0x2080000, 0x42000100, 0x80000, 256, 0x40000000,
|
2006
|
+
0x2080000, 0x40080100, 0x80000,
|
2007
|
+
0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000,
|
2008
|
+
0x2000000, 0x40080000, 0x40080000, 0,
|
2009
|
+
0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0,
|
2010
|
+
0x42000000, 0x2080100, 0x2000000,
|
2011
|
+
0x42000000, 0x80100, 0x80000, 0x42000100, 256, 0x2000000, 0x40000000,
|
2012
|
+
0x2080000, 0x42000100, 0x40080100,
|
2013
|
+
0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 256, 0x2000000,
|
2014
|
+
0x42080000, 0x42080100, 0x80100,
|
2015
|
+
0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100,
|
2016
|
+
0x2000100, 0x40000100, 0x80000,
|
2017
|
+
0, 0x40080000, 0x2080100, 0x40000100
|
2018
|
+
]
|
2019
|
+
M = 2
|
2020
|
+
N = [
|
2021
|
+
0x802001, 8321, 8321, 128, 0x802080, 0x800081, 0x800001, 8193, 0,
|
2022
|
+
0x802000,
|
2023
|
+
0x802000, 0x802081, 129, 0, 0x800080, 0x800001, 1, 8192, 0x800000,
|
2024
|
+
0x802001,
|
2025
|
+
128, 0x800000, 8193, 8320, 0x800081, 1, 8320, 0x800080, 8192, 0x802080,
|
2026
|
+
0x802081, 129, 0x800080, 0x800001, 0x802000, 0x802081, 129, 0, 0,
|
2027
|
+
0x802000,
|
2028
|
+
8320, 0x800080, 0x800081, 1, 0x802001, 8321, 8321, 128, 0x802081, 129,
|
2029
|
+
1, 8192, 0x800001, 8193, 0x802080, 0x800081, 8193, 8320, 0x800000,
|
2030
|
+
0x802001,
|
2031
|
+
128, 0x800000, 8192, 0x802080
|
2032
|
+
]
|
2033
|
+
O = 1
|
2034
|
+
P = [
|
2035
|
+
520, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008,
|
2036
|
+
0x8000008,
|
2037
|
+
0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 520, 0x8000000, 8,
|
2038
|
+
0x8020200, 512,
|
2039
|
+
0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000,
|
2040
|
+
0x8000208, 8, 0x8020208,
|
2041
|
+
512, 0x8000000, 0x8020200, 0x8000000, 0x20008, 520, 0x20000, 0x8020200,
|
2042
|
+
0x8000200, 0,
|
2043
|
+
512, 0x20008, 0x8020208, 0x8000200, 0x8000008, 512, 0, 0x8020008,
|
2044
|
+
0x8000208, 0x20000,
|
2045
|
+
0x8000000, 0x8020208, 8, 0x20208, 0x20200, 0x8000008, 0x8020000,
|
2046
|
+
0x8000208, 520, 0x8020000,
|
2047
|
+
0x20208, 8, 0x8020008, 0x20200
|
2048
|
+
]
|
2049
|
+
Q = 0x8f1bbcdc
|
2050
|
+
R = [
|
2051
|
+
0x80108020, 0x80008000, 32768, 0x108020, 0x100000, 32, 0x80100020,
|
2052
|
+
0x80008020, 0x80000020, 0x80108020,
|
2053
|
+
0x80108000, 0x80000000, 0x80008000, 0x100000, 32, 0x80100020, 0x108000,
|
2054
|
+
0x100020, 0x80008020, 0,
|
2055
|
+
0x80000000, 32768, 0x108020, 0x80100000, 0x100020, 0x80000020, 0,
|
2056
|
+
0x108000, 32800, 0x80108000,
|
2057
|
+
0x80100000, 32800, 0, 0x108020, 0x80100020, 0x100000, 0x80008020,
|
2058
|
+
0x80100000, 0x80108000, 32768,
|
2059
|
+
0x80100000, 0x80008000, 32, 0x80108020, 0x108020, 32, 32768, 0x80000000,
|
2060
|
+
32800, 0x80108000,
|
2061
|
+
0x100000, 0x80000020, 0x100020, 0x80008020, 0x80000020, 0x100020,
|
2062
|
+
0x108000, 0, 0x80008000, 32800,
|
2063
|
+
0x80000000, 0x80100020, 0x80108020, 0x108000
|
2064
|
+
]
|
2065
|
+
S = [
|
2066
|
+
13, 16, 10, 23, 0, 4, 2, 27, 14, 5,
|
2067
|
+
20, 9, 22, 18, 11, 3, 25, 7, 15, 6,
|
2068
|
+
26, 19, 12, 1, 40, 51, 30, 36, 46, 54,
|
2069
|
+
29, 39, 50, 44, 32, 47, 43, 48, 38, 55,
|
2070
|
+
33, 52, 45, 41, 49, 35, 28, 31
|
2071
|
+
]
|
2072
|
+
T = [
|
2073
|
+
0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 4, 0x10000, 1024,
|
2074
|
+
0x1010400,
|
2075
|
+
0x1010404, 1024, 0x1000404, 0x1010004, 0x1000000, 4, 1028, 0x1000400,
|
2076
|
+
0x1000400, 0x10400,
|
2077
|
+
0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004,
|
2078
|
+
0x10004, 0, 1028,
|
2079
|
+
0x10404, 0x1000000, 0x10000, 0x1010404, 4, 0x1010000, 0x1010400,
|
2080
|
+
0x1000000, 0x1000000, 1024,
|
2081
|
+
0x1010004, 0x10000, 0x10400, 0x1000004, 1024, 4, 0x1000404, 0x10404,
|
2082
|
+
0x1010404, 0x10004,
|
2083
|
+
0x1010000, 0x1000404, 0x1000004, 1028, 0x10404, 0x1010400, 1028,
|
2084
|
+
0x1000400, 0x1000400, 0,
|
2085
|
+
0x10004, 0x10400, 0, 0x1010004
|
2086
|
+
]
|
2087
|
+
U = 8
|
2088
|
+
V = [
|
2089
|
+
56, 48, 40, 32, 24, 16, 8, 0, 57, 49,
|
2090
|
+
41, 33, 25, 17, 9, 1, 58, 50, 42, 34,
|
2091
|
+
26, 18, 10, 2, 59, 51, 43, 35, 62, 54,
|
2092
|
+
46, 38, 30, 22, 14, 6, 61, 53, 45, 37,
|
2093
|
+
29, 21, 13, 5, 60, 52, 44, 36, 28, 20,
|
2094
|
+
12, 4, 27, 19, 11, 3
|
2095
|
+
]
|
2096
|
+
|
2097
|
+
W = [
|
2098
|
+
0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000,
|
2099
|
+
0x10000, 32768, 16384,
|
2100
|
+
8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16,
|
2101
|
+
8, 4, 2, 1
|
2102
|
+
]
|
2103
|
+
X = 0x6ed9eba1
|
2104
|
+
Y = 8
|
2105
|
+
Z = 100
|
2106
|
+
|
2107
|
+
Ba = 32
|
2108
|
+
Bb = [
|
2109
|
+
1, 2, 4, 6, 8, 10, 12, 14, 15, 17,
|
2110
|
+
19, 21, 23, 25, 27, 28
|
2111
|
+
]
|
2112
|
+
Bc = 30
|
2113
|
+
Bd = "ZG"
|
2114
|
+
Be = false
|
2115
|
+
Bf = 0x5a827999
|
2116
|
+
Bg = [
|
2117
|
+
0x10001040, 4096, 0x40000, 0x10041040, 0x10000000, 0x10001040, 64,
|
2118
|
+
0x10000000, 0x40040, 0x10040000,
|
2119
|
+
0x10041040, 0x41000, 0x10041000, 0x41040, 4096, 64, 0x10040000,
|
2120
|
+
0x10000040, 0x10001000, 4160,
|
2121
|
+
0x41000, 0x40040, 0x10040040, 0x10041000, 4160, 0, 0, 0x10040040,
|
2122
|
+
0x10000040, 0x10001000,
|
2123
|
+
0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 4096, 64, 0x10040040,
|
2124
|
+
4096, 0x41040,
|
2125
|
+
0x10001000, 64, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000,
|
2126
|
+
0x10001040, 0, 0x10041040,
|
2127
|
+
0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040,
|
2128
|
+
0x41000, 0x41000, 4160,
|
2129
|
+
4160, 0x40040, 0x10000000, 0x10041000
|
2130
|
+
]
|
2131
|
+
Bh = 0xca62c1d6
|
2132
|
+
Bi = [
|
2133
|
+
-128, 64, 32, 16, 8, 4, 2, 1
|
2134
|
+
]
|
2135
|
+
Bj = [
|
2136
|
+
0x200000, 0x4200002, 0x4000802, 0, 2048, 0x4000802, 0x200802, 0x4200800,
|
2137
|
+
0x4200802, 0x200000,
|
2138
|
+
0, 0x4000002, 2, 0x4000000, 0x4200002, 2050, 0x4000800, 0x200802,
|
2139
|
+
0x200002, 0x4000800,
|
2140
|
+
0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 2048, 2050,
|
2141
|
+
0x4200802, 0x200800, 2,
|
2142
|
+
0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802,
|
2143
|
+
0x4200002, 0x4200002, 2,
|
2144
|
+
0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 2050, 0x200802,
|
2145
|
+
0x4200800, 2050, 0x4000002,
|
2146
|
+
0x4200802, 0x4200000, 0x200800, 0, 2, 0x4200802, 0, 0x200802, 0x4200000,
|
2147
|
+
2048,
|
2148
|
+
0x4000002, 0x4000800, 2048, 0x200002
|
2149
|
+
]
|
2150
|
+
Bk = "ZG_ENCRYPT_FAILED_"
|
2151
|
+
Bl = 15
|
2152
|
+
Bm = [
|
2153
|
+
0x20000010, 0x20400000, 16384, 0x20404010, 0x20400000, 16, 0x20404010,
|
2154
|
+
0x400000, 0x20004000, 0x404010,
|
2155
|
+
0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 16400, 0,
|
2156
|
+
0x400010, 0x20004010, 16384,
|
2157
|
+
0x404000, 0x20004010, 16, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000,
|
2158
|
+
16400, 0x404000,
|
2159
|
+
0x20404000, 0x20000000, 0x20004000, 16, 0x20400010, 0x404000, 0x20404010,
|
2160
|
+
0x400000, 16400, 0x20000010,
|
2161
|
+
0x400000, 0x20004000, 0x20000000, 16400, 0x20000010, 0x20404010, 0x404000,
|
2162
|
+
0x20400000, 0x404010, 0x20404000,
|
2163
|
+
0, 0x20400010, 16, 16384, 0x20400000, 0x404010, 16384, 0x400010,
|
2164
|
+
0x20004010, 0,
|
2165
|
+
0x20404000, 0x20000000, 0x400010, 0x20004010
|
2166
|
+
]
|
2167
|
+
|
2168
|
+
end
|
2169
|
+
|
2170
|
+
end
|