/services/sync/tests/unit/test_utils_deriveKey.js

http://github.com/zpao/v8monkey · JavaScript · 66 lines · 45 code · 12 blank · 9 comment · 3 complexity · 055440d78d97af9914d7a88ceedce02d MD5 · raw file

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