pub struct Ed25519DidWebJwk {
impl Signer<Ed25519> for Ed25519DidWebJwk {
async fn sign(&self, plain_text: &str) -> Result<String, SignerError> {
Params::OKP(o) => match &o.private_key {
secret: SecretKey::from_bytes(&key.0).map_err(|e| {
SignerError::Sign(format!(
"could not generate secret key: {}",
public: PublicKey::from_bytes(&o.public_key.0).map_err(|e| {
SignerError::Sign(format!(
"could not generate public key: {}",
let sig = keypair.sign(&plain_text.as_bytes());
Ok(hex::encode(sig.to_bytes()))
_ => Err(SignerError::Sign(
"could not recover private key from jwk".to_string(),
_ => Err(SignerError::Sign(
"could not recover private key from jwk".to_string(),
async fn sign_vc(&self, vc: &mut Credential) -> Result<(), SignerError> {
vc.proof = self.proof(vc).await?;
async fn generate_jwt(&self, vc: &Credential) -> Result<String, SignerError> {
&LinkedDataProofOptions {
verification_method: Some(URI::String(format!(
self.signer_type.did_id()?,
async fn proof(&self, vc: &Credential) -> Result<Option<OneOrMany<Proof>>, SignerError> {
let lpdo = match self.signer_type {
Ed25519::DIDWebJWK(_) => LinkedDataProofOptions {
verification_method: Some(URI::String(format!(
self.signer_type.did_id()?,
vc.generate_proof(&self.key, &lpdo, &DIDWeb).await?,
fn signer_type(&self) -> Ed25519 {