diff --git a/scripts/imgtool.py b/scripts/imgtool.py
new file mode 100755
index 0000000..4f5e56b
--- /dev/null
+++ b/scripts/imgtool.py
@@ -0,0 +1,94 @@
+#! /usr/bin/env python3
+
+import argparse
+from imgtool import keys
+from imgtool import image
+from imgtool import version
+import sys
+
+def gen_rsa2048(args):
+    keys.RSA2048.generate().export_private(args.keyfile)
+def gen_ecdsa_p256(args):
+    keys.ecdsa256p1.generate().export_private(args.keyfile)
+def gen_ecdsa_p224(args):
+    print("TODO: p-224 not yet implemented")
+
+keygens = {
+        'rsa-2048': gen_rsa2048,
+        'ecdsa-p256': gen_ecdsa_p256,
+        'ecdsa-p224': gen_ecdsa_p224, }
+
+def do_keygen(args):
+    if args.type not in keygens:
+        msg = "Unexpected key type: {}".format(args.type)
+        raise argparse.ArgumentTypeError(msg)
+    keygens[args.type](args)
+
+def do_getpub(args):
+    key = keys.load(args.key)
+    key.emit_c()
+
+def do_sign(args):
+    align = args.align
+    # print('sign:', args)
+    img = image.Image.load(args.infile, version=args.version,
+            header_size=args.header_size,
+            pad=args.pad)
+    key = keys.load(args.key)
+    img.sign(key)
+
+    if args.pad:
+        img.pad_to(args.pad, args.align)
+
+    img.save(args.outfile)
+
+subcmds = {
+        'keygen': do_keygen,
+        'getpub': do_getpub,
+        'sign': do_sign, }
+
+def alignment_value(text):
+    value = int(text)
+    if value not in [1, 2, 4, 8]:
+        msg = "{} must be one of 1, 2, 4 or 8".format(value)
+        raise argparse.ArgumentTypeError(msg)
+    return value
+
+def intparse(text):
+    """Parse a command line argument as an integer.
+
+    Accepts 0x and other prefixes to allow other bases to be used."""
+    return int(text, 0)
+
+def args():
+    parser = argparse.ArgumentParser()
+    subs = parser.add_subparsers(help='subcommand help', dest='subcmd')
+
+    keygenp = subs.add_parser('keygen', help='Generate pub/private keypair')
+    keygenp.add_argument('-k', '--key', metavar='filename', required=True)
+    keygenp.add_argument('-t', '--type', metavar='type',
+            choices=['rsa-2048', 'ecdsa-p224', 'ecdsa-p256'],
+            required=True)
+
+    getpub = subs.add_parser('getpub', help='Get public key from keypair')
+    getpub.add_argument('-k', '--key', metavar='filename', required=True)
+
+    sign = subs.add_parser('sign', help='Sign an image with a private key')
+    sign.add_argument('-k', '--key', metavar='filename', required=True)
+    sign.add_argument("--align", type=alignment_value, required=True)
+    sign.add_argument("-v", "--version", type=version.decode_version, required=True)
+    sign.add_argument("-H", "--header-size", type=intparse, required=True)
+    sign.add_argument("--pad", type=intparse,
+            help='Pad image to this many bytes, adding trailer magic')
+    sign.add_argument("infile")
+    sign.add_argument("outfile")
+
+    args = parser.parse_args()
+    if args.subcmd is None:
+        print('Must specify a subcommand', file=sys.stderr)
+        sys.exit(1)
+
+    subcmds[args.subcmd](args)
+
+if __name__ == '__main__':
+    args()
diff --git a/scripts/imgtool/__init__.py b/scripts/imgtool/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/scripts/imgtool/__init__.py
diff --git a/scripts/imgtool/image.py b/scripts/imgtool/image.py
new file mode 100644
index 0000000..10b2d25
--- /dev/null
+++ b/scripts/imgtool/image.py
@@ -0,0 +1,163 @@
+"""
+Image signing and management.
+"""
+
+from . import version as versmod
+import hashlib
+import struct
+
+IMAGE_MAGIC = 0x96f3b83c
+IMAGE_HEADER_SIZE = 32
+
+# Image header flags.
+IMAGE_F = {
+        'PIC':                   0x0000001,
+        'SHA256':                0x0000002,
+        'PKCS15_RSA2048_SHA256': 0x0000004,
+        'ECDSA224_SHA256':       0x0000008,
+        'NON_BOOTABLE':          0x0000010,
+        'ECDSA256_SHA256':       0x0000020, }
+
+TLV_VALUES = {
+        'SHA256': 1,
+        'RSA2048': 2,
+        'ECDSA224': 3,
+        'ECDSA256': 4, }
+
+TLV_HEADER_SIZE = 4
+
+# Sizes of the image trailer, depending on image alignment.
+trailer_sizes = {
+        1: 402,
+        2: 788,
+        4: 1560,
+        8: 3104, }
+
+boot_magic = bytes([
+    0x77, 0xc2, 0x95, 0xf3,
+    0x60, 0xd2, 0xef, 0x7f,
+    0x35, 0x52, 0x50, 0x0f,
+    0x2c, 0xb6, 0x79, 0x80, ])
+
+class TLV():
+    def __init__(self):
+        self.buf = bytearray()
+
+    def add(self, kind, payload):
+        """Add a TLV record.  Kind should be a string found in TLV_VALUES above."""
+        buf = struct.pack('<BBH', TLV_VALUES[kind], 0, len(payload))
+        self.buf += buf
+        self.buf += payload
+
+    def get(self):
+        return bytes(self.buf)
+
+class Image():
+    @classmethod
+    def load(cls, path, **kwargs):
+        """Load an image from a given file"""
+        with open(path, 'rb') as f:
+            payload = f.read()
+        obj = cls(**kwargs)
+        obj.payload = payload
+        obj.check()
+        return obj
+
+    def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE, pad=0):
+        self.version = version or versmod.decode_version("0")
+        self.header_size = header_size or IMAGE_HEADER_SIZE
+        self.pad = pad
+
+    def __repr__(self):
+        return "<Image version={}, header_size={}, pad={}, payloadlen=0x{:x}>".format(
+                self.version,
+                self.header_size,
+                self.pad,
+                len(self.payload))
+
+    def save(self, path):
+        with open(path, 'wb') as f:
+            f.write(self.payload)
+
+    def check(self):
+        """Perform some sanity checking of the image."""
+        # If there is a header requested, make sure that the image
+        # starts with all zeros.
+        if self.header_size > 0:
+            if any(v != 0 for v in self.payload[0:self.header_size]):
+                raise Exception("Padding requested, but image does not start with zeros")
+
+    def sign(self, key):
+        self.add_header(key)
+
+        tlv = TLV()
+
+        # Note that ecdsa wants to do the hashing itself, which means
+        # we get to hash it twice.
+        sha = hashlib.sha256()
+        sha.update(self.payload)
+        digest = sha.digest()
+
+        tlv.add('SHA256', digest)
+
+        sig = key.sign(self.payload)
+        tlv.add(key.sig_tlv(), sig)
+
+        self.payload += tlv.get()
+
+    def add_header(self, key):
+        """Install the image header.
+
+        The key is needed to know the type of signature, and
+        approximate the size of the signature."""
+
+        flags = IMAGE_F[key.sig_type()]
+        tlvsz = 0
+        tlvsz += TLV_HEADER_SIZE + key.sig_len()
+
+        flags |= IMAGE_F['SHA256']
+        tlvsz += 4 + hashlib.sha256().digest_size
+
+        fmt = ('<' +
+            # type ImageHdr struct {
+            'I' +   # Magic uint32
+            'H' +   # TlvSz uint16
+            'B' +   # KeyId uint8
+            'B' +   # Pad1  uint8
+            'H' +   # HdrSz uint16
+            'H' +   # Pad2  uint16
+            'I' +   # ImgSz uint32
+            'I' +   # Flags uint32
+            'BBHI' + # Vers  ImageVersion
+            'I'     # Pad3  uint32
+            ) # }
+        assert struct.calcsize(fmt) == IMAGE_HEADER_SIZE
+        header = struct.pack(fmt,
+                IMAGE_MAGIC,
+                tlvsz, # TlvSz
+                0, # KeyId (TODO: allow other ids)
+                0,  # Pad1
+                self.header_size,
+                0, # Pad2
+                len(self.payload) - self.header_size, # ImageSz
+                flags, # Flags
+                self.version.major,
+                self.version.minor or 0,
+                self.version.revision or 0,
+                self.version.build or 0,
+                0) # Pad3
+        self.payload = bytearray(self.payload)
+        self.payload[:len(header)] = header
+
+    def pad_to(self, size, align):
+        """Pad the image to the given size, with the given flash alignment."""
+        tsize = trailer_sizes[align]
+        padding = size - (len(self.payload) + tsize)
+        if padding < 0:
+            msg = "Image size (0x{:x}) + trailer (0x{:x}) exceeds requested size 0x{:x}".format(
+                    len(self.payload), tsize, size)
+            raise Exception(msg)
+        pbytes = b'\xff' * padding
+        pbytes += boot_magic
+        pbytes += b'\xff' * (tsize - len(boot_magic))
+        self.payload += pbytes
diff --git a/scripts/imgtool/keys.py b/scripts/imgtool/keys.py
new file mode 100644
index 0000000..d529b59
--- /dev/null
+++ b/scripts/imgtool/keys.py
@@ -0,0 +1,126 @@
+"""
+Cryptographic key management for imgtool.
+"""
+
+from Crypto.Hash import SHA256
+from Crypto.PublicKey import RSA
+from Crypto.Signature import PKCS1_v1_5
+from ecdsa import SigningKey, NIST256p, util
+from pyasn1.type import namedtype, univ
+from pyasn1.codec.der.encoder import encode
+
+AUTOGEN_MESSAGE = "/* Autogenerated by imgtool.py, do not edit. */"
+
+class RSAPublicKey(univ.Sequence):
+    componentType = namedtype.NamedTypes(
+            namedtype.NamedType('modulus', univ.Integer()),
+            namedtype.NamedType('publicExponent', univ.Integer()))
+
+class RSA2048():
+    def __init__(self, key):
+        """Construct an RSA2048 key with the given key data"""
+        self.key = key
+
+    @staticmethod
+    def generate():
+        return RSA2048(RSA.generate(2048))
+
+    def export_private(self, path):
+        with open(path, 'wb') as f:
+            f.write(self.key.exportKey('PEM'))
+
+    def emit_c(self):
+        node = RSAPublicKey()
+        node['modulus'] = self.key.n
+        node['publicExponent'] = self.key.e
+        print(AUTOGEN_MESSAGE)
+        print("const unsigned char rsa_pub_key[] = {", end='')
+        encoded = bytearray(encode(node))
+        for count, b in enumerate(encoded):
+            if count % 8 == 0:
+                print("\n\t", end='')
+            else:
+                print(" ", end='')
+            print("0x{:02x},".format(b), end='')
+        print("\n};")
+        print("const unsigned int rsa_pub_key_len = {};".format(len(encoded)))
+
+    def sig_type(self):
+        """Return the type of this signature (as a string)"""
+        return "PKCS15_RSA2048_SHA256"
+
+    def sig_len(self):
+        return 256
+
+    def sig_tlv(self):
+        return "RSA2048"
+
+    def sign(self, payload):
+        sha = SHA256.new(payload)
+        signer = PKCS1_v1_5.new(self.key)
+        signature = signer.sign(sha)
+        assert len(signature) == self.sig_len()
+        return signature
+
+class ECDSA256P1():
+    def __init__(self, key):
+        """Construct an ECDSA P-256 private key"""
+        self.key = key
+
+    @staticmethod
+    def generate():
+        return ECDSA256P1(SigningKey.generate(curve=NIST256p))
+
+    def export_private(self, path):
+        with open(path, 'wb') as f:
+            f.write(key.to_pem())
+
+    def emit_c(self):
+        vk = self.key.get_verifying_key()
+        print(AUTOGEN_MESSAGE)
+        print("const unsigned char ecdsa_pub_key[] = {", end='')
+        encoded = bytes(vk.to_der())
+        for count, b in enumerate(encoded):
+            if count % 8 == 0:
+                print("\n\t", end='')
+            else:
+                print(" ", end='')
+            print("0x{:02x},".format(b), end='')
+        print("\n};")
+        print("const unsigned int ecdsa_pub_key_len = {};".format(len(encoded)))
+
+    def sign(self, payload):
+        # To make this fixed length, possibly pad with zeros.
+        sig = self.key.sign(payload, hashfunc=hashlib.sha256, sigencode=util.sigencode_der)
+        sig += b'\000' * (self.sig_len() - len(sig))
+        return sig
+
+    def sig_len(self):
+        # The DER encoding depends on the high bit, and can be
+        # anywhere from 70 to 72 bytes.  Because we have to fill in
+        # the length field before computing the signature, however,
+        # we'll give the largest, and the sig checking code will allow
+        # for it to be up to two bytes larger than the actual
+        # signature.
+        return 72
+
+    def sig_type(self):
+        """Return the type of this signature (as a string)"""
+        return "ECDSA256_SHA256"
+
+    def sig_tlv(self):
+        return "ECDSA256"
+
+def load(path):
+    with open(path, 'rb') as f:
+        pem = f.read()
+    try:
+        key = RSA.importKey(pem)
+        if key.n.bit_length() != 2048:
+            raise Exception("Unsupported RSA bit length, only 2048 supported")
+        return RSA2048(key)
+    except ValueError:
+        key = SigningKey.from_pem(pem)
+        if key.curve.name != 'NIST256p':
+            raise Exception("Unsupported ECDSA curve")
+        return ECDSA256P1(key)
diff --git a/scripts/imgtool/version.py b/scripts/imgtool/version.py
new file mode 100644
index 0000000..eac3667
--- /dev/null
+++ b/scripts/imgtool/version.py
@@ -0,0 +1,27 @@
+"""
+Semi Semantic Versioning
+
+Implements a subset of semantic versioning that is supportable by the image header.
+"""
+
+from collections import namedtuple
+import re
+
+SemiSemVersion = namedtuple('SemiSemVersion', ['major', 'minor', 'revision', 'build'])
+
+version_re = re.compile(r"""^([1-9]\d*)(\.([1-9]\d*)(\.([1-9]\d*)(\+([a-z1-9-][a-z0-9-]*))?)?)?$""")
+def decode_version(text):
+    """Decode the version string, which should be of the form maj.min.rev+build"""
+    # print("decode:", text)
+    m = version_re.match(text)
+    if m:
+        result = SemiSemVersion(
+                int(m.group(1)) if m.group(1) else 0,
+                int(m.group(3)) if m.group(3) else 0,
+                int(m.group(5)) if m.group(5) else 0,
+                int(m.group(7)) if m.group(7) else 0)
+        return result
+    else:
+        msg = "Invalid version number, should be maj.min.rev+build with later parts optional"
+        raise argparse.ArgumentTypeError(msg)
+
