summaryrefslogtreecommitdiffstats
path: root/openpgp-ffi/src/crypto.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openpgp-ffi/src/crypto.rs')
-rw-r--r--openpgp-ffi/src/crypto.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/openpgp-ffi/src/crypto.rs b/openpgp-ffi/src/crypto.rs
new file mode 100644
index 00000000..5b695ec7
--- /dev/null
+++ b/openpgp-ffi/src/crypto.rs
@@ -0,0 +1,54 @@
+//! Cryptographic primitives.
+//!
+//! Wraps [`sequoia-openpgp::crypto`].
+//!
+//! [`sequoia-openpgp::crypto`]: ../../../sequoia_openpgp/crypto/index.html
+
+extern crate sequoia_openpgp;
+use self::sequoia_openpgp::{
+ crypto,
+ packet::Key,
+};
+
+/// Frees a signer.
+#[::ffi_catch_abort] #[no_mangle]
+pub extern "system" fn sq_signer_free
+ (s: Option<&mut &'static mut crypto::Signer>)
+{
+ ffi_free!(s)
+}
+
+/// Creates a new key pair.
+#[::ffi_catch_abort] #[no_mangle]
+pub extern "system" fn sq_key_pair_new
+ (errp: Option<&mut *mut failure::Error>, public: *mut Key, secret: *mut crypto::mpis::SecretKey)
+ -> *mut crypto::KeyPair
+{
+ ffi_make_fry_from_errp!(errp);
+ let public = ffi_param_move!(public);
+ let secret = ffi_param_move!(secret);
+ ffi_try_box!(crypto::KeyPair::new(*public, *secret))
+}
+
+/// Frees a key pair.
+#[::ffi_catch_abort] #[no_mangle]
+pub extern "system" fn sq_key_pair_free
+ (kp: Option<&mut crypto::KeyPair>)
+{
+ ffi_free!(kp)
+}
+
+/// Creates a signer from a key pair.
+///
+/// Note that the returned object merely references the key pair, and
+/// must not outlive the key pair.
+#[::ffi_catch_abort] #[no_mangle]
+pub extern "system" fn sq_key_pair_as_signer
+ (kp: *mut crypto::KeyPair)
+ -> *mut &'static mut crypto::Signer
+{
+ let kp = ffi_param_ref_mut!(kp);
+ let signer: &mut crypto::Signer = kp;
+ box_raw!(signer)
+ //box_raw!(kp)
+}