corrade-nucleus-nucleons – Rev 20

Subversion Repositories:
Rev:
(function(){

var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;

// Shortcuts
var util = C.util,
    charenc = C.charenc,
    UTF8 = charenc.UTF8,
    Binary = charenc.Binary;

// Public API
var SHA1 = C.SHA1 = function (message, options) {
        var digestbytes = util.wordsToBytes(SHA1._sha1(message));
        return options && options.asBytes ? digestbytes :
               options && options.asString ? Binary.bytesToString(digestbytes) :
               util.bytesToHex(digestbytes);
};

// The core
SHA1._sha1 = function (message) {

        // Convert to byte array
        if (message.constructor == String) message = UTF8.stringToBytes(message);
        /* else, assume byte array already */

        var m  = util.bytesToWords(message),
            l  = message.length * 8,
            w  =  [],
            H0 =  1732584193,
            H1 = -271733879,
            H2 = -1732584194,
            H3 =  271733878,
            H4 = -1009589776;

        // Padding
        m[l >> 5] |= 0x80 << (24 - l % 32);
        m[((l + 64 >>> 9) << 4) + 15] = l;

        for (var i = 0; i < m.length; i += 16) {

                var a = H0,
                    b = H1,
                    c = H2,
                    d = H3,
                    e = H4;

                for (var j = 0; j < 80; j++) {

                        if (j < 16) w[j] = m[i + j];
                        else {
                                var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
                                w[j] = (n << 1) | (n >>> 31);
                        }

                        var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
                                 j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
                                 j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
                                 j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
                                          (H1 ^ H2 ^ H3) - 899497514);

                        H4 =  H3;
                        H3 =  H2;
                        H2 = (H1 << 30) | (H1 >>> 2);
                        H1 =  H0;
                        H0 =  t;

                }

                H0 += a;
                H1 += b;
                H2 += c;
                H3 += d;
                H4 += e;

        }

        return [H0, H1, H2, H3, H4];

};

// Package private blocksize
SHA1._blocksize = 16;

SHA1._digestsize = 20;

})();