Files
headplane/agent/internal/sshutil/encoder.go
T
2025-06-16 11:44:59 -04:00

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
}