mirror of
https://github.com/Elpisdev/unsegaREBORN.git
synced 2026-09-22 22:28:11 +03:00
48 lines
1.2 KiB
C
48 lines
1.2 KiB
C
#ifndef STREAM_H
|
|
#define STREAM_H
|
|
|
|
#include "lib.h"
|
|
#include "aes.h"
|
|
|
|
#define DECRYPT_PAGE_SIZE 4096
|
|
#define STREAM_CACHE_PAGES 16
|
|
#define MAX_DATA_RUNS 256
|
|
|
|
typedef struct {
|
|
uint64_t offset;
|
|
uint64_t length;
|
|
} DataRun;
|
|
|
|
typedef struct {
|
|
void* ntfs_ctx;
|
|
DataRun runs[MAX_DATA_RUNS];
|
|
int run_count;
|
|
uint64_t file_size;
|
|
} RunSource;
|
|
|
|
typedef struct DecryptStream DecryptStream;
|
|
|
|
struct DecryptStream {
|
|
FILE* fp;
|
|
RunSource* run_source;
|
|
uint64_t data_offset;
|
|
uint64_t data_size;
|
|
uint8_t key[16];
|
|
uint8_t file_iv[16];
|
|
uint8_t page_buffers[STREAM_CACHE_PAGES][DECRYPT_PAGE_SIZE] __attribute__((aligned(16)));
|
|
uint64_t cached_page_offsets[STREAM_CACHE_PAGES];
|
|
uint32_t page_lru[STREAM_CACHE_PAGES];
|
|
uint64_t lru_counter;
|
|
int last_slot;
|
|
uint64_t file_pos;
|
|
AES_ctx aes_ctx;
|
|
};
|
|
|
|
bool stream_init(DecryptStream* ds, FILE* fp, uint64_t data_offset,
|
|
uint64_t data_size, const uint8_t key[16], const uint8_t iv[16]);
|
|
bool stream_init_from_runs(DecryptStream* ds, RunSource* source,
|
|
const uint8_t key[16], const uint8_t iv[16]);
|
|
bool stream_read(DecryptStream* ds, void* buffer, uint64_t offset, size_t size);
|
|
|
|
#endif
|