use crate::*;
use async_trait::async_trait;
use crate::signature::ObjSignature;
pub struct RsaCPUObjectVerifier {
public_key: PublicKey,
}
impl RsaCPUObjectVerifier {
pub fn new(public_key: PublicKey) -> RsaCPUObjectVerifier {
RsaCPUObjectVerifier {
public_key: public_key,
}
}
}
#[async_trait]
impl ObjVerifier for RsaCPUObjectVerifier {
fn public_key(&self) -> &PublicKey {
return &self.public_key;
}
async fn verify(&self, data: &[u8], sign: &ObjSignature) -> bool {
self.public_key.verify(data, sign.signature())
}
}
pub async fn verify_object_desc_sign<D, V, N>(
verifier: &V,
obj: &N,
sign: &ObjSignature,
) -> BuckyResult<bool>
where
D: ObjectType,
D::DescType: RawEncode,
D::ContentType: RawEncode + BodyContent,
V: ObjVerifier,
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: &ObjSignature,
) -> BuckyResult<bool>
where
D: ObjectType,
D::DescType: RawEncode,
D::ContentType: RawEncode + BodyContent,
V: ObjVerifier,
N: NamedObject<D>,
{
let ret = if let Some(body) = obj.body() {
if body.object_id().is_some() {
body.verify_object_id(&obj.desc().object_id())?;
}
let hash_value = body.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: &ObjSignature,
) -> BuckyResult<bool>
where
V: ObjVerifier,
{
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: &ObjSignature,
) -> BuckyResult<bool>
where
V: ObjVerifier,
{
match obj.has_body()? {
true => {
if obj.body_object_id().is_some() {
obj.verify_body_object_id(&obj.object_id())?;
}
let body_hash = obj.body_hash()?.unwrap();
let ret = verifier.verify(body_hash.as_slice(), sign).await;
Ok(ret)
}
false => {
Ok(false)
}
}
}
}