2024-08-14 06:58:44 -04:00
# inv_sig_helper
`inv_sig_helper` is a Rust service that decrypts YouTube signatures and manages player information. It offers a TCP/Unix socket interface for signature decryption and related operations.
## Features
- Decrypt YouTube `n` and `s` signatures
- Fetch and update YouTube player data
- Provide signature timestamps and player status
- Efficient signature decryption with multi-threaded JavaScript execution
2024-08-14 07:08:22 -04:00
## Run with Docker (recommended method)
A Dockerfile is included for containerized deployment.
And an official Docker image is available at `quay.io/invidious/inv-sig-helper` : https://quay.io/repository/invidious/inv-sig-helper
### Production
2024-08-14 19:54:31 -04:00
Follow the official installation guide: https://github.com/iv-org/documentation/blob/master/docs/installation.md.
2024-08-14 07:08:22 -04:00
### Development
Run the project using docker compose:
```
docker compose up -d
```
Or you can run it manually but not recommended since you won't lock down the container from potential code execution from Google:
1. Build the image:
```
docker build -t inv_sig_helper .
```
2. Run the container:
```
docker run -p 127.0.0.1:12999:12999 inv_sig_helper
```
## Building and Running without Docker
2024-08-14 06:58:44 -04:00
### Prerequisites
- Rust 1.77 or later
- Cargo
- Patch
- openssl-devel
### Building
1. Clone the repository and navigate to the project directory:
```
git clone https://github.com/iv-org/inv_sig_helper.git
cd inv_sig_helper
```
2. Build the project:
```
cargo build --release
```
### Running
2024-08-14 07:08:22 -04:00
#### Warning
2024-08-14 19:54:31 -04:00
This service runs untrusted code directly from Google.
2024-08-14 07:08:22 -04:00
2024-09-22 13:43:22 -03:00
We recommend running sig_helper inside a locked down environment like an LXC container or a systemd service where only the strict necessary is allowed. An examplary systemd service file is provided in `inv_sig_helper.service` which creates a socket in `/home/invidious/tmp/inv_sig_helper.sock` .
2024-08-14 07:08:22 -04:00
#### Instructions
2024-08-14 06:58:44 -04:00
The service can run in Unix socket mode (default) or TCP mode:
1. Unix socket mode:
```
./target/release/inv_sig_helper_rust
```
This creates a Unix socket at `/tmp/inv_sig_helper.sock` .
2. TCP mode:
```
./target/release/inv_sig_helper_rust --tcp [IP:PORT]
```
If no IP:PORT is given, it defaults to `127.0.0.1:12999` .
2024-09-24 08:56:36 -03:00
#### Troubleshooting
The log level can be configured using the `RUST_LOG` environment variable. Valid values are:
- error
- warn
- info
- debug
- trace
The `info` log level is the default setting. Changing this to `debug` will provide detailed logs on each request for additional troubleshooting.
2024-08-14 06:58:44 -04:00
## Protocol Format
2024-04-29 14:14:08 -04:00
All data-types bigger than 1 byte are stored in network endian (big-endian) unless stated otherwise.
2024-08-14 06:58:44 -04:00
### Request Base
2024-04-29 14:14:08 -04:00
| Name | Size (bytes) | Description |
|-----------|--------------|--------------------------------------|
|opcode | 1 | The operation code to perform, A list of operations currently supported (and their data) can be found in the **Operations** chapter |
|request_id | 4 | The ID for the current request, Used to distinguish responses in the current connection |
The data afterwards depends on the supplied opcode, Please consult the **Operations** chapter for more information.
2024-08-14 06:58:44 -04:00
### Response Base
2024-04-29 14:14:08 -04:00
| Name | Size (bytes) | Description |
|------------|--------------|---------------------------------------|
|request_id | 4 | The ID for the request that this response is meant for |
2024-06-25 13:59:19 -04:00
|size | 4 | Size of the response (excluding size of request id)|
2024-04-29 14:14:08 -04:00
The data afterwards depends on the supplied opcode, Please consult the **Operations** chapter for more information.
2024-08-14 06:58:44 -04:00
### Operations
#### `FORCE_UPDATE` (0x00)
2024-04-29 14:14:08 -04:00
Forces the server to re-fetch the YouTube player, and extract the necessary components from it (`nsig` function code, `sig` function code, signature timestamp).
2024-08-14 06:58:44 -04:00
##### Request
2024-04-29 14:14:08 -04:00
*No additional data required*
2024-08-14 06:58:44 -04:00
##### Response
2024-04-29 14:14:08 -04:00
| Name | Size (bytes) | Description |
|------|--------------|-------------|
2024-06-25 14:04:45 -04:00
|status| 2 | The status code of the request: `0xF44F` if successful, `0xFFFF` if no updating is required (YouTube's player ID is equal to the server's current player ID), `0x0000` if an error occurred |
2024-04-29 14:14:08 -04:00
2024-08-14 06:58:44 -04:00
#### `DECRYPT_N_SIGNATURE` (0x01)
2024-04-29 14:14:08 -04:00
Decrypt a provided `n` signature using the server's current `nsig` function code, and return the result (or an error).
2024-08-14 06:58:44 -04:00
##### Request
2024-04-29 14:14:08 -04:00
| Name | Size (bytes) | Description |
|------|--------------|-------------------------------------|
|size | 2 | The size of the encrypted signature |
|string| *`size`* | The encrypted signature |
2024-08-14 06:58:44 -04:00
##### Response
2024-04-29 14:14:08 -04:00
| Name | Size (bytes) | Description |
|------|--------------|------------------------------------------------------------------|
|size | 2 | The size of the decrypted signature, `0x0000` if an error occurred |
|string| *`size`* | The decrypted signature |
2024-08-14 06:58:44 -04:00
#### `DECRYPT_SIGNATURE` (0x02)
2024-04-30 11:41:32 -04:00
Decrypt a provided `s` signature using the server's current `sig` function code, and return the result (or an error).
2024-08-14 06:58:44 -04:00
##### Request
2024-04-30 11:41:32 -04:00
| Name | Size (bytes) | Description |
|------|--------------|-------------------------------------|
|size | 2 | The size of the encrypted signature |
|string| *`size`* | The encrypted signature |
2024-08-14 06:58:44 -04:00
##### Response
2024-04-30 11:41:32 -04:00
| Name | Size (bytes) | Description |
|------|--------------|------------------------------------------------------------------|
|size | 2 | The size of the decrypted signature, `0x0000` if an error occurred |
|string| *`size`* | The decrypted signature |
2024-08-14 06:58:44 -04:00
#### `GET_SIGNATURE_TIMESTAMP` (0x03)
2024-06-26 16:57:03 -04:00
Get the signature timestamp from the server's current player, and return it in the form of a 64-bit integer. If there's no player, it will return 0 in the `timestamp` (Please check with `PLAYER_STATUS` if the server has a player)
2024-04-30 11:41:32 -04:00
2024-08-14 06:58:44 -04:00
##### Request
2024-04-30 11:41:32 -04:00
No additional data required
2024-08-14 06:58:44 -04:00
##### Response
2024-04-30 11:41:32 -04:00
| Name | Size (bytes) | Description |
|---------|--------------|----------------------------------------------------------|
|timestamp| 8 | The signature timestamp from the server's current player |
2024-06-26 16:57:03 -04:00
2024-08-14 06:58:44 -04:00
#### `PLAYER_STATUS` (0x04)
2024-06-26 16:57:03 -04:00
Get the server's information about the current player.
2024-08-14 06:58:44 -04:00
##### Request
2024-06-26 16:57:03 -04:00
No additional data required
2024-08-14 06:58:44 -04:00
##### Response
2024-06-26 16:57:03 -04:00
| Name | Size (bytes) | Description |
|----------|--------------|-------------|
2024-06-26 16:58:32 -04:00
|has_player| 1 | If the server has a player, this variable will be `0xFF` . or else, it will be `0x00` |
|player_id | 4 | The server's current player ID. If the server has no player, this will always be `0x00000000` |
2024-06-26 16:57:03 -04:00
2024-08-14 06:58:44 -04:00
#### `PLAYER_UPDATE_TIMESTAMP` (0x05)
2024-07-21 08:37:34 -04:00
Get the time of the last player update, The time is represented as seconds since the last update
2024-08-14 06:58:44 -04:00
##### Request
2024-07-21 08:37:34 -04:00
No additional data required
2024-08-14 06:58:44 -04:00
##### Response
2024-07-21 08:37:34 -04:00
| Name | Size (bytes) | Description |
|----------|--------------|-------------|
|timestamp | 8 | Seconds since the last player update |
2024-08-14 06:58:44 -04:00
## License
This project is open source under the AGPL-3.0 license.