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