/
streams_raw.go
66 lines (57 loc) · 1.32 KB
/
streams_raw.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package obfuscated
import (
"fmt"
"io"
"sync"
"github.com/geovex/tgp/internal/tgcrypt"
)
type rawStream struct {
r, w sync.Mutex
protocol uint8
stream io.ReadWriteCloser
}
func newRawStream(stream io.ReadWriteCloser, protocol uint8) *rawStream {
return &rawStream{
r: sync.Mutex{},
w: sync.Mutex{},
stream: stream,
protocol: protocol,
}
}
func (s *rawStream) Initiate() error {
s.w.Lock()
defer s.w.Unlock()
var header []byte
switch s.protocol {
case tgcrypt.Abridged:
header = []byte{tgcrypt.Abridged}
case tgcrypt.Intermediate:
header = []byte{tgcrypt.Intermediate, tgcrypt.Intermediate, tgcrypt.Intermediate, tgcrypt.Intermediate}
case tgcrypt.Padded:
header = []byte{tgcrypt.Padded, tgcrypt.Padded, tgcrypt.Padded, tgcrypt.Padded}
case tgcrypt.Full: // do nothing for Full protocol
return nil
default:
return fmt.Errorf("unknown protocol: %d", s.protocol)
}
_, err := s.stream.Write(header)
return err
}
func (s *rawStream) Protocol() uint8 {
return s.protocol
}
func (s *rawStream) Read(p []byte) (n int, err error) {
s.r.Lock()
defer s.r.Unlock()
n, err = s.stream.Read(p)
return
}
func (s *rawStream) Write(p []byte) (n int, err error) {
s.w.Lock()
defer s.w.Unlock()
n, err = s.stream.Write(p)
return
}
func (s *rawStream) Close() error {
return s.stream.Close()
}