#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum IdShape {
JsonString,
JsonInteger,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Session {
pub authority: &'static str,
pub method: &'static str,
pub path: &'static str,
pub request_line: &'static str,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TokenSession {
pub session: Session,
pub secret_field: Option<&'static str>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct IdentitySession {
pub session: Session,
pub id_field: &'static str,
pub id_shape: IdShape,
pub handle_field: &'static str,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Profile {
pub platform: &'static str,
pub ceremony_version: u16,
pub token: Option<TokenSession>,
pub identity: Option<IdentitySession>,
}
impl Profile {
pub const fn attestation_count(&self) -> u8 {
self.token.is_some() as u8 + self.identity.is_some() as u8
}
}
pub const GOOGLE: Profile = Profile {
platform: "google",
ceremony_version: 1,
token: None,
identity: None,
};
pub const X: Profile = Profile {
platform: "x",
ceremony_version: 1,
token: Some(TokenSession {
session: Session {
authority: "api.x.com",
method: "POST",
path: "/2/oauth2/token",
request_line: "POST /2/oauth2/token ",
},
secret_field: None,
}),
identity: Some(IdentitySession {
session: Session {
authority: "api.x.com",
method: "GET",
path: "/2/users/me",
request_line: "GET /2/users/me ",
},
id_field: "id",
id_shape: IdShape::JsonString,
handle_field: "username",
}),
};
pub const GITHUB: Profile = Profile {
platform: "github",
ceremony_version: 1,
token: Some(TokenSession {
session: Session {
authority: "github.com",
method: "POST",
path: "/login/oauth/access_token",
request_line: "POST /login/oauth/access_token ",
},
secret_field: Some("client_secret"),
}),
identity: Some(IdentitySession {
session: Session {
authority: "api.github.com",
method: "GET",
path: "/user",
request_line: "GET /user ",
},
id_field: "id",
id_shape: IdShape::JsonInteger,
handle_field: "login",
}),
};
pub const LAUNCH: &[&Profile] = &[&GOOGLE, &X, &GITHUB];
pub fn launch(platform: &str) -> Option<&'static Profile> {
LAUNCH.iter().copied().find(|p| p.platform == platform)
}
pub const MAX_FUTURE_ATTESTATION_SKEW_SECONDS: u64 = 300;
pub const PROOF_LIFETIME_SECONDS_X: u64 = 3600;
pub const PROOF_LIFETIME_SECONDS_GITHUB: u64 = 3600;