Support for array based input. Fixes #1.

pull/2/head
Pavel Horal 10 years ago
parent b1f1942f17
commit 751ae7d571

@ -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];
}
} }
} }
} }

@ -43,5 +43,29 @@
expect(md4('012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('47eebbaaa1fca842a7bff2d3b7c9f0c6'); expect(md4('012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('47eebbaaa1fca842a7bff2d3b7c9f0c6');
}); });
}); });
describe('array input', function() {
var HELLO = [72, 69, 76, 76, 79];
describe('standard array', function() {
it('should be successful', function() {
expect(md4(HELLO)).to.be('4c832b90373e2d3f4a8ce06172989e2b');
});
});
if (!global.JS_MD4_TEST) {
describe('typed array', function() {
var copy = function(source, target) {
for (var i = 0; i < source.length; i++) {
target[i] = source[i];
}
return target;
}
it('should be successful', function() {
expect(md4(copy(HELLO, new Uint8Array(HELLO.length)))).to.be('4c832b90373e2d3f4a8ce06172989e2b');
expect(md4(copy(HELLO, new Int8Array(HELLO.length)))).to.be('4c832b90373e2d3f4a8ce06172989e2b');
});
});
}
});
}); });
})(md4); })(md4);

Loading…
Cancel
Save