Skip to content

Commit 2b6ca9c

Browse files
committed
Support detached signature verification for tars and zips
1 parent eab76e0 commit 2b6ca9c

File tree

7 files changed

+40
-24
lines changed

7 files changed

+40
-24
lines changed

src/SignCheck/Microsoft.SignCheck/Utils.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public static (int exitCode, string output, string error) RunBashCommand(string
189189
}
190190

191191
/// <summary>
192-
/// Download the Microsoft and Azure Linux public keys and import them into the keyring.
192+
/// Download the Microsoft, Azure Linux, and .NET release public keys and import them into the keyring.
193193
/// </summary>
194194
public static void DownloadAndConfigurePublicKeys(string tempDir)
195195
{
@@ -198,7 +198,8 @@ public static void DownloadAndConfigurePublicKeys(string tempDir)
198198
"https://packages.microsoft.com/keys/microsoft.asc", // Microsoft public key
199199
"https://packages.microsoft.com/keys/microsoft-2025.asc", // Microsoft public key for distributions that do not allow SHA1
200200
"https://packages.microsoft.com/keys/microsoft-rolling.asc", // Non-SHA1 Microsoft public keys for non-Azure Linux distributions
201-
"https://raw.githubusercontent.com/microsoft/azurelinux/3.0/SPECS/azurelinux-repos/MICROSOFT-RPM-GPG-KEY" // Azure linux public key
201+
"https://raw.githubusercontent.com/microsoft/azurelinux/3.0/SPECS/azurelinux-repos/MICROSOFT-RPM-GPG-KEY", // Azure linux public key
202+
"https://dot.net/release-key-2023", // .NET release public key
202203
};
203204
foreach (string keyUrl in keyUrls)
204205
{

src/SignCheck/Microsoft.SignCheck/Verification/DebVerifier.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace Microsoft.SignCheck.Verification
1111
{
12-
public class DebVerifier : LinuxPackageVerifier
12+
public class DebVerifier : PgpVerifier
1313
{
1414
public DebVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options) : base(log, exclusions, options, ".deb") { }
1515

src/SignCheck/Microsoft.SignCheck/Verification/LinuxPackageVerifier.cs renamed to src/SignCheck/Microsoft.SignCheck/Verification/PgpVerifier.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,24 @@
1010

1111
namespace Microsoft.SignCheck.Verification
1212
{
13-
public abstract class LinuxPackageVerifier : ArchiveVerifier
13+
public abstract class PgpVerifier : ArchiveVerifier
1414
{
15-
protected LinuxPackageVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension) : base(log, exclusions, options, fileExtension) { }
15+
private bool _supportsDetachedSignature;
16+
17+
protected PgpVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension, bool supportsDetachedSignature = false)
18+
: base(log, exclusions, options, fileExtension)
19+
{
20+
_supportsDetachedSignature = supportsDetachedSignature;
21+
}
1622

1723
public override SignatureVerificationResult VerifySignature(string path, string parent, string virtualPath)
18-
=> VerifySupportedFileType(path, parent, virtualPath);
24+
{
25+
if (_supportsDetachedSignature && File.Exists(path + ".sig"))
26+
{
27+
return VerifySupportedFileType(path, parent, virtualPath);
28+
}
29+
return VerifyUnsupportedFileType(path, parent, virtualPath);
30+
}
1931

2032
/// <summary>
2133
/// Returns the paths to the signature document and the signable content.
@@ -24,13 +36,25 @@ public override SignatureVerificationResult VerifySignature(string path, string
2436
/// <param name="path"></param>
2537
/// <param name="tempDir"></param>
2638
/// <returns></returns>
27-
protected abstract (string signatureDocument, string signableContent) GetSignatureDocumentAndSignableContent(string path, string tempDir);
39+
protected virtual (string signatureDocument, string signableContent) GetSignatureDocumentAndSignableContent(string path, string tempDir)
40+
{
41+
if (_supportsDetachedSignature)
42+
{
43+
string signature = $"{path}.sig";
44+
string signatureDocument = Path.Combine(tempDir, Path.GetFileName(signature));
45+
File.Copy(signature, signatureDocument, overwrite: true);
46+
47+
return (signatureDocument, path);
48+
}
49+
50+
throw new InvalidOperationException("GetSignatureDocumentAndSignableContent must be overridden for supported archive types that do not use detached signatures.");
51+
}
2852

2953
protected override bool IsSigned(string path, SignatureVerificationResult svr)
3054
{
3155
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
3256
{
33-
throw new PlatformNotSupportedException("Linux package verification is not supported on Windows.");
57+
throw new PlatformNotSupportedException("Pgp verification is not supported on Windows.");
3458
}
3559

3660
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

src/SignCheck/Microsoft.SignCheck/Verification/RpmVerifier.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Microsoft.SignCheck.Verification
1313
{
14-
public class RpmVerifier : LinuxPackageVerifier
14+
public class RpmVerifier : PgpVerifier
1515
{
1616
public RpmVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options) : base(log, exclusions, options, ".rpm") { }
1717

src/SignCheck/Microsoft.SignCheck/Verification/SignatureVerificationManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public SignatureVerificationManager(Exclusions exclusions, Log log, SignatureVer
116116
AddFileVerifier(new NupkgVerifier(log, exclusions, options));
117117
AddFileVerifier(new PortableExecutableVerifier(log, exclusions, options, ".dll"));
118118
AddFileVerifier(new XmlVerifier(log, exclusions, options));
119-
AddFileVerifier(new ZipVerifier(log, exclusions, options));
119+
AddFileVerifier(new ZipVerifier(log, exclusions, options, supportsDetachedSignature: true));
120120
}
121121

122122
/// <summary>

src/SignCheck/Microsoft.SignCheck/Verification/TarVerifier.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,16 @@
1010

1111
namespace Microsoft.SignCheck.Verification
1212
{
13-
public class TarVerifier : ArchiveVerifier
13+
public class TarVerifier : PgpVerifier
1414
{
15-
public TarVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension) : base(log, exclusions, options, fileExtension)
15+
public TarVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension) : base(log, exclusions, options, fileExtension, supportsDetachedSignature: true)
1616
{
1717
if (fileExtension != ".tar" && fileExtension != ".gz" && fileExtension != ".tgz")
1818
{
19-
throw new ArgumentException("fileExtension must be .tar or .gz");
19+
throw new ArgumentException("fileExtension must be .tar, .gz, or .tgz");
2020
}
2121
}
2222

23-
public override SignatureVerificationResult VerifySignature(string path, string parent, string virtualPath)
24-
=> VerifyUnsupportedFileType(path, parent, virtualPath);
25-
2623
protected override IEnumerable<ArchiveEntry> ReadArchiveEntries(string archivePath)
2724
{
2825
using (var fileStream = File.Open(archivePath, FileMode.Open))

src/SignCheck/Microsoft.SignCheck/Verification/ZipVerifier.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,9 @@
88

99
namespace Microsoft.SignCheck.Verification
1010
{
11-
public class ZipVerifier : ArchiveVerifier
11+
public class ZipVerifier : PgpVerifier
1212
{
13-
public ZipVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension = ".zip") : base(log, exclusions, options, fileExtension)
14-
{
15-
16-
}
17-
18-
public override SignatureVerificationResult VerifySignature(string path, string parent, string virtualPath)
19-
=> VerifyUnsupportedFileType(path, parent, virtualPath);
13+
public ZipVerifier(Log log, Exclusions exclusions, SignatureVerificationOptions options, string fileExtension = ".zip", bool supportsDetachedSignature = false) : base(log, exclusions, options, fileExtension, supportsDetachedSignature) { }
2014

2115
protected override IEnumerable<ArchiveEntry> ReadArchiveEntries(string archivePath)
2216
{

0 commit comments

Comments
 (0)