config_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package dtls
  2. import (
  3. "crypto/dsa" //nolint
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "crypto/tls"
  7. "errors"
  8. "testing"
  9. "github.com/pion/dtls/v2/pkg/crypto/selfsign"
  10. )
  11. func TestValidateConfig(t *testing.T) {
  12. // Empty config
  13. if err := validateConfig(nil); !errors.Is(err, errNoConfigProvided) {
  14. t.Fatalf("TestValidateConfig: Config validation error exp(%v) failed(%v)", errNoConfigProvided, err)
  15. }
  16. // PSK and Certificate, valid cipher suites
  17. cert, err := selfsign.GenerateSelfSigned()
  18. if err != nil {
  19. t.Fatalf("TestValidateConfig: Config validation error(%v), self signed certificate not generated", err)
  20. return
  21. }
  22. config := &Config{
  23. CipherSuites: []CipherSuiteID{TLS_PSK_WITH_AES_128_CCM_8, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  24. PSK: func(hint []byte) ([]byte, error) {
  25. return nil, nil
  26. },
  27. Certificates: []tls.Certificate{cert},
  28. }
  29. if err = validateConfig(config); err != nil {
  30. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", nil, err)
  31. }
  32. // PSK and Certificate, no PSK cipher suite
  33. config = &Config{
  34. CipherSuites: []CipherSuiteID{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  35. PSK: func(hint []byte) ([]byte, error) {
  36. return nil, nil
  37. },
  38. Certificates: []tls.Certificate{cert},
  39. }
  40. if err = validateConfig(config); !errors.Is(errNoAvailablePSKCipherSuite, err) {
  41. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", errNoAvailablePSKCipherSuite, err)
  42. }
  43. // PSK and Certificate, no non-PSK cipher suite
  44. config = &Config{
  45. CipherSuites: []CipherSuiteID{TLS_PSK_WITH_AES_128_CCM_8},
  46. PSK: func(hint []byte) ([]byte, error) {
  47. return nil, nil
  48. },
  49. Certificates: []tls.Certificate{cert},
  50. }
  51. if err = validateConfig(config); !errors.Is(errNoAvailableCertificateCipherSuite, err) {
  52. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", errNoAvailableCertificateCipherSuite, err)
  53. }
  54. // PSK identity hint with not PSK
  55. config = &Config{
  56. CipherSuites: []CipherSuiteID{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  57. PSK: nil,
  58. PSKIdentityHint: []byte{},
  59. }
  60. if err = validateConfig(config); !errors.Is(err, errIdentityNoPSK) {
  61. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", errIdentityNoPSK, err)
  62. }
  63. // Invalid private key
  64. dsaPrivateKey := &dsa.PrivateKey{}
  65. err = dsa.GenerateParameters(&dsaPrivateKey.Parameters, rand.Reader, dsa.L1024N160)
  66. if err != nil {
  67. t.Fatalf("TestValidateConfig: Config validation error(%v), DSA parameters not generated", err)
  68. return
  69. }
  70. err = dsa.GenerateKey(dsaPrivateKey, rand.Reader)
  71. if err != nil {
  72. t.Fatalf("TestValidateConfig: Config validation error(%v), DSA private key not generated", err)
  73. return
  74. }
  75. config = &Config{
  76. CipherSuites: []CipherSuiteID{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  77. Certificates: []tls.Certificate{{Certificate: cert.Certificate, PrivateKey: dsaPrivateKey}},
  78. }
  79. if err = validateConfig(config); !errors.Is(err, errInvalidPrivateKey) {
  80. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", errInvalidPrivateKey, err)
  81. }
  82. // PrivateKey without Certificate
  83. config = &Config{
  84. CipherSuites: []CipherSuiteID{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  85. Certificates: []tls.Certificate{{PrivateKey: cert.PrivateKey}},
  86. }
  87. if err = validateConfig(config); !errors.Is(err, errInvalidCertificate) {
  88. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", errInvalidCertificate, err)
  89. }
  90. // Invalid cipher suites
  91. config = &Config{CipherSuites: []CipherSuiteID{0x0000}}
  92. if err = validateConfig(config); err == nil {
  93. t.Fatal("TestValidateConfig: Client error expected with invalid CipherSuiteID")
  94. }
  95. // Valid config
  96. rsaPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  97. if err != nil {
  98. t.Fatalf("TestValidateConfig: Config validation error(%v), RSA private key not generated", err)
  99. return
  100. }
  101. config = &Config{
  102. CipherSuites: []CipherSuiteID{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  103. Certificates: []tls.Certificate{cert, {Certificate: cert.Certificate, PrivateKey: rsaPrivateKey}},
  104. }
  105. if err = validateConfig(config); err != nil {
  106. t.Fatalf("TestValidateConfig: Client error exp(%v) failed(%v)", nil, err)
  107. }
  108. }