golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
891 B
45 lines
891 B
package base |
|
|
|
import ( |
|
"crypto/hmac" |
|
"crypto/rand" |
|
"crypto/sha256" |
|
"io" |
|
) |
|
|
|
func hsCalcDigestPos(p []byte, base int) (pos int) { |
|
for i := 0; i < 4; i++ { |
|
pos += int(p[base+i]) |
|
} |
|
pos = (pos % 728) + base + 4 |
|
return |
|
} |
|
|
|
func hsMakeDigest(key []byte, src []byte, gap int) (dst []byte) { |
|
h := hmac.New(sha256.New, key) |
|
if gap <= 0 { |
|
h.Write(src) |
|
} else { |
|
h.Write(src[:gap]) |
|
h.Write(src[gap+32:]) |
|
} |
|
return h.Sum(nil) |
|
} |
|
|
|
// HandshakeC1 is the C1 part of an handshake. |
|
type HandshakeC1 struct{} |
|
|
|
// Read reads a HandshakeC1. |
|
func (HandshakeC1) Write(w io.Writer) error { |
|
buf := make([]byte, 1536) |
|
copy(buf[0:4], []byte{0x00, 0x00, 0x00, 0x00}) |
|
copy(buf[4:8], []byte{0x09, 0x00, 0x7c, 0x02}) |
|
|
|
rand.Read(buf[8:]) |
|
gap := hsCalcDigestPos(buf[0:], 8) |
|
digest := hsMakeDigest(hsClientPartialKey, buf[0:], gap) |
|
copy(buf[gap+0:], digest) |
|
|
|
_, err := w.Write(buf[0:]) |
|
return err |
|
}
|
|
|