chore: obf read/write cleanup

This commit is contained in:
Yaroslav Gurov
2026-01-12 17:21:16 +00:00
parent c8075e9e60
commit f116e78e23
3 changed files with 71 additions and 67 deletions

View File

@@ -6,8 +6,8 @@ import (
type Obf interface {
Spec() string
Read(reader io.Reader, ctx *readContext) error
Write(writer io.Writer, ctx *writeContext) error
Read(r io.Reader, ctx *readContext) error
Write(w io.Writer, ctx *writeContext) error
}
type Obfs []Obf

View File

@@ -21,12 +21,25 @@ type readContext struct {
nextDataSize int
}
func (o *bytesObf) Read(reader io.Reader, ctx *readContext) error {
func ReadUntil(r io.Reader, b []byte, delim byte) (n int, err error) {
for n < len(b) {
if _, err = r.Read(b[n : n+1]); err != nil {
return n, err
}
if b[n] == delim {
return n, nil
}
n++
}
return n, io.ErrShortBuffer
}
func (o *bytesObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
buf := tmp[:len(o.data)]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
@@ -37,89 +50,80 @@ func (o *bytesObf) Read(reader io.Reader, ctx *readContext) error {
return nil
}
func (o *dataObf) Read(reader io.Reader, ctx *readContext) error {
func (o *dataObf) Read(r io.Reader, ctx *readContext) error {
buf := ctx.PushTail(ctx.nextDataSize)
if buf == nil {
return io.ErrShortBuffer
}
_, err := io.ReadFull(reader, buf)
_, err := io.ReadFull(r, buf)
return err
}
func (o *dataSizeObf) Read(reader io.Reader, ctx *readContext) error {
func (o *dataSizeObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
var size int
switch o.format {
case NumFormatBE:
buf := tmp[:o.length]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
var size int
for i := range buf {
size <<= 8
size |= int(buf[i])
}
ctx.nextDataSize = size
case NumFormatLE:
buf := tmp[:o.length]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
var size int
for i := len(buf) - 1; i >= 0; i-- {
size <<= 8
size |= int(buf[i])
}
case NumFormatAscii:
i := 0
for {
if _, err := io.ReadFull(reader, tmp[i:i+1]); err != nil {
return err
}
if tmp[i] == o.end {
break
}
i++
}
ctx.nextDataSize = size
size64, err := strconv.ParseInt(string(tmp[:i]), 10, 32)
case NumFormatAscii:
n, err := ReadUntil(r, tmp, o.end)
if err != nil {
return err
}
size = int(size64)
size64, err := strconv.ParseInt(string(tmp[:n]), 10, 32)
if err != nil {
return err
}
ctx.nextDataSize = int(size64)
case NumFormatHex:
i := 0
for {
if _, err := io.ReadFull(reader, tmp[i:i+1]); err != nil {
return err
}
if tmp[i] == o.end {
break
}
i++
}
size64, err := strconv.ParseInt(string(tmp[:i]), 16, 32)
n, err := ReadUntil(r, tmp, o.end)
if err != nil {
return err
}
size = int(size64)
size64, err := strconv.ParseInt(string(tmp[:n]), 16, 32)
if err != nil {
return err
}
ctx.nextDataSize = int(size64)
}
ctx.nextDataSize = size
return nil
}
func (o *dataStringObf) Read(reader io.Reader, ctx *readContext) error {
func (o *dataStringObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
base64len := base64.RawStdEncoding.EncodedLen(ctx.nextDataSize)
buf := tmp[:base64len]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
@@ -137,12 +141,12 @@ func (o *dataStringObf) Read(reader io.Reader, ctx *readContext) error {
return nil
}
func (o *randObf) Read(reader io.Reader, ctx *readContext) error {
func (o *randObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
buf := tmp[:o.length]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
@@ -151,12 +155,12 @@ func (o *randObf) Read(reader io.Reader, ctx *readContext) error {
return nil
}
func (o *randCharObf) Read(reader io.Reader, ctx *readContext) error {
func (o *randCharObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
buf := tmp[:o.length]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
@@ -169,12 +173,12 @@ func (o *randCharObf) Read(reader io.Reader, ctx *readContext) error {
return nil
}
func (o *randDigitObf) Read(reader io.Reader, ctx *readContext) error {
func (o *randDigitObf) Read(r io.Reader, ctx *readContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
buf := tmp[:o.length]
if _, err := io.ReadFull(reader, buf); err != nil {
if _, err := io.ReadFull(r, buf); err != nil {
return err
}
@@ -187,9 +191,9 @@ func (o *randDigitObf) Read(reader io.Reader, ctx *readContext) error {
return nil
}
func (o *timestampObf) Read(reader io.Reader, ctx *readContext) error {
func (o *timestampObf) Read(r io.Reader, ctx *readContext) error {
var timestamp uint32
if err := binary.Read(reader, binary.BigEndian, &timestamp); err != nil {
if err := binary.Read(r, binary.BigEndian, &timestamp); err != nil {
return err
}

View File

@@ -14,22 +14,22 @@ type writeContext struct {
*BufferPool
}
func (o *bytesObf) Write(writer io.Writer, ctx *writeContext) error {
_, err := writer.Write(o.data)
func (o *bytesObf) Write(w io.Writer, ctx *writeContext) error {
_, err := w.Write(o.data)
return err
}
func (o *dataObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *dataObf) Write(w io.Writer, ctx *writeContext) error {
buf := ctx.PullHead(-1)
if buf == nil {
return io.ErrShortBuffer
}
_, err := writer.Write(buf)
_, err := w.Write(buf)
return err
}
func (o *dataSizeObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *dataSizeObf) Write(w io.Writer, ctx *writeContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
@@ -41,7 +41,7 @@ func (o *dataSizeObf) Write(writer io.Writer, ctx *writeContext) error {
tmp[i] = byte(size & 0xFF)
size >>= 8
}
if _, err := writer.Write(tmp[:o.length]); err != nil {
if _, err := w.Write(tmp[:o.length]); err != nil {
return err
}
case NumFormatLE:
@@ -49,21 +49,21 @@ func (o *dataSizeObf) Write(writer io.Writer, ctx *writeContext) error {
tmp[i] = byte(size & 0xFF)
size >>= 8
}
if _, err := writer.Write(tmp[:o.length]); err != nil {
if _, err := w.Write(tmp[:o.length]); err != nil {
return err
}
case NumFormatAscii:
b := strconv.AppendInt(tmp[:0], int64(size), 10)
b = append(b, o.end)
if _, err := writer.Write(b); err != nil {
if _, err := w.Write(b); err != nil {
return err
}
case NumFormatHex:
b := strconv.AppendInt(tmp[:0], int64(size), 16)
b = append(b, o.end)
if _, err := writer.Write(b); err != nil {
if _, err := w.Write(b); err != nil {
return err
}
}
@@ -71,7 +71,7 @@ func (o *dataSizeObf) Write(writer io.Writer, ctx *writeContext) error {
return nil
}
func (o *dataStringObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *dataStringObf) Write(w io.Writer, ctx *writeContext) error {
data := ctx.PullHead(-1)
if data == nil {
return io.ErrShortBuffer
@@ -85,24 +85,24 @@ func (o *dataStringObf) Write(writer io.Writer, ctx *writeContext) error {
base64.RawStdEncoding.Encode(buf, data)
_, err := writer.Write(buf)
_, err := w.Write(buf)
return err
}
func (o *randObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *randObf) Write(w io.Writer, ctx *writeContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
buf := tmp[:o.length]
rand.Read(buf)
_, err := writer.Write(buf)
_, err := w.Write(buf)
return err
}
const chars52 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func (o *randCharObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *randCharObf) Write(w io.Writer, ctx *writeContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
@@ -112,13 +112,13 @@ func (o *randCharObf) Write(writer io.Writer, ctx *writeContext) error {
buf[i] = chars52[buf[i]%52]
}
_, err := writer.Write(buf)
_, err := w.Write(buf)
return err
}
const digits10 = "0123456789"
func (o *randDigitObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *randDigitObf) Write(w io.Writer, ctx *writeContext) error {
tmp := ctx.GetBuffer()
defer ctx.Put(tmp)
@@ -128,11 +128,11 @@ func (o *randDigitObf) Write(writer io.Writer, ctx *writeContext) error {
buf[i] = digits10[buf[i]%10]
}
_, err := writer.Write(buf)
_, err := w.Write(buf)
return err
}
func (o *timestampObf) Write(writer io.Writer, ctx *writeContext) error {
func (o *timestampObf) Write(w io.Writer, ctx *writeContext) error {
timestamp := uint32(time.Now().Unix())
return binary.Write(writer, binary.BigEndian, timestamp)
return binary.Write(w, binary.BigEndian, timestamp)
}