def decrypt(privkey, data): s = serialize.Deserializer(data) iv = s.bytes(16) curve = s.uint(2) assert curve == 0x02ca x_len = s.uint(2) assert x_len <= 32 # TODO Should we assert this? And should we assert no leading zero bytes? x = s.bytes(x_len) y_len = s.uint(2) assert y_len <= 32 # TODO Should we assert this? And should we assert no leading zero bytes? y = s.bytes(y_len) encrypted = s.bytes(-32) assert encrypted != b'' mac = s.bytes(32) pubkey = x.rjust(32, b'\x00') + y.rjust(32, b'\x00') public_key = _pub_to_public(pubkey) private_key = _priv_to_private(privkey) secret = private_key.exchange(ec.ECDH(), public_key) key = hashlib.sha512(secret).digest() enckey = key[0:32] mackey = key[32:64] maccer = HMAC(mackey, hashes.SHA256(), openssl.backend) maccer.update(data[0:-32]) maccer.verify(mac) cipher = Cipher(algorithms.AES(enckey), modes.CBC(iv), openssl.backend) decryptor = cipher.decryptor() padded = decryptor.update(encrypted) + decryptor.finalize() unpadder = padding.PKCS7(128).unpadder() return unpadder.update(padded) + unpadder.finalize()
def from_bytes(cls, data): s = serialize.Deserializer(data) magic = s.uint(4) command = s.str(12).rstrip('\0') length = s.uint(4) checksum = s.bytes(4) return cls(magic, command, length, checksum)
def from_str(cls, text): data = base58.decode(text) s = serialize.Deserializer(data) version = s.vint() stream = s.vint() ripe = s.bytes().rjust(20, b'\x00') return cls(version, stream, ripe)
def from_bytes(cls, data): s = serialize.Deserializer(data) return cls(nonce=s.uint(8), expires=s.uint(8), type=s.uint(4), version=s.vint(), stream=s.vint(), payload=s.bytes())
def from_bytes(cls, data): s = serialize.Deserializer(data) behavior = s.uint(4) verkey = s.bytes(64) enckey = s.bytes(64) trials = s.vint() extra = s.vint() signature = s.vbytes() return cls(behavior, verkey, enckey, trials, extra, signature)
def from_bytes(cls, data): s = serialize.Deserializer(data) addresses = [] for i in range(s.vint()): time = s.uint(8) stream = s.uint(4) services = s.uint(8) ip = s.bytes(16) port = s.uint(2) addresses.append(Address(time, stream, services, ip, port)) return cls(addresses)
def from_bytes(cls, data): s = serialize.Deserializer(data) return cls(version=s.uint(4), services=s.uint(8), timestamp=s.uint(8), dst_services=s.uint(8), dst_ip=s.bytes(16), dst_port=s.uint(2), src_services=s.uint(8), src_ip=s.bytes(16), src_port=s.uint(2), nonce=s.uint(8), user_agent=s.vstr(), streams=[s.vint() for i in range(s.vint())])
def from_bytes(cls, data): s = serialize.Deserializer(data) addrver = s.vint() stream = s.vint() behavior = s.uint(4) verkey = s.bytes(64) enckey = s.bytes(64) trials = s.vint() extra = s.vint() encoding = s.vint() message = s.vbytes() signature = s.vbytes() return cls(addrver, stream, behavior, verkey, enckey, trials, extra, encoding, message, signature)
def from_bytes(cls, data): s = serialize.Deserializer(data) return cls(hashes=[s.bytes(32) for i in range(s.vint())])
def from_bytes(cls, data): s = serialize.Deserializer(data) version = s.vint() stream = s.vint() ripe = s.bytes(20) return cls(version, stream, ripe)