© 2005 Goetz Heller
Table of Contents Description Examples Subclass Template Copyright Note backtry {
if (system.security.encryption.hash.hashAlgorithm == null) {
throw new Error('');
};
} catch(e) { // don't install twice
// dependencies
try {
eval('core');
} catch(e) {
throw new Error('hashAlgorithm: class \'core\' not installed');
}
// generic hash interface
// constructor
var hashAlgorithm = function() {};
// provide for class information
hashAlgorithm.classID = function() {
return 'system.security.encryption.hash.hashAlgorithm';
};
// disallow instantiation
hashAlgorithm.isAbstract = function() {
return true;
};
// class factory
hashAlgorithm.create = function(alg) {
if (arguments.length == 0) {
throw new Error('hashAlgorithm.create(): missing argument');
}
if (typeof alg != 'string') {
throw new Error('hashAlgorithm.create(): wrong argument type');
}
var cls = null;
var cn = alg
try {
cls = core.getClassByID(cn);
} catch(e) {
cn = (new core.classPath(alg)).nameSpaceString();
if (cn == null || cn.length == 0) {
cn = 'system.security.encryption.hash.'+alg;
}
try {
cls = core.getClassByID(cn);
} catch(e) {
throw new Error('hashAlgorithm.create(): class \''+alg+'\' not installed');
}
}
if (cls.sup.classID() != this.classID()) {
throw new Error('hashAlgorithm.create(): class \''+alg+'\' is not a hash algorithm');
}
return core.createInstance(cn);
};
// returns the hash value as a byte array. Assumes computeHash() has been called before.
hashAlgorithm.prototype.getHashValue = function() {
return this.hashValue;
};
// populate with data structures
hashAlgorithm.prototype.initialize = function() {
// do specific initialization stuff
this.buffer = new Array(this.iInputBlockSize); // input buffer (byte)
this.hashValue = new Array(this.iOutputBlockSize);// (byte)
this.hash = '';
};
// override; to be called from overriding method on subclass instance
hashAlgorithm.prototype.reset = function() {
try {
// reset digest string
this.hash = '';
// clear digest array
for (var i = 0; i < this.hashValue.length; i++) {
this.hashValue[i] = 0x00;
this.hash += String.fromCharCode(0);
}
// clear Buffer
for (var i = 0; i < this.buffer.length; i++) {
this.buffer[i] = 0x00;
}
} catch(e) {};
};
// digest a string and return digest as string
hashAlgorithm.prototype.computeHash = function(inp) {
if (typeof inp != 'string') {
return null;
}
this.reset();
this.hashCore(inp, 0, inp.length);
this.hashFinal();
return this.buildHash();
};
// override
hashAlgorithm.prototype.hashCore = function(inp, start, bcount) {
throw new Error ('hashAlgorithm.hashCore(): abstract function not overridden');
};
// build digest string from hashValue, a byte array
hashAlgorithm.prototype.hashFinal = function() {
throw new Error ('hashAlgorithm.hashFinal(): abstract function not overridden');
};
// build digest string from hashValue, a byte array
// override and call from overriding method as last statement
// before returning
hashAlgorithm.prototype.buildHash = function() {
this.hash = '';
for (var i = 0; i < this.hashValue.length; i++) {
this.hash += String.fromCharCode(this.hashValue[i]);
}
return this.hash;
};
core.installClass(hashAlgorithm);
} // end catch