public void ContractAuditor_AcsRequired_Test() { var whiteList = new List <string> { "System.Collection", "System.Linq" }; var blackList = new List <string> { "System.Random", "System.DateTime" }; _auditor = new ContractAuditor(whiteList, blackList); var requireAcs = new RequiredAcsDto(); requireAcs.AcsList = new List <string> { "acs1" }; Should.Throw <InvalidCodeException>(() => _auditor.Audit(_badContractCode, requireAcs, true)); Should.NotThrow(() => _auditor.Audit(_systemContractCode, requireAcs, true)); requireAcs.AcsList.Add("acs8"); Should.NotThrow(() => _auditor.Audit(_systemContractCode, requireAcs, true)); requireAcs.RequireAll = true; Should.Throw <InvalidCodeException>(() => _auditor.Audit(_systemContractCode, requireAcs, true)); }
public void Audit(byte[] code, RequiredAcsDto requiredAcs, bool priority) { var findings = new List <ValidationResult>(); var asm = Assembly.Load(code); var modDef = ModuleDefinition.ReadModule(new MemoryStream(code)); var policy = priority ? _priviligePolicy : _defaultPolicy; // Check against whitelist findings.AddRange(policy.Whitelist.Validate(modDef)); // Run module validators findings.AddRange(policy.ModuleValidators.SelectMany(v => v.Validate(modDef))); // Run assembly validators (run after module validators since we invoke BindService method below) findings.AddRange(policy.AssemblyValidators.SelectMany(v => v.Validate(asm))); // Run method validators foreach (var type in modDef.Types) { findings.AddRange(ValidateMethodsInType(policy, type)); } // Perform ACS validation findings.AddRange(_acsValidator.Validate(asm, requiredAcs)); if (findings.Count > 0) { throw new InvalidCodeException( $"Contract code did not pass audit. Audit failed for contract: {modDef.Assembly.MainModule.Name}\n" + string.Join("\n", findings), findings); } }
public ContractAuditorFixture() { _auditor = new ContractAuditor(null, null); _requiredAcs = new RequiredAcsDto { AcsList = new [] { "acs1", "acs8" }.ToList(), RequireAll = false }; }
public ContractPolicyTests() { _systemContractCode = ReadCode(_contractDllDir + typeof(BasicContractZero).Module + ".patched"); _badContractCode = ReadCode(_contractDllDir + typeof(BadContract).Module); _requiredAcs = new RequiredAcsDto { AcsList = new[] { "acs1", "acs8" }.ToList(), RequireAll = false }; }