diff --git a/scripts/sign.py b/scripts/sign.py
index f407f3b..5c65630 100755
--- a/scripts/sign.py
+++ b/scripts/sign.py
@@ -1,8 +1,10 @@
 #!/usr/bin/env python
 #
-# Copyright (c) 2015, Linaro Limited
+# Copyright (c) 2015, 2017, Linaro Limited
 # All rights reserved.
 #
+# SPDX-License-Identifier: BSD-2-Clause
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
 #
@@ -24,57 +26,76 @@
 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
-#
+
+def uuid_parse(s):
+    from uuid import UUID
+    return UUID(s)
+
+
+def int_parse(str):
+    return int(str, 0)
+
 
 def get_args():
-	from argparse import ArgumentParser
+    from argparse import ArgumentParser
 
-	parser = ArgumentParser()
-	parser.add_argument('--key', required=True, help='Name of key file')
-	parser.add_argument('--in', required=True, dest='inf', \
-			help='Name of in file')
-	parser.add_argument('--out', required=True, help='Name of out file')
-	return parser.parse_args()
+    parser = ArgumentParser()
+    parser.add_argument('--uuid', required=True,
+                        type=uuid_parse, help='UUID of TA')
+    parser.add_argument('--version', type=int_parse, default=0, help='Version')
+    parser.add_argument('--key', required=True, help='Name of key file')
+    parser.add_argument('--in', required=True, dest='inf',
+                        help='Name of in file')
+    parser.add_argument('--out', required=True, help='Name of out file')
+    return parser.parse_args()
+
 
 def main():
-	from Crypto.Signature import PKCS1_v1_5
-	from Crypto.Hash import SHA256
-	from Crypto.PublicKey import RSA
-	import struct
+    from Crypto.Signature import PKCS1_v1_5
+    from Crypto.Hash import SHA256
+    from Crypto.PublicKey import RSA
+    import struct
 
-	args = get_args()
+    args = get_args()
 
-	f = open(args.key, 'rb')
-	key = RSA.importKey(f.read())
-	f.close()
+    f = open(args.key, 'rb')
+    key = RSA.importKey(f.read())
+    f.close()
 
-	f = open(args.inf, 'rb')
-	img = f.read()
-	f.close()
+    f = open(args.inf, 'rb')
+    img = f.read()
+    f.close()
 
-	signer = PKCS1_v1_5.new(key)
-	h = SHA256.new()
+    signer = PKCS1_v1_5.new(key)
+    h = SHA256.new()
 
-	digest_len = h.digest_size
-	sig_len = len(signer.sign(h))
-	img_size = len(img)
+    digest_len = h.digest_size
+    sig_len = len(signer.sign(h))
+    img_size = len(img)
 
-	magic = 0x4f545348	# SHDR_MAGIC
-	img_type = 0		# SHDR_TA
-	algo = 0x70004830	# TEE_ALG_RSASSA_PKCS1_V1_5_SHA256
-	shdr = struct.pack('<IIIIHH', \
-		magic, img_type, img_size, algo, digest_len, sig_len)
+    magic = 0x4f545348    # SHDR_MAGIC
+    img_type = 1        # SHDR_BOOTSTRAP_TA
+    algo = 0x70004830    # TEE_ALG_RSASSA_PKCS1_V1_5_SHA256
+    shdr = struct.pack('<IIIIHH',
+                       magic, img_type, img_size, algo, digest_len, sig_len)
+    shdr_uuid = args.uuid.bytes
+    shdr_version = struct.pack('<I', args.version)
 
-	h.update(shdr)
-	h.update(img)
-	sig = signer.sign(h)
+    h.update(shdr)
+    h.update(shdr_uuid)
+    h.update(shdr_version)
+    h.update(img)
+    sig = signer.sign(h)
 
-	f = open(args.out, 'wb')
-	f.write(shdr)
-	f.write(h.digest())
-	f.write(sig)
-	f.write(img)
-	f.close()
+    f = open(args.out, 'wb')
+    f.write(shdr)
+    f.write(h.digest())
+    f.write(sig)
+    f.write(shdr_uuid)
+    f.write(shdr_version)
+    f.write(img)
+    f.close()
+
 
 if __name__ == "__main__":
-	main()
+    main()
