Skip to content

Commit 8744985

Browse files
committed
Added tests for certificate padding.
The included binaries are self-signed, however the validity of the signature is not important for these tests. The executables included are real with a changed extension, however they are simply native binaries where main() returns zero and nothing more.
1 parent d02560b commit 8744985

File tree

8 files changed

+46
-4
lines changed

8 files changed

+46
-4
lines changed

AuthenticodeLint/CheckEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public RuleEngineResult RunAllRules(string file, Graph<Signature> signatures, Li
3434
foreach(var rule in rules)
3535
{
3636
RuleResult result;
37-
var verboseWriter = verbose ? new VerboseSignatureLogger() : SignatureLogger.Null;
37+
var verboseWriter = verbose ? new MemorySignatureLogger() : SignatureLogger.Null;
3838
if (signatures.Items.Count == 0)
3939
{
4040
result = RuleResult.Fail;

AuthenticodeLint/Rules/WinCertificatePaddingRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class WinCertificatePaddingRule : IAuthenticodeFileRule
1414
public RuleResult Validate(string file, SignatureLogger verboseWriter, CheckConfiguration configuration)
1515
{
1616
var padding = CertificatePaddingExtractor.ExtractPadding(file);
17-
if (padding?.Any(p => p != 0) ?? false)
17+
if (padding?.Any(p => p != 0) == true)
1818
{
1919
verboseWriter.LogMessage($"Non-zero data found after PKCS#7 structure: {Convert.ToBase64String(padding)}.");
2020
return RuleResult.Fail;

AuthenticodeLint/VerboseSignatureTextWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace AuthenticodeLint
99
{
10-
public class VerboseSignatureLogger : SignatureLogger
10+
public class MemorySignatureLogger : SignatureLogger
1111
{
1212
public override void LogMessage(string message) => Messages.Add(message);
1313

@@ -34,7 +34,7 @@ public abstract class SignatureLogger
3434
{
3535
public static SignatureLogger Null { get; } = new NullSignatureLogger();
3636

37-
internal List<string> Messages { get; } = new List<string>();
37+
public List<string> Messages { get; } = new List<string>();
3838

3939
public abstract void LogSignatureMessage(SignerInfo signature, string message);
4040
public abstract void LogMessage(string message);

AuthenticodeLintTests/AuthenticodeLintTests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@
3838
<ItemGroup>
3939
<Compile Include="CommandLineParsingTests.cs" />
4040
<Compile Include="Properties\AssemblyInfo.cs" />
41+
<Compile Include="Rules\WinCertificatePaddingRuleTests.cs" />
4142
</ItemGroup>
4243
<ItemGroup>
44+
<None Include="inputs\wintrustnonpadded.ex_" />
45+
<None Include="inputs\wintrustpadded.ex_" />
4346
<None Include="project.json" />
4447
</ItemGroup>
4548
<ItemGroup>
@@ -51,6 +54,7 @@
5154
<ItemGroup>
5255
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
5356
</ItemGroup>
57+
<ItemGroup />
5458
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
5559
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
5660
Other similar extension points exist, see Microsoft.Common.targets.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using AuthenticodeLint;
2+
using AuthenticodeLint.Rules;
3+
using System;
4+
using System.Collections.Generic;
5+
using Xunit;
6+
7+
namespace AuthenticodeLintTests.Rules
8+
{
9+
public class WinCertificatePaddingRuleTests
10+
{
11+
private static CheckConfiguration Configuration => new CheckConfiguration(new List<string>(), null, false, new HashSet<int>(), false, RevocationChecking.None);
12+
13+
[Fact]
14+
public void PaddedExecutableShouldFail()
15+
{
16+
var file = "../../inputs/wintrustpadded.ex_";
17+
var rule = new WinCertificatePaddingRule();
18+
var logger = new MemorySignatureLogger();
19+
20+
var result = rule.Validate(file, logger, Configuration);
21+
Assert.Equal(RuleResult.Fail, result);
22+
var expectedPadding = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("fail"));
23+
Assert.Contains($"Non-zero data found after PKCS#7 structure: {expectedPadding}.", logger.Messages);
24+
}
25+
26+
[Fact]
27+
public void NonPaddedExecutableShouldPass()
28+
{
29+
var file = "../../inputs/wintrustnonpadded.ex_";
30+
var rule = new WinCertificatePaddingRule();
31+
var logger = new MemorySignatureLogger();
32+
33+
var result = rule.Validate(file, logger, Configuration);
34+
Assert.Equal(RuleResult.Pass, result);
35+
Assert.Empty(logger.Messages);
36+
}
37+
}
38+
}
Binary file not shown.
36.7 KB
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)