create project

pull/1/head
Chen Yi-Cyuan 12 years ago
commit 008571f4bc

@ -0,0 +1,3 @@
# v0.1.0 / 2014-01-05
Initial release

@ -0,0 +1,20 @@
Copyright 2014 emn178@gmail.com
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -0,0 +1,132 @@
# js-sha512
This is a simple SHA-512, SHA-384, SHA-512/224, SHA-512/256 hash functions for JavaScript supports UTF-8 encoding.
## Install
For node.js, you can use this command to install:
npm install js-sha512
## Usage
If you use node.js, you should require the module first:
```JavaScript
sha512 = require('js-sha512');
```
or
```JavaScript
sha512 = require('js-sha512').sha512;
sha384 = require('js-sha512').sha384;
sha512_256 = require('js-sha512').sha512_256;
sha512_224 = require('js-sha512').sha512_224;
```
And you could use like this:
```JavaScript
sha512('Message to hash');
sha384('Message to hash');
sha512_256('Message to hash');
sha512_224('Message to hash');
```
## Example
Code
```JavaScript
sha512('');
sha512('The quick brown fox jumps over the lazy dog');
sha512('The quick brown fox jumps over the lazy dog.');
sha384('');
sha384('The quick brown fox jumps over the lazy dog');
sha384('The quick brown fox jumps over the lazy dog.');
sha512_256('');
sha512_256('The quick brown fox jumps over the lazy dog');
sha512_256('The quick brown fox jumps over the lazy dog.');
sha512_224('');
sha512_224('The quick brown fox jumps over the lazy dog');
sha512_224('The quick brown fox jumps over the lazy dog.');
```
Output
cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6
91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed
38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b
ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1
ed892481d8272ca6df370bf706e4d7bc1b5739fa2177aae6c50e946678718fc67a7af2819a021c2fc34e91bdb63409d7
c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a
dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d
1546741840f8a492b959d9b8b2344b9b0eb51b004bba35c0aebaac86d45264c3
6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4
944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37
6d6a9279495ec4061769752e7ff9c68b6b0b3c5a281b7917ce0572de
It also supports UTF-8 encoding:
Code
```JavaScript
sha512('中文');
sha384('中文');
sha512_256('中文');
sha512_224('中文');
```
Output
8b88efc2ebbcbdad5ac2d65af05bec57bda25e71fd5fb25bbd892057a2755fbd05d8d8491cb2946febd5b0f124ffdfbaecf7e34946353c4f1b5ab29545895468
93422ceb8291a69b22f02dc1114c39a287493ad525dcebc77e4019a44eaee2633a85d0f29cd298ee6799048c33a4be0c
b6dab29c16ec35ab34a5d92ff135b58de96741dda78b1009a2181cf8b45d2f72
0f46a0ae7f226517dd66ece0ce1efa29ffb7ced05ac4566fdcaed188
## Tests
You can open `tests/index.html` in browser or use node.js to run test
node tests/node-test.js
or
npm test
## Extensions
### jQuery
If you prefer jQuery style, you can add following code to add a jQuery extension.
Code
```JavaScript
jQuery.sha512 = sha512
jQuery.sha384 = sha384
jQuery.sha512_256 = sha512_256
jQuery.sha512_224 = sha512_224
```
And then you could use like this:
```JavaScript
$.sha512('message');
$.sha384('message');
$.sha512_256('message');
$.sha512_224('message');
```
### Prototype
If you prefer prototype style, you can add following code to add a prototype extension.
Code
```JavaScript
String.prototype.sha512 = function() {
return sha512(this);
};
String.prototype.sha384 = function() {
return sha384(this);
};
String.prototype.sha512_256 = function() {
return sha512_256(this);
};
String.prototype.sha512_224 = function() {
return sha512_224(this);
};
```
And then you could use like this:
```JavaScript
'message'.sha512();
'message'.sha384();
'message'.sha512_256();
'message'.sha512_224();
```
## License
The project is released under the [MIT license](http://www.opensource.org/licenses/MIT).
## Contact
The project's website is located at https://github.com/emn178/js-sha512
Author: emn178@gmail.com

@ -0,0 +1,13 @@
(function(m,K){var a=function(a,h){this.high=a|0;this.low=h|0},z="0123456789abcdef".split(""),E={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,b:11,c:12,d:13,e:14,f:15,A:10,B:11,C:12,D:13,E:14,F:15},J=[new a(1116352408,3609767458),new a(1899447441,602891725),new a(3049323471,3964484399),new a(3921009573,2173295548),new a(961987163,4081628472),new a(1508970993,3053834265),new a(2453635748,2937671579),new a(2870763221,3664609560),new a(3624381080,2734883394),new a(310598401,1164996542),new a(607225278,
1323610764),new a(1426881987,3590304994),new a(1925078388,4068182383),new a(2162078206,991336113),new a(2614888103,633803317),new a(3248222580,3479774868),new a(3835390401,2666613458),new a(4022224774,944711139),new a(264347078,2341262773),new a(604807628,2007800933),new a(770255983,1495990901),new a(1249150122,1856431235),new a(1555081692,3175218132),new a(1996064986,2198950837),new a(2554220882,3999719339),new a(2821834349,766784016),new a(2952996808,2566594879),new a(3210313671,3203337956),new a(3336571891,
1034457026),new a(3584528711,2466948901),new a(113926993,3758326383),new a(338241895,168717936),new a(666307205,1188179964),new a(773529912,1546045734),new a(1294757372,1522805485),new a(1396182291,2643833823),new a(1695183700,2343527390),new a(1986661051,1014477480),new a(2177026350,1206759142),new a(2456956037,344077627),new a(2730485921,1290863460),new a(2820302411,3158454273),new a(3259730800,3505952657),new a(3345764771,106217008),new a(3516065817,3606008344),new a(3600352804,1432725776),new a(4094571909,
1467031594),new a(275423344,851169720),new a(430227734,3100823752),new a(506948616,1363258195),new a(659060556,3750685593),new a(883997877,3785050280),new a(958139571,3318307427),new a(1322822218,3812723403),new a(1537002063,2003034995),new a(1747873779,3602036899),new a(1955562222,1575990012),new a(2024104815,1125592928),new a(2227730452,2716904306),new a(2361852424,442776044),new a(2428436474,593698344),new a(2756734187,3733110249),new a(3204031479,2999351573),new a(3329325298,3815920427),new a(3391569614,
3928383900),new a(3515267271,566280711),new a(3940187606,3454069534),new a(4118630271,4000239992),new a(116418474,1914138554),new a(174292421,2731055270),new a(289380356,3203993006),new a(460393269,320620315),new a(685471733,587496836),new a(852142971,1086792851),new a(1017036298,365543100),new a(1126000580,2618297676),new a(1288033470,3409855158),new a(1501505948,4234509866),new a(1607167915,987167468),new a(1816402316,1246189591)],k=function(a){return q(a,512)},F=function(a){return q(a,384)},G=
function(a){return q(a,256)},H=function(a){return q(a,224)},q=function(b,h){var f;a:{for(f=b.length;f--;)if(255<b.charCodeAt(f)){f=!0;break a}f=!1}if(f){var e=encodeURIComponent(b);f=[];for(var d=0,c=0,g=e.length;d<g;++d){var n=e.charCodeAt(d);f[c>>2]=37==n?f[c>>2]|(E[e.charAt(++d)]<<4|E[e.charAt(++d)])<<(3-c%4<<3):f[c>>2]|n<<(3-c%4<<3);++c}e=(c+16>>7)+1<<5;d=c>>2;f[d]|=128<<(3-c%4<<3);for(d+=1;d<e;++d)f[d]=0;f[e-1]=c<<3;c=[];for(d=0;d<e;d+=2)c[d>>1]=new a(f[d],f[d+1]);f=c}else{e=b.length;f=(e+16>>
7)+1<<5;d=[];for(c=0;c<f;++c)d[c]=0;for(c=0;c<e;++c)d[c>>2]|=b.charCodeAt(c)<<(3-c%4<<3);d[c>>2]|=128<<(3-c%4<<3);d[f-1]=e<<3;e=[];for(c=0;c<f;c+=2)e[c>>1]=new a(d[c],d[c+1]);f=e}if(512==h)var l=new a(1779033703,4089235720),k=new a(3144134277,2227873595),s=new a(1013904242,4271175723),t=new a(2773480762,1595750129),u=new a(1359893119,2917565137),v=new a(2600822924,725511199),w=new a(528734635,4215389547),x=new a(1541459225,327033209);else 384==h?(l=new a(3418070365,3238371032),k=new a(1654270250,
914150663),s=new a(2438529370,812702999),t=new a(355462360,4144912697),u=new a(1731405415,4290775857),v=new a(2394180231,1750603025),w=new a(3675008525,1694076839),x=new a(1203062813,3204075428)):256==h?(l=new a(573645204,4230739756),k=new a(2673172387,3360449730),s=new a(596883563,1867755857),t=new a(2520282905,1497426621),u=new a(2519219938,2827943907),v=new a(3193839141,1401305490),w=new a(721525244,746961066),x=new a(246885852,2177182882)):224==h&&(l=new a(2352822216,424955298),k=new a(1944164710,
2312950998),s=new a(502970286,855612546),t=new a(1738396948,1479516111),u=new a(258812777,2077511080),v=new a(2011393907,79989058),w=new a(1067287976,1780299464),x=new a(286451373,2446758561));d=0;for(c=f.length;d<c;d+=16){for(var e=[],y,p,g=0;16>g;++g)e[g]=f[d+g];for(g=16;80>g;++g)y=e[g-15].rightRotate(1).xor(e[g-15].rightRotate(8)).xor(e[g-15].shiftRightUnsigned(7)),p=e[g-2].rightRotate(19).xor(e[g-2].rightRotate(61)).xor(e[g-2].shiftRightUnsigned(6)),e[g]=e[g-16].add(y).add(e[g-7]).add(p);for(var n=
l,m=k,A=s,q=t,r=u,B=v,C=w,D=x,z,g=0;80>g;++g)y=n.rightRotate(28).xor(n.rightRotate(34)).xor(n.rightRotate(39)),p=n.and(m).xor(n.and(A)).xor(m.and(A)),y=y.add(p),p=r.rightRotate(14).xor(r.rightRotate(18)).xor(r.rightRotate(41)),z=r.and(B).xor(r.not().and(C)),p=D.add(p).add(z).add(J[g]).add(e[g]),D=C,C=B,B=r,r=q.add(p),q=A,A=m,m=n,n=p.add(y);l=l.add(n);k=k.add(m);s=s.add(A);t=t.add(q);u=u.add(r);v=v.add(B);w=w.add(C);x=x.add(D)}l=l.toHexString()+k.toHexString()+s.toHexString()+t.toHexString();if(224==
h)return l.substr(0,l.length-8);384<=h&&(l+=u.toHexString()+v.toHexString());512==h&&(l+=w.toHexString()+x.toHexString());return l},I=function(a){for(var h="",f=0;4>f;f++)var e=3-f<<3,h=h+(z[a>>e+4&15]+z[a>>e&15]);return h};a.prototype.and=function(b){return new a(this.high&b.high,this.low&b.low)};a.prototype.xor=function(b){return new a(this.high^b.high,this.low^b.low)};a.prototype.not=function(){return new a(~this.high,~this.low)};a.prototype.shiftRightUnsigned=function(b){b&=63;return 0==b?new a(this.high,
this.low):32>b?new a(this.high>>>b,this.low>>>b|this.high<<32-b):32==b?new a(0,this.high):new a(0,this.high>>>b-32)};a.prototype.rightRotate=function(b){b&=63;return 0==b?new a(this.high,this.low):32>b?new a(this.high>>>b|this.low<<32-b,this.low>>>b|this.high<<32-b):32==b?new a(this.low,this.high):new a(this.low>>>b-32|this.high<<64-b,this.high>>>b-32|this.low<<64-b)};a.prototype.add=function(b){var h=(this.low&65535)+(b.low&65535),f=(this.low>>>16)+(b.low>>>16)+(h>>>16),e=(this.high&65535)+(b.high&
65535)+(f>>>16);return new a((this.high>>>16)+(b.high>>>16)+(e>>>16)<<16|e&65535,f<<16|h&65535)};a.prototype.toHexString=function(){return I(this.high)+I(this.low)};"undefined"!=typeof module?(k.sha512=k,k.sha384=F,k.sha512_256=G,k.sha512_224=H,module.exports=k):m&&(m.sha512=k,m.sha384=F,m.sha512_256=G,m.sha512_224=H)})(this);

@ -0,0 +1,31 @@
{
"name": "js-sha512",
"version": "0.1.0",
"description": "This is a simple SHA-512, SHA-384, SHA-512/224, SHA-512/256 hash functions for JavaScript supports UTF-8 encoding.",
"main": "src/sha512.js",
"scripts": {
"test": "node tests/node-test.js"
},
"repository": {
"type": "git",
"url": "https://github.com/emn178/js-sha512.git"
},
"keywords": [
"sha",
"sha2",
"sha384",
"sha512",
"sha512/224",
"sha512/256",
"hash",
"encryption",
"cryptography",
"HMAC"
],
"license": "MIT",
"author": "emn178 <emn178@gmail.com>",
"homepage": "https://github.com/emn178/js-sha512",
"bugs": {
"url": "https://github.com/emn178/js-sha512/issues"
}
}

@ -0,0 +1,328 @@
/*
* js-sha512 v0.1.0
* https://github.com/emn178/js-sha512
*
* Copyright 2014, emn178@gmail.com
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
(function(root, undefined){
'use strict';
// Class Long
var Long = function(high, low){
this.high = high | 0;
this.low = low | 0;
};
var HEX_CHARS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
var HEX_TABLE = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15
};
var K =[new Long(0x428A2F98, 0xD728AE22), new Long(0x71374491, 0x23EF65CD),
new Long(0xB5C0FBCF, 0xEC4D3B2F), new Long(0xE9B5DBA5, 0x8189DBBC),
new Long(0x3956C25B, 0xF348B538), new Long(0x59F111F1, 0xB605D019),
new Long(0x923F82A4, 0xAF194F9B), new Long(0xAB1C5ED5, 0xDA6D8118),
new Long(0xD807AA98, 0xA3030242), new Long(0x12835B01, 0x45706FBE),
new Long(0x243185BE, 0x4EE4B28C), new Long(0x550C7DC3, 0xD5FFB4E2),
new Long(0x72BE5D74, 0xF27B896F), new Long(0x80DEB1FE, 0x3B1696B1),
new Long(0x9BDC06A7, 0x25C71235), new Long(0xC19BF174, 0xCF692694),
new Long(0xE49B69C1, 0x9EF14AD2), new Long(0xEFBE4786, 0x384F25E3),
new Long(0x0FC19DC6, 0x8B8CD5B5), new Long(0x240CA1CC, 0x77AC9C65),
new Long(0x2DE92C6F, 0x592B0275), new Long(0x4A7484AA, 0x6EA6E483),
new Long(0x5CB0A9DC, 0xBD41FBD4), new Long(0x76F988DA, 0x831153B5),
new Long(0x983E5152, 0xEE66DFAB), new Long(0xA831C66D, 0x2DB43210),
new Long(0xB00327C8, 0x98FB213F), new Long(0xBF597FC7, 0xBEEF0EE4),
new Long(0xC6E00BF3, 0x3DA88FC2), new Long(0xD5A79147, 0x930AA725),
new Long(0x06CA6351, 0xE003826F), new Long(0x14292967, 0x0A0E6E70),
new Long(0x27B70A85, 0x46D22FFC), new Long(0x2E1B2138, 0x5C26C926),
new Long(0x4D2C6DFC, 0x5AC42AED), new Long(0x53380D13, 0x9D95B3DF),
new Long(0x650A7354, 0x8BAF63DE), new Long(0x766A0ABB, 0x3C77B2A8),
new Long(0x81C2C92E, 0x47EDAEE6), new Long(0x92722C85, 0x1482353B),
new Long(0xA2BFE8A1, 0x4CF10364), new Long(0xA81A664B, 0xBC423001),
new Long(0xC24B8B70, 0xD0F89791), new Long(0xC76C51A3, 0x0654BE30),
new Long(0xD192E819, 0xD6EF5218), new Long(0xD6990624, 0x5565A910),
new Long(0xF40E3585, 0x5771202A), new Long(0x106AA070, 0x32BBD1B8),
new Long(0x19A4C116, 0xB8D2D0C8), new Long(0x1E376C08, 0x5141AB53),
new Long(0x2748774C, 0xDF8EEB99), new Long(0x34B0BCB5, 0xE19B48A8),
new Long(0x391C0CB3, 0xC5C95A63), new Long(0x4ED8AA4A, 0xE3418ACB),
new Long(0x5B9CCA4F, 0x7763E373), new Long(0x682E6FF3, 0xD6B2B8A3),
new Long(0x748F82EE, 0x5DEFB2FC), new Long(0x78A5636F, 0x43172F60),
new Long(0x84C87814, 0xA1F0AB72), new Long(0x8CC70208, 0x1A6439EC),
new Long(0x90BEFFFA, 0x23631E28), new Long(0xA4506CEB, 0xDE82BDE9),
new Long(0xBEF9A3F7, 0xB2C67915), new Long(0xC67178F2, 0xE372532B),
new Long(0xCA273ECE, 0xEA26619C), new Long(0xD186B8C7, 0x21C0C207),
new Long(0xEADA7DD6, 0xCDE0EB1E), new Long(0xF57D4F7F, 0xEE6ED178),
new Long(0x06F067AA, 0x72176FBA), new Long(0x0A637DC5, 0xA2C898A6),
new Long(0x113F9804, 0xBEF90DAE), new Long(0x1B710B35, 0x131C471B),
new Long(0x28DB77F5, 0x23047D84), new Long(0x32CAAB7B, 0x40C72493),
new Long(0x3C9EBE0A, 0x15C9BEBC), new Long(0x431D67C4, 0x9C100D4C),
new Long(0x4CC5D4BE, 0xCB3E42B6), new Long(0x597F299C, 0xFC657E2A),
new Long(0x5FCB6FAB, 0x3AD6FAEC), new Long(0x6C44198C, 0x4A475817)];
var sha512 = function(message) {
return sha2(message, 512);
};
var sha384 = function(message) {
return sha2(message, 384);
};
var sha512_256 = function(message) {
return sha2(message, 256);
};
var sha512_224 = function(message) {
return sha2(message, 224);
};
var sha2 = function(message, tbit) {
var blocks = hasUTF8(message) ? UTF8toBlocks(message) : ASCIItoBlocks(message);
if(tbit == 512)
{
var h0 = new Long(0x6A09E667, 0xF3BCC908);
var h1 = new Long(0xBB67AE85, 0x84CAA73B);
var h2 = new Long(0x3C6EF372, 0xFE94F82B);
var h3 = new Long(0xA54FF53A, 0x5F1D36F1);
var h4 = new Long(0x510E527F, 0xADE682D1);
var h5 = new Long(0x9B05688C, 0x2B3E6C1F);
var h6 = new Long(0x1F83D9AB, 0xFB41BD6B);
var h7 = new Long(0x5BE0CD19, 0x137E2179);
}
else if(tbit == 384)
{
var h0 = new Long(0xCBBB9D5D, 0xC1059ED8);
var h1 = new Long(0x629A292A, 0x367CD507);
var h2 = new Long(0x9159015A, 0x3070DD17);
var h3 = new Long(0x152FECD8, 0xF70E5939);
var h4 = new Long(0x67332667, 0xFFC00B31);
var h5 = new Long(0x8EB44A87, 0x68581511);
var h6 = new Long(0xDB0C2E0D, 0x64F98FA7);
var h7 = new Long(0x47B5481D, 0xBEFA4FA4);
}
else if(tbit == 256)
{
var h0 = new Long(0x22312194, 0xFC2BF72C);
var h1 = new Long(0x9F555FA3, 0xC84C64C2);
var h2 = new Long(0x2393B86B, 0x6F53B151);
var h3 = new Long(0x96387719, 0x5940EABD);
var h4 = new Long(0x96283EE2, 0xA88EFFE3);
var h5 = new Long(0xBE5E1E25, 0x53863992);
var h6 = new Long(0x2B0199FC, 0x2C85B8AA);
var h7 = new Long(0x0EB72DDC, 0x81C52CA2);
}
else if(tbit == 224)
{
var h0 = new Long(0x8C3D37C8, 0x19544DA2);
var h1 = new Long(0x73E19966, 0x89DCD4D6);
var h2 = new Long(0x1DFAB7AE, 0x32FF9C82);
var h3 = new Long(0x679DD514, 0x582F9FCF);
var h4 = new Long(0x0F6D2B69, 0x7BD44DA8);
var h5 = new Long(0x77E36F73, 0x04C48942);
var h6 = new Long(0x3F9D85A8, 0x6A1D36C8);
var h7 = new Long(0x1112E6AD, 0x91D692A1);
}
for(var i = 0, length = blocks.length;i < length;i += 16)
{
var w = [], s0, s1;
for(var j = 0;j < 16;++j)
w[j] = blocks[i + j];
for(var j = 16;j < 80;++j)
{
s0 = w[j - 15].rightRotate(1).xor(w[j - 15].rightRotate(8)).xor(w[j - 15].shiftRightUnsigned(7));
s1 = w[j - 2].rightRotate(19).xor(w[j - 2].rightRotate(61)).xor(w[j - 2].shiftRightUnsigned(6));
w[j] = w[j - 16].add(s0).add(w[j - 7]).add(s1);
}
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
var f = h5;
var g = h6;
var h = h7;
var maj, t1, t2, ch;
for(var j = 0;j < 80;++j)
{
s0 = a.rightRotate(28).xor(a.rightRotate(34)).xor(a.rightRotate(39));
maj = a.and(b).xor(a.and(c)).xor(b.and(c));
t2 = s0.add(maj);
s1 = e.rightRotate(14).xor(e.rightRotate(18)).xor(e.rightRotate(41));
ch = e.and(f).xor(e.not().and(g));
t1 = h.add(s1).add(ch).add(K[j]).add(w[j]);
h = g;
g = f;
f = e;
e = d.add(t1);
d = c;
c = b;
b = a;
a = t1.add(t2);
}
h0 = h0.add(a);
h1 = h1.add(b);
h2 = h2.add(c);
h3 = h3.add(d);
h4 = h4.add(e);
h5 = h5.add(f);
h6 = h6.add(g);
h7 = h7.add(h);
}
var hex = h0.toHexString() + h1.toHexString() + h2.toHexString() + h3.toHexString();
if(tbit == 224)
return hex.substr(0, hex.length - 8);
if(tbit >= 384)
hex += h4.toHexString() + h5.toHexString();
if(tbit == 512)
hex += h6.toHexString() + h7.toHexString();
return hex;
};
var hasUTF8 = function(message) {
var i = message.length;
while(i--)
if(message.charCodeAt(i) > 255)
return true;
return false;
};
var ASCIItoBlocks = function(message) {
// a block is 32 bits(4 bytes), a chunk is 1024 bits(128 bytes)
var length = message.length;
var chunkCount = ((length + 16) >> 7) + 1;
var blockCount = chunkCount << 5; // chunkCount * 32
var blocks = [];
var i;
for(i = 0;i < blockCount;++i)
blocks[i] = 0;
for(i = 0;i < length;++i)
blocks[i >> 2] |= message.charCodeAt(i) << (3 - (i % 4) << 3);
blocks[i >> 2] |= 0x80 << (3 - (i % 4) << 3);
blocks[blockCount - 1] = length << 3; // length * 8
var blocks64 = [];
for(i = 0;i < blockCount;i += 2)
blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]);
return blocks64;
};
var UTF8toBlocks = function(message) {
var uri = encodeURIComponent(message);
var blocks = [];
for(var i = 0, bytes = 0, length = uri.length;i < length;++i)
{
var c = uri.charCodeAt(i);
if(c == 37) // %
blocks[bytes >> 2] |= ((HEX_TABLE[uri.charAt(++i)] << 4) | HEX_TABLE[uri.charAt(++i)]) << (3 - (bytes % 4) << 3);
else
blocks[bytes >> 2] |= c << (3 - (bytes % 4) << 3);
++bytes;
}
var chunkCount = ((bytes + 16) >> 7) + 1;
var blockCount = chunkCount << 5; // chunkCount * 32
var index = bytes >> 2;
blocks[index] |= 0x80 << (3 - (bytes % 4) << 3);
for(var i = index + 1;i < blockCount;++i)
blocks[i] = 0;
blocks[blockCount - 1] = bytes << 3; // bytes * 8
var blocks64 = [];
for(i = 0;i < blockCount;i += 2)
blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]);
return blocks64;
};
var toHexString = function(num) {
var hex = "";
for(var i = 0; i < 4; i++)
{
var offset = 3 - i << 3;
hex += HEX_CHARS[(num >> (offset + 4)) & 0x0F] + HEX_CHARS[(num >> offset) & 0x0F];
}
return hex;
};
Long.prototype.and = function(other){
return new Long(this.high & other.high, this.low & other.low);
};
Long.prototype.xor = function(other){
return new Long(this.high ^ other.high, this.low ^ other.low);
};
Long.prototype.not = function(){
return new Long(~this.high, ~this.low);
};
Long.prototype.shiftRightUnsigned = function(numBits){
numBits &= 63;
if(numBits == 0)
return new Long(this.high, this.low);
if(numBits < 32)
return new Long(this.high >>> numBits, (this.low >>> numBits) | (this.high << (32 - numBits)));
else if(numBits == 32)
return new Long(0, this.high);
else
return new Long(0, this.high >>> (numBits - 32));
};
Long.prototype.rightRotate = function(numBits){
numBits &= 63;
if(numBits == 0)
return new Long(this.high, this.low);
if(numBits < 32)
return new Long((this.high >>> numBits) | (this.low << (32 - numBits)), (this.low >>> numBits) | (this.high << (32 - numBits)));
else if(numBits == 32)
return new Long(this.low, this.high);
else
return new Long((this.low >>> (numBits - 32)) | (this.high << (64 - numBits)), (this.high >>> (numBits - 32)) | (this.low << (64 - numBits)));
};
Long.prototype.add = function(other){
var a1 = this.low & 0xFFFF;
var a2 = this.low >>> 16;
var a3 = this.high & 0xFFFF;
var a4 = this.high >>> 16;
var b1 = other.low & 0xFFFF;
var b2 = other.low >>> 16;
var b3 = other.high & 0xFFFF;
var b4 = other.high >>> 16;
var c1 = a1 + b1;
var c2 = a2 + b2 + (c1 >>> 16);
var c3 = a3 + b3 + (c2 >>> 16);
var c4 = a4 + b4 + (c3 >>> 16);
return new Long((c4 << 16) | (c3 & 0xFFFF), (c2 << 16) | (c1 & 0xFFFF));
};
Long.prototype.toHexString = function() {
return toHexString(this.high) + toHexString(this.low);
};
if(typeof(module) != 'undefined')
{
sha512.sha512 = sha512;
sha512.sha384 = sha384;
sha512.sha512_256 = sha512_256;
sha512.sha512_224 = sha512_224;
module.exports = sha512;
}
else if(root)
{
root.sha512 = sha512;
root.sha384 = sha384;
root.sha512_256 = sha512_256;
root.sha512_224 = sha512_224;
}
}(this));

@ -0,0 +1,12 @@
(function(root) {
var assert = function (title, expect, actual) {
if(expect == actual)
console.log(title + ': true');
else
console.log(title + ': false', 'Except:' + expect, 'Actual: ' + actual);
};
if(typeof(module) != 'undefined')
global.assert = assert;
else if(root)
root.assert = assert;
})(this);

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SHA512</title>
<script src="../src/sha512.js"></script>
<script src="debug.js"></script>
<script src="test.js"></script>
</head>
<body>
</body>
</html>

@ -0,0 +1,9 @@
// this also works:
// sha512 = require('../src/sha512.js');
sha512 = require('../src/sha512.js').sha512;
sha384 = require('../src/sha512.js').sha384;
sha512_256 = require('../src/sha512.js').sha512_256;
sha512_224 = require('../src/sha512.js').sha512_224;
require('./debug.js');
require('./test.js');

@ -0,0 +1,12 @@
assert('sha512 1', 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e', sha512(''));
assert('sha512 2', '07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6', sha512('The quick brown fox jumps over the lazy dog'));
assert('sha512 3', '91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed', sha512('The quick brown fox jumps over the lazy dog.'));
assert('sha384 1', '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b', sha384(''));
assert('sha384 2', 'ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1', sha384('The quick brown fox jumps over the lazy dog'));
assert('sha384 3', 'ed892481d8272ca6df370bf706e4d7bc1b5739fa2177aae6c50e946678718fc67a7af2819a021c2fc34e91bdb63409d7', sha384('The quick brown fox jumps over the lazy dog.'));
assert('sha512/256 1', 'c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a', sha512_256(''));
assert('sha512/256 2', 'dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d', sha512_256('The quick brown fox jumps over the lazy dog'));
assert('sha512/256 3', '1546741840f8a492b959d9b8b2344b9b0eb51b004bba35c0aebaac86d45264c3', sha512_256('The quick brown fox jumps over the lazy dog.'));
assert('sha512/224 1', '6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4', sha512_224(''));
assert('sha512/224 2', '944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37', sha512_224('The quick brown fox jumps over the lazy dog'));
assert('sha512/224 3', '6d6a9279495ec4061769752e7ff9c68b6b0b3c5a281b7917ce0572de', sha512_224('The quick brown fox jumps over the lazy dog.'));
Loading…
Cancel
Save