/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
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 Marvell 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 OWNER 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 <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>

//#define _HOST_COMPILER
#include "bootstrap_def.h"
#include "soc_spec.h"

#include "polarssl/sha2.h"
#include "polarssl/rsa.h"
//#include "polarssl/aes.h"

#define VERSION_NUMBER	"2.0"

/* Security context */
typedef struct secCtx_t {
	rsa_context		rsa;
//	aes_context		aes;

} secCtx_t;


/* Globals */
char	*buf_in = NULL;


/*
 * 8 bit checksum
 */
MV_U8 checksum8(void *start, MV_U32 len, MV_U8 csum)
{
	register MV_U8	sum = csum;
	MV_U8 *startp = (MV_U8 *)start;

	do {
		sum += *startp;
		startp++;

	} while(--len);

	return (sum);
}

/*
 * 32 bit checksum
 */
MV_U32 checksum32(void *start, MV_U32 len, MV_U32 csum)
{
	register MV_U32	sum = csum;
	MV_U32	*startp = (MV_U32 *)start;

	do {
		sum += *startp;
		startp++;
		len -= 4;

	} while(len);

	return (sum);
}

/*******************************************************************************
*    print_usage
*******************************************************************************/
void print_usage(char *myname)
{
	printf("Marvell boot image parser version %s\n", VERSION_NUMBER);
	printf("Usage: \n");
	printf("%s [options] <file_name>\n\n", myname);
	printf("Options: \n");
	printf("-t        Test secure signatures\n");
	printf("-k <idx>  Use \"idx\" as CSK array index. Index range: 0 - 15\n");
	printf("\n");
}

/*******************************************************************************
*    parse_main_header
*******************************************************************************/
int parse_main_header(pBHR_t	pHdr)
{
	MV_U8	chksum = 0;
	MV_U8	tmp8;

	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "                     MAIN HEADER\n");
	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "[00:00]Image type:                ");
	switch (pHdr->blockID) {
		case IBR_HDR_I2C_ID:
			fprintf(stdout, "I2C\n");
			break;
		case IBR_HDR_SPI_ID:
			fprintf(stdout, "SPI/NOR\n");
			break;
		case IBR_HDR_NAND_ID:
			fprintf(stdout, "NAND\n");
			break;
		case IBR_HDR_SATA_ID:
			fprintf(stdout, "SATA\n");
			break;
		case IBR_HDR_PEX_ID:
			fprintf(stdout, "PEX\n");
			break;
		case IBR_HDR_UART_ID:
			fprintf(stdout, "UART\n");
			break;
		case IBR_HDR_MMC_ID:
			fprintf(stdout, "MMC\n");
			break;
		default:
			fprintf(stdout, "UNKNOWN\n");
			return -1;
	}

	fprintf(stdout, "[01:01]Flags   :                  0x%02X\n",
		pHdr->flags);
	fprintf(stdout, "[03:02]NAND page size:            %d (0x%04X)\n",
		pHdr->nandPageSize, pHdr->nandPageSize);
	fprintf(stdout, "[07:04]Boot image size:           %d (0x%08X)\n",
		pHdr->blockSize, pHdr->blockSize);
	fprintf(stdout, "[08:08]Header version:            %d (0x%02X)\n",
		pHdr->version, pHdr->version);
	fprintf(stdout, "[11:09]Headers block size:        %d (0x%06X)\n",
		MAIN_HDR_GET_LEN(pHdr), MAIN_HDR_GET_LEN(pHdr));
	if (pHdr->blockID == IBR_HDR_SATA_ID) {
		fprintf(stdout, "[15:12]Source address (LBA):      0x%08X\n",
			pHdr->sourceAddr);
	} else {
		fprintf(stdout, "[15:12]Source address:            0x%08X\n",
			pHdr->sourceAddr);
	}
	fprintf(stdout, "[19:16]Destination address:       0x%08X\n",
		pHdr->destinationAddr);
	fprintf(stdout, "[23:20]Execution address:         0x%08X\n",
		pHdr->executionAddr);
	fprintf(stdout, "[24:24]Options :                  0x%02X\n",
		pHdr->options);
	fprintf(stdout, "[25:25]NAND Block size:           %d (%dKB)\n",
		pHdr->nandBlockSize, pHdr->nandBlockSize*64);
	fprintf(stdout, "[26:26]NAND Technology:           %d (%s)\n",
		pHdr->nandTechnology, pHdr->blockID == IBR_HDR_NAND_ID ?
			(pHdr->nandTechnology == 1 ? "MLC" : "SLC") : "N/A");
	fprintf(stdout, "[27:27]Reserved:                  0x%02X\n",
		pHdr->rsvd4);
	fprintf(stdout, "[29:28]Reserved:                  0x%04X\n",
		pHdr->rsvd2);
	fprintf(stdout, "[30:30]Num of ext. headers:       %d (0x%02X)\n",
		pHdr->ext, pHdr->ext);
	fprintf(stdout, "[31:31]Header block checksum:     0x%02X",
		pHdr->checkSum);

	tmp8 = pHdr->checkSum;
	pHdr->checkSum = 0;
	chksum = checksum8((void *)pHdr, MAIN_HDR_GET_LEN(pHdr), 0);
	fprintf(stdout, " (%s)\n", tmp8 == chksum ? "GOOD" : "BAD");

	return 0;
}

/*******************************************************************************
*    parse_sec_header
*******************************************************************************/
int parse_sec_header(pSecExtBHR_T	pHdr)
{

	int 	cskKey;

	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "             SECURITY HEADER @ %p\n", (void*)((char*)pHdr - buf_in));
	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "[0000:0000]Header type:           0x%02X\n",
		pHdr->head.type);
	fprintf(stdout, "[0003:0001]Header length:         %d (0x%06X)\n",
		EXT_HDR_GET_LEN(&pHdr->head), EXT_HDR_GET_LEN(&pHdr->head));
	fprintf(stdout, "[0004:0004]Image is encrypted:    %s\n",
		pHdr->encrypt == 1 ? "YES" : "NOT");
	fprintf(stdout, "[0005:0005]Reserved:              0x%02X\n",
		pHdr->rsrvd0);
	fprintf(stdout, "[0007:0006]Reserved:              0x%04X\n",
		pHdr->rsrvd1);
	fprintf(stdout, "[0531:0008]Public Key:            %02X %02X %02X %02X ...\n",
		((pHdr->pubKey).Key)[0], ((pHdr->pubKey).Key)[1], ((pHdr->pubKey).Key)[2], ((pHdr->pubKey).Key)[3]);
	fprintf(stdout, "[0532:0532]JTAG enabled:          %s [%d]\n",
		pHdr->jtagEn != 0 ? "YES" : "NOT", pHdr->jtagEn);
	fprintf(stdout, "[0533:0533]Reserved:              0x%02X\n",
		pHdr->rsrvd2);
	fprintf(stdout, "[0535:0534]Reserved:              0x%04X\n",
		pHdr->rsrvd3);
	fprintf(stdout, "[0539:0536]Box ID:                0x%08X\n",
		pHdr->boxId);
	fprintf(stdout, "[0543:0540]Flash ID:              0x%08X\n",
		pHdr->flashId);
	fprintf(stdout, "[0799:0544]Header signature:      %02X %02X %02X %02X ...\n",
		pHdr->hdrSign[0], pHdr->hdrSign[1], pHdr->hdrSign[2], pHdr->hdrSign[3]);
	fprintf(stdout, "[1055:0800]Image signature:       %02X %02X %02X %02X ...\n",
		pHdr->imgSign[0], pHdr->imgSign[1], pHdr->imgSign[2], pHdr->imgSign[3]);
	for(cskKey = 0; cskKey < CSK_KEY_NUM; cskKey++) {
		fprintf(stdout, "[%d:%d]CSK Key[%d]:           %s%02X %02X %02X %02X ...\n",
				(1056 + 524*(cskKey+1) - 1), (1056 + 524*cskKey), cskKey,  cskKey > 9 ? "" :" ", ((pHdr->cskArray[cskKey]).Key)[0],
				((pHdr->cskArray[cskKey]).Key)[1], ((pHdr->cskArray[cskKey]).Key)[2], ((pHdr->cskArray[cskKey]).Key)[3]);
	}
	fprintf(stdout, "[9695:9440]CSK signature:         %02X %02X %02X %02X ...\n",
			pHdr->cskBlockSign[0], pHdr->cskBlockSign[1], pHdr->cskBlockSign[2], pHdr->cskBlockSign[3]);
	fprintf(stdout, "[9696]More headers follow:        %s\n",
			pHdr->tail.nextHdr != 0 ? "YES" : "NOT");
	fprintf(stdout, "[9697]Reserved:                   0x%02X\n",
			pHdr->tail.delay);
	fprintf(stdout, "[9699:9698]Reserved:              0x%04X\n",
			pHdr->tail.rsvd2);
	return 0;
}

/*******************************************************************************
*    parse_bin_header
*******************************************************************************/
int parse_bin_header(headExtBHR_t	*pHdr)
{
	tailExtBHR_t	*pTail = (tailExtBHR_t *)((MV_U8 *)pHdr +
			EXT_HDR_GET_LEN(pHdr) - sizeof(tailExtBHR_t));
	MV_U8		*buf = (MV_U8 *)(pHdr + 1);
	int		code_bytes = (EXT_HDR_GET_LEN(pHdr) - EXT_HDR_BASE_SIZE - (*buf + 1)*4);

	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "             BINARY HEADER @ %p\n", (void*)((char*)pHdr - buf_in));
	fprintf(stdout, "-----------------------------------------------------\n");

	fprintf(stdout, "[0000:0000]Header type:           0x%02X\n",
		pHdr->type);
	fprintf(stdout, "[0003:0001]Header length:         %d (0x%06X)\n",
		EXT_HDR_GET_LEN(pHdr), EXT_HDR_GET_LEN(pHdr));
	fprintf(stdout, "[0004:0004]Number of parameters:  %d (0x%06X)\n",
		*buf, *buf);
	fprintf(stdout, "[0005:0005]Reserved:              0x%02X\n",
		*(buf + 1));
	fprintf(stdout, "[0007:0005]Reserved:              0x%04X\n",
		*(MV_U16 *)(buf + 2));
	if (*buf != 0)
		fprintf(stdout, "[%04d:0008]Parameters\n", (7 + (*buf)*4));
	fprintf(stdout, "[%04d:%04d]ARM Code link offset:  %p\n",
		(8 + (*buf)*4), (code_bytes + 8 + (*buf)*4), (void*)((char*)pHdr - buf_in) + 8 + (*buf)*4);
	fprintf(stdout, "[%04d:%04d]More headers follow:   %s\n",
		EXT_HDR_GET_LEN(pHdr) - 4, EXT_HDR_GET_LEN(pHdr) - 4, pTail->nextHdr != 0 ? "YES" : "NOT");
	fprintf(stdout, "[%04d:%04d]Reserved:              0x%02X\n",
		EXT_HDR_GET_LEN(pHdr) - 3, EXT_HDR_GET_LEN(pHdr) - 3, pTail->delay);
	fprintf(stdout, "[%04d:%04d]Reserved:              0x%04X\n",
		EXT_HDR_GET_LEN(pHdr) - 2, EXT_HDR_GET_LEN(pHdr) - 1, pTail->rsvd2);

	return 0;
}

/*******************************************************************************
*    parse_reg_header
*******************************************************************************/
int parse_reg_header(headExtBHR_t	*pHdr)
{
	tailExtBHR_t	*pTail = (tailExtBHR_t *)((MV_U8 *)pHdr +
				EXT_HDR_GET_LEN(pHdr) - sizeof(tailExtBHR_t));
	int		num_elem = (EXT_HDR_GET_LEN(pHdr) - EXT_HDR_BASE_SIZE)/8;

	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "             REGISTER HEADER @ %p\n", (void *)((char *)pHdr - buf_in));
	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "[0000:0000]Header type:           0x%02X\n",
		pHdr->type);
	fprintf(stdout, "[0003:0001]Header length:         %d (0x%06X)\n",
		EXT_HDR_GET_LEN(pHdr), EXT_HDR_GET_LEN(pHdr));
	fprintf(stdout, "[%04d:0004]Num of ADDR-VAL pairs: %d (0x%02X)\n",
		(num_elem * 8 + 3), num_elem, num_elem);
	num_elem = num_elem * 8 + 4;
	fprintf(stdout, "[%04d:%04d]More headers follow:   %s\n",
		num_elem, num_elem, pTail->nextHdr != 0 ? "YES" : "NOT");
	fprintf(stdout, "[%04d:%04d]Delay(mS):             0x%02X\n",
		num_elem + 1, num_elem + 1, pTail->delay);
	fprintf(stdout, "[%04d:%04d]Reserved:              0x%04X\n",
		num_elem + 3, num_elem + 2, pTail->rsvd2);

	return 0;
}

/*******************************************************************************
* verify_rsa_signature - check the image/header RSA signature
*******************************************************************************/
int verify_rsa_signature (secCtx_t *pSecCtx, MV_U8 *start, MV_U32 len, MV_U8 *sign)
{
	unsigned char   sha256[32];

	memset(sha256, 0, 32 * sizeof(unsigned char));

	sha2(start, len, sha256, 0);

	return (rsa_pkcs1_verify(&pSecCtx->rsa, RSA_PUBLIC, RSA_SHA256, 32, sha256, sign));
}

/*******************************************************************************
* verify_sec_header - check the secure header fields
*******************************************************************************/
int verify_sec_header (BHR_t *pHdr, int csk_idx)
{
	MV_U32		rsaKeyLen = 0;
	int			rsaModLen, rsaExpLen;
	secExtBHR_t	*pSecHdr = (secExtBHR_t *)(pHdr + 1);
	secCtx_t 	secCtx;
	secCtx_t 	secCtxCSK;
	unsigned char	buf256[256];
	unsigned char	buf32[32];
	int		i;

	if (pSecHdr->head.type != EXT_HDR_TYP_SECURITY)
		return 0;

	memset(buf256, 0, 256 * sizeof(unsigned char));
	memset(buf32,  0, 32  * sizeof(unsigned char));

	/* RSA public key should be in DER format with 2-bytes length field */
	if ((((pSecHdr->pubKey).Key)[0] != 0x30) ||
	(((pSecHdr->pubKey).Key)[1] != 0x82)) {
		fprintf(stderr,"\nError: Bad RSA key (KAK)!\n");
		return -1;
	}

	/* DER format fields verification */
	rsaModLen = (((pSecHdr->pubKey).Key)[6] << 8) + ((pSecHdr->pubKey).Key)[7];
	if (rsaModLen > RSA_MAX_KEY_LEN_BYTES) {
		fprintf(stderr,"\nError: Bad RSA key Modulo length (%d) - KAK!\n", rsaModLen);
		return -1;
	}

	rsaExpLen = (((pSecHdr->pubKey).Key)[10 + rsaModLen] << 8) +
		((pSecHdr->pubKey).Key)[11 + rsaModLen];
	if (rsaExpLen > RSA_MAX_KEY_LEN_BYTES) {
		fprintf(stderr,"\nError: Bad RSA key Exponent length (%d) - KAK!\n", rsaExpLen);
		return -1;
	}

	/* Load the RSA public key */
	rsa_init(&secCtx.rsa, RSA_PKCS_V15, 0, NULL, NULL);
	if ((0 != mpi_read_binary(&secCtx.rsa.N, &((pSecHdr->pubKey).Key)[8], rsaModLen)) ||
	(0 != mpi_read_binary(&secCtx.rsa.E, &((pSecHdr->pubKey).Key)[12 + rsaModLen], rsaExpLen))) {
		fprintf(stderr,"\nError: RSA Library error!\n");
		return -1;
	}

	secCtx.rsa.len = (mpi_msb(&secCtx.rsa.N) + 7) >> 3; /* key lenght in bytes */

	/* Key length should include 4 bytes of the data block header */
	rsaKeyLen = (((pSecHdr->pubKey).Key)[2] << 8) + ((pSecHdr->pubKey).Key)[3] + 4;
	sha2((unsigned char *)((pSecHdr->pubKey).Key), rsaKeyLen, buf32, 0);
	fprintf(stdout, "----------------------------------------------------------\n");
	fprintf(stdout,"RSA key SHA256 digest for eFuse (KAK):\n  BE FULL: ");
	for (i = 0; i < 32; i++) {
		fprintf(stdout,"%02x ", buf32[i]);
		if (i == 15)
			fprintf(stdout,"\n           ");
	}
	fprintf(stdout,"\n  LE REGS: ");
	for (i = 0; i < 8; i++) {
		fprintf(stdout,"[%d]%08x ", i, *(MV_U32*)(buf32 + i*4));
		if (i == 3)
			fprintf(stdout,"\n           ");
	}
	fprintf(stdout,"\n");
	fprintf(stdout, "----------------------------------------------------------\n");

	memset(buf32,  0, 32  * sizeof(unsigned char));

	/* CSK array signature should be cleared in the header before verification */
	memcpy(buf256, pSecHdr->cskBlockSign, 256);
	memset(pSecHdr->cskBlockSign, 0, 256);

	/* Verify the CSK array signature */
	fprintf(stdout,"CSK array RSA signature verification - ");
	if (verify_rsa_signature(&secCtx, (MV_U8 *)pHdr + sizeof(BHR_t) + CSK_BLOCK_OFFSET, CSK_BLOCK_SIZE, buf256) != 0) {
		fprintf(stderr,"FAILED\n");
		return -1;
	}
	fprintf(stdout,"PASSED\n");

//// Work with CSK
	memcpy(pSecHdr->cskBlockSign, buf256, 256); /* Restore CSK array signature */
	memset(buf256, 0, 256 * sizeof(unsigned char));
	memset(buf32,  0, 32  * sizeof(unsigned char));

	/* RSA public key should be in DER format with 2-bytes length field */
	if ((((pSecHdr->cskArray[csk_idx]).Key)[0] != 0x30) ||
	(((pSecHdr->cskArray[csk_idx]).Key)[1] != 0x82)) {
		fprintf(stderr,"\nError: Bad RSA key (CSK-%d)!\n", csk_idx);
		return -1;
	}

	/* DER format fields verification */
	rsaModLen = (((pSecHdr->cskArray[csk_idx]).Key)[6] << 8) + ((pSecHdr->cskArray[csk_idx]).Key)[7];
	if (rsaModLen > RSA_MAX_KEY_LEN_BYTES) {
		fprintf(stderr,"\nError: Bad RSA key Modulo length (%d) - CSK-%d!\n", rsaModLen, csk_idx);
		return -1;
	}

	rsaExpLen = (((pSecHdr->cskArray[csk_idx]).Key)[10 + rsaModLen] << 8) +
		((pSecHdr->cskArray[csk_idx]).Key)[11 + rsaModLen];
	if (rsaExpLen > RSA_MAX_KEY_LEN_BYTES) {
		fprintf(stderr,"\nError: Bad RSA key Exponent length (%d) - CSK-%d!\n", rsaExpLen, csk_idx);
		return -1;
	}

	/* Load the RSA public key */
	rsa_init(&secCtx.rsa, RSA_PKCS_V15, 0, NULL, NULL);
	if ((0 != mpi_read_binary(&secCtx.rsa.N, &((pSecHdr->cskArray[csk_idx]).Key)[8], rsaModLen)) ||
	(0 != mpi_read_binary(&secCtx.rsa.E, &((pSecHdr->cskArray[csk_idx]).Key)[12 + rsaModLen], rsaExpLen))) {
		fprintf(stderr,"\nError: RSA Library error!\n");
		return -1;
	}

	secCtx.rsa.len = (mpi_msb(&secCtx.rsa.N) + 7) >> 3; /* key length in bytes */

	/* Key length should include 4 bytes of the data block header */
	rsaKeyLen = (((pSecHdr->cskArray[csk_idx]).Key)[csk_idx] << 8) + ((pSecHdr->cskArray[csk_idx]).Key)[3] + 4;
	sha2((unsigned char *)((pSecHdr->cskArray[csk_idx]).Key), rsaKeyLen, buf32, 0);
	fprintf(stdout, "----------------------------------------------------------\n");
	fprintf(stdout,"RSA key SHA256 digest for eFuse (CSK-%d):\n  BE FULL: ", csk_idx);
	for (i = 0; i < 32; i++) {
		fprintf(stdout,"%02x ", buf32[i]);
		if (i == 15)
			fprintf(stdout,"\n           ");
	}
	fprintf(stdout,"\n  LE REGS: ");
	for (i = 0; i < 8; i++) {
		fprintf(stdout,"[%d]%08x ", i, *(MV_U32*)(buf32 + i*4));
		if (i == 3)
			fprintf(stdout,"\n           ");
	}
	fprintf(stdout,"\n");
	fprintf(stdout, "----------------------------------------------------------\n");

	/* Header signature should be cleared in the header before verification */
	memcpy(buf256, pSecHdr->hdrSign, 256);
	memset(pSecHdr->hdrSign, 0, 256);

	/* Verify the header block signature using CSK array key entry */
	fprintf(stdout,"Headers block RSA signature verification - ");
	if (verify_rsa_signature(&secCtx, (MV_U8 *)pHdr, MAIN_HDR_GET_LEN(pHdr), buf256) != 0) {
		fprintf(stderr,"FAILED\n");
		return -1;
	}
	fprintf(stdout,"PASSED\n");

	/* Verify image using CSK array key entry */
	fprintf(stdout,"Boot image RSA signature verification - ");
	if (verify_rsa_signature(&secCtx, buf_in + pHdr->sourceAddr, pHdr->blockSize - 4, pSecHdr->imgSign) != 0) {
		fprintf(stderr,"FAILED\n");
		return -1;
	}
	fprintf(stdout,"PASSED\n");

	return 0;
}

/*******************************************************************************
*    main
*******************************************************************************/
int main(int argc, char **argv)
{
	int			i, csk_idx=-1, rsa_verify = 0;
	char		*fname;
	int			fin;
	struct stat	fs_stat;
	int			error = 1;

	int			optch; /* command-line option char */
	static char	optstring[] = "tk:";
	pBHR_t		pHdr = NULL;
	MV_U32		chksum, chksum2;

	while ((optch = getopt(argc, argv, optstring)) != -1) {
		char	*endptr = NULL;

		switch (optch) {
		case 't': /* test */
			rsa_verify = 1;
			break;

		case 'k': /* CSK index */
			csk_idx = strtoul(optarg, &endptr, 10);
			break;

		default:
			print_usage(argv[0]);
			exit(EXIT_FAILURE);
		}
	} /* parse command-line options */

	if ((fname = argv[optind]) == NULL) {
		fprintf(stderr,"\nError: Missing filename\n");
		goto end;
	}

	if ((fin = open(fname, O_RDONLY)) < 0) {
		fprintf(stderr,"\nError: Failed to open %s file\n", fname);
		goto end;
	}

	if (0 != fstat(fin, &fs_stat)) {
		fprintf(stderr,"\n Error: Failed to get %s status\n", fname);
		goto end;
	}

	buf_in = (char*)malloc(fs_stat.st_size);
	if (buf_in == NULL) {
		fprintf(stderr,"\nError: Failed to allocate buffer for %s file\n", fname);
		goto end;
	}

	if (read(fin, buf_in, fs_stat.st_size) != fs_stat.st_size) {
		fprintf(stderr,"\nError: Failed to read %s file\n", fname);
		goto end;
	}

	fprintf(stdout,"#####################################################\n");
	fprintf(stdout,"Marvell Boot Image checker version %s \n", VERSION_NUMBER);
	fprintf(stdout,"-----------------------------------------------------\n");
	fprintf(stdout,"Image file:\n%s\nFile size = %d bytes\n", fname, (int)fs_stat.st_size);

	pHdr = (pBHR_t)buf_in;
	if (parse_main_header(pHdr) < 0)
		goto end;

	if (pHdr->ext != 0) {
	/* Header extentions exist */
		headExtBHR_t	*pHead = (headExtBHR_t*)(pHdr + 1);
		tailExtBHR_t	*pTail;

		for(;pHead != 0;) {
			pTail = (tailExtBHR_t *)((MV_U8 *)pHead +
					EXT_HDR_GET_LEN(pHead) -
					sizeof(tailExtBHR_t));

			switch (pHead->type) {
				case EXT_HDR_TYP_SECURITY:
					if (parse_sec_header((pSecExtBHR_T)pHead) < 0)
						goto end;
					break;
				case EXT_HDR_TYP_BINARY:
					if (parse_bin_header(pHead) < 0)
						goto end;
					break;
				case EXT_HDR_TYP_REGISTER:
					if (parse_reg_header(pHead) < 0)
						goto end;
					break;
				default:
					fprintf(stderr,"\nError: Unknown header type 0x%x\n", pHead->type);
					goto end;
			}

			if (pTail->nextHdr != 0)
				pHead = (headExtBHR_t*)(pTail + 1);
			else
				pHead = NULL;
		}
	/* Header extentions exist */
	}

	fprintf(stdout, "-----------------------------------------------------\n");
	fprintf(stdout, "             BOOT IMAGE @ %p\n",
	pHdr->blockID == IBR_HDR_SATA_ID ?
		(void *)((char *)pHdr - buf_in + pHdr->sourceAddr * 512) :
		(void *)((char *)pHdr - buf_in + pHdr->sourceAddr));
	fprintf(stdout, "-----------------------------------------------------\n");

	chksum = *(MV_U32*)(buf_in + fs_stat.st_size - 4);
	if (pHdr->blockID == IBR_HDR_SATA_ID)
		chksum2 = checksum32((void *)(buf_in + pHdr->sourceAddr * 512), pHdr->blockSize - 4, 0);
	else
		chksum2 = checksum32((void *)(buf_in + pHdr->sourceAddr), pHdr->blockSize - 4, 0);

	fprintf(stdout, "Binary image checksum = 0x%08X (%s)\n", chksum, chksum == chksum2 ? "GOOD" : "BAD");

	if (rsa_verify != 0) {
		if ((csk_idx < 0) || (csk_idx > 15)) {
			fprintf(stderr,"\nError: Bad CSK array index (%d). 0 < idx < 15!\n", csk_idx);
			error = 1;
			goto end;
		}
		error = verify_sec_header(pHdr, csk_idx);
	} else
		error = 0;

end:
	if (fin)
		close(fin);
	if (buf_in)
		free(buf_in);

	if (error == 0) {
		fprintf(stdout,"************ T E S T   S U C C E E D E D ************\n");
		exit(EXIT_SUCCESS);
	} else {
		fprintf(stdout,"*************** T E S T   F A I L E D ***************\n");
		exit(EXIT_FAILURE);
	}
}
