mirror of
https://github.com/tale/headplane.git
synced 2026-07-27 08:08:56 +00:00
42 lines
1.0 KiB
Go
42 lines
1.0 KiB
Go
package sshutil
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
func encodeFrame(id string, data []byte) ([]byte, error) {
|
|
sid := []byte(id)
|
|
if len(sid) > 255 {
|
|
return nil, fmt.Errorf("session ID too long")
|
|
}
|
|
|
|
payloadLen := len(data)
|
|
buf := make([]byte, 1+len(sid)+4+payloadLen)
|
|
|
|
buf[0] = byte(len(sid)) // SID length
|
|
copy(buf[1:], sid) // SID
|
|
binary.BigEndian.PutUint32(buf[1+len(sid):], uint32(payloadLen)) // Payload length
|
|
copy(buf[1+len(sid)+4:], data) // Payload
|
|
|
|
return buf, nil
|
|
}
|
|
|
|
func decodeFrame(buf []byte) (id string, payload []byte, ok bool) {
|
|
if len(buf) < 5 {
|
|
return "", nil, false
|
|
}
|
|
sidLen := int(buf[0])
|
|
if len(buf) < 1+sidLen+4 {
|
|
return "", nil, false
|
|
}
|
|
id = string(buf[1 : 1+sidLen])
|
|
payloadLen := int(binary.BigEndian.Uint32(buf[1+sidLen:]))
|
|
|
|
if len(buf) < 1+sidLen+4+payloadLen {
|
|
return "", nil, false
|
|
}
|
|
payload = buf[1+sidLen+4 : 1+sidLen+4+payloadLen]
|
|
return id, payload, true
|
|
}
|