diff --git a/DESCRIPTION b/DESCRIPTION index a0c70b3..601ad01 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: gpg Type: Package Title: GNU Privacy Guard for R -Version: 0.5 +Version: 0.5.9000 Authors@R: person("Jeroen", "Ooms", email = "jeroen@berkeley.edu", role = c("aut", "cre")) Description: Bindings to GnuPG for working with OpenGPG (RFC4880) cryptographic methods. Includes utilities for public key encryption, creating and verifying digital signatures, @@ -11,7 +11,7 @@ Description: Bindings to GnuPG for working with OpenGPG (RFC4880) cryptographic License: MIT + file LICENSE SystemRequirements: GPGME: libgpgme11-dev (deb), gpgme-devel (rpm) gpgme (brew). On Linux 'haveged' is recommended for generating entropy when using the GPG key generator. -RoxygenNote: 6.0.1 +RoxygenNote: 6.1.1 Roxygen: list(markdown = TRUE) Imports: curl diff --git a/NEWS b/NEWS index 0cac406..5bc3442 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +0.6 + - Add as_text parameter to decrypt to support raw output + 0.5 - Extract autobrew script to separate repository diff --git a/R/encrypt.R b/R/encrypt.R index beefce9..37a39c5 100644 --- a/R/encrypt.R +++ b/R/encrypt.R @@ -26,13 +26,14 @@ gpg_encrypt <- function(data, receiver, signer = NULL){ #' @rdname gpg_encrypt #' @param verify automatically checks that all signatures (if any) can be verified and #' raises an error otherwise +#' @param as_text convert output to text. Set to FALSE if you expect binary data. #' @useDynLib gpg R_gpgme_decrypt R_gpgme_signed_decrypt -gpg_decrypt <- function(data, verify = TRUE){ +gpg_decrypt <- function(data, verify = TRUE, as_text = TRUE){ data <- file_or_raw(data) if(isTRUE(verify)){ - .Call(R_gpgme_signed_decrypt, data) + .Call(R_gpgme_signed_decrypt, data, as_text) } else { - .Call(R_gpgme_decrypt, data) + .Call(R_gpgme_decrypt, data, as_text) } } diff --git a/man/gpg_encrypt.Rd b/man/gpg_encrypt.Rd index fbe73df..37b292b 100644 --- a/man/gpg_encrypt.Rd +++ b/man/gpg_encrypt.Rd @@ -7,7 +7,7 @@ \usage{ gpg_encrypt(data, receiver, signer = NULL) -gpg_decrypt(data, verify = TRUE) +gpg_decrypt(data, verify = TRUE, as_text = TRUE) } \arguments{ \item{data}{path or raw vector with data to encrypt / decrypt} @@ -19,6 +19,8 @@ the message} \item{verify}{automatically checks that all signatures (if any) can be verified and raises an error otherwise} + +\item{as_text}{convert output to text. Set to FALSE if you expect binary data.} } \description{ Encrypt or decrypt a message using the public key from the \code{receiver}. @@ -28,3 +30,4 @@ Optionally the message can be signed using the private key of the sender. Other gpg: \code{\link{gpg_keygen}}, \code{\link{gpg_keys}}, \code{\link{gpg_sign}} } +\concept{gpg} diff --git a/man/gpg_info.Rd b/man/gpg_info.Rd index 1ea5dc1..b5c17db 100644 --- a/man/gpg_info.Rd +++ b/man/gpg_info.Rd @@ -7,7 +7,8 @@ \alias{gpg_options} \title{Manage the GPG engine} \usage{ -gpg_restart(home = NULL, path = NULL, debug = "none", silent = FALSE) +gpg_restart(home = NULL, path = NULL, debug = "none", + silent = FALSE) gpg_version(silent = FALSE) diff --git a/man/gpg_keygen.Rd b/man/gpg_keygen.Rd index eb416c9..70c1241 100644 --- a/man/gpg_keygen.Rd +++ b/man/gpg_keygen.Rd @@ -26,3 +26,4 @@ GPG manual section on Other gpg: \code{\link{gpg_encrypt}}, \code{\link{gpg_keys}}, \code{\link{gpg_sign}} } +\concept{gpg} diff --git a/man/gpg_keys.Rd b/man/gpg_keys.Rd index 47ce429..bcedf23 100644 --- a/man/gpg_keys.Rd +++ b/man/gpg_keys.Rd @@ -44,3 +44,4 @@ you are using. Also see \link{gpg_keygen} for generating a new key. Other gpg: \code{\link{gpg_encrypt}}, \code{\link{gpg_keygen}}, \code{\link{gpg_sign}} } +\concept{gpg} diff --git a/man/gpg_sign.Rd b/man/gpg_sign.Rd index 6f72799..e30c69e 100644 --- a/man/gpg_sign.Rd +++ b/man/gpg_sign.Rd @@ -4,7 +4,6 @@ \alias{gpg_sign} \alias{gpg_verify} \alias{gpg} -\alias{gpg_sign} \title{PGP Signatures} \usage{ gpg_verify(signature, data = NULL, error = TRUE) @@ -42,3 +41,4 @@ gpg_verify(sig, msg, error = FALSE) Other gpg: \code{\link{gpg_encrypt}}, \code{\link{gpg_keygen}}, \code{\link{gpg_keys}} } +\concept{gpg} diff --git a/src/common.h b/src/common.h index 1b0af44..fcbe266 100644 --- a/src/common.h +++ b/src/common.h @@ -10,6 +10,7 @@ gpgme_ctx_t ctx; gpgme_error_t pwprompt(void *hook, const char *uid_hint, const char *passphrase_info, int prev_was_bad, int fd); SEXP data_to_string(gpgme_data_t buf); +SEXP data_to_raw(gpgme_data_t buf); struct keylist { gpgme_key_t key; diff --git a/src/encrypt.c b/src/encrypt.c index dd4cc90..9e6c6a2 100644 --- a/src/encrypt.c +++ b/src/encrypt.c @@ -18,12 +18,12 @@ SEXP R_gpgme_encrypt(SEXP data, SEXP id) { return data_to_string(output); } -SEXP R_gpgme_decrypt(SEXP data) { +SEXP R_gpgme_decrypt(SEXP data, SEXP as_text) { gpgme_data_t output, input; bail(gpgme_data_new_from_mem(&input, (const char*) RAW(data), LENGTH(data), 0), "creating input buffer"); bail(gpgme_data_new(&output), "creating output buffer"); bail(gpgme_op_decrypt(ctx, input, output), "decrypt message"); - return data_to_string(output); + return Rf_asLogical(as_text) ? data_to_string(output) : data_to_raw(output); } SEXP R_gpgme_signed_encrypt(SEXP data, SEXP receiver, SEXP sender) { @@ -51,12 +51,13 @@ SEXP R_gpgme_signed_encrypt(SEXP data, SEXP receiver, SEXP sender) { return data_to_string(output); } -SEXP R_gpgme_signed_decrypt(SEXP data) { +SEXP R_gpgme_signed_decrypt(SEXP data, SEXP as_text) { gpgme_data_t output, input; bail(gpgme_data_new_from_mem(&input, (const char*) RAW(data), LENGTH(data), 0), "creating input buffer"); bail(gpgme_data_new(&output), "creating output buffer"); bail(gpgme_op_decrypt_verify(ctx, input, output), "verify signatures and decrypt message"); - SEXP out = PROTECT(data_to_string(output)); + SEXP out = Rf_asLogical(as_text) ? data_to_string(output) : data_to_raw(output); + PROTECT(out); //check signatures gpgme_verify_result_t result = gpgme_op_verify_result(ctx); @@ -81,3 +82,11 @@ SEXP data_to_string(gpgme_data_t buf){ return out; } +SEXP data_to_raw(gpgme_data_t buf){ + size_t len; + char * sig = gpgme_data_release_and_get_mem(buf, &len); + SEXP out = allocVector(RAWSXP, len); + memcpy(RAW(out), sig, len); + gpgme_free(sig); + return out; +}