mirror of
https://github.com/amnezia-vpn/amneziawg-go.git
synced 2026-05-17 08:15:49 +03:00
chore: obf read/write cleanup
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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, ×tamp); err != nil {
|
||||
if err := binary.Read(r, binary.BigEndian, ×tamp); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user