services/sync/tests/unit/test_utils_deriveKey.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/services/sync/tests/unit/test_utils_deriveKey.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,66 @@
     1.4 +Cu.import("resource://services-crypto/WeaveCrypto.js");
     1.5 +Cu.import("resource://services-sync/util.js");
     1.6 +
     1.7 +let cryptoSvc = new WeaveCrypto();
     1.8 +
     1.9 +function run_test() {
    1.10 +  if (this.gczeal) {
    1.11 +    _("Running deriveKey tests with gczeal(2).");
    1.12 +    gczeal(2);
    1.13 +  } else {
    1.14 +    _("Running deriveKey tests with default gczeal.");
    1.15 +  }
    1.16 +
    1.17 +  var iv = cryptoSvc.generateRandomIV();
    1.18 +  var der_passphrase = "secret phrase";
    1.19 +  var der_salt = "RE5YUHpQcGl3bg==";   // btoa("DNXPzPpiwn")
    1.20 +
    1.21 +  _("Testing deriveKeyFromPassphrase. Input is \"" + der_passphrase + "\", \"" + der_salt + "\" (base64-encoded).");
    1.22 +
    1.23 +  // Test friendly-ing.
    1.24 +  do_check_eq("abcdefghijk8mn9pqrstuvwxyz234567",
    1.25 +              Utils.base32ToFriendly("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"));
    1.26 +  do_check_eq("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
    1.27 +              Utils.base32FromFriendly(
    1.28 +                Utils.base32ToFriendly("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")));
    1.29 +
    1.30 +  // Test translation.
    1.31 +  do_check_false(Utils.isPassphrase("o-5wmnu-o5tqc-7lz2h-amkbw-izqzi"));  // Wrong charset.
    1.32 +  do_check_false(Utils.isPassphrase("O-5WMNU-O5TQC-7LZ2H-AMKBW-IZQZI"));  // Wrong charset.
    1.33 +  do_check_true(Utils.isPassphrase("9-5wmnu-95tqc-78z2h-amkbw-izqzi"));
    1.34 +  do_check_true(Utils.isPassphrase("9-5WMNU-95TQC-78Z2H-AMKBW-IZQZI"));   // isPassphrase normalizes.
    1.35 +  do_check_true(Utils.isPassphrase(
    1.36 +      Utils.normalizePassphrase("9-5WMNU-95TQC-78Z2H-AMKBW-IZQZI")));
    1.37 +
    1.38 +  // Base64. We don't actually use this in anger, particularly not with a 32-byte key.
    1.39 +  var der_key = Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt);
    1.40 +  _("Derived key in base64: " + der_key);
    1.41 +  do_check_eq(cryptoSvc.decrypt(cryptoSvc.encrypt("bacon", der_key, iv), der_key, iv), "bacon");
    1.42 +
    1.43 +  // Base64, 16-byte output.
    1.44 +  var der_key = Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16);
    1.45 +  _("Derived key in base64: " + der_key);
    1.46 +  do_check_eq("d2zG0d2cBfXnRwMUGyMwyg==", der_key);
    1.47 +  do_check_eq(cryptoSvc.decrypt(cryptoSvc.encrypt("bacon", der_key, iv), der_key, iv), "bacon");
    1.48 +
    1.49 +  // Base32. Again, specify '16' to avoid it generating a 256-bit key string.
    1.50 +  var b32key = Utils.derivePresentableKeyFromPassphrase(der_passphrase, der_salt, 16);
    1.51 +  var hyphenated = Utils.hyphenatePassphrase(b32key);
    1.52 +  do_check_true(Utils.isPassphrase(b32key));
    1.53 +
    1.54 +  _("Derived key in base32: " + b32key);
    1.55 +  do_check_eq(b32key.length, 26);
    1.56 +  do_check_eq(hyphenated.length, 31);  // 1 char, plus 5 groups of 5, hyphenated = 5 + (5*5) + 1 = 31.
    1.57 +  do_check_eq(hyphenated, "9-5wmnu-95tqc-78z2h-amkbw-izqzi");
    1.58 +
    1.59 +  if (this.gczeal)
    1.60 +    gczeal(0);
    1.61 +
    1.62 +  // Test the equivalence of our NSS and JS versions.
    1.63 +  // Will only work on FF4, of course.
    1.64 +  // Note that we don't add gczeal here: the pure-JS implementation is
    1.65 +  // astonishingly slow, and this check takes five minutes to run.
    1.66 +  do_check_eq(
    1.67 +      Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16, false),
    1.68 +      Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16, true));
    1.69 +}

mercurial