Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 66 additions & 5 deletions src/audit-guard/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! Adheres to Rust safety standards.
//! Integrates with the existing Audit-Guard API.

use soroban_sdk::{contract, contractimpl, contracterror, Env, BytesN, Address};
use soroban_sdk::{contract, contractimpl, contracterror, Env, BytesN, Address, Bytes};

#[contracterror]
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
Expand All @@ -20,12 +20,20 @@ pub struct AuditGuardContract;

#[contractimpl]
impl AuditGuardContract {
/// Sets the verification status for an author in the contract state.
pub fn set_verified(env: Env, author: Address, status: bool) {
author.require_auth();
env.storage().instance().set(&author, &status);
}

/// Verifies the security context against formal verification checks.
///
/// Ensures system resilience by checking authorization and state validation.
pub fn verify_context(_env: Env, author: Address, is_verified: bool) -> Result<(), AuditGuardError> {
pub fn verify_context(env: Env, author: Address) -> Result<(), AuditGuardError> {
author.require_auth();

let is_verified: bool = env.storage().instance().get(&author).unwrap_or(false);

if !is_verified {
return Err(AuditGuardError::VerificationFailed);
}
Expand All @@ -36,15 +44,68 @@ impl AuditGuardContract {

/// Integrates with the existing Audit module to validate a state transition.
/// Adheres to Rust safety standards by avoiding unsafe blocks and performing boundary checks.
pub fn validate_and_audit(_env: Env, payload: BytesN<32>, _signature: BytesN<64>) -> Result<(), AuditGuardError> {
pub fn validate_and_audit(env: Env, public_key: BytesN<32>, payload: Bytes, signature: BytesN<64>) -> Result<(), AuditGuardError> {
// Implementation of standard security protocol
if payload.len() == 0 {
return Err(AuditGuardError::InvalidPayload);
}

// Security-sensitive code that passes formal verification checks
// (Mock implementation for the issue)
// Real signature verification
env.crypto().ed25519_verify(&public_key, &payload, &signature);

Ok(())
}
}

#[cfg(test)]
mod test {
use super::*;
use soroban_sdk::{testutils::{Address as _}, Env};

#[test]
fn test_verify_context() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register_contract(None, AuditGuardContract);
let client = AuditGuardContractClient::new(&env, &contract_id);
let author = Address::generate(&env);

// Not verified initially
let res = client.try_verify_context(&author);
assert_eq!(res, Err(Ok(AuditGuardError::VerificationFailed)));

// Set verified
client.set_verified(&author, &true);

// Now succeeds
client.verify_context(&author);
}

#[test]
#[should_panic]
fn test_validate_and_audit_invalid_signature() {
let env = Env::default();
let contract_id = env.register_contract(None, AuditGuardContract);
let client = AuditGuardContractClient::new(&env, &contract_id);

let public_key = BytesN::from_array(&env, &[0; 32]);
let payload = Bytes::from_slice(&env, b"test payload");
let invalid_signature = BytesN::from_array(&env, &[0; 64]);

client.validate_and_audit(&public_key, &payload, &invalid_signature);
}

#[test]
fn test_validate_and_audit_empty_payload() {
let env = Env::default();
let contract_id = env.register_contract(None, AuditGuardContract);
let client = AuditGuardContractClient::new(&env, &contract_id);

let public_key = BytesN::from_array(&env, &[0; 32]);
let payload = Bytes::new(&env);
let signature = BytesN::from_array(&env, &[0; 64]);

let res = client.try_validate_and_audit(&public_key, &payload, &signature);
assert_eq!(res, Err(Ok(AuditGuardError::InvalidPayload)));
}
}
Loading