Alternative TLS implementation in Go
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

subcerts_test.go 16 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package tls
  5. import (
  6. "crypto"
  7. "crypto/x509"
  8. "encoding/asn1"
  9. "encoding/pem"
  10. "errors"
  11. "fmt"
  12. "testing"
  13. "time"
  14. )
  15. // A PEM-encoded "delegation certificate", an X.509 certificate with the
  16. // DelegationUsage extension. The extension is defined in
  17. // specified in https://tools.ietf.org/html/draft-ietf-tls-subcerts-02.
  18. const DcCertWithDelegationUsage = `-----BEGIN CERTIFICATE-----
  19. MIIBejCCASGgAwIBAgIQXXtl0v50W2OadoW0QwLUlzAKBggqhkjOPQQDAjAUMRIw
  20. EAYDVQQKEwlBY21lIEluYy4wHhcNMTgwNzMwMjAxMTE5WhcNMTgwODA2MjAxMTE5
  21. WjAUMRIwEAYDVQQKEwlBY21lIEluYy4wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
  22. AATcQuuaUNJ3kqKGs4DBdJVd7zWzyGANT4uBNGVkZ2cgaDsdFnx99fGibfgoWer8
  23. HLt9Z+S6Hs+8bDPBHNgTR/Lfo1UwUzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAww
  24. CgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAPBgNVHREECDAGhwR/AAABMA0GCSsG
  25. AQQBgtpLLAQAMAoGCCqGSM49BAMCA0cAMEQCIEMdIkwwmzQAJ6RSDT3wcrsySx2B
  26. 5Lvx5HGzc43Fgu9eAiAi4sFXnizFBVUL43qXZBq4ARw17o0JW3/7eec1xttQhw==
  27. -----END CERTIFICATE-----
  28. `
  29. // The PEM-encoded "delegation key", the secret key associated with the
  30. // delegation certificate. This is a key for ECDSA with P256 and SHA256.
  31. const DcKeyWithDelegationUsage = `-----BEGIN EC PRIVATE KEY-----
  32. MHcCAQEEIAS/pGktmxK1hlt3gF4N2nkMrJnoZihvOO63nnNcxXQroAoGCCqGSM49
  33. AwEHoUQDQgAE3ELrmlDSd5KihrOAwXSVXe81s8hgDU+LgTRlZGdnIGg7HRZ8ffXx
  34. om34KFnq/By7fWfkuh7PvGwzwRzYE0fy3w==
  35. -----END EC PRIVATE KEY-----
  36. `
  37. // A certificate without the DelegationUsage extension.
  38. const DcCertWithoutDelegationUsage = `-----BEGIN CERTIFICATE-----
  39. MIIBajCCAQ+gAwIBAgIRAMUg/VFqJaWWJwZ9iHoMjqIwCgYIKoZIzj0EAwIwEjEQ
  40. MA4GA1UEChMHQWNtZSBDbzAeFw0xODA3MzAyMDExMTlaFw0xOTA3MzAyMDExMTla
  41. MBIxEDAOBgNVBAoTB0FjbWUgQ28wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATA
  42. n+oeWSvSNHhEskSRgkkerCQDoV/NA+r3S5AtCOFT5AYLt8xltSTWerFI/YlZLIcL
  43. xlJPT7T+XpBnfS6xaAuxo0YwRDAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYI
  44. KwYBBQUHAwEwDAYDVR0TAQH/BAIwADAPBgNVHREECDAGhwR/AAABMAoGCCqGSM49
  45. BAMCA0kAMEYCIQCFGWnoJmwH1rxNCKBJWVDBKDTSsYhySRk4h9RPyR8bUwIhAJxc
  46. KFyrowMTan791RJnyANH/4uYhmvkfhfrFGSTXUli
  47. -----END CERTIFICATE-----
  48. `
  49. // The secret key associatted with DcCertWithoutDelegationUsage.
  50. const DcKeyWithoutDelegationUsage = `-----BEGIN EC PRIVATE KEY-----
  51. MHcCAQEEIEP82pOhzx0tKkky9t0OmUo9MHgmfdAHxDN2cHmWGqOhoAoGCCqGSM49
  52. AwEHoUQDQgAEwJ/qHlkr0jR4RLJEkYJJHqwkA6FfzQPq90uQLQjhU+QGC7fMZbUk
  53. 1nqxSP2JWSyHC8ZST0+0/l6QZ30usWgLsQ==
  54. -----END EC PRIVATE KEY-----
  55. `
  56. // dcTestDC stores delegated credentials and their secret keys.
  57. type dcTestDC struct {
  58. Name string
  59. Version int
  60. Scheme int
  61. DC []byte
  62. PrivateKey []byte
  63. }
  64. // Test data used for testing the TLS handshake with the delegated credential
  65. // extension. The PEM block encodes a DER encoded slice of dcTestDCs.
  66. // Use with maxVersion == VersionTLS13Draft28.
  67. //
  68. // TODO(henrydcase): Remove this when we drop support for draft28.
  69. const DcTestDataDraft28PEM = `-----BEGIN DC TEST DATA-----
  70. MIIIQjCCAUETCXRsczEzcDI1NgICfxwCAgQDBIGwAAk6gAQDfxwAAFswWTATBgcq
  71. hkjOPQIBBggqhkjOPQMBBwNCAASfXv9/jTDWOG9nwKmIN1GrFqF0p0frgMl6rxvy
  72. fu/58dkS0ZduzOUBG7qHsu+jHE8T29jH8SCH4Otl+3abna8IBAMARjBEAiAtDM7j
  73. w0bNce3QrVupL3wh5CUhIsTAwoYuWLls+1U8mwIgb/MHyZbcA7tALI0mNIJ1WRwy
  74. V7tByFYV21ataGTa+6UEeTB3AgEBBCDXxru/xm8LfdX+VVZBhBrb4kYrtVU28SNe
  75. q4TcMhvxUKAKBggqhkjOPQMBB6FEA0IABJ9e/3+NMNY4b2fAqYg3UasWoXSnR+uA
  76. yXqvG/J+7/nx2RLRl27M5QEbuoey76McTxPb2MfxIIfg62X7dpudrwgwggHsEwl0
  77. bHMxM3A1MjECAn8cAgIGAwSB9AAJOoAGA38cAACeMIGbMBAGByqGSM49AgEGBSuB
  78. BAAjA4GGAAQBPRyZBgt3gNeSrgvhCGfzRJL7YH2nRdWZsi5ot+pDppu7GWwG2Bh7
  79. Q8kurueZfyveEwQFnKOqUnqN/lXNxQuGAdcA3wg+Apb/ZjV+wQlaZjRFqCKWsp6A
  80. gFMPvab6nykiIrDxoJMtmk1+GW/YapaCwMiyBH6VRhqxQpEhR2ZXyXkqZ6EEAwBH
  81. MEUCIQDQgYRL6lqn+M/fTlPsXilqjwxF0x8TyDRYGd1tsg4wdAIgTvXu8lpzD2t4
  82. vEqSKLRPA75HAU+ui1q4V8Hpudp7DkUEgd8wgdwCAQEEQgF3/A259KQTc+cw4ClJ
  83. pCnTXC9G2Fh5VULrAn3tFIpnzJ4VQun3UgkoPpeUSBdny9Kbd2DbfuFVd5YvNG2i
  84. HPxVBKAHBgUrgQQAI6GBiQOBhgAEAT0cmQYLd4DXkq4L4Qhn80SS+2B9p0XVmbIu
  85. aLfqQ6abuxlsBtgYe0PJLq7nmX8r3hMEBZyjqlJ6jf5VzcULhgHXAN8IPgKW/2Y1
  86. fsEJWmY0RagilrKegIBTD72m+p8pIiKw8aCTLZpNfhlv2GqWgsDIsgR+lUYasUKR
  87. IUdmV8l5KmehMIIBQRMHYmFkdmVycwIDAP8AAgIEAwSBsQAJOoAEA/8AAABbMFkw
  88. EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESs4ZQnHHAPPHaA3uxyMAw91T4ajlJvL2
  89. BAtP6XYpo9j+QWBtsFpwNRY85acAQJ9+7y1nbCHjn0UwB8Hi8P9pdQQDAEcwRQIg
  90. YJUpZPXZFbxyXDj/QYqvGlu4veHQJOaT0PL1rx6R/2gCIQC1qAAkNe5lz8W1M97t
  91. QXwxYRWgt8GLdBqp72EduVHtMgR5MHcCAQEEINU81qgDRzEPrx2YxJNBt7quCeA8
  92. VZV9efsB7R7sxkwXoAoGCCqGSM49AwEHoUQDQgAESs4ZQnHHAPPHaA3uxyMAw91T
  93. 4ajlJvL2BAtP6XYpo9j+QWBtsFpwNRY85acAQJ9+7y1nbCHjn0UwB8Hi8P9pdTCC
  94. AT8TBmJhZGtleQICfxwCAgQDBIGxAAk6gAQDfxwAAFswWTATBgcqhkjOPQIBBggq
  95. hkjOPQMBBwNCAAQnV8i/4ZrWoZG0nGDy6xsYzCV10FwaCbrvejTxcltSoCJ8HfPT
  96. u9FhOlHllmVyp/qCdB0ILsSlYDEFG9yzV/kGBAMARzBFAiBw3YabIamIHJAKmUcE
  97. +AZNsvBPuuYeKGCQ9N5n4/1hpwIhAJ07IU/p4+Nl24u4IneM9Fq5lL4YugiSAtDy
  98. /pWeCL0XBHkwdwIBAQQgOR6w5qkUyavY92PuOBXslfxJgfS8RUaAImqAlWhniKug
  99. CgYIKoZIzj0DAQehRANCAARH0kbf92XgJ5Mop4Spbpp3bjwzQw7Pg6T9vQH0q8Hy
  100. CTG65vcmu2whOu+0nR3eJg7rt9BhcHredcOoUhGbgqbRMIIBPhMGYmFkc2lnAgJ/
  101. HAICBAMEgbAACTqABAN/HAAAWzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBlb
  102. oANTnMd8jcnuzyCv+I+l51tqVog0wagYMo6L7A2RlTqgTYaz0p7mH3wsHfsv/Py8
  103. Scv5o7vp/MIQjEbeg8wEAwBGMEQCIDozxK17n3gytnV9h6X9BKz5GsxBgr9+Ympe
  104. 9XXppP57AiAPks17U0EhoIhSk6dhmVpgjkoHt9jxn1xYIwJxceGWywR5MHcCAQEE
  105. IH7GjuBRPz5WvrYrmD6dlCHX5Fda2C7faa+f0mmjkOfvoAoGCCqGSM49AwEHoUQD
  106. QgAEGVugA1Ocx3yNye7PIK/4j6XnW2pWiDTBqBgyjovsDZGVOqBNhrPSnuYffCwd
  107. +y/8/LxJy/mju+n8whCMRt6DzDCCAT8TBXRsczEyAgIDAwICBAMEgbIACTqABAMD
  108. AwAAWzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFbRSfoqtGJdMb7NP3hENn6A
  109. b8tzLgr8Cj77JSoSVloy/+XOa+wz1OhEzA2b54WkEhVQor+RAT688z7UwEXFwWsE
  110. AwBIMEYCIQCdahwKMP01K5rvn3IU7JQElg1TjnGw1vZk7zsjg1B0gQIhAMLlhfUA
  111. Zd/eyMHutw9HfBOWX7rlcKN12RwtGuNXvZ1BBHkwdwIBAQQgSSNaIBwdPWauUSKg
  112. LN73E41eUQrWung1lwgTQWV1AhqgCgYIKoZIzj0DAQehRANCAARW0Un6KrRiXTG+
  113. zT94RDZ+gG/Lcy4K/Ao++yUqElZaMv/lzmvsM9ToRMwNm+eFpBIVUKK/kQE+vPM+
  114. 1MBFxcFr
  115. -----END DC TEST DATA-----
  116. `
  117. // Use with maxVersion == VersionTLS13.
  118. const DcTestDataTLS13PEM = `-----BEGIN DC TEST DATA-----
  119. MIIIQzCCAUMTCXRsczEzcDI1NgICAwQCAgQDBIGyAAk6gAQDAwQAAFswWTATBgcq
  120. hkjOPQIBBggqhkjOPQMBBwNCAAQpQtUm8AWOzCN+aGUVsoKH9lZWNqkQCBGhpVtT
  121. u3ye6ACcwgNf81AYQ1ROb3EbWrnbvq9ap4a5QJ8AcrhZ9u0dBAMASDBGAiEA7LHb
  122. Fh+RDi9RTRjlP0+b2eP+4CDtuK0qKSjf4kFbJ9ICIQDB/XIXkLV6qLW70MhFWCUi
  123. 2eqyhwtvTuMyATEJnyHKvwR5MHcCAQEEILHC94EWZnuVJqrbq3U+BnEU8BQPGfk6
  124. pkB7mD8wqhl/oAoGCCqGSM49AwEHoUQDQgAEKULVJvAFjswjfmhlFbKCh/ZWVjap
  125. EAgRoaVbU7t8nugAnMIDX/NQGENUTm9xG1q5276vWqeGuUCfAHK4WfbtHTCCAesT
  126. CXRsczEzcDUyMQICAwQCAgYDBIHzAAk6gAYDAwQAAJ4wgZswEAYHKoZIzj0CAQYF
  127. K4EEACMDgYYABAHgWg5NSn/t/BBxU9uWVBwIz3NWfq2xo1eQMsJY1ui9ILtmFsLn
  128. QF1jbGrjlBZoh2sbHPFPl7yMOSYyVBFryhTaiQG7x11/Xs9fNC6AUm/6wROLMHTr
  129. qCkiqCjIKVtBaM8FCAfPLoJHzPUu/h79Q0IdBlVhl4nEa4cWVW34cECfT+YdjgQD
  130. AEYwRAIge+tF+cai/jfZtzUaVTcVuZfdIcGpRy4CfI2tKLipDCQCIAVigOh2jOFh
  131. QWbX4h4Vz3ULoIuM+3wsFad0S0oH1v9HBIHfMIHcAgEBBEIAzNpPpiTsrv+0a3oA
  132. CaGGr83/2Z632tygYjEOs919YrLR1Xe83hf5AvJLUz6u3RRlQdqwyPGQ1wm8baQ6
  133. E0Pf6j+gBwYFK4EEACOhgYkDgYYABAHgWg5NSn/t/BBxU9uWVBwIz3NWfq2xo1eQ
  134. MsJY1ui9ILtmFsLnQF1jbGrjlBZoh2sbHPFPl7yMOSYyVBFryhTaiQG7x11/Xs9f
  135. NC6AUm/6wROLMHTrqCkiqCjIKVtBaM8FCAfPLoJHzPUu/h79Q0IdBlVhl4nEa4cW
  136. VW34cECfT+YdjjCCAUITB2JhZHZlcnMCAwD/AAICBAMEgbIACTqABAP/AAAAWzBZ
  137. MBMGByqGSM49AgEGCCqGSM49AwEHA0IABCPo5FSmarRgC/15bymE+3s4TXyQH9Oh
  138. nlcKbAR70jqWLr9jbyjT7dy09sr5B6cVlw8AU2TeojdRUNG7y4nKnLsEAwBIMEYC
  139. IQDZiMm7SoNMMvvrlxOF0OMSt1/hMOras702RDI2wvT92gIhAKgCmYucgBUIqMJd
  140. d6g2FcY9UZnPzvnSuX9uBm38RMLMBHkwdwIBAQQgnx2Os1Z5kbZo61ItkpwJ0khL
  141. 7zgzLcc1X4unR3R56q+gCgYIKoZIzj0DAQehRANCAAQj6ORUpmq0YAv9eW8phPt7
  142. OE18kB/ToZ5XCmwEe9I6li6/Y28o0+3ctPbK+QenFZcPAFNk3qI3UVDRu8uJypy7
  143. MIIBPxMGYmFka2V5AgIDBAICBAMEgbEACTqABAMDBAAAWzBZMBMGByqGSM49AgEG
  144. CCqGSM49AwEHA0IABGGXD4Td3D7im9y0S1wGoFgL4afAiklkSlQcNus2XfGUJS4c
  145. io+gm4NBMcXby6LpN4lg5/0+K0i448WrIdd2eBYEAwBHMEUCIBMirxmjL9Yeigpl
  146. aeqHncrT4V2u+sYBqa+dUUCXDTaqAiEAuR2geInXmNRtGWVltZh1pnohvwloPVvu
  147. XK5qUb9g6/gEeTB3AgEBBCDk7f6Fto9m6vEDYiZapi2Hm8ranfS0AOgfnDfsRQa5
  148. PKAKBggqhkjOPQMBB6FEA0IABFmA7YsXewnCF0R5eHLBwn4RsF1F5IwB8ZLpL2v4
  149. GBD6YHmZDPBZ2/SZ3LxLGgT5yiO1/5y2ujDXsQ9X78ucHn8wggE+EwZiYWRzaWcC
  150. AgMEAgIEAwSBsAAJOoAEAwMEAABbMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
  151. W2eqjqibupKlU/BwVWwfNE1qUdxqhF3cen0aKl8in24PcEi3AH1Y/zubsjoKah/q
  152. YUfcmgAvhvsSFqohWzMa5gQDAEYwRAIgT4Tm7648J1OuTrn+HAJXVfzoXbcL/QUx
  153. YxVDcpxytkoCIDulABj6w3EoQLoq8b1V781oPHKkUR7+L/SUPj/DxKQ2BHkwdwIB
  154. AQQgIAwscB81XCsAujU+tr75y7yMFfSLtFkPAzn3/GiXpoWgCgYIKoZIzj0DAQeh
  155. RANCAARbZ6qOqJu6kqVT8HBVbB80TWpR3GqEXdx6fRoqXyKfbg9wSLcAfVj/O5uy
  156. OgpqH+phR9yaAC+G+xIWqiFbMxrmMIIBPhMFdGxzMTICAgMDAgIEAwSBsQAJOoAE
  157. AwMDAABbMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnsChIIFXdvdOTFnf3cyv
  158. MsHKpSy68X+SbepvhPg+MBrn+ly9mb+hWPp2j0UJKiXwQmMf4vicNOYyjreml8Hf
  159. VQQDAEcwRQIhANfDJ57MDLZqtye+uolguWx39vhfkvB9svEjYZwWTcoKAiALBgkH
  160. OoRxcalH9qbE2p6LHLszqYyYW312aTHHYF0/6QR5MHcCAQEEILFX1gHwKwJwAQI+
  161. GNisTdlwN0clslAccLogW0ON0gAZoAoGCCqGSM49AwEHoUQDQgAEnsChIIFXdvdO
  162. TFnf3cyvMsHKpSy68X+SbepvhPg+MBrn+ly9mb+hWPp2j0UJKiXwQmMf4vicNOYy
  163. jreml8HfVQ==
  164. -----END DC TEST DATA-----`
  165. // Parses the input PEM block containing the test DCs.
  166. func dcLoadTestData(in []byte, out *[]dcTestDC) error {
  167. block, _ := pem.Decode(in)
  168. if block == nil {
  169. return errors.New("failed to decode DC tests PEM block")
  170. }
  171. // Parse the DER-encoded test DCs.
  172. _, err := asn1.Unmarshal(block.Bytes, out)
  173. if err != nil {
  174. return errors.New("failed to unmarshal DC test ASN.1 data")
  175. }
  176. // Check that the test data is for the right version. This should be
  177. // maxVersion, defined in common.go.
  178. for _, test := range *out {
  179. dc, err := unmarshalDelegatedCredential(test.DC)
  180. if err != nil {
  181. return err
  182. }
  183. // Sanity check that test version matches the version encoded by the DC.
  184. testVersion := uint16(test.Version)
  185. if dc.cred.expectedVersion != testVersion {
  186. return fmt.Errorf(
  187. "test version doesn't match credential version: got: 0x0%04x; want: 0x%04x",
  188. testVersion, dc.cred.expectedVersion)
  189. }
  190. // With the exception of "badvers" and "tsl12", all test DCs should have
  191. // the expected verison.
  192. if test.Name != "badvers" && test.Name != "tls12" && testVersion != maxVersion {
  193. return fmt.Errorf(
  194. "encountered test with wrong version: got: 0x0%04x; want: 0x%04x",
  195. test.Version, maxVersion)
  196. }
  197. }
  198. return nil
  199. }
  200. var dcTestDCs []dcTestDC
  201. var dcTestConfig *Config
  202. var dcTestDelegationCert Certificate
  203. var dcTestCert Certificate
  204. var dcTestNow time.Time
  205. func init() {
  206. // Load the DC test data.
  207. var testData []byte
  208. switch maxVersion {
  209. case VersionTLS13Draft28:
  210. testData = []byte(DcTestDataDraft28PEM)
  211. case 0x0304: // TODO(henrydcase): Fix once the final version is implemented
  212. testData = []byte(DcTestDataTLS13PEM)
  213. default:
  214. panic(fmt.Errorf("no test data for version %04x", maxVersion))
  215. }
  216. err := dcLoadTestData(testData, &dcTestDCs)
  217. if err != nil {
  218. panic(err)
  219. }
  220. // The base configuration for the client and server.
  221. dcTestConfig = &Config{
  222. Time: func() time.Time {
  223. return dcTestNow
  224. },
  225. Rand: zeroSource{},
  226. Certificates: nil,
  227. MinVersion: VersionTLS10,
  228. MaxVersion: VersionTLS13,
  229. CipherSuites: allCipherSuites(),
  230. }
  231. // The delegation certificate.
  232. dcTestDelegationCert, err = X509KeyPair([]byte(DcCertWithDelegationUsage), []byte(DcKeyWithDelegationUsage))
  233. if err != nil {
  234. panic(err)
  235. }
  236. dcTestDelegationCert.Leaf, err = x509.ParseCertificate(dcTestDelegationCert.Certificate[0])
  237. if err != nil {
  238. panic(err)
  239. }
  240. // A certificate without the the DelegationUsage extension for X.509.
  241. dcTestCert, err = X509KeyPair([]byte(DcCertWithoutDelegationUsage), []byte(DcKeyWithoutDelegationUsage))
  242. if err != nil {
  243. panic(err)
  244. }
  245. dcTestCert.Leaf, err = x509.ParseCertificate(dcTestCert.Certificate[0])
  246. if err != nil {
  247. panic(err)
  248. }
  249. // For testing purposes, use the point at which the test DCs were generated
  250. // as the current time. This is the same as the time at which the
  251. // delegation certificate was generated.
  252. dcTestNow = dcTestDelegationCert.Leaf.NotBefore
  253. // Make these roots of these certificates the client's trusted CAs.
  254. dcTestConfig.RootCAs = x509.NewCertPool()
  255. raw := dcTestDelegationCert.Certificate[len(dcTestDelegationCert.Certificate)-1]
  256. root, err := x509.ParseCertificate(raw)
  257. if err != nil {
  258. panic(err)
  259. }
  260. dcTestConfig.RootCAs.AddCert(root)
  261. raw = dcTestCert.Certificate[len(dcTestCert.Certificate)-1]
  262. root, err = x509.ParseCertificate(raw)
  263. if err != nil {
  264. panic(err)
  265. }
  266. dcTestConfig.RootCAs.AddCert(root)
  267. }
  268. // Executes the handshake with the given configuration and returns true if the
  269. // delegated credential extension was successfully negotiated.
  270. func testConnWithDC(t *testing.T, clientConfig, serverConfig *Config) (bool, error) {
  271. ln := newLocalListener(t)
  272. defer ln.Close()
  273. // Listen for and serve a single client connection.
  274. srvCh := make(chan *Conn, 1)
  275. var serr error
  276. go func() {
  277. sconn, err := ln.Accept()
  278. if err != nil {
  279. serr = err
  280. srvCh <- nil
  281. return
  282. }
  283. srv := Server(sconn, serverConfig)
  284. if err := srv.Handshake(); err != nil {
  285. serr = fmt.Errorf("handshake: %v", err)
  286. srvCh <- nil
  287. return
  288. }
  289. srvCh <- srv
  290. }()
  291. // Dial the server.
  292. cli, err := Dial("tcp", ln.Addr().String(), clientConfig)
  293. if err != nil {
  294. return false, err
  295. }
  296. defer cli.Close()
  297. srv := <-srvCh
  298. if srv == nil {
  299. return false, serr
  300. }
  301. // Return true if the client's conn.dc structure was instantiated.
  302. st := cli.ConnectionState()
  303. return (st.DelegatedCredential != nil), nil
  304. }
  305. // Checks that the client suppports a version >= 1.2 and accepts delegated
  306. // credentials. If so, it returns the delegation certificate; otherwise it
  307. // returns a plain certificate.
  308. func testServerGetCertificate(ch *ClientHelloInfo) (*Certificate, error) {
  309. versOk := false
  310. for _, vers := range ch.SupportedVersions {
  311. versOk = versOk || (vers >= uint16(VersionTLS12))
  312. }
  313. if versOk && ch.AcceptsDelegatedCredential {
  314. return &dcTestDelegationCert, nil
  315. }
  316. return &dcTestCert, nil
  317. }
  318. // Various test cases for handshakes involving DCs.
  319. var dcTesters = []struct {
  320. clientDC bool
  321. serverDC bool
  322. clientSkipVerify bool
  323. clientMaxVers uint16
  324. serverMaxVers uint16
  325. nowOffset time.Duration
  326. dcTestName string
  327. expectSuccess bool
  328. expectDC bool
  329. name string
  330. }{
  331. {true, true, false, VersionTLS13, VersionTLS13, 0, "tls13p256", true, true, "tls13"},
  332. {true, true, false, VersionTLS13, VersionTLS13, 0, "tls13p521", true, true, "tls13"},
  333. {true, false, false, VersionTLS13, VersionTLS13, 0, "tls13p256", true, false, "server no dc"},
  334. {true, true, false, VersionTLS12, VersionTLS13, 0, "tls13p256", true, false, "client old"},
  335. {true, true, false, VersionTLS13, VersionTLS12, 0, "tls13p256", true, false, "server old"},
  336. {true, true, false, VersionTLS13, VersionTLS13, 0, "badkey", false, false, "bad key"},
  337. {true, true, true, VersionTLS13, VersionTLS13, 0, "badsig", true, true, "bad key, skip verify"},
  338. {true, true, false, VersionTLS13, VersionTLS13, dcMaxTTL, "tls13", false, false, "expired dc"},
  339. {true, true, false, VersionTLS13, VersionTLS13, 0, "badvers", false, false, "dc wrong version"},
  340. {true, true, false, VersionTLS12, VersionTLS12, 0, "tls12", true, false, "tls12"},
  341. }
  342. // Tests the handshake with the delegated credential extension for each test
  343. // case in dcTests.
  344. func TestDCHandshake(t *testing.T) {
  345. clientConfig := dcTestConfig.Clone()
  346. serverConfig := dcTestConfig.Clone()
  347. serverConfig.GetCertificate = testServerGetCertificate
  348. for i, tester := range dcTesters {
  349. clientConfig.MaxVersion = tester.clientMaxVers
  350. serverConfig.MaxVersion = tester.serverMaxVers
  351. clientConfig.InsecureSkipVerify = tester.clientSkipVerify
  352. clientConfig.AcceptDelegatedCredential = tester.clientDC
  353. clientConfig.Time = func() time.Time {
  354. return dcTestNow.Add(time.Duration(tester.nowOffset))
  355. }
  356. if tester.serverDC {
  357. serverConfig.GetDelegatedCredential = func(
  358. ch *ClientHelloInfo, vers uint16) ([]byte, crypto.PrivateKey, error) {
  359. if vers < VersionTLS13 {
  360. return nil, nil, nil
  361. }
  362. for _, test := range dcTestDCs {
  363. if test.Name == tester.dcTestName {
  364. sk, err := x509.ParseECPrivateKey(test.PrivateKey)
  365. if err != nil {
  366. return nil, nil, err
  367. }
  368. return test.DC, sk, nil
  369. }
  370. }
  371. return nil, nil, fmt.Errorf("Test DC with name '%s' not found", tester.dcTestName)
  372. }
  373. } else {
  374. serverConfig.GetDelegatedCredential = nil
  375. }
  376. usedDC, err := testConnWithDC(t, clientConfig, serverConfig)
  377. if err != nil && tester.expectSuccess {
  378. t.Errorf("test #%d (%s) fails: %s", i+1, tester.name, err)
  379. } else if err == nil && !tester.expectSuccess {
  380. t.Errorf("test #%d (%s) succeeds; expected failure", i+1, tester.name)
  381. }
  382. if usedDC != tester.expectDC {
  383. t.Errorf("test #%d (%s) usedDC = %v; expected %v", i+1, tester.name, usedDC, tester.expectDC)
  384. }
  385. }
  386. }