hmac now functional; test methods updated; removed "use strict;"; more jslint cleanup

This commit is contained in:
swaits committed 2010-12-01 10:47:00 -08:00
1 parent af799f2833
commit 357dc6a966
2 files changed
+75 -14

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env ruby
require 'digest/sha1'
# helper to make a 'length' long string filled with 'byte'
def byte_string(byte, length)
([byte]*length).pack('C*')
end
def put_bytes(s)
s.unpack('C*').each { |x| print sprintf("%02d ",x); }
puts
end
# hmac algorithm - returns text version of hmac
def hmac(key, data, digest_object, blocksize)
# if key is too long, hash it
key = digest_object.digest(key) if key.size > blocksize
# pad key out to blocksize
key += byte_string(0,blocksize - key.size) if key.size < blocksize
# create pads
ipad = byte_string(0x36,blocksize)
opad = byte_string(0x5c,blocksize)
blocksize.times do |i|
#ipad[i] ^= key[i]
ipad.setbyte(i,ipad.getbyte(i) ^ key.getbyte(i))
#opad[i] ^= key[i] }
opad.setbyte(i,opad.getbyte(i) ^ key.getbyte(i))
end
puts "Key: "
put_bytes(key)
puts "data: "
put_bytes(data)
puts "ipad: "
put_bytes(ipad)
puts "opad: "
put_bytes(opad)
puts
puts "hash(ipad + data)"
puts digest_object.hexdigest(ipad+data)
puts
puts "hash(opad+hash(ipad+data))"
puts digest_object.hexdigest( opad + digest_object.digest( ipad + data ) )
# do the HMAC and return
digest_object.hexdigest( opad + digest_object.digest( ipad + data ) )
end
# hmac-sha1
def hmac_sha1(key, data)
hmac(key, data, Digest::SHA1, 64)
end
hmac_sha1('Jefe','what do ya want for nothing?');
+18 -14
View File
@@ -1,9 +1,7 @@
/*jslint onevar: true, undef: true, nomen: true, regexp: true, newcap: true, immed: true, strict: true */ /*jslint onevar: true, undef: true, nomen: true, regexp: true, newcap: true, immed: true */
SHA1 = (function() // SHA1 "namespace" var SHA1 = (function() // SHA1 "namespace"
{ {
"use strict";
var hextab = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; var hextab = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
function char_code_to_bytes(code) function char_code_to_bytes(code)
@@ -199,23 +197,23 @@ SHA1 = (function() // SHA1 "namespace"
message = str_to_bytes(message_str), message = str_to_bytes(message_str),
// our pads // our pads
opad = new Array(20), opad = new Array(64),
ipad = new Array(20), ipad = new Array(64),
// misc // misc
i; i;
// setup key // setup key
if (key.length > 20) if (key.length > 64)
{ {
key = sha1(key); // keys longer than blocksize are shortened key = sha1(key); // keys longer than blocksize are shortened
} }
while (key.length < 20) while (key.length < 64)
{ {
key.push(0); key.push(0);
} }
for (i=0; i<20; i++) for (i=0; i<64; i++)
{ {
opad[i] = 0x5c ^ key[i]; opad[i] = 0x5c ^ key[i];
ipad[i] = 0x36 ^ key[i]; ipad[i] = 0x36 ^ key[i];
@@ -226,16 +224,22 @@ SHA1 = (function() // SHA1 "namespace"
function hmac_verify() function hmac_verify()
{ {
var h = hmac_sha1('Jefe','what do ya want for nothing?'); return Boolean(
return Boolean(h == 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79'); hmac_sha1('Jefe','what do ya want for nothing?') == 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79' &&
//return Boolean(hmac_sha1("a","b") == "6657855686823986c874362731139752014cb60b"); hmac_sha1("a","b") == "6657855686823986c874362731139752014cb60b"
);
} }
// our exports function verify()
{
return Boolean(sha1_verify() && hmac_verify());
}
// our exported symbols
return { return {
hash:sha1_string, hash:sha1_string,
hmac:hmac_sha1, hmac:hmac_sha1,
test:hmac_verify test:verify
}; };
}()); // SHA1 "namespace" }()); // SHA1 "namespace"