def from_dict(secp: Secp256k1, dct: dict): sig = dct['part_sig'] return ParticipantData( dct['id'], PublicKey.from_bytearray(secp, bytearray(dct['public_blind_excess'])), PublicKey.from_bytearray(secp, bytearray(dct['public_nonce'])), None if sig is None else Signature.from_bytearray( secp, bytearray(sig), True))
def test_public_key(): secp = Secp256k1(None, FLAG_ALL) # (de)serialization secret_key = SecretKey.random(secp) public_key = secret_key.to_public_key(secp) public_key_2 = PublicKey.from_bytearray(secp, public_key.to_bytearray(secp)) assert public_key == public_key_2 # (a+b)*G = a*G + b*G secret_key_a = SecretKey.random(secp) secret_key_b = SecretKey.random(secp) secret_key_a_b = secret_key_a.add(secp, secret_key_b) public_key_a = secret_key_a.to_public_key(secp) public_key_b = secret_key_b.to_public_key(secp) public_key_a_b = secret_key_a_b.to_public_key(secp) public_key_a_b_2 = PublicKey.from_combination(secp, [public_key_a, public_key_b]) public_key_a_b_3 = public_key_a.add_scalar(secp, secret_key_b) assert public_key_a_b == public_key_a_b_2 assert public_key_a_b == public_key_a_b_3 # (ab)*G = a(b*G) = b(a*G) secret_key_a = SecretKey.random(secp) secret_key_b = SecretKey.random(secp) secret_key_ab = secret_key_a.mul(secp, secret_key_b) public_key_ab = secret_key_ab.to_public_key(secp) public_key_ab_2 = secret_key_a.to_public_key(secp) public_key_ab_2.mul_assign(secp, secret_key_b) public_key_ab_3 = secret_key_b.to_public_key(secp) public_key_ab_3.mul_assign(secp, secret_key_a) assert public_key_ab == public_key_ab_2 assert public_key_ab == public_key_ab_3 # (c(a+b))*G = c(a*G) + c(b*G) secret_key_a = SecretKey.random(secp) secret_key_b = SecretKey.random(secp) secret_key_c = SecretKey.random(secp) secret_key_ca_b = secret_key_a.add(secp, secret_key_b) secret_key_ca_b.mul_assign(secp, secret_key_c) public_key_ca_b = secret_key_ca_b.to_public_key(secp) public_key_ca = secret_key_a.to_public_key(secp) public_key_ca.mul_assign(secp, secret_key_c) public_key_cb = secret_key_b.to_public_key(secp) public_key_cb.mul_assign(secp, secret_key_c) public_key_ca_cb = public_key_ca.add(secp, public_key_cb) assert public_key_ca_b == public_key_ca_cb # (a+b+c)*G = a*G + b*G + c*G secret_key_a = SecretKey.random(secp) secret_key_b = SecretKey.random(secp) secret_key_c = SecretKey.random(secp) secret_key_a_b_c = secret_key_a.add(secp, secret_key_b) secret_key_a_b_c.add_assign(secp, secret_key_c) public_key_a_b_c = secret_key_a_b_c.to_public_key(secp) public_key_a = secret_key_a.to_public_key(secp) public_key_b = secret_key_b.to_public_key(secp) public_key_c = secret_key_c.to_public_key(secp) public_key_a_b_c_2 = PublicKey.from_combination( secp, [public_key_a, public_key_b, public_key_c]) assert public_key_a_b_c == public_key_a_b_c_2
def from_bytearray(secp: Secp256k1, data: bytearray): assert len(data) == 78 return ExtendedPublicKey(data[:4], data[4], Fingerprint.from_bytearray(data[5:9]), ChildNumber.from_bytearray(data[9:13]), PublicKey.from_bytearray(secp, data[45:78]), ChainCode.from_bytearray(data[13:45]))