You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TlsTest.kt 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package com.dmdirc.ktirc.io
  2. import io.mockk.every
  3. import io.mockk.mockk
  4. import org.junit.jupiter.api.Assertions.assertFalse
  5. import org.junit.jupiter.api.Assertions.assertTrue
  6. import org.junit.jupiter.api.Test
  7. import java.security.cert.CertificateException
  8. import java.security.cert.X509Certificate
  9. internal class CertificateValidationTest {
  10. private val cert = mockk<X509Certificate>()
  11. @Test
  12. fun `checks common name`() {
  13. every { cert.subjectX500Principal } returns mockk {
  14. every { name } returns "CN=subdomain.test.ktirc,O=testing,L=London,C=GB"
  15. }
  16. assertTrue(cert.validFor("subdomain.test.ktirc"))
  17. assertFalse(cert.validFor("subdomain2.test.ktirc"))
  18. assertFalse(cert.validFor("testing"))
  19. }
  20. @Test
  21. fun `checks common name with suffixed wildcard`() {
  22. every { cert.subjectX500Principal } returns mockk {
  23. every { name } returns "CN=subdomain*.test.ktirc,O=testing,L=London,C=GB"
  24. }
  25. assertTrue(cert.validFor("subdomain.test.ktirc"))
  26. assertTrue(cert.validFor("subdomain2.test.ktirc"))
  27. assertFalse(cert.validFor("foo.subdomain.test.ktirc"))
  28. assertFalse(cert.validFor("1subdomain.test.ktirc"))
  29. }
  30. @Test
  31. fun `checks common name with preixed wildcard`() {
  32. every { cert.subjectX500Principal } returns mockk {
  33. every { name } returns "CN=*subdomain.test.ktirc,O=testing,L=London,C=GB"
  34. }
  35. assertTrue(cert.validFor("subdomain.test.ktirc"))
  36. assertTrue(cert.validFor("1subdomain.test.ktirc"))
  37. assertFalse(cert.validFor("foo.subdomain.test.ktirc"))
  38. assertFalse(cert.validFor("subdomain1.test.ktirc"))
  39. }
  40. @Test
  41. fun `checks common name with infixed wildcard`() {
  42. every { cert.subjectX500Principal } returns mockk {
  43. every { name } returns "CN=sub*domain.test.ktirc,O=testing,L=London,C=GB"
  44. }
  45. assertTrue(cert.validFor("subdomain.test.ktirc"))
  46. assertTrue(cert.validFor("SUB-domain.test.ktirc"))
  47. assertFalse(cert.validFor("foo.subdomain.test.ktirc"))
  48. assertFalse(cert.validFor("subdomain1.test.ktirc"))
  49. }
  50. @Test
  51. fun `ignores wildcards in CN if they're not left-most`() {
  52. every { cert.subjectX500Principal } returns mockk {
  53. every { name } returns "CN=foo.*domain.test.ktirc,O=testing,L=London,C=GB"
  54. }
  55. assertFalse(cert.validFor("foo.domain.test.ktirc"))
  56. assertFalse(cert.validFor("foo-test.domain.test.ktirc"))
  57. assertFalse(cert.validFor("foo.test-domain.test.ktirc"))
  58. }
  59. @Test
  60. fun `ignores wildcards in CN if there are too many`() {
  61. every { cert.subjectX500Principal } returns mockk {
  62. every { name } returns "CN=*domain*.test.ktirc,O=testing,L=London,C=GB"
  63. }
  64. assertFalse(cert.validFor("domain.test.ktirc"))
  65. assertFalse(cert.validFor("subdomain.test.ktirc"))
  66. assertFalse(cert.validFor("domain1.test.ktirc"))
  67. }
  68. @Test
  69. fun `checks all sans`() {
  70. every { cert.subjectAlternativeNames } returns listOf(
  71. listOf(4, "directory.test.ktirc"),
  72. listOf(2, "subdomain1.test.ktirc"),
  73. listOf(2, "subdomain2.test.ktirc"),
  74. listOf(2, "subdomain3.test.ktirc")
  75. )
  76. assertTrue(cert.validFor("subdomain1.test.ktirc"))
  77. assertTrue(cert.validFor("subdomain2.test.KTIRC"))
  78. assertTrue(cert.validFor("subdomain3.test.ktirc"))
  79. assertFalse(cert.validFor("directory.test.ktirc"))
  80. }
  81. @Test
  82. fun `checks wildcard sans`() {
  83. every { cert.subjectAlternativeNames } returns listOf(
  84. listOf(4, "directory.test.ktirc"),
  85. listOf(2, "*domain1.test.ktirc"),
  86. listOf(2, "subdomain*.test.ktirc"),
  87. listOf(2, "*foo*.test.ktirc"),
  88. listOf(2, "foo.*.ktirc")
  89. )
  90. assertTrue(cert.validFor("subdomain1.test.ktirc"))
  91. assertTrue(cert.validFor("subdomain2.test.ktirc"))
  92. assertTrue(cert.validFor("gooddomain1.TEST.ktirc"))
  93. assertFalse(cert.validFor("foo.test.ktirc"))
  94. }
  95. @Test
  96. fun `still uses CN if sans throws`() {
  97. every { cert.subjectX500Principal } returns mockk {
  98. every { name } returns "CN=subdomain.test.ktirc,O=testing,L=London,C=GB"
  99. }
  100. every { cert.subjectAlternativeNames } throws CertificateException("Oops")
  101. assertTrue(cert.validFor("subdomain.test.ktirc"))
  102. assertFalse(cert.validFor("subdomain2.test.ktirc"))
  103. assertFalse(cert.validFor("testing"))
  104. }
  105. @Test
  106. fun `still uses sans if CN throws`() {
  107. every { cert.subjectX500Principal } throws CertificateException("Oops")
  108. every { cert.subjectAlternativeNames } returns listOf(
  109. listOf(4, "directory.test.ktirc"),
  110. listOf(2, "subdomain1.test.ktirc"),
  111. listOf(2, "subdomain2.test.ktirc"),
  112. listOf(2, "subdomain3.test.ktirc")
  113. )
  114. assertTrue(cert.validFor("subdomain1.test.ktirc"))
  115. assertTrue(cert.validFor("subdomain2.test.KTIRC"))
  116. assertTrue(cert.validFor("subdomain3.test.ktirc"))
  117. assertFalse(cert.validFor("directory.test.ktirc"))
  118. }
  119. @Test
  120. fun `fails if CN and sans missing`() {
  121. assertFalse(cert.validFor("subdomain1.test.ktirc"))
  122. assertFalse(cert.validFor("subdomain2.test.KTIRC"))
  123. assertFalse(cert.validFor("subdomain3.test.ktirc"))
  124. assertFalse(cert.validFor("directory.test.ktirc"))
  125. }
  126. }