22 months agoMerge pull request #14 from agross-korg/tlv-changes master
Andy Gross [Wed, 11 Nov 2020 04:35:04 +0000 (22:35 -0600)] 
Merge pull request #14 from agross-korg/tlv-changes

Pull in mynewt-artifact v0.0.20

22 months agoPull in mynewt-artifact v0.0.20 14/head
Andy Gross [Mon, 26 Oct 2020 15:56:51 +0000 (10:56 -0500)] 
Pull in mynewt-artifact v0.0.20

This patch updates the mynewt-artifact to v0.0.20 to pick up additional TLV
support for AES_NONCE, SECRET_ID, and SECTION.

Signed-off-by: Andy Gross <>
22 months agogo.mod: Update to mynewt-artifact 0.0.19
Christopher Collins [Wed, 12 Aug 2020 23:56:09 +0000 (16:56 -0700)] 
go.mod: Update to mynewt-artifact 0.0.19

This adds some missing fields to the `imgmod image show` output.

2 years agoDon't print warning if `-q` specified
Christopher Collins [Thu, 5 Mar 2020 17:26:48 +0000 (09:26 -0800)] 
Don't print warning if `-q` specified

2 years agoPull in mynewt-artifact 0.0.18
Christopher Collins [Thu, 5 Mar 2020 02:04:38 +0000 (18:04 -0800)] 
Pull in mynewt-artifact 0.0.18

This fixes the `imgmod mfg split` command.

2 years agomfg split: Don't discard trailing 0xff bytes
Christopher Collins [Wed, 12 Feb 2020 22:52:12 +0000 (14:52 -0800)] 
mfg split: Don't discard trailing 0xff bytes

The `mfg split` command separates an mfgimg binary into several files,
one for each flash area.

Prior to this commit, imgmod would strip all trailing erase-val bytes
(0xff) from each file.  Usually this was the correct behavior, but if
the contents of a flash area legitimately ended with an erase-val byte,
then the file would be corrupted during this step.

The problem is that `newt` was throwing away information when it created
mfgimages.  It embedded the specified binaries into a single mfgimage
and filled in the gaps with erase-val bytes, and it did this without
leaving any indication of the sizes of the binaries used as input.

Newt was recently changed to include the sizes of these binaries in the
`manifest.json` file that accompanies an mfgimage.  This commit changes
imgmod to read these sizes from the manifest file so that it knows how
many erase-val bytes it can safely strip.

If the manifest does not contain size information (backwards
compatibility), imgmod falls back to the old behavior or stripping all
trailing erase-val bytes.

2 years agoNew command: image rehash
Christopher Collins [Sat, 29 Feb 2020 00:27:56 +0000 (16:27 -0800)] 
New command: image rehash

2 years agoNew command: image extractbody
Christopher Collins [Sat, 29 Feb 2020 00:27:31 +0000 (16:27 -0800)] 
New command: image extractbody

2 years agoNew command: image setbody
Christopher Collins [Sat, 29 Feb 2020 00:26:41 +0000 (16:26 -0800)] 
New command: image setbody

2 years agoNew command: image decrypthw
Christopher Collins [Sat, 29 Feb 2020 00:26:10 +0000 (16:26 -0800)] 
New command: image decrypthw

2 years agoimage addsig: Allow sig type to be in hexadecimal
Christopher Collins [Sat, 29 Feb 2020 00:24:28 +0000 (16:24 -0800)] 
image addsig: Allow sig type to be in hexadecimal

2 years agoimage hashable: Include padding and protected TLVs
Christopher Collins [Sat, 29 Feb 2020 00:23:30 +0000 (16:23 -0800)] 
image hashable: Include padding and protected TLVs

Header padding and protected TLVs are inputs during hash calculation.
Update the `image hashable` command to account for this.

2 years agoFix bad copy+paste in help text
Christopher Collins [Sat, 29 Feb 2020 00:28:10 +0000 (16:28 -0800)] 
Fix bad copy+paste in help text

2 years agoPull in latest mynewt-artifact
Christopher Collins [Sat, 29 Feb 2020 00:49:12 +0000 (16:49 -0800)] 
Pull in latest mynewt-artifact

2 years ago.gitignore: Ignore `imgmod` binary
Christopher Collins [Thu, 20 Feb 2020 18:00:23 +0000 (10:00 -0800)] 
.gitignore: Ignore `imgmod` binary

2 years agoUse Makefile to embed version string
Christopher Collins [Thu, 20 Feb 2020 17:59:32 +0000 (09:59 -0800)] 
Use Makefile to embed version string

This allows us to include a git hash and build date in the
`imgmod version` output.

2 years agoUpdate to latest mynewt-artifact (0.0.15)
Christopher Collins [Wed, 5 Feb 2020 00:36:01 +0000 (16:36 -0800)] 
Update to latest mynewt-artifact (0.0.15)

This pulls in a fix for verifying images with header padding.

2 years agoAdd new command: `imgmod key show`
Christopher Collins [Thu, 31 Oct 2019 17:13:48 +0000 (10:13 -0700)] 
Add new command: `imgmod key show`

    show - Displays JSON describing one or more keys

      imgmod key show <key-file> [key-files...] [flags]

2 years agoAdd .gitignore
Christopher Collins [Thu, 31 Oct 2019 17:13:55 +0000 (10:13 -0700)] 
Add .gitignore

2 years agomfg: Allow verification of embedded images
Christopher Collins [Mon, 1 Jul 2019 22:39:31 +0000 (15:39 -0700)] 
mfg: Allow verification of embedded images

The `mfg verify` command now takes a new option: `--images`.  If
this option is specified, the command verifies images embedded in the
mfgimage.  Keys used during this check are passed via the `--signkey`
and `--enckey` options (both may be repeated for multiple keys).

3 years agoRemove all dependencies on the newt repo
Christopher Collins [Thu, 27 Jun 2019 20:23:36 +0000 (13:23 -0700)] 
Remove all dependencies on the newt repo

The imgmod tool was using the util package in the newt repo
(  This commit removes this dependency.

3 years agoUse external artifact package
Christopher Collins [Wed, 26 Jun 2019 21:52:28 +0000 (14:52 -0700)] 
Use external artifact package

The artifact package has been moved out of the newt repo and into its
own repo (  Use this external package
rather than the deprecated one in the newt repo.

3 years agoMerge pull request #2 from ccollins476ad/crypt-full
ccollins476ad [Mon, 10 Jun 2019 23:55:25 +0000 (16:55 -0700)] 
Merge pull request #2 from ccollins476ad/crypt-full

Distinguish partial {en|de}crypt from full

3 years agoDepend on latest 2/head
Christopher Collins [Wed, 29 May 2019 17:10:58 +0000 (10:10 -0700)] 
Depend on latest

3 years agoDistinguish partial {en|de}crypt from full
Christopher Collins [Wed, 29 May 2019 17:08:09 +0000 (10:08 -0700)] 
Distinguish partial {en|de}crypt from full

When we calculate a build's SHA256, we provide two inputs to the hash
1. Image header
2. Unencrypted image body

The image header contains an "encrypted" flag
(`IMAGE_F_ENCRYPTED`).  This has an interesting implication: when we
decrypt a build, its hash is no longer valid.

There are two use cases for decrypting an image:

1. Create an unencrypted version of the image.

For this use case, the decrypted image should be well formed and usable
as an unencrypted image.

2. Re-sign an image with a new key.

For this use case, the procedure typically looks like this:

a. Start with a signed and encrypted image.
b. Decrypt image (`imgmod image decrypt`).
c. Remove signature TLVs (`imgmod image rmsigs`).
d. Re-sign image (`imgmod image sign`).
e. Re-encrypt image (`imgmod image encrypt`).

In this use case, it is critical that step b (decrypt) does *not* clear
the `IMAGE_F_ENCRYPTED` flag from the image header.  This flag must
remain set so that the signature produced in step d is valid.

So we need two sets of {en|de}crypt commands:
* Full
* Partial

The "full" versions apply to use case 1.
The "partial" versions apply to use case 2.

The old commands (`image encrypt`, `image decrypt`) are the partial
versions.  These remain unchanged.

The new commands (`image encryptfull` `image decryptfull`) are the full

3 years agoFix case: addtlvs --> addTlvs
Christopher Collins [Fri, 24 May 2019 19:35:41 +0000 (12:35 -0700)] 
Fix case: addtlvs --> addTlvs

3 years agoWarn when `hashable` is used on an encrypted image
Christopher Collins [Fri, 24 May 2019 19:31:49 +0000 (12:31 -0700)] 
Warn when `hashable` is used on an encrypted image

An image's hash is calculated from the following two inputs:
1. Image header.
2. Unencrypted image body.

The `image hashable` command extracts the header and body from a
complete image.  If the image body is encrypted, then the result of this
command will not generate the correct hash.

This commit adds a warning in case `image hashable` is used on an
encrypyted image.

3 years agoRename old "larva" files
Christopher Collins [Fri, 24 May 2019 18:29:02 +0000 (11:29 -0700)] 
Rename old "larva" files

renamed:    iimg/lvimg.go -> iimg/iimg.go
renamed:    imfg/lvmfg.go -> imfg/imfg.go

"lv" was short for larva (this tool's previous name).  Now that the tool
is called imgmod, replace "lv" with "i".

3 years agoMerge pull request #1 from ccollins476ad/encrypt-flag
ccollins476ad [Fri, 10 May 2019 21:26:12 +0000 (14:26 -0700)] 
Merge pull request #1 from ccollins476ad/encrypt-flag

Set / clear "encrypt" flag in image header

3 years agoSet / clear "encrypt" flag in image header 1/head
Christopher Collins [Fri, 10 May 2019 21:24:19 +0000 (14:24 -0700)] 
Set / clear "encrypt" flag in image header

3 years agoimgmod - initial commit
Christopher Collins [Fri, 22 Mar 2019 23:01:53 +0000 (16:01 -0700)] 
imgmod - initial commit