32{
return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24); }
37 p[0] = (uint8_t)(v & 0xFF);
38 p[1] = (uint8_t)((v >> 8) & 0xFF);
39 p[2] = (uint8_t)((v >> 16) & 0xFF);
40 p[3] = (uint8_t)((v >> 24) & 0xFF);
45 if(regions == NULL || region_count == 0)
return NULL;
53 for(uint32_t i = 0; i < region_count; i++)
55 if(phys_sector >= regions[i].start_sector && phys_sector < regions[i].end_sector)
58 if(phys_sector == regions[i].start_sector)
return NULL;
61 return regions[i].
key;
75 memset(iv, 0,
sizeof(iv));
82 memset(iv, 0,
sizeof(iv));
89 if(out_data == NULL || out_len == NULL)
return -1;
93 uint32_t size = 4 + count * 24;
94 uint8_t *buf = (uint8_t *)malloc(size);
95 if(buf == NULL)
return -4;
99 for(uint32_t i = 0; i < count; i++)
101 uint32_t offset = 4 + i * 24;
102 write_le32(buf + offset, regions[i].start_sector);
103 write_le32(buf + offset + 4, regions[i].end_sector);
104 memcpy(buf + offset + 8, regions[i].key, 16);
115 if(data == NULL || regions == NULL || count == NULL)
return -1;
116 if(data_len < 4)
return -2;
122 if(region_count == 0)
129 uint32_t required = 4 + region_count * 24;
130 if(data_len < required)
return -2;
133 if(r == NULL)
return -4;
135 for(uint32_t i = 0; i < region_count; i++)
137 uint32_t offset = 4 + i * 24;
140 memcpy(r[i].key, data + offset + 8, 16);
142 if(r[i].start_sector >= r[i].end_sector)
151 *count = region_count;
157 if(ctx == NULL)
return;
164 HASH_FIND_INT(ctx->
mediaTags, &tag, item);
166 if(item != NULL && item->
length == 16)
179 HASH_FIND_INT(ctx->
mediaTags, &tag, item);
181 if(item != NULL && item->
length >= 4)
void aes128_cbc_decrypt(const uint8_t key[16], const uint8_t iv[16], uint8_t *data, uint32_t length)
AES-128 CBC decrypt data in-place.
void aes128_cbc_encrypt(const uint8_t key[16], const uint8_t iv[16], uint8_t *data, uint32_t length)
AES-128 CBC encrypt data in-place.
A Wii U partition region entry (in-memory representation).
uint8_t key[16]
AES-128 key for encrypted sectors in this partition.
uint32_t start_sector
First physical sector of partition (plaintext header).
uint32_t end_sector
End physical sector (exclusive).
Master context representing an open or in‑creation Aaru image.
void * wiiu_partition_regions
Parsed WiiuPartitionRegion array, NULL if not loaded.
uint32_t wiiu_partition_region_count
Number of partition regions.
uint8_t * wiiu_encrypted_block_cache
Cached re-encrypted 0x8000-byte physical sector.
mediaTagEntry * mediaTags
Hash table of extra media tags (uthash root).
uint8_t * wiiu_disc_key
Cached disc key (16 bytes), NULL if not loaded.
bool wiiu_cache_valid
Whether the encrypted block cache is valid.
Hash table entry for an arbitrary media tag (e.g., proprietary drive/medium descriptor).
uint8_t * data
Tag data blob (opaque to library core); length bytes long.
uint32_t length
Length in bytes of data.
static uint32_t read_le32(const uint8_t *p)
static void write_le32(uint8_t *p, uint32_t v)
void wiiu_encrypt_physical_sector(const uint8_t key[16], uint8_t *data, uint32_t length)
Encrypt a full 0x8000-byte physical sector in-place.
int32_t wiiu_deserialize_partition_key_map(const uint8_t *data, uint32_t data_len, WiiuPartitionRegion **regions, uint32_t *count)
Deserialize a partition key map from a media tag buffer.
void wiiu_lazy_init(aaruformat_context *ctx)
Lazy initialization: load disc key and partition key map from media tags.
void wiiu_decrypt_physical_sector(const uint8_t key[16], uint8_t *data, uint32_t length)
Decrypt a full 0x8000-byte physical sector in-place.
int32_t wiiu_serialize_partition_key_map(const WiiuPartitionRegion *regions, uint32_t count, uint8_t **out_data, uint32_t *out_len)
Serialize a partition key map for storage as a media tag.
const uint8_t * wiiu_get_sector_key(const WiiuPartitionRegion *regions, uint32_t region_count, uint64_t logical_sector)
Get the encryption key for a given logical sector (2048-byte).
bool wiiu_is_sector_encrypted(const WiiuPartitionRegion *regions, uint32_t region_count, uint64_t logical_sector)
Check if a logical sector (2048-byte) is in an encrypted region.
#define WIIU_CRYPTO_SECTOR_SIZE
Wii U physical sector size (32 KiB).
#define WIIU_HEADER_PHYSICAL_SECTORS
Disc header occupies physical sectors 0-2 (plaintext).
#define WIIU_LOGICAL_PER_PHYSICAL
Number of 2048-byte logical sectors per physical sector.
#define WIIU_MAX_PARTITIONS
Maximum number of partitions supported.