From 8ddcd74080d06aad51c3a42eca177050d9e3739b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 1 Oct 2017 17:46:58 +0200 Subject: [PATCH] build: sign all stuff using ed25519 cosi (2 out of 3) --- Makefile | 4 ++-- SConscript.bootloader | 2 +- SConscript.firmware | 2 +- assets/satoshilabs_120.toif | Bin 4237 -> 0 bytes assets/vendor_devel.png | Bin 0 -> 10752 bytes assets/vendor_devel.toif | Bin 0 -> 5115 bytes embed/boardloader/main.c | 2 +- embed/bootloader/main.c | 2 +- tools/binctl | 34 +++++++++++++++++++++++++++++++--- tools/ed25519cosi.py | 20 +++++++++----------- tools/ed25519raw.py | 10 +++++----- 11 files changed, 51 insertions(+), 25 deletions(-) delete mode 100644 assets/satoshilabs_120.toif create mode 100644 assets/vendor_devel.png create mode 100644 assets/vendor_devel.toif diff --git a/Makefile b/Makefile index 27db3664f0..f6b156e5f3 100644 --- a/Makefile +++ b/Makefile @@ -149,8 +149,8 @@ gdb_firmware: $(FIRMWARE_BUILD_DIR)/firmware.elf ## start remote gdb session to ## misc commands: vendorheader: ## construct default vendor header - ./tools/build_vendorheader 'e28a8970753332bd72fef413e6b0b2ef1b4aadda7aa2c141f233712a6876b351:d4eec1869fb1b8a4e817516ad5a931557cb56805c3eb16e8f3a803d647df7869:772c8a442b7db06e166cfbc1ccbcbcde6f3eba76a4e98ef3ffc519502237d6ef' 1 0.0 SatoshiLabs assets/satoshilabs_120.toif embed/firmware/vendorheader.bin - ./tools/binctl embed/firmware/vendorheader.bin -s 1 4444444444444444444444444444444444444444444444444444444444444444 + ./tools/build_vendorheader 'e28a8970753332bd72fef413e6b0b2ef1b4aadda7aa2c141f233712a6876b351:d4eec1869fb1b8a4e817516ad5a931557cb56805c3eb16e8f3a803d647df7869:772c8a442b7db06e166cfbc1ccbcbcde6f3eba76a4e98ef3ffc519502237d6ef' 2 0.0 DEVEL assets/vendor_devel.toif embed/firmware/vendorheader.bin + ./tools/binctl embed/firmware/vendorheader.bin -s 1:2 4444444444444444444444444444444444444444444444444444444444444444:4545454545454545454545454545454545454545454545454545454545454545 binctl: ## print info about binary files ./tools/binctl $(BOOTLOADER_BUILD_DIR)/bootloader.bin diff --git a/SConscript.bootloader b/SConscript.bootloader index 42e2137f31..5674a2a4ce 100644 --- a/SConscript.bootloader +++ b/SConscript.bootloader @@ -169,5 +169,5 @@ program_bin = env.Command( source=program_elf, action=[ '$OBJCOPY -O binary -j .header -j .flash -j .data $SOURCE $TARGET', - '$BINCTL $TARGET -s 1 4141414141414141414141414141414141414141414141414141414141414141', + '$BINCTL $TARGET -s 1:2 4141414141414141414141414141414141414141414141414141414141414141:4242424242424242424242424242424242424242424242424242424242424242', ], ) diff --git a/SConscript.firmware b/SConscript.firmware index 944fdb9df7..3b0eed0463 100644 --- a/SConscript.firmware +++ b/SConscript.firmware @@ -434,7 +434,7 @@ program_bin = env.Command( source=program_elf, action=[ '$OBJCOPY -O binary -j .header -j .flash -j .data $SOURCE $TARGET', - '$BINCTL $TARGET -s 1 4747474747474747474747474747474747474747474747474747474747474747', + '$BINCTL $TARGET -s 1:2 4747474747474747474747474747474747474747474747474747474747474747:4848484848484848484848484848484848484848484848484848484848484848', ], ) program0_bin = env.Command( diff --git a/assets/satoshilabs_120.toif b/assets/satoshilabs_120.toif deleted file mode 100644 index e7711ba098715a14e095e95ddc8a1f28dd188beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4237 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 diff --git a/assets/vendor_devel.png b/assets/vendor_devel.png new file mode 100644 index 0000000000000000000000000000000000000000..9014bddd1f162e365a4b409612d4d923d774ec3d GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/embed/boardloader/main.c b/embed/boardloader/main.c index 647461337e..a0bc8626b5 100644 --- a/embed/boardloader/main.c +++ b/embed/boardloader/main.c @@ -104,7 +104,7 @@ bool copy_sdcard(void) return true; } -const uint8_t BOARDLOADER_KEY_M = 1; +const uint8_t BOARDLOADER_KEY_M = 2; const uint8_t BOARDLOADER_KEY_N = 3; static const uint8_t * const BOARDLOADER_KEYS[] = { (const uint8_t *)"\xdb\x99\x5f\xe2\x51\x69\xd1\x41\xca\xb9\xbb\xba\x92\xba\xa0\x1f\x9f\x2e\x1e\xce\x7d\xf4\xcb\x2a\xc0\x51\x90\xf3\x7f\xcc\x1f\x9d", diff --git a/embed/bootloader/main.c b/embed/bootloader/main.c index 451c7770ac..05f90ab581 100644 --- a/embed/bootloader/main.c +++ b/embed/bootloader/main.c @@ -47,7 +47,7 @@ void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_len, ui display_refresh(); } -const uint8_t BOOTLOADER_KEY_M = 1; +const uint8_t BOOTLOADER_KEY_M = 2; const uint8_t BOOTLOADER_KEY_N = 3; static const uint8_t * const BOOTLOADER_KEYS[] = { (const uint8_t *)"\xd7\x59\x79\x3b\xbc\x13\xa2\x81\x9a\x82\x7c\x76\xad\xb6\xfb\xa8\xa4\x9a\xee\x00\x7f\x49\xf2\xd0\x99\x2d\x99\xb8\x25\xad\x2c\x48", diff --git a/tools/binctl b/tools/binctl index bb3b8fb979..e6571d9cd6 100755 --- a/tools/binctl +++ b/tools/binctl @@ -8,16 +8,36 @@ import binascii import pyblake2 import ed25519raw +import ed25519cosi def sign_data(seckeys, data): + digest = pyblake2.blake2s(data).digest() if len(seckeys) == 1: sk = seckeys[0] pk = ed25519raw.publickey(sk) - digest = pyblake2.blake2s(data).digest() return ed25519raw.signature(digest, sk, pk) else: - raise NotImplementedError + pubkeys = [ed25519raw.publickey(sk) for sk in seckeys] + ctr = 0 + nonces = [] + commits = [] + for sk in seckeys: + r, R = ed25519cosi.get_nonce(sk, digest, ctr) + nonces.append(r) + commits.append(R) + global_pk = ed25519cosi.combine_keys(pubkeys) + global_R = ed25519cosi.combine_keys(commits) + sigs = [] + for sk, r, R in zip(seckeys, nonces, commits): + h = ed25519raw.H(sk) + b = ed25519raw.b + a = 2**(b - 2) + sum(2**i * ed25519raw.bit(h, i) for i in range(3, b - 2)) + S = (r + ed25519raw.Hint(global_R + global_pk + digest) * a) % ed25519raw.l + sigs.append(ed25519raw.encodeint(S)) + sig = ed25519cosi.combine_sig(global_R, sigs) + ed25519raw.checkvalid(sig, digest, global_pk) + return sig def format_sigmask(sigmask): @@ -186,6 +206,14 @@ class VendorHeader(object): return header def sign(self, sigmask, seckeys): + # check whether provided arguments match vsig_m/vsig_n + if len(seckeys) != self.vsig_m: + raise Exception('invalid number of signatures (vsig_m expected %d, got %d)' % (self.vsig_m, len(seckeys))) + if sigmask >= (1 << self.vsig_n): + raise Exception('signature index is higher than vsig_n (%d)' % self.vsig_n) + if bin(sigmask).count('1') != self.vsig_m: + raise Exception('invalid number of indexes (vsig_m expected %d, got %d)' % (self.vsig_m, bin(sigmask).count('1'))) + # sign header = self.serialize_header(sig=False) self.sigmask = sigmask self.sig = sign_data(seckeys, header) @@ -224,7 +252,7 @@ def main(): sigmask = 0 if ':' in sys.argv[3]: for idx in sys.argv[3].split(':'): - sigmask = 1 << (int(idx) - 1) + sigmask |= 1 << (int(idx) - 1) else: sigmask = 1 << (int(sys.argv[3]) - 1) if ':' in sys.argv[4]: diff --git a/tools/ed25519cosi.py b/tools/ed25519cosi.py index a056c48336..9b4317b24b 100644 --- a/tools/ed25519cosi.py +++ b/tools/ed25519cosi.py @@ -220,17 +220,17 @@ def test(data): sks.append(seckey) pks.append(pubkey) ctr = 0 - (r, R) = get_nonce(seckey, digest, ctr) + r, R = get_nonce(seckey, digest, ctr) print('Local nonce: %s' % hex(ed25519raw.encodeint(r))) print('Local commit: %s' % hex(R)) nonces.append(r) commits.append(R) - globalPk = combine_keys([pks[i] for i in keyset]) - globalR = combine_keys([commits[i] for i in keyset]) + global_pk = combine_keys([pks[i] for i in keyset]) + global_R = combine_keys([commits[i] for i in keyset]) print('-----------------') - print('Global pubkey: %s' % hex(globalPk)) - print('Global commit: %s' % hex(globalR)) + print('Global pubkey: %s' % hex(global_pk)) + print('Global commit: %s' % hex(global_R)) print('-----------------') for i in range(0, N): @@ -240,17 +240,15 @@ def test(data): R = commits[i] h = ed25519raw.H(seckey) b = ed25519raw.b - a = 2**(b - 2) + sum(2**i * ed25519raw.bit(h, i) - for i in range(3, b - 2)) - S = (r + ed25519raw.Hint(globalR + globalPk + digest) * a) % ed25519raw.l + a = 2**(b - 2) + sum(2**i * ed25519raw.bit(h, i) for i in range(3, b - 2)) + S = (r + ed25519raw.Hint(global_R + global_pk + digest) * a) % ed25519raw.l print('Local sig %d: %s' % (i + 1, hex(ed25519raw.encodeint(S)))) - commits.append(R) sigs.append(ed25519raw.encodeint(S)) print('-----------------') - sig = combine_sig(globalR, [sigs[i] for i in keyset]) + sig = combine_sig(global_R, [sigs[i] for i in keyset]) print('Global sig: %s' % hex(sig)) - ed25519raw.checkvalid(sig, digest, globalPk) + ed25519raw.checkvalid(sig, digest, global_pk) print('Valid Signature!') diff --git a/tools/ed25519raw.py b/tools/ed25519raw.py index 2fd060a9a4..24c7d68711 100644 --- a/tools/ed25519raw.py +++ b/tools/ed25519raw.py @@ -14,7 +14,7 @@ def H(m): def expmod(b, e, m): if e < 0: - raise Exception("negative exponent") + raise Exception('negative exponent') if e == 0: return 1 t = expmod(b, e >> 1, m)**2 % m @@ -120,18 +120,18 @@ def decodepoint(s): x = q - x P = [x, y] if not isoncurve(P): - raise Exception("decoding point that is not on curve") + raise Exception('decoding point that is not on curve') return P def checkvalid(s, m, pk): if len(s) != b >> 2: - raise Exception("signature length is wrong") + raise Exception('signature length is wrong') if len(pk) != b >> 3: - raise Exception("public-key length is wrong") + raise Exception('public-key length is wrong') R = decodepoint(s[0:b >> 3]) A = decodepoint(pk) S = decodeint(s[b >> 3:b >> 2]) h = Hint(encodepoint(R) + pk + m) if scalarmult(B, S) != edwards(R, scalarmult(A, h)): - raise Exception("signature does not pass verification") + raise Exception('signature does not pass verification')