use crate::*;
use async_trait::async_trait;
pub struct RsaCPUObjectVerifier {
public_key: PublicKey,
}
impl RsaCPUObjectVerifier {
pub fn new(public_key: PublicKey) -> RsaCPUObjectVerifier {
RsaCPUObjectVerifier {
public_key: public_key,
}
}
}
#[async_trait]
impl Verifier for RsaCPUObjectVerifier {
fn public_key(&self) -> &PublicKey {
return &self.public_key;
}
async fn verify(&self, data: &[u8], sign: &Signature) -> bool {
self.public_key.verify(data, sign)
}
}
pub async fn verify_object_desc_sign<D, V, N>(
verifier: &V,
obj: &N,
sign: &Signature,
) -> BuckyResult<bool>
where
D: ObjectType,
D::DescType: RawEncode,
D::ContentType: RawEncode + BodyContent,
V: Verifier,
N: NamedObject<D>,
{
let hash_value = obj.desc().raw_hash_value()?;
let ret = verifier.verify(hash_value.as_slice(), sign).await;
Ok(ret)
}
pub async fn verify_object_body_sign<D, V, N>(
verifier: &V,
obj: &N,
sign: &Signature,
) -> BuckyResult<bool>
where
D: ObjectType,
D::DescType: RawEncode,
D::ContentType: RawEncode + BodyContent,
V: Verifier,
N: NamedObject<D>,
{
let ret = if obj.body().is_some() {
let hash_value = obj.body().as_ref().unwrap().raw_hash_value()?;
verifier.verify(hash_value.as_slice(), sign).await
} else {
false
};
Ok(ret)
}
pub struct AnyNamedObjectVerifyHelper;
impl AnyNamedObjectVerifyHelper {
pub async fn verify_desc_sign<V>(
verifier: &V,
obj: &AnyNamedObject,
sign: &Signature,
) -> BuckyResult<bool>
where
V: Verifier,
{
let hash_value = obj.desc_hash()?;
let ret = verifier.verify(hash_value.as_slice(), sign).await;
Ok(ret)
}
pub async fn verify_body_sign<V>(
verifier: &V,
obj: &AnyNamedObject,
sign: &Signature,
) -> BuckyResult<bool>
where
V: Verifier,
{
match obj.body_hash()? {
Some(hash_value) => {
let ret = verifier.verify(hash_value.as_slice(), sign).await;
Ok(ret)
}
None => {
let msg = format!("object has no body: {}", obj.calculate_id());
error!("{}", msg);
Err(BuckyError::new(BuckyErrorCode::NotFound, msg))
}
}
}
}