Skip to content

Commit 1d1df64

Browse files
authored
Minor cleanup and reduce allocations in managed X.509 certificate PAL
Removes a few allocations, pre-sizes a list to the correct size, and remove redundant debugging code.
1 parent 43cc4c1 commit 1d1df64

File tree

1 file changed

+6
-27
lines changed

1 file changed

+6
-27
lines changed

src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/CertificateData.ManagedDecode.cs

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,23 @@ internal CertificateData(byte[] rawData)
7878
RawData = rawData;
7979
certificate = CertificateAsn.Decode(rawData, AsnEncodingRules.DER);
8080
certificate.TbsCertificate.ValidateVersion();
81-
Issuer = new X500DistinguishedName(certificate.TbsCertificate.Issuer.ToArray());
82-
Subject = new X500DistinguishedName(certificate.TbsCertificate.Subject.ToArray());
81+
Issuer = new X500DistinguishedName(certificate.TbsCertificate.Issuer.Span);
82+
Subject = new X500DistinguishedName(certificate.TbsCertificate.Subject.Span);
8383
IssuerName = Issuer.Name;
8484
SubjectName = Subject.Name;
8585

8686
AsnWriter writer = new AsnWriter(AsnEncodingRules.DER);
8787
certificate.TbsCertificate.SubjectPublicKeyInfo.Encode(writer);
8888
SubjectPublicKeyInfo = writer.Encode();
8989

90-
Extensions = new List<X509Extension>();
90+
Extensions = new List<X509Extension>((certificate.TbsCertificate.Extensions?.Length).GetValueOrDefault());
9191
if (certificate.TbsCertificate.Extensions != null)
9292
{
9393
foreach (X509ExtensionAsn rawExtension in certificate.TbsCertificate.Extensions)
9494
{
9595
X509Extension extension = new X509Extension(
9696
rawExtension.ExtnId,
97-
rawExtension.ExtnValue.ToArray(),
97+
rawExtension.ExtnValue.Span,
9898
rawExtension.Critical);
9999

100100
Extensions.Add(extension);
@@ -104,9 +104,8 @@ internal CertificateData(byte[] rawData)
104104
}
105105
catch (Exception e)
106106
{
107-
throw new CryptographicException(
108-
$"Error in reading certificate:{Environment.NewLine}{PemPrintCert(rawData)}",
109-
e);
107+
string pem = new string(PemEncoding.Write(PemLabels.X509Certificate, rawData));
108+
throw new CryptographicException($"Error in reading certificate:{Environment.NewLine}{pem}", e);
110109
}
111110
#endif
112111
}
@@ -379,25 +378,5 @@ private static IEnumerable<KeyValuePair<string, string>> ReadReverseRdns(X500Dis
379378
}
380379
}
381380
}
382-
383-
#if DEBUG
384-
private static string PemPrintCert(byte[] rawData)
385-
{
386-
const string PemHeader = "-----BEGIN CERTIFICATE-----";
387-
const string PemFooter = "-----END CERTIFICATE-----";
388-
389-
StringBuilder builder = new StringBuilder(PemHeader.Length + PemFooter.Length + rawData.Length * 2);
390-
builder.Append(PemHeader);
391-
builder.AppendLine();
392-
393-
builder.Append(Convert.ToBase64String(rawData, Base64FormattingOptions.InsertLineBreaks));
394-
builder.AppendLine();
395-
396-
builder.Append(PemFooter);
397-
builder.AppendLine();
398-
399-
return builder.ToString();
400-
}
401-
#endif
402381
}
403382
}

0 commit comments

Comments
 (0)