server_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright 2023 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 ssh
  5. import (
  6. "io"
  7. "net"
  8. "sync/atomic"
  9. "testing"
  10. "time"
  11. )
  12. func TestClientAuthRestrictedPublicKeyAlgos(t *testing.T) {
  13. for _, tt := range []struct {
  14. name string
  15. key Signer
  16. wantError bool
  17. }{
  18. {"rsa", testSigners["rsa"], false},
  19. {"dsa", testSigners["dsa"], true},
  20. {"ed25519", testSigners["ed25519"], true},
  21. } {
  22. c1, c2, err := netPipe()
  23. if err != nil {
  24. t.Fatalf("netPipe: %v", err)
  25. }
  26. defer c1.Close()
  27. defer c2.Close()
  28. serverConf := &ServerConfig{
  29. PublicKeyAuthAlgorithms: []string{KeyAlgoRSASHA256, KeyAlgoRSASHA512},
  30. PublicKeyCallback: func(conn ConnMetadata, key PublicKey) (*Permissions, error) {
  31. return nil, nil
  32. },
  33. }
  34. serverConf.AddHostKey(testSigners["ecdsap256"])
  35. done := make(chan struct{})
  36. go func() {
  37. defer close(done)
  38. NewServerConn(c1, serverConf)
  39. }()
  40. clientConf := ClientConfig{
  41. User: "user",
  42. Auth: []AuthMethod{
  43. PublicKeys(tt.key),
  44. },
  45. HostKeyCallback: InsecureIgnoreHostKey(),
  46. }
  47. _, _, _, err = NewClientConn(c2, "", &clientConf)
  48. if err != nil {
  49. if !tt.wantError {
  50. t.Errorf("%s: got unexpected error %q", tt.name, err.Error())
  51. }
  52. } else if tt.wantError {
  53. t.Errorf("%s: succeeded, but want error", tt.name)
  54. }
  55. <-done
  56. }
  57. }
  58. func TestNewServerConnValidationErrors(t *testing.T) {
  59. serverConf := &ServerConfig{
  60. PublicKeyAuthAlgorithms: []string{CertAlgoRSAv01},
  61. }
  62. c := &markerConn{}
  63. _, _, _, err := NewServerConn(c, serverConf)
  64. if err == nil {
  65. t.Fatal("NewServerConn with invalid public key auth algorithms succeeded")
  66. }
  67. if !c.isClosed() {
  68. t.Fatal("NewServerConn with invalid public key auth algorithms left connection open")
  69. }
  70. if c.isUsed() {
  71. t.Fatal("NewServerConn with invalid public key auth algorithms used connection")
  72. }
  73. serverConf = &ServerConfig{
  74. Config: Config{
  75. KeyExchanges: []string{kexAlgoDHGEXSHA256},
  76. },
  77. }
  78. c = &markerConn{}
  79. _, _, _, err = NewServerConn(c, serverConf)
  80. if err == nil {
  81. t.Fatal("NewServerConn with unsupported key exchange succeeded")
  82. }
  83. if !c.isClosed() {
  84. t.Fatal("NewServerConn with unsupported key exchange left connection open")
  85. }
  86. if c.isUsed() {
  87. t.Fatal("NewServerConn with unsupported key exchange used connection")
  88. }
  89. }
  90. type markerConn struct {
  91. closed uint32
  92. used uint32
  93. }
  94. func (c *markerConn) isClosed() bool {
  95. return atomic.LoadUint32(&c.closed) != 0
  96. }
  97. func (c *markerConn) isUsed() bool {
  98. return atomic.LoadUint32(&c.used) != 0
  99. }
  100. func (c *markerConn) Close() error {
  101. atomic.StoreUint32(&c.closed, 1)
  102. return nil
  103. }
  104. func (c *markerConn) Read(b []byte) (n int, err error) {
  105. atomic.StoreUint32(&c.used, 1)
  106. if atomic.LoadUint32(&c.closed) != 0 {
  107. return 0, net.ErrClosed
  108. } else {
  109. return 0, io.EOF
  110. }
  111. }
  112. func (c *markerConn) Write(b []byte) (n int, err error) {
  113. atomic.StoreUint32(&c.used, 1)
  114. if atomic.LoadUint32(&c.closed) != 0 {
  115. return 0, net.ErrClosed
  116. } else {
  117. return 0, io.ErrClosedPipe
  118. }
  119. }
  120. func (*markerConn) LocalAddr() net.Addr { return nil }
  121. func (*markerConn) RemoteAddr() net.Addr { return nil }
  122. func (*markerConn) SetDeadline(t time.Time) error { return nil }
  123. func (*markerConn) SetReadDeadline(t time.Time) error { return nil }
  124. func (*markerConn) SetWriteDeadline(t time.Time) error { return nil }