Exemple #1
0
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()
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
 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())
Exemple #5
0
 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)
Exemple #6
0
 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)
Exemple #7
0
 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())])
Exemple #8
0
 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)
Exemple #9
0
 def from_bytes(cls, data):
     s = serialize.Deserializer(data)
     return cls(hashes=[s.bytes(32) for i in range(s.vint())])
Exemple #10
0
 def from_bytes(cls, data):
     s = serialize.Deserializer(data)
     version = s.vint()
     stream = s.vint()
     ripe = s.bytes(20)
     return cls(version, stream, ripe)