+#ifndef TINC_CRYPTO_H
+#define TINC_CRYPTO_H
+
+#include "system.h"
+
/*
crypto.h -- header for crypto.c
Copyright (C) 2007-2013 Guus Sliepen <guus@tinc-vpn.org>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef __TINC_CRYPTO_H__
-#define __TINC_CRYPTO_H__
+extern void crypto_init(void);
+extern uint64_t xoshiro(void);
+extern void prng_init(void);
+extern void prng_randomize(void *buf, size_t buflen);
+
+static inline uint32_t prng(uint32_t limit) {
+ uint64_t bins = UINT64_MAX / limit;
+ uint64_t reject_after = bins * limit;
+ uint64_t value;
+
+ do {
+ value = xoshiro();
+ } while(value >= reject_after);
-extern void crypto_init();
-extern void crypto_exit();
-extern void randomize(void *, size_t);
+ return value / bins;
+}
#endif