30 return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | (uint32_t)p[3];
36 return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24);
42 p[0] = (uint8_t)(v & 0xFF);
43 p[1] = (uint8_t)((v >> 8) & 0xFF);
44 p[2] = (uint8_t)((v >> 16) & 0xFF);
45 p[3] = (uint8_t)((v >> 24) & 0xFF);
51 if(sector0 == NULL || regions == NULL || count == NULL)
return -1;
54 if(length < 8)
return -2;
56 uint32_t region_count =
read_be32(sector0);
68 uint32_t required = 8 + region_count * 8;
69 if(length < required)
return -2;
72 if(r == NULL)
return -4;
74 const uint8_t *ptr = sector0 + 8;
76 for(uint32_t i = 0; i < region_count; i++)
82 if(r[i].start_sector > r[i].end_sector)
90 *count = region_count;
97 if(out_data == NULL || out_length == NULL)
return -1;
100 uint32_t size = 4 + count * 8;
101 uint8_t *buf = (uint8_t *)malloc(size);
102 if(buf == NULL)
return -4;
106 for(uint32_t i = 0; i < count; i++)
108 write_le32(buf + 4 + i * 8, regions[i].start_sector);
109 write_le32(buf + 4 + i * 8 + 4, regions[i].end_sector);
120 if(data == NULL || regions == NULL || count == NULL)
return -1;
121 if(length < 4)
return -2;
127 if(region_count == 0)
134 uint32_t required = 4 + region_count * 8;
135 if(length < required)
return -2;
138 if(r == NULL)
return -4;
140 for(uint32_t i = 0; i < region_count; i++)
147 *count = region_count;
152 uint64_t sector_address)
154 if(plaintext_regions == NULL || region_count == 0)
return true;
156 for(uint32_t i = 0; i < region_count; i++)
157 if(sector_address >= plaintext_regions[i].start_sector && sector_address <= plaintext_regions[i].end_sector)
bool ps3_is_sector_encrypted(const Ps3PlaintextRegion *plaintext_regions, uint32_t region_count, uint64_t sector_address)
Check whether a sector is encrypted (i.e., not in any plaintext region).
static uint32_t read_le32(const uint8_t *p)
static uint32_t read_be32(const uint8_t *p)
int32_t ps3_deserialize_encryption_map(const uint8_t *data, uint32_t length, Ps3PlaintextRegion **regions, uint32_t *count)
Deserialize plaintext regions from little-endian binary (media tag format).
static void write_le32(uint8_t *p, uint32_t v)
int32_t ps3_parse_encryption_map(const uint8_t *sector0, uint32_t length, Ps3PlaintextRegion **regions, uint32_t *count)
Parse the encryption map from PS3 disc sector 0 (big-endian on disc).
int32_t ps3_serialize_encryption_map(const Ps3PlaintextRegion *regions, uint32_t count, uint8_t **out_data, uint32_t *out_length)
Serialize plaintext regions to little-endian binary for storage as a media tag.
#define PS3_MAX_PLAINTEXT_REGIONS
A plaintext (unencrypted) region on a PS3 disc.
uint32_t start_sector
First sector of plaintext region (inclusive).
uint32_t end_sector
Last sector of plaintext region (inclusive).