projects/guix·blob javascript-team · refs

1344 lines · 52.4 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2012-2021, 2023-2025 Ludovic Courtès <[email protected]>
3;;; Copyright © 2013, 2015, 2018 Andreas Enge <[email protected]>
4;;; Copyright © 2014, 2018 Eric Bavier <[email protected]>
5;;; Copyright © 2014, 2015, 2016, 2020 Mark H Weaver <[email protected]>
6;;; Copyright © 2015 Paul van der Walt <[email protected]>
7;;; Copyright © 2015-2021, 2024, 2025 Efraim Flashner <[email protected]>
8;;; Copyright © 2015, 2016, 2017, 2019, 2025 Ricardo Wurmus <[email protected]>
9;;; Copyright © 2016 Christine Lemmer-Webber <[email protected]>
10;;; Copyright © 2016, 2017 Nikita <[email protected]>
11;;; Copyright © 2016 Christopher Baines <[email protected]>
12;;; Copyright © 2016 Mike Gerwitz <[email protected]>
13;;; Copyright © 2016 Troy Sankey <[email protected]>
14;;; Copyright © 2017, 2020 Leo Famulari <[email protected]>
15;;; Copyright © 2017 Petter <[email protected]>
16;;; Copyright © 2018–2022 Tobias Geerinckx-Rice <[email protected]>
17;;; Copyright © 2018, 2019, 2022 Marius Bakke <[email protected]>
18;;; Copyright © 2018 Björn Höfling <[email protected]>
19;;; Copyright © 2019 Mathieu Othacehe <[email protected]>
20;;; Copyright © 2020 Fredrik Salomonsson <[email protected]>
21;;; Copyright © 2021 Maxime Devos <[email protected]>
22;;; Copyright © 2021 Nikita Domnitskii <[email protected]>
23;;; Copyright © 2021 Aleksandr Vityazev <[email protected]>
24;;; Copyright © 2022, 2023 Maxim Cournoyer <[email protected]>
25;;; Copyright © 2023, 2024 Janneke Nieuwenhuizen <[email protected]>
26;;; Copyright © 2024 Zheng Junjie <[email protected]>
27;;; Copyright © 2025 Antoine Côté <[email protected]>
28;;; Copyright © 2026 Luis Guilherme Coelho <[email protected]>
29;;; Copyright © 2026 Daniel Littlewood <[email protected]>
30;;; Copyright © 2026 Cayetano Santos <[email protected]>
31;;; Copyright © 2026 Sughosha <[email protected]>
32;;;
33;;; This file is part of GNU Guix.
34;;;
35;;; GNU Guix is free software; you can redistribute it and/or modify it
36;;; under the terms of the GNU General Public License as published by
37;;; the Free Software Foundation; either version 3 of the License, or (at
38;;; your option) any later version.
39;;;
40;;; GNU Guix is distributed in the hope that it will be useful, but
41;;; WITHOUT ANY WARRANTY; without even the implied warranty of
42;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43;;; GNU General Public License for more details.
44;;;
45;;; You should have received a copy of the GNU General Public License
46;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
47
48(define-module (gnu packages gnupg)
49 #:use-module (gnu packages autotools)
50 #:use-module (gnu packages base)
51 #:use-module (gnu packages bash)
52 #:use-module (gnu packages check)
53 #:use-module (gnu packages compression)
54 #:use-module (gnu packages crypto)
55 #:use-module (gnu packages curl)
56 #:use-module (gnu packages dns)
57 #:use-module (gnu packages emacs)
58 #:use-module (gnu packages enlightenment)
59 #:use-module (gnu packages gettext)
60 #:use-module (gnu packages glib)
61 #:use-module (gnu packages gnome)
62 #:use-module (gnu packages gtk)
63 #:use-module (gnu packages guile)
64 #:use-module (gnu packages ncurses)
65 #:use-module (gnu packages openldap)
66 #:use-module (gnu packages perl)
67 #:use-module (gnu packages perl-check)
68 #:use-module (gnu packages pkg-config)
69 #:use-module (gnu packages popt)
70 #:use-module (gnu packages pth)
71 #:use-module (gnu packages python)
72 #:use-module (gnu packages python-build)
73 #:use-module (gnu packages python-xyz)
74 #:use-module (gnu packages qt)
75 #:use-module (gnu packages readline)
76 #:use-module (gnu packages security-token)
77 #:use-module (gnu packages sqlite)
78 #:use-module (gnu packages swig)
79 #:use-module (gnu packages texinfo)
80 #:use-module (gnu packages tls)
81 #:use-module (gnu packages tor)
82 #:use-module (gnu packages web)
83 #:use-module (gnu packages xdisorg)
84 #:use-module (gnu packages xml)
85 #:use-module (gnu packages xorg)
86 #:use-module (gnu packages)
87 #:use-module (guix build-system cmake)
88 #:use-module (guix build-system copy)
89 #:use-module (guix build-system gnu)
90 #:use-module (guix build-system meson)
91 #:use-module (guix build-system perl)
92 #:use-module (guix build-system pyproject)
93 #:use-module (guix build-system qt)
94 #:use-module (guix download)
95 #:use-module (guix gexp)
96 #:use-module (guix git-download)
97 #:use-module ((guix licenses) #:prefix license:)
98 #:use-module (guix packages)
99 #:use-module (guix utils)
100 #:use-module (ice-9 match)
101 #:use-module (srfi srfi-1))
102
103(define-public libgpg-error
104 (package
105 (name "libgpg-error")
106 (version "1.61")
107 (source
108 (origin
109 (method url-fetch)
110 (uri (string-append "mirror://gnupg/libgpg-error/libgpg-error-"
111 version ".tar.bz2"))
112 (sha256
113 (base32
114 "14sw73317735xq991sz0x5jqkr12y6572aw3mbwg8m635czl31bs"))))
115 (build-system gnu-build-system)
116 (arguments
117 (list
118 #:configure-flags #~(list "--enable-install-gpg-error-config")
119 #:phases
120 #~(modify-phases %standard-phases
121 #$@(cond
122 ((%current-target-system)
123 ;; If this is left out, some generated header
124 ;; files will be sprinkled with ‘\c’, which
125 ;; the compiler won't like.
126 #~((add-after 'unpack 'fix-gen-lock-obj.sh
127 (lambda _
128 (substitute* "src/gen-lock-obj.sh"
129 (("if test -n `echo -n`") "if ! test -n `echo -n`"))))
130 ;; When cross-compiling, some platform specific properties cannot
131 ;; be detected. Create a symlink to the appropriate platform
132 ;; file if required. Note that these platform files depend on
133 ;; both the operating system and architecture!
134 ;;
135 ;; See Cross-Compiling section at:
136 ;; https://github.com/gpg/libgpg-error/blob/master/README
137 (add-after 'unpack 'cross-symlinks
138 (lambda _
139 (define (link triplet source)
140 (symlink (string-append "lock-obj-pub." triplet ".h")
141 (string-append "src/syscfg/lock-obj-pub."
142 source ".h")))
143 #$(let ((target (%current-target-system)))
144 (cond ((target-linux? target)
145 (match (string-take target
146 (string-index target #\-))
147 ("armhf"
148 `(link "arm-unknown-linux-gnueabi" "linux-gnu"))
149 ("mips64el"
150 `(link "mips-unknown-linux-gnu" "linux-gnu"))
151 ;; Don't always link to the "linux-gnu"
152 ;; configuration, as this is not correct for
153 ;; all architectures.
154 (_ #t)))
155 (#t #t)))))))
156 ((system-hurd?)
157 #~((add-after 'unpack 'skip-tests
158 (lambda _
159 (substitute* "tests/t-syserror.c"
160 (("(^| )main *\\(.*" all)
161 (string-append all "{\n exit (77);//")))))))
162 ((target-arm32?)
163 ;; Skip as per: https://dev.gnupg.org/T8309
164 #~((add-after 'unpack 'skip-tests
165 (lambda _
166 (substitute* "tests/t-printf.c"
167 (("ifdef HAVE_LONG_DOUBLE")
168 "if FALSE"))))))
169 (else #~())))))
170 (home-page "https://gnupg.org/software/libgpg-error")
171 (synopsis "Library of error values for GnuPG components")
172 (description
173 "Libgpg-error is a small library that defines common error values
174for all GnuPG components. Among these are GPG, GPGSM, GPGME,
175GPG-Agent, libgcrypt, Libksba, DirMngr, Pinentry, SmartCard
176Daemon and possibly more in the future.")
177 (license license:lgpl2.0+)))
178
179(define-public libgcrypt
180 (package
181 (name "libgcrypt")
182 (version "1.12.2")
183 (source (origin
184 (method url-fetch)
185 (uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
186 version ".tar.bz2"))
187 (sha256
188 (base32
189 "0pmxp91sirqmsiy7asnjbz5ksglzbqhh11baz4v086i2j8j3rqvw"))))
190 (build-system gnu-build-system)
191 (arguments
192 ;; The '--with-gpg-error-prefix' argument is needed because otherwise
193 ;; 'configure' uses 'gpg-error-config' to determine the '-L' flag, and
194 ;; the 'gpg-error-config' it runs is the native one---i.e., the wrong one.
195 (list
196 #:configure-flags
197 #~(append
198 (let ((gpgrt-config (search-input-file #$(if (%current-target-system)
199 #~%build-target-inputs
200 #~%build-inputs)
201 "bin/gpgrt-config")))
202 (list (string-append "--with-libgpg-error-prefix="
203 (dirname (dirname gpgrt-config)))
204 ;; libgcrypt is transitioning from gpg-error-config to
205 ;; gpgrt-config, and in the process the
206 ;; --with-libgpg-error-config prefix defined above is
207 ;; not respected. See <https://dev.gnupg.org/T5365>.
208 ;; TODO: transition to pkg-config instead of these scripts.
209 (string-append "ac_cv_path_GPGRT_CONFIG=" gpgrt-config)))
210 #$@(if (%current-target-system)
211 ;; When cross-compiling, _gcry_mpih_lshift etc are
212 ;; undefined.
213 #~((list "--disable-asm"))
214 #~()))
215 #:phases
216 #~(modify-phases %standard-phases
217 #$@(cond
218 ((system-hurd?)
219 #~((add-before 'configure 'setenv
220 (lambda _ (setenv "GCRYPT_NO_BENCHMARKS" "t")))))
221 (else #~())))))
222 (outputs '("out" "debug"))
223 (propagated-inputs (list libgpg-error))
224 (home-page "https://gnupg.org/software/libgcrypt")
225 (synopsis "Cryptographic function library")
226 (description
227 "Libgcrypt is a general-purpose cryptographic library. It provides the
228standard cryptographic building blocks such as symmetric ciphers, hash
229algorithms, public key algorithms, large integer functions and random number
230generation.")
231 (license license:lgpl2.0+)))
232
233(define-public libassuan
234 (package
235 (name "libassuan")
236 (version "3.0.2")
237 (source
238 (origin
239 (method url-fetch)
240 (uri (string-append "mirror://gnupg/libassuan/libassuan-"
241 version ".tar.bz2"))
242 (sha256
243 (base32
244 "1xin9h3vhx94j5w9p7xi3csmw1a6yfif2w4r1x8k7rk6sbd1r4yj"))))
245 (build-system gnu-build-system)
246 (arguments (if (%current-target-system)
247 (list #:configure-flags
248 #~(list (string-append
249 "--with-libgpg-error-prefix="
250 #$(this-package-input "libgpg-error"))))
251 '()))
252 (propagated-inputs (list libgpg-error))
253 (home-page "https://gnupg.org")
254 (synopsis
255 "IPC library used by GnuPG and related software")
256 (description
257 "Libassuan is a small library implementing the so-called Assuan
258protocol. This protocol is used for IPC between most newer
259GnuPG components. Both, server and client side functions are
260provided.")
261 (license license:lgpl2.0+)))
262
263(define-public libksba
264 (package
265 (name "libksba")
266 (version "1.8.0")
267 (source
268 (origin
269 (method url-fetch)
270 (uri (string-append
271 "mirror://gnupg/libksba/libksba-"
272 version ".tar.bz2"))
273 (sha256
274 (base32
275 "14lj3ld4nxf916kq01z0203x36nhgymxf0j222mg4jap16wrssr9"))))
276 (build-system gnu-build-system)
277 (propagated-inputs
278 (list libgpg-error))
279 (arguments
280 (list
281 #:configure-flags
282 #~(list #$@(if (%current-target-system)
283 #~("CC_FOR_BUILD=gcc")
284 #~())
285 (string-append "--with-gpg-error-prefix="
286 (assoc-ref %build-inputs "libgpg-error")))))
287 (home-page "https://www.gnupg.org")
288 (synopsis "CMS and X.509 access library")
289 (description
290 "KSBA (pronounced Kasbah) is a library to make X.509 certificates
291as well as the CMS easily accessible by other applications. Both
292specifications are building blocks of S/MIME and TLS.")
293 (license license:gpl3+)))
294
295(define-public npth
296 (package
297 (name "npth")
298 (version "1.8")
299 (source
300 (origin
301 (method url-fetch)
302 (uri (string-append "mirror://gnupg/npth/npth-" version ".tar.bz2"))
303 (sha256
304 (base32 "0gnaj176jjfi6ldrq1l1sx7ym0z7kjx8ms96bdp5s1m34d7lpllb"))))
305 (build-system gnu-build-system)
306 (home-page "https://www.gnupg.org")
307 (synopsis "Non-preemptive thread library")
308 (description
309 "Npth is a library to provide the GNU Pth API and thus a non-preemptive
310threads implementation.
311
312In contrast to GNU Pth is is based on the system's standard threads
313implementation. This allows the use of libraries which are not
314compatible to GNU Pth.")
315 (license (list license:lgpl3+ license:gpl2+)))) ;dual license
316
317(define-public gnupg
318 (package
319 (name "gnupg")
320 (version "2.5.21")
321 (source (origin
322 ;; Use tarballs instead of git, see the discussion at
323 ;; https://codeberg.org/guix/guix/issues/10622 .
324 (method url-fetch)
325 (uri (string-append "mirror://gnupg/gnupg/gnupg-" version
326 ".tar.bz2"))
327 (patches (search-patches "gnupg-default-pinentry.patch"))
328 (sha256
329 (base32
330 "0lhknfbnbhn2mfz9b5c19n8m2116my06hz7s569nm9j6ma62rbz3"))))
331 (build-system gnu-build-system)
332 (native-inputs
333 (list libgpg-error ; for yat2m
334 pkg-config))
335 (inputs
336 (append (if (target-hurd?)
337 '()
338 (list pcsc-lite))
339 (list gnutls
340 libassuan
341 libgcrypt
342 libgpg-error
343 libksba
344 npth
345 openldap
346 readline
347 sqlite
348 zlib)))
349 (arguments
350 (list
351 #:configure-flags
352 #~(list
353 ;; Otherwise, the test suite looks for the `gpg`
354 ;; executable in its installation directory in
355 ;; /gnu/store before it has been installed.
356 "--enable-gnupg-builddir-envvar"
357 "--enable-all-tests"
358 #$@(if (%current-target-system)
359 (list
360 #~(string-append
361 "--with-libgpg-error-prefix="
362 #$(this-package-input "libgpg-error"))
363 #~(string-append
364 "ac_cv_path_GPGRT_CONFIG="
365 #$(this-package-input "libgpg-error")
366 "/bin/gpgrt-config")
367 #~(string-append
368 "--with-libgcrypt-prefix="
369 #$(this-package-input "libgcrypt"))
370 #~(string-append
371 "--with-libassuan-prefix="
372 #$(this-package-input "libassuan"))
373 #~(string-append
374 "--with-ksba-prefix="
375 #$(this-package-input "libksba"))
376 #~(string-append
377 "--with-npth-prefix="
378 #$(this-package-input "npth")))
379 '()))
380 #:phases
381 #~(modify-phases %standard-phases
382 (add-before 'configure 'patch-paths
383 (lambda* (#:key inputs #:allow-other-keys)
384 (let ((libpcsclite.so (false-if-exception
385 (search-input-file inputs
386 "lib/libpcsclite.so"))))
387 (when libpcsclite.so
388 (substitute* "scd/scdaemon.c"
389 (("libpcsclite\\.so")
390 libpcsclite.so))))))
391 (add-after 'build 'patch-scheme-tests
392 (lambda _
393 (substitute* (find-files "tests" ".\\.scm$")
394 (("/usr/bin/env gpgscm")
395 (string-append (getcwd) "/tests/gpgscm/gpgscm")))))
396 (add-before 'build 'patch-test-paths
397 (lambda _
398 (substitute* '("tests/pkits/inittests"
399 "tests/pkits/common.sh"
400 "tests/pkits/Makefile")
401 (("/bin/pwd") (which "pwd")))
402 (substitute* "common/t-exectool.c"
403 (("/bin/cat") (which "cat"))
404 (("/bin/true") (which "true"))
405 (("/bin/false") (which "false"))))))))
406 (home-page "https://gnupg.org/")
407 (synopsis "GNU Privacy Guard")
408 (description
409 "The GNU Privacy Guard is a complete implementation of the OpenPGP
410standard. It is used to encrypt and sign data and communication. It
411features powerful key management and the ability to access public key
412servers. It includes several libraries: libassuan (IPC between GnuPG
413components), libgpg-error (centralized GnuPG error values), and
414libskba (working with X.509 certificates and CMS data).")
415 (license license:gpl3+)))
416
417(define-public gpgme-2
418 (package
419 (name "gpgme")
420 (version "2.1.0")
421 (source
422 (origin
423 (method url-fetch)
424 (uri (string-append "mirror://gnupg/gpgme/gpgme-" version ".tar.bz2"))
425 (sha256
426 (base32 "0azrddb51c423il7xdqcrahvi8fyhblvvs7hzgs5jqn27yjmw744"))))
427 (build-system gnu-build-system)
428 (arguments
429 (list
430 #:configure-flags
431 #~(let ((gpg-bins (dirname (search-input-file %build-inputs "/bin/gpg"))))
432 (list (string-append "--enable-fixed-path=" gpg-bins)))))
433 (inputs
434 (list gnupg))
435 (propagated-inputs
436 ;; As required by the pkg-config's Requires.private.
437 (list libgpg-error libassuan))
438 (home-page "https://gnupg.org/software/gpgme/index.html")
439 (synopsis "Library providing simplified access to GnuPG functionality")
440 (description
441 "GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG
442easier for applications. It provides a High-Level Crypto API for encryption,
443decryption, signing, signature verification and key management. Currently
444it uses GnuPG as its backend but the API isn't restricted to this engine.
445
446Because the direct use of GnuPG from an application can be a complicated
447programming task, it is suggested that all software should try to use GPGME
448instead. This way bug fixes or improvements can be done at a central place
449and every application benefits from this.")
450 (license license:lgpl2.1+)))
451
452(define-public gpgme-1
453 (package
454 (inherit gpgme-2)
455 (version "1.24.1")
456 (source
457 (origin
458 (method url-fetch)
459 (uri (string-append "mirror://gnupg/gpgme/gpgme-" version ".tar.bz2"))
460 (sha256
461 (base32 "0px87fbp90xp8vf1wms02flk14zmrqsfr135f5his1kiiqjx01ga"))))))
462
463(define-public gpgme gpgme-1)
464
465(define-public gpgmepp
466 (package
467 (name "gpgmepp")
468 (version "2.1.0")
469 (source
470 (origin
471 (method url-fetch)
472 (uri (string-append "mirror://gnupg/gpgmepp/gpgmepp-" version ".tar.xz"))
473 (sha256
474 (base32 "1qhn583cbi67694m3bg77ckb892in2f16src2x5m0102ix309y2p"))))
475 (build-system cmake-build-system)
476 (arguments
477 (list
478 ;; FIXME: BUILD_TESTING variable is enabled by deault, but still no tests
479 ;; are found.
480 #:tests? #f))
481 (propagated-inputs
482 ;; As required by the pkg-config's Requires.private.
483 (list gpgme-2 libgpg-error))
484 (home-page "https://gnupg.org/software/gpgme/index.html")
485 (synopsis "C++ bindings/wrapper for GPGME")
486 (description
487 "GPGME++ is a C++ wrapper (or C++ bindings) for the GnuPG project's
488@acronym{GPGME, GnuPG Made Easy} library.")
489 (license license:lgpl2.1+)))
490
491(define-public qgpgme
492 (package
493 (name "qgpgme")
494 (version "2.1.0")
495 (source
496 (origin
497 (method url-fetch)
498 (uri (string-append "mirror://gnupg/qgpgme/qgpgme-" version ".tar.xz"))
499 (sha256
500 (base32 "024gdw8i5ibmq0bjjf6znhxw93chh1j21dr25m0gk9z4xsrzwcjv"))))
501 (build-system qt-build-system)
502 (arguments
503 (list
504 #:qtbase qtbase
505 #:configure-flags #~(list "-DBUILD_WITH_QT5=OFF")
506 #:phases
507 #~(modify-phases %standard-phases
508 (add-before 'check 'check-setup
509 (lambda _
510 (setenv "HOME" (getcwd))
511 (invoke "gpg-agent" "--daemon"))))))
512 (propagated-inputs
513 (list gpgme-2 ;for FindGpgme.cmake and QGpgmeQt6Config.cmake
514 gpgmepp ;for QGpgmeQt6Config.cmake
515 libgpg-error)) ;for FindLibGpgError.cmake and QGpgmeQt6Config.cmake
516 (native-inputs
517 (list gnupg ;for tests
518 pkg-config))
519 (home-page "https://gnupg.org/software/gpgme/index.html")
520 (synopsis "Qt API bindings for gpgme")
521 (description "QGpgme provides a very high level Qt API around GpgMEpp.")
522 (license license:gpl2+)))
523
524(define-public qgpgme-qt5
525 (package
526 (inherit qgpgme)
527 (name "qgpgme-qt5")
528 (arguments
529 (list
530 #:configure-flags #~(list "-DBUILD_WITH_QT6=OFF")
531 #:phases
532 #~(modify-phases %standard-phases
533 (add-before 'check 'check-setup
534 (lambda _
535 (setenv "HOME" (getcwd))
536 (invoke "gpg-agent" "--daemon"))))))))
537
538(define-public guile-gcrypt
539 (package
540 (name "guile-gcrypt")
541 (version "0.5.0")
542 (home-page "https://codeberg.org/guile-gcrypt/guile-gcrypt")
543 (source (origin
544 (method git-fetch)
545 (uri (git-reference
546 (url (string-append home-page ".git"))
547 (commit (string-append "v" version))))
548 (sha256
549 (base32
550 "0zh5bqgbc3r4dlzz64flnh10pq0ipbxx8mpbwgp4di0abhlcxz30"))
551 (file-name (git-file-name name version))))
552 (build-system gnu-build-system)
553 (arguments
554 ;; Work around <https://bugs.gnu.org/20272> to achieve reproducible
555 ;; builds.
556 '(#:parallel-build? #f
557
558 #:phases
559 (modify-phases %standard-phases
560 (add-before 'configure 'add-libgrypt-config
561 (lambda* (#:key inputs target #:allow-other-keys)
562 (when target
563 ;; When cross-compiling, the bash script 'libgcrypt-config'
564 ;; must be accessible during the configure phase.
565 (setenv "PATH"
566 (string-append
567 (dirname
568 (search-input-file inputs "bin/libgcrypt-config"))
569 ":" (getenv "PATH")))))))))
570 (native-inputs
571 (list pkg-config autoconf automake texinfo guile-3.0))
572 (inputs
573 (list guile-3.0 libgcrypt))
574 (synopsis "Cryptography library for Guile using Libgcrypt")
575 (description
576 "Guile-Gcrypt provides a Guile interface to a subset of the
577GNU Libgcrypt crytographic library. It provides modules for cryptographic
578hash functions, message authentication codes (MAC), public-key cryptography,
579strong randomness, and more. It is implemented using the foreign function
580interface (FFI) of Guile.")
581 (license license:lgpl3+)))
582
583(define-public guile2.2-gcrypt
584 (package
585 (inherit guile-gcrypt)
586 (name "guile2.2-gcrypt")
587 (native-inputs
588 (modify-inputs native-inputs
589 (replace "guile" guile-2.2)))
590 (inputs
591 (modify-inputs inputs
592 (replace "guile" guile-2.2)))))
593
594(define-public python-gpg
595 (package
596 (name "python-gpg")
597 (version "2.0.0")
598 (source (origin
599 (method url-fetch)
600 (uri (pypi-uri "gpg" version))
601 (sha256
602 (base32
603 "0f2l0iyc8gp49i604c5wpliaa1dsyj0i0p9xc9zfj4z7fwaavdsf"))))
604 (build-system pyproject-build-system)
605 (arguments
606 (list
607 #:tests? #f ; No test suite.
608 #:phases
609 #~(modify-phases %standard-phases
610 (add-before 'build 'patch-setup.py
611 (lambda _
612 ;; GPGME is built with large file support, so we need to set
613 ;; _FILE_OFFSET_BITS to 64 in all users of the GPGME library.
614 #$@(if (or (target-x86-32?) (target-arm32?))
615 #~((substitute* "setup.py"
616 (("extra_macros = dict\\(\\)")
617 "extra_macros = { \"_FILE_OFFSET_BITS\": 64 }")))
618 #~())
619 (substitute* "setup.py"
620 (("cc") (which "gcc"))
621 (("\\/usr\\/lib\\/x86_64-linux-gnu( -lgpg-error)" _ keep)
622 (string-append #$(this-package-input "libgpg-error") "/lib"
623 keep))
624 (("\\/usr\\/lib\\/x86_64-linux-gnu( -lgpgme)" _ keep)
625 (string-append #$(this-package-input "gpgme") "/lib" keep))
626 (("\\/usr\\/local(', 'include', 'gpgme\\.h')" _ keep)
627 (string-append #$(this-package-input "gpgme") keep))))))))
628 (inputs
629 (list gpgme-2 libgpg-error))
630 (native-inputs
631 (list swig-4.0 python-setuptools))
632 (home-page (package-home-page gpgme))
633 (synopsis "Python bindings for GPGME GnuPG cryptography library")
634 (description "This package provides Python bindings to the GPGME GnuPG
635cryptographic library. It is developed in the GPGME source code, and then
636distributed separately.")
637 (license license:lgpl2.1+)))
638
639(define-public python-pygpgme
640 (package
641 (name "python-pygpgme")
642 (version "0.6")
643 (source
644 (origin
645 (method url-fetch)
646 (uri (pypi-uri "pygpgme" version))
647 (sha256
648 (base32
649 "0k25y3c07bkmz6q87lcbsbf34gva99rmdf5gffd8c1r1sccjif1n"))))
650 (build-system pyproject-build-system)
651 (arguments
652 (list
653 #:test-flags
654 ;; gpgme.GpgmeError: (<ErrSource.DIRMNGR: 10>, <ErrCode.ENOENT: 32849>,
655 ;; 'No such file or directory')
656 #~(list "--deselect=tests/test_import.py::ImportTestCase::test_import_keys")))
657 (native-inputs
658 (list gnupg ;to run gpg-connect-agent
659 pkg-config
660 python-pytest
661 python-setuptools))
662 (inputs
663 (list gpgme))
664 (home-page "https://github.com/jhenstridge/pygpgme")
665 (synopsis "Python module for working with OpenPGP messages")
666 (description
667 "PyGPGME is a Python module that lets you sign, verify, encrypt and
668decrypt messages using the OpenPGP format by making use of GPGME.")
669 (license license:lgpl2.1+)))
670
671(define-public python-gnupg
672 (package
673 (name "python-gnupg")
674 (version "0.5.6")
675 (source
676 (origin
677 (method git-fetch)
678 (uri (git-reference
679 (url "https://github.com/vsajip/python-gnupg/")
680 (commit version)))
681 (file-name (git-file-name name version))
682 (sha256
683 (base32
684 "0p5ijy8fqc84hcjr2np977v784y07b60l53wffwb7znyx570ip6f"))))
685 (build-system pyproject-build-system)
686 (arguments
687 (list
688 #:phases
689 #~(modify-phases %standard-phases
690 (replace 'check
691 (lambda* (#:key tests? #:allow-other-keys)
692 (when tests?
693 (substitute* "test_gnupg.py"
694 ;; Unsure why this test fails.
695 (("'test_search_keys'") "True")
696 (("def test_search_keys") "def disabled__search_keys"))
697 (setenv "USERNAME" "guixbuilder")
698 ;; The doctests are extremely slow and sometimes time out,
699 ;; so we disable them.
700 (invoke "python" "test_gnupg.py" "--no-doctests")))))))
701 (native-inputs
702 (list gnupg python-setuptools))
703 (home-page "https://docs.red-dove.com/python-gnupg/")
704 (synopsis "Wrapper for the GNU Privacy Guard")
705 (description
706 "This module allows easy access to GnuPG’s key management, encryption
707and signature functionality from Python programs.")
708 (license license:bsd-3)))
709
710(define-public perl-gnupg-interface
711 (package
712 (name "perl-gnupg-interface")
713 (version "1.06")
714 (source (origin
715 (method url-fetch)
716 (uri (string-append "mirror://cpan/authors/id/B/BP/BPS/"
717 "GnuPG-Interface-" version ".tar.gz"))
718 (sha256
719 (base32
720 "07946rsmz0ibasd53l4qiwg0dl1h65p8byja4d7fiflxsklxccs4"))))
721 (build-system perl-build-system)
722 (inputs
723 (list gnupg))
724 (propagated-inputs
725 (list perl-moo perl-moox-handlesvia perl-moox-late))
726 (native-inputs
727 (list which perl-module-install))
728 (home-page "https://metacpan.org/dist/GnuPG-Interface")
729 (synopsis "Perl interface to GnuPG")
730 (description "@code{GnuPG::Interface} and its associated modules are
731designed to provide an object-oriented method for interacting with GnuPG,
732being able to perform functions such as but not limited to encrypting,
733signing, decryption, verification, and key-listing parsing.")
734 (license license:perl-license)))
735
736(define-public pius
737 ;; The last release was from 2019, the latest commit is from 2025
738 (let ((commit "5f7c10bd3b058c864b128a3b0e0c0efa1f1befa2")
739 (revision "0"))
740 (package
741 (name "pius")
742 (version (git-version "3.0.0" revision commit))
743 (source
744 (origin
745 (method git-fetch)
746 (uri (git-reference
747 (url "https://github.com/jaymzh/pius")
748 (commit commit)))
749 (file-name (git-file-name name version))
750 (sha256
751 (base32 "0qf1fxwdrnfkia0c1iz752mb9flbjl9jgh75dls51j1k8fzbl758"))))
752 (build-system pyproject-build-system)
753 (arguments
754 (list
755 #:phases
756 #~(modify-phases %standard-phases
757 (add-before 'build 'set-gpg-file-name
758 (lambda* (#:key inputs #:allow-other-keys)
759 (substitute* "libpius/constants.py"
760 (("/usr/bin/gpg2")
761 (search-input-file inputs "bin/gpg")))))
762 (replace 'check
763 (lambda* (#:key tests? test-flags #:allow-other-keys)
764 (when tests?
765 (invoke "./run_tests")))))))
766 (native-inputs (list python-setuptools))
767 (inputs (list perl ;for 'pius-party-worksheet'
768 gnupg))
769 (synopsis "Programs to simplify GnuPG key signing")
770 (description
771 "Pius (PGP Individual UID Signer) helps attendees of PGP key signing
772parties. It is the main utility and makes it possible to quickly and easily
773sign each UID on a set of PGP keys. It is designed to take the pain out of
774the sign-all-the-keys part of PGP key signing parties while adding security to
775the process. The @command{pius-keyring-mgr} and
776@command{pius-party-worksheet} commands help organizers of PGP key signing
777parties.")
778 (license license:gpl2)
779 (home-page "https://github.com/jaymzh/pius"))))
780
781(define-public signing-party
782 (package
783 (name "signing-party")
784 (version "2.12")
785 (home-page "https://salsa.debian.org/signing-party-team/signing-party")
786 (source (origin
787 (method git-fetch)
788 (uri (git-reference
789 (url home-page)
790 (commit (string-append "v" version))))
791 (file-name (git-file-name name version))
792 (sha256
793 (base32
794 "1a4x02rcs5ryvfnhb6naiwc5jsil5k1fh8b01fkijkbzbh54qjc5"))))
795 (build-system gnu-build-system)
796 (native-inputs
797 ;; autoconf-wrapper is required due to the non-standard
798 ;; 'configure phase.
799 (list autoconf-wrapper automake))
800 (inputs (list bash-minimal
801 perl
802 perl-text-template
803 perl-mime-tools
804 perl-gnupg-interface
805 perl-net-idn-encode
806 libmd))
807 (arguments
808 (list #:tests? #f ; no test suite
809 #:phases
810 #~(modify-phases %standard-phases
811 (replace 'configure
812 (lambda _
813 (substitute* "keyanalyze/Makefile"
814 (("LDLIBS")
815 (string-append "CC=" (which "gcc") "\nLDLIBS")))
816 (substitute* "keyanalyze/Makefile"
817 (("\\./configure")
818 (string-append "./configure --prefix=" #$output)))
819 (substitute* "gpgwrap/Makefile"
820 (("\\} clean")
821 (string-append
822 "} clean\ninstall:\n\tinstall -D bin/gpgwrap "
823 #$output "/bin/gpgwrap\n")))
824 (substitute* '("gpgsigs/Makefile" "keyanalyze/Makefile"
825 "keylookup/Makefile" "sig2dot/Makefile"
826 "springgraph/Makefile")
827 (("/usr") #$output))
828 (setenv "CONFIG_SHELL" (which "sh"))))
829 (replace 'install
830 (lambda* (#:key #:allow-other-keys #:rest args)
831 (let ((install (assoc-ref %standard-phases 'install)))
832 (apply install args)
833 (for-each
834 (lambda (dir file)
835 (copy-file (string-append dir "/" file)
836 (string-append #$output "/bin/" file)))
837 '("caff" "caff" "caff" "gpgdir" "gpg-key2ps"
838 "gpglist" "gpg-mailkeys" "gpgparticipants")
839 '("caff" "pgp-clean" "pgp-fixkey" "gpgdir" "gpg-key2ps"
840 "gpglist" "gpg-mailkeys" "gpgparticipants"))
841 (for-each
842 (lambda (dir file)
843 (copy-file
844 (string-append dir "/" file)
845 (string-append #$output "/share/man/man1/" file)))
846 '("caff" "caff" "caff" "gpgdir"
847 "gpg-key2ps" "gpglist" "gpg-mailkeys"
848 "gpgparticipants" "gpgsigs" "gpgwrap/doc"
849 "keyanalyze" "keyanalyze/pgpring" "keyanalyze")
850 '("caff.1" "pgp-clean.1" "pgp-fixkey.1" "gpgdir.1"
851 "gpg-key2ps.1" "gpglist.1" "gpg-mailkeys.1"
852 "gpgparticipants.1" "gpgsigs.1" "gpgwrap.1"
853 "process_keys.1" "pgpring.1" "keyanalyze.1")))))
854 (add-after 'install 'wrap-programs
855 (lambda _
856 (wrap-program
857 (string-append #$output "/bin/caff")
858 `("PERL5LIB" ":" prefix (,(getenv "PERL5LIB")))))))))
859 (synopsis "Collection of scripts for simplifying gnupg key signing")
860 (description
861 "Signing-party is a collection for all kinds of PGP/GnuPG related things,
862including tools for signing keys, keyring analysis, and party preparation.
863@enumerate
864@item caff: CA - Fire and Forget signs and mails a key
865@item pgp-clean: removes all non-self signatures from key
866@item pgp-fixkey: removes broken packets from keys
867@item gpg-mailkeys: simply mail out a signed key to its owner
868@item gpg-key2ps: generate PostScript file with fingerprint paper strips
869@item gpgdir: recursive directory encryption tool
870@item gpglist: show who signed which of your UIDs
871@item gpgsigs: annotates list of GnuPG keys with already done signatures
872@item gpgparticipants: create list of party participants for the organiser
873@item gpgwrap: a passphrase wrapper
874@item keyanalyze: minimum signing distance (MSD) analysis on keyrings
875@item keylookup: ncurses wrapper around gpg --search
876@item sig2dot: converts a list of GnuPG signatures to a .dot file
877@item springgraph: creates a graph from a .dot file
878@end enumerate")
879 ;; gpl2+ for almost all programs, except for keyanalyze: gpl2
880 ;; and caff and gpgsigs: bsd-3, see
881 ;; http://packages.debian.org/changelogs/pool/main/s/signing-party/current/copyright
882 (license license:gpl2)))
883
884(define-public pinentry-tty
885 (package
886 (name "pinentry-tty")
887 (version "1.3.3")
888 (source (origin
889 (method url-fetch)
890 (uri (string-append "mirror://gnupg/pinentry/pinentry-"
891 version ".tar.bz2"))
892 (sha256
893 (base32
894 "0qsb85wad5vmzpbywdprpwwn5j1n75s7sxnavz6nxdmgsqb0z5y2"))))
895 (build-system gnu-build-system)
896 (arguments
897 `(#:configure-flags '("--enable-pinentry-tty")))
898 (inputs
899 (list ncurses libassuan
900 `(,libsecret "out")))
901 (native-inputs
902 (list pkg-config))
903 (home-page "https://gnupg.org/aegypten2/")
904 (synopsis "GnuPG's interface to passphrase input")
905 (description
906 "Pinentry provides a console that allows users to enter a passphrase when
907@code{gpg} is run and needs it.")
908 (license license:gpl2+)
909 (properties
910 '((release-monitoring-url . "https://gnupg.org/ftp/gcrypt/pinentry/")
911 (upstream-name . "pinentry")))))
912
913(define-public pinentry-emacs
914 (package
915 (inherit pinentry-tty)
916 (name "pinentry-emacs")
917 (arguments
918 `(#:configure-flags '("--enable-pinentry-emacs")))
919 (description
920 "Pinentry provides a console and an Emacs interface that allows users to
921enter a passphrase when required by @code{gpg} or other software.")))
922
923(define-public pinentry-gtk2
924 (package
925 (inherit pinentry-tty)
926 (name "pinentry-gtk2")
927 (arguments
928 `(#:configure-flags '("--enable-fallback-curses")))
929 (inputs
930 (modify-inputs inputs
931 (prepend gtk+-2 glib)))
932 (description
933 "Pinentry provides a console and a GTK+ GUI that allows users to enter a
934passphrase when @code{gpg} is run and needs it.")))
935
936(define-public pinentry-gnome3
937 (package
938 (inherit pinentry-tty)
939 (name "pinentry-gnome3")
940 (inputs
941 (modify-inputs inputs
942 (prepend gtk+-2 gcr-3 glib)))
943 (arguments
944 `(#:configure-flags '("--enable-pinentry-gnome3"
945 "--enable-fallback-curses")))
946 (description
947 "Pinentry provides a console and a GUI designed for use with GNOME@tie{}3
948that allows users to enter a passphrase when required by @code{gpg} or other
949software.")))
950
951(define-public pinentry-qt
952 (package
953 (inherit pinentry-tty)
954 (name "pinentry-qt")
955 (arguments
956 (list #:configure-flags
957 #~(list "--enable-fallback-curses")
958 #:imported-modules
959 (append %default-gnu-imported-modules
960 %qt-build-system-modules)
961 #:modules
962 '((guix build utils)
963 (guix build gnu-build-system)
964 ((guix build qt-build-system) #:prefix qt:))
965 #:phases
966 #~(modify-phases %standard-phases
967 (add-after 'install 'qt-wrap
968 (lambda args
969 (apply (assoc-ref qt:%standard-phases 'qt-wrap)
970 #:qtbase #$(this-package-input "qtbase")
971 args))))))
972 (inputs
973 (modify-inputs inputs
974 (prepend qtbase qtwayland)))
975 (description
976 "Pinentry provides a console and a Qt GUI that allows users to enter a
977passphrase when @code{gpg} is run and needs it.")))
978
979(define-public pinentry-efl
980 (package
981 (inherit pinentry-tty)
982 (name "pinentry-efl")
983 (arguments
984 '(#:configure-flags '("--enable-pinentry-efl"
985 "--enable-fallback-curses")
986 #:phases
987 (modify-phases %standard-phases
988 (replace 'bootstrap
989 (lambda _
990 (invoke "sh" "autogen.sh"))))))
991 (native-inputs
992 (modify-inputs native-inputs
993 (prepend autoconf automake gettext-minimal)))
994 (inputs
995 (modify-inputs inputs
996 (prepend efl)))
997 (description
998 "Pinentry provides a console and a graphical interface for @acronym{EFL,
999the Enlightenment Foundation Libraries} that allows users to enter a
1000passphrase when @code{gpg} is run and needs it.")))
1001
1002(define-public pinentry-rofi
1003 (package
1004 (name "pinentry-rofi")
1005 (version "3.0.0")
1006 (source (origin
1007 (method git-fetch)
1008 (uri (git-reference
1009 (url "https://github.com/plattfot/pinentry-rofi/")
1010 (commit version)))
1011 (file-name (git-file-name name version))
1012 (sha256
1013 (base32 "0m3lv6cydx2jg7743m6lab0v1myz84xys9z2sdb1b9jiq4xmayhq"))))
1014 (build-system gnu-build-system)
1015 (arguments
1016 `(#:modules
1017 ((ice-9 match)
1018 (ice-9 ftw)
1019 ,@%default-gnu-modules)
1020 #:phases
1021 (modify-phases
1022 %standard-phases
1023 (add-after 'install 'hall-wrap-binaries
1024 (lambda* (#:key inputs outputs #:allow-other-keys)
1025 (let* ((out (assoc-ref outputs "out"))
1026 (bin (string-append out "/bin/"))
1027 (site (string-append out "/share/guile/site"))
1028 (rofi-bin (string-append (assoc-ref inputs "rofi") "/bin")))
1029 (match (scandir site)
1030 (("." ".." version)
1031 (wrap-program
1032 (string-append bin "pinentry-rofi")
1033 (list "PATH" ":" 'prefix `(,rofi-bin))))))))
1034 (add-after 'compress-documentation 'installcheck
1035 (lambda* rest
1036 (invoke "make" "installcheck"))))))
1037 (native-inputs
1038 (list autoconf autoconf-archive automake pkg-config texinfo))
1039 (inputs (list bash-minimal guile-3.0 rofi))
1040 (synopsis "Rofi GUI for GnuPG's passphrase input")
1041 (description "Pinentry-rofi is a simple graphical user interface for
1042passphrase or PIN when required by @code{gpg} or other software. It is using
1043the Rofi application launcher as the user interface. Which makes it combined
1044with @code{rofi-pass} a good front end for @code{password-store}.")
1045 (home-page "https://github.com/plattfot/pinentry-rofi/")
1046 (license license:gpl3+)))
1047
1048(define-public pinentry-bemenu
1049 (package
1050 (name "pinentry-bemenu")
1051 (version "0.14.0")
1052 (source
1053 (origin
1054 (method git-fetch)
1055 (uri (git-reference
1056 (url "https://github.com/t-8ch/pinentry-bemenu")
1057 (commit (string-append "v" version))))
1058 (file-name (git-file-name name version))
1059 (sha256
1060 (base32 "0sh2182p5674m50vphir53jpq4p2i8ld6asfihbryjq8qh4r88cj"))))
1061 (build-system meson-build-system)
1062 (native-inputs
1063 (list pkg-config))
1064 (inputs
1065 (list bemenu libassuan libgpg-error popt))
1066 (home-page "https://github.com/t-8ch/pinentry-bemenu")
1067 (synopsis "Pinentry implementation based on @code{bemenu}")
1068 (description
1069 "This package provides a Pinentry implementation based on Bemenu.")
1070 (license license:gpl3+)))
1071
1072(define-public pinentry-fuzzel
1073 (package
1074 (name "pinentry-fuzzel")
1075 (version "1.0.0")
1076 (source
1077 (origin
1078 (method git-fetch)
1079 (uri (git-reference
1080 (url "https://github.com/JonasToth/pinentry-fuzzel")
1081 (commit (string-append "v" version))))
1082 (file-name (git-file-name name version))
1083 (sha256
1084 (base32 "1ykmxckiy361rl4aj3bkyihx1639x61ic4995yxkqr9r4vc7zha1"))))
1085 (build-system copy-build-system)
1086 (arguments
1087 (list #:install-plan
1088 #~'(("pinentry-fuzzel" "bin/"))
1089 #:phases
1090 #~(modify-phases %standard-phases
1091 (add-after 'unpack 'patch-scripts
1092 (lambda* (#:key inputs #:allow-other-keys)
1093 (substitute* "pinentry-fuzzel"
1094 (("fuzzel") (search-input-file inputs "bin/fuzzel"))))))))
1095 (inputs
1096 (list fuzzel))
1097 (synopsis "Pinentry implementation based on @code{fuzzel}")
1098 (description
1099 "This package provides a very simple Pinentry implementation based
1100on Fuzzel.")
1101 (home-page "https://github.com/JonasToth/pinentry-fuzzel")
1102 (license license:gpl3)))
1103
1104(define-public pinentry
1105 (package (inherit pinentry-gtk2)
1106 (name "pinentry")))
1107
1108(define-public paperkey
1109 (package
1110 (name "paperkey")
1111 (version "1.6")
1112 (source (origin
1113 (method url-fetch)
1114 (uri (string-append "https://www.jabberwocky.com/"
1115 "software/paperkey/paperkey-"
1116 version ".tar.gz"))
1117 (sha256
1118 (base32
1119 "1xq5gni6gksjkd5avg0zpd73vsr97appksfx0gx2m38s4w9zsid2"))))
1120 (build-system gnu-build-system)
1121 (arguments
1122 `(#:phases
1123 (modify-phases %standard-phases
1124 (add-before 'check 'patch-check-scripts
1125 (lambda _
1126 (substitute* '("checks/roundtrip.sh"
1127 "checks/roundtrip-raw.sh")
1128 (("/bin/echo") "echo"))
1129 #t)))))
1130 (home-page "https://www.jabberwocky.com/software/paperkey/")
1131 (synopsis "Backup OpenPGP keys to paper")
1132 (description
1133 "Paperkey extracts the secret bytes from an OpenPGP (GnuPG, PGP, etc) key
1134for printing with paper and ink, which have amazingly long retention
1135qualities. To reconstruct a secret key, you re-enter those
1136bytes (whether by hand, OCR, QR code, or the like) and paperkey can use
1137them to transform your existing public key into a secret key.")
1138 (license license:gpl2+)))
1139
1140(define-public pgpdump
1141 (package
1142 (name "pgpdump")
1143 (version "0.35")
1144 (source
1145 (origin
1146 (method url-fetch)
1147 (uri (string-append "https://www.mew.org/~kazu/proj/pgpdump/pgpdump-"
1148 version ".tar.gz"))
1149 (sha256
1150 (base32 "0kslr62h3wazg4x0l38lsmswvh2dizpnwcrdsmqz62b3plnr40jf"))))
1151 (build-system gnu-build-system)
1152 (arguments
1153 (list #:tests? #f ; no make check
1154 #:make-flags
1155 #~(list (string-append "CC=" #$(cc-for-target)))))
1156 (inputs
1157 (list zlib))
1158 (home-page "https://www.mew.org/~kazu/proj/pgpdump/en/")
1159 (synopsis "PGP packet visualizer")
1160 (description "pgpdump displays the sequence of OpenPGP or PGP version 2
1161packets from a file.
1162
1163The output of this command is similar to GnuPG's list packets command,
1164however, pgpdump produces more detailed and easier to understand output.")
1165 (license license:bsd-3)))
1166
1167(define-public gpa
1168 (package
1169 (name "gpa")
1170 (version "0.11.1")
1171 (source (origin
1172 (method url-fetch)
1173 (uri (string-append "mirror://gnupg/gpa/"
1174 name "-" version ".tar.bz2"))
1175 (sha256
1176 (base32
1177 "02sx9my3s4yjxzxzs8pfif8wvpjrjsh75wwa5mxd0h867v6v5i8b"))))
1178 (build-system gnu-build-system)
1179 (arguments
1180 (list #:make-flags #~(list "CFLAGS=-Wno-implicit-function-declaration")
1181 #:phases
1182 #~(modify-phases %standard-phases
1183 (add-after 'install 'wrap-program
1184 (lambda* (#:key inputs #:allow-other-keys)
1185 (let ((gnupg (assoc-ref inputs "gnupg")))
1186 (wrap-program (string-append #$output "/bin/gpa")
1187 `("PATH" ":" prefix (,(string-append gnupg "/bin"))))))))))
1188 (native-inputs (list pkg-config))
1189 (inputs
1190 (list bash-minimal
1191 gnupg
1192 gpgme
1193 libassuan
1194 libgpg-error
1195 gtk+))
1196 (home-page "https://gnupg.org/software/gpa/")
1197 (synopsis "Graphical user interface for GnuPG")
1198 (description
1199 "GPA, the GNU Privacy Assistant, is a graphical user interface for
1200@uref{https://gnupg.org, GnuPG}. It can be used to encrypt, decrypt, and sign
1201files, to verify signatures, and to manage the private and public keys.")
1202 (license license:gpl3+)))
1203
1204(define-public parcimonie
1205 (package
1206 (name "parcimonie")
1207 (version "0.12.0")
1208 (source (origin
1209 (method url-fetch)
1210 (uri (string-append "https://gaffer.boum.org/intrigeri/files/"
1211 "parcimonie/App-Parcimonie-"
1212 version ".tar.gz"))
1213 (sha256
1214 (base32
1215 "10gal2h8ihg7nnzy3adw942axd2ia1rcn1fw3a3v07n5mm8kqrx9"))))
1216 (build-system perl-build-system)
1217 (inputs
1218 (list bash-minimal
1219 gnupg
1220 perl-clone
1221 perl-config-general
1222 perl-file-homedir
1223 perl-file-sharedir
1224 perl-file-which
1225 perl-gnupg-interface
1226 perl-ipc-system-simple
1227 perl-json
1228 perl-list-moreutils
1229 perl-moo
1230 perl-moox-late
1231 perl-moox-options
1232 perl-moox-strictconstructor
1233 perl-namespace-clean
1234 perl-net-dbus
1235 perl-pango
1236 perl-path-tiny
1237 perl-time-duration
1238 perl-time-duration-parse
1239 perl-try-tiny
1240 perl-type-tiny
1241 perl-types-path-tiny
1242 torsocks))
1243 (native-inputs
1244 (list perl-file-which
1245 perl-gnupg-interface
1246 perl-list-moreutils
1247 perl-lwp-online
1248 perl-module-build
1249 perl-strictures-2
1250 perl-test-most
1251 perl-test-trap
1252 xorg-server-for-tests))
1253 (arguments
1254 (list
1255 #:phases
1256 #~(modify-phases %standard-phases
1257 ;; Needed for using gpg-connect-agent during tests.
1258 (add-before 'check 'prepare-for-tests
1259 (lambda* (#:key inputs #:allow-other-keys)
1260 (let ((Xvfb (search-input-file inputs "/bin/Xvfb")))
1261 (system (string-append Xvfb " :1 &"))
1262 (setenv "DISPLAY" ":1")
1263 (setenv "HOME" "/tmp")
1264 ;; These tests expect usable gnupg configurations.
1265 (delete-file "t/32-keyserver_defined_on_command_line.t")
1266 (delete-file "t/33-checkGpgHasDefinedKeyserver.t"))))
1267 (add-before 'install 'fix-references
1268 (lambda _
1269 (substitute* "lib/App/Parcimonie/GnuPG/Interface.pm"
1270 ;; Skip check whether dependencies are in the PATH
1271 (("defined which.*") ""))))
1272 (add-after 'install 'wrap-program
1273 (lambda _
1274 (let* ((perllib (string-append #$output "/lib/perl5/site_perl/"
1275 #$(package-version perl))))
1276 (wrap-program (string-append #$output "/bin/parcimonie")
1277 `("PERL5LIB" ":" prefix
1278 (,(string-append perllib ":" (getenv "PERL5LIB")))))))))))
1279 (home-page "https://salsa.debian.org/intrigeri/parcimonie")
1280 (synopsis "Incrementally refreshes a GnuPG keyring")
1281 (description "Parcimonie incrementally refreshes a GnuPG keyring in a way
1282that makes it hard to correlate the keyring content to an individual, and
1283makes it hard to locate an individual based on an identifying subset of her
1284keyring content. Parcimonie is a daemon that fetches one key at a time using
1285the Tor network, waits a bit, changes the Tor circuit being used, and starts
1286over.")
1287 (properties '((upstream-name . "App-Parcimonie")))
1288 (license license:gpl1+)))
1289
1290(define-public jetring
1291 (package
1292 (name "jetring")
1293 (version "0.32")
1294 (source
1295 (origin
1296 (method git-fetch)
1297 (uri (git-reference
1298 (url "https://salsa.debian.org/debian/jetring")
1299 (commit (string-append "debian/" version))))
1300 (file-name (git-file-name name version))
1301 (sha256
1302 (base32 "0drw04iw0bp6xsb40wdbji6xkxgiyzix1mikpkc61ljfy35mg9m1"))))
1303 (build-system gnu-build-system)
1304 (arguments
1305 (list
1306 #:phases
1307 #~(modify-phases %standard-phases
1308 (delete 'configure) ; no configure script
1309 (add-before 'install 'hardlink-gnupg
1310 (lambda* (#:key inputs #:allow-other-keys)
1311 (let ((gpg (search-input-file inputs "/bin/gpg")))
1312 (substitute* (find-files "." "jetring-[[:alpha:]]+$")
1313 (("gpg -") (string-append gpg " -"))
1314 (("\\\"gpg\\\"") (string-append "\"" gpg "\""))))))
1315 (replace 'install
1316 (lambda _
1317 (for-each
1318 (lambda (file)
1319 (install-file file
1320 (string-append #$output "/bin/")))
1321 (find-files "." "jetring-[[:alpha:]]+$"))
1322 (for-each
1323 (lambda (file)
1324 (install-file file
1325 (string-append #$output "/share/man/man1/")))
1326 (find-files "." ".*\\.1$"))
1327 (install-file "jetring.7"
1328 (string-append #$output "/share/man/man7/")))))
1329 #:tests? #f)) ; no tests
1330 (inputs
1331 (list gnupg perl))
1332 (home-page "https://joeyh.name/code/jetring/")
1333 (synopsis "GnuPG keyring maintenance using changesets")
1334 (description
1335 "Jetring is a collection of tools that allow for gpg keyrings to be
1336maintained using changesets. It was developed with the Debian keyring in mind,
1337and aims to solve the problem that a gpg keyring is a binary blob that's hard
1338for multiple people to collaboratively edit.
1339
1340With jetring, changesets can be submitted, reviewed to see exactly what they
1341will do, applied, and used to build a keyring. The origin of every change made
1342to the keyring is available for auditing, and gpg signatures can be used for
1343integrity guarantees.")
1344 (license license:gpl2+)))