forked from schmichael/minnow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminnow.go
60 lines (47 loc) · 842 Bytes
/
minnow.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
package minnow
import (
"crypto/hmac"
"crypto/sha512"
"encoding/binary"
"hash"
"io"
)
type PacketHeader struct {
SequenceN int32
Mac [64]byte
Size int32
}
type Packet struct {
Header PacketHeader
Payload []byte
}
type Stream struct {
w io.Writer
h hash.Hash
}
func NewStream(w io.Writer, secret []byte) *Stream {
return &Stream{w: w, h: hmac.New(sha512.New, secret)}
}
func (s *Stream) WritePacket(packet []byte, seqn int32) error {
var mbuf [64]byte
s.h.Write(packet)
defer s.h.Reset()
m := s.h.Sum(nil)
for i, _ := range mbuf {
mbuf[i] = m[i]
}
h := PacketHeader{
SequenceN: seqn,
Mac: mbuf,
Size: int32(len(packet)),
}
err := binary.Write(s.w, binary.BigEndian, h)
if err != nil {
return err
}
_, err = s.w.Write(packet)
if err != nil {
return err
}
return nil
}