#[non_exhaustive]pub struct CredentialV2 {
pub context: Context,
pub id: Option<Uri>,
pub types: OneOrMany<String>,
pub name: Option<Value>,
pub description: Option<Value>,
pub issuer: Party,
pub valid_from: Option<DateTime<Utc>>,
pub valid_until: Option<DateTime<Utc>>,
pub credential_status: Option<OneOrMany<TypedObject>>,
pub credential_subject: OneOrMany<Subject>,
pub credential_schema: Option<OneOrMany<TypedObject>>,
pub properties: IndexMap<String, Value>,
}vc only.Expand description
A verifiable credential of the Verifiable Credentials Data Model 2.0, as data.
Secured per VC-JOSE-COSE, the credential itself is the JWT payload: @context and the other
properties are claims next to the registered ones, with typ: vc+jwt in the header. See
to_jwt_claims.
Deserialization checks that the first @context is the base context, type includes
VerifiableCredential, there is a subject, and validUntil is not before validFrom.
§Examples
use chrono::{TimeZone as _, Utc};
use identity_kit::did::Uri;
use identity_kit::vc::{CredentialV2, Subject};
use serde_json::json;
let credential = CredentialV2::new(
Uri::parse("https://university.example/issuers/14")?,
Subject::new(Uri::parse("did:example:ebfeb1f712ebc6f1c276e12ec21")?)
.with_property("degree", json!({ "type": "ExampleBachelorDegree" })),
)
.with_type("ExampleDegreeCredential")
.with_valid_from(Utc.with_ymd_and_hms(2010, 1, 1, 19, 23, 24).unwrap());
let claims = credential.to_jwt_claims();
assert_eq!(claims.additional["validFrom"], "2010-01-01T19:23:24Z");
assert_eq!(CredentialV2::from_jwt_claims(&claims)?, credential);Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.context: Context@context, starting with CredentialV2::CONTEXT.
id: Option<Uri>The identifier of the credential.
types: OneOrMany<String>type, including CredentialV2::TYPE.
name: Option<Value>name: a string or language-tagged values, kept as JSON.
description: Option<Value>description: a string or language-tagged values, kept as JSON.
issuer: PartyThe issuer.
valid_from: Option<DateTime<Utc>>When the credential becomes valid.
valid_until: Option<DateTime<Utc>>When the credential ceases to be valid.
credential_status: Option<OneOrMany<TypedObject>>credentialStatus: where to learn whether the credential is revoked or suspended.
credential_subject: OneOrMany<Subject>The subjects and the claims about them.
credential_schema: Option<OneOrMany<TypedObject>>credentialSchema.
properties: IndexMap<String, Value>Every other property (relatedResource, termsOfUse, evidence, refreshService,
…), in insertion order.
Implementations§
Source§impl CredentialV2
impl CredentialV2
pub fn serialize<__S>(
__self: &CredentialV2,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
Source§impl<'de> CredentialV2
impl<'de> CredentialV2
pub fn deserialize<__D>(__deserializer: __D) -> Result<CredentialV2, __D::Error>where
__D: Deserializer<'de>,
Source§impl CredentialV2
impl CredentialV2
Sourcepub const CONTEXT: &'static str = CONTEXT_V2
pub const CONTEXT: &'static str = CONTEXT_V2
The base context, https://www.w3.org/ns/credentials/v2.
Sourcepub const TYPE: &'static str = "VerifiableCredential"
pub const TYPE: &'static str = "VerifiableCredential"
The type every credential has, VerifiableCredential.
Sourcepub const JWT_MEDIA_TYPE: &'static str = "application/vc+jwt"
pub const JWT_MEDIA_TYPE: &'static str = "application/vc+jwt"
The media type of a JWT securing a credential, application/vc+jwt.
Sourcepub fn new(issuer: impl Into<Party>, subject: Subject) -> Self
pub fn new(issuer: impl Into<Party>, subject: Subject) -> Self
A credential of type VerifiableCredential in the base context, issued by issuer
about subject, valid indefinitely.
Sourcepub fn with_context(self, context: impl Into<String>) -> Self
pub fn with_context(self, context: impl Into<String>) -> Self
This credential with context appended to its @context.
Sourcepub fn with_type(self, credential_type: impl Into<String>) -> Self
pub fn with_type(self, credential_type: impl Into<String>) -> Self
This credential with credential_type appended to its type.
Sourcepub fn with_description(self, description: impl Into<Value>) -> Self
pub fn with_description(self, description: impl Into<Value>) -> Self
This credential with its description set.
Sourcepub fn with_valid_from(self, valid_from: DateTime<Utc>) -> Self
pub fn with_valid_from(self, valid_from: DateTime<Utc>) -> Self
This credential with its validFrom set.
Sourcepub fn with_valid_until(self, valid_until: DateTime<Utc>) -> Self
pub fn with_valid_until(self, valid_until: DateTime<Utc>) -> Self
This credential with its validUntil set.
Sourcepub fn with_subject(self, subject: Subject) -> Self
pub fn with_subject(self, subject: Subject) -> Self
This credential with another subject.
Sourcepub fn with_status(self, status: TypedObject) -> Self
pub fn with_status(self, status: TypedObject) -> Self
This credential with a credentialStatus added.
Sourcepub fn with_schema(self, schema: TypedObject) -> Self
pub fn with_schema(self, schema: TypedObject) -> Self
This credential with a credentialSchema added.
Sourcepub fn with_property(
self,
name: impl Into<String>,
value: impl Into<Value>,
) -> Self
pub fn with_property( self, name: impl Into<String>, value: impl Into<Value>, ) -> Self
This credential with the property name set to value.
Sourcepub fn has_type(&self, credential_type: &str) -> bool
pub fn has_type(&self, credential_type: &str) -> bool
Whether credential_type is among the types.
Sourcepub fn statuses(&self) -> impl Iterator<Item = &TypedObject>
pub fn statuses(&self) -> impl Iterator<Item = &TypedObject>
The status entries, in order; none when credentialStatus is absent.
Sourcepub fn check(&self) -> Result<(), CredentialError>
pub fn check(&self) -> Result<(), CredentialError>
Checks the structural requirements of the data model: the first @context is the base
context, type includes VerifiableCredential, there is a subject, and validUntil
is not before validFrom.
§Errors
The first CredentialError found.
Sourcepub fn to_jwt_claims(&self) -> JwtClaims
pub fn to_jwt_claims(&self) -> JwtClaims
The JWT claims set securing the credential (VC-JOSE-COSE §3.1.1): the credential’s own
properties, nothing else. iss, jti, sub, iat and exp are the caller’s to add
and must agree with the credential when they are.
Sourcepub fn from_jwt_claims(jwt_claims: &JwtClaims) -> Result<Self, CredentialError>
pub fn from_jwt_claims(jwt_claims: &JwtClaims) -> Result<Self, CredentialError>
The credential a JWT claims set secures: its non-registered claims, with iss, jti
and sub, when present, checked against issuer, id and the subject.
§Errors
CredentialError::InvalidClaim when the claims hold a vc claim or do not form a
credential, CredentialError::ClaimMismatch when a registered claim disagrees with
the property it duplicates, and what check reports.
Trait Implementations§
Source§impl Clone for CredentialV2
impl Clone for CredentialV2
Source§impl Debug for CredentialV2
impl Debug for CredentialV2
Source§impl<'de> Deserialize<'de> for CredentialV2
impl<'de> Deserialize<'de> for CredentialV2
Source§fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
Reads the credential and checks it with CredentialV2::check.
impl Eq for CredentialV2
Source§impl PartialEq for CredentialV2
impl PartialEq for CredentialV2
Source§impl PartialSchema for CredentialV2
Available on crate feature utoipa only.
impl PartialSchema for CredentialV2
utoipa only.Source§impl Serialize for CredentialV2
impl Serialize for CredentialV2
impl StructuralPartialEq for CredentialV2
Auto Trait Implementations§
impl Freeze for CredentialV2
impl RefUnwindSafe for CredentialV2
impl Send for CredentialV2
impl Sync for CredentialV2
impl Unpin for CredentialV2
impl UnsafeUnpin for CredentialV2
impl UnwindSafe for CredentialV2
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.