services/sync/tests/unit/test_utils_deriveKey.js

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 Cu.import("resource://services-crypto/WeaveCrypto.js");
     2 Cu.import("resource://services-sync/util.js");
     4 let cryptoSvc = new WeaveCrypto();
     6 function run_test() {
     7   if (this.gczeal) {
     8     _("Running deriveKey tests with gczeal(2).");
     9     gczeal(2);
    10   } else {
    11     _("Running deriveKey tests with default gczeal.");
    12   }
    14   var iv = cryptoSvc.generateRandomIV();
    15   var der_passphrase = "secret phrase";
    16   var der_salt = "RE5YUHpQcGl3bg==";   // btoa("DNXPzPpiwn")
    18   _("Testing deriveKeyFromPassphrase. Input is \"" + der_passphrase + "\", \"" + der_salt + "\" (base64-encoded).");
    20   // Test friendly-ing.
    21   do_check_eq("abcdefghijk8mn9pqrstuvwxyz234567",
    22               Utils.base32ToFriendly("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"));
    23   do_check_eq("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
    24               Utils.base32FromFriendly(
    25                 Utils.base32ToFriendly("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")));
    27   // Test translation.
    28   do_check_false(Utils.isPassphrase("o-5wmnu-o5tqc-7lz2h-amkbw-izqzi"));  // Wrong charset.
    29   do_check_false(Utils.isPassphrase("O-5WMNU-O5TQC-7LZ2H-AMKBW-IZQZI"));  // Wrong charset.
    30   do_check_true(Utils.isPassphrase("9-5wmnu-95tqc-78z2h-amkbw-izqzi"));
    31   do_check_true(Utils.isPassphrase("9-5WMNU-95TQC-78Z2H-AMKBW-IZQZI"));   // isPassphrase normalizes.
    32   do_check_true(Utils.isPassphrase(
    33       Utils.normalizePassphrase("9-5WMNU-95TQC-78Z2H-AMKBW-IZQZI")));
    35   // Base64. We don't actually use this in anger, particularly not with a 32-byte key.
    36   var der_key = Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt);
    37   _("Derived key in base64: " + der_key);
    38   do_check_eq(cryptoSvc.decrypt(cryptoSvc.encrypt("bacon", der_key, iv), der_key, iv), "bacon");
    40   // Base64, 16-byte output.
    41   var der_key = Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16);
    42   _("Derived key in base64: " + der_key);
    43   do_check_eq("d2zG0d2cBfXnRwMUGyMwyg==", der_key);
    44   do_check_eq(cryptoSvc.decrypt(cryptoSvc.encrypt("bacon", der_key, iv), der_key, iv), "bacon");
    46   // Base32. Again, specify '16' to avoid it generating a 256-bit key string.
    47   var b32key = Utils.derivePresentableKeyFromPassphrase(der_passphrase, der_salt, 16);
    48   var hyphenated = Utils.hyphenatePassphrase(b32key);
    49   do_check_true(Utils.isPassphrase(b32key));
    51   _("Derived key in base32: " + b32key);
    52   do_check_eq(b32key.length, 26);
    53   do_check_eq(hyphenated.length, 31);  // 1 char, plus 5 groups of 5, hyphenated = 5 + (5*5) + 1 = 31.
    54   do_check_eq(hyphenated, "9-5wmnu-95tqc-78z2h-amkbw-izqzi");
    56   if (this.gczeal)
    57     gczeal(0);
    59   // Test the equivalence of our NSS and JS versions.
    60   // Will only work on FF4, of course.
    61   // Note that we don't add gczeal here: the pure-JS implementation is
    62   // astonishingly slow, and this check takes five minutes to run.
    63   do_check_eq(
    64       Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16, false),
    65       Utils.deriveEncodedKeyFromPassphrase(der_passphrase, der_salt, 16, true));
    66 }

mercurial