1 /* 2 * Copyright (C) 2015 Cedric Hnyda ced.hnyda (at) gmail.com 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it would be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 * 12 * Further, this software is distributed without any warranty that it is 13 * free of the rightful claim of any third person regarding infringement 14 * or the like. Any license provided herein, whether implied or 15 * otherwise, applies only to this software file. Patent licenses, if 16 * any, provided herein do not apply to combinations of this program with 17 * other software, or any other product whatsoever. 18 * 19 */ 20 21 /* 22 * AUTHOR : Cdric Hnyda 23 * DATE STARTED : 06/13/2015 24 * 25 * Calls getrandom(2), checks that the buffer is filled with random bytes 26 * and expects success. 27 * 28 */ 29 30 #include "lapi/getrandom.h" 31 #include "linux_syscall_numbers.h" 32 #include "tst_test.h" 33 34 static int modes[] = { 0, GRND_RANDOM, GRND_NONBLOCK, 35 GRND_RANDOM | GRND_NONBLOCK }; 36 37 static int check_content(unsigned char *buf, int nb) 38 { 39 int table[256]; 40 int i, index, max; 41 42 memset(table, 0, sizeof(table)); 43 44 max = 6 + nb * 0.2; 45 46 for (i = 0; i < nb; i++) { 47 index = buf[i]; 48 table[index]++; 49 } 50 51 for (i = 0; i < nb; i++) { 52 if (max > 0 && table[i] > max) 53 return 0; 54 } 55 return 1; 56 } 57 58 static void verify_getrandom(unsigned int n) 59 { 60 unsigned char buf[256]; 61 62 memset(buf, 0, sizeof(buf)); 63 64 do { 65 TEST(tst_syscall(__NR_getrandom, buf, sizeof(buf), modes[n])); 66 } while ((modes[n] & GRND_NONBLOCK) && TEST_RETURN == -1 67 && TEST_ERRNO == EAGAIN); 68 69 if (!check_content(buf, TEST_RETURN)) 70 tst_res(TFAIL | TTERRNO, "getrandom failed"); 71 else 72 tst_res(TPASS, "getrandom returned %ld", TEST_RETURN); 73 } 74 75 static struct tst_test test = { 76 .tid = "getrandom02", 77 .tcnt = ARRAY_SIZE(modes), 78 .test = verify_getrandom, 79 }; 80