Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
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.
83 lines
1.3 KiB
83 lines
1.3 KiB
package ssh |
|
|
|
import ( |
|
"crypto/rand" |
|
"crypto/rsa" |
|
"encoding/binary" |
|
|
|
"golang.org/x/crypto/ssh" |
|
) |
|
|
|
func generateSigner() (ssh.Signer, error) { |
|
key, err := rsa.GenerateKey(rand.Reader, 2048) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return ssh.NewSignerFromKey(key) |
|
} |
|
|
|
func parsePtyRequest(s []byte) (pty Pty, ok bool) { |
|
term, s, ok := parseString(s) |
|
if !ok { |
|
return |
|
} |
|
width32, s, ok := parseUint32(s) |
|
if !ok { |
|
return |
|
} |
|
height32, _, ok := parseUint32(s) |
|
if !ok { |
|
return |
|
} |
|
pty = Pty{ |
|
Term: term, |
|
Window: Window{ |
|
Width: int(width32), |
|
Height: int(height32), |
|
}, |
|
} |
|
return |
|
} |
|
|
|
func parseWinchRequest(s []byte) (win Window, ok bool) { |
|
width32, s, ok := parseUint32(s) |
|
if width32 < 1 { |
|
ok = false |
|
} |
|
if !ok { |
|
return |
|
} |
|
height32, _, ok := parseUint32(s) |
|
if height32 < 1 { |
|
ok = false |
|
} |
|
if !ok { |
|
return |
|
} |
|
win = Window{ |
|
Width: int(width32), |
|
Height: int(height32), |
|
} |
|
return |
|
} |
|
|
|
func parseString(in []byte) (out string, rest []byte, ok bool) { |
|
if len(in) < 4 { |
|
return |
|
} |
|
length := binary.BigEndian.Uint32(in) |
|
if uint32(len(in)) < 4+length { |
|
return |
|
} |
|
out = string(in[4 : 4+length]) |
|
rest = in[4+length:] |
|
ok = true |
|
return |
|
} |
|
|
|
func parseUint32(in []byte) (uint32, []byte, bool) { |
|
if len(in) < 4 { |
|
return 0, nil, false |
|
} |
|
return binary.BigEndian.Uint32(in), in[4:], true |
|
}
|
|
|