ARG645
Tera Guru
Options
- Post History
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
on 01-11-2019 08:20 AM
If you are in a Situation where you have to Generate SHA 256 Hash for a String, then there is no direct way/OOB way of generating it in ServiceNow. Thanks to Pava Narayan Jadda [ @jpavanaryan ] for the idea and content.
Usage Example:
var sha256Obj = new SHA256Hashing();
var stringToBeHashed = "hash me";
var hash = sha256Obj.SHA256(stringToBeHashed);
gs.print(hash);
Output:
eb201af5aaf0d60629d3d2a61e466cfc0fedb517add831ecac5235e1daa963d6
Script include:
var SHA256Hashing = Class.create();
SHA256Hashing.prototype =
{
initialize: function()
{
var chrsz = 8;
var hexcase = 0;
},
SHA256:function(s)
{
var chrsz = 8;
var hexcase = 0;
s = this.Utf8Encode(s);
return this.binb2hex(this.core_sha256(this.str2binb(s), s.length * chrsz));
},
safe_add:function (x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
},
S :function(X, n) { return ( X >>> n ) | (X << (32 - n)); },
R :function(X, n) { return ( X >>> n ); },
Ch:function(x, y, z) { return ((x & y) ^ ((~x) & z)); },
Maj:function(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); },
Sigma0256:function(x) { return (this.S(x, 2) ^ this.S(x, 13) ^ this.S(x, 22)); },
Sigma1256:function(x) { return (this.S(x, 6) ^ this.S(x, 11) ^ this.S(x, 25)); },
Gamma0256:function(x) { return (this.S(x, 7) ^ this.S(x, 18) ^ this.R(x, 3)); },
Gamma1256:function(x) { return (this.S(x, 17) ^ this.S(x, 19) ^ this.R(x, 10)); },
core_sha256 :function(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] = this.safe_add(this.safe_add(this.safe_add(this.Gamma1256(W[j - 2]), W[j - 7]), this.Gamma0256(W[j - 15])), W[j - 16]);
T1 = this.safe_add(this.safe_add(this.safe_add(this.safe_add(h, this.Sigma1256(e)), this.Ch(e, f, g)), K[j]), W[j]);
T2 = this.safe_add(this.Sigma0256(a), this.Maj(a, b, c));
h = g;
g = f;
f = e;
e = this.safe_add(d, T1);
d = c;
c = b;
b = a;
a = this.safe_add(T1, T2);
}
HASH[0] = this.safe_add(a, HASH[0]);
HASH[1] = this.safe_add(b, HASH[1]);
HASH[2] = this.safe_add(c, HASH[2]);
HASH[3] = this.safe_add(d, HASH[3]);
HASH[4] = this.safe_add(e, HASH[4]);
HASH[5] = this.safe_add(f, HASH[5]);
HASH[6] = this.safe_add(g, HASH[6]);
HASH[7] = this.safe_add(h, HASH[7]);
}
return HASH;
},
str2binb :function(str)
{
var chrsz = 8;
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;
},
Utf8Encode:function(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;
},
binb2hex :function(binarray)
{
var hexcase = 0;
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;
}
};
Hope it will help someone someday.
Thank you,
Aman Gurram
Labels:
- 4,474 Views
Comments
Jon23
Mega Sage
- Mark as Read
- Mark as New
- Bookmark
- Permalink
- Report Inappropriate Content
06-11-2021
11:33 AM
For those interested, ServiceNow provides an API to do hashing so no need to create your own script include:)