Find your people. Pick a challenge. Ship something real. The CreatorCon Hackathon is coming to the Community Pavilion for one epic night. Every skill level, every role welcome. Join us on May 5th and learn more here.

ARG645
Tera Guru

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

Comments
Jon23
Mega Sage

For those interested, ServiceNow provides an API to do hashing so no need to create your own script include:)

GlideDigest

Version history
Last update:
‎01-11-2019 08:20 AM
Updated by: