From facd01b52e6b7122fb3413345fef2d5d08b1f377 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 16 Mar 2025 19:54:40 -0300 Subject: [PATCH] feat: add support for encrypted query parameters Related: - https://git.nadeko.net/Fijxu/http3-ytproxy/commit/6bd0f28d779596c2f7439395818db0c46698d5f0 - https://git.nadeko.net/Fijxu/invidious-companion/commit/7eae31613e6d674dc5122a980e0ac6cc2d57ae2b --- src/invidious/helpers/utils.cr | 23 +++++++++++++++++++++++ src/invidious/routes/video_playback.cr | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 7aacfe7e..a2f95eca 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -384,6 +384,29 @@ def parse_link_endpoint(endpoint : JSON::Any, text : String, video_id : String) return text end +def decrypt_ecb_without_salt(data, key) + cipher = OpenSSL::Cipher.new("aes-128-ecb") + cipher.decrypt + cipher.key = key + cipher.padding = false + + io = IO::Memory.new + io.write(cipher.update(data)) + io.write(cipher.final) + io.rewind + + data_ = io.to_s + padding = data_[-1].ord + + return data_[0...(data_.bytesize - padding)] +end + +def video_playback_decrypt(data) + data = Base64.decode(data) + decrypted_query = decrypt_ecb_without_salt(data, CONFIG.invidious_companion_key) + return decrypted_query +end + def encrypt_ecb_without_salt(data, key) cipher = OpenSSL::Cipher.new("aes-128-ecb") cipher.encrypt diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr index 19342e4e..3c1b85a6 100644 --- a/src/invidious/routes/video_playback.cr +++ b/src/invidious/routes/video_playback.cr @@ -3,6 +3,11 @@ module Invidious::Routes::VideoPlayback def self.get_video_playback(env) locale = env.get("preferences").as(Preferences).locale query_params = env.params.query + + if query_params["enc"]? == "yes" + query_params = URI::Params.parse(video_playback_decrypt(query_params["data"])) + end + array = UInt8[0x78, 0] protobuf = Bytes.new(array.size) array.each_with_index do |byte, index|