<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

IetfUtilities

public abstract class IetfUtilities
using Org.BouncyCastle.Utilities.Encoders; using System; using System.IO; using System.Text; namespace Org.BouncyCastle.Asn1.X500.Style { public abstract class IetfUtilities { internal static string Unescape(string elt) { if (elt.Length < 1) return elt; if (elt.IndexOf('\\') < 0 && elt.IndexOf('"') < 0) return elt.Trim(); bool flag = false; bool flag2 = false; StringBuilder stringBuilder = new StringBuilder(elt.Length); int num = 0; if (elt[0] == '\\' && elt[1] == '#') { num = 2; stringBuilder.Append("\\#"); } bool flag3 = false; int num2 = 0; char c = Convert.ToChar(0); for (int i = num; i != elt.Length; i++) { char c2 = elt[i]; if (c2 != ' ') flag3 = true; switch (c2) { case '"': if (!flag) flag2 = !flag2; else { stringBuilder.Append(c2); flag = false; } break; case '\\': if (!(flag | flag2)) { flag = true; num2 = stringBuilder.Length; break; } goto default; default: if (c2 != ' ' || flag || flag3) { if (flag && IsHexDigit(c2)) { if (c != 0) { stringBuilder.Append(Convert.ToChar(ConvertHex(c) * 16 + ConvertHex(c2))); flag = false; c = Convert.ToChar(0); } else c = c2; } else { stringBuilder.Append(c2); flag = false; } } break; } } if (stringBuilder.Length > 0) { while (stringBuilder[stringBuilder.Length - 1] == ' ' && num2 != stringBuilder.Length - 1) { stringBuilder.Length--; } } return stringBuilder.ToString(); } private static bool IsHexDigit(char c) { if (('0' > c || c > '9') && ('a' > c || c > 'f')) { if ('A' <= c) return c <= 'F'; return false; } return true; } private static int ConvertHex(char c) { if ('0' <= c && c <= '9') return c - 48; if ('a' <= c && c <= 'f') return c - 97 + 10; return c - 65 + 10; } public static string ValueToString(Asn1Encodable value) { StringBuilder stringBuilder = new StringBuilder(); IAsn1String asn1String = value as IAsn1String; if (asn1String == null || value is DerUniversalString) try { stringBuilder.Append('#'); stringBuilder.Append(Hex.ToHexString(value.ToAsn1Object().GetEncoded("DER"))); } catch (IOException innerException) { throw new ArgumentException("Other value has no encoded form", innerException); } else { string string = asn1String.GetString(); if (string.Length > 0 && string[0] == '#') stringBuilder.Append('\\'); stringBuilder.Append(string); } int num = stringBuilder.Length; int num2 = 0; if (stringBuilder.Length >= 2 && stringBuilder[0] == '\\' && stringBuilder[1] == '#') num2 += 2; while (num2 != num) { switch (stringBuilder[num2]) { case '"': case '+': case ',': case ';': case '<': case '=': case '>': case '\\': stringBuilder.Insert(num2, "\\"); num2 += 2; num++; break; default: num2++; break; } } int i = 0; if (stringBuilder.Length > 0) { for (; stringBuilder.Length > i && stringBuilder[i] == ' '; i += 2) { stringBuilder.Insert(i, "\\"); } } int num3 = stringBuilder.Length - 1; while (num3 >= 0 && stringBuilder[num3] == ' ') { stringBuilder.Insert(num3, "\\"); num3--; } return stringBuilder.ToString(); } public static string Canonicalize(string s) { string text = s.ToLowerInvariant(); if (text.Length > 0 && text[0] == '#') { IAsn1String asn1String = DecodeObject(text) as IAsn1String; if (asn1String != null) text = asn1String.GetString().ToLowerInvariant(); } if (text.Length > 1) { int i; for (i = 0; i + 1 < text.Length && text[i] == '\\' && text[i + 1] == ' '; i += 2) { } int num = text.Length - 1; while (num - 1 > 0 && text[num - 1] == '\\' && text[num] == ' ') { num -= 2; } if (i > 0 || num < text.Length - 1) text = text.Substring(i, num + 1 - i); } return StripInternalSpaces(text); } public static string CanonicalString(Asn1Encodable value) { return Canonicalize(ValueToString(value)); } private static Asn1Object DecodeObject(string oValue) { try { return Asn1Object.FromByteArray(Hex.DecodeStrict(oValue, 1, oValue.Length - 1)); } catch (IOException ex) { throw new InvalidOperationException("unknown encoding in name: " + ex?.ToString()); } } public static string StripInternalSpaces(string str) { if (str.IndexOf(" ") < 0) return str; StringBuilder stringBuilder = new StringBuilder(); char c = str[0]; stringBuilder.Append(c); for (int i = 1; i < str.Length; i++) { char c2 = str[i]; if (' ' != c || ' ' != c2) { stringBuilder.Append(c2); c = c2; } } return stringBuilder.ToString(); } public static bool RdnAreEqual(Rdn rdn1, Rdn rdn2) { if (rdn1.Count != rdn2.Count) return false; AttributeTypeAndValue[] typesAndValues = rdn1.GetTypesAndValues(); AttributeTypeAndValue[] typesAndValues2 = rdn2.GetTypesAndValues(); if (typesAndValues.Length != typesAndValues2.Length) return false; for (int i = 0; i != typesAndValues.Length; i++) { if (!AtvAreEqual(typesAndValues[i], typesAndValues2[i])) return false; } return true; } private static bool AtvAreEqual(AttributeTypeAndValue atv1, AttributeTypeAndValue atv2) { if (atv1 == atv2) return true; if (atv1 == null || atv2 == null) return false; DerObjectIdentifier type = atv1.Type; DerObjectIdentifier type2 = atv2.Type; if (!type.Equals(type2)) return false; string text = CanonicalString(atv1.Value); string value = CanonicalString(atv2.Value); if (!text.Equals(value)) return false; return true; } } }