version.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package fp
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. // Version represents a TLS Version
  7. type Version uint16
  8. // NewVersion parses a version from a string, returning VersionEmpty if not recognized
  9. func NewVersion(s string) (Version, error) {
  10. var a Version
  11. err := a.Parse(s)
  12. return a, err
  13. }
  14. // Parse initializes a version from a string
  15. func (a *Version) Parse(s string) error {
  16. if len(s) == 0 {
  17. *a = VersionEmpty
  18. return nil
  19. }
  20. u, err := strconv.ParseUint(s, 16, 16)
  21. if err != nil {
  22. return err
  23. }
  24. switch u {
  25. case 2, 0x0200: // version 2 is 0x0002 on the wire
  26. *a = VersionSSL2
  27. case 0x0300:
  28. *a = VersionSSL3
  29. case 0x0301:
  30. *a = VersionTLS10
  31. case 0x0302:
  32. *a = VersionTLS11
  33. case 0x0303:
  34. *a = VersionTLS12
  35. case 0x0304:
  36. *a = VersionTLS13
  37. default:
  38. return fmt.Errorf("invalid tls version: %s", s)
  39. }
  40. return nil
  41. }
  42. // String returns a string representation of the version
  43. func (a Version) String() string {
  44. if a == VersionEmpty {
  45. return ""
  46. }
  47. return fmt.Sprintf("%x", uint16(a))
  48. }
  49. // Grade returns a security grade for the version
  50. func (a Version) Grade() Grade {
  51. switch a {
  52. case VersionEmpty:
  53. return GradeEmpty
  54. case VersionTLS13, VersionTLS12:
  55. return GradeA
  56. case VersionTLS11, VersionTLS10:
  57. return GradeB
  58. case VersionSSL3:
  59. return GradeC
  60. default:
  61. return GradeF
  62. }
  63. }
  64. // Source:
  65. // - SSL0.2: https://www-archive.mozilla.org/projects/security/pki/nss/ssl/draft02.html
  66. // - SSL3.0: https://tools.ietf.org/html/draft-ietf-tls-ssl-version3-00#appendix-A.1.1
  67. // - TLS1.0: https://tools.ietf.org/html/draft-ietf-tls-protocol-01#appendix-A.2
  68. // - TLS1.1: https://www.ietf.org/rfc/rfc4346.txt
  69. // - TLS1.2: https://www.ietf.org/rfc/rfc5246.txt
  70. // - TLS1.3: https://tools.ietf.org/html/draft-ietf-tls-tls13-28#section-4.2.1
  71. const (
  72. VersionEmpty Version = 0
  73. VersionSSL2 Version = 0x0200 // 0x0002 on the wire, so let's swap here
  74. VersionSSL3 Version = 0x0300
  75. VersionTLS10 Version = 0x0301
  76. VersionTLS11 Version = 0x0302
  77. VersionTLS12 Version = 0x0303
  78. VersionTLS13 Version = 0x0304
  79. )