summaryrefslogtreecommitdiff
path: root/Tools/sign.targets
blob: e7d8bd0e8b68e3721b29498bacccb8112a5b8c6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <AuthenticodeSig Condition="'$(AuthenticodeSig)' == ''">Microsoft</AuthenticodeSig>
    <StrongNameSig Condition="'$(StrongNameSig)' == '' and '$(SignType)' == 'real' and '$(UseOpenKey)' != 'true'">StrongName</StrongNameSig>
  </PropertyGroup>

  <UsingTask AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" TaskName="OpenSourceSign" />
  <UsingTask AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" TaskName="WriteSigningRequired" />

  <PropertyGroup Condition="'$(SkipSigning)'!='true'">

    <!-- For older support set AssemblyKey base on Use*Key properties but moving forward projects should just set AssemblyKey -->
    <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseOpenKey)' == 'true'">Open</AssemblyKey>
    <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseECMAKey)' == 'true'">ECMA</AssemblyKey>
    <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseMSFTKey)' == 'true'">MSFT</AssemblyKey>

    <!-- Force all test projects to use the Test key -->
    <AssemblyKey Condition="'$(IsTestProject)' == 'true'">Test</AssemblyKey>

    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'MSFT'">$(ToolsDir)MSFT.snk</AssemblyOriginatorKeyFile>
    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'ECMA'">$(ToolsDir)ECMA.snk</AssemblyOriginatorKeyFile>
    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'Open'">$(ToolsDir)Open.snk</AssemblyOriginatorKeyFile>
    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'SilverlightPlatform'">$(ToolsDir)SilverlightPlatformPublicKey.snk</AssemblyOriginatorKeyFile>
    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'SilverlightExtension'">$(ToolsDir)SilverlightPublicKey.snk</AssemblyOriginatorKeyFile>

    <StrongNameSig Condition="'$(AssemblyKey)' == 'Open'">Open</StrongNameSig>
    <StrongNameSig Condition="'$(AssemblyKey)' == 'SilverlightPlatform'">SilverlightCert121</StrongNameSig>
    <StrongNameSig Condition="'$(AssemblyKey)' == 'SilverlightExtension'">MsSharedLib</StrongNameSig>

    <!-- Don't sign test assemblies with the Microsoft Key, as this affects APIs checking if the test assembly is an MS Key -->
    <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'Test'">$(ToolsDir)Test.snk</AssemblyOriginatorKeyFile>

    <SignAssembly>true</SignAssembly>
    <DelaySign>true</DelaySign>

    <DelaySign Condition="'$(AssemblyKey)' == 'Test'">false</DelaySign>

    <!--
      Setting DelaySign to true when running build on unix because of Roslyn doesn't support full signing on non-windows.
      See issue https://github.com/dotnet/roslyn/issues/8210.
    -->
    <DelaySign Condition="'$(RunningOnUnix)' == 'true'">true</DelaySign>

    <DefineConstants>$(DefineConstants);SIGNED</DefineConstants>

    <!-- applicable values for SignType are public, test or real -->
    <SignType Condition="'$(SignType)' == ''">public</SignType>

    <ShouldWriteSigningRequired Condition="'$(IsTestProject)' == 'true'">false</ShouldWriteSigningRequired>
    <ShouldWriteSigningRequired Condition="'$(SkipSigning)' == 'true'">false</ShouldWriteSigningRequired>
    <ShouldWriteSigningRequired Condition="'$(SignType)' == 'public' or '$(SignType)' == 'oss'">false</ShouldWriteSigningRequired>
    <ShouldWriteSigningRequired Condition="'$(ShouldWriteSigningRequired)'==''">true</ShouldWriteSigningRequired>

    <ShouldOpenSourceSign Condition="'$(SignType)' == 'public' or '$(SignType)' == 'oss'">$(DelaySign)</ShouldOpenSourceSign>
    <ShouldOpenSourceSign Condition="'$(SkipSigning)' == 'true'">false</ShouldOpenSourceSign>
  </PropertyGroup>

  <!-- stub for signing.  for official builds this is replaced with the real one -->
  <Target Name="SignFiles" AfterTargets="AfterBuild" />

  <Target Name="SignFilesLocally"
          BeforeTargets="SignFiles"
          Condition="'$(RunningOnUnix)' != 'true'">

    <ItemGroup>
      <FilesToSignLocally Include="@(FilesToSign)" Condition="'%(FilesToSign.StrongName)' == 'Open'">
        <AssemblyKeyFile>$(ToolsDir)Open.snk</AssemblyKeyFile>
      </FilesToSignLocally>
      <!-- Clear out the strong name metadata for open keys -->
      <FilesToSign Condition="'%(FilesToSign.StrongName)' == 'Open'">
        <StrongName></StrongName>
      </FilesToSign>
    </ItemGroup>

    <!-- Depends on sn being on the path thus will only work in some windows environments -->
    <Exec Condition="'@(FilesToSignLocally)' != ''"
          Command="sn -R %(FilesToSignLocally.Identity) %(FilesToSignLocally.AssemblyKeyFile)"
          StandardOutputImportance="Low" />
  </Target>

  <!-- writes a signing marker file containing the required signatures -->
  <Target Name="WriteSigningRequired"
          AfterTargets="AfterBuild"
          Condition="'$(ShouldWriteSigningRequired)' == 'true'"
          Inputs="$(TargetPath)"
          Outputs="$(TargetPath).requires_signing">
    <WriteSigningRequired AuthenticodeSig="$(AuthenticodeSig)"
                          StrongNameSig="$(StrongNameSig)"
                          MarkerFile="$(TargetPath).requires_signing" />
    <ItemGroup>
      <FileWrites Include="%(IntermediateAssembly.Identity).requires_signing" />
    </ItemGroup>
  </Target>

  <!--
    NOTE: This mechanism for wiring in the OpenSourceSign target can't be changed to any of the following:

        * AfterTargets=Compile -> hit by intellisense builds while @(IntermediateAssembly) doesn't exist yet.
        * AfterTargets=PrepareForRun -> hit after @(IntermediateAssembly) has already been copied to output.
        * BeforeTargets=CopyFilesToOutputDirectory -> does not work on Mono.
  -->
  <PropertyGroup>
    <PrepareForRunDependsOn>OpenSourceSign;$(PrepareForRunDependsOn)</PrepareForRunDependsOn>
  </PropertyGroup>

  <Target Name="OpenSourceSign"
          Condition="'$(ShouldOpenSourceSign)' == 'true' and '@(IntermediateAssembly)' != ''"
          Inputs="@(IntermediateAssembly)"
          Outputs="%(IntermediateAssembly.Identity).oss_signed"
          >
    <OpenSourceSign AssemblyPath="%(IntermediateAssembly.Identity)" />
    <Touch Files="%(IntermediateAssembly.Identity).oss_signed" AlwaysCreate="true" />
    <ItemGroup>
      <FileWrites Include="%(IntermediateAssembly.Identity).oss_signed" />
    </ItemGroup>
  </Target>

</Project>