diff --git a/Cargo.lock b/Cargo.lock index 91199e2..46b6d5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -825,6 +825,7 @@ dependencies = [ name = "ctss" version = "0.1.0" dependencies = [ + "hex", "tss-lib", ] diff --git a/ctss/Cargo.toml b/ctss/Cargo.toml index 696984b..1511896 100644 --- a/ctss/Cargo.toml +++ b/ctss/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +hex = "0.4.3" tss-lib = { path = "../tss" } [lib] diff --git a/ctss/src/lib.rs b/ctss/src/lib.rs index ac25977..c449450 100644 --- a/ctss/src/lib.rs +++ b/ctss/src/lib.rs @@ -1,9 +1,8 @@ - -use std::os::raw::c_char; use std::ffi::CStr; use std::ffi::CString; +use std::os::raw::c_char; -use tss_lib::keygen; +use tss_lib::{keygen, sign}; pub fn parse_string(s: *const c_char) -> &'static str { let s = unsafe { @@ -27,8 +26,42 @@ pub extern "C" fn keygen( index, threshold, number_of_parties, - ).unwrap(); + ) + .unwrap(); let data = CString::new(data).unwrap(); data.into_raw() } + +#[no_mangle] +pub extern "C" fn sign( + server_url: *const c_char, + room: *const c_char, + local_share: *const c_char, + parties: *const c_char, + data: *const c_char, +) -> *const c_char { + let parties = parse_string(parties) + .split(",") + .map(|c| c.trim().parse::().unwrap()) + .collect(); + + let signature = sign::run( + parse_string(server_url), + parse_string(room), + parse_string(local_share), + parties, + parse_string(data).as_bytes(), + ) + .unwrap(); + + let signature = format!( + r#"{{ "r":"0x{}", "s":"0x{}", "v":"{}" }}"#, + hex::encode(signature.r.to_bytes().as_ref()), + hex::encode(signature.s.to_bytes().as_ref()), + signature.recid, + ); + + let signature = CString::new(signature).unwrap(); + signature.into_raw() +} diff --git a/examples/README.md b/examples/README.md index cbe216c..fc5d984 100644 --- a/examples/README.md +++ b/examples/README.md @@ -5,4 +5,5 @@ ctss bind examples ``` go build -ldflags="-r lib" keygen.go +go build -ldflags="-r lib" sign.go ``` diff --git a/examples/golang/.gitignore b/examples/golang/.gitignore index f75d948..7c43b85 100644 --- a/examples/golang/.gitignore +++ b/examples/golang/.gitignore @@ -1,2 +1,3 @@ /keygen +/sign /local-share*.json diff --git a/examples/golang/lib/ctss.h b/examples/golang/lib/ctss.h index fdddbc5..dc16d24 100644 --- a/examples/golang/lib/ctss.h +++ b/examples/golang/lib/ctss.h @@ -5,3 +5,9 @@ const char *keygen(const char *server_url, uint16_t index, uint16_t threshold, uint16_t number_of_parties); + +const char *sign(const char *server_url, + const char *room, + const char *local_share, + const char *parties, + const char *data); diff --git a/examples/golang/lib/libctss.dylib b/examples/golang/lib/libctss.dylib index 0b9d88f..94c1541 100755 Binary files a/examples/golang/lib/libctss.dylib and b/examples/golang/lib/libctss.dylib differ diff --git a/examples/golang/sign.go b/examples/golang/sign.go new file mode 100644 index 0000000..4e8e7f0 --- /dev/null +++ b/examples/golang/sign.go @@ -0,0 +1,35 @@ +package main + +/* +#cgo LDFLAGS: -L./lib -lctss +#include "./lib/ctss.h" +*/ +import "C" +import ( + "fmt" + "log" + "strconv" +) + +func main() { + fmt.Println("input index:") + var indexStr string + _, err := fmt.Scanln(&indexStr) + if err != nil { + log.Fatalln(err) + } + + index, err := strconv.Atoi(indexStr) + if err != nil { + log.Fatalln(err) + } + signature := C.sign( + C.CString("http://localhost:8000/"), + C.CString("default-keygen"), + C.CString(fmt.Sprintf("local-share%d.json", index)), + C.CString("1,2"), + C.CString("hello"), + ) + + fmt.Println(C.GoString(signature)) +}