moved some utility functions to "basic.js"
[guerillascript.git] / includes / utils.js
blobc4f74faf77a481cb7ecf694bcd6dcdbea5639377
1 /*
2  * Copyright 2015 Ketmar Dark <ketmar@ketmar.no-ip.org>
3  * Portions copyright 2010, Erik Vold
4  * Contributors: See contributors list in install.rdf and CREDITS
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * Note that this license applies only to the Greasemonkey extension source
14  * files, not to the user scripts which it runs. User scripts are licensed
15  * separately by their authors.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  *
25  * The above copyright notice and this permission notice shall be included in all
26  * copies or substantial portions of the Software.
27  */
28 ////////////////////////////////////////////////////////////////////////////////
29 // string aString: A string of data to be hashed.
30 // string aAlg: optional; the hash algorithm to be used; possible values are: MD2, MD5, SHA1, SHA256, SHA384, and SHA512; defaults to SHA1
31 // string aCharset: optional; the charset used by the passed string; defaults to UTF-8
32 function cryptoHash (aString, aAlg, aCharset) {
33   const PR_UINT32_MAX = 0xffffffff; // this tells updateFromStream to read the entire string
35   let str = ""+aString;
36   let alg = (""+(aAlg||"SHA1")).trim().toUpperCase();
37   let charset = (""+(aCharset||"UTF-8")).trim();
39   let chashObj = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
41   try {
42     chashObj.initWithString(alg);
43   } catch (e) {
44     logError("invalid hash algorithm: '"+aAlg+"'");
45     throw new Error("invalid hash algorithm: '"+aAlg+"'");
46   }
48   let uniconvObj = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
49   try {
50     uniconvObj.charset = charset;
51   } catch (e) {
52     logError("invalid charset: '"+aCharset+"'");
53     throw new Error("invalid charset: '"+aCharset+"'");
54   }
56   if (str) chashObj.updateFromStream(uniconvObj.convertToInputStream(str), PR_UINT32_MAX);
57   let hash = chashObj.finish(false); // hash as raw octets
58   return [("0"+hash.charCodeAt(i).toString(16)).slice(-2) for (i in hash)].join("");
60 addExport("cryptoHash", cryptoHash);
63 ////////////////////////////////////////////////////////////////////////////////
64 function calcFileSha512 (fname) {
65   let fl = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
66   fl.initWithPath(fname);
67   let istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
68   // open for reading
69   istream.init(fl, 0x01, 0400, istream.CLOSE_ON_EOF); // 0x01: PR_RDONLY
70   let chan = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
71   chan.init(chan.SHA512);
72   // this tells updateFromStream to read the entire file
73   const PR_UINT32_MAX = 0xffffffff;
74   chan.updateFromStream(istream, PR_UINT32_MAX);
75   // pass false here to get binary data back
76   let hash = chan.finish(false);
77   return [("0"+hash.charCodeAt(i).toString(16)).slice(-2) for (i in hash)].join("");
79 addExport("calcFileSha512", calcFileSha512);