mirror of
https://github.com/emn178/js-sha3.git
synced 2026-08-12 19:41:36 +08:00
array buffer output
This commit is contained in:
+40
-51
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* js-sha3 v0.3.1
|
* js-sha3 v0.4.0
|
||||||
* https://github.com/emn178/js-sha3
|
* https://github.com/emn178/js-sha3
|
||||||
*
|
*
|
||||||
* Copyright 2015, emn178@gmail.com
|
* Copyright 2015, emn178@gmail.com
|
||||||
@@ -27,48 +27,41 @@
|
|||||||
2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,
|
2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,
|
||||||
2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,
|
2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,
|
||||||
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
|
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
|
||||||
|
var BITS = [224, 256, 384, 512];
|
||||||
|
var ALGORITHMS = [
|
||||||
|
{name: 'keccak', padding: KECCAK_PADDING},
|
||||||
|
{name: 'sha3', padding: PADDING}
|
||||||
|
];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'buffer'];
|
||||||
|
|
||||||
var blocks = [], s = [];
|
var blocks = [], s = [], methods = {};
|
||||||
|
|
||||||
var keccak_224 = function(message) {
|
var createMethod = function(bits, padding, outputType) {
|
||||||
return keccak(message, 224, KECCAK_PADDING);
|
return function(message) {
|
||||||
|
return keccak(message, bits, padding, outputType);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var keccak_256 = function(message) {
|
for(var i = 0;i < ALGORITHMS.length;++i) {
|
||||||
return keccak(message, 256, KECCAK_PADDING);
|
var algorithm = ALGORITHMS[i];
|
||||||
};
|
for(var j = 0;j < BITS.length;++j) {
|
||||||
|
(function(algorithm, bits) {
|
||||||
|
var method = createMethod(bits, algorithm.padding, 'hex');
|
||||||
|
methods[algorithm.name +'_' + bits] = method;
|
||||||
|
for(var k = 0;k < OUTPUT_TYPES.length;++k) {
|
||||||
|
var type = OUTPUT_TYPES[k];
|
||||||
|
method[type] = createMethod(bits, algorithm.padding, type);
|
||||||
|
}
|
||||||
|
})(algorithm, BITS[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var keccak_384 = function(message) {
|
var keccak = function(message, bits, padding, outputType) {
|
||||||
return keccak(message, 384, KECCAK_PADDING);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sha3_224 = function(message) {
|
|
||||||
return keccak(message, 224, PADDING);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sha3_256 = function(message) {
|
|
||||||
return keccak(message, 256, PADDING);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sha3_384 = function(message) {
|
|
||||||
return keccak(message, 384, PADDING);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sha3_512 = function(message) {
|
|
||||||
return keccak(message, 512, PADDING);
|
|
||||||
};
|
|
||||||
|
|
||||||
var keccak = function(message, bits, padding) {
|
|
||||||
var notString = typeof(message) != 'string';
|
var notString = typeof(message) != 'string';
|
||||||
if(notString && message.constructor == root.ArrayBuffer) {
|
if(notString && message.constructor == root.ArrayBuffer) {
|
||||||
message = new Uint8Array(message);
|
message = new Uint8Array(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bits === undefined) {
|
|
||||||
bits = 512;
|
|
||||||
padding = KECCAK_PADDING;
|
|
||||||
}
|
|
||||||
|
|
||||||
var block, code, end = false, index = 0, start = 0, length = message.length,
|
var block, code, end = false, index = 0, start = 0, length = message.length,
|
||||||
n, i, h, l, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,
|
n, i, h, l, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,
|
||||||
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,
|
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,
|
||||||
@@ -307,6 +300,15 @@
|
|||||||
}
|
}
|
||||||
} while(!end);
|
} while(!end);
|
||||||
|
|
||||||
|
if(outputType == 'buffer') {
|
||||||
|
var length = bits / 32;
|
||||||
|
var buffer = new ArrayBuffer(bits / 8);
|
||||||
|
var array = new Uint32Array(buffer);
|
||||||
|
for(var i = 0;i < length;++i) {
|
||||||
|
array[i] = s[i];
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
} else {
|
||||||
var hex = '';
|
var hex = '';
|
||||||
if(CHROME) {
|
if(CHROME) {
|
||||||
b0 = s[0];
|
b0 = s[0];
|
||||||
@@ -406,27 +408,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return hex;
|
return hex;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if(!root.JS_SHA3_TEST && NODE_JS) {
|
if(!root.JS_SHA3_TEST && NODE_JS) {
|
||||||
module.exports = {
|
module.exports = methods;
|
||||||
sha3_512: sha3_512,
|
|
||||||
sha3_384: sha3_384,
|
|
||||||
sha3_256: sha3_256,
|
|
||||||
sha3_224: sha3_224,
|
|
||||||
keccak_512: keccak,
|
|
||||||
keccak_384: keccak_384,
|
|
||||||
keccak_256: keccak_256,
|
|
||||||
keccak_224: keccak_224
|
|
||||||
};
|
|
||||||
} else if(root) {
|
} else if(root) {
|
||||||
root.sha3_512 = sha3_512;
|
for(var key in methods) {
|
||||||
root.sha3_384 = sha3_384;
|
root[key] = methods[key];
|
||||||
root.sha3_256 = sha3_256;
|
}
|
||||||
root.sha3_224 = sha3_224;
|
|
||||||
root.keccak_512 = keccak;
|
|
||||||
root.keccak_384 = keccak_384;
|
|
||||||
root.keccak_256 = keccak_256;
|
|
||||||
root.keccak_224 = keccak_224;
|
|
||||||
}
|
}
|
||||||
}(this));
|
}(this));
|
||||||
|
|||||||
@@ -59,6 +59,12 @@
|
|||||||
expect(keccak_512(new ArrayBuffer(0))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
expect(keccak_512(new ArrayBuffer(0))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
context('when output ArrayBuffer', function() {
|
||||||
|
it('should be equal', function() {
|
||||||
|
expect(keccak_512.buffer('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('keccak_384', function() {
|
describe('keccak_384', function() {
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
ArrayBuffer.prototype.toHexString = function (argument) {
|
||||||
|
var array = new Uint8Array(this);
|
||||||
|
var hex = '';
|
||||||
|
for(var i = 0;i < array.length;++i) {
|
||||||
|
var c = array[i].toString('16');
|
||||||
|
hex += c.length == 1 ? '0' + c : c;
|
||||||
|
}
|
||||||
|
return hex;
|
||||||
|
};
|
||||||
(function(sha3_512, sha3_384, sha3_256, sha3_224) {
|
(function(sha3_512, sha3_384, sha3_256, sha3_224) {
|
||||||
describe('sha3_512', function() {
|
describe('sha3_512', function() {
|
||||||
context('when ascii', function() {
|
context('when ascii', function() {
|
||||||
@@ -59,6 +68,12 @@
|
|||||||
expect(sha3_512(new ArrayBuffer(0))).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
expect(sha3_512(new ArrayBuffer(0))).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
context('when output ArrayBuffer', function() {
|
||||||
|
it('should be equal', function() {
|
||||||
|
expect(sha3_512.buffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('sha3_384', function() {
|
describe('sha3_384', function() {
|
||||||
|
|||||||
Reference in New Issue
Block a user