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
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:
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.
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
25 * The above copyright notice and this permission notice shall be included in all
26 * copies or substantial portions of the Software.
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
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);
42 chashObj.initWithString(alg);
44 logError("invalid hash algorithm: '"+aAlg+"'");
45 throw new Error("invalid hash algorithm: '"+aAlg+"'");
48 let uniconvObj = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
50 uniconvObj.charset = charset;
52 logError("invalid charset: '"+aCharset+"'");
53 throw new Error("invalid charset: '"+aCharset+"'");
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);
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);