use crate::credential::{CredentialOffer, CredentialRequest, SigningPublicKey};
use crate::{
BbsCredential, Credential, CredentialAttribute, CredentialFragment1, CredentialFragment2,
CredentialPresentation, CredentialProof, CredentialPublicKey, CredentialRequestFragment,
CredentialSchema, EntityCredential, OfferId, PresentationManifest, ProofRequestId,
};
use ockam_core::Result;
use ockam_core::{async_trait, compat::boxed::Box};
use signature_bls::SecretKey;
#[async_trait]
pub trait Issuer {
async fn get_signing_key(&mut self) -> Result<SecretKey>;
async fn get_signing_public_key(&mut self) -> Result<SigningPublicKey>;
async fn create_offer(&self, schema: &CredentialSchema) -> Result<CredentialOffer>;
async fn create_proof_of_possession(&self) -> Result<CredentialProof>;
async fn sign_credential(
&self,
schema: &CredentialSchema,
attributes: &[CredentialAttribute],
) -> Result<BbsCredential>;
async fn sign_credential_request(
&self,
request: &CredentialRequest,
schema: &CredentialSchema,
attributes: &[(String, CredentialAttribute)],
offer_id: OfferId,
) -> Result<CredentialFragment2>;
}
#[async_trait]
pub trait Holder {
async fn accept_credential_offer(
&self,
offer: &CredentialOffer,
issuer_public_key: SigningPublicKey,
) -> Result<CredentialRequestFragment>;
async fn combine_credential_fragments(
&self,
credential_fragment1: CredentialFragment1,
credential_fragment2: CredentialFragment2,
) -> Result<BbsCredential>;
async fn is_valid_credential(
&self,
credential: &BbsCredential,
verifier_key: SigningPublicKey,
) -> Result<bool>;
async fn create_credential_presentation(
&self,
credential: &BbsCredential,
presentation_manifests: &PresentationManifest,
proof_request_id: ProofRequestId,
) -> Result<CredentialPresentation>;
async fn add_credential(&mut self, credential: EntityCredential) -> Result<()>;
async fn get_credential(&mut self, credential: &Credential) -> Result<EntityCredential>;
}
#[async_trait]
pub trait Verifier {
async fn create_proof_request_id(&self) -> Result<ProofRequestId>;
async fn verify_proof_of_possession(
&self,
signing_public_key: CredentialPublicKey,
proof: CredentialProof,
) -> Result<bool>;
async fn verify_credential_presentation(
&self,
presentation: &CredentialPresentation,
presentation_manifest: &PresentationManifest,
proof_request_id: ProofRequestId,
) -> Result<bool>;
}