diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2019-01-28 17:50:42 +0100 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2019-01-29 17:41:26 +0100 |
commit | 3c12ff7c9c1ea7c708023d57ecd95ab023be5f65 (patch) | |
tree | b58c2fd1d98c8b9609093f9ab013f3e75702d0e0 | |
parent | 88ec4ab63f280db148da83f78afca62d5eeabf76 (diff) |
openpgp-ffi: Convert TSK.
-rw-r--r-- | openpgp-ffi/include/sequoia/openpgp.h | 16 | ||||
-rw-r--r-- | openpgp-ffi/src/tpk.rs | 5 | ||||
-rw-r--r-- | openpgp-ffi/src/tsk.rs | 64 |
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)) } |