mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-05 14:59:44 +00:00
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from common import *
|
|
|
|
from trezor.crypto import random
|
|
from trezor.crypto.curve import ed25519
|
|
|
|
|
|
class TestCryptoEd25519Cosi(unittest.TestCase):
|
|
|
|
def test_cosi(self):
|
|
|
|
for N in range(1, 11):
|
|
|
|
# generate random message to be signed
|
|
msg = random.bytes(128)
|
|
|
|
# phase 0: create priv/pubkeys and combine pubkeys
|
|
keys = [None] * N
|
|
pubkeys = [None] * N
|
|
for j in range(N):
|
|
keys[j] = ed25519.generate_secret()
|
|
pubkeys[j] = ed25519.publickey(keys[j])
|
|
|
|
pubkey = ed25519.cosi_combine_publickeys(pubkeys)
|
|
|
|
# phase 1: create nonces, commitments (R values) and combine commitments
|
|
nonces = [None] * N
|
|
Rs = [None] * N
|
|
for j in range(N):
|
|
nonces[j] = ed25519.generate_secret()
|
|
Rs[j] = ed25519.publickey(nonces[j])
|
|
|
|
R = ed25519.cosi_combine_publickeys(Rs)
|
|
|
|
# phase 2: sign and combine signatures
|
|
sigs = [None] * N
|
|
for j in range(N):
|
|
sigs[j] = ed25519.cosi_sign(keys[j], msg, nonces[j], R, pubkey)
|
|
|
|
sig = ed25519.cosi_combine_signatures(R, sigs)
|
|
|
|
# check signature using normal ed25519.verify
|
|
res = ed25519.verify(pubkey, sig, msg)
|
|
self.assertTrue(res)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|