guix-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug#42404] [PATCH 3/5] gnu: Add rnp.


From: Justus Winter
Subject: [bug#42404] [PATCH 3/5] gnu: Add rnp.
Date: Thu, 23 Jul 2020 14:03:20 +0200

* gnu/packages/openpgp.scm (rnp): New variable.
* gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch: New file.
* gnu/packages/patches/rnp-fix-cp.patch: New file.
* gnu/packages/patches/rnp-fix-gnupg-list-packets.patch: New file.
* gnu/packages/patches/rnp-fix-test-setup.patch: New file.
* gnu/packages/patches/rnp-fix-test.patch: New file.
* gnu/packages/patches/rnp-fix-true-false.patch: New file.
* gnu/packages/patches/rnp-unbundle-googletest.patch: New file.
* gnu/packages/patches/rnp-update-expiration-16ecb289.patch: New file.
---
 gnu/packages/openpgp.scm                      |  65 ++++-
 .../patches/rnp-disable-ruby-rnp-tests.patch  |  25 ++
 gnu/packages/patches/rnp-fix-cp.patch         |  27 ++
 .../patches/rnp-fix-gnupg-list-packets.patch  |  35 +++
 gnu/packages/patches/rnp-fix-test-setup.patch |  34 +++
 gnu/packages/patches/rnp-fix-test.patch       |  32 +++
 gnu/packages/patches/rnp-fix-true-false.patch | 253 ++++++++++++++++++
 .../patches/rnp-unbundle-googletest.patch     |  45 ++++
 .../rnp-update-expiration-16ecb289.patch      | 208 ++++++++++++++
 9 files changed, 723 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch
 create mode 100644 gnu/packages/patches/rnp-fix-cp.patch
 create mode 100644 gnu/packages/patches/rnp-fix-gnupg-list-packets.patch
 create mode 100644 gnu/packages/patches/rnp-fix-test-setup.patch
 create mode 100644 gnu/packages/patches/rnp-fix-test.patch
 create mode 100644 gnu/packages/patches/rnp-fix-true-false.patch
 create mode 100644 gnu/packages/patches/rnp-unbundle-googletest.patch
 create mode 100644 gnu/packages/patches/rnp-update-expiration-16ecb289.patch

diff --git a/gnu/packages/openpgp.scm b/gnu/packages/openpgp.scm
index 94beab9929..a997f4ed74 100644
--- a/gnu/packages/openpgp.scm
+++ b/gnu/packages/openpgp.scm
@@ -19,11 +19,19 @@
 (define-module (gnu packages openpgp)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages crypto)
   #:use-module (gnu packages gnupg)
-  #:use-module (gnu packages multiprecision))
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages web))
 
 (define-public libtmcg
   (package
@@ -92,3 +100,58 @@ implementation is in experimental state and should NOT be 
used in production
 environments.")
     (home-page "https://www.nongnu.org/dkgpg/";)
     (license license:gpl2+)))
+
+(define-public rnp
+  (package
+    (name "rnp")
+    (version "0.13.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/rnpgp/rnp";)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "04b2a5cwy91i41vgix6ws99bg93fav8qizx92bivc75lxii8gisz"))
+              (patches
+               (search-patches "rnp-unbundle-googletest.patch"
+                               "rnp-disable-ruby-rnp-tests.patch"
+                               "rnp-fix-test-setup.patch"
+                               "rnp-fix-cp.patch"
+                               "rnp-fix-test.patch"
+                               "rnp-fix-gnupg-list-packets.patch"
+                               "rnp-fix-true-false.patch"
+                               "rnp-update-expiration-16ecb289.patch"))))
+    (build-system cmake-build-system)
+    (arguments '(#:configure-flags
+                 '("-DBUILD_SHARED_LIBS=on"
+                   "-DBUILD_TESTING=on")
+                 #:phases
+                 (modify-phases %standard-phases
+                   (add-after 'unpack 'fixes
+                     (lambda* (#:key inputs #:allow-other-keys)
+                       (copy-recursively (assoc-ref inputs "googletest-source")
+                                         "src/tests/googletest-src")
+                       #t)))))
+    (native-inputs
+     `(("gnupg" ,gnupg)
+       ("googletest-source" ,(package-source googletest))
+       ("pkg-config" ,pkg-config)
+       ("python2" ,python-2.7)))
+    (inputs `(("botan" ,botan)
+              ("bzip2" ,bzip2)
+              ("json-c" ,json-c)
+              ("zlib" ,zlib)))
+    (synopsis
+     "RFC4880-compliant OpenPGP library written in C++")
+    (description
+     "Set of OpenPGP (RFC4880) tools that works on Linux, *BSD and macOS as a
+replacement of GnuPG.  It is maintained by Ribose after being forked from
+NetPGP, itself originally written for NetBSD.
+
+librnp is the library used by rnp for all OpenPGP functions, useful for
+developers to build against.  It is a “real” library, not a wrapper like GPGME
+of GnuPG.")
+    (home-page "https://www.rnpgp.com/";)
+    (license (list license:bsd-2 license:asl2.0 license:bsd-3))))
diff --git a/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch 
b/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch
new file mode 100644
index 0000000000..5c8c06524d
--- /dev/null
+++ b/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch
@@ -0,0 +1,25 @@
+From 9f3c07601393e219cc5979f93fda57bf2d07dee7 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 16:10:21 +0200
+Subject: [PATCH 6/6] Disable ruby-rnp tests.
+
+---
+ src/tests/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
+index 2f0a1c3f..1c82edbf 100644
+--- a/src/tests/CMakeLists.txt
++++ b/src/tests/CMakeLists.txt
+@@ -164,7 +164,7 @@ foreach(suite IN LISTS suitelist)
+ endforeach()
+ 
+ # cruby does not currently play nice with ASaN et al.
+-if (NOT ENABLE_SANITIZERS AND BUILD_SHARED_LIBS AND NOT WIN32)
++if (NOT ENABLE_SANITIZERS AND BUILD_SHARED_LIBS AND NOT WIN32 AND IGNORE)
+   include(ExternalProject)
+   set(_sourcedir "${CMAKE_BINARY_DIR}/ruby-rnp")
+   if (DEFINED ENV{RUBY_RNP_INSTALL})
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-fix-cp.patch 
b/gnu/packages/patches/rnp-fix-cp.patch
new file mode 100644
index 0000000000..039912d953
--- /dev/null
+++ b/gnu/packages/patches/rnp-fix-cp.patch
@@ -0,0 +1,27 @@
+From c163e1b12511e9e7df752a01767a2a8ba56c4196 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 15:52:37 +0200
+Subject: [PATCH 1/6] Make copying more robust.
+
+Let the shell locate 'cp'.  This is more robust in environments such
+as Guix or Nix that do not provide /bin/cp.
+---
+ src/tests/support.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tests/support.cpp b/src/tests/support.cpp
+index 3d6a6dc9..d260e166 100644
+--- a/src/tests/support.cpp
++++ b/src/tests/support.cpp
+@@ -283,7 +283,7 @@ copy_recursively(const char *src, const char *dst)
+     // TODO: maybe use fts or something less hacky
+     char buf[2048];
+ #ifndef _WIN32
+-    snprintf(buf, sizeof(buf), "/bin/cp -a '%s' '%s'", src, dst);
++    snprintf(buf, sizeof(buf), "cp -a '%s' '%s'", src, dst);
+ #else
+     snprintf(buf, sizeof(buf), "xcopy \"%s\" \"%s\" /I /Q /E /Y", src, dst);
+ #endif
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-fix-gnupg-list-packets.patch 
b/gnu/packages/patches/rnp-fix-gnupg-list-packets.patch
new file mode 100644
index 0000000000..b23e76da7c
--- /dev/null
+++ b/gnu/packages/patches/rnp-fix-gnupg-list-packets.patch
@@ -0,0 +1,35 @@
+From 4cb5b2c1d3783bfad3c4f77b2ad2ac89921e91f4 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 16:03:32 +0200
+Subject: [PATCH 4/6] Make invoking GnuPG more robust.
+
+GnuPG will try to read its state even for operations that do not
+require it, e.g. listing packets.  If the state directory does not
+exist, GnuPG will try to create it.  If this fails, GnuPG errors out.
+
+In some build environments, $HOME may not exist or may not be
+writable (e.g. in Guix and Nix, $HOME does not exist).  This leads to
+a spurious test failures when GnuPG is invoked to inspect packets.
+
+Fix this by using the current directory as GnuPG state directory.
+---
+ src/tests/cli_tests.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/tests/cli_tests.py b/src/tests/cli_tests.py
+index 74b28983..2b7d772a 100755
+--- a/src/tests/cli_tests.py
++++ b/src/tests/cli_tests.py
+@@ -106,7 +106,8 @@ RNP_TO_GPG_CIPHERS = {'AES' : 'aes128', 'AES192' : 
'aes192', 'AES256' : 'aes256'
+         'IDEA' : 'idea', '3DES' : '3des', 'CAST5' : 'cast5', 'BLOWFISH' : 
'blowfish'}
+ 
+ def check_packets(fname, regexp):
+-    ret, output, err = run_proc(GPG, ['--list-packets', path_for_gpg(fname)])
++    ret, output, err = run_proc(GPG, ['--homedir', '.',
++                                      '--list-packets', path_for_gpg(fname)])
+     if ret != 0:
+         logging.error(err)
+         return None
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-fix-test-setup.patch 
b/gnu/packages/patches/rnp-fix-test-setup.patch
new file mode 100644
index 0000000000..e155194ccc
--- /dev/null
+++ b/gnu/packages/patches/rnp-fix-test-setup.patch
@@ -0,0 +1,34 @@
+From f544b3e63416f3a824ed2955d119ea0d36c88b36 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 16:00:37 +0200
+Subject: [PATCH] Make test environment setup more robust.
+
+Previously, a failing test leaving RNP or GnuPG state directories
+behind would cause all tests following it to fail.  Improve this by
+removing the directories first should they exist.
+---
+ src/tests/cli_tests.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/tests/cli_tests.py b/src/tests/cli_tests.py
+index 2b7d772a..8261486f 100755
+--- a/src/tests/cli_tests.py
++++ b/src/tests/cli_tests.py
+@@ -704,12 +704,14 @@ def setup(loglvl):
+     RNPDIR = path.join(WORKDIR, '.rnp')
+     RNP = os.getenv('RNP_TESTS_RNP_PATH') or 'rnp'
+     RNPK = os.getenv('RNP_TESTS_RNPKEYS_PATH') or 'rnpkeys'
++    shutil.rmtree(RNPDIR, ignore_errors=True)
+     os.mkdir(RNPDIR, 0700)
+ 
+     GPGDIR = path.join(WORKDIR, '.gpg')
+     GPGHOME =  path_for_gpg(GPGDIR) if is_windows() else GPGDIR
+     GPG = os.getenv('RNP_TESTS_GPG_PATH') or find_utility('gpg')
+     GPGCONF = os.getenv('RNP_TESTS_GPGCONF_PATH') or find_utility('gpgconf')
++    shutil.rmtree(GPGDIR, ignore_errors=True)
+     os.mkdir(GPGDIR, 0700)
+ 
+ def data_path(subpath):
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-fix-test.patch 
b/gnu/packages/patches/rnp-fix-test.patch
new file mode 100644
index 0000000000..cb94f14673
--- /dev/null
+++ b/gnu/packages/patches/rnp-fix-test.patch
@@ -0,0 +1,32 @@
+From fede676aec9201cfd18b47ffb60ebb55fa90abac Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 15:54:32 +0200
+Subject: [PATCH 2/6] Make test more robust.
+
+Previously, a single character "0" was written to the RSA signature
+data to invalidate the signature.   However, there is a 1 in 256
+chance of there being a "0" character there, in which case the
+invalidation fails.  Instead, overwrite nine characters, reducing the
+chance of failure to 1 in 2^72.
+---
+ src/tests/key-unlock.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/tests/key-unlock.cpp b/src/tests/key-unlock.cpp
+index 66a44f0d..5610f065 100644
+--- a/src/tests/key-unlock.cpp
++++ b/src/tests/key-unlock.cpp
+@@ -149,8 +149,8 @@ TEST_F(rnp_tests, test_key_unlock_pgp)
+     std::fstream verf("dummyfile.dat.pgp",
+                       std::ios_base::binary | std::ios_base::out | 
std::ios_base::in);
+     off_t        versize = file_size("dummyfile.dat.pgp");
+-    verf.seekg(versize - 3, std::ios::beg);
+-    verf.write("0x0C", 1);
++    verf.seekg(versize - 9, std::ios::beg);
++    verf.write("foobarbaz", 9);
+     verf.close();
+     assert_false(cli_rnp_process_file(&cfg, &rnp));
+     rnp_cfg_free(&cfg);
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-fix-true-false.patch 
b/gnu/packages/patches/rnp-fix-true-false.patch
new file mode 100644
index 0000000000..ee76e51bc6
--- /dev/null
+++ b/gnu/packages/patches/rnp-fix-true-false.patch
@@ -0,0 +1,253 @@
+From 028a2f50fbf47d989bbf79be589945bec55b4825 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 15:57:57 +0200
+Subject: [PATCH 3/6] Use 'true' and 'false' instead of 'TRUE' and 'FALSE'.
+
+The latter are not guaranteed to be defined.
+---
+ src/lib/rnp.cpp   | 10 ++++-----
+ src/tests/ffi.cpp | 56 +++++++++++++++++++++++------------------------
+ 2 files changed, 33 insertions(+), 33 deletions(-)
+
+diff --git a/src/lib/rnp.cpp b/src/lib/rnp.cpp
+index a87511a4..9c0385d1 100644
+--- a/src/lib/rnp.cpp
++++ b/src/lib/rnp.cpp
+@@ -5927,7 +5927,7 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, 
uint32_t flags)
+         return RNP_ERROR_OUT_OF_MEMORY;
+     }
+     // revoked
+-    json_object *jsorevoked = json_object_new_boolean(key->revoked ? TRUE : 
FALSE);
++    json_object *jsorevoked = json_object_new_boolean(key->revoked ? true : 
false);
+     if (!jsorevoked) {
+         return RNP_ERROR_OUT_OF_MEMORY;
+     }
+@@ -5992,7 +5992,7 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, 
uint32_t flags)
+     }
+     json_object_object_add(jso, "public key", jsopublic);
+     json_object_object_add(
+-      jsopublic, "present", json_object_new_boolean(have_pub ? TRUE : FALSE));
++      jsopublic, "present", json_object_new_boolean(have_pub ? true : false));
+     if (flags & RNP_JSON_PUBLIC_MPIS) {
+         json_object *jsompis = json_object_new_object();
+         if (!jsompis) {
+@@ -6011,7 +6011,7 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, 
uint32_t flags)
+     }
+     json_object_object_add(jso, "secret key", jsosecret);
+     json_object_object_add(
+-      jsosecret, "present", json_object_new_boolean(have_sec ? TRUE : FALSE));
++      jsosecret, "present", json_object_new_boolean(have_sec ? true : false));
+     if (have_sec) {
+         bool locked = pgp_key_is_locked(handle->sec);
+         if (flags & RNP_JSON_SECRET_MPIS) {
+@@ -6029,13 +6029,13 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, 
uint32_t flags)
+                 }
+             }
+         }
+-        json_object *jsolocked = json_object_new_boolean(locked ? TRUE : 
FALSE);
++        json_object *jsolocked = json_object_new_boolean(locked ? true : 
false);
+         if (!jsolocked) {
+             return RNP_ERROR_OUT_OF_MEMORY;
+         }
+         json_object_object_add(jsosecret, "locked", jsolocked);
+         json_object *jsoprotected =
+-          json_object_new_boolean(pgp_key_is_protected(handle->sec) ? TRUE : 
FALSE);
++          json_object_new_boolean(pgp_key_is_protected(handle->sec) ? true : 
false);
+         if (!jsoprotected) {
+             return RNP_ERROR_OUT_OF_MEMORY;
+         }
+diff --git a/src/tests/ffi.cpp b/src/tests/ffi.cpp
+index 4224bb7d..28a4f867 100644
+--- a/src/tests/ffi.cpp
++++ b/src/tests/ffi.cpp
+@@ -800,10 +800,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_pair)
+     rnp_key_handle_t primary = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -814,10 +814,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_pair)
+     rnp_key_handle_t sub = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -878,10 +878,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_pair_dsa_elg)
+     rnp_key_handle_t primary = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -892,10 +892,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_pair_dsa_elg)
+     rnp_key_handle_t sub = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -958,10 +958,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_primary)
+     rnp_key_handle_t primary = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -1021,10 +1021,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_sub)
+     char *           primary_grip = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         primary_grip = strdup(json_object_get_string(jsogrip));
+         assert_non_null(primary_grip);
+@@ -1079,10 +1079,10 @@ TEST_F(rnp_tests, test_ffi_keygen_json_sub)
+     rnp_key_handle_t sub = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -2483,10 +2483,10 @@ TEST_F(rnp_tests, 
test_ffi_keygen_json_sub_pass_required)
+     char *           primary_grip = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"primary", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         primary_grip = strdup(json_object_get_string(jsogrip));
+         assert_non_null(primary_grip);
+@@ -2557,10 +2557,10 @@ TEST_F(rnp_tests, 
test_ffi_keygen_json_sub_pass_required)
+     rnp_key_handle_t sub = NULL;
+     {
+         json_object *jsokey = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
++        assert_int_equal(true, json_object_object_get_ex(parsed_results, 
"sub", &jsokey));
+         assert_non_null(jsokey);
+         json_object *jsogrip = NULL;
+-        assert_int_equal(TRUE, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
++        assert_int_equal(true, json_object_object_get_ex(jsokey, "grip", 
&jsogrip));
+         assert_non_null(jsogrip);
+         const char *grip = json_object_get_string(jsogrip);
+         assert_non_null(grip);
+@@ -3821,7 +3821,7 @@ TEST_F(rnp_tests, test_ffi_key_to_json)
+     assert_int_equal(rnp_strcasecmp(json_object_get_string(get_json_obj(jso, 
"grip")),
+                                     
"20A48B3C61525DCDF8B3B9D82C6BBCF4D8BFB5E5"),
+                      0);
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "revoked")), 
FALSE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "revoked")), 
false);
+     assert_int_equal(json_object_get_int64(get_json_obj(jso, "creation 
time")), 1511313500);
+     assert_int_equal(json_object_get_int64(get_json_obj(jso, "expiration")), 
0);
+     // usage
+@@ -3843,7 +3843,7 @@ TEST_F(rnp_tests, test_ffi_key_to_json)
+                                     
"FFFA72FC225214DC712D0127172EE13E88AF93B4"),
+                      0);
+     // public key
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "public 
key.present")), TRUE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "public 
key.present")), true);
+     assert_int_equal(
+       rnp_strcasecmp(json_object_get_string(get_json_obj(jso, "public 
key.mpis.point")),
+                      
"04B0C6F2F585C1EEDF805C4492CB683839D5EAE6246420780F063D558"
+@@ -3851,14 +3851,14 @@ TEST_F(rnp_tests, test_ffi_key_to_json)
+                      "793CEBAE8600BEEF"),
+       0);
+     // secret key
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.present")), TRUE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.present")), true);
+     assert_int_equal(
+       rnp_strcasecmp(json_object_get_string(get_json_obj(jso, "secret 
key.mpis.x")),
+                      
"46DE93CA439735F36B9CF228F10D8586DA824D88BBF4E24566D5312D061802C8"),
+       0);
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.locked")), FALSE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.locked")), false);
+     assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.protected")),
+-                     FALSE);
++                     false);
+     // userids
+     assert_int_equal(json_object_array_length(get_json_obj(jso, "userids")), 
1);
+     
assert_int_equal(rnp_strcasecmp(json_object_get_string(json_object_array_get_idx(
+@@ -3907,7 +3907,7 @@ TEST_F(rnp_tests, test_ffi_key_to_json)
+     assert_int_equal(rnp_strcasecmp(json_object_get_string(get_json_obj(jso, 
"grip")),
+                                     
"FFFA72FC225214DC712D0127172EE13E88AF93B4"),
+                      0);
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "revoked")), 
FALSE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "revoked")), 
false);
+     assert_int_equal(json_object_get_int64(get_json_obj(jso, "creation 
time")), 1511313500);
+     assert_int_equal(json_object_get_int64(get_json_obj(jso, "expiration")), 
0);
+     // usage
+@@ -3924,21 +3924,21 @@ TEST_F(rnp_tests, test_ffi_key_to_json)
+     // subkey grips
+     assert_null(get_json_obj(jso, "subkey grips"));
+     // public key
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "public 
key.present")), TRUE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "public 
key.present")), true);
+     assert_int_equal(
+       rnp_strcasecmp(json_object_get_string(get_json_obj(jso, "public 
key.mpis.point")),
+                      
"04E2746BA4D180011B17A6909EABDBF2F3733674FBE00B20A3B857C2597233651544150B"
+                      
"896BCE7DCDF47C49FC1E12D5AD86384D26336A48A18845940A3F65F502"),
+       0);
+     // secret key
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.present")), TRUE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.present")), true);
+     assert_int_equal(
+       rnp_strcasecmp(json_object_get_string(get_json_obj(jso, "secret 
key.mpis.x")),
+                      
"DF8BEB7272117AD7AFE2B7E882453113059787FBC785C82F78624EE7EF2117FB"),
+       0);
+-    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.locked")), FALSE);
++    assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.locked")), false);
+     assert_int_equal(json_object_get_boolean(get_json_obj(jso, "secret 
key.protected")),
+-                     FALSE);
++                     false);
+     // userids
+     assert_null(get_json_obj(jso, "userids"));
+     // signatures
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-unbundle-googletest.patch 
b/gnu/packages/patches/rnp-unbundle-googletest.patch
new file mode 100644
index 0000000000..d573895ecf
--- /dev/null
+++ b/gnu/packages/patches/rnp-unbundle-googletest.patch
@@ -0,0 +1,45 @@
+From 3d435bbc8c73c78260f510a8d7fd02f81e22f125 Mon Sep 17 00:00:00 2001
+From: Justus Winter <teythoon@avior.uberspace.de>
+Date: Tue, 21 Jul 2020 16:10:12 +0200
+Subject: [PATCH 5/6] Unbundle googletest.
+
+---
+ src/tests/CMakeLists.txt          | 2 +-
+ src/tests/gtest-CMakeLists.txt.in | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
+index 1a7ab905..2f0a1c3f 100644
+--- a/src/tests/CMakeLists.txt
++++ b/src/tests/CMakeLists.txt
+@@ -50,7 +50,7 @@ endif()
+ # maintain compiler/linker settings on Windows
+ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+ # add to our build (provides gtest_main target)
+-add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
++add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/googletest-src
+                  ${CMAKE_CURRENT_BINARY_DIR}/googletest-build
+                  EXCLUDE_FROM_ALL)
+ 
+diff --git a/src/tests/gtest-CMakeLists.txt.in 
b/src/tests/gtest-CMakeLists.txt.in
+index b8878ea5..16cd49ad 100644
+--- a/src/tests/gtest-CMakeLists.txt.in
++++ b/src/tests/gtest-CMakeLists.txt.in
+@@ -4,10 +4,10 @@ project(googletest-download NONE)
+ 
+ include(ExternalProject)
+ ExternalProject_Add(googletest
+-  GIT_REPOSITORY    https://github.com/google/googletest.git
+-  GIT_TAG           master
+-  GIT_SHALLOW       yes
+-  SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
++#  GIT_REPOSITORY    https://github.com/google/googletest.git
++#  GIT_TAG           master
++#  GIT_SHALLOW       yes
++  SOURCE_DIR        "${CMAKE_CURRENT_SOURCE_DIR}/googletest-src"
+   BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
+   CONFIGURE_COMMAND ""
+   BUILD_COMMAND     ""
+-- 
+2.20.1
+
diff --git a/gnu/packages/patches/rnp-update-expiration-16ecb289.patch 
b/gnu/packages/patches/rnp-update-expiration-16ecb289.patch
new file mode 100644
index 0000000000..f552c5a9ea
--- /dev/null
+++ b/gnu/packages/patches/rnp-update-expiration-16ecb289.patch
@@ -0,0 +1,208 @@
+commit 16ecb28974b18e51f9060c86c7229f3b7e1cbb88
+Author: Nickolay Olshevsky <o.nickolay@gmail.com>
+Date:   Fri Apr 10 16:29:52 2020 +0300
+
+    Update expiration date of test keys.
+
+diff --git a/src/tests/data/test_stream_signatures/pub.asc 
b/src/tests/data/test_stream_signatures/pub.asc
+index 10f0509f..9da95e7a 100644
+--- a/src/tests/data/test_stream_signatures/pub.asc
++++ b/src/tests/data/test_stream_signatures/pub.asc
+@@ -9,16 +9,16 @@ 
Wf4zSDhsEabUFJn2HoBdSoObcDX3DbBLP4GV7KzBDqJ0ZYfyL92Q58wOs5Q8ZDVP
+ v41PvEijwVrgNDq02LYxcHgNDAJ++eGOxQdySb3Blo56AorS3xsVtIXFFlzMFB0j
+ X0lUIeGEj5iKs4xpbRr/EE+m0B70fg2Yn/XpslUnOgboaNp/mZ5T4Zpe1kz/jDV4
+ aNZ3p3l2DxxF8AUAEQEAAbQWdGVzdF9zdHJlYW1fc2lnbmF0dXJlc4kB1AQTAQgA
+-PhYhBHpg5nEXn5uSD2R4olhzvXOOV1OYBQJau41QAhsDBQkDwmcABQsJCAcCBhUK
+-CQgLAgQWAgMBAh4BAheAAAoJEFhzvXOOV1OYt5wL/iwz9BqzPpsGzTMtuCxGlUt5
+-A1p0aOwK6hD8oDlW5Tq9fuJwKrf0bSen5MPRTs7tkRQ5loriRiqwrgqggxbf2wJx
+-bFM3p3OF/CO1NMRBeCQCr37hKmtyPv3rmSHRhdeW6IdA5RS5I+UqgUZ18UF9f5va
+-zM49pflxeDLq16388gcep8pnppw8J0XBFzxW4KWEGLxto1LElq5SJzdTTwQiN2cZ
+-XmDChFyyQhesxY3qosV2jtIJktLT9Pl1qmxr/wwJf38J5DKmvJeisAl55SahN9l1
+-owe2ACHQuE9L0HpjxYYxvmFeing0eydDyU10RVgavdI6+ztfVas5f38zy6r3uxX+
+-mSbV/w4LELvT0jmTAxpVM1O9N7pB71xKypTfsMNEOxi1fWx+/bpB6GVy319JF4aE
+-JfJYO8rAMWn3UpvY8FaxuCnsDudmpwEvzgOHhr+EOyWlWMbpfC+vtFXncPjEPn7R
+-lRVy5CkSL+WidtcRmI82iG8hfG3PcpFryea8zMTKCLkBjQRau41QAQwAwB/4Oa2w
++PgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBHpg5nEXn5uSD2R4olhzvXOO
++V1OYBQJekHJ9BQkWoOgtAAoJEFhzvXOOV1OYdCUMALQ5AsHoE+RU66Qs1qWxQK9k
++R7wd0j3yLs/l9eUElpXFz0W/ZRWR2bZ9aO8fuCEQTXPgNtdGBG06fCB/MrpTCwoE
++ScUTlz0jGqC8CqbjfV6a92abk+9fXJkYcWyCjFJ0nWzQSSLOlNJ5xesqBB+yBNx7
++xyWuggnTcg5F1IbiVN4R3yhKboUZu2nvXIBJVl/JYT5f0jQUAeYLsalmF6Ug6mW3
++yVR2wvIlvA5BGlr3qJrIZH22QRPNOfwKZorhPvzD1yj/CXlV4zDDl2TjlcuAkcsT
++mqEq+gg/PkLsCpEd1rHIwbplCJiWAxTZLchw49VkGvWAFsiXKCfaWkHZaJpTbTfP
++vXppxeJ6VCt/+jU7x8KvRXyqWt45OqIbgs+mi9X4VXqLGXORh4auN6vT/V3uLTOU
++1rftvc6mEvcYoKVGNutKcQwfl+MJwfMcjAtDAsov8V6CNDJYGMBZVI6wjh6gt34O
++LjlhHM/znBU+FTtPyjSAOvD2SR3oQyVr5gSKVtlPBrkBjQRau41QAQwAwB/4Oa2w
+ 4qupz0+KCmmutEezSKZkf7xZ7UFO87X4hYdoyOUfmtnz4jjA6V5KpZ8DMfrEB9bm
+ vfHaQBrCdASxspfXDAXfZCV8UqyP+RBItfqdT/tlPxd1uWVqO8pwd0UvXgDICiXy
+ mCmUOsJ8sajI0X7yN+PjDGoGrUbT8sXpOdGD0aG5ARnaNr9zKa/7RiEaLt8SGdAt
+@@ -27,15 +27,15 @@ 
NYMeTk33YoRDlhWWepLYkKZ4Tkrq9A3E/5WjJcFP5NuG8pSM7i+T9glRsZCUH0gI
+ BhbzTwehQZ3ZM6Rj0aCiFrxBCfzrhjM9PXiJhXwJmV2vCVW2GQZndkF2JwAcAAsF
+ 5mzQD/ylkVLvTg4evNfiFTVQog8nLV0ZyKmodTSUWJCBVgzFP1IuHMbObeAWQF8x
+ jO69SGt4iOGQw68JljCPBJ8u6N7GMY81mTY/36tWd5pIxOLnAbpodl1DABEBAAGJ
+-AbwEGAEIACYWIQR6YOZxF5+bkg9keKJYc71zjldTmAUCWruNUAIbDAUJA8JnAAAK
+-CRBYc71zjldTmBliDACYyguYp9V80mApoM9cdswJCSJu5TpAv+fP+hcekLE0I7wq
+-qs7+zd0vasrReemgMMA9gx2IbSUZxWPUSoZloJsxcoBfEjlfoNNRXn2X9Hq7NUhu
+-19gMdwUxtnyd4dOIleYqk93QkydTeqciI+xZ0s2lmiOps0FDgKLWAbNdC/kWOp5x
+-GHx+Dy9D+cM+4YxjfBnxplG3qreY5Vmu2tlYTXG41LjJHpXL0LOQXdVf6ZdcVdQ5
+-CCynd583xL9fjxGtAoNYV5LK/1qAZuqFVSk/R9eEy2664W/Fj4I5LlH/UQIfcTdl
+-ItY+/5mFa0CK7/7uucy7zfIwILx3M9nAvzbFaTdDP7ZBOO6xkeQE22WOMYrcGGkr
+-lPueHq/gbu/4fl1XHyl4oHJZdqTaI9a9vwO/342ct+y9agtpkooSpljDavVSPiO+
+-wWd45g52HsY/bF/A7qv1e7ucH11elQgUXW6Q8kGvTy/FYMWjk5tV+mokI/k6rupt
+-SEvTyvqqYIWvhPXmkI0=
+-=C3aD
++AbwEGAEIACYCGwwWIQR6YOZxF5+bkg9keKJYc71zjldTmAUCXpBymQUJFqDoSQAK
++CRBYc71zjldTmOHODACQHml5YT4hsNN4OLP6xNdEKCCjLfY7V1EKYZZU671vYTQn
++qIRTGhNB18FATHJwONMjMegsu/8K67V3acnW7cszUbZDC1OMC7Mo0qFHvysfbxbq
++4Pb10QYtqvmla8nerbKGKqxm32CRYZf2qZ4pXG/7MvE5aAQPXR+cBgByU9EHOB5K
++t9NwYm7MEZyOSNvcRaJIN1aeS8cur5veRoLLEWYhBF/FrOusCLvkupQ/rqnsqr/D
++IHaxjHFpSwxAHan8VxkeHsxZNTYb9eejmXTBUrqePARGyuHiqCK7w0fv/RW+mXbn
++UDJl+NIg2F0oMcsoqj2F74IWkcn7X7FMP2XQv99PuAgVd9q1XhxDXSBUyXCT+E41
++hmR4rtdQRg8JiJ4RZKE8arDjRVXZdaiNMW9J5vjWrlyvqLiVyNmyyHw63LXNO0cN
++Qv4qz+S5gir8JAHYzZFnjvisll1Ur9JSQWyg97OB6dsIN7Im6sJOcjpkpHgA5v+9
++hMHj3/yuwMXx6aMHF1A=
++=zbzp
+ -----END PGP PUBLIC KEY BLOCK-----
+diff --git a/src/tests/data/test_stream_signatures/sec.asc 
b/src/tests/data/test_stream_signatures/sec.asc
+index f2e170d2..3b8acf1a 100644
+--- a/src/tests/data/test_stream_signatures/sec.asc
++++ b/src/tests/data/test_stream_signatures/sec.asc
+@@ -8,38 +8,38 @@ 
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
+@@ -48,36 +48,36 @@ 
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
+-=vuN6
++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
++=Nabv
+ -----END PGP PRIVATE KEY BLOCK-----
-- 
2.20.1






reply via email to

[Prev in Thread] Current Thread [Next in Thread]