Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release/5.0] Handle inconsistent \0 in Pkcs9Document{Name|Description} #45153

Merged
merged 2 commits into from
Nov 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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