blocktrail-sdk
Version:
BlockTrail's Developer Friendly API binding for NodeJS
107 lines (86 loc) • 3.38 kB
JavaScript
function hmac_sha1_constructor ( options ) {
options = options || {};
if ( !( options.hash instanceof sha1_constructor ) )
options.hash = get_sha1_instance();
hmac_constructor.call( this, options );
return this;
}
function hmac_sha1_reset ( options ) {
options = options || {};
this.result = null;
this.hash.reset();
var password = options.password;
if ( password !== undefined ) {
if ( is_string(password) )
password = string_to_bytes(password);
var key = this.key = _hmac_key( this.hash, password );
this.hash.reset().asm.hmac_init(
(key[0]<<24)|(key[1]<<16)|(key[2]<<8)|(key[3]),
(key[4]<<24)|(key[5]<<16)|(key[6]<<8)|(key[7]),
(key[8]<<24)|(key[9]<<16)|(key[10]<<8)|(key[11]),
(key[12]<<24)|(key[13]<<16)|(key[14]<<8)|(key[15]),
(key[16]<<24)|(key[17]<<16)|(key[18]<<8)|(key[19]),
(key[20]<<24)|(key[21]<<16)|(key[22]<<8)|(key[23]),
(key[24]<<24)|(key[25]<<16)|(key[26]<<8)|(key[27]),
(key[28]<<24)|(key[29]<<16)|(key[30]<<8)|(key[31]),
(key[32]<<24)|(key[33]<<16)|(key[34]<<8)|(key[35]),
(key[36]<<24)|(key[37]<<16)|(key[38]<<8)|(key[39]),
(key[40]<<24)|(key[41]<<16)|(key[42]<<8)|(key[43]),
(key[44]<<24)|(key[45]<<16)|(key[46]<<8)|(key[47]),
(key[48]<<24)|(key[49]<<16)|(key[50]<<8)|(key[51]),
(key[52]<<24)|(key[53]<<16)|(key[54]<<8)|(key[55]),
(key[56]<<24)|(key[57]<<16)|(key[58]<<8)|(key[59]),
(key[60]<<24)|(key[61]<<16)|(key[62]<<8)|(key[63])
);
}
else {
this.hash.asm.hmac_reset();
}
var verify = options.verify;
if ( verify !== undefined ) {
_hmac_init_verify.call( this, verify );
}
else {
this.verify = null;
}
return this;
}
function hmac_sha1_finish () {
if ( this.key === null )
throw new IllegalStateError("no key is associated with the instance");
if ( this.result !== null )
throw new IllegalStateError("state must be reset before processing new data");
var hash = this.hash,
asm = this.hash.asm,
heap = this.hash.heap;
asm.hmac_finish( hash.pos, hash.len, 0 );
var verify = this.verify;
var result = new Uint8Array(_sha1_hash_size);
result.set( heap.subarray( 0, _sha1_hash_size ) );
if ( verify ) {
if ( verify.length === result.length ) {
var diff = 0;
for ( var i = 0; i < verify.length; i++ ) {
diff |= ( verify[i] ^ result[i] );
}
this.result = !diff;
} else {
this.result = false;
}
}
else {
this.result = result;
}
return this;
}
hmac_sha1_constructor.BLOCK_SIZE = sha1_constructor.BLOCK_SIZE;
hmac_sha1_constructor.HMAC_SIZE = sha1_constructor.HASH_SIZE;
var hmac_sha1_prototype = hmac_sha1_constructor.prototype;
hmac_sha1_prototype.reset = hmac_sha1_reset;
hmac_sha1_prototype.process = hmac_process;
hmac_sha1_prototype.finish = hmac_sha1_finish;
var hmac_sha1_instance = null;
function get_hmac_sha1_instance () {
if ( hmac_sha1_instance === null ) hmac_sha1_instance = new hmac_sha1_constructor();
return hmac_sha1_instance;
}