Skip to content

Commit

Permalink
Handle inconsistent \0 in Pkcs9Document{Name|Description}
Browse files Browse the repository at this point in the history
  • Loading branch information
bartonjs authored Nov 24, 2020
1 parent 664b962 commit 2e8c4c7
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
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

0 comments on commit 2e8c4c7

Please sign in to comment.