Cu.import("resource://services-sync/util.js");

function run_test() {
  let cryptoSvc = Svc.Crypto;

  var salt = cryptoSvc.generateRandomBytes(16);
  do_check_eq(salt.length, 24);

  var iv = cryptoSvc.generateRandomIV();
  do_check_eq(iv.length, 24);

  var symKey = cryptoSvc.generateRandomKey();
  do_check_eq(symKey.length, 44);


  // Tests with a 2048 bit key (the default)
  do_check_eq(cryptoSvc.keypairBits, 2048)

  var pubOut = {};
  var privOut = {};
  cryptoSvc.generateKeypair("my passphrase", salt, iv, pubOut, privOut);
  var pubKey = pubOut.value;
  var privKey = privOut.value;
  do_check_true(!!pubKey);
  do_check_true(!!privKey);
  do_check_eq(pubKey.length, 392);
  do_check_eq(privKey.length, 1644);

  // do some key wrapping
  var wrappedKey = cryptoSvc.wrapSymmetricKey(symKey, pubKey);
  do_check_eq(wrappedKey.length, 344);

  var unwrappedKey = cryptoSvc.unwrapSymmetricKey(wrappedKey, privKey,
                                                  "my passphrase", salt, iv);
  do_check_eq(unwrappedKey.length, 44);

  // The acid test... Is our unwrapped key the same thing we started with?
  do_check_eq(unwrappedKey, symKey);


  // Tests with a 1024 bit key
  cryptoSvc.keypairBits = 1024;
  do_check_eq(cryptoSvc.keypairBits, 1024)

  cryptoSvc.generateKeypair("my passphrase", salt, iv, pubOut, privOut);
  var pubKey = pubOut.value;
  var privKey = privOut.value;
  do_check_true(!!pubKey);
  do_check_true(!!privKey);
  do_check_eq(pubKey.length, 216);
  do_check_eq(privKey.length, 856);

  // do some key wrapping
  wrappedKey = cryptoSvc.wrapSymmetricKey(symKey, pubKey);
  do_check_eq(wrappedKey.length, 172);
  unwrappedKey = cryptoSvc.unwrapSymmetricKey(wrappedKey, privKey,
                                                  "my passphrase", salt, iv);
  do_check_eq(unwrappedKey.length, 44);

  // The acid test... Is our unwrapped key the same thing we started with?
  do_check_eq(unwrappedKey, symKey);


}
