1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use pyo3::prelude::*;
use rust_ipv8::serialization::Packet;
use pyo3::exceptions::{ValueError, KeyError};
use pyo3::types::PyBytes;
use rust_ipv8::crypto::signature::KeyPair;
use rust_ipv8::util::as_fixed_size;
#[pymodule]
pub fn borrowed_bundler(_py: Python, m: &PyModule) -> PyResult<()> {
#[pyfn(m, "borrowed_verify_signature")]
fn borrowed_verify_signature<'py>(
py: Python<'py>,
_auth: &PyBytes,
data: &PyBytes,
) -> PyResult<(bool, &'py PyBytes)> {
let packet = Packet(data.as_bytes().to_vec());
let mut de = packet
.start_deserialize()
.skip_header()
.or(Err(ValueError::py_err("Could not ignore the header")))?;
let (result, de) = py.allow_threads(move || {
let result = de.verify();
(result, de)
});
Ok((result, PyBytes::new(py, &de.pntr.0[de.index..])))
}
#[pyfn(m, "borrowed_create_signature")]
fn borrowed_create_signature<'py>(
py: Python<'py>,
seed: &PyBytes,
key: &PyBytes,
data: &PyBytes,
) -> PyResult<&'py PyBytes> {
let p = Packet(data.as_bytes().to_vec());
let key_fixed: &[u8; 32] =
as_fixed_size(key.as_bytes()).or(Err(KeyError::py_err("Key length was wrong")))?;
let seed_fixed: &[u8; 32] =
as_fixed_size(seed.as_bytes()).or(Err(KeyError::py_err("Seed length was wrong")))?;
let ourkey = KeyPair::from_seed_checked(seed_fixed, key_fixed)
.or(Err(KeyError::py_err("Invalid key given")))?;
let signed = p.sign(&ourkey).or(Err(KeyError::py_err("Sign error")))?;
Ok(PyBytes::new(py, &*signed.0))
}
Ok(())
}