From cf9c97288eff9464bd8cf264f8e1ba4776ad1ab9 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 31 Jan 2018 14:45:02 +0100 Subject: [PATCH] build: rework vendorheader handling, move them to embed/vendorheader --- Makefile | 8 -------- SConscript.firmware | 6 ++++-- SConscript.prodtest | 4 +++- SConscript.reflash | 4 +++- assets/vendor_devel.toif | Bin 5115 -> 0 bytes build-docker.gcc_source.sh | 2 +- build-docker.sh | 2 +- embed/firmware/.gitignore | 1 - embed/vendorheader/generate.sh | 13 +++++++++++++ .../vendorheader}/vendor_satoshilabs.toif | Bin embed/vendorheader/vendor_unsafe.toif | Bin 0 -> 2179 bytes .../vendorheader_satoshilabs_signed_prod.bin} | Bin .../vendorheader_satoshilabs_unsigned.bin | Bin 0 -> 4608 bytes .../vendorheader_unsafe_signed_dev.bin | Bin 0 -> 2560 bytes .../vendorheader_unsafe_unsigned.bin | Bin 0 -> 2560 bytes 15 files changed, 25 insertions(+), 15 deletions(-) delete mode 100644 assets/vendor_devel.toif delete mode 100644 embed/firmware/.gitignore create mode 100755 embed/vendorheader/generate.sh rename {assets => embed/vendorheader}/vendor_satoshilabs.toif (100%) create mode 100644 embed/vendorheader/vendor_unsafe.toif rename embed/{firmware/vendorheader_sl_signed.bin => vendorheader/vendorheader_satoshilabs_signed_prod.bin} (100%) create mode 100644 embed/vendorheader/vendorheader_satoshilabs_unsigned.bin create mode 100644 embed/vendorheader/vendorheader_unsafe_signed_dev.bin create mode 100644 embed/vendorheader/vendorheader_unsafe_unsigned.bin diff --git a/Makefile b/Makefile index e1cbfe3c7f..28665735e9 100644 --- a/Makefile +++ b/Makefile @@ -180,16 +180,8 @@ gdb_firmware: $(FIRMWARE_BUILD_DIR)/firmware.elf ## start remote gdb session to ## misc commands: -vendorheader: ## construct and sign the default vendor header - ./tools/build_vendorheader e28a8970753332bd72fef413e6b0b2ef1b4aadda7aa2c141f233712a6876b351:d4eec1869fb1b8a4e817516ad5a931557cb56805c3eb16e8f3a803d647df7869:772c8a442b7db06e166cfbc1ccbcbcde6f3eba76a4e98ef3ffc519502237d6ef 2 0.0 x.....x DEVELOPMENT assets/vendor_devel.toif embed/firmware/vendorheader.bin - ./tools/binctl embed/firmware/vendorheader.bin -s 1:2 `./tools/keyctl sign vendorheader embed/firmware/vendorheader.bin 4444444444444444444444444444444444444444444444444444444444444444 4545454545454545454545454545454545454545454545454545454545454545` - -vendorheader_sl: ## construct SatoshiLabs vendor header - ./tools/build_vendorheader 47fbdc84d8abef44fe6abde8f87b6ead821b7082ec63b9f7cc33dc53bf6c708d:9af22a52ab47a93091403612b3d6731a2dfef8a33383048ed7556a20e8b03c81:2218c25f8ba70c82eba8ed6a321df209c0a7643d014f33bf9317846f62923830 2 0.0 ....... SatoshiLabs assets/vendor_satoshilabs.toif embed/firmware/vendorheader_sl.bin - binctl: ## print info about binary files ./tools/binctl $(BOOTLOADER_BUILD_DIR)/bootloader.bin - ./tools/binctl embed/firmware/vendorheader.bin ./tools/binctl $(PRODTEST_BUILD_DIR)/prodtest.bin ./tools/binctl $(FIRMWARE_BUILD_DIR)/firmware.bin diff --git a/SConscript.firmware b/SConscript.firmware index 93b407ae63..414e459adc 100644 --- a/SConscript.firmware +++ b/SConscript.firmware @@ -286,7 +286,7 @@ SOURCE_PY.extend(Glob('src/*/*/*/*.py')) SOURCE_PY.extend(Glob('src/*/*/*/*/*.py')) SOURCE_PY_DIR = 'src/' -env = Environment(ENV=os.environ, CFLAGS=ARGUMENTS.get('CFLAGS', '')) +env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) env.Tool('micropython') @@ -395,10 +395,12 @@ obj_program.extend(env.Object(source=SOURCE_STMHAL)) obj_program.extend(env.Object(source=SOURCE_TREZORHAL)) obj_program.extend(env.Object(source=source_mpyc)) +VENDORHEADER = 'embed/vendorheader/vendorheader_' + ('unsafe_signed_dev.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'satoshilabs_signed_prod.bin') + obj_program.extend( env.Command( target='embed/firmware/vendorheader.o', - source='embed/firmware/vendorheader.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'embed/firmware/vendorheader_sl_signed.bin', + source=VENDORHEADER, action='$OBJCOPY -I binary -O elf32-littlearm -B arm' ' --rename-section .data=.vendorheader,alloc,load,readonly,contents' ' $SOURCE $TARGET', )) diff --git a/SConscript.prodtest b/SConscript.prodtest index 993e5b40bf..c808e8887b 100644 --- a/SConscript.prodtest +++ b/SConscript.prodtest @@ -133,10 +133,12 @@ obj_program += env.Object(source=SOURCE_PRODTEST) obj_program += env.Object(source=SOURCE_STMHAL) obj_program += env.Object(source=SOURCE_TREZORHAL) +VENDORHEADER = 'embed/vendorheader/vendorheader_' + ('unsafe_signed_dev.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'satoshilabs_signed_prod.bin') + obj_program.extend( env.Command( target='embed/prodtest/vendorheader.o', - source='embed/firmware/vendorheader.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'embed/firmware/vendorheader_sl_signed.bin', + source=VENDORHEADER, action='$OBJCOPY -I binary -O elf32-littlearm -B arm' ' --rename-section .data=.vendorheader,alloc,load,readonly,contents' ' $SOURCE $TARGET', )) diff --git a/SConscript.reflash b/SConscript.reflash index d431efd514..c788af7c7f 100644 --- a/SConscript.reflash +++ b/SConscript.reflash @@ -133,10 +133,12 @@ obj_program += env.Object(source=SOURCE_REFLASH) obj_program += env.Object(source=SOURCE_STMHAL) obj_program += env.Object(source=SOURCE_TREZORHAL) +VENDORHEADER = 'embed/vendorheader/vendorheader_' + ('unsafe_signed_dev.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'satoshilabs_signed_prod.bin') + obj_program.extend( env.Command( target='embed/reflash/vendorheader.o', - source='embed/firmware/vendorheader.bin' if ARGUMENTS.get('PRODUCTION', '0') == '0' else 'embed/firmware/vendorheader_sl_signed.bin', + source=VENDORHEADER, action='$OBJCOPY -I binary -O elf32-littlearm -B arm' ' --rename-section .data=.vendorheader,alloc,load,readonly,contents' ' $SOURCE $TARGET', )) diff --git a/assets/vendor_devel.toif b/assets/vendor_devel.toif deleted file mode 100644 index e48671041039c836d4ad853aa8b0436d5bc18800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5115 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 diff --git a/build-docker.gcc_source.sh b/build-docker.gcc_source.sh index b597fa4199..6d20468c63 100755 --- a/build-docker.gcc_source.sh +++ b/build-docker.gcc_source.sh @@ -12,4 +12,4 @@ docker run -t -v $(pwd)/build-docker:/build:z $IMAGE /bin/sh -c "\ ln -s /build build && git checkout $TAG && \ git submodule update --init --recursive && \ - make clean vendor vendorheader build_boardloader build_bootloader build_prodtest build_firmware" + make clean vendor build_boardloader build_bootloader build_prodtest build_firmware" diff --git a/build-docker.sh b/build-docker.sh index 9799b31997..1219d76ed4 100755 --- a/build-docker.sh +++ b/build-docker.sh @@ -12,4 +12,4 @@ docker run -t -v $(pwd)/build-docker:/build:z $IMAGE /bin/sh -c "\ ln -s /build build && git checkout $TAG && \ git submodule update --init --recursive && \ - make clean vendor vendorheader build_boardloader build_bootloader build_prodtest build_firmware" + make clean vendor build_boardloader build_bootloader build_prodtest build_firmware" diff --git a/embed/firmware/.gitignore b/embed/firmware/.gitignore deleted file mode 100644 index 47c8c7359d..0000000000 --- a/embed/firmware/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendorheader.bin diff --git a/embed/vendorheader/generate.sh b/embed/vendorheader/generate.sh new file mode 100755 index 0000000000..0f78b25d73 --- /dev/null +++ b/embed/vendorheader/generate.sh @@ -0,0 +1,13 @@ +BINCTL=../../tools/binctl +KEYCTL=../../tools/keyctl +BUILDVH=../../tools/build_vendorheader + +# construct the default unsafe vendor header +$BUILDVH e28a8970753332bd72fef413e6b0b2ef1b4aadda7aa2c141f233712a6876b351:d4eec1869fb1b8a4e817516ad5a931557cb56805c3eb16e8f3a803d647df7869:772c8a442b7db06e166cfbc1ccbcbcde6f3eba76a4e98ef3ffc519502237d6ef 2 0.0 xxx...x "UNSAFE, DO NOT USE!" vendor_unsafe.toif vendorheader_unsafe_unsigned.bin + +# sign the default unsafe vendor header using development keys +cp -a vendorheader_unsafe_unsigned.bin vendorheader_unsafe_signed_dev.bin +$BINCTL vendorheader_unsafe_signed_dev.bin -s 1:2 `$KEYCTL sign vendorheader vendorheader_unsafe_signed_dev.bin 4444444444444444444444444444444444444444444444444444444444444444 4545454545454545454545454545454545454545454545454545454545454545` + +# construct SatoshiLabs vendor header +$BUILDVH 47fbdc84d8abef44fe6abde8f87b6ead821b7082ec63b9f7cc33dc53bf6c708d:9af22a52ab47a93091403612b3d6731a2dfef8a33383048ed7556a20e8b03c81:2218c25f8ba70c82eba8ed6a321df209c0a7643d014f33bf9317846f62923830 2 0.0 ....... SatoshiLabs vendor_satoshilabs.toif vendorheader_satoshilabs_unsigned.bin diff --git a/assets/vendor_satoshilabs.toif b/embed/vendorheader/vendor_satoshilabs.toif similarity index 100% rename from assets/vendor_satoshilabs.toif rename to embed/vendorheader/vendor_satoshilabs.toif diff --git a/embed/vendorheader/vendor_unsafe.toif b/embed/vendorheader/vendor_unsafe.toif new file mode 100644 index 0000000000000000000000000000000000000000..b80e9f35e41a069ec90d8c53709da7cc5cd136af GIT binary patch literal 2179 zcmV-}2z>WcPf2EY0C)g*2mk=>k{^6>Z5YP~K@bEF1VIoC20<{G90&$M@IVj*!C)|W zV2}hs5DbDK2!dcR2!bQQU@!=R;J|@k5Cq-#ecgZF*1P9@x9+Re`L}iU>0Ef9>v#RW z*Y6@HmR)^*#amKtgp(Fxs;b<4RfvT!+b5T_uV0D1 zgo~EWBq$G`1Ud^5???=k$4?B%C?vEg$Zy54!~pWNM{Hu#9^}PDS=)YvJV}M(meZ<) z0(AHTl3ABOs1Evnm8QeMyYi2GvdyB~I#^V;u^zq%LApJZwn!_Vc2(pp)<B%>io?bV%zmR?Pdn_%p{^=g zB=z0AEQ%$;GhTIh9Mff&-^^>sDU$9ju{|r>vWO@HF}{-*=12%8r=Xqm}?#A z?c7ri&v(UJ-r1X$MPzC*cv|*?IJV$^kKU2ndtN8pRHohwX94pXs)IN_-<{C9H|d_2 z7&3u0clMg>y7(P7lRfR%Edk|i?|E5$Rn@!sI5=8bSC&3e4EF7pLzFkMZ@*|^{j?Vp zub5!z(#qbv=a^sdXYYOIR0ru_215%mWg_>Kaj>re#>*G`EATiXV8U4dydyN7BrzQD zW>MZ72QCZ=x`Hec+xK+mm{)e?M1zkp4VXL8V5jKL;{MXox*Y0L#DJt6@fHxP7Bn4s zNr@Jc@R0U=IvINSZF6K1N4Oehe;A#WbzWetaZ44y%N zJ9Op~Z&_rK3j&&Rs>EJU-l*gKr{z?4Bz}{!AH3`myC1lBp>&1u(z&mgyrV$-f6ZF%_@t!)T<%ebInUhx>rPaOCHkrg(b|c z-0I0&EM3y|lUEKs++SCfbc3=@Qf}0siKL;R>A~NL?oXb3(SvIw5fkp6E76D?qPsis zQo5!XcvM7gP!4I@sSYn7n^Sb=(cQVmoAsthA2FZ&#<5BgQCWENMoz>))4cPl$;Sxr zg`;H3s7BTKm1w+KjW^>}lcrS_&8EDs0*hid0!@(JrNyW z7qEokY|H;;IYs`z@bl&Zu9Uh!5(ZMV7AEmSi;za(z*m>H;DjT*{shC zyukW2;=j5~U^)v})l;ekf< zi(XyxD3IO8wMo;rNh5W!@nk|i2oL0hU46W1Ic2B8OoD4=Zctsk@!G1i@zQ~_U|g&+ zp7F)M%o6yR_JW#&@Ro@Emha}3S#Teek5!dvh0a!0Ax3ahV6NRWyye@Kx0`SLE%NnY)i3D?!`tMcy_|4zf z5LTHlbRu^7_nlT$QhTn3H{n%&)+UY|(%k3!kmocKMp{~zL*!l`i1BVCPs-H)5tHx{ z)1JK5NmPe5KK$1eOXM#l+w3V!v~Vo};}9)U-uN@7I@q78BPQ%L46N))7O^W`eWi_b z*CkqN+h?h&nD84Ohxy?ZkMld3SfyocvoEsPerQ@H)erpSl+?CdM1RXohxsef8BY6J z(EMSsVh^ F{{W7{YN`ML literal 0 HcmV?d00001 diff --git a/embed/firmware/vendorheader_sl_signed.bin b/embed/vendorheader/vendorheader_satoshilabs_signed_prod.bin similarity index 100% rename from embed/firmware/vendorheader_sl_signed.bin rename to embed/vendorheader/vendorheader_satoshilabs_signed_prod.bin diff --git a/embed/vendorheader/vendorheader_satoshilabs_unsigned.bin b/embed/vendorheader/vendorheader_satoshilabs_unsigned.bin new file mode 100644 index 0000000000000000000000000000000000000000..61f3106a05b2857a1aed810a097f61a2234d7479 GIT binary patch literal 4608 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 EKhp#H4gdfE literal 0 HcmV?d00001 diff --git a/embed/vendorheader/vendorheader_unsafe_signed_dev.bin b/embed/vendorheader/vendorheader_unsafe_signed_dev.bin new file mode 100644 index 0000000000000000000000000000000000000000..9c4532ef36c5874ad9d7e36ac7fee384358eb169 GIT binary patch literal 2560 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 literal 0 HcmV?d00001