gnu: python-freezegun: Update to 0.3.10.
[jackhill/guix/guix.git] / gnu / packages / gnupg.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
464f5447 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
a92d9726 3;;; Copyright © 2013, 2015, 2018 Andreas Enge <andreas@enge.fr>
4380a7b4 4;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
3a7261bf 5;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
5dabdb75 6;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
607d280e 7;;; Copyright © 2015, 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
5aeb6611 8;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
a05d1d82 9;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
4a78fd46 10;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
41edb23f 11;;; Copyright © 2016 Christopher Baines <mail@cbaines.net>
cd9ed6c1 12;;; Copyright © 2016 Mike Gerwitz <mtg@gnu.org>
0f391063 13;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com>
e3dd1f0c 14;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
5aeb6611 15;;; Copyright © 2017 Petter <petter@mykolab.ch>
f7147e27 16;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
df9f6289 17;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
8d1939e4 18;;;
233e7676 19;;; This file is part of GNU Guix.
8d1939e4 20;;;
233e7676 21;;; GNU Guix is free software; you can redistribute it and/or modify it
8d1939e4
LC
22;;; under the terms of the GNU General Public License as published by
23;;; the Free Software Foundation; either version 3 of the License, or (at
24;;; your option) any later version.
25;;;
233e7676 26;;; GNU Guix is distributed in the hope that it will be useful, but
8d1939e4
LC
27;;; WITHOUT ANY WARRANTY; without even the implied warranty of
28;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29;;; GNU General Public License for more details.
30;;;
31;;; You should have received a copy of the GNU General Public License
233e7676 32;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
8d1939e4 33
1ffa7090 34(define-module (gnu packages gnupg)
07157e8a 35 #:use-module ((guix licenses) #:prefix license:)
a05d1d82 36 #:use-module (gnu packages)
7b40296f 37 #:use-module (gnu packages adns)
c9ce8e17 38 #:use-module (gnu packages autotools)
34ef5755 39 #:use-module (gnu packages base)
01e11826 40 #:use-module (gnu packages curl)
c9ce8e17 41 #:use-module (gnu packages crypto)
abc4a332 42 #:use-module (gnu packages emacs)
01e11826 43 #:use-module (gnu packages openldap)
ea4d96c6 44 #:use-module (gnu packages perl)
5ccde207 45 #:use-module (gnu packages perl-check)
1ffa7090 46 #:use-module (gnu packages pth)
ea4d96c6 47 #:use-module (gnu packages python)
54df7558 48 #:use-module (gnu packages qt)
1ffa7090 49 #:use-module (gnu packages readline)
07157e8a 50 #:use-module (gnu packages compression)
2d12284d 51 #:use-module (gnu packages databases)
40d806af
LC
52 #:use-module (gnu packages gtk)
53 #:use-module (gnu packages glib)
d1d75c6a 54 #:use-module (gnu packages gnome)
40d806af
LC
55 #:use-module (gnu packages pkg-config)
56 #:use-module (gnu packages ncurses)
cd9ed6c1 57 #:use-module (gnu packages security-token)
e3dd1f0c 58 #:use-module (gnu packages swig)
a7fd7b68 59 #:use-module (gnu packages tls)
15b08442
P
60 #:use-module (gnu packages tor)
61 #:use-module (gnu packages web)
62 #:use-module (gnu packages xml)
8d1939e4 63 #:use-module (guix packages)
87f5d366 64 #:use-module (guix download)
0f391063 65 #:use-module (guix git-download)
14e2e44d 66 #:use-module (guix build-system gnu)
34ef5755 67 #:use-module (guix build-system perl)
14e2e44d 68 #:use-module (guix build-system python))
8d1939e4
LC
69
70(define-public libgpg-error
71 (package
72 (name "libgpg-error")
1abc295b 73 (version "1.28")
8d1939e4
LC
74 (source
75 (origin
87f5d366 76 (method url-fetch)
0db342a5 77 (uri (string-append "mirror://gnupg/libgpg-error/libgpg-error-"
8d1939e4
LC
78 version ".tar.bz2"))
79 (sha256
80 (base32
1bf7ef85
EF
81 "0jfsfnh9bxlxiwxws60yah4ybjw2hshmvqp31pri4m4h8ivrbnry"))
82 (patches (search-patches "libgpg-error-aarch64-logging-fix.patch"))))
8d1939e4 83 (build-system gnu-build-system)
72fb1b24 84 (home-page "https://gnupg.org")
35b9e423 85 (synopsis "Library of error values for GnuPG components")
8d1939e4
LC
86 (description
87 "Libgpg-error is a small library that defines common error values
88for all GnuPG components. Among these are GPG, GPGSM, GPGME,
89GPG-Agent, libgcrypt, Libksba, DirMngr, Pinentry, SmartCard
90Daemon and possibly more in the future.")
63e8bb12
LC
91 (license license:lgpl2.0+)
92 (properties '((ftp-server . "ftp.gnupg.org")
93 (ftp-directory . "/gcrypt/libgpg-error")))))
8d1939e4 94
df9f6289
MB
95;; Some packages (e.g. GPGME) require a newer libgpg-error to deal with
96;; error codes from recent GnuPG. Remove this in the next rebuild cycle.
97(define-public libgpg-error-1.31
98 (package
99 (inherit libgpg-error)
100 (version "1.31")
101 (source (origin
102 (method url-fetch)
103 (uri (string-append "mirror://gnupg/libgpg-error/libgpg-error-"
104 version ".tar.bz2"))
105 (sha256
106 (base32
107 "1vx4nw6rxh2biy3h8n96fyr86q29h8gjl6837437i51jr4isil20"))))))
108
8d1939e4
LC
109(define-public libgcrypt
110 (package
03439df6 111 (replacement libgcrypt/fixed)
8d1939e4 112 (name "libgcrypt")
36d37ca9 113 (version "1.8.2")
84a3e3b7
LC
114 (source (origin
115 (method url-fetch)
116 (uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
117 version ".tar.bz2"))
118 (sha256
119 (base32
36d37ca9 120 "01sca9m8hm6b5v8hmqsfdjhyz013869p1f0fxw9ln52qfnp4q1n8"))))
8d1939e4
LC
121 (build-system gnu-build-system)
122 (propagated-inputs
e0932742 123 `(("libgpg-error-host" ,libgpg-error)))
e766f699
JD
124 (native-inputs
125 ;; Needed here for the 'gpg-error' program.
e0932742 126 `(("libgpg-error-native" ,libgpg-error)))
e766f699
JD
127 (arguments
128 ;; The '--with-gpg-error-prefix' argument is needed because otherwise
129 ;; 'configure' uses 'gpg-error-config' to determine the '-L' flag, and
130 ;; the 'gpg-error-config' it runs is the native one---i.e., the wrong one.
131 `(#:configure-flags
132 (list (string-append "--with-gpg-error-prefix="
e0932742 133 (assoc-ref %build-inputs "libgpg-error-host")))))
40fed2d8 134 (outputs '("out" "debug"))
72fb1b24 135 (home-page "https://gnupg.org/")
f50d2669 136 (synopsis "Cryptographic function library")
8d1939e4 137 (description
a22dc0c4
LC
138 "Libgcrypt is a general-purpose cryptographic library. It provides the
139standard cryptographic building blocks such as symmetric ciphers, hash
140algorithms, public key algorithms, large integer functions and random number
141generation.")
63e8bb12
LC
142 (license license:lgpl2.0+)
143 (properties '((ftp-server . "ftp.gnupg.org")
144 (ftp-directory . "/gcrypt/libgcrypt")))))
8d1939e4 145
03439df6
EF
146(define libgcrypt/fixed
147 (package
148 (inherit libgcrypt)
149 (name "libgcrypt")
150 (version "1.8.3")
151 (source (origin
152 (method url-fetch)
153 (uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
154 version ".tar.bz2"))
155 (sha256
156 (base32
157 "0z5gs1khzyknyfjr19k8gk4q148s6q987ya85cpn0iv70fz91v36"))))))
158
8d1939e4
LC
159(define-public libassuan
160 (package
161 (name "libassuan")
5965b083 162 (version "2.5.1")
8d1939e4
LC
163 (source
164 (origin
87f5d366 165 (method url-fetch)
0db342a5 166 (uri (string-append "mirror://gnupg/libassuan/libassuan-"
8d1939e4
LC
167 version ".tar.bz2"))
168 (sha256
169 (base32
5965b083 170 "0jb4nb4nrjr949gd3lw8lh4v5d6qigxaq6xwy24w5apjnhvnrya7"))))
8d1939e4
LC
171 (build-system gnu-build-system)
172 (propagated-inputs
5965b083
LF
173 `(("libgpg-error" ,libgpg-error)
174 ("pth" ,pth)))
72fb1b24 175 (home-page "https://gnupg.org")
8d1939e4 176 (synopsis
35b9e423 177 "IPC library used by GnuPG and related software")
8d1939e4
LC
178 (description
179 "Libassuan is a small library implementing the so-called Assuan
180protocol. This protocol is used for IPC between most newer
181GnuPG components. Both, server and client side functions are
182provided.")
63e8bb12
LC
183 (license license:lgpl2.0+)
184 (properties '((ftp-server . "ftp.gnupg.org")
185 (ftp-directory . "/gcrypt/libassuan")))))
8d1939e4
LC
186
187(define-public libksba
188 (package
189 (name "libksba")
c95f7160 190 (version "1.3.5")
8d1939e4
LC
191 (source
192 (origin
87f5d366 193 (method url-fetch)
8d1939e4 194 (uri (string-append
0db342a5 195 "mirror://gnupg/libksba/libksba-"
8d1939e4
LC
196 version ".tar.bz2"))
197 (sha256
198 (base32
c95f7160 199 "0h53q4sns1jz1pkmhcz5wp9qrfn9f5g9i3vjv6dafwzzlvblyi21"))))
8d1939e4
LC
200 (build-system gnu-build-system)
201 (propagated-inputs
202 `(("libgpg-error" ,libgpg-error)))
e766f699
JD
203 (native-inputs
204 `(("libgpg-error" ,libgpg-error)))
205 (arguments
206 `(#:configure-flags
207 (list ,@(if (%current-target-system)
208 '("CC_FOR_BUILD=gcc")
209 '())
210 (string-append "--with-gpg-error-prefix="
211 (assoc-ref %build-inputs "libgpg-error")))))
72fb1b24 212 (home-page "https://www.gnupg.org")
35b9e423 213 (synopsis "CMS and X.509 access library")
8d1939e4
LC
214 (description
215 "KSBA (pronounced Kasbah) is a library to make X.509 certificates
216as well as the CMS easily accessible by other applications. Both
217specifications are building blocks of S/MIME and TLS.")
63e8bb12
LC
218 (license license:gpl3+)
219 (properties '((ftp-server . "ftp.gnupg.org")
220 (ftp-directory . "/gcrypt/libksba")))))
8d1939e4 221
c18ea90f
AE
222(define-public npth
223 (package
224 (name "npth")
f48a9d4a 225 (version "1.5")
c18ea90f
AE
226 (source
227 (origin
228 (method url-fetch)
89c83e8c 229 (uri (string-append "mirror://gnupg/npth/npth-" version ".tar.bz2"))
c18ea90f
AE
230 (sha256
231 (base32
f48a9d4a 232 "1hmkkp6vzyrh8v01c2ynzf9vwikyagp7p1lxhbnr4ysk3w66jji9"))))
c18ea90f 233 (build-system gnu-build-system)
72fb1b24 234 (home-page "https://www.gnupg.org")
c18ea90f
AE
235 (synopsis "Non-preemptive thread library")
236 (description
237 "Npth is a library to provide the GNU Pth API and thus a non-preemptive
238threads implementation.
239
240In contrast to GNU Pth is is based on the system's standard threads
241implementation. This allows the use of libraries which are not
242compatible to GNU Pth.")
07157e8a 243 (license (list license:lgpl3+ license:gpl2+)))) ; dual license
c18ea90f 244
8d1939e4
LC
245(define-public gnupg
246 (package
247 (name "gnupg")
216c7266 248 (version "2.2.8")
58970d6a
LC
249 (source (origin
250 (method url-fetch)
251 (uri (string-append "mirror://gnupg/gnupg/gnupg-" version
252 ".tar.bz2"))
253 (sha256
254 (base32
216c7266 255 "1k8dnnfs9888yp713l7kg2jg110lw47s4krx0njna6fjrsw4qyvp"))))
8d1939e4 256 (build-system gnu-build-system)
08fa45b1
MW
257 (native-inputs
258 `(("pkg-config" ,pkg-config)))
8d1939e4 259 (inputs
f02d254a 260 `(("gnutls" ,gnutls)
8d1939e4
LC
261 ("libassuan" ,libassuan)
262 ("libgcrypt" ,libgcrypt)
01e11826 263 ("libgpg-error" ,libgpg-error)
8d1939e4 264 ("libksba" ,libksba)
cd064df7 265 ("npth" ,npth)
01e11826 266 ("openldap" ,openldap)
cd9ed6c1 267 ("pcsc-lite" ,pcsc-lite)
2d12284d
EF
268 ("readline" ,readline)
269 ("sqlite" ,sqlite)
270 ("zlib" ,zlib)))
30e9cbb4 271 (arguments
10756b9e 272 `(#:configure-flags '(;; Otherwise, the test suite looks for the `gpg`
f11275c9
LF
273 ;; executable in its installation directory in
274 ;; /gnu/store before it has been installed.
e184de57
EF
275 "--enable-gnupg-builddir-envvar"
276 "--enable-all-tests")
163708a6 277 #:phases
45477c6a 278 (modify-phases %standard-phases
cd9ed6c1
MG
279 (add-before 'configure 'patch-paths
280 (lambda* (#:key inputs #:allow-other-keys)
cd9ed6c1
MG
281 (substitute* "scd/scdaemon.c"
282 (("\"(libpcsclite\\.so[^\"]*)\"" _ name)
283 (string-append "\"" (assoc-ref inputs "pcsc-lite")
284 "/lib/" name "\"")))
7deb5ee8
LF
285 #t))
286 (add-after 'build 'patch-scheme-tests
287 (lambda _
288 (substitute* (find-files "tests" ".\\.scm$")
289 (("/usr/bin/env gpgscm")
764c5662
LF
290 (string-append (getcwd) "/tests/gpgscm/gpgscm")))
291 #t))
f11275c9 292 (add-before 'build 'patch-test-paths
92cc6a58
EF
293 (lambda _
294 (substitute* '("tests/inittests"
295 "tests/pkits/inittests"
296 "tests/Makefile"
297 "tests/pkits/common.sh"
298 "tests/pkits/Makefile")
299 (("/bin/pwd") (which "pwd")))
300 (substitute* "common/t-exectool.c"
301 (("/bin/cat") (which "cat"))
302 (("/bin/true") (which "true"))
303 (("/bin/false") (which "false")))
304 #t)))))
72fb1b24 305 (home-page "https://gnupg.org/")
f50d2669 306 (synopsis "GNU Privacy Guard")
8d1939e4 307 (description
a22dc0c4
LC
308 "The GNU Privacy Guard is a complete implementation of the OpenPGP
309standard. It is used to encrypt and sign data and communication. It
310features powerful key management and the ability to access public key
79c311b8 311servers. It includes several libraries: libassuan (IPC between GnuPG
58970d6a
LC
312components), libgpg-error (centralized GnuPG error values), and
313libskba (working with X.509 certificates and CMS data).")
63e8bb12
LC
314 (license license:gpl3+)
315 (properties '((ftp-server . "ftp.gnupg.org")
316 (ftp-directory . "/gcrypt/gnupg")))))
ea4d96c6 317
cd064df7
AE
318(define-public gnupg-2.0
319 (package (inherit gnupg)
b5afe6f0 320 (version "2.0.30")
cd064df7
AE
321 (source (origin
322 (method url-fetch)
323 (uri (string-append "mirror://gnupg/gnupg/gnupg-" version
324 ".tar.bz2"))
325 (sha256
326 (base32
b5afe6f0 327 "0wax4cy14hh0h7kg9hj0hjn9424b71z8lrrc5kbsasrn9xd7hag3"))))
08fa45b1 328 (native-inputs '())
cd064df7 329 (inputs
7b40296f
EF
330 `(("adns" ,adns)
331 ("bzip2" ,bzip2)
cd064df7
AE
332 ("curl" ,curl)
333 ("libassuan" ,libassuan)
334 ("libgcrypt" ,libgcrypt)
335 ("libgpg-error" ,libgpg-error)
336 ("libksba" ,libksba)
337 ("pth" ,pth)
338 ("openldap" ,openldap)
07157e8a 339 ("zlib" ,zlib)
cd064df7
AE
340 ("readline" ,readline)))
341 (arguments
342 `(#:phases
80c47cf8 343 (modify-phases %standard-phases
6b547d22
LC
344 (add-before 'configure 'patch-config-files
345 (lambda _
346 (substitute* "tests/openpgp/Makefile.in"
3a534f42 347 (("/bin/sh") (which "sh")))
bc85b127
LC
348 #t))
349 (add-after 'install 'rename-v2-commands
350 (lambda* (#:key outputs #:allow-other-keys)
351 ;; Upstream suggests removing the trailing '2' from command names:
352 ;; <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=22883#58>.
353 (let ((out (assoc-ref outputs "out")))
354 (with-directory-excursion (string-append out "/bin")
355 (rename-file "gpgv2" "gpgv")
356 (rename-file "gpg2" "gpg")
357
358 ;; Keep the old name around to ease transition.
359 (symlink "gpgv" "gpgv2")
360 (symlink "gpg" "gpg2")
806e891e
LF
361 #t)))))))
362 (properties `((superseded . ,gnupg)))))
cd064df7 363
5249045c
MW
364(define-public gnupg-1
365 (package (inherit gnupg)
81ca29a6 366 (version "1.4.22")
58970d6a
LC
367 (source (origin
368 (method url-fetch)
369 (uri (string-append "mirror://gnupg/gnupg/gnupg-" version
370 ".tar.bz2"))
65956ad3 371 (patches (search-patches "gnupg-1.4-CVE-2018-12020.patch"))
58970d6a
LC
372 (sha256
373 (base32
81ca29a6 374 "1d1hz4szh1kvwhsw7w2zxa6q5ndrk3qy6hj289l1b8k3xi5s554m"))))
08fa45b1 375 (native-inputs '())
5249045c 376 (inputs
07157e8a
LC
377 `(("zlib" ,zlib)
378 ("bzip2" ,bzip2)
5249045c
MW
379 ("curl" ,curl)
380 ("readline" ,readline)
381 ("libgpg-error" ,libgpg-error)))
382 (arguments
29d90757
LF
383 `(#:phases
384 (modify-phases %standard-phases
385 (add-after 'unpack 'patch-check-sh
386 (lambda _
387 (substitute* "checks/Makefile.in"
b17f7238
MW
388 (("/bin/sh") (which "sh")))
389 #t)))))))
5249045c 390
09d5c166
AE
391(define-public gpgme
392 (package
393 (name "gpgme")
df9f6289 394 (version "1.11.1")
09d5c166
AE
395 (source
396 (origin
397 (method url-fetch)
398 (uri (string-append "mirror://gnupg/gpgme/gpgme-" version
399 ".tar.bz2"))
400 (sha256
401 (base32
df9f6289 402 "0vxx5xaag3rhp4g2arp5qm77gvz4kj0m3hnpvhkdvqyjfhbi26rd"))))
09d5c166 403 (build-system gnu-build-system)
b3ecb3fe
LF
404 (native-inputs
405 `(("gnupg" ,gnupg)))
68640c3c
MW
406 (propagated-inputs
407 ;; Needs to be propagated because gpgme.h includes gpg-error.h.
df9f6289 408 `(("libgpg-error" ,libgpg-error-1.31)))
09d5c166 409 (inputs
b3ecb3fe 410 `(("libassuan" ,libassuan)))
72fb1b24 411 (home-page "https://www.gnupg.org/related_software/gpgme/")
35b9e423 412 (synopsis "Library providing simplified access to GnuPG functionality")
09d5c166
AE
413 (description
414 "GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG
415easier for applications. It provides a High-Level Crypto API for encryption,
416decryption, signing, signature verification and key management. Currently
417it uses GnuPG as its backend but the API isn't restricted to this engine.
418
419Because the direct use of GnuPG from an application can be a complicated
420programming task, it is suggested that all software should try to use GPGME
421instead. This way bug fixes or improvements can be done at a central place
422and every application benefits from this.")
07157e8a 423 (license license:lgpl2.1+)))
09d5c166 424
6b982a78
HG
425(define-public qgpgme
426 (package
427 (inherit gpgme)
428 (name "qgpgme")
429 (arguments
430 `(#:phases
431 (modify-phases %standard-phases
432 (add-before 'build 'chdir-and-symlink
433 (lambda* (#:key inputs #:allow-other-keys)
434 (let ((gpgme (assoc-ref inputs "gpgme")))
435 (symlink (string-append gpgme "/lib/libgpgmepp.la")
436 "lang/cpp/src/libgpgmepp.la")
437 (symlink (string-append gpgme "/lib/libgpgme.la")
438 "src/libgpgme.la"))
439 (chdir "lang/qt")
440 #t)))))
441 (native-inputs
0684f1d6
LF
442 `(("pkg-config" ,pkg-config)
443 ,@(package-native-inputs gpgme)))
6b982a78
HG
444 (inputs
445 `(("gpgme" ,gpgme)
446 ("qtbase" ,qtbase)
447 ,@(package-inputs gpgme)))
448 (synopsis "Qt API bindings for gpgme")
449 (description "QGpgme provides a very high level Qt API around GpgMEpp.
450
451QGpgME was originally developed as part of libkleo and incorporated into
452gpgpme starting with version 1.7.")
453 (license license:gpl2+))) ;; Note: this differs from gpgme
454
e3dd1f0c
LF
455(define-public python-gpg
456 (package
457 (name "python-gpg")
99c63f3f 458 (version "1.8.0")
e3dd1f0c
LF
459 (source (origin
460 (method url-fetch)
461 (uri (pypi-uri "gpg" version))
462 (sha256
463 (base32
464 "1x74i6q713c0bckls7rdm8kgsmllf9qvy9x62jghszlhgjkyh9nd"))))
465 (build-system python-build-system)
466 (arguments
467 '(#:tests? #f)) ; No test suite.
468 (inputs
469 `(("gpgme" ,gpgme)))
470 (native-inputs
471 `(("swig" ,swig)))
472 (home-page (package-home-page gpgme))
473 (synopsis "Python bindings for GPGME GnuPG cryptography library")
474 (description "This package provides Python bindings to the GPGME GnuPG
475cryptographic library. It is developed in the GPGME source code, and then
476distributed separately.")
477 (license license:lgpl2.1+)))
478
479(define-public python2-gpg
480 (package-with-python2 python-gpg))
481
a05d1d82
CAW
482(define-public python-pygpgme
483 (package
484 (name "python-pygpgme")
485 (version "0.3")
486 (source
487 (origin
488 (method url-fetch)
489 (uri (pypi-uri "pygpgme" version))
490 (sha256
491 (base32
492 "1q82p3gs6lwq8j8dxk4pvrwk3jpww1zqcjrzznl9clh10z28gn2z"))
493 ;; Unfortunately, we have to disable some tests due to some gpg-agent
494 ;; goofiness... see:
495 ;; https://bugs.launchpad.net/pygpgme/+bug/999949
1c9cea74
LF
496 (patches (search-patches "pygpgme-disable-problematic-tests.patch"
497 "python-pygpgme-fix-pinentry-tests.patch"))))
a05d1d82
CAW
498 (arguments
499 `(#:phases
500 (modify-phases %standard-phases
501 (add-before 'build 'make-build
502 (lambda _
503 (zero? (system* "make" "build"))))
504 (replace 'check
505 (lambda _
506 (zero? (system* "make" "check")))))))
507 (build-system python-build-system)
e6f63412
LF
508 (native-inputs
509 `(("gnupg" ,gnupg-1)))
a05d1d82 510 (inputs
e6f63412 511 `(("gpgme" ,gpgme)))
a05d1d82
CAW
512 (home-page "https://launchpad.net/pygpgme")
513 (synopsis "Python module for working with OpenPGP messages")
514 (description
515 "PyGPGME is a Python module that lets you sign, verify, encrypt and
516decrypt messages using the OpenPGP format by making use of GPGME.")
517 (license license:lgpl2.1+)))
518
519(define-public python2-pygpgme
5c31f4aa 520 (package-with-python2 python-pygpgme))
a05d1d82 521
22af9029
RW
522(define-public python-gnupg
523 (package
524 (name "python-gnupg")
ff76a1e9 525 (version "0.4.3")
22af9029
RW
526 (source
527 (origin
528 (method url-fetch)
5b669ba1 529 (uri (pypi-uri "python-gnupg" version))
22af9029
RW
530 (sha256
531 (base32
ff76a1e9 532 "03dc8whhvk7ccspbk8vzfhkxli8cd9zfbss5p597g4jldgy8s59d"))))
22af9029
RW
533 (build-system python-build-system)
534 (arguments
535 `(#:phases
536 (modify-phases %standard-phases
537 (replace 'check
ec089763
RW
538 (lambda _
539 (substitute* "test_gnupg.py"
ec089763
RW
540 ;; Unsure why this test fails.
541 (("'test_search_keys'") "True")
542 (("def test_search_keys") "def disabled__search_keys"))
543 (setenv "USERNAME" "guixbuilder")
544 ;; The doctests are extremely slow and sometimes time out,
545 ;; so we disable them.
b262aba7
TGR
546 (invoke "python"
547 "test_gnupg.py" "--no-doctests"))))))
22af9029
RW
548 (native-inputs
549 `(("gnupg" ,gnupg-1)))
72fb1b24 550 (home-page "https://packages.python.org/python-gnupg/index.html")
22af9029
RW
551 (synopsis "Wrapper for the GNU Privacy Guard")
552 (description
553 "This module allows easy access to GnuPG’s key management, encryption
554and signature functionality from Python programs.")
555 (license license:bsd-3)))
556
557(define-public python2-gnupg
558 (package-with-python2 python-gnupg))
559
34ef5755
CB
560(define-public perl-gnupg-interface
561 (package
562 (name "perl-gnupg-interface")
563 (version "0.52")
9c2d0a03
RW
564 (source (origin
565 (method url-fetch)
566 (uri (string-append "mirror://cpan/authors/id/A/AL/ALEXMV/"
567 "GnuPG-Interface-" version ".tar.gz"))
568 (sha256
569 (base32
570 "0dgx8yhdsmhkazcrz14n4flrk1afv7azgl003hl4arxvi1d9yyi4"))))
34ef5755
CB
571 (build-system perl-build-system)
572 (arguments
9c2d0a03
RW
573 `(#:phases
574 (modify-phases %standard-phases
575 ;; FIXME: This test fails for unknown reasons
576 (add-after 'unpack 'delete-broken-test
577 (lambda _
578 (delete-file "t/encrypt_symmetrically.t")
579 #t)))))
34ef5755 580 (inputs
9c2d0a03 581 `(("gnupg" ,gnupg-1)))
34ef5755
CB
582 (propagated-inputs
583 `(("perl-moo" ,perl-moo)
9c2d0a03
RW
584 ("perl-moox-handlesvia" ,perl-moox-handlesvia)
585 ("perl-moox-late" ,perl-moox-late)))
586 (native-inputs
587 `(("which" ,which)
588 ("perl-module-install" ,perl-module-install)))
589 (home-page "http://search.cpan.org/dist/GnuPG-Interface/")
34ef5755 590 (synopsis "Perl interface to GnuPG")
9c2d0a03
RW
591 (description "@code{GnuPG::Interface} and its associated modules are
592designed to provide an object-oriented method for interacting with GnuPG,
593being able to perform functions such as but not limited to encrypting,
594signing, decryption, verification, and key-listing parsing.")
34ef5755
CB
595 (license license:perl-license)))
596
ea4d96c6 597(define-public pius
cda0ef04
TS
598 (package
599 (name "pius")
66eb91be 600 (version "2.2.6")
cda0ef04
TS
601 (source (origin
602 (method url-fetch)
603 (uri (string-append
604 "https://github.com/jaymzh/pius/releases/download/v"
605 version "/pius-" version ".tar.bz2"))
606 (sha256
607 (base32
a92d9726
AE
608 "1893hzpx3zv724drqv48csrn0cm98xw4ymb1zmhs2jvjj1778zfj"))
609 (patches (search-patches "pius.patch"))))
cda0ef04
TS
610 (build-system python-build-system)
611 (inputs `(("perl" ,perl) ;for 'pius-party-worksheet'
fcb1dd99
AE
612 ("gpg" ,gnupg)
613 ("python-six" ,python2-six)))
cda0ef04
TS
614 (arguments
615 `(#:tests? #f
616 #:python ,python-2 ;uses the Python 2 'print' syntax
617 #:phases
618 (modify-phases %standard-phases
619 (add-before
620 'build 'set-gpg-file-name
621 (lambda* (#:key inputs outputs #:allow-other-keys)
622 (let* ((gpg (string-append (assoc-ref inputs "gpg")
623 "/bin/gpg")))
624 (substitute* "libpius/constants.py"
625 (("/usr/bin/gpg2") gpg))
626 #t))))))
627 (synopsis "Programs to simplify GnuPG key signing")
628 (description
629 "Pius (PGP Individual UID Signer) helps attendees of PGP keysigning
35b9e423
EB
630parties. It is the main utility and makes it possible to quickly and easily
631sign each UID on a set of PGP keys. It is designed to take the pain out of
ea4d96c6
AE
632the sign-all-the-keys part of PGP Keysigning Party while adding security
633to the process.
634
635pius-keyring-mgr and pius-party-worksheet help organisers of
636PGP keysigning parties.")
cda0ef04
TS
637 (license license:gpl2)
638 (home-page "https://www.phildev.net/pius/index.shtml")))
96be765c
AE
639
640(define-public signing-party
831f07a0
LC
641 ;; Upstream moved from alioth.debian.org to salsa.debian.org but the
642 ;; automatic svn import did not preserve tags apparently, so there's no real
643 ;; version number.
644 (let ((commit "d6f2296325605ee96ddf9f5b156e5e3f667a6df3")
645 (revision "0"))
646 (package
647 (name "signing-party")
648 (version (git-version "2.6" revision commit))
649 (home-page "https://salsa.debian.org/stappers/pgp-tools")
650 (source (origin
651 (method git-fetch)
652 (uri (git-reference
653 (url home-page)
654 (commit commit)))
655 (sha256
656 (base32
657 "00f7zasbwcbjzd92br2j10pyjxv0aw1qb4540qfz2dxzxgmdscrz"))))
658 (build-system gnu-build-system)
659 (native-inputs
660 `(("autoconf" ,autoconf-wrapper)
661 ("automake" ,automake)))
662 (inputs `(("perl" ,perl)
663 ("perl-text-template" ,perl-text-template)
664 ("perl-mime-tools" ,perl-mime-tools)
665 ("perl-gnupg-interface" ,perl-gnupg-interface)
666 ("perl-net-idn-encode" ,perl-net-idn-encode)
667 ("libmd" ,libmd)))
668 (arguments
669 `(#:tests? #f
670 #:phases
671 (modify-phases %standard-phases
672 (replace 'configure
673 (lambda* (#:key outputs #:allow-other-keys)
674 (let ((out (assoc-ref outputs "out")))
675 (substitute* "keyanalyze/Makefile"
676 (("LDLIBS") (string-append "CC=" (which "gcc") "\nLDLIBS")))
677 (substitute* "keyanalyze/Makefile"
678 (("\\./configure") (string-append "./configure --prefix=" out)))
679 (substitute* "gpgwrap/Makefile"
680 (("\\} clean")
681 (string-append "} clean\ninstall:\n\tinstall -D bin/gpgwrap "
682 out "/bin/gpgwrap\n")))
683 (substitute* '("gpgsigs/Makefile" "keyanalyze/Makefile"
684 "keylookup/Makefile" "sig2dot/Makefile"
685 "springgraph/Makefile")
686 (("/usr") out))
687 (setenv "CONFIG_SHELL" (which "sh")))))
688 (replace 'install
689 (lambda* (#:key outputs #:allow-other-keys #:rest args)
690 (let ((out (assoc-ref outputs "out"))
691 (install (assoc-ref %standard-phases 'install)))
692 (apply install args)
693 (for-each
694 (lambda (dir file)
695 (copy-file (string-append dir "/" file)
696 (string-append out "/bin/" file)))
697 '("caff" "caff" "caff" "gpgdir" "gpg-key2ps"
698 "gpglist" "gpg-mailkeys" "gpgparticipants")
699 '("caff" "pgp-clean" "pgp-fixkey" "gpgdir" "gpg-key2ps"
700 "gpglist" "gpg-mailkeys" "gpgparticipants"))
701 (for-each
702 (lambda (dir file)
703 (copy-file (string-append dir "/" file)
704 (string-append out "/share/man/man1/" file)))
705 '("caff" "caff" "caff" "gpgdir"
706 "gpg-key2ps" "gpglist" "gpg-mailkeys"
707 "gpgparticipants" "gpgsigs" "gpgwrap/doc"
708 "keyanalyze" "keyanalyze/pgpring" "keyanalyze")
709 '("caff.1" "pgp-clean.1" "pgp-fixkey.1" "gpgdir.1"
710 "gpg-key2ps.1" "gpglist.1" "gpg-mailkeys.1"
711 "gpgparticipants.1" "gpgsigs.1" "gpgwrap.1"
712 "process_keys.1" "pgpring.1" "keyanalyze.1")))))
713 (add-after 'install 'wrap-programs
714 (lambda* (#:key outputs #:allow-other-keys)
715 (let* ((out (assoc-ref outputs "out")))
716 (wrap-program
717 (string-append out "/bin/caff")
718 `("PERL5LIB" ":" prefix (,(getenv "PERL5LIB"))))))))))
719 (synopsis "Collection of scripts for simplifying gnupg key signing")
720 (description
721 "Signing-party is a collection for all kinds of PGP/GnuPG related things,
96be765c 722including tools for signing keys, keyring analysis, and party preparation.
7ac53403
EF
723@enumerate
724@item caff: CA - Fire and Forget signs and mails a key
725@item pgp-clean: removes all non-self signatures from key
726@item pgp-fixkey: removes broken packets from keys
727@item gpg-mailkeys: simply mail out a signed key to its owner
728@item gpg-key2ps: generate PostScript file with fingerprint paper strips
729@item gpgdir: recursive directory encryption tool
730@item gpglist: show who signed which of your UIDs
731@item gpgsigs: annotates list of GnuPG keys with already done signatures
732@item gpgparticipants: create list of party participants for the organiser
733@item gpgwrap: a passphrase wrapper
734@item keyanalyze: minimum signing distance (MSD) analysis on keyrings
735@item keylookup: ncurses wrapper around gpg --search
736@item sig2dot: converts a list of GnuPG signatures to a .dot file
737@item springgraph: creates a graph from a .dot file
738@end enumerate")
831f07a0
LC
739 ;; gpl2+ for almost all programs, except for keyanalyze: gpl2
740 ;; and caff and gpgsigs: bsd-3, see
741 ;; http://packages.debian.org/changelogs/pool/main/s/signing-party/current/copyright
742 (license license:gpl2))))
40d806af 743
c607b701 744(define-public pinentry-tty
40d806af 745 (package
c607b701 746 (name "pinentry-tty")
4498cbd7 747 (version "1.1.0")
40d806af
LC
748 (source (origin
749 (method url-fetch)
750 (uri (string-append "mirror://gnupg/pinentry/pinentry-"
751 version ".tar.bz2"))
752 (sha256
753 (base32
4498cbd7 754 "0w35ypl960pczg5kp6km3dyr000m1hf0vpwwlh72jjkjza36c1v8"))))
40d806af 755 (build-system gnu-build-system)
c607b701
EF
756 (arguments
757 `(#:configure-flags '("--enable-pinentry-tty")))
40d806af
LC
758 (inputs
759 `(("ncurses" ,ncurses)
18ed97d6 760 ("libassuan" ,libassuan)
c607b701 761 ("libsecret" ,libsecret "out")))
40d806af
LC
762 (native-inputs
763 `(("pkg-config" ,pkg-config)))
547cb17d 764 (home-page "https://gnupg.org/aegypten2/")
40d806af
LC
765 (synopsis "GnuPG's interface to passphrase input")
766 (description
c607b701 767 "Pinentry provides a console that allows users to enter a passphrase when
9614897b 768@code{gpg} is run and needs it.")
f8457932
LC
769 (license license:gpl2+)
770 (properties '((ftp-server . "ftp.gnupg.org")
771 (ftp-directory . "/gcrypt/pinentry")
772 (upstream-name . "pinentry")))))
4380a7b4 773
abc4a332
PN
774(define-public pinentry-emacs
775 (package
776 (inherit pinentry-tty)
777 (name "pinentry-emacs")
778 (arguments
779 `(#:configure-flags '("--enable-pinentry-emacs")))
780 (description
781 "Pinentry provides a console and an Emacs interface that allows users to
782enter a passphrase when required by @code{gpg} or other software.")))
783
c607b701
EF
784(define-public pinentry-gtk2
785 (package
786 (inherit pinentry-tty)
787 (name "pinentry-gtk2")
788 (inputs
789 `(("gtk+" ,gtk+-2)
790 ("glib" ,glib)
791 ,@(package-inputs pinentry-tty)))
792 (description
793 "Pinentry provides a console and a GTK+ GUI that allows users to enter a
9614897b 794passphrase when @code{gpg} is run and needs it.")))
c607b701 795
41edb23f
CB
796(define-public pinentry-gnome3
797 (package
798 (inherit pinentry-tty)
799 (name "pinentry-gnome3")
800 (inputs
801 `(("gtk+" ,gtk+-2)
802 ("gcr" ,gcr)
803 ("glib" ,glib)
804 ,@(package-inputs pinentry-tty)))
805 (arguments
806 `(#:configure-flags '("--enable-pinentry-gnome3")))
807 (description
808 "Pinentry provides a console and a GUI designed for use with GNOME@tie{}3
809that allows users to enter a passphrase when required by @code{gpg} or other
810software.")))
c607b701 811
54df7558
EF
812(define-public pinentry-qt
813 (package
814 (inherit pinentry-tty)
815 (name "pinentry-qt")
816 (inputs
e2788cef 817 `(("qtbase" ,qtbase)
54df7558 818 ,@(package-inputs pinentry-tty)))
984ad832
DC
819 (arguments
820 `(#:configure-flags '("CXXFLAGS=-std=gnu++11")))
54df7558
EF
821 (description
822 "Pinentry provides a console and a Qt GUI that allows users to enter a
9614897b 823passphrase when @code{gpg} is run and needs it.")))
54df7558 824
940f8d39
EF
825(define-public pinentry
826 (package (inherit pinentry-gtk2)
827 (name "pinentry")))
828
4380a7b4
EB
829(define-public paperkey
830 (package
831 (name "paperkey")
ae9877fe 832 (version "1.5")
4380a7b4
EB
833 (source (origin
834 (method url-fetch)
835 (uri (string-append "http://www.jabberwocky.com/"
836 "software/paperkey/paperkey-"
837 version ".tar.gz"))
838 (sha256
839 (base32
ae9877fe 840 "1prd2jaf4zjad3xhv160hmi5n408ssljfg7iz90jxs9w111pjwy4"))))
4380a7b4
EB
841 (build-system gnu-build-system)
842 (arguments
843 `(#:phases
e379d85c
EF
844 (modify-phases %standard-phases
845 (add-before 'check 'patch-check-scripts
846 (lambda _
847 (substitute* '("checks/roundtrip.sh"
848 "checks/roundtrip-raw.sh")
849 (("/bin/echo") "echo"))
850 #t)))))
4380a7b4
EB
851 (home-page "http://www.jabberwocky.com/software/paperkey/")
852 (synopsis "Backup OpenPGP keys to paper")
853 (description
854 "Paperkey extracts the secret bytes from an OpenPGP (GnuPG, PGP, etc) key
855for printing with paper and ink, which have amazingly long retention
856qualities. To reconstruct a secret key, you re-enter those
857bytes (whether by hand, OCR, QR code, or the like) and paperkey can use
858them to transform your existing public key into a secret key.")
07157e8a 859 (license license:gpl2+)))
8384499c 860
861(define-public gpa
862 (package
863 (name "gpa")
864 (version "0.9.10")
865 (source (origin
866 (method url-fetch)
867 (uri (string-append "mirror://gnupg/gpa/"
868 name "-" version ".tar.bz2"))
869 (sha256
870 (base32
871 "09xphbi2456qynwqq5n0yh0zdmdi2ggrj3wk4hsyh5lrzlvcrff3"))))
872 (build-system gnu-build-system)
873 (native-inputs
874 `(("pkg-config" ,pkg-config)))
875 (inputs
876 `(("gnupg" ,gnupg)
877 ("gpgme" ,gpgme)
878 ("libassuan" ,libassuan)
879 ("libgpg-error" ,libgpg-error)
880 ("gtk+-2" ,gtk+-2)))
881 (home-page "https://gnupg.org/software/gpa/")
882 (synopsis "Graphical user interface for GnuPG")
883 (description
884 "GPA, the GNU Privacy Assistant, is a graphical user interface for
885@uref{https://gnupg.org, GnuPG}. It can be used to encrypt, decrypt, and sign
886files, to verify signatures, and to manage the private and public keys.")
887 (license license:gpl3+)))
5aeb6611 888
15b08442
P
889(define-public parcimonie
890 (package
891 (name "parcimonie")
892 (version "0.10.3")
893 (source (origin
894 (method url-fetch)
895 (uri (string-append "https://gaffer.ptitcanardnoir.org/"
896 "intrigeri/files/parcimonie/App-Parcimonie-"
897 version ".tar.gz"))
898 (sha256
899 (base32
900 "1kf891117s1f3k6lxvbjdb21va9gxh29vlp9bd664ssgw266rcyb"))))
901 (build-system perl-build-system)
902 (inputs
903 `(("gnupg" ,gnupg-1) ; This is the version used by perl-gnupg-interface
904 ("perl-config-general" ,perl-config-general)
905 ("perl-clone" ,perl-clone)
906 ("perl-data" ,perl-data)
907 ("perl-exporter-tiny" ,perl-exporter-tiny)
908 ("perl-file-homedir" ,perl-file-homedir)
909 ("perl-file-sharedir" ,perl-file-sharedir)
910 ("perl-file-which" ,perl-file-which)
911 ("perl-getopt-long-descriptive" ,perl-getopt-long-descriptive)
912 ("perl-gnupg-interface" ,perl-gnupg-interface)
913 ("perl-ipc-system-simple" ,perl-ipc-system-simple)
914 ("perl-list-moreutils" ,perl-list-moreutils)
915 ("perl-libintl-perl" ,perl-libintl-perl) ; Locale::TextDomain
916 ("perl-lwp-online" ,perl-lwp-online)
917 ("perl-module-build" ,perl-module-build)
918 ("perl-module-pluggable-object" ,perl-module-pluggable)
919 ("perl-moo" ,perl-moo)
920 ("perl-moox-handlesvia" ,perl-moox-handlesvia)
921 ("perl-moox-late" ,perl-moox-late)
922 ("perl-moox-options" ,perl-moox-options)
923 ("perl-namespace-clean" ,perl-namespace-clean)
924 ("perl-net-dbus" ,perl-net-dbus)
925 ("perl-net-dbus-glib" ,perl-net-dbus-glib)
926 ("perl-path-tiny" ,perl-path-tiny)
927 ("perl-test-most" ,perl-test-most)
928 ("perl-test-trap" ,perl-test-trap)
929 ("perl-time-duration" ,perl-time-duration)
930 ("perl-time-duration-parse" ,perl-time-duration-parse)
931 ("perl-try-tiny" ,perl-try-tiny)
932 ("perl-type-tiny" ,perl-type-tiny)
933 ("perl-types-path-tiny" ,perl-types-path-tiny)
934 ("perl-unicode-linebreak" ,perl-unicode-linebreak)
935 ("perl-xml-parser" ,perl-xml-parser)
936 ("perl-xml-twig" ,perl-xml-twig)
937 ("torsocks" ,torsocks)))
938 (arguments
939 `(#:phases
940 (modify-phases %standard-phases
941 ;; Needed for using gpg-connect-agent during tests.
942 (add-before 'check 'set-HOME
943 (lambda _ (setenv "HOME" "/tmp") #t))
944 (add-before 'install 'fix-references
945 (lambda* (#:key inputs outputs #:allow-other-keys)
946 (substitute* "lib/App/Parcimonie/GnuPG/Interface.pm"
947 (("gpg2") "gpg")
948 ;; Skip check whether dependencies are in the PATH
949 (("defined which.*") "")
950 (("call\\('parcimonie-torified-gpg'\\)")
951 (string-append "call('" (assoc-ref outputs "out")
952 "/bin/parcimonie-torified-gpg')")))
953 (substitute* "bin/parcimonie-torified-gpg"
954 (("torsocks") (string-append (assoc-ref inputs "torsocks")
955 "/bin/torsocks")))
956 #t))
957 (add-after 'install 'wrap-program
958 (lambda* (#:key inputs outputs #:allow-other-keys)
959 (let* ((out (assoc-ref outputs "out"))
960 (perllib (string-append out "/lib/perl5/site_perl/"
961 ,(package-version perl))))
962 (wrap-program (string-append out "/bin/parcimonie")
963 `("PERL5LIB" ":"
964 prefix (,(string-append perllib ":" (getenv "PERL5LIB")))))
965 #t))))))
966 (home-page "https://gaffer.ptitcanardnoir.org/intrigeri/code/parcimonie/")
967 (synopsis "Incrementally refreshes a GnuPG keyring")
968 (description "Parcimonie incrementaly refreshes a GnuPG keyring in a way
969that makes it hard to correlate the keyring content to an individual, and
970makes it hard to locate an individual based on an identifying subset of her
971keyring content. Parcimonie is a daemon that fetches one key at a time using
972the Tor network, waits a bit, changes the Tor circuit being used, and starts
973over.")
974 (license license:gpl1+)))
607d280e
EF
975
976(define-public jetring
977 (package
978 (name "jetring")
835cf37c 979 (version "0.27")
607d280e
EF
980 (source
981 (origin
982 (method url-fetch)
983 (uri (string-append "mirror://debian/pool/main/j/" name "/"
984 name "_" version ".tar.xz"))
985 (sha256
986 (base32
835cf37c 987 "0jy0x5zj7v87xgyldlsx1knzp0mv10wzamblrw1b61i2m1ii4pxz"))))
607d280e
EF
988 (build-system gnu-build-system)
989 (arguments
990 '(#:phases
991 (modify-phases %standard-phases
992 (delete 'configure) ; no configure script
993 (add-before 'install 'hardlink-gnupg
994 (lambda* (#:key inputs #:allow-other-keys)
995 (let ((gpg (string-append (assoc-ref inputs "gnupg")
996 "/bin/gpg")))
997 (substitute* (find-files "." "jetring-[[:alpha:]]+$")
998 (("gpg -") (string-append gpg " -"))
999 (("\\\"gpg\\\"") (string-append "\"" gpg "\"")))
1000 #t)))
1001 (replace 'install
1002 (lambda* (#:key outputs #:allow-other-keys)
1003 (let* ((out (assoc-ref outputs "out"))
1004 (man (string-append out "/share/man")))
1005 (for-each (lambda (file)
1006 (install-file file (string-append out "/bin/")))
1007 (find-files "." "jetring-[[:alpha:]]+$"))
1008 (for-each (lambda (file)
1009 (install-file file (string-append man "/man1/")))
1010 (find-files "." ".*\\.1$"))
1011 (install-file "jetring.7" (string-append man "/man7/"))
1012 #t))))
1013 #:tests? #f)) ; no test phase
1014 (inputs
1015 `(("gnupg" ,gnupg)
1016 ("perl" ,perl)))
1017 (home-page "https://joeyh.name/code/jetring/")
1018 (synopsis "GnuPG keyring maintenance using changesets")
1019 (description
1020 "Jetring is a collection of tools that allow for gpg keyrings to be
1021maintained using changesets. It was developed with the Debian keyring in mind,
1022and aims to solve the problem that a gpg keyring is a binary blob that's hard
1023for multiple people to collaboratively edit.
1024
1025With jetring, changesets can be submitted, reviewed to see exactly what they
1026will do, applied, and used to build a keyring. The origin of every change made
1027to the keyring is available for auditing, and gpg signatures can be used for
1028integrity guarantees.")
1029 (license license:gpl2+)))