blob: 2e9ff0b526705279fe5dd0921db2054a9666ee0c [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/***********************************************************************;
* Copyright (c) 2015 - 2018, Intel Corporation
* All rights reserved.
***********************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <inttypes.h>
#include <limits.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include <cmocka.h>
#include "tss2_tcti.h"
#include "tss2_tcti_swtpm.h"
#include "tss2-tcti/tcti-common.h"
#include "tss2-tcti/tcti-swtpm.h"
#include "util/key-value-parse.h"
/*
* This function is defined in the tcti-swtpm module but not exposed through
* the header.
*/
TSS2_RC
swtpm_kv_callback (const key_value_t *key_value,
void *user_data);
/*
* This tests our ability to handle conf strings that have a port
* component. In this case the 'conf_str_to_host_port' function
* should set the 'port' parameter and so we check to be sure it's
* set.
*/
static void
conf_str_to_host_port_success_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=127.0.0.1,port=2321";
swtpm_conf_t swtpm_conf = { 0 };
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_int_equal (swtpm_conf.port, 2321);
assert_string_equal (swtpm_conf.host, "127.0.0.1");
}
/*
* This tests our ability to handle conf strings that don't have the port
* component of the URI. In this case the 'conf_str_to_host_port' function
* should not touch the 'port' parameter and so we check to be sure it's
* unchanged.
*/
#define NO_PORT_VALUE 646
static void
conf_str_to_host_port_no_port_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=127.0.0.1";
swtpm_conf_t swtpm_conf = {
.host = "foo",
.port = NO_PORT_VALUE,
};
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_string_equal (swtpm_conf.host, "127.0.0.1");
assert_int_equal (swtpm_conf.port, NO_PORT_VALUE);
}
/*
* This tests our ability to handle conf strings that have an IPv6 address
* and port component. In this case the 'conf_str_to_host_port' function
* should set the 'hostname' parameter and so we check to be sure it's
* set without the [] brackets.
*/
static void
conf_str_to_host_ipv6_port_success_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=::1,port=2321";
swtpm_conf_t swtpm_conf = { 0 };
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_int_equal (swtpm_conf.port, 2321);
assert_string_equal (swtpm_conf.host, "::1");
}
/*
* This tests our ability to handle conf strings that have an IPv6 address
* but no port component. In this case the 'conf_str_to_host_port' function
* should not touch the 'port' parameter and so we check to be sure it's
* unchanged.
*/
static void
conf_str_to_host_ipv6_port_no_port_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=::1";
swtpm_conf_t swtpm_conf = { .port = NO_PORT_VALUE };
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_int_equal (swtpm_conf.port, NO_PORT_VALUE);
assert_string_equal (swtpm_conf.host, "::1");
}
/*
* The 'conf_str_to_host_port' function rejects ports over UINT16_MAX.
*/
static void
conf_str_to_host_port_invalid_port_large_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=127.0.0.1,port=99999";
swtpm_conf_t swtpm_conf = { 0 };
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
}
/* The 'conf_str_to_host_port' function rejects URIs with port == 0 */
static void
conf_str_to_host_port_invalid_port_0_test (void **state)
{
TSS2_RC rc;
char conf[] = "host=127.0.0.1,port=0";
swtpm_conf_t swtpm_conf = { 0 };
rc = parse_key_value_string (conf, swtpm_kv_callback, &swtpm_conf);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
}
/* When passed all NULL values ensure that we get back the expected RC. */
static void
tcti_swtpm_init_all_null_test (void **state)
{
TSS2_RC rc;
rc = Tss2_Tcti_Swtpm_Init (NULL, NULL, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
}
/*
* Determine the size of a TCTI context structure. Requires calling the
* initialization function for the device TCTI with the first parameter
* (the TCTI context) NULL.
*/
static void
tcti_swtpm_init_size_test (void **state)
{
size_t tcti_size = 0;
TSS2_RC ret = TSS2_RC_SUCCESS;
ret = Tss2_Tcti_Swtpm_Init (NULL, &tcti_size, NULL);
assert_int_equal (ret, TSS2_RC_SUCCESS);
assert_int_equal (tcti_size, sizeof (TSS2_TCTI_SWTPM_CONTEXT));
}
/*
* Wrap the 'connect' system call. The mock queue for this function must have
* an integer to return as a response.
*/
int
__wrap_connect (int sockfd,
const struct sockaddr *addr,
socklen_t addrlen)
{
return mock_type (int);
}
/*
* Wrap the 'recv' system call. The mock queue for this function must have an
* integer return value (the number of byts recv'd), as well as a pointer to
* a buffer to copy data from to return to the caller.
*/
ssize_t
__wrap_read (int sockfd,
void *buf,
size_t len)
{
ssize_t ret = mock_type (ssize_t);
uint8_t *buf_in = mock_ptr_type (uint8_t*);
memcpy (buf, buf_in, ret);
return ret;
}
/*
* Wrap the 'send' system call. The mock queue for this function must have an
* integer to return as a response.
*/
ssize_t
__wrap_write (int sockfd,
const void *buf,
size_t len)
{
return mock_type (TSS2_RC);
}
/*
* This is a utility function used by other tests to setup a TCTI context. It
* effectively wraps the init / allocate / init pattern as well as priming the
* mock functions necessary for a the successful call to
* 'Tss2_Tcti_Swtpm_Init'.
*/
static TSS2_TCTI_CONTEXT*
tcti_swtpm_init_from_conf (const char *conf)
{
size_t tcti_size = 0;
uint8_t recv_buf[4] = { 0 };
TSS2_RC ret = TSS2_RC_SUCCESS;
TSS2_TCTI_CONTEXT *ctx = NULL;
printf ("%s: before first init\n", __func__);
ret = Tss2_Tcti_Swtpm_Init (NULL, &tcti_size, NULL);
assert_true (ret == TSS2_RC_SUCCESS);
ctx = calloc (1, tcti_size);
assert_non_null (ctx);
/*
* two calls to connect, one for the data socket, one for the command
* socket
*/
will_return (__wrap_connect, 0);
will_return (__wrap_connect, 0);
/*
* one control command is sent on init (5 byte write, 4 byte read)
*/
will_return (__wrap_write, 5);
will_return (__wrap_read, 4);
will_return (__wrap_read, recv_buf);
printf ("%s: before second_init\n", __func__);
ret = Tss2_Tcti_Swtpm_Init (ctx, &tcti_size, conf);
printf ("%s: after second init\n", __func__);
assert_int_equal (ret, TSS2_RC_SUCCESS);
return ctx;
}
/*
* This is a utility function to setup the "default" TCTI context.
*/
static int
tcti_swtpm_setup (void **state)
{
printf ("%s: before tcti_swtpm_init_from_conf\n", __func__);
*state = tcti_swtpm_init_from_conf ("host=127.0.0.1,port=666");
printf ("%s: done\n", __func__);
return 0;
}
static void
tcti_swtpm_init_null_conf_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = tcti_swtpm_init_from_conf (NULL);
assert_non_null (ctx);
free (ctx);
}
/*
* This test excersises the Tss2_Tcti_Info function
*/
const TSS2_TCTI_INFO *Tss2_Tcti_Info (void);
static void
tcti_swtpm_get_info_test (void **state)
{
const TSS2_TCTI_INFO *info;
info = Tss2_Tcti_Info ();
assert_string_equal (info->name, "tcti-swtpm");
assert_int_equal (info->init, &Tss2_Tcti_Swtpm_Init);
}
/*
* This is a utility function to teardown a TCTI context allocated by the
* tcti_swtpm_setup function.
*/
static int
tcti_swtpm_teardown (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
Tss2_Tcti_Finalize (ctx);
free (ctx);
return 0;
}
/*
* This test exercised a failed connect check in the Tss2_Tcti_Swtpm_Init function
*/
static void
tcti_swtpm_init_fail_connect_test (void **state)
{
size_t tcti_size = 0;
TSS2_RC ret = TSS2_RC_SUCCESS;
TSS2_TCTI_CONTEXT *ctx = NULL;
/* get tcti size */
ret = Tss2_Tcti_Swtpm_Init (NULL, &tcti_size, NULL);
assert_true (ret == TSS2_RC_SUCCESS);
ctx = calloc (1, tcti_size);
assert_non_null (ctx);
/* first connect fails */
will_return (__wrap_connect, -1);
ret = Tss2_Tcti_Swtpm_Init (ctx, &tcti_size, "host=127.0.0.1,port=666");
assert_int_equal (ret, TSS2_TCTI_RC_IO_ERROR);
/* second connect fails */
will_return (__wrap_connect, 0);
will_return (__wrap_connect, -1);
ret = Tss2_Tcti_Swtpm_Init (ctx, &tcti_size, "host=127.0.0.1,port=666");
assert_int_equal (ret, TSS2_TCTI_RC_IO_ERROR);
free(((TSS2_TCTI_SWTPM_CONTEXT*)ctx)->conf_copy);
free(ctx);
}
/*
* This test ensures that the GetPollHandles function in the device TCTI
* returns the expected value. Since this TCTI does not support async I/O
* on account of limitations in the kernel it just returns the
* NOT_IMPLEMENTED response code.
*/
static void
tcti_swtpm_get_poll_handles_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
size_t num_handles = 5;
TSS2_TCTI_POLL_HANDLE handles [5] = { 0 };
TSS2_RC rc;
rc = Tss2_Tcti_GetPollHandles (ctx, handles, &num_handles);
assert_int_equal (rc, TSS2_TCTI_RC_NOT_IMPLEMENTED);
}
/*
* This test exercises the null check of tcti_swtpm_receive ()
*/
static void
tcti_swtpm_receive_null_test (void **state)
{
TSS2_RC rc;
rc = Tss2_Tcti_Receive (NULL, NULL, NULL, TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
}
/*
*/
static void
tcti_swtpm_receive_null_size_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc;
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
rc = Tss2_Tcti_Receive (ctx,
NULL, /* NULL 'size' parameter */
NULL,
TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
rc = Tss2_Tcti_Receive (ctx,
NULL, /* NULL 'size' parameter */
(uint8_t*)1, /* non-NULL buffer */
TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
}
/*
* This test exercises the successful code path through the receive function.
*/
static void
tcti_swtpm_receive_success_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc = TSS2_RC_SUCCESS;
uint8_t response_in [] = { 0x80, 0x02,
0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x00, 0x00,
0x01, 0x02 };
size_t response_size = sizeof(response_in);
uint8_t response_out [12] = { 0 };
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
/* receive response header */
will_return (__wrap_read, 10);
will_return (__wrap_read, response_in);
/* receive remaining response */
will_return (__wrap_read, response_size - 10);
will_return (__wrap_read, &response_in [10]);
rc = Tss2_Tcti_Receive (ctx, &response_size, response_out, TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_memory_equal (response_in, response_out, response_size);
}
/*
*/
static void
tcti_swtpm_receive_size_success_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc = TSS2_RC_SUCCESS;
size_t response_size = 0;
uint8_t response_in [] = { 0x80, 0x02,
0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x00, 0x00,
0x01, 0x02 };
uint8_t response_out [12] = { 0 };
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
/* receive response header */
will_return (__wrap_read, 10);
will_return (__wrap_read, response_in);
rc = Tss2_Tcti_Receive (ctx, &response_size, NULL, TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_int_equal (response_size, 0xc);
/* receive remaining response */
will_return (__wrap_read, response_size - 10);
will_return (__wrap_read, &response_in [10]);
rc = Tss2_Tcti_Receive (ctx, &response_size, response_out, TSS2_TCTI_TIMEOUT_BLOCK);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_memory_equal (response_in, response_out, response_size);
}
/*
* This test causes the underlying 'read' call to return 0 / EOF when we
* call the TCTI 'receive' function. In this case the TCTI should return an
* IO error.
*/
static void
tcti_swtpm_receive_eof_first_read_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc;
/* output buffer for response */
uint8_t buf [TPM_HEADER_SIZE] = { 0 };
size_t size = sizeof (buf);
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
will_return (__wrap_read, 0);
will_return (__wrap_read, buf);
rc = Tss2_Tcti_Receive (ctx,
&size,
buf,
TSS2_TCTI_TIMEOUT_BLOCK);
assert_true (rc == TSS2_TCTI_RC_IO_ERROR);
}
/*
* This test causes the underlying 'read' call to return EOF but only after
* a successful read that gets us the response size. This results in the
* an IO_ERROR RC being returned.
*/
static void
tcti_swtpm_receive_eof_second_read_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc;
/* input response buffer */
uint8_t response_in [] = { 0x80, 0x02,
0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x00, 0x00,
0x01, 0x02,
/* simulator appends 4 bytes of 0's to every response */
0x00, 0x00, 0x00, 0x00 };
/* output response buffer */
uint8_t response_out [12] = { 0 };
size_t size = sizeof (response_out);
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
/* setup response size for first read */
will_return (__wrap_read, 4);
will_return (__wrap_read, &response_in [2]);
/* setup 0 for EOF on second read */
will_return (__wrap_read, 0);
will_return (__wrap_read, response_in);
rc = Tss2_Tcti_Receive (ctx,
&size,
response_out,
TSS2_TCTI_TIMEOUT_BLOCK);
assert_true (rc == TSS2_TCTI_RC_IO_ERROR);
}
/*
* This test exercises the (fake) timeout mechanism of the receive function.
*/
static void
tcti_swtpm_receive_timeout_try_again_test (void **state)
{
#ifdef TEST_FAPI_ASYNC
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc = TSS2_RC_SUCCESS;
/* Keep state machine check in `receive` from returning error. */
tcti_common->state = TCTI_STATE_RECEIVE;
rc = Tss2_Tcti_Receive (ctx, (size_t*) 1, NULL, TSS2_TCTI_TIMEOUT_NONE);
assert_int_equal (rc, TSS2_TCTI_RC_TRY_AGAIN);
#endif /* TEST_FAPI_ASYNC */
}
/*
* This test exercises the successful code path through the transmit function.
*/
static void
tcti_swtpm_transmit_success_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc = TSS2_RC_SUCCESS;
uint8_t command [] = { 0x80, 0x02,
0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x00, 0x00,
0x01, 0x02 };
size_t command_size = sizeof (command);
/* connect to tpm_sock */
will_return (__wrap_connect, 0);
/* send the command buffer */
will_return (__wrap_write, 0xc);
rc = Tss2_Tcti_Transmit (ctx, command_size, command);
assert_int_equal (rc, TSS2_RC_SUCCESS);
}
/*
* This test exercises the NULL checks of the transmit function.
*/
static void
tcti_swtpm_transmit_null_test (void **state)
{
TSS2_RC rc = TSS2_RC_SUCCESS;
rc = Tss2_Tcti_Transmit (NULL, 0, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
}
/*
* This test exercises the header check of the transmit function.
* Also it exercises a marshaling failure check.
*/
static void
tcti_swtpm_transmit_fail_header_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc = TSS2_RC_SUCCESS;
uint8_t command [] = { 0x80, 0x02,
0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x01, 0x02 };
size_t command_size = sizeof (command);
rc = Tss2_Tcti_Transmit (ctx, command_size, command);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
rc = Tss2_Tcti_Transmit (ctx, 0, command);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
}
/*
* This test exercises the successful code path through the tcti_control_command
* function
*/
TSS2_RC tcti_control_command (
TSS2_TCTI_CONTEXT *tctiContext,
uint32_t cmd_code, const void *cmd_sdu, size_t cmd_sdu_len,
uint32_t *resp_code, void *resp_sdu, size_t *resp_sdu_len);
static void
tcti_swtpm_control_command_success_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc = TSS2_RC_SUCCESS;
const uint32_t CMD_SET_BUFFERSIZE = 0x11;
uint32_t buffersize_in = 0;
uint8_t response[] = {0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00,
0x00, 0x00, 0x0A, 0x2A,
0x00, 0x00, 0x10, 0x00};
uint32_t respcode_out = 0;
size_t payload_len_out_expected = sizeof(response) - sizeof(respcode_out);
uint8_t payload_out[payload_len_out_expected];
size_t payload_len_out;
/*
* Here we send the command CMD_SET_BUFFERSIZE.
* Request
* 00 00 00 11 (command code CMD_SET_BUFFERSIZE)
* 00 00 00 00 (buffersize 0 -> do not set but query buffersize)
* Response
* 00 00 00 00 (response code success)
* 00 00 10 00 (payload, buffersize)
* 00 00 0A 2A (payload, minsize)
* 00 00 10 00 (payload, maxsize)
*/
will_return (__wrap_connect, 0);
will_return (__wrap_write, 8);
will_return (__wrap_read, 16);
will_return (__wrap_read, response);
rc = tcti_control_command (ctx, CMD_SET_BUFFERSIZE, &buffersize_in,
sizeof(buffersize_in), &respcode_out,
payload_out, &payload_len_out);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_int_equal (respcode_out, 0);
assert_int_equal (payload_len_out, payload_len_out_expected);
assert_int_equal (memcmp(payload_out,
response + sizeof(respcode_out),
payload_len_out),
0);
}
/*
* This test exercises the NULL checks for tctiContext and resp_sdu_len
*/
static void
tcti_swtpm_control_command_null_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc;
/* tcti context NULL */
rc = tcti_control_command (NULL, 0, NULL, 0, NULL, NULL, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
/* cmd_sdu NULL with cmd_sdu_len not 0 */
rc = tcti_control_command (ctx, 0, NULL, 4, NULL, NULL, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
}
/*
* This test exercises a failed receive for the two cases
* - too few bytes received
* - response code not success
*/
static void
tcti_swtpm_control_command_recv_fail_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc = TSS2_RC_SUCCESS;
const uint32_t CMD_CANCEL_TPM_CMD = 0x09;
uint32_t response = 0xFFFFFFFF;
uint32_t respcode_out = 0;
will_return (__wrap_connect, 0);
will_return (__wrap_write, 8);
will_return (__wrap_read, 0);
will_return (__wrap_read, response);
rc = tcti_control_command (ctx, CMD_CANCEL_TPM_CMD, NULL, 0, &respcode_out,
NULL, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_IO_ERROR);
will_return (__wrap_connect, 0);
will_return (__wrap_write, 8);
will_return (__wrap_read, 4);
will_return (__wrap_read, (uint8_t *) &response);
rc = tcti_control_command (ctx, CMD_CANCEL_TPM_CMD, NULL, 0, &respcode_out,
NULL, NULL);
assert_int_equal (rc, TSS2_TCTI_RC_IO_ERROR);
assert_int_equal (respcode_out, response);
}
/*
* This test checks the return code of tcti_swtpm_cancel
*/
static void
tcti_swtpm_cancel_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_RC rc = TSS2_RC_SUCCESS;
rc = Tss2_Tcti_Cancel (ctx);
assert_int_equal (rc, TSS2_TCTI_RC_NOT_IMPLEMENTED);
}
/*
* This test excersises all paths through the set locality function
*/
static void
tcti_swtpm_locality_test (void **state)
{
TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
TSS2_RC rc = TSS2_RC_SUCCESS;
uint32_t response;
/* test NULL check */
rc = Tss2_Tcti_SetLocality (NULL, 3);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
/* fail due to non-success response code */
response = 0xFFFFFFFF;
will_return (__wrap_connect, 0);
will_return (__wrap_write, 8);
will_return (__wrap_read, 4);
will_return (__wrap_read, (uint8_t *) &response);
rc = Tss2_Tcti_SetLocality (ctx, 3);
assert_int_equal (rc, TSS2_TCTI_RC_IO_ERROR);
/* success */
response = 0x00000000;
will_return (__wrap_connect, 0);
will_return (__wrap_write, 8);
will_return (__wrap_read, 4);
will_return (__wrap_read, (uint8_t *) &response);
rc = Tss2_Tcti_SetLocality (ctx, 3);
assert_int_equal (rc, TSS2_RC_SUCCESS);
/* put state machine into `receive` to provoke an bad sequence error. */
tcti_common->state = TCTI_STATE_RECEIVE;
rc = Tss2_Tcti_SetLocality (ctx, 3);
assert_int_equal (rc, TSS2_TCTI_RC_BAD_SEQUENCE);
}
int
main (int argc,
char *argv[])
{
const struct CMUnitTest tests[] = {
cmocka_unit_test (conf_str_to_host_port_success_test),
cmocka_unit_test (conf_str_to_host_port_no_port_test),
cmocka_unit_test (conf_str_to_host_ipv6_port_success_test),
cmocka_unit_test (conf_str_to_host_ipv6_port_no_port_test),
cmocka_unit_test (conf_str_to_host_port_invalid_port_large_test),
cmocka_unit_test (conf_str_to_host_port_invalid_port_0_test),
cmocka_unit_test (tcti_swtpm_init_all_null_test),
cmocka_unit_test (tcti_swtpm_init_size_test),
cmocka_unit_test (tcti_swtpm_init_null_conf_test),
cmocka_unit_test (tcti_swtpm_get_info_test),
cmocka_unit_test_setup_teardown (tcti_swtpm_init_fail_connect_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_get_poll_handles_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_null_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_null_size_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_success_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_size_success_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_eof_first_read_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_eof_second_read_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_receive_timeout_try_again_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_transmit_success_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_transmit_null_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_transmit_fail_header_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_control_command_success_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_control_command_null_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_control_command_recv_fail_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_cancel_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
cmocka_unit_test_setup_teardown (tcti_swtpm_locality_test,
tcti_swtpm_setup,
tcti_swtpm_teardown),
};
return cmocka_run_group_tests (tests, NULL, NULL);
}