@@ -121,8 +121,7 @@ def __init__(self, master_keys: SrtpMasterKeys):
121
121
)
122
122
123
123
# Set-up GCM crypto instances
124
- self .decryptor_ctx = SrtpContext ._init_gcm_cryptor (self .session_keys .crypt_key )
125
- self .decryptor_ctx = SrtpContext ._init_gcm_cryptor (self .session_keys .crypt_key )
124
+ self .crypto_ctx = SrtpContext ._init_gcm_cryptor (self .session_keys .crypt_key )
126
125
127
126
@classmethod
128
127
def from_base64 (cls , master_bytes_b64 : str ):
@@ -151,7 +150,6 @@ def _crypt_ctr_oneshot(key: bytes, iv: bytes, plaintext: bytes, max_bytes: Optio
151
150
152
151
@staticmethod
153
152
def _derive_single_key (master_key , master_salt , key_index : int = 0 , max_bytes : int = 16 , pkt_i = 0 , key_derivation_rate = 0 ):
154
- import binascii
155
153
'''SRTP key derivation, https://tools.ietf.org/html/rfc3711#section-4.3'''
156
154
157
155
assert len (master_key ) == 128 // 8
@@ -198,7 +196,7 @@ def _calc_iv(salt, ssrc, pkt_i):
198
196
iv = ((ssrc << (48 )) + pkt_i ) ^ salt
199
197
return utils .int_to_bytes (iv , 12 )
200
198
201
- def decrypt_packet (self , rtp_packet : bytes ) -> RtpPacket :
199
+ def _crypt_packet (self , rtp_packet : bytes , encrypt : bool ) -> RtpPacket :
202
200
rtp_header = rtp_packet [:12 ]
203
201
parsed = RtpPacket .parse (rtp_packet )
204
202
@@ -208,6 +206,16 @@ def decrypt_packet(self, rtp_packet: bytes) -> RtpPacket:
208
206
pkt_i = SrtpContext .packet_index (self .roc , self .seq )
209
207
iv = SrtpContext ._calc_iv (self .session_keys .salt_key [2 :], parsed .ssrc , pkt_i )
210
208
211
- decrypted_payload = SrtpContext ._decrypt (self .decryptor_ctx , iv , parsed .payload , rtp_header )
212
- parsed .payload = decrypted_payload
209
+ if encrypt :
210
+ transformed_payload = SrtpContext ._encrypt (self .crypto_ctx , iv , parsed .payload , rtp_header )
211
+ else :
212
+ transformed_payload = SrtpContext ._decrypt (self .crypto_ctx , iv , parsed .payload , rtp_header )
213
+
214
+ parsed .payload = transformed_payload
213
215
return parsed
216
+
217
+ def encrypt_packet (self , rtp_packet : bytes ) -> RtpPacket :
218
+ return self ._crypt_packet (rtp_packet , True )
219
+
220
+ def decrypt_packet (self , rtp_packet : bytes ) -> RtpPacket :
221
+ return self ._crypt_packet (rtp_packet , False )
0 commit comments