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));
        }
Exemple #2
0
        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
     };
 }