crypto: Streaming api for Hmac
authorisaacs <i@izs.me>
Mon, 29 Oct 2012 22:21:25 +0000 (15:21 -0700)
committerisaacs <i@izs.me>
Fri, 14 Dec 2012 18:52:27 +0000 (10:52 -0800)
lib/crypto.js
test/simple/test-crypto.js

index 8ea48e2..3807bf4 100644 (file)
@@ -189,16 +189,20 @@ Hash.prototype.digest = function(outputEncoding) {
 
 exports.createHmac = exports.Hmac = Hmac;
 
-function Hmac(hmac, key) {
+function Hmac(hmac, key, options) {
   if (!(this instanceof Hmac))
     return new Hmac(hmac, key);
   this._binding = new binding.Hmac();
   this._binding.init(hmac, toBuf(key));
+  stream.Transform.call(this, options);
 }
 
+util.inherits(Hmac, stream.Transform);
 
 Hmac.prototype.update = Hash.prototype.update;
 Hmac.prototype.digest = Hash.prototype.digest;
+Hmac.prototype._flush = Hash.prototype._flush;
+Hmac.prototype._transform = Hash.prototype._transform;
 
 
 function getDecoder(decoder, encoding) {
index 1db94a9..87a8d0c 100644 (file)
@@ -230,15 +230,20 @@ var rfc4231 = [
 
 for (var i = 0, l = rfc4231.length; i < l; i++) {
   for (var hash in rfc4231[i]['hmac']) {
+    var str = crypto.createHmac(hash, rfc4231[i].key);
+    str.end(rfc4231[i].data);
+    var strRes = str.read().toString('hex');
     var result = crypto.createHmac(hash, rfc4231[i]['key'])
                      .update(rfc4231[i]['data'])
                      .digest('hex');
     if (rfc4231[i]['truncate']) {
       result = result.substr(0, 32); // first 128 bits == 32 hex chars
+      strRes = strRes.substr(0, 32);
     }
     assert.equal(rfc4231[i]['hmac'][hash],
                  result,
                  'Test HMAC-' + hash + ': Test case ' + (i + 1) + ' rfc 4231');
+    assert.equal(strRes, result, 'Should get same result from stream');
   }
 }