use crate::ids::IdentityId;
use bytes::Bytes;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Jwk(pub serde_json::Value);
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum IdentityKind {
Human,
Ai,
Service,
System,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum DeviceKind {
Mobile,
Web,
Desktop,
Embedded,
Server,
}
#[derive(Clone, Debug)]
pub enum IdentityAssurance {
Anonymous,
Pseudonymous {
ephemeral_key: Jwk,
},
Identified {
credential_kind: CredentialKind,
},
TaskScoped {
identity: IdentityId,
task_id: String,
scopes: Vec<String>,
expires_at: DateTime<Utc>,
},
UserAuthorized {
identity: IdentityId,
user_id: IdentityId,
scopes: Vec<String>,
},
DtlsFingerprint {
algorithm: String,
value: String,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum CredentialKind {
OAuth2Dpop,
Oidc,
SipDigest,
Passkey,
AAuth,
}
#[derive(Clone, Debug)]
pub enum Credential {
Bearer(String),
OAuth2Dpop {
access_token: String,
dpop_proof: String,
},
Oidc {
id_token: String,
key_binding: Option<Jwk>,
},
Passkey {
challenge_response: Bytes,
attestation: Option<Bytes>,
},
SipDigest {
username: String,
response: String,
nonce: String,
},
AAuth {
signed_request: Bytes,
signature_key: Jwk,
signature_agent: Option<Jwk>,
},
}