RTCRtpSFrameTransformer.h [plain text]
#pragma once
#if ENABLE(WEB_RTC)
#include "ExceptionOr.h"
#include <wtf/HashMap.h>
#include <wtf/Lock.h>
#include <wtf/ThreadSafeRefCounted.h>
namespace WebCore {
class CryptoKey;
class RTCRtpSFrameTransformer : public ThreadSafeRefCounted<RTCRtpSFrameTransformer, WTF::DestructionThread::Main> {
public:
enum class CompatibilityMode { None, H264, VP8 };
WEBCORE_EXPORT static Ref<RTCRtpSFrameTransformer> create(CompatibilityMode = CompatibilityMode::None);
WEBCORE_EXPORT ~RTCRtpSFrameTransformer();
void setIsEncrypting(bool);
void setAuthenticationSize(uint64_t);
WEBCORE_EXPORT ExceptionOr<void> setEncryptionKey(const Vector<uint8_t>& rawKey, Optional<uint64_t>);
WEBCORE_EXPORT ExceptionOr<Vector<uint8_t>> transform(const uint8_t*, size_t);
const Vector<uint8_t>& authenticationKey() const { return m_authenticationKey; }
const Vector<uint8_t>& encryptionKey() const { return m_encryptionKey; }
const Vector<uint8_t>& saltKey() const { return m_saltKey; }
uint64_t keyId() const { return m_keyId; }
uint64_t counter() const { return m_counter; }
void setCounter(uint64_t counter) { m_counter = counter; }
private:
WEBCORE_EXPORT explicit RTCRtpSFrameTransformer(CompatibilityMode);
ExceptionOr<Vector<uint8_t>> decryptFrame(const uint8_t*, size_t);
ExceptionOr<Vector<uint8_t>> encryptFrame(const uint8_t*, size_t);
enum class ShouldUpdateKeys { No, Yes };
ExceptionOr<void> updateEncryptionKey(const Vector<uint8_t>& rawKey, Optional<uint64_t>, ShouldUpdateKeys = ShouldUpdateKeys::Yes);
ExceptionOr<Vector<uint8_t>> computeSaltKey(const Vector<uint8_t>&);
ExceptionOr<Vector<uint8_t>> computeAuthenticationKey(const Vector<uint8_t>&);
ExceptionOr<Vector<uint8_t>> computeEncryptionKey(const Vector<uint8_t>&);
ExceptionOr<Vector<uint8_t>> encryptData(const uint8_t*, size_t, const Vector<uint8_t>& iv, const Vector<uint8_t>& key);
ExceptionOr<Vector<uint8_t>> decryptData(const uint8_t*, size_t, const Vector<uint8_t>& iv, const Vector<uint8_t>& key);
Vector<uint8_t> computeEncryptedDataSignature(const uint8_t*, size_t, const Vector<uint8_t>& key);
void updateAuthenticationSize();
Lock m_keyLock;
bool m_hasKey { false };
Vector<uint8_t> m_authenticationKey;
Vector<uint8_t> m_encryptionKey;
Vector<uint8_t> m_saltKey;
struct IdentifiedKey {
uint64_t keyId { 0 };
Vector<uint8_t> keyData;
};
Vector<IdentifiedKey> m_keys;
bool m_isEncrypting { false };
uint64_t m_authenticationSize { 10 };
uint64_t m_keyId { 0 };
uint64_t m_counter { 0 };
CompatibilityMode m_compatibilityMode { CompatibilityMode::None };
};
inline void RTCRtpSFrameTransformer::setIsEncrypting(bool isEncrypting)
{
m_isEncrypting = isEncrypting;
}
inline void RTCRtpSFrameTransformer::setAuthenticationSize(uint64_t size)
{
m_authenticationSize = size;
}
}
#endif // ENABLE(WEB_RTC)