Skip to content

Commit aaf0bde

Browse files
authored
Avoid date string allocation in OpenSslX509CertificateReader.ExtractValidityDateTime (#75138)
Also consolidated some duplicated code.
1 parent d6a4f7a commit aaf0bde

File tree

1 file changed

+14
-40
lines changed

1 file changed

+14
-40
lines changed

src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslX509CertificateReader.cs

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -781,61 +781,35 @@ internal static DateTime ExtractValidityDateTime(IntPtr validityDatePtr)
781781
Debug.Assert(
782782
bytes.Length == 13 || bytes.Length == 15,
783783
"DateTime value should be UTCTime (13 bytes) or GeneralizedTime (15 bytes)");
784-
785784
Debug.Assert(
786785
bytes[bytes.Length - 1] == 'Z',
787786
"DateTime value should end with Z marker");
788787

789-
if (bytes == null || bytes.Length < 1 || bytes[bytes.Length - 1] != 'Z')
790-
{
791-
throw new CryptographicException();
792-
}
793-
794-
string dateString = Encoding.ASCII.GetString(bytes);
795-
796-
if (s_validityDateTimeFormatInfo == null)
797-
{
798-
DateTimeFormatInfo validityFormatInfo =
799-
(DateTimeFormatInfo)CultureInfo.InvariantCulture.DateTimeFormat.Clone();
800-
801-
// Two-digit years are 1950-2049
802-
validityFormatInfo.Calendar.TwoDigitYearMax = 2049;
803-
804-
s_validityDateTimeFormatInfo = validityFormatInfo;
805-
}
806-
807-
if (bytes.Length == 13)
788+
if (bytes != null && bytes.Length is 13 or 15 && bytes[^1] == 'Z')
808789
{
809-
DateTime utcTime;
790+
Span<char> dateString = stackalloc char[Encoding.ASCII.GetCharCount(bytes)];
791+
Encoding.ASCII.GetChars(bytes, dateString);
810792

811-
if (!DateTime.TryParseExact(
812-
dateString,
813-
"yyMMddHHmmss'Z'",
814-
s_validityDateTimeFormatInfo,
815-
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
816-
out utcTime))
793+
if (s_validityDateTimeFormatInfo == null)
817794
{
818-
throw new CryptographicException();
819-
}
795+
DateTimeFormatInfo validityFormatInfo =
796+
(DateTimeFormatInfo)CultureInfo.InvariantCulture.DateTimeFormat.Clone();
820797

821-
return utcTime.ToLocalTime();
822-
}
798+
// Two-digit years are 1950-2049
799+
validityFormatInfo.Calendar.TwoDigitYearMax = 2049;
823800

824-
if (bytes.Length == 15)
825-
{
826-
DateTime generalizedTime;
801+
s_validityDateTimeFormatInfo = validityFormatInfo;
802+
}
827803

828-
if (!DateTime.TryParseExact(
804+
if (DateTime.TryParseExact(
829805
dateString,
830-
"yyyyMMddHHmmss'Z'",
806+
bytes.Length == 13 ? "yyMMddHHmmss'Z'" : "yyyyMMddHHmmss'Z'",
831807
s_validityDateTimeFormatInfo,
832808
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
833-
out generalizedTime))
809+
out DateTime time))
834810
{
835-
throw new CryptographicException();
811+
return time.ToLocalTime();
836812
}
837-
838-
return generalizedTime.ToLocalTime();
839813
}
840814

841815
throw new CryptographicException();

0 commit comments

Comments
 (0)