aboutsummaryrefslogtreecommitdiff
path: root/tests/test-rpc_get_random.c
blob: ad0c6e80e48a2ceb005bfc371a27287793536d1d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * test-rpc_get_random.c
 * ---------------------
 * Test code for RPC interface to Cryptech hash cores.
 *
 * Copyright (c) 2016, 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 <hal.h>

#define DEFAULT_LEN 16

static void hexdump(uint8_t *buf, int len)
{
    for (int i = 0; i < len; ++i)
        printf("%02x%c", buf[i], ((i & 0x07) == 0x07) ? '\n' : ' ');
    if ((len & 0x07) != 0)
        printf("\n");
}

int main(int argc, char *argv[])
{
    int len = 0;
    if (argc > 1)
        len = atoi(argv[1]);
    if (len <= 0)       /* no arg, or bad arg */
        len = DEFAULT_LEN;

    uint8_t rnd[len];

#define check(op) { hal_error_t err; if ((err = (op)) != HAL_OK) { printf("%s: %s\n", #op, hal_error_string(err)); return 1; } }

    check(hal_rpc_client_init());
    check(hal_rpc_get_random(rnd, sizeof(rnd)));

    hexdump(rnd, len);

    check(hal_rpc_client_close());
    return 0;
}
span class="w"> init_test(hal_core_t *core) { hal_error_t err; printf("Trying to init to the memory in continuous mode.\n"); if ((err = hal_mkmif_init(core)) != HAL_OK) { printf("hal_mkmif_init: %s\n", hal_error_string(err)); return err; } return HAL_OK; } static hal_error_t write_test(hal_core_t *core) { uint32_t write_data; uint32_t write_address; int i; hal_error_t err; for (write_data = 0x01020304, write_address = 0, i = 0; i < 0x10; write_data += 0x01010101, write_address += 4, ++i) { printf("Trying to write 0x%08x to memory address 0x%08x.\n", (unsigned int)write_data, (unsigned int)write_address); if ((err = hal_mkmif_write_word(core, write_address, write_data)) != HAL_OK) { printf("hal_mkmif_write: %s\n", hal_error_string(err)); return err; } } return HAL_OK; } static hal_error_t read_test(hal_core_t *core) { uint32_t read_data; uint32_t read_address; int i; hal_error_t err; for (read_address = 0, i = 0; i < 0x10; read_address += 4, ++i) { printf("Trying to read from memory address 0x%08x.\n", (unsigned int)read_address); if ((err = hal_mkmif_read_word(core, read_address, &read_data)) != HAL_OK) { printf("hal_mkmif_read: %s\n", hal_error_string(err)); return err; } printf("Data read: 0x%08x\n", (unsigned int)read_data); } return HAL_OK; } static hal_error_t write_read_test(hal_core_t *core) { uint32_t data; uint32_t readback; hal_error_t err; printf("Trying to write 0xdeadbeef to the memory and then read back.\n"); data = 0xdeadbeef; if ((err = hal_mkmif_write_word(core, 0x00000000, data)) != HAL_OK) { printf("write error: %s\n", hal_error_string(err)); return err; } if ((err = hal_mkmif_read_word(core, 0x00000000, &readback)) != HAL_OK) { printf("read error: %s\n", hal_error_string(err)); return err; } if (readback != data) { printf("read %08x, expected %08x\n", (unsigned int)readback, (unsigned int)data); return HAL_ERROR_IO_UNEXPECTED; } return HAL_OK; } int main(void) { hal_core_t *core = hal_core_find(MKMIF_NAME, NULL); if (core == NULL) { printf("MKMIF core not present, not testing.\n"); return HAL_ERROR_CORE_NOT_FOUND; } hal_io_set_debug(1); return sclk_test(core, SCLK_DIV) || init_test(core) || write_read_test(core) || write_test(core) || read_test(core); }