X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BoarSSL;a=blobdiff_plain;f=SSLTLS%2FSSL.cs;h=40591947dbab7c6bdb24cd63f2e47e439721bc93;hp=5250e5d8ffc9d436324e87dd17c9aff35850508a;hb=c16004e3afb8aa2524aeec88aa7c9c67400e93c1;hpb=a3526e62c383183a1ba5572a3af40912431121fc diff --git a/SSLTLS/SSL.cs b/SSLTLS/SSL.cs index 5250e5d..4059194 100644 --- a/SSLTLS/SSL.cs +++ b/SSLTLS/SSL.cs @@ -288,6 +288,36 @@ public sealed class SSL { return String.Format("UNKNOWN:0x{0:X4}", version); } + /* + * Parse a version name. + */ + public static int GetVersionByName(string s) + { + string t = s.Trim().Replace(" ", "").Replace(".", "") + .Replace("-", "").ToUpperInvariant(); + switch (t) { + case "SSL3": + case "SSLV3": + case "SSL30": + case "SSLV30": + return SSL30; + case "TLS1": + case "TLSV1": + case "TLS10": + case "TLSV10": + return TLS10; + case "TLS11": + case "TLSV11": + return TLS11; + case "TLS12": + case "TLSV12": + return TLS12; + default: + throw new Exception(string.Format( + "Unknown protocol version: '{0}'", s)); + } + } + /* * Get a human-readable name for a cipher suite. */ @@ -497,6 +527,218 @@ public sealed class SSL { } } + /* + * Parse a cipher suite name. + */ + public static int GetSuiteByName(string s) + { + string t = s.Trim().Replace("_", "").Replace("-", "") + .ToUpperInvariant(); + if (t.StartsWith("TLS") || t.StartsWith("SSL")) { + t = t.Substring(3); + } + switch (t) { + case "NULLWITHNULLNULL": + return NULL_WITH_NULL_NULL; + case "RSAWITHNULLMD5": + return RSA_WITH_NULL_MD5; + case "RSAWITHNULLSHA": + return RSA_WITH_NULL_SHA; + case "RSAWITHNULLSHA256": + return RSA_WITH_NULL_SHA256; + case "RSAWITHRC4128MD5": + return RSA_WITH_RC4_128_MD5; + case "RSAWITHRC4128SHA": + return RSA_WITH_RC4_128_SHA; + case "RSAWITH3DESEDECBCSHA": + return RSA_WITH_3DES_EDE_CBC_SHA; + case "RSAWITHAES128CBCSHA": + return RSA_WITH_AES_128_CBC_SHA; + case "RSAWITHAES256CBCSHA": + return RSA_WITH_AES_256_CBC_SHA; + case "RSAWITHAES128CBCSHA256": + return RSA_WITH_AES_128_CBC_SHA256; + case "RSAWITHAES256CBCSHA256": + return RSA_WITH_AES_256_CBC_SHA256; + case "DHDSSWITH3DESEDECBCSHA": + return DH_DSS_WITH_3DES_EDE_CBC_SHA; + case "DHRSAWITH3DESEDECBCSHA": + return DH_RSA_WITH_3DES_EDE_CBC_SHA; + case "DHEDSSWITH3DESEDECBCSHA": + return DHE_DSS_WITH_3DES_EDE_CBC_SHA; + case "DHERSAWITH3DESEDECBCSHA": + return DHE_RSA_WITH_3DES_EDE_CBC_SHA; + case "DHDSSWITHAES128CBCSHA": + return DH_DSS_WITH_AES_128_CBC_SHA; + case "DHRSAWITHAES128CBCSHA": + return DH_RSA_WITH_AES_128_CBC_SHA; + case "DHEDSSWITHAES128CBCSHA": + return DHE_DSS_WITH_AES_128_CBC_SHA; + case "DHERSAWITHAES128CBCSHA": + return DHE_RSA_WITH_AES_128_CBC_SHA; + case "DHDSSWITHAES256CBCSHA": + return DH_DSS_WITH_AES_256_CBC_SHA; + case "DHRSAWITHAES256CBCSHA": + return DH_RSA_WITH_AES_256_CBC_SHA; + case "DHEDSSWITHAES256CBCSHA": + return DHE_DSS_WITH_AES_256_CBC_SHA; + case "DHERSAWITHAES256CBCSHA": + return DHE_RSA_WITH_AES_256_CBC_SHA; + case "DHDSSWITHAES128CBCSHA256": + return DH_DSS_WITH_AES_128_CBC_SHA256; + case "DHRSAWITHAES128CBCSHA256": + return DH_RSA_WITH_AES_128_CBC_SHA256; + case "DHEDSSWITHAES128CBCSHA256": + return DHE_DSS_WITH_AES_128_CBC_SHA256; + case "DHERSAWITHAES128CBCSHA256": + return DHE_RSA_WITH_AES_128_CBC_SHA256; + case "DHDSSWITHAES256CBCSHA256": + return DH_DSS_WITH_AES_256_CBC_SHA256; + case "DHRSAWITHAES256CBCSHA256": + return DH_RSA_WITH_AES_256_CBC_SHA256; + case "DHEDSSWITHAES256CBCSHA256": + return DHE_DSS_WITH_AES_256_CBC_SHA256; + case "DHERSAWITHAES256CBCSHA256": + return DHE_RSA_WITH_AES_256_CBC_SHA256; + case "DHANONWITHRC4128MD5": + return DH_anon_WITH_RC4_128_MD5; + case "DHANONWITH3DESEDECBCSHA": + return DH_anon_WITH_3DES_EDE_CBC_SHA; + case "DHANONWITHAES128CBCSHA": + return DH_anon_WITH_AES_128_CBC_SHA; + case "DHANONWITHAES256CBCSHA": + return DH_anon_WITH_AES_256_CBC_SHA; + case "DHANONWITHAES128CBCSHA256": + return DH_anon_WITH_AES_128_CBC_SHA256; + case "DHANONWITHAES256CBCSHA256": + return DH_anon_WITH_AES_256_CBC_SHA256; + case "ECDHECDSAWITHNULLSHA": + return ECDH_ECDSA_WITH_NULL_SHA; + case "ECDHECDSAWITHRC4128SHA": + return ECDH_ECDSA_WITH_RC4_128_SHA; + case "ECDHECDSAWITH3DESEDECBCSHA": + return ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA; + case "ECDHECDSAWITHAES128CBCSHA": + return ECDH_ECDSA_WITH_AES_128_CBC_SHA; + case "ECDHECDSAWITHAES256CBCSHA": + return ECDH_ECDSA_WITH_AES_256_CBC_SHA; + case "ECDHEECDSAWITHNULLSHA": + return ECDHE_ECDSA_WITH_NULL_SHA; + case "ECDHEECDSAWITHRC4128SHA": + return ECDHE_ECDSA_WITH_RC4_128_SHA; + case "ECDHEECDSAWITH3DESEDECBCSHA": + return ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA; + case "ECDHEECDSAWITHAES128CBCSHA": + return ECDHE_ECDSA_WITH_AES_128_CBC_SHA; + case "ECDHEECDSAWITHAES256CBCSHA": + return ECDHE_ECDSA_WITH_AES_256_CBC_SHA; + case "ECDHRSAWITHNULLSHA": + return ECDH_RSA_WITH_NULL_SHA; + case "ECDHRSAWITHRC4128SHA": + return ECDH_RSA_WITH_RC4_128_SHA; + case "ECDHRSAWITH3DESEDECBCSHA": + return ECDH_RSA_WITH_3DES_EDE_CBC_SHA; + case "ECDHRSAWITHAES128CBCSHA": + return ECDH_RSA_WITH_AES_128_CBC_SHA; + case "ECDHRSAWITHAES256CBCSHA": + return ECDH_RSA_WITH_AES_256_CBC_SHA; + case "ECDHERSAWITHNULLSHA": + return ECDHE_RSA_WITH_NULL_SHA; + case "ECDHERSAWITHRC4128SHA": + return ECDHE_RSA_WITH_RC4_128_SHA; + case "ECDHERSAWITH3DESEDECBCSHA": + return ECDHE_RSA_WITH_3DES_EDE_CBC_SHA; + case "ECDHERSAWITHAES128CBCSHA": + return ECDHE_RSA_WITH_AES_128_CBC_SHA; + case "ECDHERSAWITHAES256CBCSHA": + return ECDHE_RSA_WITH_AES_256_CBC_SHA; + case "ECDHANONWITHNULLSHA": + return ECDH_anon_WITH_NULL_SHA; + case "ECDHANONWITHRC4128SHA": + return ECDH_anon_WITH_RC4_128_SHA; + case "ECDHANONWITH3DESEDECBCSHA": + return ECDH_anon_WITH_3DES_EDE_CBC_SHA; + case "ECDHANONWITHAES128CBCSHA": + return ECDH_anon_WITH_AES_128_CBC_SHA; + case "ECDHANONWITHAES256CBCSHA": + return ECDH_anon_WITH_AES_256_CBC_SHA; + case "RSAWITHAES128GCMSHA256": + return RSA_WITH_AES_128_GCM_SHA256; + case "RSAWITHAES256GCMSHA384": + return RSA_WITH_AES_256_GCM_SHA384; + case "DHERSAWITHAES128GCMSHA256": + return DHE_RSA_WITH_AES_128_GCM_SHA256; + case "DHERSAWITHAES256GCMSHA384": + return DHE_RSA_WITH_AES_256_GCM_SHA384; + case "DHRSAWITHAES128GCMSHA256": + return DH_RSA_WITH_AES_128_GCM_SHA256; + case "DHRSAWITHAES256GCMSHA384": + return DH_RSA_WITH_AES_256_GCM_SHA384; + case "DHEDSSWITHAES128GCMSHA256": + return DHE_DSS_WITH_AES_128_GCM_SHA256; + case "DHEDSSWITHAES256GCMSHA384": + return DHE_DSS_WITH_AES_256_GCM_SHA384; + case "DHDSSWITHAES128GCMSHA256": + return DH_DSS_WITH_AES_128_GCM_SHA256; + case "DHDSSWITHAES256GCMSHA384": + return DH_DSS_WITH_AES_256_GCM_SHA384; + case "DHANONWITHAES128GCMSHA256": + return DH_anon_WITH_AES_128_GCM_SHA256; + case "DHANONWITHAES256GCMSHA384": + return DH_anon_WITH_AES_256_GCM_SHA384; + case "ECDHEECDSAWITHAES128CBCSHA256": + return ECDHE_ECDSA_WITH_AES_128_CBC_SHA256; + case "ECDHEECDSAWITHAES256CBCSHA384": + return ECDHE_ECDSA_WITH_AES_256_CBC_SHA384; + case "ECDHECDSAWITHAES128CBCSHA256": + return ECDH_ECDSA_WITH_AES_128_CBC_SHA256; + case "ECDHECDSAWITHAES256CBCSHA384": + return ECDH_ECDSA_WITH_AES_256_CBC_SHA384; + case "ECDHERSAWITHAES128CBCSHA256": + return ECDHE_RSA_WITH_AES_128_CBC_SHA256; + case "ECDHERSAWITHAES256CBCSHA384": + return ECDHE_RSA_WITH_AES_256_CBC_SHA384; + case "ECDHRSAWITHAES128CBCSHA256": + return ECDH_RSA_WITH_AES_128_CBC_SHA256; + case "ECDHRSAWITHAES256CBCSHA384": + return ECDH_RSA_WITH_AES_256_CBC_SHA384; + case "ECDHEECDSAWITHAES128GCMSHA256": + return ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; + case "ECDHEECDSAWITHAES256GCMSHA384": + return ECDHE_ECDSA_WITH_AES_256_GCM_SHA384; + case "ECDHECDSAWITHAES128GCMSHA256": + return ECDH_ECDSA_WITH_AES_128_GCM_SHA256; + case "ECDHECDSAWITHAES256GCMSHA384": + return ECDH_ECDSA_WITH_AES_256_GCM_SHA384; + case "ECDHERSAWITHAES128GCMSHA256": + return ECDHE_RSA_WITH_AES_128_GCM_SHA256; + case "ECDHERSAWITHAES256GCMSHA384": + return ECDHE_RSA_WITH_AES_256_GCM_SHA384; + case "ECDHRSAWITHAES128GCMSHA256": + return ECDH_RSA_WITH_AES_128_GCM_SHA256; + case "ECDHRSAWITHAES256GCMSHA384": + return ECDH_RSA_WITH_AES_256_GCM_SHA384; + case "ECDHERSAWITHCHACHA20POLY1305SHA256": + return ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256; + case "ECDHEECDSAWITHCHACHA20POLY1305SHA256": + return ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256; + case "DHERSAWITHCHACHA20POLY1305SHA256": + return DHE_RSA_WITH_CHACHA20_POLY1305_SHA256; + case "PSKWITHCHACHA20POLY1305SHA256": + return PSK_WITH_CHACHA20_POLY1305_SHA256; + case "ECDHEPSKWITHCHACHA20POLY1305SHA256": + return ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256; + case "DHEPSKWITHCHACHA20POLY1305SHA256": + return DHE_PSK_WITH_CHACHA20_POLY1305_SHA256; + case "RSAPSKWITHCHACHA20POLY1305SHA256": + return RSA_PSK_WITH_CHACHA20_POLY1305_SHA256; + + default: + throw new Exception(string.Format( + "Unknown cipher suite: '{0}'", s)); + } + } + /* * Get a human-readable name for a hash-and-sign algorithm. */ @@ -520,6 +762,33 @@ public sealed class SSL { } } + /* + * Parse a hash-and-sign name. + */ + public static int GetHashAndSignByName(string s) + { + string t = s.Trim().Replace(" ", "").Replace("_", "") + .Replace("-", "").Replace("/", "") + .ToUpperInvariant(); + switch (t) { + case "RSAMD5": return RSA_MD5; + case "RSASHA1": return RSA_SHA1; + case "RSASHA224": return RSA_SHA224; + case "RSASHA256": return RSA_SHA256; + case "RSASHA384": return RSA_SHA384; + case "RSASHA512": return RSA_SHA512; + case "ECDSAMD5": return ECDSA_MD5; + case "ECDSASHA1": return ECDSA_SHA1; + case "ECDSASHA224": return ECDSA_SHA224; + case "ECDSASHA256": return ECDSA_SHA256; + case "ECDSASHA384": return ECDSA_SHA384; + case "ECDSASHA512": return ECDSA_SHA512; + default: + throw new Exception(string.Format( + "Unknown hash-and-sign: '{0}'", s)); + } + } + /* * Get a human-readable name for a curve. */ @@ -535,6 +804,37 @@ public sealed class SSL { } } + /* + * Get a curve by name. + */ + public static int GetCurveByName(string s) + { + string t = s.Trim().Replace(" ", "").Replace("_", "") + .Replace("-", "").ToLowerInvariant(); + switch (t) { + case "c25519": + case "curve25519": + return Curve25519; + case "secp256r1": + case "p256": + case "nistp256": + case "prime256": + case "prime256v1": + return NIST_P256; + case "secp384r1": + case "p384": + case "nistp384": + return NIST_P384; + case "secp521r1": + case "p521": + case "nistp521": + return NIST_P521; + default: + throw new Exception(string.Format( + "Unknown curve: '{0}'", s)); + } + } + /* * Extract the public key from an encoded X.509 certificate. * This does NOT make any attempt at validating the certificate.