summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2019-01-28 17:50:42 +0100
committerJustus Winter <justus@sequoia-pgp.org>2019-01-29 17:41:26 +0100
commit3c12ff7c9c1ea7c708023d57ecd95ab023be5f65 (patch)
treeb58c2fd1d98c8b9609093f9ab013f3e75702d0e0
parent88ec4ab63f280db148da83f78afca62d5eeabf76 (diff)
openpgp-ffi: Convert TSK.
-rw-r--r--openpgp-ffi/include/sequoia/openpgp.h16
-rw-r--r--openpgp-ffi/src/tpk.rs5
-rw-r--r--openpgp-ffi/src/tsk.rs64
3 files changed, 53 insertions, 32 deletions
diff --git a/openpgp-ffi/include/sequoia/openpgp.h b/openpgp-ffi/include/sequoia/openpgp.h
index 03c5cd1b..2c71845a 100644
--- a/openpgp-ffi/include/sequoia/openpgp.h
+++ b/openpgp-ffi/include/sequoia/openpgp.h
@@ -1083,6 +1083,22 @@ pgp_status_t pgp_tsk_new (pgp_error_t *errp, char *primary_uid,
void pgp_tsk_free (pgp_tsk_t tsk);
/*/
+/// Clones the TSK.
+/*/
+pgp_tsk_t pgp_tsk_clone (pgp_tsk_t message);
+
+/*/
+/// Returns a human readable description of this object suitable for
+/// debugging.
+/*/
+char *pgp_tsk_debug (const pgp_tsk_t);
+
+/*/
+/// Compares TPKs.
+/*/
+bool pgp_tsk_equal (const pgp_tsk_t a, const pgp_tsk_t b);
+
+/*/
/// Returns a reference to the corresponding TPK.
/*/
pgp_tpk_t pgp_tsk_tpk (pgp_tsk_t tsk);
diff --git a/openpgp-ffi/src/tpk.rs b/openpgp-ffi/src/tpk.rs
index 1649a6ae..4ebacea4 100644
--- a/openpgp-ffi/src/tpk.rs
+++ b/openpgp-ffi/src/tpk.rs
@@ -15,7 +15,6 @@ use self::openpgp::{
Packet,
PacketPile,
RevocationStatus,
- TSK,
autocrypt::Autocrypt,
crypto,
constants::ReasonForRevocation,
@@ -34,6 +33,7 @@ use self::openpgp::{
use ::error::Status;
use super::fingerprint::Fingerprint;
+use super::tsk::TSK;
use Maybe;
/// A transferable public key (TPK).
@@ -176,8 +176,7 @@ fn pgp_tpk_fingerprint(tpk: *const TPK)
#[::ffi_catch_abort] #[no_mangle] pub extern "system"
fn pgp_tpk_into_tsk(tpk: *mut TPK)
-> *mut TSK {
- let tpk = tpk.move_from_raw();
- box_raw!(tpk.into_tsk())
+ tpk.move_from_raw().into_tsk().move_into_raw()
}
/// Returns a reference to the TPK's primary key.
diff --git a/openpgp-ffi/src/tsk.rs b/openpgp-ffi/src/tsk.rs
index 688a4760..f3f2e52d 100644
--- a/openpgp-ffi/src/tsk.rs
+++ b/openpgp-ffi/src/tsk.rs
@@ -8,32 +8,44 @@ use failure;
use std::io::Write;
use libc::c_char;
-extern crate sequoia_openpgp;
-use self::sequoia_openpgp::{
- TSK,
+extern crate sequoia_openpgp as openpgp;
+use self::openpgp::{
packet::Signature,
serialize::Serialize,
};
use super::tpk::TPK;
use ::error::Status;
-use MoveIntoRaw;
+
+/// A transferable secret key (TSK).
+///
+/// A TSK (see [RFC 4880, section 11.2]) can be used to create
+/// signatures and decrypt data.
+///
+/// [RFC 4880, section 11.2]: https://tools.ietf.org/html/rfc4880#section-11.2
+///
+/// Wraps [`sequoia-openpgp::TSK`].
+///
+/// [`sequoia-openpgp::TSK`]: ../../sequoia_openpgp/enum.TSK.html
+#[::ffi_wrapper_type(prefix = "pgp_", name = "tsk",
+ derive = "Clone, Debug, PartialEq")]
+pub struct TSK(openpgp::TSK);
/// Generates a new RSA 3072 bit key with UID `primary_uid`.
-#[::ffi_catch_abort] #[no_mangle]
-pub extern "system" fn pgp_tsk_new(errp: Option<&mut *mut failure::Error>,
- primary_uid: *const c_char,
- tsk_out: *mut *mut TSK,
- revocation_out: *mut *mut Signature)
- -> Status
+#[::ffi_catch_abort] #[no_mangle] pub extern "system"
+fn pgp_tsk_new(errp: Option<&mut *mut failure::Error>,
+ primary_uid: *const c_char,
+ tsk_out: *mut *mut TSK,
+ revocation_out: *mut *mut Signature)
+ -> Status
{
ffi_make_fry_from_errp!(errp);
let tsk_out = ffi_param_ref_mut!(tsk_out);
let revocation_out = ffi_param_ref_mut!(revocation_out);
let primary_uid = ffi_param_cstr!(primary_uid).to_string_lossy();
- match TSK::new(primary_uid) {
+ match openpgp::TSK::new(primary_uid) {
Ok((tsk, revocation)) => {
- *tsk_out = box_raw!(tsk);
+ *tsk_out = tsk.move_into_raw();
*revocation_out = box_raw!(revocation);
Status::Success
},
@@ -41,35 +53,29 @@ pub extern "system" fn pgp_tsk_new(errp: Option<&mut *mut failure::Error>,
}
}
-/// Frees the TSK.
-#[::ffi_catch_abort] #[no_mangle]
-pub extern "system" fn pgp_tsk_free(tsk: Option<&mut TSK>) {
- ffi_free!(tsk)
-}
-
/// Returns a reference to the corresponding TPK.
#[::ffi_catch_abort] #[no_mangle] pub extern "system"
fn pgp_tsk_tpk(tsk: *const TSK)
-> *const TPK {
- ffi_param_ref!(tsk).tpk().move_into_raw()
+ tsk.ref_raw().tpk().move_into_raw()
}
/// Converts the TSK into a TPK.
-#[::ffi_catch_abort] #[no_mangle]
-pub extern "system" fn pgp_tsk_into_tpk(tsk: *mut TSK)
- -> *mut TPK {
- ffi_param_move!(tsk).into_tpk().move_into_raw()
+#[::ffi_catch_abort] #[no_mangle] pub extern "system"
+fn pgp_tsk_into_tpk(tsk: *mut TSK)
+ -> *mut TPK {
+ tsk.move_from_raw().into_tpk().move_into_raw()
}
/// Serializes the TSK.
-#[::ffi_catch_abort] #[no_mangle]
-pub extern "system" fn pgp_tsk_serialize(errp: Option<&mut *mut failure::Error>,
- tsk: *const TSK,
- writer: *mut Box<Write>)
- -> Status {
+#[::ffi_catch_abort] #[no_mangle] pub extern "system"
+fn pgp_tsk_serialize(errp: Option<&mut *mut failure::Error>,
+ tsk: *const TSK,
+ writer: *mut Box<Write>)
+ -> Status {
ffi_make_fry_from_errp!(errp);
- let tsk = ffi_param_ref!(tsk);
+ let tsk = tsk.ref_raw();
let writer = ffi_param_ref_mut!(writer);
ffi_try_status!(tsk.serialize(writer))
}