public void SetMasterKeys(IntPtr ssl, bool isClient) { var keyingMaterialHandle = default(GCHandle); try { var keyingMaterial = new byte[2 * SRTP_MASTER_LEN]; keyingMaterialHandle = GCHandle.Alloc(keyingMaterial, GCHandleType.Pinned); if (OpenSsl.SSL_export_keying_material(ssl, keyingMaterialHandle.AddrOfPinnedObject(), 2 * SRTP_MASTER_LEN, Marshal.StringToHGlobalAnsi("EXTRACTOR-dtls_srtp"), 19, IntPtr.Zero, 0, 0) != 1) { throw new Exception($"Cannot export keying material: {OpenSsl.GetLastError()}"); } int offset = 0; Array.Copy(keyingMaterial, offset, isClient ? _txKey : _rxKey, 0, SRTP_MASTER_KEY_LEN); offset += SRTP_MASTER_KEY_LEN; Array.Copy(keyingMaterial, offset, isClient ? _rxKey : _txKey, 0, SRTP_MASTER_KEY_LEN); offset += SRTP_MASTER_KEY_LEN; Array.Copy(keyingMaterial, offset, isClient ? _txSalt : _rxSalt, 0, SRTP_MASTER_SALT_LEN); offset += SRTP_MASTER_SALT_LEN; Array.Copy(keyingMaterial, offset, isClient ? _rxSalt : _txSalt, 0, SRTP_MASTER_SALT_LEN); _rxRoc = 0; _txRoc = 0; } finally { if (keyingMaterialHandle.IsAllocated) { keyingMaterialHandle.Free(); } } }