diff options
-rw-r--r-- | GNUmakefile | 4 | ||||
-rw-r--r-- | aes_keywrap.c | 2 | ||||
-rw-r--r-- | asn1.c | 4 | ||||
-rw-r--r-- | asn1_internal.h | 1 | ||||
-rw-r--r-- | csprng.c | 3 | ||||
-rw-r--r-- | ecdsa.c | 4 | ||||
-rw-r--r-- | errorstrings.c | 6 | ||||
-rw-r--r-- | hal.h | 4 | ||||
-rw-r--r-- | hal_io_eim.c | 6 | ||||
-rw-r--r-- | hash.c | 4 | ||||
-rw-r--r-- | modexp.c | 2 | ||||
-rw-r--r-- | pbkdf2.c | 6 | ||||
-rw-r--r-- | tests/GNUmakefile | 2 | ||||
-rw-r--r-- | tests/test-aes-key-wrap.c | 1 | ||||
-rw-r--r-- | tests/test-bus.c | 163 | ||||
-rw-r--r-- | tests/test-ecdsa.c | 7 | ||||
-rw-r--r-- | tests/test-hash.c | 1 | ||||
-rw-r--r-- | tests/test-pbkdf2.c | 8 | ||||
-rw-r--r-- | tests/test-rsa.c | 2 | ||||
-rw-r--r-- | utils/GNUmakefile | 2 | ||||
-rw-r--r-- | utils/cores.c | 81 |
21 files changed, 255 insertions, 58 deletions
diff --git a/GNUmakefile b/GNUmakefile index 5c14b11..bb3821e 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -37,7 +37,7 @@ IO_OBJ_I2C = hal_io_i2c.o IO_OBJ = ${IO_OBJ_EIM} TFMDIR := $(abspath ../thirdparty/libtfm) -CFLAGS := -g3 -Wall -fPIC -std=c99 -I${TFMDIR} -DHAL_ECDSA_DEBUG_ONLY_STATIC_TEST_VECTOR_RANDOM=1 +CFLAGS += -g3 -Wall -fPIC -std=c99 -I${TFMDIR} -DHAL_ECDSA_DEBUG_ONLY_STATIC_TEST_VECTOR_RANDOM=1 LDFLAGS := -g3 -L${TFMDIR} -ltfm all: ${LIB} @@ -47,7 +47,7 @@ all: ${LIB} ${OBJ}: ${INC} ${LIB}: ${OBJ} - ar rcs $@ $^ + ${AR} rcs $@ $^ asn1.o rsa.o ecdsa.o: asn1_internal.h diff --git a/aes_keywrap.c b/aes_keywrap.c index 324b4ba..f8ce63c 100644 --- a/aes_keywrap.c +++ b/aes_keywrap.c @@ -41,8 +41,6 @@ * then split the result back to 64-bit blocks immediately afterwards. */ -#include <stdio.h> -#include <stdlib.h> #include <stdint.h> #include <string.h> #include <assert.h> @@ -46,11 +46,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <stdio.h> #include <stdint.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> #include <assert.h> #include "hal.h" diff --git a/asn1_internal.h b/asn1_internal.h index f6e470f..5dc2a13 100644 --- a/asn1_internal.h +++ b/asn1_internal.h @@ -42,7 +42,6 @@ #define _HAL_ASN1_H_ #include <stdint.h> -#include <stdlib.h> #include <tfm.h> @@ -32,10 +32,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <assert.h> #include <stdint.h> -#include <stddef.h> -#include <stdio.h> #include "hal.h" #include "verilog_constants.h" @@ -65,11 +65,7 @@ * in a relatively type-safe manner before calling libtom. */ -#include <stdio.h> #include <stdint.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> #include <assert.h> #include "hal.h" diff --git a/errorstrings.c b/errorstrings.c index 1a234dd..5a79546 100644 --- a/errorstrings.c +++ b/errorstrings.c @@ -32,12 +32,6 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <assert.h> - #include "hal.h" #define DEFINE_HAL_ERROR(_code_,_text_) \ @@ -60,7 +60,7 @@ #define I2C_INTERFACE_VERSION "0.10" #define TRNG_NAME "trng " -#define TRNG_VERSION "0.50" +#define TRNG_VERSION "0.51" #define AVALANCHE_ENTROPY_NAME "extnoise" #define AVALANCHE_ENTROPY_VERSION "0.10" @@ -75,7 +75,7 @@ #define SHA1_VERSION "0.50" #define SHA256_NAME "sha2-256" -#define SHA256_VERSION "0.80" +#define SHA256_VERSION "0.81" #define SHA512_NAME "sha2-512" #define SHA512_VERSION "0.80" diff --git a/hal_io_eim.c b/hal_io_eim.c index 7d2e32a..fbf1d67 100644 --- a/hal_io_eim.c +++ b/hal_io_eim.c @@ -34,12 +34,8 @@ */ #include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> #include <stdint.h> -#include <arpa/inet.h> +#include <arpa/inet.h> /* htonl/ntohl */ #include "novena-eim.h" #include "hal.h" @@ -37,10 +37,6 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> #include "hal.h" #include "verilog_constants.h" @@ -41,8 +41,6 @@ #include <stdio.h> #include <stdint.h> -#include <stdlib.h> -#include <string.h> #include <assert.h> #include "hal.h" @@ -34,13 +34,7 @@ #include <assert.h> #include <string.h> -#include <stdio.h> -#include <stdlib.h> #include <stdint.h> -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> #include "hal.h" #include "verilog_constants.h" diff --git a/tests/GNUmakefile b/tests/GNUmakefile index a1cd4b4..2361ede 100644 --- a/tests/GNUmakefile +++ b/tests/GNUmakefile @@ -27,7 +27,7 @@ INC = ../hal.h LIB = ../libhal.a -BIN = test-aes-key-wrap test-hash test-pbkdf2 test-rsa test-ecdsa +BIN = test-aes-key-wrap test-hash test-pbkdf2 test-rsa test-ecdsa test-bus CFLAGS = -g3 -Wall -fPIC -std=c99 -I.. diff --git a/tests/test-aes-key-wrap.c b/tests/test-aes-key-wrap.c index 3e9b10d..caf3a2c 100644 --- a/tests/test-aes-key-wrap.c +++ b/tests/test-aes-key-wrap.c @@ -33,7 +33,6 @@ */ #include <stdio.h> -#include <stdlib.h> #include <stdint.h> #include <string.h> #include <assert.h> diff --git a/tests/test-bus.c b/tests/test-bus.c new file mode 100644 index 0000000..bffe5d3 --- /dev/null +++ b/tests/test-bus.c @@ -0,0 +1,163 @@ +/* + * test-bus.c + * ---------- + * Test raw read/write performance across the EIM or FMC bus. + * + * Copyright (c) 2015, NORDUnet A/S All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the NORDUnet nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> +#include <assert.h> + +#include <sys/time.h> + +#include <hal.h> + +#define TEST_NUM_ROUNDS 2000000 + +/* + * Sanity test - are the cores present, and can we get a random number? + */ + +static int sanity(void) +{ + uint32_t rnd, data; + int n = 10; + hal_error_t err; + + if (((err = hal_io_expected(BOARD_ADDR_NAME0, (const uint8_t *) NOVENA_BOARD_NAME0, 4)) != HAL_OK) || + ((err = hal_io_expected(CSPRNG_ADDR_NAME0, (const uint8_t *) CSPRNG_NAME0, 4)) != HAL_OK)) { + printf("initialization failed (is the bitstream loaded?): %s\n", + hal_error_string(err)); + return 1; + } + + if ((err = hal_io_wait(CSPRNG_ADDR_STATUS, CSPRNG_STATUS_VALID, &n)) != HAL_OK) { + printf("waiting for CSPRNG: %s\n", hal_error_string(err)); + return 1; + } + if ((err = hal_io_read(CSPRNG_ADDR_RANDOM, (uint8_t *) &rnd, sizeof(rnd))) != HAL_OK) { + printf("reading CSPRNG: %s\n", hal_error_string(err)); + return 1; + } + + if ((err = hal_io_write(BOARD_ADDR_DUMMY, (const uint8_t *) &rnd, sizeof(rnd))) != HAL_OK) { + printf("writing dummy: %s\n", hal_error_string(err)); + return 1; + } + if ((err = hal_io_read(BOARD_ADDR_DUMMY, (uint8_t *) &data, sizeof(data))) != HAL_OK) { + printf("reading dummy: %s\n", hal_error_string(err)); + return 1; + } + + if (data != rnd) { + printf("Data bus fail: expected %08lx, got %08lx, diff %08lx\n", rnd, data, data ^ rnd); + return 1; + } + + return 0; +} + +/* + * Time a test. + */ + +static void _time_check(char *label, const struct timeval t0, const int err) +{ + struct timeval t; + float rounds; + gettimeofday(&t, NULL); + t.tv_sec -= t0.tv_sec; + t.tv_usec -= t0.tv_usec; + if (t.tv_usec < 0) { + t.tv_usec += 1000000; + t.tv_sec -= 1; + } + rounds = (float)TEST_NUM_ROUNDS/((float)t.tv_sec + ((float)t.tv_usec / 1000000)); + printf("%s%lu.%06lu seconds, %u/sec\n", label, t.tv_sec, t.tv_usec, (unsigned)rounds); +} + +#define time_check(_label_, _expr_) \ + do { \ + struct timeval _t; \ + gettimeofday(&_t, NULL); \ + int _err = (_expr_); \ + _time_check(_label_, _t, _err); \ + err |= _err; \ + } while (0) + +/* + * Read and write over and over again. + */ + +static int test_read(void) +{ + uint32_t i, data; + hal_error_t err; + + for (i = 0; i < TEST_NUM_ROUNDS; ++i) { + if ((err = hal_io_read(BOARD_ADDR_DUMMY, (uint8_t *) &data, sizeof(data))) != HAL_OK) { + printf("reading dummy: %s\n", hal_error_string(err)); + return 1; + } + } + + return 0; +} + +static int test_write(void) +{ + uint32_t i; + hal_error_t err; + + for (i = 0; i < TEST_NUM_ROUNDS; ++i) { + if ((err = hal_io_write(BOARD_ADDR_DUMMY, (const uint8_t *) &i, sizeof(i))) != HAL_OK) { + printf("writing dummy: %s\n", hal_error_string(err)); + return 1; + } + } + + return 0; +} + +int main(void) +{ + int err = 0; + + if (sanity() != 0) + return 1; + + time_check("read ", test_read()); + time_check("write ", test_write()); + + return err; +} diff --git a/tests/test-ecdsa.c b/tests/test-ecdsa.c index e940498..4a0a361 100644 --- a/tests/test-ecdsa.c +++ b/tests/test-ecdsa.c @@ -46,10 +46,7 @@ #include <stdio.h> #include <stdint.h> -#include <stdlib.h> #include <string.h> -#include <assert.h> -#include <errno.h> #include <sys/time.h> @@ -285,7 +282,7 @@ static void _time_check(const struct timeval t0, const int ok) struct timeval t; gettimeofday(&t, NULL); t.tv_sec -= t0.tv_sec; - t.tv_usec = t0.tv_usec; + t.tv_usec -= t0.tv_usec; if (t.tv_usec < 0) { t.tv_usec += 1000000; t.tv_sec -= 1; @@ -327,11 +324,13 @@ int main(int argc, char *argv[]) int ok = 1; +#if HAL_ECDSA_DEBUG_ONLY_STATIC_TEST_VECTOR_RANDOM /* * Test vectors (where we have them). */ for (int i = 0; i < sizeof(ecdsa_tc)/sizeof(*ecdsa_tc); i++) time_check(test_against_static_vectors(&ecdsa_tc[i])); +#endif /* * Generate/sign/verify test for each curve. diff --git a/tests/test-hash.c b/tests/test-hash.c index 3f45911..9e71a0e 100644 --- a/tests/test-hash.c +++ b/tests/test-hash.c @@ -33,7 +33,6 @@ */ #include <stdio.h> -#include <stdlib.h> #include <stdint.h> #include <string.h> #include <assert.h> diff --git a/tests/test-pbkdf2.c b/tests/test-pbkdf2.c index 744ca47..112775a 100644 --- a/tests/test-pbkdf2.c +++ b/tests/test-pbkdf2.c @@ -32,15 +32,9 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <assert.h> -#include <string.h> #include <stdio.h> -#include <stdlib.h> #include <stdint.h> -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> +#include <string.h> #include <hal.h> diff --git a/tests/test-rsa.c b/tests/test-rsa.c index c6bf97a..c7103c9 100644 --- a/tests/test-rsa.c +++ b/tests/test-rsa.c @@ -40,9 +40,7 @@ #include <stdio.h> #include <stdint.h> -#include <stdlib.h> #include <string.h> -#include <assert.h> #include <errno.h> #include <sys/time.h> diff --git a/utils/GNUmakefile b/utils/GNUmakefile index 8ebebf1..dcc6679 100644 --- a/utils/GNUmakefile +++ b/utils/GNUmakefile @@ -27,7 +27,7 @@ INC = ../hal.h LIB = ../libhal.a -BIN = eim_peek_poke +BIN = eim_peek_poke cores CFLAGS = -g3 -Wall -fPIC -std=c99 -I.. diff --git a/utils/cores.c b/utils/cores.c new file mode 100644 index 0000000..da823a7 --- /dev/null +++ b/utils/cores.c @@ -0,0 +1,81 @@ +/* + * cores.c + * ------- + * Report which cores are present on the FPGA. + * + * Copyright (c) 2015, NORDUnet A/S All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the NORDUnet nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <errno.h> + +#include <sys/time.h> + +#include <hal.h> + +off_t cores[] = { + BOARD_ADDR_BASE, + COMM_ADDR_BASE, + SHA1_ADDR_BASE, + SHA256_ADDR_BASE, + SHA512_ADDR_BASE, + TRNG_ADDR_BASE, + ENTROPY1_ADDR_BASE, + ENTROPY2_ADDR_BASE, + MIXER_ADDR_BASE, + CSPRNG_ADDR_BASE, + AES_ADDR_BASE, + CHACHA_ADDR_BASE, + MODEXPS6_ADDR_BASE +}; + +int main(int argc, char *argv[]) +{ + uint8_t name[9] = {0}, version[5] = {0}; + hal_error_t err; + int i; + + /* + * Initialize EIM and report what cores we've got. + */ + for (i = 0; i < sizeof(cores)/sizeof(cores[0]); ++i) { + if ((err = hal_io_read(cores[i], name, 8)) != HAL_OK || + (err = hal_io_read(cores[i] + 2, version, 4)) != HAL_OK) { + printf("hal_io_read failed: %s\n", hal_error_string(err)); + return 1; + } + + if (name[0] != 0) + printf("%08lx: %8s %4s\n", cores[i], name, version); + } + + return 0; +} |