Skip to content

Commit 01122a3

Browse files
committed
Crypt: Add encryptor
1 parent 12619c5 commit 01122a3

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

xcloud/protocol/srtp_crypto.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,7 @@ def __init__(self, master_keys: SrtpMasterKeys):
121121
)
122122

123123
# 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)
126125

127126
@classmethod
128127
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
151150

152151
@staticmethod
153152
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
155153
'''SRTP key derivation, https://tools.ietf.org/html/rfc3711#section-4.3'''
156154

157155
assert len(master_key) == 128 // 8
@@ -198,7 +196,7 @@ def _calc_iv(salt, ssrc, pkt_i):
198196
iv = ((ssrc << (48)) + pkt_i) ^ salt
199197
return utils.int_to_bytes(iv, 12)
200198

201-
def decrypt_packet(self, rtp_packet: bytes) -> RtpPacket:
199+
def _crypt_packet(self, rtp_packet: bytes, encrypt: bool) -> RtpPacket:
202200
rtp_header = rtp_packet[:12]
203201
parsed = RtpPacket.parse(rtp_packet)
204202

@@ -208,6 +206,16 @@ def decrypt_packet(self, rtp_packet: bytes) -> RtpPacket:
208206
pkt_i = SrtpContext.packet_index(self.roc, self.seq)
209207
iv = SrtpContext._calc_iv(self.session_keys.salt_key[2:], parsed.ssrc, pkt_i)
210208

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
213215
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

Comments
 (0)