use affinidi_did_common::{DID, KeyMaterialFormat};
use affinidi_secrets_resolver::secrets::{KeyType, Secret};
use crate::DIDWebVHError;
pub fn generate_did_key(key_type: KeyType) -> Result<(String, Secret), DIDWebVHError> {
match key_type {
#[cfg(feature = "experimental-pqc")]
KeyType::MlDsa44 => Ok(did_key_from_secret(Secret::generate_ml_dsa_44(None, None))),
#[cfg(feature = "experimental-pqc")]
KeyType::MlDsa65 => Ok(did_key_from_secret(Secret::generate_ml_dsa_65(None, None))),
#[cfg(feature = "experimental-pqc")]
KeyType::MlDsa87 => Ok(did_key_from_secret(Secret::generate_ml_dsa_87(None, None))),
#[cfg(feature = "experimental-pqc")]
KeyType::SlhDsaSha2_128s => Ok(did_key_from_secret(Secret::generate_slh_dsa_sha2_128s(
None,
))),
_ => generate_did_key_via_did_common(key_type),
}
}
fn generate_did_key_via_did_common(key_type: KeyType) -> Result<(String, Secret), DIDWebVHError> {
let (did, key_material) = DID::generate_key(key_type)
.map_err(|e| DIDWebVHError::DIDError(format!("did:key generation failed: {e}")))?;
let jwk = match &key_material.format {
KeyMaterialFormat::JWK(jwk) => jwk,
_ => {
return Err(DIDWebVHError::DIDError(
"did-common returned non-JWK key material; cannot build Secret".to_string(),
));
}
};
let mut secret = Secret::from_jwk(jwk)
.map_err(|e| DIDWebVHError::DIDError(format!("JWK -> Secret conversion failed: {e}")))?;
secret.id = key_material.id.clone();
Ok((did.to_string(), secret))
}
#[cfg(feature = "experimental-pqc")]
fn did_key_from_secret(mut secret: Secret) -> (String, Secret) {
let mb = secret
.get_public_keymultibase()
.expect("generate_* produced a Secret with decodable public bytes");
let did = format!("did:key:{mb}");
secret.id = format!("{did}#{mb}");
(did, secret)
}