The contribution I got from Jack is corrupted; not the same hash as in
Jack's attestation, and one of the points inside of it does not lie on
the curve. I suspect data corruption, especially since Jack's internet
connection was unreliable.

I have another person scheduled about 7 hours from now, so I may have
to move on to that person if I can't get the correct response file. :o

I've uploaded the corrupted response file:
https://powersoftau-transcript.s3-us-west-2.amazonaws.com/response.15.corrupted
and the associated challenge file:
https://powersoftau-transcript.s3-us-west-2.amazonaws.com/challenge.15

Sean

On Wed, Nov 22, 2017 at 8:09 PM, Sean Bowe <s...@z.cash> wrote:
> Thanks! I'm verifying your contribution.
>
> Note that the `powersoftau` code, unmodified, does not act
> determinisically with the random input provided by the user, so:
>
>> - - Revealing the randomness in the unused response, after the compute node 
>> had
>>   been shut down, should make it possible to ascertain that the compute 
>> binary
>>   was behaving correctly, by having third parties independently re-compute 
>> the
>>   corresponding response file and verify the hash against the one I 
>> published.
>
> is not true unless you modified the code so that it does not try to
> mix in system randomness as well.
>
> Sean
>
> On Wed, Nov 22, 2017 at 6:49 PM, Jack Grigg via zapps-wg
> <zapps...@lists.z.cash.foundation> wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA512
>>
>> Powers of Tau Operational Writeup
>> =================================
>>
>> Round: 15
>> Date: 2017-11-22
>> Name: Jack Grigg
>> Location: UK
>>
>> Challenge:
>>
>>     d27e5d6c5a7611f6690443d8a47c6ebd134bc863f05984d9b3d845060a3f036a
>>
>>
>> Response:
>>
>>     2c052c1f 039810e7 69779017 9943bdb9
>>     d00a84fb 25593453 85af3826 1fbe061c
>>     4dc79f4e 87da26f4 3202bcf4 3960db16
>>     be870511 7f3de50c 8922b502 32a3e126
>>
>>
>> Procedure
>> =========
>>
>> 2017-11-18
>> - ----------
>>
>> I withdrew cash from an ATM I happened to be passing in London.
>>
>> 2017-11-19
>> - ----------
>>
>> I withdrew more cash from a different ATM. I then drove four hours
>> south-west of
>> London to my grandmother's farm. She lives in a valley with no cell
>> reception,
>> and her granite house is well-known in our family for its electromagnetic
>> and
>> audio shielding properties (ie. WiFi reception sucks beyond the one room the
>> router is in, and you can't hear someone calling you from a few rooms away).
>>
>> On the way down, I stopped in at a shopping center, turning off my phone and
>> leaving it in the car. I then purchased:
>>
>> - - An HP Pavilion Notebook 15 (15-cd054na)
>>   - I had no device in mind when I entered the store. After browsing the
>>     available models, I chose this laptop based on a combination of price,
>>     performance, the use of an AMD chip, and the presence of a DVD burner.
>>   - I asked the sales assistant if I could choose a laptop at random from
>> their
>>     stock room. The manager confirmed I could not, as it was a secure area.
>> I
>>     asked them to bring out three laptops for me to choose from, which they
>> did.
>>     I flipped two coins to determine which of the three I chose.
>> - - Five identical USB drives
>> - - A stack of 10 DVD+R discs (which were eventually not used)
>> - - A screwdriver set
>> - - A soldering iron (which turned out to be unnecessary)
>>
>> 2017-11-20
>> - ----------
>>
>> I unboxed the laptop, and opened it up. I removed the WiFi/Bluetooth chip,
>> and
>> unplugged the built-in speakers. I then started the laptop and set up the
>> default Windows installation, confirming that there was no wireless
>> connectivity
>> or sound, but the headphone jack still worked. I pried off the screen bezel,
>> unplugged the built-in camera and microphone array, and confirmed that they
>> both
>> no longer worked (the microphone array still showed up as a device, but
>> registered no input).
>>
>> I used Tor Browser and the Tails downloader plugin to download the Tails 3.3
>> ISO
>> (the first deterministically-built one) on my development laptop (a Thinkpad
>> X1
>> Carbon Gen4), and verified its GPG signature. SHA256 hash of the ISO:
>>
>>     5ac6b8a563a999701aa394a0761ba3e29d5a964537549e5b4a81b2abf12a1c09
>>
>> I also installed tails-live-installer from their PPA.
>>
>> 2017-11-22
>> - ----------
>>
>> I opened up the laptop again, and confirmed that the wireless functionality
>> and
>> speakers were still disabled. I then removed the hard drive and re-assembled
>> the
>> laptop. From this point onward, I did not let the laptop (henceforth
>> referred to
>> as the compute node), nor any of the USB drives, out of my sight for more
>> than a
>> few seconds.
>>
>> I rolled a dice to select one of the five USB drives at random. I used
>> tails-live-installer to install Tails 3.3 on the USB drive. I then realised
>> that
>> I hadn't yet upgraded the drivers for my development laptop to fix the Intel
>> AMT/ME vulnerability. I booted into the Windows partition to do so.
>> Following
>> this, I rebooted into Ubuntu again, imaged the USB drive, and then wiped it
>> and
>> re-installed Tails 3.3.
>>
>> I installed Docker CE on my development laptop, and used Andrew Miller's
>> Dockerfile to deterministically build the powersoftau compute binary. SHA256
>> hash:
>>
>>     922b2e0a59841ecdaba7b4953d8c67e62b74b8f52f968624cff664dc086da93a
>>
>> On my Qubes 3.2 laptop (a Purism Librem 15) I created a disposable VM, and
>> downloaded the challenge file in it. SHA256 hash:
>>
>>     d27e5d6c5a7611f6690443d8a47c6ebd134bc863f05984d9b3d845060a3f036a
>>
>> I created a fresh AppVM for staging (backed by the fully-upgraded
>> fedora-24-minimal TemplateVM) with network access. I ran the following
>> commands:
>>
>> $ su - (the minimal template does not have sudo)
>> $ dnf config-manager \
>>     --add-repo \
>>     https://download.docker.com/linux/fedora/docker-ce.repo
>> $ dnf install docker-ce
>> $ docker --version
>> Docker version 17.06.0-ce, build 02c1d87
>> $ systemctl start docker
>> $ docker run -it socrates1024/powersoftau
>> [snip]
>> Digest:
>> sha256:3d42ec3bc947c410dca07e4bbbe5e88bf264b147ecaa87807ec58424f309b046
>> $ $ sha256sum target/x86_64-unknown-linux-musl/release/compute
>>
>>     922b2e0a59841ecdaba7b4953d8c67e62b74b8f52f968624cff664dc086da93a
>>
>> Having obtained the same binary hash on both machines, I then fetched the
>> compute binary out of the staging AppVM's Docker container, and copied the
>> challenge file from the disposable AppVM to the staging AppVM. I also
>> downloaded
>> EFF's long wordlist:
>> https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt
>> SHA256 hash:
>>
>>     addd35536511597a02fa0a9ff1e5284677b8883b83e986e43f15a3db996b903e
>>
>> BEGIN COMPUTATION STEPS
>> ```````````````````````
>> I rolled a dice to select one of the four remaining USB drives at random. I
>> attached the USB drive to my Qubes laptop, and then redirected it from
>> sys-usb
>> to the staging AppVM using qubes-usb on Dom0. I copied the challenge file,
>> the
>> compute binary, and the wordlist to the USB drive.
>>
>> I took the compute node, Tails USB drive, and challenge USB drive to a room
>> at
>> the far end of the house (from the router), which had the most line-of-sight
>> granite surrounding it, and also had a large metal filing cabinet. I emptied
>> one
>> of the drawers and set up the compute node inside it. I inserted the Tails
>> USB
>> drive, started the compute node, and disabled SecureBoot. Once in the Tails
>> environment, I inserted the challenge USB drive, copied the compute binary
>> and
>> wordlist to the Tails home directory (in RAM), and symlinked the challenge
>> file
>> into that directory (as I didn't have enough RAM to hold the challenge file
>> in
>> memory twice).
>>
>> I started the compute binary, opened the wordlist, and then used five dice
>> (of
>> assorted sizes, that I scrounged from around the house) in a cardboard box
>> to
>> generate an eight-word random phrase. I typed the phrase into the compute
>> binary
>> input (space-separated, no leading or trailing spaces), and also wrote it
>> down
>> on the inside of a piece of folded card. I then started the computation
>> process,
>> and closed the filing cabinet drawer. The computation took around 40
>> minutes,
>> during which I sat beside it, occasionally pulling the drawer open slightly
>> to
>> check progress, and reading Serious Cryptography in between. At the point
>> where
>> I noticed that the challenge itself had been read into memory, I unmounted
>> and
>> removed the challenge USB drive.
>>
>> After the computation was completed, I rolled a dice to select one of the
>> three
>> remaining USB drives at random. I copied the response file to it, and used
>> my
>> phone to tweet out the BLAKE2b hash printed by the compute binary:
>>
>>     2c052c1f 039810e7 69779017 9943bdb9
>>     d00a84fb 25593453 85af3826 1fbe061c
>>     4dc79f4e 87da26f4 3202bcf4 3960db16
>>     be870511 7f3de50c 8922b502 32a3e126
>>
>> I then shut down the compute node.
>>
>> END COMPUTATION STEPS
>> `````````````````````
>>
>> I repeated the steps above a second time (using the two remaining USB
>> drives),
>> to obtain a second response file, and a second BLAKE2b hash:
>>
>>     3df44b57 4c66cb75 9bba2f2a 96b12ea1
>>     9037a70c 4c898397 35ad6b3d 50b84715
>>     39bfdea2 0d6e6db3 79ce6f3d 3d823d32
>>     901d2651 20481863 45d99475 e63a91a9
>>
>> Finally, I rolled a dice to decide which of the two responses to upload; the
>> dice landed on an odd number, meaning that I uploaded the first response. I
>> am
>> revealing the randomness used to compute the second response:
>>
>>     boogeyman amber reverse oversight scorn impending wheat engraver
>>
>> After typing in the above phrase, I burned the card on which I had written
>> the
>> two random phrases. I opened up the compute node, and removed the battery
>> and
>> RAM stick. I have not yet destroyed the RAM chips, and am keeping the stick
>> on
>> my person until I am able to (so I've probably damaged it already with
>> static).
>>
>> I connected the USB drive containing the first response to my Qubes laptop,
>> and
>> then redirected it from sys-usb to the staging AppVM. I then copied the
>> response
>> to the disposable AppVM, and then into another AppVM to upload it to one of
>> my
>> personal servers (as the upload to AWS was timing out).
>>
>>
>> Security Considerations
>> =======================
>>
>> - - The laptop was chosen randomly, with as little unreported bias as
>> possible,
>>   and with my participation at that point only mentioned to Sean. However, a
>>   sufficiently-motivated adversary could potentially have figured out that I
>> was
>>   participating, guessed which store I would go to on my route, and
>> persuaded
>>   the staff to alter the displays to draw my attention towards a particular
>>   laptop. A constraint, or a private deterministic metric for selection, may
>>   have helped to eliminate more bias.
>>
>> - - Using a deterministically-built ISO for the operating system should make
>> it
>>   easier to determine the OS code that was running at the time, modulo the
>> trust
>>   in the machine that the live USB was built on (which is my Zcash dev
>> laptop).
>>
>> - - Using a fresh Qubes AppVM for staging increases the bar for having
>> compromised
>>   the OS in order to compromise the challenge USB drive.
>>
>> - - Tails by default disables sudo and mounts itself as read-only, meaning
>> that a
>>   malicious userspace process shouldn't be able to persist data on that USB
>>   drive.
>>
>> - - Tails by default mounts plugged-in USB drives as read-write. Using a
>> fresh USB
>>   drive each time to transfer the compute binary, challenge and wordlist to
>> the
>>   compute node removed that as a vector for persistance between iterations.
>>
>> - - Revealing the randomness in the unused response, after the compute node
>> had
>>   been shut down, should make it possible to ascertain that the compute
>> binary
>>   was behaving correctly, by having third parties independently re-compute
>> the
>>   corresponding response file and verify the hash against the one I
>> published.
>>
>>
>> Things I'd Do Differently In Future
>> ===================================
>>
>> - - Pick somewhere with faster internet. The internet here isn't snappy to
>> begin
>>   with, and it was raining and blowing which significantly impacts speeds.
>> As a
>>   result, the challenge file took several hours to download, and the
>> response
>>   file took probably double that.
>>
>> - - Use a DVD to set up the compute OS instead of a USB (and then load the
>> OS into
>>   RAM to free up the DVD drive). A DVD would in theory be more easily
>> auditable,
>>   putting less trust in the machine creating it than the live USB. This
>> would
>>   also increase the amount of RAM required in the machine (I ran this
>> entirely
>>   in 4GB memory).
>>
>> - - Build the compute binary ahead of time. In particular, the time it took
>> to
>>   download Docker and build dependencies (twice) significantly extended the
>>   setup time.
>>
>> - - The binary was built deterministically, but it would be preferable to
>> have it
>>   only use dependencies and a compiler that could be reasonably assumed to
>> not
>>   have backdoors targeted at the MPC in general or participants in
>> particular. I
>>   did briefly try to compile Devrandom's branch, but decided determinism was
>>   more important for now.
>>
>> - - Monitor and keyboard. I had to open the filing cabinet drawer in order
>> to type
>>   in the randomness and monitor progress; an external monitor and keyboard
>> would
>>   limit the EM leakage of doing so.
>>
>> - - Hardware separation of randomness. There was maybe 10 minutes between
>>   compute iterations (as I created the second challenge USB drive), and the
>>   battery was not removed in between (as that required disassembly), so
>> there is
>>   a small but non-zero possibility that the second computation could have
>> been
>>   influenced by (maliciously or otherwise) the first one. In this case it
>>   happens to not matter much, as the random roll at the end selected the
>> result
>>   of the first computation, but in a future MPC I'd prefer to at least
>> remove
>>   the battery in between runs, and ideally swap out the RAM.
>>
>> - - Different response extraction mechanism. I neglected to purchase a DVD
>> reader
>>   for my existing laptops, so could not use DVDs as the airgap mechanism,
>>   falling back to the USB drives. I also had a more ambitious mechanism in
>> mind,
>>   but that will require significant additional development work.
>>
>> - - Use a separate AppVM for staging the response. I had intended to do this
>> (to
>>   limit the ability of any malicious data hidden on the response USB to
>> escape),
>>   but reused the previous qubes-usb command neglecting to change the AppVM
>> name.
>>   Once it was connected to the challenge staging VM, I decided that any
>> damage
>>   had already been done, and continued.
>>
>> -----BEGIN PGP SIGNATURE-----
>>
>> iQIcBAEBCgAGBQJaFib5AAoJEGZdvNKE99r/tHsP/jZjS+VbrYQz0pHi9MS4wQzP
>> 4kErUDJgF8t6TkNj6W4ZCBIu9ryEQthUxpMgDEqbRFt9M7ueYB8bys9YUtna7fVJ
>> tyrj7UmPlYGOLs6QaFaE+TBhnDoWA+bdHNb5bHzC2mWaXwya3DYrW5ai7BA7/YUF
>> hcW5dMtyQRrL4vKMLWq500nhZ1n5aa0Njq0NJ3XEzDa3W4+Wq3nJBTk5NNXz0iAC
>> +h0j542AlrHcp4dzWf/PvBpZrnerpMlMatJmR/GN0153tbdFVs8zqPAfRmLvyl3m
>> vYPuW4S/QGUoKKsyM3zJps3QtaNQJooHkD8Y6nOBbX9piEURy2hZUMoPYhiIVyM7
>> T8wvt3UNXjBAzzoNWOSt8+s/OMGt+E++9bFKxOKqE2zXQAxIGGVxYfc563DHM051
>> BuYNSfYKwoFP5Cq2pU2j6WOGs20zQxh6ySRd8Iz1v5uJSQ0Z6+GJ9Ddc1Lo2YDpt
>> hcPa8oe2vGReuX33lN6PBNYjr+CkwV8metJXG+2irKCTGdgaBv+IweBUkP4SUxe6
>> C0kmxjgQ9BJ0/kW4EHeyIS1YGFAyZDbXedsaSRBvBNegnCYfCavPKBIYcRINrCPk
>> 1XJ/J6Lhhc0xC4fILsXhot3uoAl1QHwT69a5Gfj/nTCSaJ6E3vbbaOgr8Igu6Jf8
>> VCTWs0YxUiG8EctFHElQ
>> =uVQb
>> -----END PGP SIGNATURE-----

Reply via email to