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.
97 lines
1.4 KiB
97 lines
1.4 KiB
// Package handshake contains the RTMP handshake mechanism. |
|
package handshake |
|
|
|
import ( |
|
"io" |
|
) |
|
|
|
// DoClient performs a client-side handshake. |
|
func DoClient(rw io.ReadWriter, validateSignature bool) error { |
|
c0 := C0S0{} |
|
err := c0.Write(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
c1 := C1S1{} |
|
err = c1.Write(rw, true) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s0 := C0S0{} |
|
err = s0.Read(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s1 := C1S1{} |
|
err = s1.Read(rw, false, validateSignature) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s2 := C2S2{ |
|
Digest: c1.Digest, |
|
} |
|
err = s2.Read(rw, validateSignature) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
c2 := C2S2{ |
|
Time: s1.Time, |
|
Random: s1.Random, |
|
Digest: s1.Digest, |
|
} |
|
err = c2.Write(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
return nil |
|
} |
|
|
|
// DoServer performs a server-side handshake. |
|
func DoServer(rw io.ReadWriter, validateSignature bool) error { |
|
err := C0S0{}.Read(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
c1 := C1S1{} |
|
err = c1.Read(rw, true, validateSignature) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s0 := C0S0{} |
|
err = s0.Write(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s1 := C1S1{} |
|
err = s1.Write(rw, false) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
s2 := C2S2{ |
|
Time: c1.Time, |
|
Random: c1.Random, |
|
Digest: c1.Digest, |
|
} |
|
err = s2.Write(rw) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
c2 := C2S2{Digest: s1.Digest} |
|
err = c2.Read(rw, validateSignature) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
return nil |
|
}
|
|
|