gboolean simpleprng_verify_buffer( simpleprng_state_t *state, gpointer buf, size_t len) { guint8 *p = buf; while (len--) { guint64 count = state->count; guint8 expected = simpleprng_rand_byte(state); guint8 got = *p; if (expected != got) { int remaining = MIN(len, 16); guint8 expbytes[16] = { expected }; char *gotstr = hexstr(p, remaining); char *expstr; int i; for (i = 1; i < remaining; i++) expbytes[i] = simpleprng_rand_byte(state); expstr = hexstr(expbytes, remaining); g_fprintf(stderr, "random value mismatch at offset %ju: got %s, expected %s\n", (uintmax_t)count, gotstr, expstr); g_free(gotstr); g_free(expstr); return FALSE; } p++; } return TRUE; }
static int test_roundtrip_rand(void) { int i, ret; simpleprng_state_t state; char *in, *tmp_enc = NULL, *tmp_dec = NULL; size_t size; GError *err = NULL; simpleprng_seed(&state, 0xface); ret = TRUE; for (i = 0; i < 100; i++) { size = simpleprng_rand_byte(&state); in = g_malloc0(size+1); simpleprng_fill_buffer(&state, in, size); tmp_enc = hexencode_string(in); tmp_dec = tmp_enc? hexdecode_string(tmp_enc, &err) : NULL; if (!tmp_enc || !tmp_dec || strcmp(in, tmp_dec) || err) { ret = FALSE; tu_dbg("roundtrip failure:\n") tu_dbg("input: \"%s\"\n", in); tu_dbg("enc output: \"%s\"\n", tmp_enc? tmp_enc : "(null)"); tu_dbg("dec output: \"%s\"\n", tmp_dec? tmp_dec : "(null)"); tu_dbg("error msg: %s\n", err? err->message : "(none)"); } g_clear_error(&err); amfree(tmp_enc); amfree(tmp_dec); g_free(in); } return ret; }
void simpleprng_fill_buffer( simpleprng_state_t *state, gpointer buf, size_t len) { guint8 *p = buf; while (len--) { *(p++) = simpleprng_rand_byte(state); } }
gboolean simpleprng_verify_buffer( simpleprng_state_t *state, gpointer buf, size_t len) { guint8 *p = buf; while (len--) { guint8 expected = simpleprng_rand_byte(state); guint8 got = *p; if (expected != got) { g_fprintf(stderr, "random value mismatch in buffer %p, offset %zd: got 0x%02x, expected 0x%02x\n", buf, (size_t)(p-(guint8*)buf), (int)got, (int)expected); return FALSE; } p++; } return TRUE; }