Skip to content

Commit

Permalink
python ffi
Browse files Browse the repository at this point in the history
  • Loading branch information
jasoncolburne committed Feb 4, 2023
1 parent a3beb9a commit 321caad
Show file tree
Hide file tree
Showing 13 changed files with 218 additions and 25 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
/target
/Cargo.lock
/cargo/*/Cargo.toml
/cargo/*/Cargo.lock
/*.profraw
.idea
.idea
36 changes: 36 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
DEV_DEPENDENCIES_LINE = $(shell cat Cargo.toml | grep -n "\[dev-dependencies\]" | cut -d : -f 1)
DELIMITING_LINE = $(shell echo $$(( $(DEV_DEPENDENCIES_LINE) - 2 )))
TOTAL_LINES = $(shell cat Cargo.toml | wc -l)
TAIL_LINES = $(shell echo $$(( $(TOTAL_LINES) - $(DELIMITING_LINE) )))

python:
@head -n $(DELIMITING_LINE) Cargo.toml > cargo/$@/Cargo.toml
@echo "pyo3 = { version = \"0.18.0\", features = [\"abi3\", \"extension-module\"] }" >> cargo/$@/Cargo.toml
@tail -n $(TAIL_LINES) Cargo.toml >> cargo/$@/Cargo.toml
@echo >> cargo/$@/Cargo.toml
@cat cargo/$@/Cargo.toml.tail >> cargo/$@/Cargo.toml
@cd cargo/$@ && cargo build --release --target-dir ../../target/$@
@mv target/$@/release/libcesride.dylib target/$@/release/cesride.so

python-shell:
@cd target/python/release/ && python3

rust:
@cargo build --release

libs: rust python

clean:
cargo clean

fix:
cargo fix
cargo fmt

preflight:
cargo fmt --check
cargo clippy -- -D warnings
cargo build --release
cargo test --release
cargo audit
cargo tarpaulin
56 changes: 44 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,54 @@

Cryptographic primitives for use with Composable Event Streaming Representation (CESR).

#### Running tests on an M1
## Important Reference Material
- WebOfTrust/[ietf-cesr](https://github.com/WebOfTrust/ietf-cesr) repository - IETF draft specification for CESR
- Design Assumptions, Use Cases, and ToDo list - [HackMD link](https://hackmd.io/W2Z39cuSSTmD2TovVLvAPg?view)
- Introductory articles:
- [#1 CESR Proof Signatures](https://medium.com/happy-blockchains/cesr-proof-signatures-are-the-segwit-of-authentic-data-in-keri-e891c83e070a)
- [#2 CESR Overview](https://medium.com/happy-blockchains/cesr-one-of-sam-smiths-inventions-is-as-controversial-as-genius-d757f36b88f8)

## Development

Install dependencies:
```shell
cargo install cargo-audit
cargo install cargo-tarpaulin
```

Change some code and then fix it automatically:
```shell
make fix
```

Commit your changes locally, and run these automated tests:
```shell
cargo +nightly test --target=aarch64-apple-darwin --package cesride --lib core::matter::matter_codex_tests::test_matter_new -- --exact --nocapture
make clean preflight
```

If you've modified the python code, either add some python tests (you'll need to do that yourself,
none have been added) or run this code after running `make libs`:
```shell
make python python-shell

# in python shell
from cesride import Matter
m = Matter(qb64="BGlOiUdp5sMmfotHfCWQKEzWR91C72AH0lT84c0um-Qj")
qb2 = m.qb2()
print(qb2)
m2 = Matter(qb2=bytes(qb2))
m2.qb64()
```
and expect to see the initial `qb64` input as the output.

You are now ready to open a pull request!

## Community
## Bi-weekly Meeting

### Bi-weekly Meeting
- [Zoom Link](https://us06web.zoom.us/j/88102305873?pwd=Wm01TEJKUWc0aE51a0QzZ2hNbTV2Zz09)
- [HackMD Link](https://hackmd.io/UQaEI0w8Thy_xRF7oYX03Q?view) Bi-Weekly Meeting Agenda and Minutes
- Slack https://join.slack.com/t/keriworld/shared_invite/zt-14326yxue-p7P~GEmAZ65luGSZvbgFAQ
- `#cesr` channel.
- [Agenda and Minutes Link](https://hackmd.io/UQaEI0w8Thy_xRF7oYX03Q?view)

# Important Reference Material
- WebOfTrust/[ietf-cesr](https://github.com/WebOfTrust/ietf-cesr) repository - IETF draft specification for CESR
- Design Assumptions, Use Cases, and ToDo list - [HackMD link](https://hackmd.io/W2Z39cuSSTmD2TovVLvAPg?view)
- Introductory articles:
- [#1 CESR Proof Signatures](https://medium.com/happy-blockchains/cesr-proof-signatures-are-the-segwit-of-authentic-data-in-keri-e891c83e070a)
- [#2 CESR Overview](https://medium.com/happy-blockchains/cesr-one-of-sam-smiths-inventions-is-as-controversial-as-genius-d757f36b88f8)
### Slack
- [Slack Invite](https://join.slack.com/t/keriworld/shared_invite/zt-14326yxue-p7P~GEmAZ65luGSZvbgFAQ)
- `#cesr` channel.
11 changes: 11 additions & 0 deletions cargo/python/.cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[target.x86_64-apple-darwin]
rustflags = [
"-C", "link-arg=-undefined",
"-C", "link-arg=dynamic_lookup",
]

[target.aarch64-apple-darwin]
rustflags = [
"-C", "link-arg=-undefined",
"-C", "link-arg=dynamic_lookup",
]
11 changes: 11 additions & 0 deletions cargo/python/Cargo.toml.tail
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[lib]
path = "../../src/lib_python.rs"
test = false
doctest = false
bench = true
doc = true
crate-type = ["cdylib"]

[features]
default = ["python"]
python = []
2 changes: 1 addition & 1 deletion src/core/counter/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pub(crate) mod tables;
pub mod tables;

use crate::core::util;
use crate::error::{err, Error, Result};
Expand Down
2 changes: 1 addition & 1 deletion src/core/diger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::error::{err, Error, Result};

type Blake2b256 = blake2::Blake2b<blake2::digest::consts::U32>;

trait Diger {
pub trait Diger {
fn new_with_code_and_raw(code: &str, raw: &[u8]) -> Result<Matter>
where
Self: Sized;
Expand Down
9 changes: 5 additions & 4 deletions src/core/matter/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
pub(crate) mod tables;

use base64::{engine::general_purpose as b64_engine, Engine};
#[cfg(feature = "python")]
use pyo3::prelude::pyclass;

use crate::core::util;
use crate::error::{err, Error, Result};

pub mod tables;

#[cfg_attr(feature = "python", pyclass)]
#[derive(Debug, Clone)]
pub struct Matter {
pub(crate) raw: Vec<u8>,
Expand Down Expand Up @@ -131,8 +134,6 @@ impl Matter {
self.binfil()
}

pub fn transferable() {}

fn infil(&self) -> Result<String> {
let code = &self.code;
let size = self.size;
Expand Down
12 changes: 6 additions & 6 deletions src/core/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
mod cigar;
mod counter;
mod diger;
mod matter;
mod util;
mod verfer;
pub mod cigar;
pub mod counter;
pub mod diger;
pub mod matter;
pub mod util;
pub mod verfer;
7 changes: 7 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,10 @@

mod core;
mod error;

pub use crate::core::cigar::Cigar;
pub use crate::core::counter::{tables as counter, Counter};
pub use crate::core::diger::Diger;
pub use crate::core::matter::{tables as matter, Matter};
pub use crate::core::util;
pub use crate::core::verfer::Verfer;
16 changes: 16 additions & 0 deletions src/lib_python.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// TODO: remove before 1.0.0
#![allow(dead_code)]

use pyo3::prelude::*;

mod core;
mod error;
mod python;

use crate::core::matter::Matter;

#[pymodule]
fn cesride(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_class::<Matter>()?;
Ok(())
}
76 changes: 76 additions & 0 deletions src/python/matter.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
use pyo3::{
prelude::*,
exceptions::{PyException, PyValueError},
};

use crate::core::matter::Matter;

#[pymethods]
impl Matter {
#[new]
fn py_new(
code: Option<&str>,
raw: Option<&[u8]>,
raw_size: Option<usize>,
qb64: Option<&str>,
qb64b: Option<&[u8]>,
qb2: Option<&[u8]>,
) -> PyResult<Self> {
let result = if let Some(code) = code {
let (raw, raw_size) = if raw.is_none() || raw_size.is_none() {
return Err(PyValueError::new_err("code present, raw and raw_size missing"));
} else {
(raw.unwrap(), raw_size.unwrap())
};

Self::new_with_code_and_raw(code, raw, raw_size)
} else if let Some(qb64) = qb64 {
Self::new_with_qb64(qb64)
} else if let Some(qb64b) = qb64b {
Self::new_with_qb64b(qb64b)
} else if let Some(qb2) = qb2 {
Self::new_with_qb2(qb2)
} else {
return Err(PyValueError::new_err("must specify some parameters"));
};

match result {
Ok(matter) => Ok(matter),
Err(e) => Err(PyException::new_err(e.to_string())),
}
}

#[pyo3(name = "code")]
fn py_code(&self) -> String {
self.code()
}

#[pyo3(name = "raw")]
fn py_raw(&self) -> Vec<u8> {
self.raw()
}

#[pyo3(name = "qb64")]
fn py_qb64(&self) -> PyResult<String> {
match self.qb64() {
Ok(s) => Ok(s),
Err(e) => Err(PyException::new_err(e.to_string())),
}
}

#[pyo3(name = "qb64b")]
fn py_qb64b(&self) -> PyResult<Vec<u8>> {
match self.qb64b() {
Ok(b) => Ok(b),
Err(e) => Err(PyException::new_err(e.to_string())),
}
}

#[pyo3(name = "qb2")]
fn py_qb2(&self) -> PyResult<Vec<u8>> {
match self.qb2() {
Ok(b) => Ok(b),
Err(e) => Err(PyException::new_err(e.to_string())),
}
}
}
1 change: 1 addition & 0 deletions src/python/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
mod matter;

0 comments on commit 321caad

Please sign in to comment.