tests/testthat/make-reference.R

#!/usr/bin/env Rscript

## See test-reference.R for details and motivation.
zip_dir <- function(path, dest = paste0(basename(path), ".zip")) {
  owd <- setwd(dirname(path))
  on.exit(setwd(owd))
  code <- utils::zip(dest, basename(path), extras = "-q")
  if (code != 0) {
    stop("error running zip")
  }
  normalizePath(dest)
}

version <- packageVersion("cyphr")
path <- file.path("reference", version)
dest <- paste0(path, ".zip")

unlink(path, TRUE)
unlink(dest)

dir.create(path, FALSE, TRUE)
path_openssl <- file.path(path, "openssl")
path_sodium <- file.path(path, "sodium")
path_cypher <- file.path(path, "cypher")
dir.create(path_openssl)
dir.create(path_sodium)
dir.create(path_cypher)

## Generate a lot of keys:
path_openssl_alice <- cyphr::ssh_keygen(file.path(path_openssl, "alice"), FALSE)
path_openssl_bob <- cyphr::ssh_keygen(file.path(path_openssl, "bob"), FALSE)

key_openssl_sym <- openssl::aes_keygen()

key_sodium_sym <- sodium::keygen()

key_sodium_alice <- sodium::keygen()
pub_sodium_alice <- sodium::pubkey(key_sodium_alice)

key_sodium_bob <- sodium::keygen()
pub_sodium_bob <- sodium::pubkey(key_sodium_bob)

saveRDS(key_openssl_sym, file.path(path_openssl, "sym.key"))
writeBin(key_sodium_sym, file.path(path_sodium, "sym.key"))
writeBin(key_sodium_alice, file.path(path_sodium, "alice.key"))
writeBin(pub_sodium_alice, file.path(path_sodium, "alice.pub"))
writeBin(key_sodium_bob, file.path(path_sodium, "bob.key"))
writeBin(pub_sodium_bob, file.path(path_sodium, "bob.pub"))

cleartext <- "test data"

writeBin(
  cyphr::encrypt_string(cleartext, cyphr::key_openssl(key_openssl_sym)),
  file.path(path_cypher, "openssl_sym"))

pair_alice <- cyphr::keypair_openssl(path_openssl_bob, path_openssl_alice)
writeBin(
  cyphr::encrypt_string(cleartext, pair_alice),
  file.path(path_cypher, "openssl_asym_alice"))

writeBin(
  cyphr::encrypt_string(cleartext, cyphr::key_sodium(key_sodium_sym)),
  file.path(path_cypher, "sodium_sym"))

pair_alice <- cyphr::keypair_sodium(pub_sodium_bob, key_sodium_alice)
writeBin(
  cyphr::encrypt_string(cleartext, pair_alice),
  file.path(path_cypher, "sodium_asym_alice"))

writeLines(cleartext, file.path(path, "cleartext"))

path_data <- file.path(path, "data")
dir.create(path_data)
cyphr::data_admin_init(path_data, path_openssl_alice, quiet = TRUE)
filename <- file.path(path_data, "secret.txt")
cyphr::encrypt(writeLines(cleartext, filename),
               cyphr::data_key(path_data, path_openssl_alice))
hash <- cyphr::data_request_access(path_data, path_openssl_bob, quiet = TRUE)
cyphr::data_admin_authorise(path_data, hash, path_openssl_alice,
                            yes = TRUE, quiet = TRUE)

message("Creating archive ", zip_dir(path))
unlink(path, TRUE)
richfitz/cyphr documentation built on Aug. 23, 2023, 8:01 a.m.