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

NamedGroup

public abstract class NamedGroup
RFC 7919
namespace Org.BouncyCastle.Tls { public abstract class NamedGroup { public const int sect163k1 = 1; public const int sect163r1 = 2; public const int sect163r2 = 3; public const int sect193r1 = 4; public const int sect193r2 = 5; public const int sect233k1 = 6; public const int sect233r1 = 7; public const int sect239k1 = 8; public const int sect283k1 = 9; public const int sect283r1 = 10; public const int sect409k1 = 11; public const int sect409r1 = 12; public const int sect571k1 = 13; public const int sect571r1 = 14; public const int secp160k1 = 15; public const int secp160r1 = 16; public const int secp160r2 = 17; public const int secp192k1 = 18; public const int secp192r1 = 19; public const int secp224k1 = 20; public const int secp224r1 = 21; public const int secp256k1 = 22; public const int secp256r1 = 23; public const int secp384r1 = 24; public const int secp521r1 = 25; public const int brainpoolP256r1 = 26; public const int brainpoolP384r1 = 27; public const int brainpoolP512r1 = 28; public const int x25519 = 29; public const int x448 = 30; public const int brainpoolP256r1tls13 = 31; public const int brainpoolP384r1tls13 = 32; public const int brainpoolP512r1tls13 = 33; public const int GC256A = 34; public const int GC256B = 35; public const int GC256C = 36; public const int GC256D = 37; public const int GC512A = 38; public const int GC512B = 39; public const int GC512C = 40; public const int curveSM2 = 41; public const int ffdhe2048 = 256; public const int ffdhe3072 = 257; public const int ffdhe4096 = 258; public const int ffdhe6144 = 259; public const int ffdhe8192 = 260; public const int arbitrary_explicit_prime_curves = 65281; public const int arbitrary_explicit_char2_curves = 65282; private static readonly string[] CurveNames = new string[41] { "sect163k1", "sect163r1", "sect163r2", "sect193r1", "sect193r2", "sect233k1", "sect233r1", "sect239k1", "sect283k1", "sect283r1", "sect409k1", "sect409r1", "sect571k1", "sect571r1", "secp160k1", "secp160r1", "secp160r2", "secp192k1", "secp192r1", "secp224k1", "secp224r1", "secp256k1", "secp256r1", "secp384r1", "secp521r1", "brainpoolP256r1", "brainpoolP384r1", "brainpoolP512r1", "X25519", "X448", "brainpoolP256r1", "brainpoolP384r1", "brainpoolP512r1", "Tc26-Gost-3410-12-256-paramSetA", "GostR3410-2001-CryptoPro-A", "GostR3410-2001-CryptoPro-B", "GostR3410-2001-CryptoPro-C", "Tc26-Gost-3410-12-512-paramSetA", "Tc26-Gost-3410-12-512-paramSetB", "Tc26-Gost-3410-12-512-paramSetC", "sm2p256v1" }; private static readonly string[] FiniteFieldNames = new string[5] { "ffdhe2048", "ffdhe3072", "ffdhe4096", "ffdhe6144", "ffdhe8192" }; public static bool CanBeNegotiated(int namedGroup, ProtocolVersion version) { if (TlsUtilities.IsTlsV13(version)) { if ((namedGroup >= 1 && namedGroup <= 22) || (namedGroup >= 26 && namedGroup <= 28) || (namedGroup >= 34 && namedGroup <= 40) || (namedGroup >= 65281 && namedGroup <= 65282)) return false; } else if ((namedGroup >= 31 && namedGroup <= 33) || namedGroup == 41) { return false; } return IsValid(namedGroup); } public static int GetCurveBits(int namedGroup) { switch (namedGroup) { case 15: case 16: case 17: return 160; case 1: case 2: case 3: return 163; case 18: case 19: return 192; case 4: case 5: return 193; case 20: case 21: return 224; case 6: case 7: return 233; case 8: return 239; case 29: return 252; case 22: case 23: case 26: case 31: case 34: case 35: case 36: case 37: case 41: return 256; case 9: case 10: return 283; case 24: case 27: case 32: return 384; case 11: case 12: return 409; case 30: return 446; case 28: case 33: case 38: case 39: case 40: return 512; case 25: return 521; case 13: case 14: return 571; default: return 0; } } public static string GetCurveName(int namedGroup) { if (RefersToASpecificCurve(namedGroup)) return CurveNames[namedGroup - 1]; return null; } public static int GetFiniteFieldBits(int namedGroup) { switch (namedGroup) { case 256: return 2048; case 257: return 3072; case 258: return 4096; case 259: return 6144; case 260: return 8192; default: return 0; } } public static string GetFiniteFieldName(int namedGroup) { if (RefersToASpecificFiniteField(namedGroup)) return FiniteFieldNames[namedGroup - 256]; return null; } public static int GetMaximumChar2CurveBits() { return 571; } public static int GetMaximumCurveBits() { return 571; } public static int GetMaximumFiniteFieldBits() { return 8192; } public static int GetMaximumPrimeCurveBits() { return 521; } public static string GetName(int namedGroup) { if (!IsPrivate(namedGroup)) { switch (namedGroup) { case 29: return "x25519"; case 30: return "x448"; case 31: return "brainpoolP256r1tls13"; case 32: return "brainpoolP384r1tls13"; case 33: return "brainpoolP512r1tls13"; case 34: return "GC256A"; case 35: return "GC256B"; case 36: return "GC256C"; case 37: return "GC256D"; case 38: return "GC512A"; case 39: return "GC512B"; case 40: return "GC512C"; case 41: return "curveSM2"; case 65281: return "arbitrary_explicit_prime_curves"; case 65282: return "arbitrary_explicit_char2_curves"; default: { string standardName = GetStandardName(namedGroup); if (standardName != null) return standardName; return "UNKNOWN"; } } } return "PRIVATE"; } public static string GetStandardName(int namedGroup) { string curveName = GetCurveName(namedGroup); if (curveName != null) return curveName; string finiteFieldName = GetFiniteFieldName(namedGroup); if (finiteFieldName != null) return finiteFieldName; return null; } public static string GetText(int namedGroup) { return GetName(namedGroup) + "(" + namedGroup.ToString() + ")"; } public static bool IsChar2Curve(int namedGroup) { if (namedGroup < 1 || namedGroup > 14) return namedGroup == 65282; return true; } public static bool IsFiniteField(int namedGroup) { return (namedGroup & 4294967040) == 256; } public static bool IsPrimeCurve(int namedGroup) { if (namedGroup < 15 || namedGroup > 41) return namedGroup == 65281; return true; } public static bool IsPrivate(int namedGroup) { if (namedGroup >> 2 != 127) return namedGroup >> 8 == 254; return true; } public static bool IsValid(int namedGroup) { if (!RefersToASpecificGroup(namedGroup) && !IsPrivate(namedGroup)) { if (namedGroup >= 65281) return namedGroup <= 65282; return false; } return true; } public static bool RefersToAnECDHCurve(int namedGroup) { return RefersToASpecificCurve(namedGroup); } public static bool RefersToAnECDSACurve(int namedGroup) { if (RefersToASpecificCurve(namedGroup)) return !RefersToAnXDHCurve(namedGroup); return false; } public static bool RefersToAnXDHCurve(int namedGroup) { if (namedGroup >= 29) return namedGroup <= 30; return false; } public static bool RefersToASpecificCurve(int namedGroup) { if (namedGroup >= 1) return namedGroup <= 41; return false; } public static bool RefersToASpecificFiniteField(int namedGroup) { if (namedGroup >= 256) return namedGroup <= 260; return false; } public static bool RefersToASpecificGroup(int namedGroup) { if (!RefersToASpecificCurve(namedGroup)) return RefersToASpecificFiniteField(namedGroup); return true; } } }