coreboot

coreboot™: fast, flexible and reproducible Open Source firmware!

Reproducible Coreboot

Reproducible builds enable anyone to reproduce bit by bit identical binary packages from a given source, so that anyone can verify that a given binary derived from the source it was said to be derived. There is more information about reproducible builds on the Debian wiki and on https://reproducible-builds.org. These pages explain in more depth why this is useful, what common issues exist and which workarounds and solutions are known.

Reproducible Coreboot is an effort to apply this to coreboot. Thus each coreboot.rom is build twice (without payloads), with a few variations added and then those two ROMs are compared using diffoscope. Please note that the toolchain is not varied at all as the rebuild happens on exactly the same system. More variations are expected to be seen in the wild.

There is a weekly run jenkins job to test the master branch of coreboot.git. The jenkins job is running reproducible_coreboot.sh in a Debian environment and this script is solely responsible for creating this page. Feel invited to join #reproducible-builds (on irc.oftc.net) to request job runs whenever sensible. Patches and other feedback are very much appreciated - if you want to help, please start by looking at the ToDo list for coreboot, you might find something easy to contribute.
Thanks to Profitbricks for donating the virtual machines this is running on!

262 (100.0%) out of 262 built coreboot images were reproducible in our test setup ! These tests were last run on 2019-12-06 for version 4.11-304-g683657e93a using diffoscope 133.

variationfirst buildsecond build
hostname osuosl-build169-amd64 or osuosl-build170-amd64the other one
domainname is not yet varied between rebuilds of coreboot.
env CAPTURE_ENVIRONMENTnot setCAPTURE_ENVIRONMENT="I capture the environment"
env TZTZ="/usr/share/zoneinfo/Etc/GMT+12"TZ="/usr/share/zoneinfo/Etc/GMT-14"
env LANGLANG="en_GB.UTF-8"LANG="fr_CH.UTF-8"
env LC_ALLnot setLC_ALL="fr_CH.UTF-8"
env PATHPATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:"PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path"
env USER is not yet varied between rebuilds of coreboot.
uid is not yet varied between rebuilds of coreboot.
gid is not yet varied between rebuilds of coreboot.
UTS namespace is not yet varied between rebuilds of coreboot.
kernel version, modified using /usr/bin/linux64 --uname-2.6Linux 4.19.0-6-amd64Linux 2.6.79-6-amd64
umask00220002
CPU type Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHzsame for both builds
/bin/sh is not yet varied between rebuilds of coreboot.
year, month, datetoday (2019-12-06)same for both builds (currently, work in progress)
hour, minutehour and minute will probably vary between two builds...the future system actually runs 398 days, 6 hours and 23 minutes ahead...
Filesystemtmpfssame for both builds (currently, this could be varied using disorderfs)
everything else...is likely the same. There will be more variations in the wild.

commit 683657e93ac52a194807d824d417e7fc3226ee9d
Author: Julius Werner 
Date:   Wed Dec 4 12:50:43 2019 -0800

    vboot: Clear secdata change flags after factory init
    
    factory_initialize_tpm() calls secdata_xxx_create() (for both firmware
    and kernel space) and then immediately writes those spaces out to the
    TPM. The create() functions make vboot think it just changed the secdata
    (because it reinitialized the byte arrays in the context), so we also
    need to clear the VB2_CONTEXT_SECDATA_xxx_CHANGED flags again, otherwise
    vboot thinks it still needs to flush the spaces out to the TPM even
    though we already did that.
    
    Also clean up some minor related stuff (VB2_CONTEXT_SECDATA_CHANGED
    notation is deprecated, and secdata space intialization should use the
    same write-and-readback function we use for updates).
    
    Change-Id: I231fadcf7b35a1aec3b39254e7e41c3d456d4911
    Signed-off-by: Julius Werner 
    Reviewed-on: https://review.coreboot.org/c/coreboot/+/37471
    Tested-by: build bot (Jenkins) 
    Reviewed-by: Aaron Durbin      

cross toolchain sourcesha256sum
acpica-unix2-20191018.tar.gz edb9a886455d22955c93753e2de61b780bed94fb434079e844dc5e4376cadd4c
binutils-2.33.1.tar.xz ab66fc2d1c3ec0359b8e08843c9f33b63e8707efdff5e4cc5c200eae24722cbf
gcc-8.3.0.tar.xz 64baadfe6cc0f4947a84cb12d7f0dfaf45bb58b7e92461639596c21e02d97d2c
gmp-6.1.2.tar.xz 87b565e89a9a684fe4ebeeddb8399dce2599f9c9049854ca8c0dfbdea0e21912
mpc-1.1.0.tar.gz 6985c538143c1208dcb1ac42cedad6ff52e267b47e5f970183a3e75125b43c2e
mpfr-4.0.2.tar.xz 1d3be708604eae0e42d578ba93b390c2a145f17743a744d8f3f8c2ad5855a38a
Debian 10.2 package on amd64installed version
gcc 4:8.3.0-1
g++ 4:8.3.0-1
make 4.2.1-1.2
cmake 3.13.4-1
flex 2.6.4-6.2
bison 2:3.3.2.dfsg-1