2 * Image manipulator for Marvell SoCs
3 * supports Kirkwood, Dove, Armada 370, Armada XP, and Armada 38x
5 * (C) Copyright 2013 Thomas Petazzoni
6 * <thomas.petazzoni@free-electrons.com>
8 * SPDX-License-Identifier: GPL-2.0+
10 * Not implemented: support for the register headers in v1 images
13 #include "imagetool.h"
20 #ifdef CONFIG_KWB_SECURE
21 #include <openssl/bn.h>
22 #include <openssl/rsa.h>
23 #include <openssl/pem.h>
24 #include <openssl/err.h>
25 #include <openssl/evp.h>
27 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
28 static void RSA_get0_key(const RSA *r,
29 const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
40 void EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
42 EVP_MD_CTX_reset(ctx);
47 static struct image_cfg_element *image_cfg;
49 #ifdef CONFIG_KWB_SECURE
50 static int verbose_mode;
65 struct boot_mode boot_modes[] = {
76 struct nand_ecc_mode {
81 struct nand_ecc_mode nand_ecc_modes[] = {
89 /* Used to identify an undefined execution or destination address */
90 #define ADDR_INVALID ((uint32_t)-1)
92 #define BINARY_MAX_ARGS 8
94 /* In-memory representation of a line of the configuration file */
97 IMAGE_CFG_VERSION = 0x1,
101 IMAGE_CFG_NAND_BLKSZ,
102 IMAGE_CFG_NAND_BADBLK_LOCATION,
103 IMAGE_CFG_NAND_ECC_MODE,
104 IMAGE_CFG_NAND_PAGESZ,
113 IMAGE_CFG_JTAG_DELAY,
116 IMAGE_CFG_SEC_COMMON_IMG,
117 IMAGE_CFG_SEC_SPECIALIZED_IMG,
118 IMAGE_CFG_SEC_BOOT_DEV,
119 IMAGE_CFG_SEC_FUSE_DUMP,
124 static const char * const id_strs[] = {
125 [IMAGE_CFG_VERSION] = "VERSION",
126 [IMAGE_CFG_BOOT_FROM] = "BOOT_FROM",
127 [IMAGE_CFG_DEST_ADDR] = "DEST_ADDR",
128 [IMAGE_CFG_EXEC_ADDR] = "EXEC_ADDR",
129 [IMAGE_CFG_NAND_BLKSZ] = "NAND_BLKSZ",
130 [IMAGE_CFG_NAND_BADBLK_LOCATION] = "NAND_BADBLK_LOCATION",
131 [IMAGE_CFG_NAND_ECC_MODE] = "NAND_ECC_MODE",
132 [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE",
133 [IMAGE_CFG_BINARY] = "BINARY",
134 [IMAGE_CFG_PAYLOAD] = "PAYLOAD",
135 [IMAGE_CFG_DATA] = "DATA",
136 [IMAGE_CFG_BAUDRATE] = "BAUDRATE",
137 [IMAGE_CFG_DEBUG] = "DEBUG",
138 [IMAGE_CFG_KAK] = "KAK",
139 [IMAGE_CFG_CSK] = "CSK",
140 [IMAGE_CFG_CSK_INDEX] = "CSK_INDEX",
141 [IMAGE_CFG_JTAG_DELAY] = "JTAG_DELAY",
142 [IMAGE_CFG_BOX_ID] = "BOX_ID",
143 [IMAGE_CFG_FLASH_ID] = "FLASH_ID",
144 [IMAGE_CFG_SEC_COMMON_IMG] = "SEC_COMMON_IMG",
145 [IMAGE_CFG_SEC_SPECIALIZED_IMG] = "SEC_SPECIALIZED_IMG",
146 [IMAGE_CFG_SEC_BOOT_DEV] = "SEC_BOOT_DEV",
147 [IMAGE_CFG_SEC_FUSE_DUMP] = "SEC_FUSE_DUMP"
150 struct image_cfg_element {
151 enum image_cfg_type type;
153 unsigned int version;
154 unsigned int bootfrom;
157 unsigned int args[BINARY_MAX_ARGS];
161 unsigned int dstaddr;
162 unsigned int execaddr;
163 unsigned int nandblksz;
164 unsigned int nandbadblklocation;
165 unsigned int nandeccmode;
166 unsigned int nandpagesz;
167 struct ext_hdr_v0_reg regdata;
168 unsigned int baudrate;
170 const char *key_name;
175 bool sec_specialized_img;
176 unsigned int sec_boot_dev;
181 #define IMAGE_CFG_ELEMENT_MAX 256
184 * Utility functions to manipulate boot mode and ecc modes (convert
185 * them back and forth between description strings and the
186 * corresponding numerical identifiers).
189 static const char *image_boot_mode_name(unsigned int id)
193 for (i = 0; boot_modes[i].name; i++)
194 if (boot_modes[i].id == id)
195 return boot_modes[i].name;
199 int image_boot_mode_id(const char *boot_mode_name)
203 for (i = 0; boot_modes[i].name; i++)
204 if (!strcmp(boot_modes[i].name, boot_mode_name))
205 return boot_modes[i].id;
210 int image_nand_ecc_mode_id(const char *nand_ecc_mode_name)
214 for (i = 0; nand_ecc_modes[i].name; i++)
215 if (!strcmp(nand_ecc_modes[i].name, nand_ecc_mode_name))
216 return nand_ecc_modes[i].id;
220 static struct image_cfg_element *
221 image_find_option(unsigned int optiontype)
225 for (i = 0; i < cfgn; i++) {
226 if (image_cfg[i].type == optiontype)
227 return &image_cfg[i];
234 image_count_options(unsigned int optiontype)
237 unsigned int count = 0;
239 for (i = 0; i < cfgn; i++)
240 if (image_cfg[i].type == optiontype)
246 #if defined(CONFIG_KWB_SECURE)
248 static int image_get_csk_index(void)
250 struct image_cfg_element *e;
252 e = image_find_option(IMAGE_CFG_CSK_INDEX);
259 static bool image_get_spezialized_img(void)
261 struct image_cfg_element *e;
263 e = image_find_option(IMAGE_CFG_SEC_SPECIALIZED_IMG);
267 return e->sec_specialized_img;
273 * Compute a 8-bit checksum of a memory area. This algorithm follows
274 * the requirements of the Marvell SoC BootROM specifications.
276 static uint8_t image_checksum8(void *start, uint32_t len)
281 /* check len and return zero checksum if invalid */
293 static uint32_t image_checksum32(void *start, uint32_t len)
298 /* check len and return zero checksum if invalid */
302 if (len % sizeof(uint32_t)) {
303 fprintf(stderr, "Length %d is not in multiple of %zu\n",
304 len, sizeof(uint32_t));
311 len -= sizeof(uint32_t);
317 static uint8_t baudrate_to_option(unsigned int baudrate)
321 return MAIN_HDR_V1_OPT_BAUD_2400;
323 return MAIN_HDR_V1_OPT_BAUD_4800;
325 return MAIN_HDR_V1_OPT_BAUD_9600;
327 return MAIN_HDR_V1_OPT_BAUD_19200;
329 return MAIN_HDR_V1_OPT_BAUD_38400;
331 return MAIN_HDR_V1_OPT_BAUD_57600;
333 return MAIN_HDR_V1_OPT_BAUD_115200;
335 return MAIN_HDR_V1_OPT_BAUD_DEFAULT;
339 #if defined(CONFIG_KWB_SECURE)
340 static void kwb_msg(const char *fmt, ...)
346 vfprintf(stdout, fmt, ap);
351 static int openssl_err(const char *msg)
353 unsigned long ssl_err = ERR_get_error();
355 fprintf(stderr, "%s", msg);
356 fprintf(stderr, ": %s\n",
357 ERR_error_string(ssl_err, 0));
362 static int kwb_load_rsa_key(const char *keydir, const char *name, RSA **p_rsa)
371 snprintf(path, sizeof(path), "%s/%s.key", keydir, name);
372 f = fopen(path, "r");
374 fprintf(stderr, "Couldn't open RSA private key: '%s': %s\n",
375 path, strerror(errno));
379 rsa = PEM_read_RSAPrivateKey(f, 0, NULL, "");
381 openssl_err("Failure reading private key");
391 static int kwb_load_cfg_key(struct image_tool_params *params,
392 unsigned int cfg_option, const char *key_name,
395 struct image_cfg_element *e_key;
401 e_key = image_find_option(cfg_option);
403 fprintf(stderr, "%s not configured\n", key_name);
407 res = kwb_load_rsa_key(params->keydir, e_key->key_name, &key);
409 fprintf(stderr, "Failed to load %s\n", key_name);
418 static int kwb_load_kak(struct image_tool_params *params, RSA **p_kak)
420 return kwb_load_cfg_key(params, IMAGE_CFG_KAK, "KAK", p_kak);
423 static int kwb_load_csk(struct image_tool_params *params, RSA **p_csk)
425 return kwb_load_cfg_key(params, IMAGE_CFG_CSK, "CSK", p_csk);
428 static int kwb_compute_pubkey_hash(struct pubkey_der_v1 *pk,
429 struct hash_v1 *hash)
432 unsigned int key_size;
433 unsigned int hash_size;
436 if (!pk || !hash || pk->key[0] != 0x30 || pk->key[1] != 0x82)
439 key_size = (pk->key[2] << 8) + pk->key[3] + 4;
441 ctx = EVP_MD_CTX_create();
443 return openssl_err("EVP context creation failed");
445 EVP_MD_CTX_init(ctx);
446 if (!EVP_DigestInit(ctx, EVP_sha256())) {
447 ret = openssl_err("Digest setup failed");
451 if (!EVP_DigestUpdate(ctx, pk->key, key_size)) {
452 ret = openssl_err("Hashing data failed");
456 if (!EVP_DigestFinal(ctx, hash->hash, &hash_size)) {
457 ret = openssl_err("Could not obtain hash");
461 EVP_MD_CTX_cleanup(ctx);
464 EVP_MD_CTX_destroy(ctx);
468 static int kwb_import_pubkey(RSA **key, struct pubkey_der_v1 *src, char *keyname)
471 const unsigned char *ptr;
477 rsa = d2i_RSAPublicKey(key, &ptr, sizeof(src->key));
479 openssl_err("error decoding public key");
485 fprintf(stderr, "Failed to decode %s pubkey\n", keyname);
489 static int kwb_export_pubkey(RSA *key, struct pubkey_der_v1 *dst, FILE *hashf,
492 int size_exp, size_mod, size_seq;
493 const BIGNUM *key_e, *key_n;
495 char *errmsg = "Failed to encode %s\n";
497 RSA_get0_key(key, NULL, &key_e, NULL);
498 RSA_get0_key(key, &key_n, NULL, NULL);
500 if (!key || !key_e || !key_n || !dst) {
501 fprintf(stderr, "export pk failed: (%p, %p, %p, %p)",
502 key, key_e, key_n, dst);
503 fprintf(stderr, errmsg, keyname);
508 * According to the specs, the key should be PKCS#1 DER encoded.
509 * But unfortunately the really required encoding seems to be different;
510 * it violates DER...! (But it still conformes to BER.)
511 * (Length always in long form w/ 2 byte length code; no leading zero
512 * when MSB of first byte is set...)
513 * So we cannot use the encoding func provided by OpenSSL and have to
514 * do the encoding manually.
517 size_exp = BN_num_bytes(key_e);
518 size_mod = BN_num_bytes(key_n);
519 size_seq = 4 + size_mod + 4 + size_exp;
521 if (size_mod > 256) {
522 fprintf(stderr, "export pk failed: wrong mod size: %d\n",
524 fprintf(stderr, errmsg, keyname);
528 if (4 + size_seq > sizeof(dst->key)) {
529 fprintf(stderr, "export pk failed: seq too large (%d, %lu)\n",
530 4 + size_seq, sizeof(dst->key));
531 fprintf(stderr, errmsg, keyname);
537 /* PKCS#1 (RFC3447) RSAPublicKey structure */
538 *cur++ = 0x30; /* SEQUENCE */
540 *cur++ = (size_seq >> 8) & 0xFF;
541 *cur++ = size_seq & 0xFF;
543 *cur++ = 0x02; /* INTEGER */
545 *cur++ = (size_mod >> 8) & 0xFF;
546 *cur++ = size_mod & 0xFF;
547 BN_bn2bin(key_n, cur);
550 *cur++ = 0x02; /* INTEGER */
552 *cur++ = (size_exp >> 8) & 0xFF;
553 *cur++ = size_exp & 0xFF;
554 BN_bn2bin(key_e, cur);
557 struct hash_v1 pk_hash;
561 ret = kwb_compute_pubkey_hash(dst, &pk_hash);
563 fprintf(stderr, errmsg, keyname);
567 fprintf(hashf, "SHA256 = ");
568 for (i = 0 ; i < sizeof(pk_hash.hash); ++i)
569 fprintf(hashf, "%02X", pk_hash.hash[i]);
570 fprintf(hashf, "\n");
576 int kwb_sign(RSA *key, void *data, int datasz, struct sig_v1 *sig, char *signame)
580 unsigned int sig_size;
584 evp_key = EVP_PKEY_new();
586 return openssl_err("EVP_PKEY object creation failed");
588 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
589 ret = openssl_err("EVP key setup failed");
593 size = EVP_PKEY_size(evp_key);
594 if (size > sizeof(sig->sig)) {
595 fprintf(stderr, "Buffer to small for signature (%d bytes)\n",
601 ctx = EVP_MD_CTX_create();
603 ret = openssl_err("EVP context creation failed");
606 EVP_MD_CTX_init(ctx);
607 if (!EVP_SignInit(ctx, EVP_sha256())) {
608 ret = openssl_err("Signer setup failed");
612 if (!EVP_SignUpdate(ctx, data, datasz)) {
613 ret = openssl_err("Signing data failed");
617 if (!EVP_SignFinal(ctx, sig->sig, &sig_size, evp_key)) {
618 ret = openssl_err("Could not obtain signature");
622 EVP_MD_CTX_cleanup(ctx);
623 EVP_MD_CTX_destroy(ctx);
624 EVP_PKEY_free(evp_key);
629 EVP_MD_CTX_destroy(ctx);
631 EVP_PKEY_free(evp_key);
632 fprintf(stderr, "Failed to create %s signature\n", signame);
636 int kwb_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
644 evp_key = EVP_PKEY_new();
646 return openssl_err("EVP_PKEY object creation failed");
648 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
649 ret = openssl_err("EVP key setup failed");
653 size = EVP_PKEY_size(evp_key);
654 if (size > sizeof(sig->sig)) {
655 fprintf(stderr, "Invalid signature size (%d bytes)\n",
661 ctx = EVP_MD_CTX_create();
663 ret = openssl_err("EVP context creation failed");
666 EVP_MD_CTX_init(ctx);
667 if (!EVP_VerifyInit(ctx, EVP_sha256())) {
668 ret = openssl_err("Verifier setup failed");
672 if (!EVP_VerifyUpdate(ctx, data, datasz)) {
673 ret = openssl_err("Hashing data failed");
677 if (!EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key)) {
678 ret = openssl_err("Could not verify signature");
682 EVP_MD_CTX_cleanup(ctx);
683 EVP_MD_CTX_destroy(ctx);
684 EVP_PKEY_free(evp_key);
689 EVP_MD_CTX_destroy(ctx);
691 EVP_PKEY_free(evp_key);
692 fprintf(stderr, "Failed to verify %s signature\n", signame);
696 int kwb_sign_and_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
699 if (kwb_sign(key, data, datasz, sig, signame) < 0)
702 if (kwb_verify(key, data, datasz, sig, signame) < 0)
709 int kwb_dump_fuse_cmds_38x(FILE *out, struct secure_hdr_v1 *sec_hdr)
711 struct hash_v1 kak_pub_hash;
712 struct image_cfg_element *e;
713 unsigned int fuse_line;
719 if (!out || !sec_hdr)
722 ret = kwb_compute_pubkey_hash(&sec_hdr->kak, &kak_pub_hash);
726 fprintf(out, "# burn KAK pub key hash\n");
727 ptr = kak_pub_hash.hash;
728 for (fuse_line = 26; fuse_line <= 30; ++fuse_line) {
729 fprintf(out, "fuse prog -y %u 0 ", fuse_line);
731 for (i = 4; i-- > 0;)
732 fprintf(out, "%02hx", (ushort)ptr[i]);
736 if (fuse_line < 30) {
737 for (i = 3; i-- > 0;)
738 fprintf(out, "%02hx", (ushort)ptr[i]);
741 fprintf(out, "000000");
744 fprintf(out, " 1\n");
747 fprintf(out, "# burn CSK selection\n");
749 idx = image_get_csk_index();
750 if (idx < 0 || idx > 15) {
755 for (fuse_line = 31; fuse_line < 31 + idx; ++fuse_line)
756 fprintf(out, "fuse prog -y %u 0 00000001 00000000 1\n",
759 fprintf(out, "# CSK index is 0; no mods needed\n");
762 e = image_find_option(IMAGE_CFG_BOX_ID);
764 fprintf(out, "# set box ID\n");
765 fprintf(out, "fuse prog -y 48 0 %08x 00000000 1\n", e->boxid);
768 e = image_find_option(IMAGE_CFG_FLASH_ID);
770 fprintf(out, "# set flash ID\n");
771 fprintf(out, "fuse prog -y 47 0 %08x 00000000 1\n", e->flashid);
774 fprintf(out, "# enable secure mode ");
775 fprintf(out, "(must be the last fuse line written)\n");
778 e = image_find_option(IMAGE_CFG_SEC_BOOT_DEV);
780 fprintf(stderr, "ERROR: secured mode boot device not given\n");
785 if (e->sec_boot_dev > 0xff) {
786 fprintf(stderr, "ERROR: secured mode boot device invalid\n");
791 val |= (e->sec_boot_dev << 8);
793 fprintf(out, "fuse prog -y 24 0 %08x 0103e0a9 1\n", val);
795 fprintf(out, "# lock (unused) fuse lines (0-23)s\n");
796 for (fuse_line = 0; fuse_line < 24; ++fuse_line)
797 fprintf(out, "fuse prog -y %u 2 1\n", fuse_line);
799 fprintf(out, "# OK, that's all :-)\n");
805 static int kwb_dump_fuse_cmds(struct secure_hdr_v1 *sec_hdr)
808 struct image_cfg_element *e;
810 e = image_find_option(IMAGE_CFG_SEC_FUSE_DUMP);
814 if (!strcmp(e->name, "a38x")) {
815 FILE *out = fopen("kwb_fuses_a38x.txt", "w+");
817 kwb_dump_fuse_cmds_38x(out, sec_hdr);
830 static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
833 struct image_cfg_element *e;
835 struct main_hdr_v0 *main_hdr;
840 * Calculate the size of the header and the size of the
843 headersz = sizeof(struct main_hdr_v0);
845 if (image_count_options(IMAGE_CFG_DATA) > 0) {
847 headersz += sizeof(struct ext_hdr_v0);
850 if (image_count_options(IMAGE_CFG_PAYLOAD) > 1) {
851 fprintf(stderr, "More than one payload, not possible\n");
855 image = malloc(headersz);
857 fprintf(stderr, "Cannot allocate memory for image\n");
861 memset(image, 0, headersz);
863 main_hdr = (struct main_hdr_v0 *)image;
865 /* Fill in the main header */
866 main_hdr->blocksize =
867 cpu_to_le32(payloadsz + sizeof(uint32_t) - headersz);
868 main_hdr->srcaddr = cpu_to_le32(headersz);
869 main_hdr->ext = has_ext;
870 main_hdr->destaddr = cpu_to_le32(params->addr);
871 main_hdr->execaddr = cpu_to_le32(params->ep);
873 e = image_find_option(IMAGE_CFG_BOOT_FROM);
875 main_hdr->blockid = e->bootfrom;
876 e = image_find_option(IMAGE_CFG_NAND_ECC_MODE);
878 main_hdr->nandeccmode = e->nandeccmode;
879 e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
881 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
882 main_hdr->checksum = image_checksum8(image,
883 sizeof(struct main_hdr_v0));
885 /* Generate the ext header */
887 struct ext_hdr_v0 *ext_hdr;
890 ext_hdr = (struct ext_hdr_v0 *)
891 (image + sizeof(struct main_hdr_v0));
892 ext_hdr->offset = cpu_to_le32(0x40);
894 for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
895 e = &image_cfg[cfgi];
896 if (e->type != IMAGE_CFG_DATA)
899 ext_hdr->rcfg[datai].raddr =
900 cpu_to_le32(e->regdata.raddr);
901 ext_hdr->rcfg[datai].rdata =
902 cpu_to_le32(e->regdata.rdata);
906 ext_hdr->checksum = image_checksum8(ext_hdr,
907 sizeof(struct ext_hdr_v0));
914 static size_t image_headersz_v1(int *hasext)
916 struct image_cfg_element *binarye;
920 * Calculate the size of the header and the size of the
923 headersz = sizeof(struct main_hdr_v1);
925 if (image_count_options(IMAGE_CFG_BINARY) > 1) {
926 fprintf(stderr, "More than one binary blob, not supported\n");
930 if (image_count_options(IMAGE_CFG_PAYLOAD) > 1) {
931 fprintf(stderr, "More than one payload, not possible\n");
935 binarye = image_find_option(IMAGE_CFG_BINARY);
940 ret = stat(binarye->binary.file, &s);
945 memset(cwd, 0, sizeof(cwd));
946 if (!getcwd(cwd, sizeof(cwd))) {
947 dir = "current working directory";
948 perror("getcwd() failed");
952 "Didn't find the file '%s' in '%s' which is mandatory to generate the image\n"
953 "This file generally contains the DDR3 training code, and should be extracted from an existing bootable\n"
954 "image for your board. See 'kwbimage -x' to extract it from an existing image.\n",
955 binarye->binary.file, dir);
959 headersz += sizeof(struct opt_hdr_v1) +
961 (binarye->binary.nargs + 2) * sizeof(uint32_t);
966 #if defined(CONFIG_KWB_SECURE)
967 if (image_get_csk_index() >= 0) {
968 headersz += sizeof(struct secure_hdr_v1);
974 #if defined(CONFIG_SYS_U_BOOT_OFFS)
975 if (headersz > CONFIG_SYS_U_BOOT_OFFS) {
977 "Error: Image header (incl. SPL image) too big!\n");
978 fprintf(stderr, "header=0x%x CONFIG_SYS_U_BOOT_OFFS=0x%x!\n",
979 (int)headersz, CONFIG_SYS_U_BOOT_OFFS);
980 fprintf(stderr, "Increase CONFIG_SYS_U_BOOT_OFFS!\n");
984 headersz = CONFIG_SYS_U_BOOT_OFFS;
988 * The payload should be aligned on some reasonable
991 return ALIGN_SUP(headersz, 4096);
994 int add_binary_header_v1(uint8_t *cur)
996 struct image_cfg_element *binarye;
997 struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)cur;
1005 binarye = image_find_option(IMAGE_CFG_BINARY);
1010 hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
1012 bin = fopen(binarye->binary.file, "r");
1014 fprintf(stderr, "Cannot open binary file %s\n",
1015 binarye->binary.file);
1019 if (fstat(fileno(bin), &s)) {
1020 fprintf(stderr, "Cannot stat binary file %s\n",
1021 binarye->binary.file);
1025 binhdrsz = sizeof(struct opt_hdr_v1) +
1026 (binarye->binary.nargs + 2) * sizeof(uint32_t) +
1030 * The size includes the binary image size, rounded
1031 * up to a 4-byte boundary. Plus 4 bytes for the
1032 * next-header byte and 3-byte alignment at the end.
1034 binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
1035 hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
1036 hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
1038 cur += sizeof(struct opt_hdr_v1);
1040 args = (uint32_t *)cur;
1041 *args = cpu_to_le32(binarye->binary.nargs);
1043 for (argi = 0; argi < binarye->binary.nargs; argi++)
1044 args[argi] = cpu_to_le32(binarye->binary.args[argi]);
1046 cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
1048 ret = fread(cur, s.st_size, 1, bin);
1051 "Could not read binary image %s\n",
1052 binarye->binary.file);
1058 cur += ALIGN_SUP(s.st_size, 4);
1061 * For now, we don't support more than one binary
1062 * header, and no other header types are
1063 * supported. So, the binary header is necessarily the
1066 *((uint32_t *)cur) = 0x00000000;
1068 cur += sizeof(uint32_t);
1078 #if defined(CONFIG_KWB_SECURE)
1080 int export_pub_kak_hash(RSA *kak, struct secure_hdr_v1 *secure_hdr)
1085 hashf = fopen("pub_kak_hash.txt", "w");
1087 res = kwb_export_pubkey(kak, &secure_hdr->kak, hashf, "KAK");
1091 return res < 0 ? 1 : 0;
1094 int kwb_sign_csk_with_kak(struct image_tool_params *params,
1095 struct secure_hdr_v1 *secure_hdr, RSA *csk)
1098 RSA *kak_pub = NULL;
1099 int csk_idx = image_get_csk_index();
1100 struct sig_v1 tmp_sig;
1102 if (csk_idx >= 16) {
1103 fprintf(stderr, "Invalid CSK index %d\n", csk_idx);
1107 if (kwb_load_kak(params, &kak) < 0)
1110 if (export_pub_kak_hash(kak, secure_hdr))
1113 if (kwb_import_pubkey(&kak_pub, &secure_hdr->kak, "KAK") < 0)
1116 if (kwb_export_pubkey(csk, &secure_hdr->csk[csk_idx], NULL, "CSK") < 0)
1119 if (kwb_sign_and_verify(kak, &secure_hdr->csk,
1120 sizeof(secure_hdr->csk) +
1121 sizeof(secure_hdr->csksig),
1122 &tmp_sig, "CSK") < 0)
1125 if (kwb_verify(kak_pub, &secure_hdr->csk,
1126 sizeof(secure_hdr->csk) +
1127 sizeof(secure_hdr->csksig),
1128 &tmp_sig, "CSK (2)") < 0)
1131 secure_hdr->csksig = tmp_sig;
1136 int add_secure_header_v1(struct image_tool_params *params, uint8_t *ptr,
1137 int payloadsz, size_t headersz, uint8_t *image,
1138 struct secure_hdr_v1 *secure_hdr)
1140 struct image_cfg_element *e_jtagdelay;
1141 struct image_cfg_element *e_boxid;
1142 struct image_cfg_element *e_flashid;
1144 unsigned char *image_ptr;
1146 struct sig_v1 tmp_sig;
1147 bool specialized_img = image_get_spezialized_img();
1149 kwb_msg("Create secure header content\n");
1151 e_jtagdelay = image_find_option(IMAGE_CFG_JTAG_DELAY);
1152 e_boxid = image_find_option(IMAGE_CFG_BOX_ID);
1153 e_flashid = image_find_option(IMAGE_CFG_FLASH_ID);
1155 if (kwb_load_csk(params, &csk) < 0)
1158 secure_hdr->headertype = OPT_HDR_V1_SECURE_TYPE;
1159 secure_hdr->headersz_msb = 0;
1160 secure_hdr->headersz_lsb = cpu_to_le16(sizeof(struct secure_hdr_v1));
1162 secure_hdr->jtag_delay = e_jtagdelay->jtag_delay;
1163 if (e_boxid && specialized_img)
1164 secure_hdr->boxid = cpu_to_le32(e_boxid->boxid);
1165 if (e_flashid && specialized_img)
1166 secure_hdr->flashid = cpu_to_le32(e_flashid->flashid);
1168 if (kwb_sign_csk_with_kak(params, secure_hdr, csk))
1171 image_ptr = ptr + headersz;
1172 image_size = payloadsz - headersz;
1174 if (kwb_sign_and_verify(csk, image_ptr, image_size,
1175 &secure_hdr->imgsig, "image") < 0)
1178 if (kwb_sign_and_verify(csk, image, headersz, &tmp_sig, "header") < 0)
1181 secure_hdr->hdrsig = tmp_sig;
1183 kwb_dump_fuse_cmds(secure_hdr);
1189 static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
1190 uint8_t *ptr, int payloadsz)
1192 struct image_cfg_element *e;
1193 struct main_hdr_v1 *main_hdr;
1194 #if defined(CONFIG_KWB_SECURE)
1195 struct secure_hdr_v1 *secure_hdr = NULL;
1198 uint8_t *image, *cur;
1200 uint8_t *next_ext = NULL;
1203 * Calculate the size of the header and the size of the
1206 headersz = image_headersz_v1(&hasext);
1210 image = malloc(headersz);
1212 fprintf(stderr, "Cannot allocate memory for image\n");
1216 memset(image, 0, headersz);
1218 main_hdr = (struct main_hdr_v1 *)image;
1220 cur += sizeof(struct main_hdr_v1);
1221 next_ext = &main_hdr->ext;
1223 /* Fill the main header */
1224 main_hdr->blocksize =
1225 cpu_to_le32(payloadsz - headersz + sizeof(uint32_t));
1226 main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
1227 main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
1228 main_hdr->destaddr = cpu_to_le32(params->addr)
1229 - sizeof(image_header_t);
1230 main_hdr->execaddr = cpu_to_le32(params->ep);
1231 main_hdr->srcaddr = cpu_to_le32(headersz);
1232 main_hdr->ext = hasext;
1233 main_hdr->version = 1;
1234 e = image_find_option(IMAGE_CFG_BOOT_FROM);
1236 main_hdr->blockid = e->bootfrom;
1237 e = image_find_option(IMAGE_CFG_NAND_BLKSZ);
1239 main_hdr->nandblocksize = e->nandblksz / (64 * 1024);
1240 e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
1242 main_hdr->nandbadblklocation = e->nandbadblklocation;
1243 e = image_find_option(IMAGE_CFG_BAUDRATE);
1245 main_hdr->options = baudrate_to_option(e->baudrate);
1246 e = image_find_option(IMAGE_CFG_DEBUG);
1248 main_hdr->flags = e->debug ? 0x1 : 0;
1250 #if defined(CONFIG_KWB_SECURE)
1251 if (image_get_csk_index() >= 0) {
1253 * only reserve the space here; we fill the header later since
1254 * we need the header to be complete to compute the signatures
1256 secure_hdr = (struct secure_hdr_v1 *)cur;
1257 cur += sizeof(struct secure_hdr_v1);
1258 next_ext = &secure_hdr->next;
1263 if (add_binary_header_v1(cur))
1266 #if defined(CONFIG_KWB_SECURE)
1267 if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz,
1268 headersz, image, secure_hdr))
1272 /* Calculate and set the header checksum */
1273 main_hdr->checksum = image_checksum8(main_hdr, headersz);
1275 *imagesz = headersz;
1279 int recognize_keyword(char *keyword)
1283 for (kw_id = 1; kw_id < IMAGE_CFG_COUNT; ++kw_id)
1284 if (!strcmp(keyword, id_strs[kw_id]))
1290 static int image_create_config_parse_oneline(char *line,
1291 struct image_cfg_element *el)
1293 char *keyword, *saveptr, *value1, *value2;
1294 char delimiters[] = " \t";
1295 int keyword_id, ret, argi;
1296 char *unknown_msg = "Ignoring unknown line '%s'\n";
1298 keyword = strtok_r(line, delimiters, &saveptr);
1299 keyword_id = recognize_keyword(keyword);
1302 fprintf(stderr, unknown_msg, line);
1306 el->type = keyword_id;
1308 value1 = strtok_r(NULL, delimiters, &saveptr);
1311 fprintf(stderr, "Parameter missing in line '%s'\n", line);
1315 switch (keyword_id) {
1316 case IMAGE_CFG_VERSION:
1317 el->version = atoi(value1);
1319 case IMAGE_CFG_BOOT_FROM:
1320 ret = image_boot_mode_id(value1);
1323 fprintf(stderr, "Invalid boot media '%s'\n", value1);
1328 case IMAGE_CFG_NAND_BLKSZ:
1329 el->nandblksz = strtoul(value1, NULL, 16);
1331 case IMAGE_CFG_NAND_BADBLK_LOCATION:
1332 el->nandbadblklocation = strtoul(value1, NULL, 16);
1334 case IMAGE_CFG_NAND_ECC_MODE:
1335 ret = image_nand_ecc_mode_id(value1);
1338 fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value1);
1341 el->nandeccmode = ret;
1343 case IMAGE_CFG_NAND_PAGESZ:
1344 el->nandpagesz = strtoul(value1, NULL, 16);
1346 case IMAGE_CFG_BINARY:
1349 el->binary.file = strdup(value1);
1351 char *value = strtok_r(NULL, delimiters, &saveptr);
1355 el->binary.args[argi] = strtoul(value, NULL, 16);
1357 if (argi >= BINARY_MAX_ARGS) {
1359 "Too many arguments for BINARY\n");
1363 el->binary.nargs = argi;
1365 case IMAGE_CFG_DATA:
1366 value2 = strtok_r(NULL, delimiters, &saveptr);
1368 if (!value1 || !value2) {
1370 "Invalid number of arguments for DATA\n");
1374 el->regdata.raddr = strtoul(value1, NULL, 16);
1375 el->regdata.rdata = strtoul(value2, NULL, 16);
1377 case IMAGE_CFG_BAUDRATE:
1378 el->baudrate = strtoul(value1, NULL, 10);
1380 case IMAGE_CFG_DEBUG:
1381 el->debug = strtoul(value1, NULL, 10);
1384 el->key_name = strdup(value1);
1387 el->key_name = strdup(value1);
1389 case IMAGE_CFG_CSK_INDEX:
1390 el->csk_idx = strtol(value1, NULL, 0);
1392 case IMAGE_CFG_JTAG_DELAY:
1393 el->jtag_delay = strtoul(value1, NULL, 0);
1395 case IMAGE_CFG_BOX_ID:
1396 el->boxid = strtoul(value1, NULL, 0);
1398 case IMAGE_CFG_FLASH_ID:
1399 el->flashid = strtoul(value1, NULL, 0);
1401 case IMAGE_CFG_SEC_SPECIALIZED_IMG:
1402 el->sec_specialized_img = true;
1404 case IMAGE_CFG_SEC_COMMON_IMG:
1405 el->sec_specialized_img = false;
1407 case IMAGE_CFG_SEC_BOOT_DEV:
1408 el->sec_boot_dev = strtoul(value1, NULL, 0);
1410 case IMAGE_CFG_SEC_FUSE_DUMP:
1411 el->name = strdup(value1);
1414 fprintf(stderr, unknown_msg, line);
1421 * Parse the configuration file 'fcfg' into the array of configuration
1422 * elements 'image_cfg', and return the number of configuration
1423 * elements in 'cfgn'.
1425 static int image_create_config_parse(FILE *fcfg)
1430 /* Parse the configuration file */
1431 while (!feof(fcfg)) {
1435 /* Read the current line */
1436 memset(buf, 0, sizeof(buf));
1437 line = fgets(buf, sizeof(buf), fcfg);
1441 /* Ignore useless lines */
1442 if (line[0] == '\n' || line[0] == '#')
1445 /* Strip final newline */
1446 if (line[strlen(line) - 1] == '\n')
1447 line[strlen(line) - 1] = 0;
1449 /* Parse the current line */
1450 ret = image_create_config_parse_oneline(line,
1457 if (cfgi >= IMAGE_CFG_ELEMENT_MAX) {
1459 "Too many configuration elements in .cfg file\n");
1468 static int image_get_version(void)
1470 struct image_cfg_element *e;
1472 e = image_find_option(IMAGE_CFG_VERSION);
1479 static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
1480 struct image_tool_params *params)
1485 size_t headersz = 0;
1490 fcfg = fopen(params->imagename, "r");
1492 fprintf(stderr, "Could not open input file %s\n",
1497 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1498 sizeof(struct image_cfg_element));
1500 fprintf(stderr, "Cannot allocate memory\n");
1505 memset(image_cfg, 0,
1506 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1509 ret = image_create_config_parse(fcfg);
1516 /* The MVEBU BootROM does not allow non word aligned payloads */
1517 sbuf->st_size = ALIGN_SUP(sbuf->st_size, 4);
1519 version = image_get_version();
1522 * Fallback to version 0 if no version is provided in the
1527 image = image_create_v0(&headersz, params, sbuf->st_size);
1531 image = image_create_v1(&headersz, params, ptr, sbuf->st_size);
1535 fprintf(stderr, "Unsupported version %d\n", version);
1541 fprintf(stderr, "Could not create image\n");
1548 /* Build and add image checksum header */
1550 cpu_to_le32(image_checksum32((uint32_t *)ptr, sbuf->st_size));
1551 size = write(ifd, &checksum, sizeof(uint32_t));
1552 if (size != sizeof(uint32_t)) {
1553 fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n",
1554 params->cmdname, size, params->imagefile);
1558 sbuf->st_size += sizeof(uint32_t);
1560 /* Finally copy the header into the image area */
1561 memcpy(ptr, image, headersz);
1566 static void kwbimage_print_header(const void *ptr)
1568 struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1570 printf("Image Type: MVEBU Boot from %s Image\n",
1571 image_boot_mode_name(mhdr->blockid));
1572 printf("Image version:%d\n", image_version((void *)ptr));
1573 printf("Data Size: ");
1574 genimg_print_size(mhdr->blocksize - sizeof(uint32_t));
1575 printf("Load Address: %08x\n", mhdr->destaddr);
1576 printf("Entry Point: %08x\n", mhdr->execaddr);
1579 static int kwbimage_check_image_types(uint8_t type)
1581 if (type == IH_TYPE_KWBIMAGE)
1582 return EXIT_SUCCESS;
1584 return EXIT_FAILURE;
1587 static int kwbimage_verify_header(unsigned char *ptr, int image_size,
1588 struct image_tool_params *params)
1590 struct main_hdr_v0 *main_hdr;
1593 main_hdr = (struct main_hdr_v0 *)ptr;
1594 checksum = image_checksum8(ptr,
1595 sizeof(struct main_hdr_v0)
1597 if (checksum != main_hdr->checksum)
1598 return -FDT_ERR_BADSTRUCTURE;
1600 /* Only version 0 extended header has checksum */
1601 if (image_version((void *)ptr) == 0) {
1602 struct ext_hdr_v0 *ext_hdr;
1604 ext_hdr = (struct ext_hdr_v0 *)
1605 (ptr + sizeof(struct main_hdr_v0));
1606 checksum = image_checksum8(ext_hdr,
1607 sizeof(struct ext_hdr_v0)
1609 if (checksum != ext_hdr->checksum)
1610 return -FDT_ERR_BADSTRUCTURE;
1616 static int kwbimage_generate(struct image_tool_params *params,
1617 struct image_type_params *tparams)
1625 fcfg = fopen(params->imagename, "r");
1627 fprintf(stderr, "Could not open input file %s\n",
1632 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1633 sizeof(struct image_cfg_element));
1635 fprintf(stderr, "Cannot allocate memory\n");
1640 memset(image_cfg, 0,
1641 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1644 ret = image_create_config_parse(fcfg);
1651 version = image_get_version();
1654 * Fallback to version 0 if no version is provided in the
1659 alloc_len = sizeof(struct main_hdr_v0) +
1660 sizeof(struct ext_hdr_v0);
1664 alloc_len = image_headersz_v1(NULL);
1668 fprintf(stderr, "Unsupported version %d\n", version);
1675 hdr = malloc(alloc_len);
1677 fprintf(stderr, "%s: malloc return failure: %s\n",
1678 params->cmdname, strerror(errno));
1682 memset(hdr, 0, alloc_len);
1683 tparams->header_size = alloc_len;
1687 * The resulting image needs to be 4-byte aligned. At least
1688 * the Marvell hdrparser tool complains if its unaligned.
1689 * By returning 1 here in this function, called via
1690 * tparams->vrec_header() in mkimage.c, mkimage will
1691 * automatically pad the the resulting image to a 4-byte
1692 * size if necessary.
1698 * Report Error if xflag is set in addition to default
1700 static int kwbimage_check_params(struct image_tool_params *params)
1702 if (!strlen(params->imagename)) {
1703 char *msg = "Configuration file for kwbimage creation omitted";
1705 fprintf(stderr, "Error:%s - %s\n", params->cmdname, msg);
1709 return (params->dflag && (params->fflag || params->lflag)) ||
1710 (params->fflag && (params->dflag || params->lflag)) ||
1711 (params->lflag && (params->dflag || params->fflag)) ||
1712 (params->xflag) || !(strlen(params->imagename));
1716 * kwbimage type parameters definition
1720 "Marvell MVEBU Boot Image support",
1723 kwbimage_check_params,
1724 kwbimage_verify_header,
1725 kwbimage_print_header,
1726 kwbimage_set_header,
1728 kwbimage_check_image_types,