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.
49 lines
780 B
49 lines
780 B
package rtmp |
|
|
|
import ( |
|
"crypto/rc4" |
|
"io" |
|
) |
|
|
|
type rc4ReadWriter struct { |
|
rw io.ReadWriter |
|
in *rc4.Cipher |
|
out *rc4.Cipher |
|
} |
|
|
|
func newRC4ReadWriter(rw io.ReadWriter, keyIn []byte, keyOut []byte) (*rc4ReadWriter, error) { |
|
in, err := rc4.NewCipher(keyIn) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
out, err := rc4.NewCipher(keyOut) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
p := make([]byte, 1536) |
|
in.XORKeyStream(p, p) |
|
out.XORKeyStream(p, p) |
|
|
|
return &rc4ReadWriter{ |
|
rw: rw, |
|
in: in, |
|
out: out, |
|
}, nil |
|
} |
|
|
|
func (r *rc4ReadWriter) Read(p []byte) (int, error) { |
|
n, err := r.rw.Read(p) |
|
if n == 0 { |
|
return 0, err |
|
} |
|
|
|
r.in.XORKeyStream(p[:n], p[:n]) |
|
return n, err |
|
} |
|
|
|
func (r *rc4ReadWriter) Write(p []byte) (int, error) { |
|
r.out.XORKeyStream(p, p) |
|
return r.rw.Write(p) |
|
}
|
|
|