Imported Upstream version 5.18.0.142

Former-commit-id: 7467d4b717762eeaf652d77f1486dd11ffb1ff1f
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-10-09 08:20:59 +00:00
parent e52655b4dc
commit 0abdbe5a7d
1547 changed files with 93792 additions and 47893 deletions

View File

@@ -4,23 +4,13 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Private;
using System.Diagnostics;
using System.Globalization;
namespace Internal.Cryptography
{
internal static class Helpers
internal static partial class Helpers
{
public static byte[] CloneByteArray(this byte[] src)
{
if (src == null)
{
return null;
}
return (byte[])(src.Clone());
}
// Encode a byte array as an array of upper-case hex characters.
public static char[] ToHexArrayUpper(this byte[] bytes)
{

View File

@@ -471,6 +471,9 @@ namespace Internal.Cryptography.Pal
case DerSequenceReader.DerTag.UTF8String:
value = tavReader.ReadUtf8String();
break;
case DerSequenceReader.DerTag.T61String:
value = tavReader.ReadT61String();
break;
// Ignore anything we don't know how to read.
}

View File

@@ -238,9 +238,7 @@ namespace Internal.Cryptography.Pal
get
{
EnsureCertData();
byte[] serial = _certData.SerialNumber;
Array.Reverse(serial);
return serial;
return _certData.SerialNumber;
}
}

View File

@@ -73,7 +73,8 @@ namespace Internal.Cryptography.Pal
AppleCertificatePal applePal = (AppleCertificatePal)cert;
Interop.AppleCrypto.X509StoreRemoveCertificate(applePal.CertificateHandle, _keychainHandle);
var handle = (SafeKeychainItemHandle)applePal.IdentityHandle ?? applePal.CertificateHandle;
Interop.AppleCrypto.X509StoreRemoveCertificate(handle, _keychainHandle);
}
public SafeHandle SafeHandle => _keychainHandle;

View File

@@ -102,12 +102,7 @@ namespace Internal.Cryptography.Pal
{
using (SafeSharedAsn1IntegerHandle serialNumber = Interop.Crypto.X509GetSerialNumber(_cert))
{
byte[] serial = Interop.Crypto.GetAsn1IntegerBytes(serialNumber);
// Windows returns this in BigInteger Little-Endian,
// OpenSSL returns this in BigInteger Big-Endian.
Array.Reverse(serial);
return serial;
return Interop.Crypto.GetAsn1IntegerBytes(serialNumber);
}
}
}

View File

@@ -199,6 +199,7 @@ namespace Internal.Cryptography.Pal
{
CERT_CONTEXT* pCertContext = _certContext.CertContext;
byte[] serialNumber = pCertContext->pCertInfo->SerialNumber.ToByteArray();
Array.Reverse(serialNumber);
GC.KeepAlive(this);
return serialNumber;
}

View File

@@ -26,6 +26,9 @@
<Compile Include="$(CommonPath)\System\Security\Cryptography\DerSequenceReader.cs">
<Link>Common\System\Security\Cryptography\DerSequenceReader.cs</Link>
</Compile>
<Compile Include="$(CommonPath)\Internal\Cryptography\Helpers.cs">
<Link>Internal\Cryptography\Helpers.cs</Link>
</Compile>
<Compile Include="Internal\Cryptography\CertificateExtensionsCommon.cs" />
<Compile Include="Internal\Cryptography\EncodingHelpers.cs" />
<Compile Include="Internal\Cryptography\ErrorCode.cs" />

View File

@@ -443,14 +443,16 @@ namespace System.Security.Cryptography.X509Certificates
public virtual byte[] GetSerialNumber()
{
ThrowIfInvalid();
return GetRawSerialNumber().CloneByteArray();
byte[] serialNumber = GetRawSerialNumber().CloneByteArray();
// PAL always returns big-endian, GetSerialNumber returns little-endian
Array.Reverse(serialNumber);
return serialNumber;
}
public virtual string GetSerialNumberString()
{
ThrowIfInvalid();
// PAL always returns big-endian, GetSerialNumberString returns big-endian too
return GetRawSerialNumber().ToHexStringUpper();
}
@@ -599,6 +601,9 @@ namespace System.Security.Cryptography.X509Certificates
if (!culture.DateTimeFormat.Calendar.IsValidDay(date.Year, date.Month, date.Day, 0))
{
// This is unnecessary dependency we cannot easily remove by linker
#if !MOBILE
// The most common case of culture failing to work is in the Um-AlQuara calendar. In this case,
// we can fall back to the Hijri calendar, otherwise fall back to the invariant culture.
if (culture.DateTimeFormat.Calendar is UmAlQuraCalendar)
@@ -607,6 +612,7 @@ namespace System.Security.Cryptography.X509Certificates
culture.DateTimeFormat.Calendar = new HijriCalendar();
}
else
#endif
{
culture = CultureInfo.InvariantCulture;
}

View File

@@ -289,9 +289,7 @@ namespace System.Security.Cryptography.X509Certificates
{
get
{
byte[] serialNumber = GetSerialNumber();
Array.Reverse(serialNumber);
return serialNumber.ToHexStringUpper();
return GetSerialNumberString();
}
}

View File

@@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Test.Cryptography;
using Xunit;
using Xunit.Abstractions;
@@ -358,6 +359,26 @@ namespace System.Security.Cryptography.X509Certificates.Tests
}
}
[Fact]
public static void X509Certificate2WithT61String()
{
string certSubject = @"E=mabaul@microsoft.com, OU=Engineering, O=Xamarin, S=Massachusetts, C=US, CN=test-server.local";
using (var cert = new X509Certificate2(TestData.T61StringCertificate))
{
Assert.Equal(certSubject, cert.Subject);
Assert.Equal(certSubject, cert.Issuer);
Assert.Equal("9E7A5CCC9F951A8700", cert.GetSerialNumber().ByteArrayToHex());
Assert.Equal("1.2.840.113549.1.1.1", cert.GetKeyAlgorithm());
Assert.Equal(74, cert.GetPublicKey().Length);
Assert.Equal("test-server.local", cert.GetNameInfo(X509NameType.SimpleName, false));
Assert.Equal("mabaul@microsoft.com", cert.GetNameInfo(X509NameType.EmailName, false));
}
}
public static IEnumerable<object> StorageFlags => CollectionImportTests.StorageFlags;
}
}

View File

@@ -37,11 +37,10 @@ namespace System.Security.Cryptography.X509Certificates.Tests
}
[Fact]
[ActiveIssue(30543, TargetFrameworkMonikers.NetFramework)]
public static void TestSerial()
{
string expectedSerialHex = "B00000000100DD9F3BD08B0AAF11B000000033";
byte[] expectedSerial = expectedSerialHex.HexToByteArray();
string expectedSerialHex = "33000000B011AF0A8BD03B9FDD0001000000B0";
byte[] expectedSerial = "B00000000100DD9F3BD08B0AAF11B000000033".HexToByteArray();
using (X509Certificate2 c = LoadCertificateFromFile())
{
@@ -49,6 +48,8 @@ namespace System.Security.Cryptography.X509Certificates.Tests
Assert.Equal(expectedSerial, serial);
string serialHex = c.GetSerialNumberString();
Assert.Equal(expectedSerialHex, serialHex);
serialHex = c.SerialNumber;
Assert.Equal(expectedSerialHex, serialHex);
}
}

View File

@@ -1 +1 @@
ff8c1614be5a4956ca251667eacd7957b38eff3e
f27924e0354b11871f2c524d60242f130819ac36