def test_multiply_random(self): for _ in range(100): sk1 = curve25519.generate_secret() sk2 = curve25519.generate_secret() pk1 = curve25519.publickey(sk1) pk2 = curve25519.publickey(sk2) session1 = curve25519.multiply(sk1, pk2) session2 = curve25519.multiply(sk2, pk1) self.assertEqual(session1, session2)
def ecdh(seckey: bytes, peer_public_key: bytes, curve: str) -> bytes: if curve == 'secp256k1': from trezor.crypto.curve import secp256k1 session_key = secp256k1.multiply(seckey, peer_public_key) elif curve == 'nist256p1': from trezor.crypto.curve import nist256p1 session_key = nist256p1.multiply(seckey, peer_public_key) elif curve == 'curve25519': from trezor.crypto.curve import curve25519 if peer_public_key[0] != 0x40: raise ValueError('Curve25519 public key should start with 0x40') session_key = b'\x04' + curve25519.multiply(seckey, peer_public_key[1:]) else: raise ValueError('Unsupported curve for ECDH: ' + curve) return session_key
def ecdh(seckey: bytes, peer_public_key: bytes, curve: str) -> bytes: if curve == "secp256k1": from trezor.crypto.curve import secp256k1 session_key = secp256k1.multiply(seckey, peer_public_key) elif curve == "nist256p1": from trezor.crypto.curve import nist256p1 session_key = nist256p1.multiply(seckey, peer_public_key) elif curve == "curve25519": from trezor.crypto.curve import curve25519 if peer_public_key[0] != 0x40: raise wire.DataError("Curve25519 public key should start with 0x40") session_key = b"\x04" + curve25519.multiply(seckey, peer_public_key[1:]) else: raise wire.DataError("Unsupported curve for ECDH: " + curve) return session_key
def test_multiply(self): for sk, pk, session in self.vectors: session2 = curve25519.multiply(unhexlify(sk), unhexlify(pk)) self.assertEqual(session2, unhexlify(session))