Skip to content

Commit

Permalink
[release/5.0] Handle inconsistent \0 in Pkcs9Document{Name|Descriptio…
Browse files Browse the repository at this point in the history
…n} (#45153)

* Handle inconsistent \0 in Pkcs9Document{Name|Description}

* Packaging changes for servicing fix

Co-authored-by: Jeremy Barton <jbarton@microsoft.com>
  • Loading branch information
github-actions[bot] and bartonjs authored Nov 25, 2020
1 parent ca4d6d1 commit ce2b755
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<Import Project="..\Directory.Build.props" />
<PropertyGroup>
<StrongNameKeyId>Microsoft</StrongNameKeyId>
<PackageVersion>5.0.1</PackageVersion>
<AssemblyVersion>5.0.0.1</AssemblyVersion>
<IncludePlatformAttributes>true</IncludePlatformAttributes>
<UnsupportedOSPlatforms>browser</UnsupportedOSPlatforms>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,20 @@ public static string OctetStringToUnicode(this byte[] octets)
if (octets.Length < 2)
return string.Empty; // .NET Framework compat: 0-length byte array maps to string.empty. 1-length byte array gets passed to Marshal.PtrToStringUni() with who knows what outcome.

string s = Encoding.Unicode.GetString(octets, 0, octets.Length - 2);
int end = octets.Length;
int endMinusOne = end - 1;

// Truncate the string to before the first embedded \0 (probably the last two bytes).
for (int i = 0; i < endMinusOne; i += 2)
{
if (octets[i] == 0 && octets[i + 1] == 0)
{
end = i;
break;
}
}

string s = Encoding.Unicode.GetString(octets, 0, end);
return s;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,30 @@ public static void DocumentDescriptionFromRawData()
Assert.Equal(s_OidDocumentDescription, oid);
}

[Fact]
public static void DocumentDescriptionMissingTerminator()
{
byte[] rawData = "041e4d00790020004400650073006300720069007000740069006f006e002100".HexToByteArray();
Pkcs9DocumentDescription p = new Pkcs9DocumentDescription(rawData);
Assert.Equal(rawData, p.RawData);
string cookedData = p.DocumentDescription;
Assert.Equal("My Description!", cookedData);
string oid = p.Oid.Value;
Assert.Equal(s_OidDocumentDescription, oid);
}

[Fact]
public static void DocumentDescriptionEmbeddedTerminator()
{
byte[] rawData = "041e4d00790020004400650073006300720000007000740069006f006e000000".HexToByteArray();
Pkcs9DocumentDescription p = new Pkcs9DocumentDescription(rawData);
Assert.Equal(rawData, p.RawData);
string cookedData = p.DocumentDescription;
Assert.Equal("My Descr", cookedData);
string oid = p.Oid.Value;
Assert.Equal(s_OidDocumentDescription, oid);
}

[Fact]
public static void DocumentDescriptionFromCookedData()
{
Expand Down Expand Up @@ -226,6 +250,30 @@ public static void DocumentNameFromRawData()
Assert.Equal(s_OidDocumentName, oid);
}

[Fact]
public static void DocumentNameMissingTerminator()
{
byte[] rawData = "04104d00790020004e0061006d0065002100".HexToByteArray();
Pkcs9DocumentName p = new Pkcs9DocumentName(rawData);
Assert.Equal(rawData, p.RawData);
string cookedData = p.DocumentName;
Assert.Equal("My Name!", cookedData);
string oid = p.Oid.Value;
Assert.Equal(s_OidDocumentName, oid);
}

[Fact]
public static void DocumentNameEmbeddedTerminator()
{
byte[] rawData = "04104d00790020004e006100000065000000".HexToByteArray();
Pkcs9DocumentName p = new Pkcs9DocumentName(rawData);
Assert.Equal(rawData, p.RawData);
string cookedData = p.DocumentName;
Assert.Equal("My Na", cookedData);
string oid = p.Oid.Value;
Assert.Equal(s_OidDocumentName, oid);
}

[Fact]
public static void DocumentNameFromCookedData()
{
Expand Down
1 change: 1 addition & 0 deletions src/libraries/libraries-packages.proj
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<ProjectReference Include="$(MSBuildThisFileDirectory)*\pkg\**\*.pkgproj" Condition="('$(BuildAllConfigurations)' == 'true' or '$(DotNetBuildFromSource)' == 'true') And '$(BuildAllOOBPackages)' == 'true'" />
<!-- If setting BuildAllOOBPackages to false, add bellow the individual OOB packages you want to continue to build -->
<ProjectReference Include="$(LibrariesProjectRoot)\System.IO.Pipelines\pkg\System.IO.Pipelines.pkgproj" Condition="'$(BuildAllConfigurations)' == 'true'" />
<ProjectReference Include="$(LibrariesProjectRoot)\System.Security.Cryptography.Pkcs\pkg\System.Security.Cryptography.Pkcs.pkgproj" Condition="'$(BuildAllConfigurations)' == 'true'" />
</ItemGroup>

<!-- Need the PackageIndexFile file property from baseline.props -->
Expand Down
7 changes: 5 additions & 2 deletions src/libraries/pkg/baseline/packageIndex.json
Original file line number Diff line number Diff line change
Expand Up @@ -5801,7 +5801,9 @@
"4.5.1",
"4.5.2",
"4.6.0",
"5.0.0"
"4.7.0",
"5.0.0",
"5.0.1"
],
"BaselineVersion": "5.0.0",
"InboxOn": {},
Expand All @@ -5814,7 +5816,8 @@
"4.0.3.2": "4.5.2",
"4.0.4.0": "4.6.0",
"4.1.0.0": "4.6.0",
"5.0.0.0": "5.0.0"
"5.0.0.0": "5.0.0",
"5.0.0.1": "5.0.1"
}
},
"System.Security.Cryptography.Primitives": {
Expand Down

0 comments on commit ce2b755

Please sign in to comment.