On Fri, Nov 10, 2017 at 2:49 PM, Christian Mauderer
<christian.maude...@embedded-brains.de> wrote:
> ----- Ursprüngliche Mail -----
>> Von: "Gedare Bloom" <ged...@rtems.org>
>> An: "Christian Mauderer" <christian.maude...@embedded-brains.de>
>> CC: devel@rtems.org
>> Gesendet: Freitag, 10. November 2017 17:14:38
>> Betreff: Re: [PATCH 3/4] getentropy: Add test.
>
>> This is a necessary test, but I don't think it is that sufficient to
>> give a good idea of the quality of the entropy returned. It would be
>> better instead to calculate an actual entropy (information theoretic)
>> measure over multiple calls to getentropy(). The program test logic
>> could be something like....
>
> It wasn't my intention to test the quality of the entropy source. I only 
> wanted to make sure that getentropy is basically doing anything and isn't 
> writing behind the end of the buffer.
>
> To be totally honest: I'm not able to design any method for testing the 
> quality of the entropy that would be useful for a crypto use case. If we want 
> to test the quality of the entropy, an established method would be best. That 
> would mean for example porting an existing implementation of the Diehard 
> tests. I wouldn't even dare writing an implementation of them myself. Crypto 
> code is very easy to get wrong if you don't know exactly what you are doing 
> and in this case, I don't.
>
Of course.

> Should I extend the doc file of the test with a similar explanation to make 
> that point more clear in the code?
>
Yes, describe the purpose and limitations of the test. Thanks.

> Regards
>
> Christian
>
>>
>> ---
>> uint8_t entropy_buffers[n][nr_bytes];
>> /* fill buffers with guard bits */
>> ...
>>
>> /* read entropy n times */
>> for ( i = 0; i  < n; i++ ) {
>>  rv = getentropy(entropy_buffers[i], nr_bytes);
>>  assert(rv == 0)
>> }
>>
>> /* count the occurrence of each byte pattern, 1 per bin */
>> uint8_t bin_counts[1<<8];
>> /* init bin_counts to 0 */
>> ...
>>
>> for ( i = 0; i < n; i++ ) {
>>  for ( b = 0; b < nr_bytes; b++ ) {
>>    bin_counts[entropy_buffers[i][b]]++;
>>  }
>> }
>>
>> /* calculate the entropy of the bins */
>> float entropy = 0.0;
>> for ( i = 0; i < 1<<8; i++ ) {
>>  float p = bin_counts[i] / (n * nr_bytes);
>>  entropy = entropy + p * log(p)/log(8); /* normalize log to bin size
>> (8 bits) */
>> }
>> entropy = 0.0 - entropy;
>>
>> /* expect entropy ~ 1 for uniformly distributed values */
>> ---
>>
>> On Thu, Nov 9, 2017 at 8:23 AM, Christian Mauderer
>> <christian.maude...@embedded-brains.de> wrote:
>>> From: Christian Mauderer <christian.maude...@embedded-brains.de>
>>>
>>> ---
>>>  testsuites/libtests/Makefile.am           |   1 +
>>>  testsuites/libtests/configure.ac          |   1 +
>>>  testsuites/libtests/random01/Makefile.am  |  19 ++++++
>>>  testsuites/libtests/random01/init.c       | 105 
>>> ++++++++++++++++++++++++++++++
>>>  testsuites/libtests/random01/random01.doc |  12 ++++
>>>  testsuites/libtests/random01/random01.scn |   2 +
>>>  6 files changed, 140 insertions(+)
>>>  create mode 100644 testsuites/libtests/random01/Makefile.am
>>>  create mode 100644 testsuites/libtests/random01/init.c
>>>  create mode 100644 testsuites/libtests/random01/random01.doc
>>>  create mode 100644 testsuites/libtests/random01/random01.scn
>>>
>>> diff --git a/testsuites/libtests/Makefile.am 
>>> b/testsuites/libtests/Makefile.am
>>> index e72ca1bbaa..c9017301ce 100644
>>> --- a/testsuites/libtests/Makefile.am
>>> +++ b/testsuites/libtests/Makefile.am
>>> @@ -54,6 +54,7 @@ _SUBDIRS += newlib01
>>>  _SUBDIRS += putenvtest
>>>  _SUBDIRS += pwdgrp01
>>>  _SUBDIRS += pwdgrp02
>>> +_SUBDIRS += random01
>>>  _SUBDIRS += rbheap01
>>>  _SUBDIRS += rtmonuse
>>>  _SUBDIRS += sha
>>> diff --git a/testsuites/libtests/configure.ac 
>>> b/testsuites/libtests/configure.ac
>>> index bbdf4df9d1..1a5e215f3b 100644
>>> --- a/testsuites/libtests/configure.ac
>>> +++ b/testsuites/libtests/configure.ac
>>> @@ -155,6 +155,7 @@ newlib01/Makefile
>>>  putenvtest/Makefile
>>>  pwdgrp01/Makefile
>>>  pwdgrp02/Makefile
>>> +random01/Makefile
>>>  rbheap01/Makefile
>>>  rtmonuse/Makefile
>>>  sha/Makefile
>>> diff --git a/testsuites/libtests/random01/Makefile.am
>>> b/testsuites/libtests/random01/Makefile.am
>>> new file mode 100644
>>> index 0000000000..7c81fc1865
>>> --- /dev/null
>>> +++ b/testsuites/libtests/random01/Makefile.am
>>> @@ -0,0 +1,19 @@
>>> +rtems_tests_PROGRAMS = random01
>>> +random01_SOURCES = init.c
>>> +
>>> +dist_rtems_tests_DATA = random01.scn random01.doc
>>> +
>>> +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
>>> +include $(top_srcdir)/../automake/compile.am
>>> +include $(top_srcdir)/../automake/leaf.am
>>> +
>>> +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
>>> +
>>> +LINK_OBJS = $(random01_OBJECTS)
>>> +LINK_LIBS = $(random01_LDLIBS)
>>> +
>>> +random01$(EXEEXT): $(random01_OBJECTS) $(random01_DEPENDENCIES)
>>> +       @rm -f random01$(EXEEXT)
>>> +       $(make-exe)
>>> +
>>> +include $(top_srcdir)/../automake/local.am
>>> diff --git a/testsuites/libtests/random01/init.c
>>> b/testsuites/libtests/random01/init.c
>>> new file mode 100644
>>> index 0000000000..b874a497ee
>>> --- /dev/null
>>> +++ b/testsuites/libtests/random01/init.c
>>> @@ -0,0 +1,105 @@
>>> +/*
>>> + * Copyright (c) 2017 embedded brains GmbH.  All rights reserved.
>>> + *
>>> + *  embedded brains GmbH
>>> + *  Dornierstr. 4
>>> + *  82178 Puchheim
>>> + *  Germany
>>> + *  <rt...@embedded-brains.de>
>>> + *
>>> + * The license and distribution terms for this file may be
>>> + * found in the file LICENSE in this distribution or at
>>> + * http://www.rtems.org/license/LICENSE.
>>> + */
>>> +
>>> +#ifdef HAVE_CONFIG_H
>>> +  #include "config.h"
>>> +#endif
>>> +
>>> +#include "tmacros.h"
>>> +
>>> +#include <rtems.h>
>>> +#include <unistd.h>
>>> +#include <assert.h>
>>> +
>>> +const char rtems_test_name[] = "RANDOM 1";
>>> +
>>> +/* forward declarations to avoid warnings */
>>> +static rtems_task Init(rtems_task_argument argument);
>>> +
>>> +#define TEST_MAX_BYTES 32
>>> +#define TEST_GUARD_BYTES 32
>>> +#define TEST_GUARD 0xA5
>>> +
>>> +static char entropy_buffer1 [TEST_MAX_BYTES + TEST_GUARD_BYTES];
>>> +static char entropy_buffer2 [TEST_MAX_BYTES + TEST_GUARD_BYTES];
>>> +static char guard_buffer [TEST_MAX_BYTES + TEST_GUARD_BYTES];
>>> +
>>> +static void test_getentropy(size_t nr_bytes)
>>> +{
>>> +  int rv;
>>> +  size_t try = 1;
>>> +
>>> +  /*
>>> +   * For very small patterns, the probability that two random patterns are 
>>> the
>>> +   * same is quite high. Therefore retry the test for these a few times.
>>> +   */
>>> +  if (nr_bytes < 4) {
>>> +    try = 4;
>>> +  }
>>> +
>>> +  do {
>>> +    --try;
>>> +
>>> +    /* Fill buffers with guard pattern */
>>> +    memset(entropy_buffer1, TEST_GUARD, sizeof(entropy_buffer1));
>>> +    memset(entropy_buffer2, TEST_GUARD, sizeof(entropy_buffer2));
>>> +    memset(guard_buffer, TEST_GUARD, sizeof(entropy_buffer2));
>>> +
>>> +    /* Get entropy with the given size */
>>> +    rv = getentropy(entropy_buffer1, nr_bytes);
>>> +    assert(rv == 0);
>>> +    rv = getentropy(entropy_buffer2, nr_bytes);
>>> +    assert(rv == 0);
>>> +
>>> +    /* Check guard pattern */
>>> +    rv = memcmp(entropy_buffer1 + nr_bytes, guard_buffer + nr_bytes,
>>> +        sizeof(entropy_buffer1) - nr_bytes);
>>> +    assert(rv == 0);
>>> +    rv = memcmp(entropy_buffer2 + nr_bytes, guard_buffer + nr_bytes,
>>> +        sizeof(entropy_buffer2) - nr_bytes);
>>> +    assert(rv == 0);
>>> +
>>> +    /* Make sure that buffers are not the same */
>>> +    rv = memcmp(entropy_buffer1, entropy_buffer2, sizeof(entropy_buffer1));
>>> +  } while (try > 0 && rv == 0);
>>> +  assert(rv != 0);
>>> +}
>>> +
>>> +static void Init(rtems_task_argument arg)
>>> +{
>>> +  volatile size_t i;
>>> +
>>> +  TEST_BEGIN();
>>> +
>>> +  for (i=1; i <= TEST_MAX_BYTES; ++i) {
>>> +    test_getentropy(i);
>>> +  }
>>> +
>>> +  TEST_END();
>>> +
>>> +  rtems_test_exit(0);
>>> +}
>>> +
>>> +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
>>> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>>> +
>>> +#define CONFIGURE_MAXIMUM_TASKS 1
>>> +
>>> +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
>>> +
>>> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>>> +
>>> +#define CONFIGURE_INIT
>>> +
>>> +#include <rtems/confdefs.h>
>>> diff --git a/testsuites/libtests/random01/random01.doc
>>> b/testsuites/libtests/random01/random01.doc
>>> new file mode 100644
>>> index 0000000000..957da9a680
>>> --- /dev/null
>>> +++ b/testsuites/libtests/random01/random01.doc
>>> @@ -0,0 +1,12 @@
>>> +This file describes the directives and concepts tested by this test set.
>>> +
>>> +test set name: random01
>>> +
>>> +directives:
>>> +
>>> +  getentropy
>>> +
>>> +concepts:
>>> +
>>> +  Ensure that getentropy() works with different sizes of arrays and 
>>> delivers
>>> +  different values on multiple calls.
>>> diff --git a/testsuites/libtests/random01/random01.scn
>>> b/testsuites/libtests/random01/random01.scn
>>> new file mode 100644
>>> index 0000000000..f8cd99f18b
>>> --- /dev/null
>>> +++ b/testsuites/libtests/random01/random01.scn
>>> @@ -0,0 +1,2 @@
>>> +*** TEST RANDOM 1 ***
>>> +*** END OF TEST RANDOM 1 ***
>>> --
>>> 2.12.3
>>>
>>> _______________________________________________
>>> devel mailing list
>>> devel@rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
>
> --
> --------------------------------------------
> embedded brains GmbH
> Christian Mauderer
> Dornierstr. 4
> D-82178 Puchheim
> Germany
> email: christian.maude...@embedded-brains.de
> Phone: +49-89-18 94 741 - 18
> Fax:   +49-89-18 94 741 - 08
> PGP: Public key available on request.
>
> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to