summaryrefslogtreecommitdiff
path: root/libfwupdater/tests/fwpkg_tests.c
blob: 035668ac2c5e9c9926fa836bc4eaace73c4a0077 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// SPDX-License-Identifier: GPL-2.0 OR Apache-2.0
/*
 * Copyright 2023 Qorvo US, Inc.
 *
 */

#include <stddef.h>
#include <qmrom_spi.h>
#include <qmrom_log.h>
#include <qmrom_utils.h>

#include <fwupdater.h>

#include "unit_tests.h"

#define PLD_CHK_PLD_SIZE 16
#define PLD_CHK_TOTAL_SIZE \
	(sizeof(struct fw_pkg_payload_chunk_t) + PLD_CHK_PLD_SIZE)

void run_fwupdater_download_fwpkg_test(void *spi_handle)
{
	uint8_t rx[STC_LEN + sizeof(struct fw_pkg_hdr_t)] = { 0 };
	uint8_t tx[STC_LEN + sizeof(struct fw_pkg_hdr_t)] = {
		0x80, 0x00, sizeof(struct fw_pkg_hdr_t), 0x00
	};
	struct fw_pkg_hdr_t *fwpkg = (struct fw_pkg_hdr_t *)&tx[STC_LEN];

	/* Setup the expected fw package */
	fwpkg->magic = CRYPTO_FIRMWARE_PACK_MAGIC_VALUE;
	fwpkg->version = CRYPTO_FIRMWARE_PACK_VERSION;
	fwpkg->enc_mode = CRYPTO_FIRMWARE_PACK_ENC_MODE_ENCRYPTED;
	fwpkg->package_type = CRYPTO_FIRMWARE_PACK_PACKAGE_TYPE_ICV;
	fwpkg->enc_mode = CRYPTO_FIRMWARE_PACK_ENC_MODE_ENCRYPTED;
	fwpkg->enc_algo = CRYPTO_FIRMWARE_PACK_ENC_ALGO_128BIT_AES_CTR;
	strcpy((char *)fwpkg->enc_data, "encrypted data");
	strcpy((char *)fwpkg->fw_version, "firmware version");
	fwpkg->payload_len = 0xDEADBEEF;
	strcpy((char *)fwpkg->tag, "AES-CMAC Tag");

	qmrom_spi_wait_for_ready_line(spi_handle, 100);
	qmrom_spi_transfer(spi_handle, (char *)rx, (char *)tx, sizeof(tx));
	LOG_INFO("received:\n");
	hexdump(LOG_INFO, rx, sizeof(tx));

	LOG_INFO("%s done\n", __func__);
}

void run_fwupdater_download_img_hdr_test(void *spi_handle)
{
	char rx[STC_LEN + CRYPTO_FIRMWARE_IMAGE_HDR_TOTAL_SIZE] = { 0 };
	char tx[STC_LEN + CRYPTO_FIRMWARE_IMAGE_HDR_TOTAL_SIZE] = {
		(char)0x80, 0x00, CRYPTO_FIRMWARE_IMAGE_HDR_TOTAL_SIZE, 0x00
	};
	struct fw_pkg_img_hdr_t *imghdr =
		(struct fw_pkg_img_hdr_t *)&tx[STC_LEN];

	/* Setup the expected fw package */
	imghdr->magic = CRYPTO_FIRMWARE_IMAGE_MAGIC_VALUE;
	imghdr->version = CRYPTO_FIRMWARE_IMAGE_VERSION;
	imghdr->cert_chain_length = CRYPTO_IMAGES_CERT_PKG_SIZE;
	imghdr->cert_chain_offset = 0xDEADBEEF;
	imghdr->num_descs = 1;
	imghdr->descs[0].offset = 0xDEADBEEF;
	imghdr->descs[0].length = 0xDEADBEEF;

	qmrom_spi_wait_for_ready_line(spi_handle, 100);
	qmrom_spi_transfer(spi_handle, rx, tx, sizeof(tx));
	LOG_INFO("received:\n");
	hexdump(LOG_INFO, rx, sizeof(tx));

	LOG_INFO("%s done\n", __func__);
}

void run_fwupdater_download_pld_chk_test(void *spi_handle)
{
	char rx[STC_LEN + PLD_CHK_TOTAL_SIZE] = { 0 };
	char tx[STC_LEN + PLD_CHK_TOTAL_SIZE] = { (char)0x80, 0x00,
						  PLD_CHK_TOTAL_SIZE, 0x00 };
	struct fw_pkg_payload_chunk_t *pldchk =
		(struct fw_pkg_payload_chunk_t *)&tx[STC_LEN];

	/* Setup the expected fw package */
	pldchk->magic = CRYPTO_FIRMWARE_CHUNK_MAGIC_VALUE;
	pldchk->version = CRYPTO_FIRMWARE_CHUNK_VERSION;
	pldchk->length = PLD_CHK_PLD_SIZE;
	strcpy((char *)pldchk->payload, "payload");

	qmrom_spi_wait_for_ready_line(spi_handle, 100);
	qmrom_spi_transfer(spi_handle, rx, tx, sizeof(tx));
	LOG_INFO("received:\n");
	hexdump(LOG_INFO, rx, sizeof(tx));

	LOG_INFO("%s done\n", __func__);
}