|
|
@ -32,7 +32,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
var md4 = function(message) {
|
|
|
|
var md4 = function(message) {
|
|
|
|
var h0, h1, h2, h3, a, b, c, d, ab, bc, cd, da, code, first = true, end = false,
|
|
|
|
var h0, h1, h2, h3, a, b, c, d, ab, bc, cd, da, code, first = true, end = false,
|
|
|
|
index = 0, i, start = 0, bytes = 0, length = message.length;
|
|
|
|
index = 0, i, start = 0, bytes = 0, length = message.length,
|
|
|
|
|
|
|
|
array = (ARRAY_BUFFER ? ArrayBuffer.isView(message) : false) || message instanceof Array;
|
|
|
|
|
|
|
|
|
|
|
|
blocks[16] = 0;
|
|
|
|
blocks[16] = 0;
|
|
|
|
do {
|
|
|
|
do {
|
|
|
@ -41,44 +42,56 @@
|
|
|
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
|
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
|
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
|
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
|
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
|
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
|
|
if(ARRAY_BUFFER) {
|
|
|
|
if (ARRAY_BUFFER) {
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
if (array) {
|
|
|
|
code = message.charCodeAt(index);
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
if (code < 0x80) {
|
|
|
|
buffer8[i++] = message[index];
|
|
|
|
buffer8[i++] = code;
|
|
|
|
}
|
|
|
|
} else if (code < 0x800) {
|
|
|
|
} else {
|
|
|
|
buffer8[i++] = 0xc0 | (code >> 6);
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
code = message.charCodeAt(index);
|
|
|
|
} else if (code < 0xd800 || code >= 0xe000) {
|
|
|
|
if (code < 0x80) {
|
|
|
|
buffer8[i++] = 0xe0 | (code >> 12);
|
|
|
|
buffer8[i++] = code;
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
|
|
} else if (code < 0x800) {
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
buffer8[i++] = 0xc0 | (code >> 6);
|
|
|
|
} else {
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
|
|
} else if (code < 0xd800 || code >= 0xe000) {
|
|
|
|
buffer8[i++] = 0xf0 | (code >> 18);
|
|
|
|
buffer8[i++] = 0xe0 | (code >> 12);
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
} else {
|
|
|
|
|
|
|
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
|
|
|
|
|
|
buffer8[i++] = 0xf0 | (code >> 18);
|
|
|
|
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
|
|
|
|
|
|
|
|
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
|
|
|
|
|
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
if (array) {
|
|
|
|
code = message.charCodeAt(index);
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
if (code < 0x80) {
|
|
|
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
|
|
|
}
|
|
|
|
} else if (code < 0x800) {
|
|
|
|
} else {
|
|
|
|
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
|
|
|
for (i = start;index < length && i < 64; ++index) {
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
code = message.charCodeAt(index);
|
|
|
|
} else if (code < 0xd800 || code >= 0xe000) {
|
|
|
|
if (code < 0x80) {
|
|
|
|
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
} else if (code < 0x800) {
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
|
|
|
} else {
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
|
|
} else if (code < 0xd800 || code >= 0xe000) {
|
|
|
|
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
} else {
|
|
|
|
|
|
|
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
|
|
|
|
|
|
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
|
|
|
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
|
|
|
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|