def sign_deposit_data(deposit_data: DepositMessage, sk: int) -> Deposit: ''' Given a DepositMessage, it signs its root and returns a Deposit ''' assert bls.PrivToPub(sk) == deposit_data.pubkey domain = compute_domain() signing_root = compute_signing_root(deposit_data, domain) signed_deposit_data = Deposit(**deposit_data.as_dict(), signature=bls.Sign(sk, signing_root)) return signed_deposit_data
def encrypt(cls, *, secret: bytes, password: str, path: str='', kdf_salt: bytes=randbits(256).to_bytes(32, 'big'), aes_iv: bytes=randbits(128).to_bytes(16, 'big')): keystore = cls() keystore.crypto.kdf.params['salt'] = kdf_salt decryption_key = keystore.kdf(password=password, **keystore.crypto.kdf.params) keystore.crypto.cipher.params['iv'] = aes_iv cipher = AES_128_CTR(key=decryption_key[:16], **keystore.crypto.cipher.params) keystore.crypto.cipher.message = cipher.encrypt(secret) keystore.crypto.checksum.message = SHA256(decryption_key[16:32] + keystore.crypto.cipher.message) keystore.pubkey = bls.PrivToPub(int.from_bytes(secret, 'big')).hex() keystore.path = path return keystore
def test_fast_aggregate_verify(SKs, message): PKs = [G2ProofOfPossession.PrivToPub(sk) for sk in SKs] signatures = [G2ProofOfPossession.Sign(sk, message) for sk in SKs] aggregate_signature = G2ProofOfPossession.Aggregate(signatures) assert G2ProofOfPossession.FastAggregateVerify(PKs, message, aggregate_signature)
def test_pop(sk): pk = G2ProofOfPossession.PrivToPub(sk) proof = G2ProofOfPossession.PopProve(sk) assert G2ProofOfPossession.PopVerify(pk, proof)
from py_ecc.bls import G2ProofOfPossession as bls from eth2spec.phase0 import spec privkeys = [i + 1 for i in range(spec.SLOTS_PER_EPOCH * 16)] pubkeys = [bls.PrivToPub(privkey) for privkey in privkeys] pubkey_to_privkey = { pubkey: privkey for privkey, pubkey in zip(privkeys, pubkeys) }
def withdrawal_pk(self): return bls.PrivToPub(self.withdrawal_sk)
def signing_pk(self): return bls.PrivToPub(self.signing_sk)
def signing_pk(self) -> bytes: return bls.PrivToPub(self.signing_sk)