mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-11-02 11:54:10 +08:00
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
package handshake
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/rand"
|
|
"crypto/sha256"
|
|
"io"
|
|
)
|
|
|
|
var (
|
|
hsClientFullKey = []byte{
|
|
'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
|
|
'F', 'l', 'a', 's', 'h', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ',
|
|
'0', '0', '1',
|
|
0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1,
|
|
0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB,
|
|
0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE,
|
|
}
|
|
hsServerFullKey = []byte{
|
|
'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',
|
|
'F', 'l', 'a', 's', 'h', ' ', 'M', 'e', 'd', 'i', 'a', ' ',
|
|
'S', 'e', 'r', 'v', 'e', 'r', ' ',
|
|
'0', '0', '1',
|
|
0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1,
|
|
0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB,
|
|
0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE,
|
|
}
|
|
hsClientPartialKey = hsClientFullKey[:30]
|
|
hsServerPartialKey = hsServerFullKey[:36]
|
|
)
|
|
|
|
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)
|
|
}
|
|
|
|
// C1 is the C1 part of an handshake.
|
|
type C1 struct{}
|
|
|
|
// Read reads a C1.
|
|
func (C1) 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
|
|
}
|