From 246446ec4a0511a759706b39169bb67adaf4e60a Mon Sep 17 00:00:00 2001 From: username1565 <39200328+username1565@users.noreply.github.com> Date: Wed, 13 Feb 2019 04:09:01 +0200 Subject: [PATCH] Add utf-8 supporting + minified + tests Browser web-version: Added file sha256_unicode.js - sha256 function with UTF-8 supporting. Added file sha256_unicode.min.js - minified version, after minify, using online javascript minifiers. Added page sha256_utf8.html - demo page. Added page test.html - with tests ASCII and UTF-8. Source code of test.html added to README.md All files and scripts (sha256.js and sha256.min.js too), are encoded as UTF-8 text (with BOM), now. Change index.html: - meta-tag with utf-8 encoding - added. - added size in bytes for sha256.min.js (852 bytes). - Link to sha256_utf8.html - added. - Description for textarea - added. - The title tooltip for input textarea. - Upper-case checkbox and function change_case() - added. - eventlistener oninput - added. Now hash updating on input value. - Run hash-function, when page loaded. - Description for code - added. --- README.md | 42 +++++++++ index.html | 30 +++++-- sha256.js | 2 +- sha256.min.js | 2 +- sha256_unicode.js | 105 ++++++++++++++++++++++ sha256_unicode.min.js | 1 + sha256_utf8.html | 204 ++++++++++++++++++++++++++++++++++++++++++ test.html | 38 ++++++++ 8 files changed, 416 insertions(+), 8 deletions(-) create mode 100644 sha256_unicode.js create mode 100644 sha256_unicode.min.js create mode 100644 sha256_utf8.html create mode 100644 test.html diff --git a/README.md b/README.md index f14b48c..5d33ea6 100644 --- a/README.md +++ b/README.md @@ -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 + + + + + + + +``` + ## 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). diff --git a/index.html b/index.html index 165680a..99db21d 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,5 @@ + JavaScript SHA256 demo + + +
+

JavaScript SHA256-UTF8 demo

+ +

This is a JavaScript implementation of SHA-256, aiming to be as small as I can make it. The goals are:

+ +

ASCII version currently only supports ASCII, so if you need to hash Unicode text you'll need to write a decoder.

+ + +
Unicode (UTF-8) allowed. Using another script sha256_unicode.js:
+ + +
+ +
+

Source +code +sha256_unicode.js (unicode 8-bit supporting) +
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>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
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/test.html b/test.html new file mode 100644 index 0000000..5690d62 --- /dev/null +++ b/test.html @@ -0,0 +1,38 @@ + + + + + + +