feat(libcrypto): crypto_random

This commit is contained in:
d0p1 🏳️‍⚧️ 2024-09-19 11:10:02 +02:00
parent 982cc66c3f
commit a683e1783f
6 changed files with 102 additions and 6 deletions

View file

@ -35,11 +35,10 @@ AC_CHECK_INCLUDES_DEFAULT
AC_C_CONST AC_C_CONST
AC_C_INLINE AC_C_INLINE
AC_CHECK_FUNCS_ONCE(strtoull)
AC_CHECK_HEADERS(m4_normalize([ AC_CHECK_HEADERS(m4_normalize([
libgen.h libgen.h
getopt.h getopt.h
sys/random.h
])) ]))
AC_CHECK_TYPES([struct option], [], [], AC_CHECK_TYPES([struct option], [], [],
@ -49,6 +48,8 @@ AC_CHECK_TYPES([struct option], [], [],
AC_CHECK_FUNCS(m4_normalize([ AC_CHECK_FUNCS(m4_normalize([
getopt_long getopt_long
strtoull
getrandom
])) ]))
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile

View file

@ -2,4 +2,4 @@ SUBDIRS = tests
noinst_LIBRARIES = libcrypto.a noinst_LIBRARIES = libcrypto.a
AM_CFLAGS = -I$(top_srcdir) AM_CFLAGS = -I$(top_srcdir)
libcrypto_a_SOURCES = hchacha.c xchacha.c libcrypto_a_SOURCES = hchacha.c xchacha.c random.c

57
libcrypto/random.c Normal file
View file

@ -0,0 +1,57 @@
#include "random.h"
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
#ifdef _WIN32
# include <windows.h>
# include <ntsecapi.h>
#else
# ifdef HAVE_SYS_RANDOM_H
# include <sys/random.h>
# else
# include <stdio.h>
# endif /* HAVE_SYS_RANDOM_H */
#endif /* _WIN32 */
int
crypto_random(uint8_t *buff, size_t size)
{
#ifdef _WIN32
return (RtlGenRandom(buff, size));
#else
# ifdef HAVE_GETRANDOM
ssize_t ret;
ret = getrandom(buff, size, 0)
if (ret < size)
{
return (-1);
}
# else
FILE *fp;
size_t total;
size_t byte_read;
fp = fopen("/dev/urandom", "rb");
if (fp == NULL)
{
return (-1);
}
total = 0;
do {
byte_read = fread(buff + total, 1, size - total, fp);
if (byte_read == 0)
{
fclose(fp);
return (-1);
}
total += byte_read;
} while (total < size);
fclose(fp);
# endif /* HAVE_GETRANDOM */
#endif /* _WIN32 */
return (0);
}

8
libcrypto/random.h Normal file
View file

@ -0,0 +1,8 @@
#ifndef CRYPTO_RANDOM_H
# define CRYPTO_RANDOM_H 1
# include <stdint.h>
int crypto_random(uint8_t *buff, size_t size);
#endif /* CRYPTO_RANDOM_H */

View file

@ -1,9 +1,11 @@
TESTS = test_hchacha test_xchacha TESTS = test_hchacha test_xchacha test_random
check_PROGRAMS = test_hchacha test_xchacha check_PROGRAMS = test_hchacha test_xchacha test_random
AM_CFLAGS = -I../ AM_CFLAGS = -I../
LDADD = -lcmocka ../libcrypto.a LDADD = -lcmocka ../libcrypto.a
test_hchacha_SOURCES = test_hchacha.c test_hchacha_SOURCES = test_hchacha.c
test_xchacha_SOURCES = test_xchacha.c test_xchacha_SOURCES = test_xchacha.c
test_random_SOURCES = test_random.c

View file

@ -0,0 +1,28 @@
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <setjmp.h>
#include <cmocka.h>
#include "random.h"
/* test from https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha-03#section-2.2 */
static void
test_random(void **state)
{
uint8_t buff[512];
assert_return_code(crypto_random(buff, 512), 0);
}
int
main(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_random),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}