mirror of
https://github.com/aler9/gortsplib
synced 2025-09-26 19:21:20 +08:00
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package gortsplib
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/pion/rtcp"
|
|
"github.com/pion/rtp"
|
|
"github.com/pion/srtp/v3"
|
|
)
|
|
|
|
// srtp.Context with
|
|
// - accessible key
|
|
// - accessible SSRCs
|
|
// - mutex around Encrypt*, ROC*
|
|
type wrappedSRTPContext struct {
|
|
key []byte
|
|
ssrcs []uint32
|
|
startROCs []uint32
|
|
|
|
w *srtp.Context
|
|
mutex sync.RWMutex
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) initialize() error {
|
|
var err error
|
|
ctx.w, err = srtp.CreateContext(ctx.key[:16], ctx.key[16:], srtp.ProtectionProfileAes128CmHmacSha1_80)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for i, roc := range ctx.startROCs {
|
|
ctx.w.SetROC(ctx.ssrcs[i], roc)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) decryptRTP(dst []byte, encrypted []byte, header *rtp.Header) ([]byte, error) {
|
|
return ctx.w.DecryptRTP(dst, encrypted, header)
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) decryptRTCP(dst []byte, encrypted []byte, header *rtcp.Header) ([]byte, error) {
|
|
return ctx.w.DecryptRTCP(dst, encrypted, header)
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) encryptRTP(dst []byte, plaintext []byte, header *rtp.Header) ([]byte, error) {
|
|
ctx.mutex.Lock()
|
|
defer ctx.mutex.Unlock()
|
|
return ctx.w.EncryptRTP(dst, plaintext, header)
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) encryptRTCP(dst []byte, decrypted []byte, header *rtcp.Header) ([]byte, error) {
|
|
ctx.mutex.Lock()
|
|
defer ctx.mutex.Unlock()
|
|
return ctx.w.EncryptRTCP(dst, decrypted, header)
|
|
}
|
|
|
|
func (ctx *wrappedSRTPContext) roc(ssrc uint32) uint32 {
|
|
ctx.mutex.RLock()
|
|
defer ctx.mutex.RUnlock()
|
|
v, _ := ctx.w.ROC(ssrc)
|
|
return v
|
|
}
|