Skip to content

Commit 444fe80

Browse files
committed
separate hash and hmac functions
1 parent 4b17cf3 commit 444fe80

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

create-hash.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
var algs = {
3+
sha1 : require('sha.js/sha1'),
4+
sha256 : require('sha.js/sha256'),
5+
md5 : toConstructor(require('./md5'))
6+
}
7+
8+
function toConstructor (fn) {
9+
return function () {
10+
var buffers = []
11+
var m= {
12+
update: function (data, enc) {
13+
if(!Buffer.isBuffer(data)) data = new Buffer(data, enc)
14+
buffers.push(data)
15+
return this
16+
},
17+
digest: function (enc) {
18+
var buf = Buffer.concat(buffers)
19+
var r = fn(buf)
20+
buffers = null
21+
return enc ? r.toString(enc) : r
22+
}
23+
}
24+
return m
25+
}
26+
}
27+
28+
module.exports = function (alg) {
29+
return new algs[alg]()
30+
}

create-hmac.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
var createHash = require('./create-hash')
2+
3+
var blocksize = 64
4+
var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(0)
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)
9+
10+
if(key.length > blocksize) {
11+
key = fn(key)
12+
} else if(key.length < blocksize) {
13+
key = Buffer.concat([key, zeroBuffer], blocksize)
14+
}
15+
16+
var ipad = new Buffer(blocksize), opad = new Buffer(blocksize)
17+
for(var i = 0; i < blocksize; i++) {
18+
ipad[i] = key[i] ^ 0x36
19+
opad[i] = key[i] ^ 0x5C
20+
}
21+
22+
var hash = fn(Buffer.concat([ipad, data]))
23+
return fn(Buffer.concat([opad, hash]))
24+
}
25+
26+
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
51+
}

0 commit comments

Comments
 (0)