]> git.sur5r.net Git - u-boot/blob - tools/kwbimage.c
ARM: at91: ma5d4: Enable DFU and UMS
[u-boot] / tools / kwbimage.c
1 /*
2  * Image manipulator for Marvell SoCs
3  *  supports Kirkwood, Dove, Armada 370, Armada XP, and Armada 38x
4  *
5  * (C) Copyright 2013 Thomas Petazzoni
6  * <thomas.petazzoni@free-electrons.com>
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  *
10  * Not implemented: support for the register headers in v1 images
11  */
12
13 #include "imagetool.h"
14 #include <limits.h>
15 #include <image.h>
16 #include <stdarg.h>
17 #include <stdint.h>
18 #include "kwbimage.h"
19
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>
26
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)
30 {
31    if (n != NULL)
32        *n = r->n;
33    if (e != NULL)
34        *e = r->e;
35    if (d != NULL)
36        *d = r->d;
37 }
38
39 #else
40 void EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
41 {
42         EVP_MD_CTX_reset(ctx);
43 }
44 #endif
45 #endif
46
47 static struct image_cfg_element *image_cfg;
48 static int cfgn;
49 #ifdef CONFIG_KWB_SECURE
50 static int verbose_mode;
51 #endif
52
53 struct boot_mode {
54         unsigned int id;
55         const char *name;
56 };
57
58 /*
59  * SHA2-256 hash
60  */
61 struct hash_v1 {
62         uint8_t hash[32];
63 };
64
65 struct boot_mode boot_modes[] = {
66         { 0x4D, "i2c"  },
67         { 0x5A, "spi"  },
68         { 0x8B, "nand" },
69         { 0x78, "sata" },
70         { 0x9C, "pex"  },
71         { 0x69, "uart" },
72         { 0xAE, "sdio" },
73         {},
74 };
75
76 struct nand_ecc_mode {
77         unsigned int id;
78         const char *name;
79 };
80
81 struct nand_ecc_mode nand_ecc_modes[] = {
82         { 0x00, "default" },
83         { 0x01, "hamming" },
84         { 0x02, "rs" },
85         { 0x03, "disabled" },
86         {},
87 };
88
89 /* Used to identify an undefined execution or destination address */
90 #define ADDR_INVALID ((uint32_t)-1)
91
92 #define BINARY_MAX_ARGS 8
93
94 /* In-memory representation of a line of the configuration file */
95
96 enum image_cfg_type {
97         IMAGE_CFG_VERSION = 0x1,
98         IMAGE_CFG_BOOT_FROM,
99         IMAGE_CFG_DEST_ADDR,
100         IMAGE_CFG_EXEC_ADDR,
101         IMAGE_CFG_NAND_BLKSZ,
102         IMAGE_CFG_NAND_BADBLK_LOCATION,
103         IMAGE_CFG_NAND_ECC_MODE,
104         IMAGE_CFG_NAND_PAGESZ,
105         IMAGE_CFG_BINARY,
106         IMAGE_CFG_PAYLOAD,
107         IMAGE_CFG_DATA,
108         IMAGE_CFG_BAUDRATE,
109         IMAGE_CFG_DEBUG,
110         IMAGE_CFG_KAK,
111         IMAGE_CFG_CSK,
112         IMAGE_CFG_CSK_INDEX,
113         IMAGE_CFG_JTAG_DELAY,
114         IMAGE_CFG_BOX_ID,
115         IMAGE_CFG_FLASH_ID,
116         IMAGE_CFG_SEC_COMMON_IMG,
117         IMAGE_CFG_SEC_SPECIALIZED_IMG,
118         IMAGE_CFG_SEC_BOOT_DEV,
119         IMAGE_CFG_SEC_FUSE_DUMP,
120
121         IMAGE_CFG_COUNT
122 } type;
123
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"
148 };
149
150 struct image_cfg_element {
151         enum image_cfg_type type;
152         union {
153                 unsigned int version;
154                 unsigned int bootfrom;
155                 struct {
156                         const char *file;
157                         unsigned int args[BINARY_MAX_ARGS];
158                         unsigned int nargs;
159                 } binary;
160                 const char *payload;
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;
169                 unsigned int debug;
170                 const char *key_name;
171                 int csk_idx;
172                 uint8_t jtag_delay;
173                 uint32_t boxid;
174                 uint32_t flashid;
175                 bool sec_specialized_img;
176                 unsigned int sec_boot_dev;
177                 const char *name;
178         };
179 };
180
181 #define IMAGE_CFG_ELEMENT_MAX 256
182
183 /*
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).
187  */
188
189 static const char *image_boot_mode_name(unsigned int id)
190 {
191         int i;
192
193         for (i = 0; boot_modes[i].name; i++)
194                 if (boot_modes[i].id == id)
195                         return boot_modes[i].name;
196         return NULL;
197 }
198
199 int image_boot_mode_id(const char *boot_mode_name)
200 {
201         int i;
202
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;
206
207         return -1;
208 }
209
210 int image_nand_ecc_mode_id(const char *nand_ecc_mode_name)
211 {
212         int i;
213
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;
217         return -1;
218 }
219
220 static struct image_cfg_element *
221 image_find_option(unsigned int optiontype)
222 {
223         int i;
224
225         for (i = 0; i < cfgn; i++) {
226                 if (image_cfg[i].type == optiontype)
227                         return &image_cfg[i];
228         }
229
230         return NULL;
231 }
232
233 static unsigned int
234 image_count_options(unsigned int optiontype)
235 {
236         int i;
237         unsigned int count = 0;
238
239         for (i = 0; i < cfgn; i++)
240                 if (image_cfg[i].type == optiontype)
241                         count++;
242
243         return count;
244 }
245
246 #if defined(CONFIG_KWB_SECURE)
247
248 static int image_get_csk_index(void)
249 {
250         struct image_cfg_element *e;
251
252         e = image_find_option(IMAGE_CFG_CSK_INDEX);
253         if (!e)
254                 return -1;
255
256         return e->csk_idx;
257 }
258
259 static bool image_get_spezialized_img(void)
260 {
261         struct image_cfg_element *e;
262
263         e = image_find_option(IMAGE_CFG_SEC_SPECIALIZED_IMG);
264         if (!e)
265                 return false;
266
267         return e->sec_specialized_img;
268 }
269
270 #endif
271
272 /*
273  * Compute a 8-bit checksum of a memory area. This algorithm follows
274  * the requirements of the Marvell SoC BootROM specifications.
275  */
276 static uint8_t image_checksum8(void *start, uint32_t len)
277 {
278         uint8_t csum = 0;
279         uint8_t *p = start;
280
281         /* check len and return zero checksum if invalid */
282         if (!len)
283                 return 0;
284
285         do {
286                 csum += *p;
287                 p++;
288         } while (--len);
289
290         return csum;
291 }
292
293 static uint32_t image_checksum32(void *start, uint32_t len)
294 {
295         uint32_t csum = 0;
296         uint32_t *p = start;
297
298         /* check len and return zero checksum if invalid */
299         if (!len)
300                 return 0;
301
302         if (len % sizeof(uint32_t)) {
303                 fprintf(stderr, "Length %d is not in multiple of %zu\n",
304                         len, sizeof(uint32_t));
305                 return 0;
306         }
307
308         do {
309                 csum += *p;
310                 p++;
311                 len -= sizeof(uint32_t);
312         } while (len > 0);
313
314         return csum;
315 }
316
317 static uint8_t baudrate_to_option(unsigned int baudrate)
318 {
319         switch (baudrate) {
320         case 2400:
321                 return MAIN_HDR_V1_OPT_BAUD_2400;
322         case 4800:
323                 return MAIN_HDR_V1_OPT_BAUD_4800;
324         case 9600:
325                 return MAIN_HDR_V1_OPT_BAUD_9600;
326         case 19200:
327                 return MAIN_HDR_V1_OPT_BAUD_19200;
328         case 38400:
329                 return MAIN_HDR_V1_OPT_BAUD_38400;
330         case 57600:
331                 return MAIN_HDR_V1_OPT_BAUD_57600;
332         case 115200:
333                 return MAIN_HDR_V1_OPT_BAUD_115200;
334         default:
335                 return MAIN_HDR_V1_OPT_BAUD_DEFAULT;
336         }
337 }
338
339 #if defined(CONFIG_KWB_SECURE)
340 static void kwb_msg(const char *fmt, ...)
341 {
342         if (verbose_mode) {
343                 va_list ap;
344
345                 va_start(ap, fmt);
346                 vfprintf(stdout, fmt, ap);
347                 va_end(ap);
348         }
349 }
350
351 static int openssl_err(const char *msg)
352 {
353         unsigned long ssl_err = ERR_get_error();
354
355         fprintf(stderr, "%s", msg);
356         fprintf(stderr, ": %s\n",
357                 ERR_error_string(ssl_err, 0));
358
359         return -1;
360 }
361
362 static int kwb_load_rsa_key(const char *keydir, const char *name, RSA **p_rsa)
363 {
364         char path[PATH_MAX];
365         RSA *rsa;
366         FILE *f;
367
368         if (!keydir)
369                 keydir = ".";
370
371         snprintf(path, sizeof(path), "%s/%s.key", keydir, name);
372         f = fopen(path, "r");
373         if (!f) {
374                 fprintf(stderr, "Couldn't open RSA private key: '%s': %s\n",
375                         path, strerror(errno));
376                 return -ENOENT;
377         }
378
379         rsa = PEM_read_RSAPrivateKey(f, 0, NULL, "");
380         if (!rsa) {
381                 openssl_err("Failure reading private key");
382                 fclose(f);
383                 return -EPROTO;
384         }
385         fclose(f);
386         *p_rsa = rsa;
387
388         return 0;
389 }
390
391 static int kwb_load_cfg_key(struct image_tool_params *params,
392                             unsigned int cfg_option, const char *key_name,
393                             RSA **p_key)
394 {
395         struct image_cfg_element *e_key;
396         RSA *key;
397         int res;
398
399         *p_key = NULL;
400
401         e_key = image_find_option(cfg_option);
402         if (!e_key) {
403                 fprintf(stderr, "%s not configured\n", key_name);
404                 return -ENOENT;
405         }
406
407         res = kwb_load_rsa_key(params->keydir, e_key->key_name, &key);
408         if (res < 0) {
409                 fprintf(stderr, "Failed to load %s\n", key_name);
410                 return -ENOENT;
411         }
412
413         *p_key = key;
414
415         return 0;
416 }
417
418 static int kwb_load_kak(struct image_tool_params *params, RSA **p_kak)
419 {
420         return kwb_load_cfg_key(params, IMAGE_CFG_KAK, "KAK", p_kak);
421 }
422
423 static int kwb_load_csk(struct image_tool_params *params, RSA **p_csk)
424 {
425         return kwb_load_cfg_key(params, IMAGE_CFG_CSK, "CSK", p_csk);
426 }
427
428 static int kwb_compute_pubkey_hash(struct pubkey_der_v1 *pk,
429                                    struct hash_v1 *hash)
430 {
431         EVP_MD_CTX *ctx;
432         unsigned int key_size;
433         unsigned int hash_size;
434         int ret = 0;
435
436         if (!pk || !hash || pk->key[0] != 0x30 || pk->key[1] != 0x82)
437                 return -EINVAL;
438
439         key_size = (pk->key[2] << 8) + pk->key[3] + 4;
440
441         ctx = EVP_MD_CTX_create();
442         if (!ctx)
443                 return openssl_err("EVP context creation failed");
444
445         EVP_MD_CTX_init(ctx);
446         if (!EVP_DigestInit(ctx, EVP_sha256())) {
447                 ret = openssl_err("Digest setup failed");
448                 goto hash_err_ctx;
449         }
450
451         if (!EVP_DigestUpdate(ctx, pk->key, key_size)) {
452                 ret = openssl_err("Hashing data failed");
453                 goto hash_err_ctx;
454         }
455
456         if (!EVP_DigestFinal(ctx, hash->hash, &hash_size)) {
457                 ret = openssl_err("Could not obtain hash");
458                 goto hash_err_ctx;
459         }
460
461         EVP_MD_CTX_cleanup(ctx);
462
463 hash_err_ctx:
464         EVP_MD_CTX_destroy(ctx);
465         return ret;
466 }
467
468 static int kwb_import_pubkey(RSA **key, struct pubkey_der_v1 *src, char *keyname)
469 {
470         RSA *rsa;
471         const unsigned char *ptr;
472
473         if (!key || !src)
474                 goto fail;
475
476         ptr = src->key;
477         rsa = d2i_RSAPublicKey(key, &ptr, sizeof(src->key));
478         if (!rsa) {
479                 openssl_err("error decoding public key");
480                 goto fail;
481         }
482
483         return 0;
484 fail:
485         fprintf(stderr, "Failed to decode %s pubkey\n", keyname);
486         return -EINVAL;
487 }
488
489 static int kwb_export_pubkey(RSA *key, struct pubkey_der_v1 *dst, FILE *hashf,
490                              char *keyname)
491 {
492         int size_exp, size_mod, size_seq;
493         const BIGNUM *key_e, *key_n;
494         uint8_t *cur;
495         char *errmsg = "Failed to encode %s\n";
496
497         RSA_get0_key(key, NULL, &key_e, NULL);
498         RSA_get0_key(key, &key_n, NULL, NULL);
499
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);
504                 return -EINVAL;
505         }
506
507         /*
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.
515          */
516
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;
520
521         if (size_mod > 256) {
522                 fprintf(stderr, "export pk failed: wrong mod size: %d\n",
523                         size_mod);
524                 fprintf(stderr, errmsg, keyname);
525                 return -EINVAL;
526         }
527
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);
532                 return -ENOBUFS;
533         }
534
535         cur = dst->key;
536
537         /* PKCS#1 (RFC3447) RSAPublicKey structure */
538         *cur++ = 0x30;          /* SEQUENCE */
539         *cur++ = 0x82;
540         *cur++ = (size_seq >> 8) & 0xFF;
541         *cur++ = size_seq & 0xFF;
542         /* Modulus */
543         *cur++ = 0x02;          /* INTEGER */
544         *cur++ = 0x82;
545         *cur++ = (size_mod >> 8) & 0xFF;
546         *cur++ = size_mod & 0xFF;
547         BN_bn2bin(key_n, cur);
548         cur += size_mod;
549         /* Exponent */
550         *cur++ = 0x02;          /* INTEGER */
551         *cur++ = 0x82;
552         *cur++ = (size_exp >> 8) & 0xFF;
553         *cur++ = size_exp & 0xFF;
554         BN_bn2bin(key_e, cur);
555
556         if (hashf) {
557                 struct hash_v1 pk_hash;
558                 int i;
559                 int ret = 0;
560
561                 ret = kwb_compute_pubkey_hash(dst, &pk_hash);
562                 if (ret < 0) {
563                         fprintf(stderr, errmsg, keyname);
564                         return ret;
565                 }
566
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");
571         }
572
573         return 0;
574 }
575
576 int kwb_sign(RSA *key, void *data, int datasz, struct sig_v1 *sig, char *signame)
577 {
578         EVP_PKEY *evp_key;
579         EVP_MD_CTX *ctx;
580         unsigned int sig_size;
581         int size;
582         int ret = 0;
583
584         evp_key = EVP_PKEY_new();
585         if (!evp_key)
586                 return openssl_err("EVP_PKEY object creation failed");
587
588         if (!EVP_PKEY_set1_RSA(evp_key, key)) {
589                 ret = openssl_err("EVP key setup failed");
590                 goto err_key;
591         }
592
593         size = EVP_PKEY_size(evp_key);
594         if (size > sizeof(sig->sig)) {
595                 fprintf(stderr, "Buffer to small for signature (%d bytes)\n",
596                         size);
597                 ret = -ENOBUFS;
598                 goto err_key;
599         }
600
601         ctx = EVP_MD_CTX_create();
602         if (!ctx) {
603                 ret = openssl_err("EVP context creation failed");
604                 goto err_key;
605         }
606         EVP_MD_CTX_init(ctx);
607         if (!EVP_SignInit(ctx, EVP_sha256())) {
608                 ret = openssl_err("Signer setup failed");
609                 goto err_ctx;
610         }
611
612         if (!EVP_SignUpdate(ctx, data, datasz)) {
613                 ret = openssl_err("Signing data failed");
614                 goto err_ctx;
615         }
616
617         if (!EVP_SignFinal(ctx, sig->sig, &sig_size, evp_key)) {
618                 ret = openssl_err("Could not obtain signature");
619                 goto err_ctx;
620         }
621
622         EVP_MD_CTX_cleanup(ctx);
623         EVP_MD_CTX_destroy(ctx);
624         EVP_PKEY_free(evp_key);
625
626         return 0;
627
628 err_ctx:
629         EVP_MD_CTX_destroy(ctx);
630 err_key:
631         EVP_PKEY_free(evp_key);
632         fprintf(stderr, "Failed to create %s signature\n", signame);
633         return ret;
634 }
635
636 int kwb_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
637                char *signame)
638 {
639         EVP_PKEY *evp_key;
640         EVP_MD_CTX *ctx;
641         int size;
642         int ret = 0;
643
644         evp_key = EVP_PKEY_new();
645         if (!evp_key)
646                 return openssl_err("EVP_PKEY object creation failed");
647
648         if (!EVP_PKEY_set1_RSA(evp_key, key)) {
649                 ret = openssl_err("EVP key setup failed");
650                 goto err_key;
651         }
652
653         size = EVP_PKEY_size(evp_key);
654         if (size > sizeof(sig->sig)) {
655                 fprintf(stderr, "Invalid signature size (%d bytes)\n",
656                         size);
657                 ret = -EINVAL;
658                 goto err_key;
659         }
660
661         ctx = EVP_MD_CTX_create();
662         if (!ctx) {
663                 ret = openssl_err("EVP context creation failed");
664                 goto err_key;
665         }
666         EVP_MD_CTX_init(ctx);
667         if (!EVP_VerifyInit(ctx, EVP_sha256())) {
668                 ret = openssl_err("Verifier setup failed");
669                 goto err_ctx;
670         }
671
672         if (!EVP_VerifyUpdate(ctx, data, datasz)) {
673                 ret = openssl_err("Hashing data failed");
674                 goto err_ctx;
675         }
676
677         if (!EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key)) {
678                 ret = openssl_err("Could not verify signature");
679                 goto err_ctx;
680         }
681
682         EVP_MD_CTX_cleanup(ctx);
683         EVP_MD_CTX_destroy(ctx);
684         EVP_PKEY_free(evp_key);
685
686         return 0;
687
688 err_ctx:
689         EVP_MD_CTX_destroy(ctx);
690 err_key:
691         EVP_PKEY_free(evp_key);
692         fprintf(stderr, "Failed to verify %s signature\n", signame);
693         return ret;
694 }
695
696 int kwb_sign_and_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
697                         char *signame)
698 {
699         if (kwb_sign(key, data, datasz, sig, signame) < 0)
700                 return -1;
701
702         if (kwb_verify(key, data, datasz, sig, signame) < 0)
703                 return -1;
704
705         return 0;
706 }
707
708
709 int kwb_dump_fuse_cmds_38x(FILE *out, struct secure_hdr_v1 *sec_hdr)
710 {
711         struct hash_v1 kak_pub_hash;
712         struct image_cfg_element *e;
713         unsigned int fuse_line;
714         int i, idx;
715         uint8_t *ptr;
716         uint32_t val;
717         int ret = 0;
718
719         if (!out || !sec_hdr)
720                 return -EINVAL;
721
722         ret = kwb_compute_pubkey_hash(&sec_hdr->kak, &kak_pub_hash);
723         if (ret < 0)
724                 goto done;
725
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);
730
731                 for (i = 4; i-- > 0;)
732                         fprintf(out, "%02hx", (ushort)ptr[i]);
733                 ptr += 4;
734                 fprintf(out, " 00");
735
736                 if (fuse_line < 30) {
737                         for (i = 3; i-- > 0;)
738                                 fprintf(out, "%02hx", (ushort)ptr[i]);
739                         ptr += 3;
740                 } else {
741                         fprintf(out, "000000");
742                 }
743
744                 fprintf(out, " 1\n");
745         }
746
747         fprintf(out, "# burn CSK selection\n");
748
749         idx = image_get_csk_index();
750         if (idx < 0 || idx > 15) {
751                 ret = -EINVAL;
752                 goto done;
753         }
754         if (idx > 0) {
755                 for (fuse_line = 31; fuse_line < 31 + idx; ++fuse_line)
756                         fprintf(out, "fuse prog -y %u 0 00000001 00000000 1\n",
757                                 fuse_line);
758         } else {
759                 fprintf(out, "# CSK index is 0; no mods needed\n");
760         }
761
762         e = image_find_option(IMAGE_CFG_BOX_ID);
763         if (e) {
764                 fprintf(out, "# set box ID\n");
765                 fprintf(out, "fuse prog -y 48 0 %08x 00000000 1\n", e->boxid);
766         }
767
768         e = image_find_option(IMAGE_CFG_FLASH_ID);
769         if (e) {
770                 fprintf(out, "# set flash ID\n");
771                 fprintf(out, "fuse prog -y 47 0 %08x 00000000 1\n", e->flashid);
772         }
773
774         fprintf(out, "# enable secure mode ");
775         fprintf(out, "(must be the last fuse line written)\n");
776
777         val = 1;
778         e = image_find_option(IMAGE_CFG_SEC_BOOT_DEV);
779         if (!e) {
780                 fprintf(stderr, "ERROR: secured mode boot device not given\n");
781                 ret = -EINVAL;
782                 goto done;
783         }
784
785         if (e->sec_boot_dev > 0xff) {
786                 fprintf(stderr, "ERROR: secured mode boot device invalid\n");
787                 ret = -EINVAL;
788                 goto done;
789         }
790
791         val |= (e->sec_boot_dev << 8);
792
793         fprintf(out, "fuse prog -y 24 0 %08x 0103e0a9 1\n", val);
794
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);
798
799         fprintf(out, "# OK, that's all :-)\n");
800
801 done:
802         return ret;
803 }
804
805 static int kwb_dump_fuse_cmds(struct secure_hdr_v1 *sec_hdr)
806 {
807         int ret = 0;
808         struct image_cfg_element *e;
809
810         e = image_find_option(IMAGE_CFG_SEC_FUSE_DUMP);
811         if (!e)
812                 return 0;
813
814         if (!strcmp(e->name, "a38x")) {
815                 FILE *out = fopen("kwb_fuses_a38x.txt", "w+");
816
817                 kwb_dump_fuse_cmds_38x(out, sec_hdr);
818                 fclose(out);
819                 goto done;
820         }
821
822         ret = -ENOSYS;
823
824 done:
825         return ret;
826 }
827
828 #endif
829
830 static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
831                              int payloadsz)
832 {
833         struct image_cfg_element *e;
834         size_t headersz;
835         struct main_hdr_v0 *main_hdr;
836         uint8_t *image;
837         int has_ext = 0;
838
839         /*
840          * Calculate the size of the header and the size of the
841          * payload
842          */
843         headersz  = sizeof(struct main_hdr_v0);
844
845         if (image_count_options(IMAGE_CFG_DATA) > 0) {
846                 has_ext = 1;
847                 headersz += sizeof(struct ext_hdr_v0);
848         }
849
850         if (image_count_options(IMAGE_CFG_PAYLOAD) > 1) {
851                 fprintf(stderr, "More than one payload, not possible\n");
852                 return NULL;
853         }
854
855         image = malloc(headersz);
856         if (!image) {
857                 fprintf(stderr, "Cannot allocate memory for image\n");
858                 return NULL;
859         }
860
861         memset(image, 0, headersz);
862
863         main_hdr = (struct main_hdr_v0 *)image;
864
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);
872
873         e = image_find_option(IMAGE_CFG_BOOT_FROM);
874         if (e)
875                 main_hdr->blockid = e->bootfrom;
876         e = image_find_option(IMAGE_CFG_NAND_ECC_MODE);
877         if (e)
878                 main_hdr->nandeccmode = e->nandeccmode;
879         e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
880         if (e)
881                 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
882         main_hdr->checksum = image_checksum8(image,
883                                              sizeof(struct main_hdr_v0));
884
885         /* Generate the ext header */
886         if (has_ext) {
887                 struct ext_hdr_v0 *ext_hdr;
888                 int cfgi, datai;
889
890                 ext_hdr = (struct ext_hdr_v0 *)
891                                 (image + sizeof(struct main_hdr_v0));
892                 ext_hdr->offset = cpu_to_le32(0x40);
893
894                 for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
895                         e = &image_cfg[cfgi];
896                         if (e->type != IMAGE_CFG_DATA)
897                                 continue;
898
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);
903                         datai++;
904                 }
905
906                 ext_hdr->checksum = image_checksum8(ext_hdr,
907                                                     sizeof(struct ext_hdr_v0));
908         }
909
910         *imagesz = headersz;
911         return image;
912 }
913
914 static size_t image_headersz_v1(int *hasext)
915 {
916         struct image_cfg_element *binarye;
917         size_t headersz;
918
919         /*
920          * Calculate the size of the header and the size of the
921          * payload
922          */
923         headersz = sizeof(struct main_hdr_v1);
924
925         if (image_count_options(IMAGE_CFG_BINARY) > 1) {
926                 fprintf(stderr, "More than one binary blob, not supported\n");
927                 return 0;
928         }
929
930         if (image_count_options(IMAGE_CFG_PAYLOAD) > 1) {
931                 fprintf(stderr, "More than one payload, not possible\n");
932                 return 0;
933         }
934
935         binarye = image_find_option(IMAGE_CFG_BINARY);
936         if (binarye) {
937                 int ret;
938                 struct stat s;
939
940                 ret = stat(binarye->binary.file, &s);
941                 if (ret < 0) {
942                         char cwd[PATH_MAX];
943                         char *dir = cwd;
944
945                         memset(cwd, 0, sizeof(cwd));
946                         if (!getcwd(cwd, sizeof(cwd))) {
947                                 dir = "current working directory";
948                                 perror("getcwd() failed");
949                         }
950
951                         fprintf(stderr,
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);
956                         return 0;
957                 }
958
959                 headersz += sizeof(struct opt_hdr_v1) +
960                         s.st_size +
961                         (binarye->binary.nargs + 2) * sizeof(uint32_t);
962                 if (hasext)
963                         *hasext = 1;
964         }
965
966 #if defined(CONFIG_KWB_SECURE)
967         if (image_get_csk_index() >= 0) {
968                 headersz += sizeof(struct secure_hdr_v1);
969                 if (hasext)
970                         *hasext = 1;
971         }
972 #endif
973
974 #if defined(CONFIG_SYS_U_BOOT_OFFS)
975         if (headersz > CONFIG_SYS_U_BOOT_OFFS) {
976                 fprintf(stderr,
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");
981                 return 0;
982         }
983
984         headersz = CONFIG_SYS_U_BOOT_OFFS;
985 #endif
986
987         /*
988          * The payload should be aligned on some reasonable
989          * boundary
990          */
991         return ALIGN_SUP(headersz, 4096);
992 }
993
994 int add_binary_header_v1(uint8_t *cur)
995 {
996         struct image_cfg_element *binarye;
997         struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)cur;
998         uint32_t *args;
999         size_t binhdrsz;
1000         struct stat s;
1001         int argi;
1002         FILE *bin;
1003         int ret;
1004
1005         binarye = image_find_option(IMAGE_CFG_BINARY);
1006
1007         if (!binarye)
1008                 return 0;
1009
1010         hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
1011
1012         bin = fopen(binarye->binary.file, "r");
1013         if (!bin) {
1014                 fprintf(stderr, "Cannot open binary file %s\n",
1015                         binarye->binary.file);
1016                 return -1;
1017         }
1018
1019         if (fstat(fileno(bin), &s)) {
1020                 fprintf(stderr, "Cannot stat binary file %s\n",
1021                         binarye->binary.file);
1022                 goto err_close;
1023         }
1024
1025         binhdrsz = sizeof(struct opt_hdr_v1) +
1026                 (binarye->binary.nargs + 2) * sizeof(uint32_t) +
1027                 s.st_size;
1028
1029         /*
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.
1033          */
1034         binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
1035         hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
1036         hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
1037
1038         cur += sizeof(struct opt_hdr_v1);
1039
1040         args = (uint32_t *)cur;
1041         *args = cpu_to_le32(binarye->binary.nargs);
1042         args++;
1043         for (argi = 0; argi < binarye->binary.nargs; argi++)
1044                 args[argi] = cpu_to_le32(binarye->binary.args[argi]);
1045
1046         cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
1047
1048         ret = fread(cur, s.st_size, 1, bin);
1049         if (ret != 1) {
1050                 fprintf(stderr,
1051                         "Could not read binary image %s\n",
1052                         binarye->binary.file);
1053                 goto err_close;
1054         }
1055
1056         fclose(bin);
1057
1058         cur += ALIGN_SUP(s.st_size, 4);
1059
1060         /*
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
1064          * last one
1065          */
1066         *((uint32_t *)cur) = 0x00000000;
1067
1068         cur += sizeof(uint32_t);
1069
1070         return 0;
1071
1072 err_close:
1073         fclose(bin);
1074
1075         return -1;
1076 }
1077
1078 #if defined(CONFIG_KWB_SECURE)
1079
1080 int export_pub_kak_hash(RSA *kak, struct secure_hdr_v1 *secure_hdr)
1081 {
1082         FILE *hashf;
1083         int res;
1084
1085         hashf = fopen("pub_kak_hash.txt", "w");
1086
1087         res = kwb_export_pubkey(kak, &secure_hdr->kak, hashf, "KAK");
1088
1089         fclose(hashf);
1090
1091         return res < 0 ? 1 : 0;
1092 }
1093
1094 int kwb_sign_csk_with_kak(struct image_tool_params *params,
1095                           struct secure_hdr_v1 *secure_hdr, RSA *csk)
1096 {
1097         RSA *kak = NULL;
1098         RSA *kak_pub = NULL;
1099         int csk_idx = image_get_csk_index();
1100         struct sig_v1 tmp_sig;
1101
1102         if (csk_idx >= 16) {
1103                 fprintf(stderr, "Invalid CSK index %d\n", csk_idx);
1104                 return 1;
1105         }
1106
1107         if (kwb_load_kak(params, &kak) < 0)
1108                 return 1;
1109
1110         if (export_pub_kak_hash(kak, secure_hdr))
1111                 return 1;
1112
1113         if (kwb_import_pubkey(&kak_pub, &secure_hdr->kak, "KAK") < 0)
1114                 return 1;
1115
1116         if (kwb_export_pubkey(csk, &secure_hdr->csk[csk_idx], NULL, "CSK") < 0)
1117                 return 1;
1118
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)
1123                 return 1;
1124
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)
1129                 return 1;
1130
1131         secure_hdr->csksig = tmp_sig;
1132
1133         return 0;
1134 }
1135
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)
1139 {
1140         struct image_cfg_element *e_jtagdelay;
1141         struct image_cfg_element *e_boxid;
1142         struct image_cfg_element *e_flashid;
1143         RSA *csk = NULL;
1144         unsigned char *image_ptr;
1145         size_t image_size;
1146         struct sig_v1 tmp_sig;
1147         bool specialized_img = image_get_spezialized_img();
1148
1149         kwb_msg("Create secure header content\n");
1150
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);
1154
1155         if (kwb_load_csk(params, &csk) < 0)
1156                 return 1;
1157
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));
1161         if (e_jtagdelay)
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);
1167
1168         if (kwb_sign_csk_with_kak(params, secure_hdr, csk))
1169                 return 1;
1170
1171         image_ptr = ptr + headersz;
1172         image_size = payloadsz - headersz;
1173
1174         if (kwb_sign_and_verify(csk, image_ptr, image_size,
1175                                 &secure_hdr->imgsig, "image") < 0)
1176                 return 1;
1177
1178         if (kwb_sign_and_verify(csk, image, headersz, &tmp_sig, "header") < 0)
1179                 return 1;
1180
1181         secure_hdr->hdrsig = tmp_sig;
1182
1183         kwb_dump_fuse_cmds(secure_hdr);
1184
1185         return 0;
1186 }
1187 #endif
1188
1189 static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
1190                              uint8_t *ptr, int payloadsz)
1191 {
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;
1196 #endif
1197         size_t headersz;
1198         uint8_t *image, *cur;
1199         int hasext = 0;
1200         uint8_t *next_ext = NULL;
1201
1202         /*
1203          * Calculate the size of the header and the size of the
1204          * payload
1205          */
1206         headersz = image_headersz_v1(&hasext);
1207         if (headersz == 0)
1208                 return NULL;
1209
1210         image = malloc(headersz);
1211         if (!image) {
1212                 fprintf(stderr, "Cannot allocate memory for image\n");
1213                 return NULL;
1214         }
1215
1216         memset(image, 0, headersz);
1217
1218         main_hdr = (struct main_hdr_v1 *)image;
1219         cur = image;
1220         cur += sizeof(struct main_hdr_v1);
1221         next_ext = &main_hdr->ext;
1222
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);
1235         if (e)
1236                 main_hdr->blockid = e->bootfrom;
1237         e = image_find_option(IMAGE_CFG_NAND_BLKSZ);
1238         if (e)
1239                 main_hdr->nandblocksize = e->nandblksz / (64 * 1024);
1240         e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
1241         if (e)
1242                 main_hdr->nandbadblklocation = e->nandbadblklocation;
1243         e = image_find_option(IMAGE_CFG_BAUDRATE);
1244         if (e)
1245                 main_hdr->options = baudrate_to_option(e->baudrate);
1246         e = image_find_option(IMAGE_CFG_DEBUG);
1247         if (e)
1248                 main_hdr->flags = e->debug ? 0x1 : 0;
1249
1250 #if defined(CONFIG_KWB_SECURE)
1251         if (image_get_csk_index() >= 0) {
1252                 /*
1253                  * only reserve the space here; we fill the header later since
1254                  * we need the header to be complete to compute the signatures
1255                  */
1256                 secure_hdr = (struct secure_hdr_v1 *)cur;
1257                 cur += sizeof(struct secure_hdr_v1);
1258                 next_ext = &secure_hdr->next;
1259         }
1260 #endif
1261         *next_ext = 1;
1262
1263         if (add_binary_header_v1(cur))
1264                 return NULL;
1265
1266 #if defined(CONFIG_KWB_SECURE)
1267         if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz,
1268                                                headersz, image, secure_hdr))
1269                 return NULL;
1270 #endif
1271
1272         /* Calculate and set the header checksum */
1273         main_hdr->checksum = image_checksum8(main_hdr, headersz);
1274
1275         *imagesz = headersz;
1276         return image;
1277 }
1278
1279 int recognize_keyword(char *keyword)
1280 {
1281         int kw_id;
1282
1283         for (kw_id = 1; kw_id < IMAGE_CFG_COUNT; ++kw_id)
1284                 if (!strcmp(keyword, id_strs[kw_id]))
1285                         return kw_id;
1286
1287         return 0;
1288 }
1289
1290 static int image_create_config_parse_oneline(char *line,
1291                                              struct image_cfg_element *el)
1292 {
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";
1297
1298         keyword = strtok_r(line, delimiters, &saveptr);
1299         keyword_id = recognize_keyword(keyword);
1300
1301         if (!keyword_id) {
1302                 fprintf(stderr, unknown_msg, line);
1303                 return 0;
1304         }
1305
1306         el->type = keyword_id;
1307
1308         value1 = strtok_r(NULL, delimiters, &saveptr);
1309
1310         if (!value1) {
1311                 fprintf(stderr, "Parameter missing in line '%s'\n", line);
1312                 return -1;
1313         }
1314
1315         switch (keyword_id) {
1316         case IMAGE_CFG_VERSION:
1317                 el->version = atoi(value1);
1318                 break;
1319         case IMAGE_CFG_BOOT_FROM:
1320                 ret = image_boot_mode_id(value1);
1321
1322                 if (ret < 0) {
1323                         fprintf(stderr, "Invalid boot media '%s'\n", value1);
1324                         return -1;
1325                 }
1326                 el->bootfrom = ret;
1327                 break;
1328         case IMAGE_CFG_NAND_BLKSZ:
1329                 el->nandblksz = strtoul(value1, NULL, 16);
1330                 break;
1331         case IMAGE_CFG_NAND_BADBLK_LOCATION:
1332                 el->nandbadblklocation = strtoul(value1, NULL, 16);
1333                 break;
1334         case IMAGE_CFG_NAND_ECC_MODE:
1335                 ret = image_nand_ecc_mode_id(value1);
1336
1337                 if (ret < 0) {
1338                         fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value1);
1339                         return -1;
1340                 }
1341                 el->nandeccmode = ret;
1342                 break;
1343         case IMAGE_CFG_NAND_PAGESZ:
1344                 el->nandpagesz = strtoul(value1, NULL, 16);
1345                 break;
1346         case IMAGE_CFG_BINARY:
1347                 argi = 0;
1348
1349                 el->binary.file = strdup(value1);
1350                 while (1) {
1351                         char *value = strtok_r(NULL, delimiters, &saveptr);
1352
1353                         if (!value)
1354                                 break;
1355                         el->binary.args[argi] = strtoul(value, NULL, 16);
1356                         argi++;
1357                         if (argi >= BINARY_MAX_ARGS) {
1358                                 fprintf(stderr,
1359                                         "Too many arguments for BINARY\n");
1360                                 return -1;
1361                         }
1362                 }
1363                 el->binary.nargs = argi;
1364                 break;
1365         case IMAGE_CFG_DATA:
1366                 value2 = strtok_r(NULL, delimiters, &saveptr);
1367
1368                 if (!value1 || !value2) {
1369                         fprintf(stderr,
1370                                 "Invalid number of arguments for DATA\n");
1371                         return -1;
1372                 }
1373
1374                 el->regdata.raddr = strtoul(value1, NULL, 16);
1375                 el->regdata.rdata = strtoul(value2, NULL, 16);
1376                 break;
1377         case IMAGE_CFG_BAUDRATE:
1378                 el->baudrate = strtoul(value1, NULL, 10);
1379                 break;
1380         case IMAGE_CFG_DEBUG:
1381                 el->debug = strtoul(value1, NULL, 10);
1382                 break;
1383         case IMAGE_CFG_KAK:
1384                 el->key_name = strdup(value1);
1385                 break;
1386         case IMAGE_CFG_CSK:
1387                 el->key_name = strdup(value1);
1388                 break;
1389         case IMAGE_CFG_CSK_INDEX:
1390                 el->csk_idx = strtol(value1, NULL, 0);
1391                 break;
1392         case IMAGE_CFG_JTAG_DELAY:
1393                 el->jtag_delay = strtoul(value1, NULL, 0);
1394                 break;
1395         case IMAGE_CFG_BOX_ID:
1396                 el->boxid = strtoul(value1, NULL, 0);
1397                 break;
1398         case IMAGE_CFG_FLASH_ID:
1399                 el->flashid = strtoul(value1, NULL, 0);
1400                 break;
1401         case IMAGE_CFG_SEC_SPECIALIZED_IMG:
1402                 el->sec_specialized_img = true;
1403                 break;
1404         case IMAGE_CFG_SEC_COMMON_IMG:
1405                 el->sec_specialized_img = false;
1406                 break;
1407         case IMAGE_CFG_SEC_BOOT_DEV:
1408                 el->sec_boot_dev = strtoul(value1, NULL, 0);
1409                 break;
1410         case IMAGE_CFG_SEC_FUSE_DUMP:
1411                 el->name = strdup(value1);
1412                 break;
1413         default:
1414                 fprintf(stderr, unknown_msg, line);
1415         }
1416
1417         return 0;
1418 }
1419
1420 /*
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'.
1424  */
1425 static int image_create_config_parse(FILE *fcfg)
1426 {
1427         int ret;
1428         int cfgi = 0;
1429
1430         /* Parse the configuration file */
1431         while (!feof(fcfg)) {
1432                 char *line;
1433                 char buf[256];
1434
1435                 /* Read the current line */
1436                 memset(buf, 0, sizeof(buf));
1437                 line = fgets(buf, sizeof(buf), fcfg);
1438                 if (!line)
1439                         break;
1440
1441                 /* Ignore useless lines */
1442                 if (line[0] == '\n' || line[0] == '#')
1443                         continue;
1444
1445                 /* Strip final newline */
1446                 if (line[strlen(line) - 1] == '\n')
1447                         line[strlen(line) - 1] = 0;
1448
1449                 /* Parse the current line */
1450                 ret = image_create_config_parse_oneline(line,
1451                                                         &image_cfg[cfgi]);
1452                 if (ret)
1453                         return ret;
1454
1455                 cfgi++;
1456
1457                 if (cfgi >= IMAGE_CFG_ELEMENT_MAX) {
1458                         fprintf(stderr,
1459                                 "Too many configuration elements in .cfg file\n");
1460                         return -1;
1461                 }
1462         }
1463
1464         cfgn = cfgi;
1465         return 0;
1466 }
1467
1468 static int image_get_version(void)
1469 {
1470         struct image_cfg_element *e;
1471
1472         e = image_find_option(IMAGE_CFG_VERSION);
1473         if (!e)
1474                 return -1;
1475
1476         return e->version;
1477 }
1478
1479 static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
1480                                 struct image_tool_params *params)
1481 {
1482         FILE *fcfg;
1483         void *image = NULL;
1484         int version;
1485         size_t headersz = 0;
1486         uint32_t checksum;
1487         int ret;
1488         int size;
1489
1490         fcfg = fopen(params->imagename, "r");
1491         if (!fcfg) {
1492                 fprintf(stderr, "Could not open input file %s\n",
1493                         params->imagename);
1494                 exit(EXIT_FAILURE);
1495         }
1496
1497         image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1498                            sizeof(struct image_cfg_element));
1499         if (!image_cfg) {
1500                 fprintf(stderr, "Cannot allocate memory\n");
1501                 fclose(fcfg);
1502                 exit(EXIT_FAILURE);
1503         }
1504
1505         memset(image_cfg, 0,
1506                IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1507         rewind(fcfg);
1508
1509         ret = image_create_config_parse(fcfg);
1510         fclose(fcfg);
1511         if (ret) {
1512                 free(image_cfg);
1513                 exit(EXIT_FAILURE);
1514         }
1515
1516         /* The MVEBU BootROM does not allow non word aligned payloads */
1517         sbuf->st_size = ALIGN_SUP(sbuf->st_size, 4);
1518
1519         version = image_get_version();
1520         switch (version) {
1521                 /*
1522                  * Fallback to version 0 if no version is provided in the
1523                  * cfg file
1524                  */
1525         case -1:
1526         case 0:
1527                 image = image_create_v0(&headersz, params, sbuf->st_size);
1528                 break;
1529
1530         case 1:
1531                 image = image_create_v1(&headersz, params, ptr, sbuf->st_size);
1532                 break;
1533
1534         default:
1535                 fprintf(stderr, "Unsupported version %d\n", version);
1536                 free(image_cfg);
1537                 exit(EXIT_FAILURE);
1538         }
1539
1540         if (!image) {
1541                 fprintf(stderr, "Could not create image\n");
1542                 free(image_cfg);
1543                 exit(EXIT_FAILURE);
1544         }
1545
1546         free(image_cfg);
1547
1548         /* Build and add image checksum header */
1549         checksum =
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);
1555                 exit(EXIT_FAILURE);
1556         }
1557
1558         sbuf->st_size += sizeof(uint32_t);
1559
1560         /* Finally copy the header into the image area */
1561         memcpy(ptr, image, headersz);
1562
1563         free(image);
1564 }
1565
1566 static void kwbimage_print_header(const void *ptr)
1567 {
1568         struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1569
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);
1577 }
1578
1579 static int kwbimage_check_image_types(uint8_t type)
1580 {
1581         if (type == IH_TYPE_KWBIMAGE)
1582                 return EXIT_SUCCESS;
1583
1584         return EXIT_FAILURE;
1585 }
1586
1587 static int kwbimage_verify_header(unsigned char *ptr, int image_size,
1588                                   struct image_tool_params *params)
1589 {
1590         struct main_hdr_v0 *main_hdr;
1591         uint8_t checksum;
1592
1593         main_hdr = (struct main_hdr_v0 *)ptr;
1594         checksum = image_checksum8(ptr,
1595                                    sizeof(struct main_hdr_v0)
1596                                    - sizeof(uint8_t));
1597         if (checksum != main_hdr->checksum)
1598                 return -FDT_ERR_BADSTRUCTURE;
1599
1600         /* Only version 0 extended header has checksum */
1601         if (image_version((void *)ptr) == 0) {
1602                 struct ext_hdr_v0 *ext_hdr;
1603
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)
1608                                            - sizeof(uint8_t));
1609                 if (checksum != ext_hdr->checksum)
1610                         return -FDT_ERR_BADSTRUCTURE;
1611         }
1612
1613         return 0;
1614 }
1615
1616 static int kwbimage_generate(struct image_tool_params *params,
1617                              struct image_type_params *tparams)
1618 {
1619         FILE *fcfg;
1620         int alloc_len;
1621         int version;
1622         void *hdr;
1623         int ret;
1624
1625         fcfg = fopen(params->imagename, "r");
1626         if (!fcfg) {
1627                 fprintf(stderr, "Could not open input file %s\n",
1628                         params->imagename);
1629                 exit(EXIT_FAILURE);
1630         }
1631
1632         image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1633                            sizeof(struct image_cfg_element));
1634         if (!image_cfg) {
1635                 fprintf(stderr, "Cannot allocate memory\n");
1636                 fclose(fcfg);
1637                 exit(EXIT_FAILURE);
1638         }
1639
1640         memset(image_cfg, 0,
1641                IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1642         rewind(fcfg);
1643
1644         ret = image_create_config_parse(fcfg);
1645         fclose(fcfg);
1646         if (ret) {
1647                 free(image_cfg);
1648                 exit(EXIT_FAILURE);
1649         }
1650
1651         version = image_get_version();
1652         switch (version) {
1653                 /*
1654                  * Fallback to version 0 if no version is provided in the
1655                  * cfg file
1656                  */
1657         case -1:
1658         case 0:
1659                 alloc_len = sizeof(struct main_hdr_v0) +
1660                         sizeof(struct ext_hdr_v0);
1661                 break;
1662
1663         case 1:
1664                 alloc_len = image_headersz_v1(NULL);
1665                 break;
1666
1667         default:
1668                 fprintf(stderr, "Unsupported version %d\n", version);
1669                 free(image_cfg);
1670                 exit(EXIT_FAILURE);
1671         }
1672
1673         free(image_cfg);
1674
1675         hdr = malloc(alloc_len);
1676         if (!hdr) {
1677                 fprintf(stderr, "%s: malloc return failure: %s\n",
1678                         params->cmdname, strerror(errno));
1679                 exit(EXIT_FAILURE);
1680         }
1681
1682         memset(hdr, 0, alloc_len);
1683         tparams->header_size = alloc_len;
1684         tparams->hdr = hdr;
1685
1686         /*
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.
1693          */
1694         return 1;
1695 }
1696
1697 /*
1698  * Report Error if xflag is set in addition to default
1699  */
1700 static int kwbimage_check_params(struct image_tool_params *params)
1701 {
1702         if (!strlen(params->imagename)) {
1703                 char *msg = "Configuration file for kwbimage creation omitted";
1704
1705                 fprintf(stderr, "Error:%s - %s\n", params->cmdname, msg);
1706                 return CFG_INVALID;
1707         }
1708
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));
1713 }
1714
1715 /*
1716  * kwbimage type parameters definition
1717  */
1718 U_BOOT_IMAGE_TYPE(
1719         kwbimage,
1720         "Marvell MVEBU Boot Image support",
1721         0,
1722         NULL,
1723         kwbimage_check_params,
1724         kwbimage_verify_header,
1725         kwbimage_print_header,
1726         kwbimage_set_header,
1727         NULL,
1728         kwbimage_check_image_types,
1729         NULL,
1730         kwbimage_generate
1731 );