Bug 383390, follow up check in, adding a unit Test.
authorkaie@kuix.de
Thu, 21 Jun 2007 08:22:43 -0700
changeset 2638 c1b4c34a44727757ab382ea5fabc96ff63849e54
parent 2637 53753c02dfb17abd28704237aa48e9d7a23b6ffd
child 2639 71ec39697f5fa1b99e5eb118f07d5257e0211a9c
push idunknown
push userunknown
push dateunknown
bugs383390
milestone1.9a6pre
Bug 383390, follow up check in, adding a unit Test. Patch contributed by Nils Maier, comments provided by Jeff Walden r=kengert
security/manager/ssl/Makefile.in
security/manager/ssl/tests/test_hash_algorithms.js
--- a/security/manager/ssl/Makefile.in
+++ b/security/manager/ssl/Makefile.in
@@ -39,9 +39,11 @@
 DEPTH		= ../../..
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 MODULE		= pipnss
 DIRS		= resources src public
 
+XPCSHELL_TESTS  = tests
+
 include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/security/manager/ssl/tests/test_hash_algorithms.js
@@ -0,0 +1,90 @@
+var ScriptableUnicodeConverter =
+  Components.Constructor("@mozilla.org/intl/scriptableunicodeconverter",
+                         "nsIScriptableUnicodeConverter");
+var CryptoHash =
+  Components.Constructor("@mozilla.org/security/hash;1",
+                         "nsICryptoHash",
+                         "initWithString");
+
+var messages = [
+  "The quick brown fox jumps over the lazy dog",
+  ""
+];
+var hashes = {
+  md2: [
+    "03d85a0d629d2c442e987525319fc471",
+    "8350e5a3e24c153df2275c9f80692773"
+  ],
+  md5: [
+    "9e107d9d372bb6826bd81d3542a419d6",
+    "d41d8cd98f00b204e9800998ecf8427e"
+  ],
+  sha1: [
+    "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
+    "da39a3ee5e6b4b0d3255bfef95601890afd80709"
+  ],
+  sha256: [
+    "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
+    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+  ],
+  sha384: [
+   "ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1",
+   "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"
+  ],   
+  sha512: [
+    "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6",
+    "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
+  ]
+};
+
+function hexdigest(data) {
+  /*
+   * Coment taken from bug 383390:
+   *  
+   * First, |data| is the final string value produced by the cryptohash.  |for (i in
+   * data)| uses the Mozilla JS extension that iterating over a string iterates over
+   * its character indexes, so that's 0..length-1 over the hash string.
+   * 
+   * Returning to the left, the |charCodeAt| gets the value of the character at that
+   * index in the string.
+   * 
+   * |slice(-2)| is equivalent to |slice(length of this string - 2)| as a convenient
+   * way of wrapping around to the other end of a string without doing the actual
+   * calculation.  When provided with only one argument, slice selects to the end of
+   * the string, so this chomps off the last two characters of the string.
+   * 
+   * The last-two-characters part clarifies the |"0" +| -- if the Unicode value is
+   * <10, we have a single-character hex string when we want one that's two
+   * characters, and unconditionally prepending a "0" solves the problem.
+   * 
+   * The array comprehension just creates an array whose elements are these
+   * two-character strings.
+   */
+  return [("0" + data.charCodeAt(i).toString(16)).slice(-2) for (i in data)].join("");
+}
+
+function doHash(algo, value, cmp) {
+  var converter = new ScriptableUnicodeConverter();
+  var hash = new CryptoHash(algo);
+
+  converter.charset = 'utf8';
+  value = converter.convertToByteArray(value, {});
+  hash.update(value, value.length);
+  hash = hexdigest(hash.finish(false));
+  if (cmp != hash) {
+    do_throw("Hash mismatch!\n" +
+             "  Expected: " + cmp + "\n" +
+             "  Actual: " + hash + "\n" +
+             "  Algo: " + algo);
+  }
+}
+
+function run_test() {
+  for (algo in hashes) {
+    hashes[algo].forEach(
+      function(e, i) {
+        doHash(algo, messages[i], e);
+      }
+    );
+  }
+}