|
|
|
@ -46,37 +46,35 @@
|
|
|
|
|
'256': 136
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {
|
|
|
|
|
Array.isArray = function (obj) {
|
|
|
|
|
|
|
|
|
|
var isArray = root.JS_SHA3_NO_NODE_JS || !Array.isArray
|
|
|
|
|
? function (obj) {
|
|
|
|
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
: Array.isArray;
|
|
|
|
|
|
|
|
|
|
if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
|
|
|
|
ArrayBuffer.isView = function (obj) {
|
|
|
|
|
var isView = (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView))
|
|
|
|
|
? function (obj) {
|
|
|
|
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
: ArrayBuffer.isView;
|
|
|
|
|
|
|
|
|
|
// [message: string, isString: bool]
|
|
|
|
|
var formatMessage = function (message) {
|
|
|
|
|
var notString, type = typeof message;
|
|
|
|
|
if (type !== 'string') {
|
|
|
|
|
if (type === 'object') {
|
|
|
|
|
if (message === null) {
|
|
|
|
|
throw new Error(INPUT_ERROR);
|
|
|
|
|
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
|
|
|
message = new Uint8Array(message);
|
|
|
|
|
} else if (!Array.isArray(message)) {
|
|
|
|
|
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
|
|
|
|
var type = typeof message;
|
|
|
|
|
if (type === 'string') {
|
|
|
|
|
return [message, true];
|
|
|
|
|
}
|
|
|
|
|
if (type !== 'object' || message === null) {
|
|
|
|
|
throw new Error(INPUT_ERROR);
|
|
|
|
|
}
|
|
|
|
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
|
|
|
return [new Uint8Array(message), false];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!isArray(message) && !isView(message)) {
|
|
|
|
|
throw new Error(INPUT_ERROR);
|
|
|
|
|
}
|
|
|
|
|
notString = true;
|
|
|
|
|
}
|
|
|
|
|
return [message, notString];
|
|
|
|
|
return [message, false];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var empty = function (message) {
|
|
|
|
@ -215,7 +213,7 @@
|
|
|
|
|
}
|
|
|
|
|
var result = formatMessage(message);
|
|
|
|
|
message = result[0];
|
|
|
|
|
var notString = result[1];
|
|
|
|
|
var isString = result[1];
|
|
|
|
|
var blocks = this.blocks, byteCount = this.byteCount, length = message.length,
|
|
|
|
|
blockCount = this.blockCount, index = 0, s = this.s, i, code;
|
|
|
|
|
|
|
|
|
@ -227,11 +225,7 @@
|
|
|
|
|
blocks[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (notString) {
|
|
|
|
|
for (i = this.start; index < length && i < byteCount; ++index) {
|
|
|
|
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (isString) {
|
|
|
|
|
for (i = this.start; index < length && i < byteCount; ++index) {
|
|
|
|
|
code = message.charCodeAt(index);
|
|
|
|
|
if (code < 0x80) {
|
|
|
|
@ -251,6 +245,10 @@
|
|
|
|
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (i = this.start; index < length && i < byteCount; ++index) {
|
|
|
|
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.lastByteIndex = i;
|
|
|
|
|
if (i >= byteCount) {
|
|
|
|
@ -291,11 +289,9 @@
|
|
|
|
|
Keccak.prototype.encodeString = function (str) {
|
|
|
|
|
var result = formatMessage(str);
|
|
|
|
|
str = result[0];
|
|
|
|
|
var notString = result[1];
|
|
|
|
|
var isString = result[1];
|
|
|
|
|
var bytes = 0, length = str.length;
|
|
|
|
|
if (notString) {
|
|
|
|
|
bytes = length;
|
|
|
|
|
} else {
|
|
|
|
|
if (isString) {
|
|
|
|
|
for (var i = 0; i < str.length; ++i) {
|
|
|
|
|
var code = str.charCodeAt(i);
|
|
|
|
|
if (code < 0x80) {
|
|
|
|
@ -309,6 +305,8 @@
|
|
|
|
|
bytes += 4;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
bytes = length;
|
|
|
|
|
}
|
|
|
|
|
bytes += this.encode(bytes * 8);
|
|
|
|
|
this.update(str);
|
|
|
|
|