From 3fd578c3ccea681efd14aea07a0364b3baa3cca7 Mon Sep 17 00:00:00 2001
From: Filip Navara <filip.navara@gmail.com>
Date: Mon, 9 Jul 2018 19:08:50 +0200
Subject: [PATCH 2/7] Drop pal_asn1_print in favor of the managed code
* Drop pal_asn1_print in favor of the managed code that is already used on macOS.
* Add handling of T61 strings to ManagedCertificateFinder.DerStringToManagedString.
---
.../Interop.ASN1.Print.cs | 144 ------------------
.../Win32/SafeHandles/Asn1SafeHandles.Unix.cs | 28 ----
.../pal_asn1_print.cpp | 5 +
.../pal_asn1_print.h | 5 +
.../Internal/Cryptography/Pal.OSX/FindPal.cs | 28 ----
.../Pal.Unix/ManagedCertificateFinder.cs | 31 +++-
.../Pal.Unix/OpenSslCertificateFinder.cs | 5 -
...urity.Cryptography.X509Certificates.csproj | 3 -
8 files changed, 40 insertions(+), 209 deletions(-)
delete mode 100644 src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.ASN1.Print.cs
diff --git a/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.ASN1.Print.cs b/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.ASN1.Print.cs
deleted file mode 100644
index 12199563c8..0000000000
--- a/src/Common/src/Interop/Unix/System.Security.Cryptography.Native/Interop.ASN1.Print.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.Runtime.InteropServices;
-using System.Text;
-using Microsoft.Win32.SafeHandles;
-
-internal static partial class Interop
-{
- internal static partial class Crypto
- {
- [DllImport(Libraries.CryptoNative, EntryPoint = "CryptoNative_DecodeAsn1TypeBytes")]
- private static extern SafeAsn1StringHandle DecodeAsn1TypeBytes(byte[] buf, int len, Asn1StringTypeFlags flags);
-
- [DllImport(Libraries.CryptoNative, EntryPoint = "CryptoNative_Asn1StringPrintEx")]
- private static extern int Asn1StringPrintEx(SafeBioHandle bio, SafeAsn1StringHandle str, Asn1StringPrintFlags flags);
-
- [DllImport(Libraries.CryptoNative, EntryPoint = "CryptoNative_Asn1StringPrintEx")]
- private static extern int Asn1StringPrintEx(SafeBioHandle bio, SafeSharedAsn1StringHandle str, Asn1StringPrintFlags flags);
-
- internal static string DerStringToManagedString(byte[] derString)
- {
- SafeAsn1StringHandle asn1String = DecodeAsn1TypeBytes(derString, derString.Length, AnyTextStringType);
-
- if (asn1String.IsInvalid)
- {
- Interop.Crypto.ErrClearError();
- return null;
- }
-
- using (asn1String)
- {
- return Asn1StringToManagedString(
- asn1String,
- (bio, str, flags) => Asn1StringPrintEx(bio, str, flags));
- }
- }
-
- internal static string Asn1StringToManagedString(SafeSharedAsn1StringHandle asn1String)
- {
- CheckValidOpenSslHandle(asn1String);
-
- return Asn1StringToManagedString(
- asn1String,
- (bio, str, flags) => Asn1StringPrintEx(bio, str, flags));
- }
-
- private static string Asn1StringToManagedString<THandle>(
- THandle asn1String,
- Func<SafeBioHandle, THandle, Asn1StringPrintFlags, int> asn1StringPrintEx)
- {
- byte[] utf8Bytes;
-
- using (SafeBioHandle bio = CreateMemoryBio())
- {
- CheckValidOpenSslHandle(bio);
-
- int len = asn1StringPrintEx(bio, asn1String, Asn1StringPrintFlags.ASN1_STRFLGS_UTF8_CONVERT);
-
- if (len < 0)
- {
- throw CreateOpenSslCryptographicException();
- }
-
- if (len == 0)
- {
- return "";
- }
-
- int bioSize = GetMemoryBioSize(bio);
- utf8Bytes = new byte[bioSize + 1];
-
- int read = BioRead(bio, utf8Bytes, utf8Bytes.Length);
-
- if (read < 0)
- {
- throw CreateOpenSslCryptographicException();
- }
- }
-
- int nonNullCount = utf8Bytes.Length;
-
- if (utf8Bytes[utf8Bytes.Length - 1] == 0)
- {
- for (int i = utf8Bytes.Length - 1; i >= 0; i--)
- {
- if (utf8Bytes[i] != 0)
- {
- break;
- }
-
- nonNullCount = i;
- }
- }
-
- return Encoding.UTF8.GetString(utf8Bytes, 0, nonNullCount);
- }
-
- [Flags]
- private enum Asn1StringPrintFlags : ulong
- {
- ASN1_STRFLGS_UTF8_CONVERT = 0x10,
- }
-
- [Flags]
- private enum Asn1StringTypeFlags
- {
- B_ASN1_NUMERICSTRING = 0x0001,
- B_ASN1_PRINTABLESTRING = 0x0002,
- B_ASN1_T61STRING = 0x0004,
- B_ASN1_VIDEOTEXSTRING = 0x0008,
- B_ASN1_IA5STRING = 0x0010,
- B_ASN1_GRAPHICSTRING = 0x0020,
- B_ASN1_VISIBLESTRING = 0x0040,
- B_ASN1_GENERALSTRING = 0x0080,
- B_ASN1_UNIVERSALSTRING = 0x0100,
- B_ASN1_OCTET_STRING = 0x0200,
- B_ASN1_BIT_STRING = 0x0400,
- B_ASN1_BMPSTRING = 0x0800,
- B_ASN1_UNKNOWN = 0x1000,
- B_ASN1_UTF8STRING = 0x2000,
- B_ASN1_UTCTIME = 0x4000,
- B_ASN1_GENERALIZEDTIME = 0x8000,
- B_ASN1_SEQUENCE = 0x10000,
- }
-
- private const Asn1StringTypeFlags AnyTextStringType =
- Asn1StringTypeFlags.B_ASN1_NUMERICSTRING |
- Asn1StringTypeFlags.B_ASN1_PRINTABLESTRING |
- Asn1StringTypeFlags.B_ASN1_T61STRING |
- Asn1StringTypeFlags.B_ASN1_VIDEOTEXSTRING |
- Asn1StringTypeFlags.B_ASN1_IA5STRING |
- Asn1StringTypeFlags.B_ASN1_GRAPHICSTRING |
- Asn1StringTypeFlags.B_ASN1_VISIBLESTRING |
- Asn1StringTypeFlags.B_ASN1_GENERALSTRING |
- Asn1StringTypeFlags.B_ASN1_UNIVERSALSTRING |
- Asn1StringTypeFlags.B_ASN1_BMPSTRING |
- Asn1StringTypeFlags.B_ASN1_UTF8STRING |
- Asn1StringTypeFlags.B_ASN1_UTCTIME |
- Asn1StringTypeFlags.B_ASN1_GENERALIZEDTIME;
- }
-}
diff --git a/src/Common/src/Microsoft/Win32/SafeHandles/Asn1SafeHandles.Unix.cs b/src/Common/src/Microsoft/Win32/SafeHandles/Asn1SafeHandles.Unix.cs
index 3fdde3f602..ddf413110c 100644
--- a/src/Common/src/Microsoft/Win32/SafeHandles/Asn1SafeHandles.Unix.cs
+++ b/src/Common/src/Microsoft/Win32/SafeHandles/Asn1SafeHandles.Unix.cs
@@ -68,34 +68,6 @@ namespace Microsoft.Win32.SafeHandles
}
}
- internal sealed class SafeAsn1StringHandle : SafeHandle
- {
- private SafeAsn1StringHandle() :
- base(IntPtr.Zero, ownsHandle: true)
- {
- }
-
- protected override bool ReleaseHandle()
- {
- Interop.Crypto.Asn1StringFree(handle);
- SetHandle(IntPtr.Zero);
- return true;
- }
-
- public override bool IsInvalid
- {
- get { return handle == IntPtr.Zero; }
- }
- }
-
- internal sealed class SafeSharedAsn1StringHandle : SafeInteriorHandle
- {
- private SafeSharedAsn1StringHandle() :
- base(IntPtr.Zero, ownsHandle: true)
- {
- }
- }
-
internal sealed class SafeSharedAsn1IntegerHandle : SafeInteriorHandle
{
private SafeSharedAsn1IntegerHandle() :
diff --git a/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.cpp b/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.cpp
index ffbfef980d..01a544f5e9 100644
--- a/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.cpp
+++ b/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.cpp
@@ -4,6 +4,11 @@
#include "pal_asn1_print.h"
+/*
+ * This file is completely unused. It's kept around for compatiblity between
+ * servicing updates.
+ */
+
static_assert(PAL_B_ASN1_NUMERICSTRING == B_ASN1_NUMERICSTRING, "");
static_assert(PAL_B_ASN1_PRINTABLESTRING == B_ASN1_PRINTABLESTRING, "");
static_assert(PAL_B_ASN1_T61STRING == B_ASN1_T61STRING, "");
diff --git a/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.h b/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.h
index 982506e420..71205cc13c 100644
--- a/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.h
+++ b/src/Native/Unix/System.Security.Cryptography.Native/pal_asn1_print.h
@@ -5,6 +5,11 @@
#include "pal_types.h"
#include "opensslshim.h"
+/*
+ * This file is completely unused. It's kept around for compatiblity between
+ * servicing updates.
+ */
+
/*
Flags for the 'type' parameter of CryptoNative_DecodeAsn1TypeBytes.
*/
diff --git a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.OSX/FindPal.cs b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.OSX/FindPal.cs
index b2d2846c1a..e66bad7e76 100644
--- a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.OSX/FindPal.cs
+++ b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.OSX/FindPal.cs
@@ -22,34 +22,6 @@ namespace Internal.Cryptography.Pal
{
}
- protected override string DerStringToManagedString(byte[] anyString)
- {
- DerSequenceReader reader = DerSequenceReader.CreateForPayload(anyString);
-
- var tag = (DerSequenceReader.DerTag)reader.PeekTag();
- string value = null;
-
- switch (tag)
- {
- case DerSequenceReader.DerTag.BMPString:
- value = reader.ReadBMPString();
- break;
- case DerSequenceReader.DerTag.IA5String:
- value = reader.ReadIA5String();
- break;
- case DerSequenceReader.DerTag.PrintableString:
- value = reader.ReadPrintableString();
- break;
- case DerSequenceReader.DerTag.UTF8String:
- value = reader.ReadUtf8String();
- break;
-
- // Ignore anything we don't know how to read.
- }
-
- return value;
- }
-
protected override byte[] GetSubjectPublicKeyInfo(X509Certificate2 cert)
{
AppleCertificatePal pal = (AppleCertificatePal)cert.Pal;
diff --git a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/ManagedCertificateFinder.cs b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/ManagedCertificateFinder.cs
index ebc5ee48d1..a70bf1488d 100644
--- a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/ManagedCertificateFinder.cs
+++ b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/ManagedCertificateFinder.cs
@@ -123,7 +123,36 @@ namespace Internal.Cryptography.Pal
FindCore(cert => cert.NotAfter < normalized);
}
- protected abstract string DerStringToManagedString(byte[] anyString);
+ private string DerStringToManagedString(byte[] anyString)
+ {
+ DerSequenceReader reader = DerSequenceReader.CreateForPayload(anyString);
+
+ var tag = (DerSequenceReader.DerTag)reader.PeekTag();
+ string value = null;
+
+ switch (tag)
+ {
+ case DerSequenceReader.DerTag.BMPString:
+ value = reader.ReadBMPString();
+ break;
+ case DerSequenceReader.DerTag.IA5String:
+ value = reader.ReadIA5String();
+ break;
+ case DerSequenceReader.DerTag.PrintableString:
+ value = reader.ReadPrintableString();
+ break;
+ case DerSequenceReader.DerTag.UTF8String:
+ value = reader.ReadUtf8String();
+ break;
+ case DerSequenceReader.DerTag.T61String:
+ value = reader.ReadT61String();
+ break;
+
+ // Ignore anything we don't know how to read.
+ }
+
+ return value;
+ }
public void FindByTemplateName(string templateName)
{
diff --git a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/OpenSslCertificateFinder.cs b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/OpenSslCertificateFinder.cs
index 720c298994..717ee3753b 100644
--- a/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/OpenSslCertificateFinder.cs
+++ b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix/OpenSslCertificateFinder.cs
@@ -13,11 +13,6 @@ namespace Internal.Cryptography.Pal
{
}
- protected override string DerStringToManagedString(byte[] anyString)
- {
- return Interop.Crypto.DerStringToManagedString(anyString);
- }
-
protected override byte[] GetSubjectPublicKeyInfo(X509Certificate2 cert)
{
OpenSslX509CertificateReader certPal = (OpenSslX509CertificateReader)cert.Pal;
diff --git a/src/System.Security.Cryptography.X509Certificates/src/System.Security.Cryptography.X509Certificates.csproj b/src/System.Security.Cryptography.X509Certificates/src/System.Security.Cryptography.X509Certificates.csproj
index 3bdef009b9..5d9e22a7f3 100644
--- a/src/System.Security.Cryptography.X509Certificates/src/System.Security.Cryptography.X509Certificates.csproj
+++ b/src/System.Security.Cryptography.X509Certificates/src/System.Security.Cryptography.X509Certificates.csproj
@@ -186,9 +186,6 @@
<Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.ASN1.GetIntegerBytes.cs">
<Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.ASN1.GetIntegerBytes.cs</Link>
</Compile>
- <Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.ASN1.Print.cs">
- <Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.ASN1.Print.cs</Link>
- </Compile>
<Compile Include="$(CommonPath)\Interop\Unix\System.Security.Cryptography.Native\Interop.Bignum.cs">
<Link>Common\Interop\Unix\System.Security.Cryptography.Native\Interop.Bignum.cs</Link>
</Compile>
--
2.20.1