| File: SignFile.cs | Web Access |
| Project: src\msbuild\src\Tasks\Microsoft.Build.Tasks.csproj (Microsoft.Build.Tasks.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Runtime.Versioning; using System.Security.Cryptography; using Microsoft.Build.Framework; using Microsoft.Build.Shared; using Microsoft.Build.Tasks.Deployment.ManifestUtilities; using Microsoft.Build.Utilities; using Constants = Microsoft.Build.Tasks.Deployment.ManifestUtilities.Constants; #nullable disable namespace Microsoft.Build.Tasks { /// <summary> /// This task signs the passed in file using the Authenticode cert /// provided and optionally uses a timestamp if a URL is provided. /// It can sign ClickOnce manifests as well as exe's. /// </summary> [SupportedOSPlatform("windows")] public sealed class SignFile : Task { public SignFile() : base(AssemblyResources.PrimaryResources, "MSBuild.") { } [Required] public string CertificateThumbprint { get; set; } [Required] public ITaskItem SigningTarget { get; set; } public string TargetFrameworkIdentifier { get; set; } = Constants.DotNetFrameworkIdentifier; public String TargetFrameworkVersion { get; set; } public string TimestampUrl { get; set; } public bool DisallowMansignTimestampFallback { get; set; } = false; [UnconditionalSuppressMessage("TrimAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Signing a ClickOnce manifest reads and writes it with XmlSerializer; this task is inherently incompatible with trimming.")] [UnconditionalSuppressMessage("AotAnalysis", "IL3050:RequiresDynamicCode", Justification = "Signing a ClickOnce manifest uses XmlSerializer, XslCompiledTransform, and SignedXml; this task is inherently incompatible with Native AOT.")] public override bool Execute() { if (!NativeMethodsShared.IsWindows) { Log.LogErrorWithCodeFromResources("General.TaskRequiresWindows", nameof(SignFile)); return false; } try { SecurityUtilities.SignFile( CertificateThumbprint, TimestampUrl == null ? null : new Uri(TimestampUrl), SigningTarget.ItemSpec, TargetFrameworkVersion, TargetFrameworkIdentifier, DisallowMansignTimestampFallback); return true; } catch (ArgumentException ex) when (ex.ParamName.Equals("certThumbprint")) { Log.LogErrorWithCodeFromResources("SignFile.CertNotInStore"); return false; } catch (FileNotFoundException ex) { Log.LogErrorWithCodeFromResources("SignFile.TargetFileNotFound", ex.FileName); return false; } catch (ApplicationException ex) { Log.LogErrorWithCodeFromResources("SignFile.SignToolError", ex.Message.Trim()); return false; } catch (WarningException ex) { Log.LogWarningWithCodeFromResources("SignFile.SignToolWarning", ex.Message.Trim()); return true; } catch (CryptographicException ex) { Log.LogErrorWithCodeFromResources("SignFile.SignToolError", ex.Message.Trim()); return false; } catch (Win32Exception ex) { Log.LogErrorWithCodeFromResources("SignFile.SignToolError", ex.Message.Trim()); return false; } catch (UriFormatException ex) { Log.LogErrorWithCodeFromResources("SignFile.SignToolError", ex.Message.Trim()); return false; } } } }