crypto: Streaming interface for Hash
This commit is contained in:
parent
3d3a0b3046
commit
90de2ddb77
@ -37,6 +37,9 @@ try {
|
|||||||
var crypto = false;
|
var crypto = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var stream = require('stream');
|
||||||
|
var util = require('util');
|
||||||
|
|
||||||
// This is here because many functions accepted binary strings without
|
// This is here because many functions accepted binary strings without
|
||||||
// any explicit encoding in older versions of node, and we don't want
|
// any explicit encoding in older versions of node, and we don't want
|
||||||
// to break them unnecessarily.
|
// to break them unnecessarily.
|
||||||
@ -148,12 +151,24 @@ exports.createCredentials = function(options, context) {
|
|||||||
|
|
||||||
|
|
||||||
exports.createHash = exports.Hash = Hash;
|
exports.createHash = exports.Hash = Hash;
|
||||||
function Hash(algorithm) {
|
function Hash(algorithm, options) {
|
||||||
if (!(this instanceof Hash))
|
if (!(this instanceof Hash))
|
||||||
return new Hash(algorithm);
|
return new Hash(algorithm);
|
||||||
this._binding = new binding.Hash(algorithm);
|
this._binding = new binding.Hash(algorithm);
|
||||||
|
stream.Transform.call(this, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
util.inherits(Hash, stream.Transform);
|
||||||
|
|
||||||
|
Hash.prototype._transform = function(chunk, output, callback) {
|
||||||
|
this._binding.update(chunk);
|
||||||
|
callback();
|
||||||
|
};
|
||||||
|
|
||||||
|
Hash.prototype._flush = function(output, callback) {
|
||||||
|
output(this._binding.digest());
|
||||||
|
callback();
|
||||||
|
};
|
||||||
|
|
||||||
Hash.prototype.update = function(data, encoding) {
|
Hash.prototype.update = function(data, encoding) {
|
||||||
encoding = encoding || exports.DEFAULT_ENCODING;
|
encoding = encoding || exports.DEFAULT_ENCODING;
|
||||||
|
@ -373,6 +373,18 @@ var a2 = crypto.createHash('sha256').update('Test123').digest('base64');
|
|||||||
var a3 = crypto.createHash('sha512').update('Test123').digest(); // binary
|
var a3 = crypto.createHash('sha512').update('Test123').digest(); // binary
|
||||||
var a4 = crypto.createHash('sha1').update('Test123').digest('buffer');
|
var a4 = crypto.createHash('sha1').update('Test123').digest('buffer');
|
||||||
|
|
||||||
|
// stream interface
|
||||||
|
var a5 = crypto.createHash('sha512');
|
||||||
|
a5.end('Test123');
|
||||||
|
a5 = a5.read();
|
||||||
|
|
||||||
|
var a6 = crypto.createHash('sha512');
|
||||||
|
a6.write('Te');
|
||||||
|
a6.write('st');
|
||||||
|
a6.write('123');
|
||||||
|
a6.end();
|
||||||
|
a6 = a6.read();
|
||||||
|
|
||||||
assert.equal(a0, '8308651804facb7b9af8ffc53a33a22d6a1c8ac2', 'Test SHA1');
|
assert.equal(a0, '8308651804facb7b9af8ffc53a33a22d6a1c8ac2', 'Test SHA1');
|
||||||
assert.equal(a1, 'h\u00ea\u00cb\u0097\u00d8o\fF!\u00fa+\u000e\u0017\u00ca' +
|
assert.equal(a1, 'h\u00ea\u00cb\u0097\u00d8o\fF!\u00fa+\u000e\u0017\u00ca' +
|
||||||
'\u00bd\u008c', 'Test MD5 as binary');
|
'\u00bd\u008c', 'Test MD5 as binary');
|
||||||
@ -392,6 +404,10 @@ assert.deepEqual(a4,
|
|||||||
new Buffer('8308651804facb7b9af8ffc53a33a22d6a1c8ac2', 'hex'),
|
new Buffer('8308651804facb7b9af8ffc53a33a22d6a1c8ac2', 'hex'),
|
||||||
'Test SHA1');
|
'Test SHA1');
|
||||||
|
|
||||||
|
// stream interface should produce the same result.
|
||||||
|
assert.deepEqual(a5, a3, 'stream interface is consistent');
|
||||||
|
assert.deepEqual(a6, a3, 'stream interface is consistent');
|
||||||
|
|
||||||
// Test multiple updates to same hash
|
// Test multiple updates to same hash
|
||||||
var h1 = crypto.createHash('sha1').update('Test123').digest('hex');
|
var h1 = crypto.createHash('sha1').update('Test123').digest('hex');
|
||||||
var h2 = crypto.createHash('sha1').update('Test').update('123').digest('hex');
|
var h2 = crypto.createHash('sha1').update('Test').update('123').digest('hex');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user