123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /* SPDX-License-Identifier: BSD-2-Clause */
- /***********************************************************************
- * Copyright (c) 2017-2018, Intel Corporation
- *
- * All rights reserved.
- ***********************************************************************/
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
- #include <stdlib.h>
- #include <stdio.h>
- #include <arpa/inet.h>
- #include <setjmp.h>
- #include <cmocka.h>
- #include "tss2_sys.h"
- #include "sysapi_util.h"
- #define MAX_SIZE_CTX 4096
- /**
- *
- */
- static int
- CopyCommandHeader_sys_setup (void **state)
- {
- _TSS2_SYS_CONTEXT_BLOB *sys_ctx;
- UINT32 size_ctx;
- size_ctx = Tss2_Sys_GetContextSize (MAX_SIZE_CTX);
- sys_ctx = calloc (1, size_ctx);
- assert_non_null (sys_ctx);
- /**
- * This is the important part: the CopyCommandHeader function builds up
- * the command buffer in the memory pointed to by tpmInitBuffPtr. This
- * must point to the data after the context structure.
- */
- sys_ctx->cmdBuffer = (UINT8*) (sys_ctx + sizeof (_TSS2_SYS_CONTEXT_BLOB));
- InitSysContextFields (sys_ctx);
- InitSysContextPtrs (sys_ctx, size_ctx);
- *state = sys_ctx;
- return 0;
- }
- static int
- CopyCommandHeader_sys_teardown (void **state)
- {
- TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT*)*state;
- if (sys_ctx)
- free (sys_ctx);
- return 0;
- }
- /**
- * CopyCommandHeader creates the standard TPM command header (tag, size,
- * command_code) to the data buffer in the context structure. It also
- * advances the 'nextData' pointer to the address after the header. This
- * test will fail if the nextData pointer isn't set as expected
- */
- static void
- CopyCommandHeader_nextData_unit (void **state)
- {
- _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB *)*state;
- TPM2_CC cc = TPM2_CC_GetCapability;
- CopyCommandHeader (sys_ctx, cc);
- assert_int_equal (sys_ctx->nextData, sizeof (TPM20_Header_In));
- }
- /**
- * After a call to CopyCommandHeader the tag in the TPM20_Header_In portion of
- * the cmdBuffer member of the sys context should be TPM2_ST_NO_SESSIONS
- * transformed into network byte order.
- */
- static void
- CopyCommandHeader_tag_unit (void **state)
- {
- _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state;
- TPM2_CC cc = TPM2_CC_GetCapability;
- TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer;
- /* The TSS code uses a custom function to convert stuff to network byte
- * order but we can just use htons. Not sure why we don't use htons/l
- * everywhere.
- */
- TPMI_ST_COMMAND_TAG tag_net = htons (TPM2_ST_NO_SESSIONS);
- CopyCommandHeader (sys_ctx, cc);
- assert_int_equal (tag_net, header->tag);
- }
- /**
- * After a call to CopyCommandHeader the commandCode in the TPM20_Header_In
- * portion of the cmdBuffer member of the sys context should be the command
- * code parameter in network byte order.
- */
- static void
- CopyCommandHeader_commandcode_unit (void **state)
- {
- _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state;
- TPM2_CC cc = TPM2_CC_GetCapability;
- TPM2_CC cc_net = htonl (cc);
- TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer;
- CopyCommandHeader (sys_ctx, cc);
- assert_int_equal (cc_net, header->commandCode);
- }
- int
- main (int argc, char* argv[])
- {
- const struct CMUnitTest tests[] = {
- cmocka_unit_test_setup_teardown (CopyCommandHeader_nextData_unit,
- CopyCommandHeader_sys_setup,
- CopyCommandHeader_sys_teardown),
- cmocka_unit_test_setup_teardown (CopyCommandHeader_tag_unit,
- CopyCommandHeader_sys_setup,
- CopyCommandHeader_sys_teardown),
- cmocka_unit_test_setup_teardown (CopyCommandHeader_commandcode_unit,
- CopyCommandHeader_sys_setup,
- CopyCommandHeader_sys_teardown),
- };
- return cmocka_run_group_tests (tests, NULL, NULL);
- }
|