The request message of the open invitation protocol
This commit is contained in:
parent
996463d1c0
commit
706f484606
|
@ -225,3 +225,5 @@ impl BridgeAuth {
|
||||||
(time::OffsetDateTime::now_utc().date() + self.time_offset).julian_day()
|
(time::OffsetDateTime::now_utc().date() + self.time_offset).julian_day()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod open_invite;
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*! A module for the protocol for the user to redeem an open invitation
|
||||||
|
with the BA (bridge authority) to receive their initial Lox
|
||||||
|
credential. The credential will have attributes:
|
||||||
|
|
||||||
|
- id: jointly chosen by the user and BA
|
||||||
|
- bucket: set by the BA
|
||||||
|
- trust_level: 0
|
||||||
|
- level_since: today
|
||||||
|
- invites_remaining: 0
|
||||||
|
- invites_issued: 0
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
use curve25519_dalek::ristretto::RistrettoBasepointTable;
|
||||||
|
use curve25519_dalek::ristretto::RistrettoPoint;
|
||||||
|
use curve25519_dalek::scalar::Scalar;
|
||||||
|
use curve25519_dalek::traits::IsIdentity;
|
||||||
|
|
||||||
|
use zkp::CompactProof;
|
||||||
|
use zkp::ProofError;
|
||||||
|
use zkp::Transcript;
|
||||||
|
|
||||||
|
use super::{BridgeAuth, IssuerPubKey};
|
||||||
|
use super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE};
|
||||||
|
|
||||||
|
/// The request message for this protocol
|
||||||
|
pub struct Request {
|
||||||
|
invite: [u8; super::OPENINV_LENGTH],
|
||||||
|
D: RistrettoPoint,
|
||||||
|
EncIdClient: (RistrettoPoint, RistrettoPoint),
|
||||||
|
piUserBlinding: CompactProof,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
/// The client state for this protocol
|
||||||
|
pub struct State {
|
||||||
|
d: Scalar,
|
||||||
|
D: RistrettoPoint,
|
||||||
|
EncIdClient: (RistrettoPoint, RistrettoPoint),
|
||||||
|
id_client: Scalar,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The response message for this protocol
|
||||||
|
pub struct Response {
|
||||||
|
P: RistrettoPoint,
|
||||||
|
EncQ: (RistrettoPoint, RistrettoPoint),
|
||||||
|
id_server: Scalar,
|
||||||
|
TId: RistrettoPoint,
|
||||||
|
bucket: Scalar,
|
||||||
|
level_since: Scalar,
|
||||||
|
P_noopmigration: RistrettoPoint,
|
||||||
|
EncQ_noopmigration: (RistrettoPoint, RistrettoPoint),
|
||||||
|
TId_noopmigration: RistrettoPoint,
|
||||||
|
}
|
||||||
|
|
||||||
|
// The userblinding ZKP
|
||||||
|
define_proof! {
|
||||||
|
userblinding,
|
||||||
|
"Open Invitation User Blinding",
|
||||||
|
(d, eid_client, id_client),
|
||||||
|
(EncIdClient0, EncIdClient1, D),
|
||||||
|
(B) :
|
||||||
|
EncIdClient0 = (eid_client*B),
|
||||||
|
EncIdClient1 = (id_client*B + eid_client*D),
|
||||||
|
D = (d*B)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Submit an open invitation issued by the BridgeDb to receive your
|
||||||
|
/// first Lox credential
|
||||||
|
pub fn request(invite: &[u8; super::OPENINV_LENGTH]) -> (Request, State) {
|
||||||
|
let B: &RistrettoPoint = &CMZ_B;
|
||||||
|
let Btable: &RistrettoBasepointTable = &CMZ_B_TABLE;
|
||||||
|
|
||||||
|
// Pick an ElGamal keypair
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let d = Scalar::random(&mut rng);
|
||||||
|
let D = &d * Btable;
|
||||||
|
|
||||||
|
// Pick a random client component of the id
|
||||||
|
let id_client = Scalar::random(&mut rng);
|
||||||
|
|
||||||
|
// Encrypt it (times the basepoint B) to the ElGamal public key D we
|
||||||
|
// just created
|
||||||
|
let eid_client = Scalar::random(&mut rng);
|
||||||
|
let EncIdClient = (&eid_client * Btable, &id_client * Btable + eid_client * D);
|
||||||
|
|
||||||
|
// Construct the proof of correct user blinding
|
||||||
|
let mut transcript = Transcript::new(b"open invite user blinding");
|
||||||
|
let piUserBlinding = userblinding::prove_compact(
|
||||||
|
&mut transcript,
|
||||||
|
userblinding::ProveAssignments {
|
||||||
|
B: &B,
|
||||||
|
EncIdClient0: &EncIdClient.0,
|
||||||
|
EncIdClient1: &EncIdClient.1,
|
||||||
|
D: &D,
|
||||||
|
d: &d,
|
||||||
|
eid_client: &eid_client,
|
||||||
|
id_client: &id_client,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.0;
|
||||||
|
(
|
||||||
|
Request {
|
||||||
|
invite: *invite,
|
||||||
|
D,
|
||||||
|
EncIdClient,
|
||||||
|
piUserBlinding,
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
d,
|
||||||
|
D,
|
||||||
|
EncIdClient,
|
||||||
|
id_client,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue