174989affSNico Weber // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
274989affSNico Weber //
3*949f1908SDavid Carlier // UNSUPPORTED: linux, solaris
474989affSNico Weber
574989affSNico Weber #include <cstdlib>
674989affSNico Weber #include <ctime>
774989affSNico Weber #include <cstdio>
874989affSNico Weber #include <inttypes.h>
974989affSNico Weber
print_buf(unsigned char * buf,size_t buflen)1074989affSNico Weber void print_buf(unsigned char *buf, size_t buflen) {
1174989affSNico Weber printf("buf '");
1274989affSNico Weber for (auto i = 0; i < buflen; i ++)
1374989affSNico Weber printf("%" PRIx8, buf[i]);
1474989affSNico Weber printf("'\n");
1574989affSNico Weber }
1674989affSNico Weber
test_seed()1774989affSNico Weber void test_seed() {
1874989affSNico Weber #ifdef __NetBSD__
1974989affSNico Weber time_t now = ::time(nullptr);
2074989affSNico Weber arc4random_addrandom((unsigned char *)&now, sizeof(now));
2174989affSNico Weber #endif
2274989affSNico Weber }
2374989affSNico Weber
test_arc4random()2474989affSNico Weber void test_arc4random() {
2574989affSNico Weber printf("test_arc4random\n");
2674989affSNico Weber auto i = arc4random();
2774989affSNico Weber print_buf((unsigned char *)&i, sizeof(i));
2874989affSNico Weber }
2974989affSNico Weber
test_arc4random_uniform()3074989affSNico Weber void test_arc4random_uniform() {
3174989affSNico Weber printf("test_arc4random_uniform\n");
3274989affSNico Weber auto i = arc4random_uniform(1024);
3374989affSNico Weber print_buf((unsigned char *)&i, sizeof(i));
3474989affSNico Weber }
3574989affSNico Weber
test_arc4random_buf10()3674989affSNico Weber void test_arc4random_buf10() {
3774989affSNico Weber printf("test_arc4random_buf10\n");
3874989affSNico Weber char buf[10];
3974989affSNico Weber #ifdef __NetBSD__
4074989affSNico Weber arc4random_stir();
4174989affSNico Weber #endif
4274989affSNico Weber arc4random_buf(buf, sizeof(buf));
4374989affSNico Weber print_buf((unsigned char *)buf, sizeof(buf));
4474989affSNico Weber }
4574989affSNico Weber
test_arc4random_buf256()4674989affSNico Weber void test_arc4random_buf256() {
4774989affSNico Weber printf("test_arc4random_buf256\n");
4874989affSNico Weber char buf[256];
4974989affSNico Weber #ifdef __NetBSD__
5074989affSNico Weber arc4random_stir();
5174989affSNico Weber #endif
5274989affSNico Weber arc4random_buf(buf, sizeof(buf));
5374989affSNico Weber print_buf((unsigned char *)buf, sizeof(buf));
5474989affSNico Weber }
5574989affSNico Weber
main(void)5674989affSNico Weber int main(void) {
5774989affSNico Weber test_seed();
5874989affSNico Weber test_arc4random();
5974989affSNico Weber test_arc4random_uniform();
6074989affSNico Weber test_arc4random_buf10();
6174989affSNico Weber test_arc4random_buf256();
6274989affSNico Weber return 0;
6374989affSNico Weber // CHECK: test_arc4random
6474989affSNico Weber // CHECK: buf '{{.*}}'
6574989affSNico Weber // CHECK: test_arc4random_uniform
6674989affSNico Weber // CHECK: buf '{{.*}}'
6774989affSNico Weber // CHECK: test_arc4random_buf10
6874989affSNico Weber // CHECK: buf '{{.*}}'
6974989affSNico Weber // CHECK: test_arc4random_buf256
7074989affSNico Weber // CHECK: buf '{{.*}}'
7174989affSNico Weber }
72