use dist_agent_lang::{parse_source, execute_source};
use dist_agent_lang::parser::ast::Statement;
use dist_agent_lang::http_server_security::{AuthValidator, JwtConfig, Claims, SecurityLogger};
use dist_agent_lang::stdlib::crypto_signatures::ECDSASignatureVerifier;
use dist_agent_lang::stdlib::cross_chain_security::{CrossChainSecurityManager, CrossChainOperation, CrossChainOperationType, OperationStatus, ValidatorSignature};
#[test]
fn test_secure_user_authentication_workflow() {
let code = r#"
@trust("hybrid")
@secure
service SecureAuthService {
fn authenticate_user(username: string, password: string) -> string {
// Step 1: Validate input
if (username == "" || password == "") {
return "invalid_input";
}
// Step 2: Authenticate using secure_auth
let session = auth::authenticate(username, password);
// Step 3: Check if authentication succeeded
if (session.is_some()) {
return "authenticated";
} else {
return "authentication_failed";
}
}
fn create_secure_user(username: string, password: string, email: string) -> string {
// Create user with secure password hashing
let result = auth::create_user(username, password, email, ["user"]);
if (result.is_ok()) {
return "user_created";
} else {
return "creation_failed";
}
}
event UserAuthenticated(user_id: string);
event UserCreated(user_id: string);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
let service_count = program.statements.iter()
.filter(|s| matches!(s, Statement::Service(_)))
.count();
assert_eq!(service_count, 1);
}
#[test]
fn test_role_based_access_control() {
let code = r#"
@trust("hybrid")
@secure
service RBACService {
fn check_permission(user_id: string, permission: string) -> bool {
// Get user session
let session = auth::session(user_id, ["admin", "user"]);
// Check if user has permission
return auth::has_permission(session, permission);
}
fn check_role(user_id: string, role: string) -> bool {
let session = auth::session(user_id, ["admin"]);
return auth::has_role(session, role);
}
fn create_admin_role() {
// Create admin role with permissions
auth::create_role("admin", ["read", "write", "delete"], "Administrator role");
}
event PermissionChecked(user_id: string, permission: string, granted: bool);
event RoleChecked(user_id: string, role: string, granted: bool);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_capability_based_access_control() {
let code = r#"
@trust("decentralized")
@secure
service CapabilityService {
fn grant_capability(resource: string, principal_id: string) -> string {
// Create capability
let capability = key::create(resource, ["read", "write"]);
if (capability.is_err()) {
return "capability_creation_failed";
}
// Create principal
let principal = key::create_principal(principal_id, "Test Principal");
// Grant capability
let result = key::grant(capability.unwrap(), principal);
if (result.is_ok()) {
return "capability_granted";
} else {
return "grant_failed";
}
}
fn check_capability(resource: string, operation: string, principal_id: string) -> bool {
let request = key::create_capability_request(resource, operation, principal_id);
let result = key::check(request);
if (result.is_ok()) {
return result.unwrap();
} else {
return false;
}
}
event CapabilityGranted(resource: string, principal_id: string);
event CapabilityChecked(resource: string, operation: string, allowed: bool);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_cryptographic_signatures_workflow() {
let code = r#"
@trust("decentralized")
@secure
service SignatureService {
fn sign_transaction(message: string, private_key: string) -> string {
// Sign message with ECDSA
let signature = crypto_signatures::sign(message, private_key);
if (signature.is_ok()) {
return signature.unwrap();
} else {
return "signing_failed";
}
}
fn verify_transaction(message: string, signature: string, public_key: string) -> bool {
// Verify signature
let result = crypto_signatures::verify(message, signature, public_key);
if (result.is_ok()) {
return result.unwrap();
} else {
return false;
}
}
fn generate_keypair() -> map {
// Generate ECDSA keypair
let keypair = crypto_signatures::generate_keypair();
if (keypair.is_ok()) {
let (privkey, pubkey) = keypair.unwrap();
return {
"private_key": privkey,
"public_key": pubkey
};
} else {
return {};
}
}
event TransactionSigned(message: string, signature: string);
event TransactionVerified(message: string, verified: bool);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_cross_chain_security_workflow() {
let code = r#"
@trust("decentralized")
@chain("ethereum")
@chain("polygon")
service CrossChainSecurityService {
fn create_secure_bridge(source_chain: int, target_chain: int, bridge_address: string) -> string {
// Create bridge with validator set
let validator_set = ["0xValidator1", "0xValidator2", "0xValidator3"];
let min_signatures = 2;
let max_amount = 1000000;
let security_deposit = 1000000;
// Note: This would use cross_chain_security::create_bridge in actual implementation
// For now, we validate the structure
return "bridge_created";
}
fn validate_cross_chain_operation(
operation_id: string,
source_chain: int,
target_chain: int,
amount: int
) -> bool {
// Validate cross-chain operation
// This would use cross_chain_security::validate_operation in actual implementation
return true;
}
fn secure_deploy(chain_id: int, contract_code: string) -> string {
// Secure deployment with validation
// This would use cross_chain_security::secure_deploy in actual implementation
return "deployed";
}
event BridgeCreated(source_chain: int, target_chain: int, bridge_id: string);
event CrossChainOperationValidated(operation_id: string, status: string);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_kyc_verification_workflow() {
let code = r#"
@trust("hybrid")
@secure
service KYCService {
fn verify_user(user_address: string, level: string) -> string {
// Perform KYC verification
let verification = kyc::verify(user_address, level, {});
if (verification.is_ok()) {
let result = verification.unwrap();
if (result.status == "approved") {
return "kyc_approved";
} else {
return "kyc_pending";
}
} else {
return "kyc_failed";
}
}
fn check_kyc_status(user_address: string) -> string {
// Check current KYC status
let status = kyc::get_status(user_address);
if (status.is_some()) {
return status.unwrap().status;
} else {
return "not_verified";
}
}
fn get_kyc_providers() -> array {
// Get available KYC providers
let providers = kyc::list_providers();
return providers;
}
event KYCVerified(user_address: string, level: string, status: string);
event KYCStatusChecked(user_address: string, status: string);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_aml_screening_workflow() {
let code = r#"
@trust("hybrid")
@secure
service AMLService {
fn screen_user(user_address: string, check_type: string) -> string {
// Perform AML screening
let check = aml::screen(user_address, check_type, {});
if (check.is_ok()) {
let result = check.unwrap();
if (result.risk_score < 0.5) {
return "low_risk";
} else if (result.risk_score < 0.8) {
return "medium_risk";
} else {
return "high_risk";
}
} else {
return "screening_failed";
}
}
fn check_sanctions(user_address: string) -> bool {
// Check against sanctions list
let result = aml::check_sanctions(user_address);
if (result.is_ok()) {
return !result.unwrap(); // Return true if NOT on sanctions list
} else {
return false;
}
}
fn assess_risk(user_address: string) -> float {
// Comprehensive risk assessment
let assessment = aml::assess_risk(user_address, {});
if (assessment.is_ok()) {
return assessment.unwrap().risk_score;
} else {
return 1.0; // Maximum risk if assessment fails
}
}
event AMLScreened(user_address: string, risk_score: float, status: string);
event SanctionsChecked(user_address: string, on_list: bool);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_security_audit_logging() {
let code = r#"
@trust("hybrid")
@secure
service AuditService {
fn log_security_event(event_type: string, details: string, ip: string) {
// Log security event
log::audit(event_type, details, ip);
}
fn log_authentication_attempt(username: string, success: bool, ip: string) {
if (success) {
log::audit("auth_success", "User authenticated: " + username, ip);
} else {
log::audit("auth_failure", "Authentication failed: " + username, ip);
}
}
fn get_audit_logs(source: string) -> array {
// Retrieve audit logs by source
let logs = log::get_entries_by_source(source);
return logs;
}
fn get_all_audit_logs() -> array {
// Retrieve all audit logs
let logs = log::get_entries();
return logs;
}
event SecurityEventLogged(event_type: string, ip: string);
event AuditLogsRetrieved(count: int);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_input_validation_workflow() {
let code = r#"
@trust("hybrid")
@secure
service ValidationService {
fn validate_user_input(input: string, max_length: int) -> string {
// Validate string input
if (input == "") {
return "empty_input";
}
if (input.length() > max_length) {
return "input_too_long";
}
// Check for dangerous patterns
if (input.contains("<script>") || input.contains("javascript:")) {
return "dangerous_input";
}
return "valid";
}
fn validate_amount(amount: int, min: int, max: int) -> string {
// Validate numeric input
if (amount < min) {
return "amount_too_small";
}
if (amount > max) {
return "amount_too_large";
}
return "valid";
}
fn validate_address(address: string) -> string {
// Validate blockchain address format
if (address.length() != 42) {
return "invalid_length";
}
if (!address.startsWith("0x")) {
return "invalid_prefix";
}
return "valid";
}
event InputValidated(input_type: string, result: string);
event ValidationFailed(input_type: string, reason: string);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_complete_security_workflow() {
let code = r#"
@trust("decentralized")
@secure
@chain("ethereum")
service CompleteSecurityService {
fn secure_transaction_workflow(
user_id: string,
password: string,
recipient: string,
amount: int
) -> string {
// Step 1: Authenticate user
let session = auth::authenticate(user_id, password);
if (session.is_none()) {
log::audit("auth_failure", "Authentication failed for: " + user_id, "127.0.0.1");
return "authentication_failed";
}
// Step 2: Check permissions
if (!auth::has_permission(session.unwrap(), "transfer")) {
log::audit("permission_denied", "Transfer permission denied for: " + user_id, "127.0.0.1");
return "permission_denied";
}
// Step 3: Validate inputs
if (amount <= 0 || amount > 1000000) {
return "invalid_amount";
}
if (recipient.length() != 42 || !recipient.startsWith("0x")) {
return "invalid_recipient";
}
// Step 4: KYC/AML checks
let kyc_status = kyc::get_status(user_id);
if (kyc_status.is_none() || kyc_status.unwrap().status != "approved") {
return "kyc_not_approved";
}
let aml_result = aml::screen(user_id, "risk_assessment", {});
if (aml_result.is_ok() && aml_result.unwrap().risk_score > 0.8) {
log::audit("high_risk_transaction", "High risk transaction blocked: " + user_id, "127.0.0.1");
return "high_risk_blocked";
}
// Step 5: Generate signature for transaction
let message = "transfer:" + recipient + ":" + amount.toString();
let keypair = crypto_signatures::generate_keypair();
if (keypair.is_ok()) {
let (privkey, pubkey) = keypair.unwrap();
let signature = crypto_signatures::sign(message, privkey);
if (signature.is_ok()) {
// Step 6: Execute secure transaction
log::audit("transaction_executed", "Secure transaction: " + message, "127.0.0.1");
return "transaction_executed";
}
}
return "signing_failed";
}
event SecureTransactionExecuted(user_id: string, recipient: string, amount: int);
event SecurityCheckFailed(check_type: string, reason: string);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
let service_count = program.statements.iter()
.filter(|s| matches!(s, Statement::Service(_)))
.count();
assert_eq!(service_count, 1);
}
#[test]
fn test_multi_signature_security() {
let code = r#"
@trust("decentralized")
@secure
service MultiSigService {
fn create_multi_sig_wallet(required_signatures: int, owners: array) -> string {
// Create multi-signature wallet
// Validate required signatures
if (required_signatures < 1 || required_signatures > owners.length()) {
return "invalid_signature_requirement";
}
// Validate owners
for (let i = 0; i < owners.length(); i = i + 1) {
let owner = owners[i];
if (owner.length() != 42 || !owner.startsWith("0x")) {
return "invalid_owner_address";
}
}
return "wallet_created";
}
fn execute_multi_sig_transaction(
wallet_id: string,
signatures: array,
recipient: string,
amount: int
) -> string {
// Execute transaction requiring multiple signatures
// Validate signatures count
if (signatures.length() < 2) {
return "insufficient_signatures";
}
// Validate recipient
if (recipient.length() != 42 || !recipient.startsWith("0x")) {
return "invalid_recipient";
}
// Validate amount
if (amount <= 0) {
return "invalid_amount";
}
// Verify all signatures
let message = "transfer:" + recipient + ":" + amount.toString();
for (let i = 0; i < signatures.length(); i = i + 1) {
let sig_data = signatures[i];
// In real implementation, verify each signature
}
log::audit("multi_sig_transaction", "Multi-sig transaction executed", "127.0.0.1");
return "transaction_executed";
}
event MultiSigWalletCreated(wallet_id: string, owners: array, required: int);
event MultiSigTransactionExecuted(wallet_id: string, recipient: string, amount: int);
}
"#;
let program = parse_source(code).unwrap();
assert!(!program.statements.is_empty());
}
#[test]
fn test_jwt_full_lifecycle() {
let config = JwtConfig::new("test_secret_key".to_string())
.with_expiration(24);
let validator = AuthValidator::new(config);
let token = validator.generate_token(
"user_123".to_string(),
vec!["admin".to_string(), "moderator".to_string()],
vec!["read".to_string(), "write".to_string(), "delete".to_string()]
);
assert!(token.is_ok(), "Token generation failed");
let token_str = token.unwrap();
let claims_result = validator.validate_api_key(&token_str);
assert!(claims_result.is_ok(), "Token validation failed");
let claims = claims_result.unwrap();
assert_eq!(claims.sub, "user_123");
assert_eq!(claims.roles.len(), 2);
assert_eq!(claims.permissions.len(), 3);
let has_admin = validator.validate_role(&token_str, "admin");
assert!(has_admin.is_ok());
assert!(has_admin.unwrap());
let has_delete = validator.validate_permission(&token_str, "delete");
assert!(has_delete.is_ok());
assert!(has_delete.unwrap());
let has_super = validator.validate_role(&token_str, "superadmin");
assert!(has_super.is_ok());
assert!(!has_super.unwrap());
}
#[test]
fn test_ecdsa_cross_chain_integration() {
let (privkey, pubkey) = ECDSASignatureVerifier::generate_keypair().unwrap();
let message = b"Transfer 1000 tokens from Ethereum to Polygon";
let signature = ECDSASignatureVerifier::sign(message, &privkey);
assert!(signature.is_ok(), "Signing failed");
let sig = signature.unwrap();
let verify_result = ECDSASignatureVerifier::verify(message, &sig, &pubkey);
assert!(verify_result.is_ok(), "Verification failed");
assert!(verify_result.unwrap(), "Signature should be valid");
let wrong_msg = b"Transfer 2000 tokens";
let verify_wrong = ECDSASignatureVerifier::verify(wrong_msg, &sig, &pubkey);
assert!(verify_wrong.is_ok());
assert!(!verify_wrong.unwrap(), "Wrong message should fail verification");
}
#[test]
fn test_cross_chain_with_real_signatures() {
let mut manager = CrossChainSecurityManager::new();
let (validator_privkey, validator_pubkey) = ECDSASignatureVerifier::generate_keypair().unwrap();
let bridge_result = manager.create_bridge(
137, 137, "0xTestBridge".to_string(),
vec![validator_pubkey.clone()],
1,
1000000,
1000000,
);
assert!(bridge_result.is_ok(), "Bridge creation failed");
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
use sha2::{Sha256, Digest};
let mut hasher = Sha256::new();
hasher.update(b"cross_chain_transfer_data");
hasher.update(&now.to_be_bytes());
let message = hasher.finalize();
let signature = ECDSASignatureVerifier::sign(&message, &validator_privkey).unwrap();
let operation = CrossChainOperation {
operation_id: format!("op_{}", now),
source_chain: 137,
target_chain: 137,
operation_type: CrossChainOperationType::Transfer {
from: "0xUser1".to_string(),
to: "0xUser2".to_string(),
amount: 5000,
},
data: b"cross_chain_transfer_data".to_vec(),
signatures: vec![ValidatorSignature {
validator_address: validator_pubkey,
signature,
timestamp: now,
chain_id: 137,
}],
status: OperationStatus::Pending,
created_at: now,
timeout: now + 3600,
};
let result = manager.validate_cross_chain_operation(operation);
assert!(result.is_ok(), "Cross-chain operation validation should succeed with valid signature");
}
#[test]
fn test_multi_signature_validation() {
let mut manager = CrossChainSecurityManager::new();
let (priv1, pub1) = ECDSASignatureVerifier::generate_keypair().unwrap();
let (priv2, pub2) = ECDSASignatureVerifier::generate_keypair().unwrap();
manager.create_bridge(
137, 137, "0xMultiSigBridge".to_string(),
vec![pub1.clone(), pub2.clone()],
2, 1000000,
1000000,
).unwrap();
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
use sha2::{Sha256, Digest};
let mut hasher = Sha256::new();
hasher.update(b"multi_sig_data");
hasher.update(&now.to_be_bytes());
let message = hasher.finalize();
let sig1 = ECDSASignatureVerifier::sign(&message, &priv1).unwrap();
let sig2 = ECDSASignatureVerifier::sign(&message, &priv2).unwrap();
let operation = CrossChainOperation {
operation_id: format!("multi_op_{}", now),
source_chain: 137,
target_chain: 137,
operation_type: CrossChainOperationType::Transfer {
from: "0xSender".to_string(),
to: "0xReceiver".to_string(),
amount: 10000,
},
data: b"multi_sig_data".to_vec(),
signatures: vec![
ValidatorSignature {
validator_address: pub1,
signature: sig1,
timestamp: now,
chain_id: 137,
},
ValidatorSignature {
validator_address: pub2,
signature: sig2,
timestamp: now,
chain_id: 137,
},
],
status: OperationStatus::Pending,
created_at: now,
timeout: now + 3600,
};
let result = manager.validate_cross_chain_operation(operation);
assert!(result.is_ok(), "Multi-signature validation should succeed");
}
#[test]
fn test_signature_replay_protection() {
use dist_agent_lang::stdlib::crypto_signatures::SecureSignatureVerifier;
let mut verifier = SecureSignatureVerifier::new();
let (privkey, pubkey) = ECDSASignatureVerifier::generate_keypair().unwrap();
let message = b"transaction_data";
let nonce = std::process::id() as u64;
let signer_key = format!("test_signer_{}", std::process::id());
use sha2::{Sha256, Digest};
let mut hasher = Sha256::new();
hasher.update(message);
hasher.update(&nonce.to_be_bytes());
let message_with_nonce = hasher.finalize();
let signature = ECDSASignatureVerifier::sign(&message_with_nonce, &privkey).unwrap();
let result1 = verifier.verify_with_nonce(
message,
&signature,
&pubkey,
nonce,
&signer_key,
"ecdsa",
);
assert!(result1.is_ok(), "First verification should succeed");
assert!(result1.unwrap(), "Signature should be valid");
let result2 = verifier.verify_with_nonce(
message,
&signature,
&pubkey,
nonce, &signer_key,
"ecdsa",
);
assert!(result2.is_err(), "Replay attack should be detected");
assert!(result2.unwrap_err().to_string().to_lowercase().contains("replay")
|| result2.unwrap_err().to_string().to_lowercase().contains("nonce")
|| result2.unwrap_err().to_string().to_lowercase().contains("used"));
}
#[test]
fn test_security_logging_integration() {
SecurityLogger::log_event("TEST_EVENT", "Integration test", Some("127.0.0.1"));
SecurityLogger::log_rate_limit("192.168.1.1");
SecurityLogger::log_auth_failure("10.0.0.1", "Invalid credentials");
SecurityLogger::log_auth_success("10.0.0.2", "user_123");
SecurityLogger::log_suspicious_activity("172.16.0.1", "Multiple failed logins");
SecurityLogger::log_token_validation_failure("192.168.0.1", "Expired token");
assert!(true, "All logging methods executed successfully");
}
#[test]
fn test_comprehensive_security_stack() {
let jwt_validator = AuthValidator::default();
let jwt = jwt_validator.generate_token(
"secure_user".to_string(),
vec!["verified".to_string()],
vec!["execute_transaction".to_string()]
).unwrap();
assert!(jwt_validator.validate_permission(&jwt, "execute_transaction").unwrap());
let (privkey, pubkey) = ECDSASignatureVerifier::generate_keypair().unwrap();
let mut cc_manager = CrossChainSecurityManager::new();
cc_manager.create_bridge(
137, 137, "0xSecureBridge".to_string(),
vec![pubkey.clone()],
1, 1000000, 1000000,
).unwrap();
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
use sha2::{Sha256, Digest};
let mut hasher = Sha256::new();
hasher.update(b"secure_transaction");
hasher.update(&now.to_be_bytes());
let tx_msg = hasher.finalize();
let tx_signature = ECDSASignatureVerifier::sign(&tx_msg, &privkey).unwrap();
let operation = CrossChainOperation {
operation_id: format!("secure_op_{}", now),
source_chain: 137,
target_chain: 137,
operation_type: CrossChainOperationType::Transfer {
from: "0xSecureUser".to_string(),
to: "0xRecipient".to_string(),
amount: 50000,
},
data: b"secure_transaction".to_vec(),
signatures: vec![ValidatorSignature {
validator_address: pubkey,
signature: tx_signature,
timestamp: now,
chain_id: 137,
}],
status: OperationStatus::Pending,
created_at: now,
timeout: now + 3600,
};
let result = cc_manager.validate_cross_chain_operation(operation);
assert!(result.is_ok(), "Complete security stack should work together");
SecurityLogger::log_auth_success("127.0.0.1", "secure_user");
}