Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,48 @@ The code (`sha256.js` or `sha256.min.js`) defines the `sha256(string)` function,

AMD is also supported - use `index.js` instead.

test.html:
```html
<!-- UNCOMMENT some strings to TEST different included scripts -->
<!--<script src="sha256.js"></script>-->
<!--<script src="sha256.min.js"></script>-->
<!--<script src="sha256_unicode.js"></script>-->
<script src="sha256_unicode.min.js"></script>

<script>
//run script with ASCII - passed for all scripts.
document.write(
'\
(sha256(\'abc\')\
===\
\'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\'\
) '
+
(
sha256('abc') //ASCII-string
===
'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'
)
); //sha256('abc') === 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'

document.write('<br>'); //next string

//run script with UTF-8 - passed only for sha256_unicode.js or sha256_unicode.min.js, and filed for ASCII.
document.write(
'(sha256(\'test_string_with_text. Unicode: 守护村子\')\
===\
\'00ad1ffe387a8e277b81ffa0211c41a67e4580839ed785eea84b751a9e4be546\'\
) '
+
(
sha256('test_string_with_text. Unicode: 守护村子') //UTF-string
===
'00ad1ffe387a8e277b81ffa0211c41a67e4580839ed785eea84b751a9e4be546'
)
); //sha256('test_string_with_text. Unicode: 守护村子') === '00ad1ffe387a8e277b81ffa0211c41a67e4580839ed785eea84b751a9e4be546'
</script>
```

## In Node/CommonJS

If you're on Node, you should probably use the version from the built-in [`crypto` module](http://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm).
Expand Down
30 changes: 24 additions & 6 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<html>
<meta charset="utf-8">
<head>
<title>JavaScript SHA256 demo</title>
<style>
Expand Down Expand Up @@ -52,22 +53,39 @@ <h1>JavaScript SHA-256 demo</h1>

<p>This is a JavaScript implementation of SHA-256, aiming to be as small as I can make it. The goals are:</p>
<ul>
<li>small size- the minified version is <a href="sha256.min.js">less than a kilobyte</a></li>
<li>small size- the minified version is <a href="sha256.min.js">less than a kilobyte (852 bytes)</a></li>
<li>readability - the unminified version should be relatively easy to understand
</ul>
<p>It currently only supports ASCII, so if you need to hash Unicode text you'll need to write a decoder.</p>
<p>It currently only supports ASCII, so if you need to hash Unicode text you'll need to write a decoder,<br>
<a href="sha256_utf8.html">or use this UTF-8 script</a>.</p>

<script src="sha256.min.js"></script>
<textarea id="input" rows=5>abc</textarea>
<div id="description">Unicode (UTF-8) not allowed. Only ascii. Using default script <a href="sha256.min.js">sha256.min.js</a>:</div>
<textarea id="input" rows=5 title="For 'abc' hash must be
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad">abc</textarea>
<input id="button" type="button" value="calculate" />
<div class="check_box"><label><input name="upper_case" id="upper_case" onclick="change_case();" type="checkbox">UpperCase</label></div>
<textarea id="output" rows=1 style="text-align: center"></textarea>

<script>
document.getElementById('button').onclick = function () {
document.getElementById('output').value = sha256(document.getElementById('input').value);
};
function change_case(){
document.getElementById('output').value =
(document.getElementById('upper_case').checked)
? document.getElementById('output').value.toUpperCase()
: document.getElementById('output').value.toLowerCase()
;
}
var update =
document.getElementById('button').onclick = //on click button
document.getElementById('input').oninput = //or oninput value
function () { //run this function
document.getElementById('output').value = sha256(document.getElementById('input').value); //add value to ouput element.
change_case();
};
update(); //run this function on first load page.
</script>

<div id="ascii">Source code <a href="sha256.js">sha256.js</a> (only ASCII):</div>
<pre><code>var sha256 = function sha256(ascii) {
function rightRotate(value, amount) {
return (value>>>amount) | (value&lt;&lt;(32 - amount));
Expand Down
2 changes: 1 addition & 1 deletion sha256.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
var sha256 = function sha256(ascii) {
var sha256 = function sha256(ascii) {
function rightRotate(value, amount) {
return (value>>>amount) | (value<<(32 - amount));
};
Expand Down
2 changes: 1 addition & 1 deletion sha256.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

105 changes: 105 additions & 0 deletions sha256_unicode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
var sha256 = //BEGIN function as variable, like sha256.js. If this will be commented, comment ';' in the end of script.
//sha-256 function
function SHA256(s){ //s - string, unicode supporting.
var chrsz = 8;
var hexcase = 0;
function safe_add (x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
function R (X, n) { return ( X >>> n ); }
function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
function core_sha256 (m, l) {
var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
var W = new Array(64);
var a, b, c, d, e, f, g, h, i, j;
var T1, T2;
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >> 9) << 4) + 15] = l;
for ( var i = 0; i<m.length; i+=16 ) {
a = HASH[0];
b = HASH[1];
c = HASH[2];
d = HASH[3];
e = HASH[4];
f = HASH[5];
g = HASH[6];
h = HASH[7];
for ( var j = 0; j<64; j++) {
if (j < 16) W[j] = m[j + i];
else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
T2 = safe_add(Sigma0256(a), Maj(a, b, c));
h = g;
g = f;
f = e;
e = safe_add(d, T1);
d = c;
c = b;
b = a;
a = safe_add(T1, T2);
}
HASH[0] = safe_add(a, HASH[0]);
HASH[1] = safe_add(b, HASH[1]);
HASH[2] = safe_add(c, HASH[2]);
HASH[3] = safe_add(d, HASH[3]);
HASH[4] = safe_add(e, HASH[4]);
HASH[5] = safe_add(f, HASH[5]);
HASH[6] = safe_add(g, HASH[6]);
HASH[7] = safe_add(h, HASH[7]);
}
return HASH;
}
function str2binb (str) {
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz) {
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
}
return bin;
}
function Utf8Encode(string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
function binb2hex (binarray) {
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++) {
str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
}
return str;
}
s = Utf8Encode(s);
return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
}
//test sha256 from specified 'string', by call this as function, withut variable
//document.write(SHA256('test_string_with_text. Unicode: 守护村子')); //show sha256 hash 00ad1ffe387a8e277b81ffa0211c41a67e4580839ed785eea84b751a9e4be546
; //END function as variable. Delete this ';' if variable not used.
//test sha256 from specified 'string', by calling this as function binded to variable name
//document.write(sha256('test_string_with_text. Unicode: 守护村子')); //show sha256 hash 00ad1ffe387a8e277b81ffa0211c41a67e4580839ed785eea84b751a9e4be546
1 change: 1 addition & 0 deletions sha256_unicode.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading