2010-12-20 01:12:12 -08:00
|
|
|
const Cc = Components.classes;
|
|
|
|
const Ci = Components.interfaces;
|
|
|
|
|
2010-12-09 18:28:07 -08:00
|
|
|
// Ensure PSM is initialized.
|
|
|
|
Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
|
|
|
|
|
|
|
|
function do_check_throws(func) {
|
|
|
|
let have_error = false;
|
|
|
|
try {
|
|
|
|
func();
|
|
|
|
} catch(ex) {
|
|
|
|
dump("Was expecting an exception. Caught: " + ex + "\n");
|
|
|
|
have_error = true;
|
|
|
|
}
|
|
|
|
do_check_true(have_error);
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_success() {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
let b = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
let a_gx1 = {};
|
|
|
|
let a_gv1 = {};
|
|
|
|
let a_r1 = {};
|
|
|
|
let a_gx2 = {};
|
|
|
|
let a_gv2 = {};
|
|
|
|
let a_r2 = {};
|
|
|
|
|
|
|
|
let b_gx1 = {};
|
|
|
|
let b_gv1 = {};
|
|
|
|
let b_r1 = {};
|
|
|
|
let b_gx2 = {};
|
|
|
|
let b_gv2 = {};
|
|
|
|
let b_r2 = {};
|
|
|
|
|
|
|
|
a.round1("alice", a_gx1, a_gv1, a_r1, a_gx2, a_gv2, a_r2);
|
|
|
|
b.round1("bob", b_gx1, b_gv1, b_r1, b_gx2, b_gv2, b_r2);
|
|
|
|
|
|
|
|
let a_A = {};
|
|
|
|
let a_gva = {};
|
|
|
|
let a_ra = {};
|
|
|
|
|
|
|
|
let b_A = {};
|
|
|
|
let b_gva = {};
|
|
|
|
let b_ra = {};
|
|
|
|
|
|
|
|
a.round2("bob", "sekrit", b_gx1.value, b_gv1.value, b_r1.value,
|
|
|
|
b_gx2.value, b_gv2.value, b_r2.value, a_A, a_gva, a_ra);
|
|
|
|
b.round2("alice", "sekrit", a_gx1.value, a_gv1.value, a_r1.value,
|
|
|
|
a_gx2.value, a_gv2.value, a_r2.value, b_A, b_gva, b_ra);
|
|
|
|
|
|
|
|
let a_aes = {};
|
|
|
|
let a_hmac = {};
|
|
|
|
let b_aes = {};
|
|
|
|
let b_hmac = {};
|
|
|
|
|
|
|
|
a.final(b_A.value, b_gva.value, b_ra.value, "ohai", a_aes, a_hmac);
|
|
|
|
b.final(a_A.value, a_gva.value, a_ra.value, "ohai", b_aes, b_hmac);
|
|
|
|
|
|
|
|
do_check_eq(a_aes.value, b_aes.value);
|
|
|
|
do_check_eq(a_hmac.value, b_hmac.value);
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_failure(modlen) {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
let b = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
let a_gx1 = {};
|
|
|
|
let a_gv1 = {};
|
|
|
|
let a_r1 = {};
|
|
|
|
let a_gx2 = {};
|
|
|
|
let a_gv2 = {};
|
|
|
|
let a_r2 = {};
|
|
|
|
|
|
|
|
let b_gx1 = {};
|
|
|
|
let b_gv1 = {};
|
|
|
|
let b_r1 = {};
|
|
|
|
let b_gx2 = {};
|
|
|
|
let b_gv2 = {};
|
|
|
|
let b_r2 = {};
|
|
|
|
|
|
|
|
a.round1("alice", a_gx1, a_gv1, a_r1, a_gx2, a_gv2, a_r2);
|
|
|
|
b.round1("bob", b_gx1, b_gv1, b_r1, b_gx2, b_gv2, b_r2);
|
|
|
|
|
|
|
|
let a_A = {};
|
|
|
|
let a_gva = {};
|
|
|
|
let a_ra = {};
|
|
|
|
|
|
|
|
let b_A = {};
|
|
|
|
let b_gva = {};
|
|
|
|
let b_ra = {};
|
|
|
|
|
|
|
|
// Note how the PINs are different (secret vs. sekrit)
|
|
|
|
a.round2("bob", "secret", b_gx1.value, b_gv1.value, b_r1.value,
|
|
|
|
b_gx2.value, b_gv2.value, b_r2.value, a_A, a_gva, a_ra);
|
|
|
|
b.round2("alice", "sekrit", a_gx1.value, a_gv1.value, a_r1.value,
|
|
|
|
a_gx2.value, a_gv2.value, a_r2.value, b_A, b_gva, b_ra);
|
|
|
|
|
|
|
|
let a_aes = {};
|
|
|
|
let a_hmac = {};
|
|
|
|
let b_aes = {};
|
|
|
|
let b_hmac = {};
|
|
|
|
|
|
|
|
a.final(b_A.value, b_gva.value, b_ra.value, "ohai", a_aes, a_hmac);
|
|
|
|
b.final(a_A.value, a_gva.value, a_ra.value, "ohai", b_aes, b_hmac);
|
|
|
|
|
|
|
|
do_check_neq(a_aes.value, b_aes.value);
|
|
|
|
do_check_neq(a_hmac.value, b_hmac.value);
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_same_signerids() {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
let b = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
let gx1 = {};
|
|
|
|
let gv1 = {};
|
|
|
|
let r1 = {};
|
|
|
|
let gx2 = {};
|
|
|
|
let gv2 = {};
|
|
|
|
let r2 = {};
|
|
|
|
|
|
|
|
a.round1("alice", {}, {}, {}, {}, {}, {});
|
|
|
|
b.round1("alice", gx1, gv1, r1, gx2, gv2, r2);
|
|
|
|
do_check_throws(function() {
|
|
|
|
a.round2("alice", "sekrit", gx1.value, gv1.value, r1.value,
|
|
|
|
gx2.value, gv2.value, r2.value, {}, {}, {});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_bad_zkp() {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
let b = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
let gx1 = {};
|
|
|
|
let gv1 = {};
|
|
|
|
let r1 = {};
|
|
|
|
let gx2 = {};
|
|
|
|
let gv2 = {};
|
|
|
|
let r2 = {};
|
|
|
|
|
|
|
|
a.round1("alice", {}, {}, {}, {}, {}, {});
|
|
|
|
b.round1("bob", gx1, gv1, r1, gx2, gv2, r2);
|
|
|
|
do_check_throws(function() {
|
|
|
|
a.round2("invalid", "sekrit", gx1.value, gv1.value, r1.value,
|
|
|
|
gx2.value, gv2.value, r2.value, {}, {}, {});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_invalid_input_round2() {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
a.round1("alice", {}, {}, {}, {}, {}, {});
|
|
|
|
do_check_throws(function() {
|
|
|
|
a.round2("invalid", "sekrit", "some", "real", "garbage",
|
|
|
|
"even", "more", "garbage", {}, {}, {});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_invalid_input_final() {
|
|
|
|
let a = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
let b = Cc["@mozilla.org/services-crypto/sync-jpake;1"]
|
|
|
|
.createInstance(Ci.nsISyncJPAKE);
|
|
|
|
|
|
|
|
let gx1 = {};
|
|
|
|
let gv1 = {};
|
|
|
|
let r1 = {};
|
|
|
|
let gx2 = {};
|
|
|
|
let gv2 = {};
|
|
|
|
let r2 = {};
|
|
|
|
|
|
|
|
a.round1("alice", {}, {}, {}, {}, {}, {});
|
|
|
|
b.round1("bob", gx1, gv1, r1, gx2, gv2, r2);
|
|
|
|
a.round2("bob", "sekrit", gx1.value, gv1.value, r1.value,
|
|
|
|
gx2.value, gv2.value, r2.value, {}, {}, {});
|
|
|
|
do_check_throws(function() {
|
|
|
|
a.final("some", "garbage", "alright", "foobar-info", {}, {});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function run_test() {
|
|
|
|
test_success();
|
|
|
|
test_failure();
|
|
|
|
test_same_signerids();
|
|
|
|
test_bad_zkp();
|
|
|
|
test_invalid_input_round2();
|
|
|
|
test_invalid_input_final();
|
|
|
|
}
|