@@ -3,49 +3,39 @@ var createHash = require('./create-hash')
3
3
var blocksize = 64
4
4
var zeroBuffer = new Buffer ( blocksize ) ; zeroBuffer . fill ( 0 )
5
5
6
- function hmac ( fn , key , data ) {
7
- if ( ! Buffer . isBuffer ( key ) ) key = new Buffer ( key )
8
- if ( ! Buffer . isBuffer ( data ) ) data = new Buffer ( data )
6
+ module . exports = Hmac
7
+
8
+ function Hmac ( alg , key ) {
9
+ if ( ! ( this instanceof Hmac ) ) return new Hmac ( alg , key )
10
+ this . _opad = opad
11
+ this . _alg = alg
12
+
13
+ key = this . _key = ! Buffer . isBuffer ( key ) ? new Buffer ( key ) : key
9
14
10
15
if ( key . length > blocksize ) {
11
- key = fn ( key )
16
+ key = createHash ( alg ) . update ( key ) . digest ( )
12
17
} else if ( key . length < blocksize ) {
13
18
key = Buffer . concat ( [ key , zeroBuffer ] , blocksize )
14
19
}
15
20
16
- var ipad = new Buffer ( blocksize ) , opad = new Buffer ( blocksize )
21
+ var ipad = this . _ipad = new Buffer ( blocksize )
22
+ var opad = this . _opad = new Buffer ( blocksize )
23
+
17
24
for ( var i = 0 ; i < blocksize ; i ++ ) {
18
25
ipad [ i ] = key [ i ] ^ 0x36
19
26
opad [ i ] = key [ i ] ^ 0x5C
20
27
}
21
28
22
- var hash = fn ( Buffer . concat ( [ ipad , data ] ) )
23
- return fn ( Buffer . concat ( [ opad , hash ] ) )
29
+ this . _hash = createHash ( alg ) . update ( ipad )
24
30
}
25
31
32
+ Hmac . prototype . update = function ( data , enc ) {
33
+ this . _hash . update ( data , enc )
34
+ return this
35
+ }
26
36
27
- module . exports = createHmac
28
-
29
- function createHmac ( alg , key ) {
30
- if ( ! Buffer . isBuffer ( key ) ) key = new Buffer ( key )
31
- // if(!Buffer.isBuffer(data)) data = new Buffer(data)
32
-
33
- if ( key . length > blocksize ) {
34
- key = createHash ( alg ) . update ( key ) . digest ( )
35
- } else if ( key . length < blocksize ) {
36
- key = Buffer . concat ( [ key , zeroBuffer ] , blocksize )
37
- }
38
-
39
- var ipad = new Buffer ( blocksize ) , opad = new Buffer ( blocksize )
40
- for ( var i = 0 ; i < blocksize ; i ++ ) {
41
- ipad [ i ] = key [ i ] ^ 0x36
42
- opad [ i ] = key [ i ] ^ 0x5C
43
- }
44
- hash = createHash ( alg ) . update ( ipad ) //.update(data)
45
- var digest = hash . digest
46
- hash . digest = function ( enc ) {
47
- var h = digest . call ( hash )
48
- return createHash ( alg ) . update ( opad ) . update ( h ) . digest ( enc )
49
- }
50
- return hash
37
+ Hmac . prototype . digest = function ( enc ) {
38
+ var h = this . _hash . digest ( )
39
+ return createHash ( this . _alg ) . update ( this . _opad ) . update ( h ) . digest ( enc )
51
40
}
41
+
0 commit comments