84 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| 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
 | |
| }
 |