124 if(((uintptr_t)data - data_offset) %
sizeof(uint32_t) != 0)
return 0;
127 size_t bytes_to_skip = ((data_offset + 3) & ~(size_t)3) - data_offset;
129 if(bytes_to_skip > size)
return 0;
131 const uint32_t *u32_data = (
const uint32_t *)(data + bytes_to_skip);
132 size_t u32_size = (size - bytes_to_skip) /
sizeof(uint32_t);
133 size_t u32_data_offset = (data_offset + bytes_to_skip) /
sizeof(uint32_t);
140 uint32_t x =
swap32(u32_data[i]);
142 if((x & 0x00C00000) != (x >> 2 & 0x00C00000))
return 0;
146 size_t data_offset_mod_k = u32_data_offset %
NGC_LFG_K;
147 size_t data_offset_div_k = u32_data_offset /
NGC_LFG_K;
152 size_t first_part =
NGC_LFG_K - data_offset_mod_k;
156 for(
size_t i = 0; i < first_part && i <
NGC_LFG_K; i++) lfg.
buffer[data_offset_mod_k + i] = u32_data[i];
158 for(
size_t i = 0; i < data_offset_mod_k; i++) lfg.
buffer[i] = u32_data[first_part + i];
169 for(
size_t i = 0; i < data_offset_div_k; i++)
lfg_forward(&lfg);
173 const uint8_t *p = data;
174 const uint8_t *end = data + size;
180 if(*p != expected)
break;
void ngc_lfg_get_bytes(struct ngc_lfg_ctx *ctx, uint8_t *out, size_t count)
Generate count bytes of junk data into out.
size_t ngc_lfg_get_seed(const uint8_t *data, size_t size, size_t data_offset, uint32_t seed_out[17])
Try to extract the LFG seed from a chunk of data.