From 5bef3bde45f71126cdca3e8ad30b1047287c843a Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 20 Dec 2018 17:42:00 +0100 Subject: openpgp: Hand a Vec to stream::Signer. - Using `crypto::Signer`s has several benefits. First, it shifts the decision which key to use to the caller, moving policy out of the caller. Second, it forces the caller to deal with encrypted keys. Finally, it allows us to use remote keys like smart cards in the future. - Fixes #142. --- ffi/src/openpgp/mod.rs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'ffi') diff --git a/ffi/src/openpgp/mod.rs b/ffi/src/openpgp/mod.rs index 16321497..f3316944 100644 --- a/ffi/src/openpgp/mod.rs +++ b/ffi/src/openpgp/mod.rs @@ -1173,7 +1173,8 @@ pub extern "system" fn sq_arbitrary_writer_new pub extern "system" fn sq_signer_new (ctx: *mut Context, inner: *mut writer::Stack<'static, Cookie>, - signers: *const &'static TPK, signers_len: size_t) + signers: *const *mut Box, + signers_len: size_t) -> *mut writer::Stack<'static, Cookie> { let ctx = ffi_param_ref_mut!(ctx); @@ -1182,7 +1183,13 @@ pub extern "system" fn sq_signer_new let signers = unsafe { slice::from_raw_parts(signers, signers_len) }; - fry_box!(ctx, Signer::new(*inner, &signers)) + let signers = signers.into_iter().map( + |s| -> &mut dyn self::openpgp::crypto::Signer { + let signer = *s; + ffi_param_ref_mut!(signer).as_mut() + } + ).collect(); + fry_box!(ctx, Signer::new(*inner, signers)) } /// Creates a signer for a detached signature. @@ -1190,16 +1197,23 @@ pub extern "system" fn sq_signer_new pub extern "system" fn sq_signer_new_detached (ctx: *mut Context, inner: *mut writer::Stack<'static, Cookie>, - signers: Option<&&'static TPK>, signers_len: size_t) + signers: *const *mut Box, + signers_len: size_t) -> *mut writer::Stack<'static, Cookie> { let ctx = ffi_param_ref_mut!(ctx); let inner = ffi_param_move!(inner); - let signers = signers.expect("Signers is NULL"); + let signers = ffi_param_ref!(signers); let signers = unsafe { slice::from_raw_parts(signers, signers_len) }; - fry_box!(ctx, Signer::detached(*inner, &signers)) + let signers = signers.into_iter().map( + |s| -> &mut dyn self::openpgp::crypto::Signer { + let signer = *s; + ffi_param_ref_mut!(signer).as_mut() + } + ).collect(); + fry_box!(ctx, Signer::detached(*inner, signers)) } /// Writes a literal data packet. -- cgit v1.2.3