package org.tools.net.protocol.rstp;
public class RealChallenge {
private RealChallenge() {
}
private static char[] xorTable = new char[] { 0x05, 0x18, 0x74, 0xd0, 0x0d,
0x09, 0x02, 0x53, 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70,
0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09, 0x63, 0x11, 0x03,
0x71, 0x08, 0x08, 0x70, 0x02, 0x10, 0x57, 0x05, 0x18, 0x54, 0x00,
0x00, 0x00 };
public static String calcChallenge(String challenge1) {
char[] buffer = new char[128];
be32c(buffer, 0xa1e9149d, 0);
be32c(buffer, 0x0e6b3b59, 4);
for (int i = 0; i < challenge1.length(); i++) {
char c = (char) (challenge1.charAt(i) ^ xorTable[i] & 0xffff);
buffer[8 + i] = c;
}
for (int i = challenge1.length(); i < xorTable.length; i++) {
buffer[8 + i] = xorTable[i];
}
String result = calcResponseString(buffer);
result = result + "01d0a8e3";
return result;
}
public static String calcCheckSum(String challenge2) {
StringBuffer buffer = new StringBuffer();
int len = challenge2.length() - 8;
for (int i = 0; i < len / 4; i++) {
buffer.append(challenge2.charAt(i * 4));
}
return buffer.toString();
}
private static void be32c(char[] c, int x, int pos) {
c[pos + 3] = (char) (x & 0x000000ff);
c[pos + 2] = (char) ((x & 0x0000ff00) >>> 8);
c[pos + 1] = (char) ((x & 0x00ff0000) >>> 16);
c[pos] = (char) ((x & 0xff000000) >>> 24);
}
private static int le2me(char[] c, int pos) {
return c[pos + 3] << 24 | c[pos + 2] << 16 | c[pos + 1] << 8 | c[pos];
}
private static void le2me(char[] c, int pos, int value) {
c[pos + 3] = (char) ((value & 0xff000000) >>> 24);
c[pos + 2] = (char) ((value & 0x00ff0000) >>> 16);
c[pos + 1] = (char) ((value & 0x0000ff00) >>> 8);
c[pos] = (char) ((value & 0x000000ff));
}
private static String calcResponseString(char[] challenge) {
char[] field = new char[128];
char[] zres = new char[20];
be32c(field, 0x01234567, 0);
be32c(field, 0x89ABCDEF, 4);
be32c(field, 0xFEDCBA98, 8);
be32c(field, 0x76543210, 12);
be32c(field, 0x00000000, 16);
be32c(field, 0x00000000, 20);
callHash(field, challenge, 64);
calcResponse(zres, field);
StringBuffer result = new StringBuffer();
for (int i = 0; i < 16; i++) {
char a = (char) ((zres[i] >>> 4) & 15);
char b = (char) (zres[i] & 15);
char c = (char) (((a < 10) ? (a + 48) : (a + 87)) & 255);
char d = (char) (((b < 10) ? (b + 48) : (b + 87)) & 255);
result.append(c).append(d);
}
return result.toString();
}
private static void hash(char[] field, int fieldPos, char[] param,
int paramPos) {
int a, b, c, d;
a = le2me(field, fieldPos);
b = le2me(field, fieldPos + 4);
c = le2me(field, fieldPos + 8);
d = le2me(field, fieldPos + 12);
a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x00) + a
- 0x28955B88;
a = ((a << 0x07) | (a >>> 0x19)) + b;
d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x04) + d
- 0x173848AA;
d = ((d << 0x0c) | (d >>> 0x14)) + a;
c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x08) + c
+ 0x242070DB;
c = ((c << 0x11) | (c >>> 0x0f)) + d;
b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x0c) + b
- 0x3E423112;
b = ((b << 0x16) | (b >>> 0x0a)) + c;
a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x10) + a
- 0x0A83F051;
a = ((a << 0x07) | (a >>> 0x19)) + b;
d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x14) + d
+ 0x4787C62A;
d = ((d << 0x0c) | (d >>> 0x14)) + a;
c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x18) + c
- 0x57CFB9ED;
c = ((c << 0x11) | (c >>> 0x0f)) + d;
b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x1c) + b
- 0x02B96AFF;
b = ((b << 0x16) | (b >>> 0x0a)) + c;
a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x20) + a
+ 0x698098D8;
a = ((a << 0x07) | (a >>> 0x19)) + b;
d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x24) + d
- 0x74BB0851;
d = ((d << 0x0c) | (d >>> 0x14)) + a;
c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x28) + c
- 0x0000A44F;
c = ((c << 0x11) | (c >>> 0x0f)) + d;
b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x2c) + b
- 0x76A32842;
b = ((b << 0x16) | (b >>> 0x0a)) + c;
a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x30) + a
+ 0x6B901122;
a = ((a << 0x07) | (a >>> 0x19)) + b;
d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x34) + d
- 0x02678E6D;
d = ((d << 0x0c) | (d >>> 0x14)) + a;
c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x38) + c
- 0x5986BC72;
c = ((c << 0x11) | (c >>> 0x0f)) + d;
b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x3c) + b
+ 0x49B40821;
b = ((b << 0x16) | (b >>> 0x0a)) + c;
a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x04) + a
- 0x09E1DA9E;
a = ((a << 0x05) | (a >>> 0x1b)) + b;
d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x18) + d
- 0x3FBF4CC0;
d = ((d << 0x09) | (d >>> 0x17)) + a;
c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x2c) + c
+ 0x265E5A51;
c = ((c << 0x0e) | (c >>> 0x12)) + d;
b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x00) + b
- 0x16493856;
b = ((b << 0x14) | (b >>> 0x0c)) + c;
a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x14) + a
- 0x29D0EFA3;
a = ((a << 0x05) | (a >>> 0x1b)) + b;
d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x28) + d
+ 0x02441453;
d = ((d << 0x09) | (d >>> 0x17)) + a;
c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x3c) + c
- 0x275E197F;
c = ((c << 0x0e) | (c >>> 0x12)) + d;
b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x10) + b
- 0x182C0438;
b = ((b << 0x14) | (b >>> 0x0c)) + c;
a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x24) + a
+ 0x21E1CDE6;
a = ((a << 0x05) | (a >>> 0x1b)) + b;
d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x38) + d
- 0x3CC8F82A;
d = ((d << 0x09) | (d >>> 0x17)) + a;
c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x0c) + c
- 0x0B2AF279;
c = ((c << 0x0e) | (c >>> 0x12)) + d;
b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x20) + b
+ 0x455A14ED;
b = ((b << 0x14) | (b >>> 0x0c)) + c;
a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x34) + a
- 0x561C16FB;
a = ((a << 0x05) | (a >>> 0x1b)) + b;
d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x08) + d
- 0x03105C08;
d = ((d << 0x09) | (d >>> 0x17)) + a;
c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x1c) + c
+ 0x676F02D9;
c = ((c << 0x0e) | (c >>> 0x12)) + d;
b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x30) + b
- 0x72D5B376;
b = ((b << 0x14) | (b >>> 0x0c)) + c;
a = (b ^ c ^ d) + le2me(param, paramPos + 0x14) + a - 0x0005C6BE;
a = ((a << 0x04) | (a >>> 0x1c)) + b;
d = (a ^ b ^ c) + le2me(param, paramPos + 0x20) + d - 0x788E097F;
d = ((d << 0x0b) | (d >>> 0x15)) + a;
c = (d ^ a ^ b) + le2me(param, paramPos + 0x2C) + c + 0x6D9D6122;
c = ((c << 0x10) | (c >>> 0x10)) + d;
b = (c ^ d ^ a) + le2me(param, paramPos + 0x38) + b - 0x021AC7F4;
b = ((b << 0x17) | (b >>> 0x09)) + c;
a = (b ^ c ^ d) + le2me(param, paramPos + 0x04) + a - 0x5B4115BC;
a = ((a << 0x04) | (a >>> 0x1c)) + b;
d = (a ^ b ^ c) + le2me(param, paramPos + 0x10) + d + 0x4BDECFA9;
d = ((d << 0x0b) | (d >>> 0x15)) + a;
c = (d ^ a ^ b) + le2me(param, paramPos + 0x1c) + c - 0x0944B4A0;
c = ((c << 0x10) | (c >>> 0x10)) + d;
b = (c ^ d ^ a) + le2me(param, paramPos + 0x28) + b - 0x41404390;
b = ((b << 0x17) | (b >>> 0x09)) + c;
a = (b ^ c ^ d) + le2me(param, paramPos + 0x34) + a + 0x289B7EC6;
a = ((a << 0x04) | (a >>> 0x1c)) + b;
d = (a ^ b ^ c) + le2me(param, paramPos + 0x00) + d - 0x155ED806;
d = ((d << 0x0b) | (d >>> 0x15)) + a;
c = (d ^ a ^ b) + le2me(param, paramPos + 0x0c) + c - 0x2B10CF7B;
c = ((c << 0x10) | (