use crate::credential::{CredentialOffer, CredentialRequest, SigningPublicKey};
use crate::{
Changes, Contact, Credential, CredentialAttribute, CredentialFragment1, CredentialFragment2,
CredentialPresentation, CredentialProof, CredentialPublicKey, CredentialRequestFragment,
CredentialSchema, OfferId, PresentationManifest, ProfileChangeEvent, ProfileIdentifier,
ProofRequestId,
};
use ockam_core::{Address, Result, Route};
use ockam_vault_core::{PublicKey, Secret};
use signature_bls::SecretKey;
pub type AuthenticationProof = Vec<u8>;
pub trait Identity: Send + 'static {
fn identifier(&self) -> Result<ProfileIdentifier>;
fn create_key<S: Into<String>>(&mut self, label: S) -> Result<()>;
fn rotate_profile_key(&mut self) -> Result<()>;
fn get_profile_secret_key(&self) -> Result<Secret>;
fn get_secret_key<S: Into<String>>(&self, label: S) -> Result<Secret>;
fn get_profile_public_key(&self) -> Result<PublicKey>;
fn get_public_key<S: Into<String>>(&self, label: S) -> Result<PublicKey>;
fn create_auth_proof<S: AsRef<[u8]>>(&mut self, state_slice: S) -> Result<AuthenticationProof>;
fn verify_auth_proof<S: AsRef<[u8]>, P: AsRef<[u8]>>(
&mut self,
state_slice: S,
peer_id: &ProfileIdentifier,
proof_slice: P,
) -> Result<bool>;
fn add_change(&mut self, change_event: ProfileChangeEvent) -> Result<()>;
fn get_changes(&self) -> Result<Changes>;
fn verify_changes(&mut self) -> Result<bool>;
fn get_contacts(&self) -> Result<Vec<Contact>>;
fn as_contact(&mut self) -> Result<Contact>;
fn get_contact(&mut self, contact_id: &ProfileIdentifier) -> Result<Option<Contact>>;
fn verify_contact<C: Into<Contact>>(&mut self, contact: C) -> Result<bool>;
fn verify_and_add_contact<C: Into<Contact>>(&mut self, contact: C) -> Result<bool>;
fn verify_and_update_contact<C: AsRef<[ProfileChangeEvent]>>(
&mut self,
contact_id: &ProfileIdentifier,
change_events: C,
) -> Result<bool>;
}
pub trait SecureChannels {
fn create_secure_channel_listener<A: Into<Address> + Send>(&mut self, address: A)
-> Result<()>;
fn create_secure_channel<R: Into<Route> + Send>(&mut self, route: R) -> Result<Address>;
}
pub trait Issuer {
fn get_signing_key(&mut self) -> Result<SecretKey>;
fn get_signing_public_key(&mut self) -> Result<SigningPublicKey>;
fn create_offer(&self, schema: &CredentialSchema) -> Result<CredentialOffer>;
fn create_proof_of_possession(&self) -> Result<CredentialProof>;
fn sign_credential<A: AsRef<[CredentialAttribute]>>(
&self,
schema: &CredentialSchema,
attributes: A,
) -> Result<Credential>;
fn sign_credential_request<A: AsRef<[(String, CredentialAttribute)]>>(
&self,
request: &CredentialRequest,
schema: &CredentialSchema,
attributes: A,
offer_id: OfferId,
) -> Result<CredentialFragment2>;
}
pub trait Holder {
fn accept_credential_offer(
&self,
offer: &CredentialOffer,
issuer_public_key: SigningPublicKey,
) -> Result<CredentialRequestFragment>;
fn combine_credential_fragments(
&self,
credential_fragment1: CredentialFragment1,
credential_fragment2: CredentialFragment2,
) -> Result<Credential>;
fn is_valid_credential(
&self,
credential: &Credential,
verifier_key: SigningPublicKey,
) -> Result<bool>;
fn present_credential(
&self,
credential: &Credential,
presentation_manifests: &PresentationManifest,
proof_request_id: ProofRequestId,
) -> Result<CredentialPresentation>;
}
pub trait Verifier {
fn create_proof_request_id(&self) -> Result<ProofRequestId>;
fn verify_proof_of_possession(
&self,
signing_public_key: CredentialPublicKey,
proof: CredentialProof,
) -> Result<bool>;
fn verify_credential_presentation(
&self,
presentation: &CredentialPresentation,
presentation_manifest: &PresentationManifest,
proof_request_id: ProofRequestId,
) -> Result<bool>;
}