Compare commits
No commits in common. 'master' and 'v0.5.0' have entirely different histories.
@ -1,3 +1,3 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
/coverage/
|
/covreporter/
|
||||||
/.nyc_output/
|
/my_test/
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
/node_modules/
|
|
||||||
/coverage/
|
|
||||||
/.nyc_output/
|
|
||||||
/tests/
|
|
||||||
.covignore
|
|
||||||
.travis.yml
|
|
||||||
.npmignore
|
|
||||||
bower.json
|
|
File diff suppressed because one or more lines are too long
@ -1,148 +0,0 @@
|
|||||||
type Message = string | number[] | ArrayBuffer | Uint8Array;
|
|
||||||
|
|
||||||
interface Hasher {
|
|
||||||
/**
|
|
||||||
* Update hash
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
update(message: Message): Hasher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in hex string.
|
|
||||||
*/
|
|
||||||
hex(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in hex string.
|
|
||||||
*/
|
|
||||||
toString(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in ArrayBuffer.
|
|
||||||
*/
|
|
||||||
arrayBuffer(): ArrayBuffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*/
|
|
||||||
digest(): number[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*/
|
|
||||||
array(): number[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Hmac {
|
|
||||||
/**
|
|
||||||
* Computes a Hash-based message authentication code (HMAC) using a secret key
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
(secretKey: Message, message: Message): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hash object using a secret key.
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
*/
|
|
||||||
create(secretKey: Message): Hasher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hash object and hash message using a secret key
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
update(secretKey: Message, message: Message): Hasher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in hex string.
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
hex(secretKey: Message, message: Message): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in ArrayBuffer.
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
arrayBuffer(secretKey: Message, message: Message): ArrayBuffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
digest(secretKey: Message, message: Message): number[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*
|
|
||||||
* @param secretKey The Secret Key
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
array(secretKey: Message, message: Message): number[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Hash {
|
|
||||||
/**
|
|
||||||
* Hash and return hex string.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
(message: Message): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hash object.
|
|
||||||
*/
|
|
||||||
create(): Hasher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hash object and hash message.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
update(message: Message): Hasher;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in hex string.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
hex(message: Message): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in ArrayBuffer.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
arrayBuffer(message: Message): ArrayBuffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
digest(message: Message): number[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return hash in integer array.
|
|
||||||
*
|
|
||||||
* @param message The message you want to hash.
|
|
||||||
*/
|
|
||||||
array(message: Message): number[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HMAC interface
|
|
||||||
*/
|
|
||||||
hmac: Hmac;
|
|
||||||
}
|
|
||||||
|
|
||||||
export var sha1: Hash;
|
|
File diff suppressed because it is too large
Load Diff
@ -1,202 +0,0 @@
|
|||||||
(function (sha1) {
|
|
||||||
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () {
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
var testCases = {
|
|
||||||
sha1_hmac: {
|
|
||||||
'Test Vectors': {
|
|
||||||
'b617318655057264e28bc0b6fb378c8ef146be00': [
|
|
||||||
[0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b],
|
|
||||||
'Hi There'
|
|
||||||
],
|
|
||||||
'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79': [
|
|
||||||
'Jefe',
|
|
||||||
'what do ya want for nothing?'
|
|
||||||
],
|
|
||||||
'125d7342b9ac11cd91a39af48aa17b4f63f175d3': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
[0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd]
|
|
||||||
],
|
|
||||||
'4c9007f4026250c6bc8414f9bf50c86c2d7235da': [
|
|
||||||
[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19],
|
|
||||||
[0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd]
|
|
||||||
],
|
|
||||||
'4c1a03424b55e07fe7f27be1d58bb9324a9a5a04': [
|
|
||||||
[0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c],
|
|
||||||
'Test With Truncation'
|
|
||||||
],
|
|
||||||
'aa4ae5e15272d00e95705637ce8a3b55ed402112': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'Test Using Larger Than Block-Size Key - Hash Key First'
|
|
||||||
],
|
|
||||||
'e8e99d0f45237d786d6bbaa7965c7808bbff1a91': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'UTF8': {
|
|
||||||
'f495de6d0f1b5681070a024bbaed5b5f42847306': ['中文', '中文'],
|
|
||||||
'58891d68487ffebddba5925abedec77a5a578db2': ['aécio', 'aécio'],
|
|
||||||
'a1816bff2dae324c283aeab564d5edb5170fbada': ['𠜎', '𠜎']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!(typeof JS_SHA1_NO_ARRAY_BUFFER === 'boolean' && JS_SHA1_NO_ARRAY_BUFFER)) {
|
|
||||||
testCases.sha1_hmac.Uint8Array = {
|
|
||||||
'69536cc84eee5fe51c5b051aff8485f5c9ef0b58': [
|
|
||||||
new Uint8Array(0),
|
|
||||||
'Hi There'
|
|
||||||
]
|
|
||||||
};
|
|
||||||
testCases.sha1_hmac.ArrayBuffer = {
|
|
||||||
'69536cc84eee5fe51c5b051aff8485f5c9ef0b58': [
|
|
||||||
new ArrayBuffer(0),
|
|
||||||
'Hi There'
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}];
|
|
||||||
|
|
||||||
function runTestCases(name, algorithm) {
|
|
||||||
var methods = [
|
|
||||||
{
|
|
||||||
name: name,
|
|
||||||
call: algorithm,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.hex',
|
|
||||||
call: algorithm.hex
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.array',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.array(key, message).toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.digest',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.digest(key, message).toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.arrayBuffer',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.arrayBuffer(key, message).toHexString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
var classMethods = [
|
|
||||||
{
|
|
||||||
name: 'create',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.create(key).update(message).toString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'update',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).toString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'hex',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).hex();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'array',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).array().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'digest',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).digest().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'arrayBuffer',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).arrayBuffer().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'finalize',
|
|
||||||
call: function (key, message) {
|
|
||||||
var hash = algorithm.update(key, message);
|
|
||||||
hash.hex();
|
|
||||||
return hash.hex();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
var subTestCases = testCases[name];
|
|
||||||
|
|
||||||
describe(name, function () {
|
|
||||||
methods.forEach(function (method) {
|
|
||||||
describe('#' + method.name, function () {
|
|
||||||
for (var testCaseName in subTestCases) {
|
|
||||||
(function (testCaseName) {
|
|
||||||
var testCase = subTestCases[testCaseName];
|
|
||||||
context('when ' + testCaseName, function () {
|
|
||||||
for (var hash in testCase) {
|
|
||||||
(function (message, hash) {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(method.call(message[0], message[1])).to.be(hash);
|
|
||||||
});
|
|
||||||
})(testCase[hash], hash);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})(testCaseName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
classMethods.forEach(function (method) {
|
|
||||||
describe('#' + method.name, function () {
|
|
||||||
for (var testCaseName in subTestCases) {
|
|
||||||
(function (testCaseName) {
|
|
||||||
var testCase = subTestCases[testCaseName];
|
|
||||||
context('when ' + testCaseName, function () {
|
|
||||||
for (var hash in testCase) {
|
|
||||||
(function (message, hash) {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(method.call(message[0], message[1])).to.be(hash);
|
|
||||||
});
|
|
||||||
})(testCase[hash], hash);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})(testCaseName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#' + name, function () {
|
|
||||||
errorTestCases.forEach(function (testCase) {
|
|
||||||
context('when ' + testCase, function () {
|
|
||||||
it('should throw error', function () {
|
|
||||||
expect(function () {
|
|
||||||
algorithm(testCase, '');
|
|
||||||
}).to.throwError(/input is invalid type/);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
runTestCases('sha1_hmac', sha1.hmac);
|
|
||||||
})(sha1);
|
|
@ -1,24 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>SHA1</title>
|
|
||||||
<link rel="stylesheet" href="../node_modules/mocha/mocha.css">
|
|
||||||
<script src="../node_modules/mocha/mocha.js"></script>
|
|
||||||
<script src="../node_modules/expect.js/index.js"></script>
|
|
||||||
<script src="../node_modules/requirejs/require.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="mocha"></div>
|
|
||||||
<script>
|
|
||||||
mocha.setup('bdd');
|
|
||||||
require(['../src/sha1.js'], function (sha1) {
|
|
||||||
window.sha1 = sha1;
|
|
||||||
require(['test.js', 'hmac-test.js'], function () {
|
|
||||||
mocha.checkLeaks();
|
|
||||||
mocha.run();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,24 +0,0 @@
|
|||||||
(function (Worker, WORKER, SOURCE) {
|
|
||||||
var cases = {
|
|
||||||
'da39a3ee5e6b4b0d3255bfef95601890afd80709': '',
|
|
||||||
'2fd4e1c67a2d28fced849ee1bb76e7391b93eb12': 'The quick brown fox jumps over the lazy dog',
|
|
||||||
'408d94384216f890ff7a0c3528e8bed1e0b01621': 'The quick brown fox jumps over the lazy dog.'
|
|
||||||
};
|
|
||||||
|
|
||||||
describe('#sha1', function () {
|
|
||||||
Object.keys(cases).forEach(function (hash) {
|
|
||||||
it('should be equal', function (done) {
|
|
||||||
var worker = new Worker(WORKER);
|
|
||||||
worker.onmessage = function(event) {
|
|
||||||
expect(event.data).to.be(hash);
|
|
||||||
if (worker.terminate) {
|
|
||||||
worker.terminate();
|
|
||||||
}
|
|
||||||
done();
|
|
||||||
};
|
|
||||||
worker.postMessage(SOURCE);
|
|
||||||
worker.postMessage(cases[hash]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})(Worker, WORKER, SOURCE);
|
|
@ -1,25 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>SHA1</title>
|
|
||||||
<link rel="stylesheet" href="../node_modules/mocha/mocha.css">
|
|
||||||
<script src="../node_modules/mocha/mocha.js"></script>
|
|
||||||
<script src="../node_modules/expect.js/index.js"></script>
|
|
||||||
<script src="../src/sha1.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="mocha"></div>
|
|
||||||
<script>
|
|
||||||
WORKER = 'worker.js';
|
|
||||||
SOURCE = '../src/sha1.js';
|
|
||||||
mocha.setup('bdd');
|
|
||||||
</script>
|
|
||||||
<script src="worker-test.js"></script>
|
|
||||||
<script>
|
|
||||||
mocha.run();
|
|
||||||
</script>
|
|
||||||
<script>
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,12 +0,0 @@
|
|||||||
var imported = false;
|
|
||||||
onmessage = function(e) {
|
|
||||||
if (imported) {
|
|
||||||
postMessage(sha1(e.data));
|
|
||||||
if (typeof exports !== 'undefined') {
|
|
||||||
imported = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
imported = true;
|
|
||||||
importScripts(e.data);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue