doc: Fix some typos.
[jackhill/guix/guix.git] / gnu / packages / tls.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
aa2441c2 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
05f6e601 3;;; Copyright © 2014, 2015, 2016, 2017, 2018 Mark H Weaver <mhw@netris.org>
29a7c98a 4;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
cc2b77df 5;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
9fd0838b 6;;; Copyright © 2015 David Thompson <davet@gnu.org>
ea22aa1f 7;;; Copyright © 2015, 2016, 2017, 2018, 2019 Leo Famulari <leo@famulari.name>
2850d877 8;;; Copyright © 2016, 2017, 2019 Efraim Flashner <efraim@flashner.co.il>
47956fa0 9;;; Copyright © 2016, 2017, 2018 ng0 <ng0@n0.is>
375cef6c 10;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
ee33f9a7 11;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
e74f153a 12;;; Copyright © 2017, 2018, 2019 Marius Bakke <mbakke@fastmail.com>
a92c6b1a 13;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
fbf5ca3c 14;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com>
e8b3a158 15;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
7543f865 16;;;
233e7676 17;;; This file is part of GNU Guix.
7543f865 18;;;
233e7676 19;;; GNU Guix is free software; you can redistribute it and/or modify it
7543f865
LC
20;;; under the terms of the GNU General Public License as published by
21;;; the Free Software Foundation; either version 3 of the License, or (at
22;;; your option) any later version.
23;;;
233e7676 24;;; GNU Guix is distributed in the hope that it will be useful, but
7543f865
LC
25;;; WITHOUT ANY WARRANTY; without even the implied warranty of
26;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27;;; GNU General Public License for more details.
28;;;
29;;; You should have received a copy of the GNU General Public License
233e7676 30;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
7543f865 31
a7fd7b68 32(define-module (gnu packages tls)
e9aa8d0c 33 #:use-module ((guix licenses) #:prefix license:)
7543f865
LC
34 #:use-module (guix packages)
35 #:use-module (guix download)
ea22aa1f 36 #:use-module (guix git-download)
29a7c98a 37 #:use-module (guix utils)
7543f865 38 #:use-module (guix build-system gnu)
ea22aa1f 39 #:use-module (guix build-system go)
cc2b77df 40 #:use-module (guix build-system perl)
7890e3ba 41 #:use-module (guix build-system python)
88522738 42 #:use-module (guix build-system cmake)
e8b3a158 43 #:use-module (guix build-system trivial)
f61e0e79 44 #:use-module (gnu packages compression)
013ce67b 45 #:use-module (gnu packages)
e8b3a158 46 #:use-module (gnu packages bash)
ac257f12 47 #:use-module (gnu packages check)
e8b3a158 48 #:use-module (gnu packages curl)
5b9aa107 49 #:use-module (gnu packages dns)
e8b3a158 50 #:use-module (gnu packages gawk)
1ffa7090 51 #:use-module (gnu packages guile)
0581c273 52 #:use-module (gnu packages libbsd)
27e86bed 53 #:use-module (gnu packages libffi)
866f469e 54 #:use-module (gnu packages libidn)
5d4c90ae 55 #:use-module (gnu packages linux)
7890e3ba 56 #:use-module (gnu packages ncurses)
27e86bed 57 #:use-module (gnu packages nettle)
1ffa7090 58 #:use-module (gnu packages perl)
27e86bed 59 #:use-module (gnu packages pkg-config)
7890e3ba 60 #:use-module (gnu packages python)
cc6f4912 61 #:use-module (gnu packages python-crypto)
1b2f753d 62 #:use-module (gnu packages python-web)
44d10b1f 63 #:use-module (gnu packages python-xyz)
9d0c291e 64 #:use-module (gnu packages sphinx)
a31f4d35 65 #:use-module (gnu packages texinfo)
33dc54b0 66 #:use-module (gnu packages time)
079f013b
LC
67 #:use-module (gnu packages base)
68 #:use-module (srfi srfi-1))
7543f865
LC
69
70(define-public libtasn1
71 (package
72 (name "libtasn1")
d7342997 73 (version "4.14")
7543f865
LC
74 (source
75 (origin
76 (method url-fetch)
77 (uri (string-append "mirror://gnu/libtasn1/libtasn1-"
78 version ".tar.gz"))
79 (sha256
80 (base32
d7342997 81 "025sqnlzji78ss2fi78dajc0v0h5fi02wp39hws41sn8qnjlnq4y"))))
7543f865 82 (build-system gnu-build-system)
d9f84612
MB
83 (arguments
84 `(#:configure-flags '("--disable-static")))
3ea110b7 85 (native-inputs `(("perl" ,perl)))
6fd52309 86 (home-page "https://www.gnu.org/software/libtasn1/")
f50d2669 87 (synopsis "ASN.1 library")
7543f865 88 (description
79c311b8
LC
89 "GNU libtasn1 is a library implementing the ASN.1 notation. It is used
90for transmitting machine-neutral encodings of data objects in computer
a22dc0c4
LC
91networking, allowing for formal validation of data according to some
92specifications.")
e9aa8d0c 93 (license license:lgpl2.0+)))
7543f865 94
375cef6c
HG
95(define-public asn1c
96 (package
97 (name "asn1c")
ff7da7e0 98 (version "0.9.28")
375cef6c
HG
99 (source (origin
100 (method url-fetch)
101 (uri (string-append "https://lionet.info/soft/asn1c-"
102 version ".tar.gz"))
103 (sha256
104 (base32
ff7da7e0 105 "1fc64g45ykmv73kdndr4zdm4wxhimhrir4rxnygxvwkych5l81w0"))))
375cef6c
HG
106 (build-system gnu-build-system)
107 (native-inputs
108 `(("perl" ,perl)))
109 (home-page "https://lionet.info/asn1c")
110 (synopsis "ASN.1 to C compiler")
111 (description "The ASN.1 to C compiler takes ASN.1 module
112files and generates C++ compatible C source code. That code can be
113used to serialize the native C structures into compact and unambiguous
114BER/XER/PER-based data files, and deserialize the files back.
115
116Various ASN.1 based formats are widely used in the industry, such as to encode
117the X.509 certificates employed in the HTTPS handshake, to exchange control
118data between mobile phones and cellular networks, to car-to-car communication
119in intelligent transportation networks.")
120 (license license:bsd-2)))
121
27e86bed
AE
122(define-public p11-kit
123 (package
124 (name "p11-kit")
8c98ef7d 125 (version "0.23.20")
27e86bed
AE
126 (source
127 (origin
128 (method url-fetch)
e6ad9bda 129 (uri (string-append "https://github.com/p11-glue/p11-kit/releases/"
eae94df6 130 "download/" version "/p11-kit-" version ".tar.xz"))
27e86bed
AE
131 (sha256
132 (base32
8c98ef7d 133 "0131maw666ha4d6iyj13fkz18c4pnb3lw2xwv5kvkmnzqcj61n0l"))))
27e86bed
AE
134 (build-system gnu-build-system)
135 (native-inputs
136 `(("pkg-config" ,pkg-config)))
137 (inputs
138 `(("libffi" ,libffi)
139 ("libtasn1" ,libtasn1)))
140 (arguments
d5c472a2
MB
141 `(#:configure-flags '("--without-trust-paths")
142 #:phases (modify-phases %standard-phases
143 (add-before 'check 'prepare-tests
144 (lambda _
145 ;; "test-runtime" expects XDG_RUNTIME_DIR to be set up
146 ;; and looks for .cache and other directories (only).
147 ;; For simplicity just drop it since it is irrelevant
148 ;; in the build container.
149 (substitute* "Makefile"
150 (("test-runtime\\$\\(EXEEXT\\)") ""))
151 #t)))))
4631e6c9 152 (home-page "https://p11-glue.freedesktop.org/p11-kit.html")
27e86bed
AE
153 (synopsis "PKCS#11 library")
154 (description
155 "p11-kit provides a way to load and enumerate PKCS#11 modules. It
156provides a standard configuration setup for installing PKCS#11 modules
157in such a way that they are discoverable. It also solves problems with
158coordinating the use of PKCS#11 by different components or libraries
159living in the same process.")
e9aa8d0c 160 (license license:bsd-3)))
27e86bed 161
7543f865
LC
162(define-public gnutls
163 (package
164 (name "gnutls")
bffe4305 165 (version "3.6.9")
d7d408d5
LC
166 (source (origin
167 (method url-fetch)
168 (uri
169 ;; Note: Releases are no longer on ftp.gnu.org since the
170 ;; schism (after version 3.1.5).
d93627e4 171 (string-append "mirror://gnupg/gnutls/v"
29a7c98a 172 (version-major+minor version)
d93627e4 173 "/gnutls-" version ".tar.xz"))
06f5bc4e 174 (patches (search-patches "gnutls-skip-trust-store-test.patch"))
d7d408d5
LC
175 (sha256
176 (base32
bffe4305 177 "1jqz5s3lv8sa53348cfi9nr5pw5l55n8m40b8msdvv0pb2jzqca3"))))
7543f865 178 (build-system gnu-build-system)
b94ae0b8 179 (arguments
76b21274
LF
180 `(; Ensure we don't keep a reference to this buggy software.
181 #:disallowed-references (,net-tools)
182 #:configure-flags
a0700787 183 (list
aa7c7f21
MW
184 ;; GnuTLS doesn't consult any environment variables to specify
185 ;; the location of the system-wide trust store. Instead it has a
186 ;; configure-time option. Unless specified, its configure script
187 ;; attempts to auto-detect the location by looking for common
8f65585b 188 ;; places in the file system, none of which are present in our
aa7c7f21
MW
189 ;; chroot build environment. If not found, then no default trust
190 ;; store is used, so each program has to provide its own
191 ;; fallback, and users have to configure each program
192 ;; independently. This seems suboptimal.
866f469e
MW
193 "--with-default-trust-store-dir=/etc/ssl/certs"
194
7892edc2
MB
195 ;; Tell the build system that we want Guile bindings installed to
196 ;; the output instead of Guiles own module directory.
197 (string-append "--with-guile-site-dir="
198 "$(datarootdir)/guile/site/$(GUILE_EFFECTIVE_VERSION)")
199 (string-append "--with-guile-site-ccache-dir="
200 "$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache")
201 (string-append "--with-guile-extension-dir="
202 "$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/extensions")
203
866f469e
MW
204 ;; FIXME: Temporarily disable p11-kit support since it is not
205 ;; working on mips64el.
606c6380
LC
206 "--without-p11-kit")
207
208 #:phases (modify-phases %standard-phases
209 (add-after
210 'install 'move-doc
211 (lambda* (#:key outputs #:allow-other-keys)
212 ;; Copy the 4.1 MiB of section 3 man pages to "doc".
213 (let* ((out (assoc-ref outputs "out"))
214 (doc (assoc-ref outputs "doc"))
9cdce047 215 (mandir (string-append doc "/share/man/man3"))
606c6380
LC
216 (oldman (string-append out "/share/man/man3")))
217 (mkdir-p mandir)
218 (copy-recursively oldman mandir)
219 (delete-file-recursively oldman)
220 #t))))))
221 (outputs '("out" ;4.4 MiB
222 "debug"
223 "doc")) ;4.1 MiB of man pages
a1db0975 224 (native-inputs
c06d8ba5 225 `(("net-tools" ,net-tools)
5d4c90ae 226 ("pkg-config" ,pkg-config)
d2fcfd3d 227 ("which" ,which)))
7543f865 228 (inputs
a0700787 229 `(("guile" ,guile-2.2)))
7543f865 230 (propagated-inputs
d2fcfd3d 231 ;; These are all in the 'Requires.private' field of gnutls.pc.
7543f865 232 `(("libtasn1" ,libtasn1)
55e61c4d 233 ("libidn2" ,libidn2)
866f469e 234 ("nettle" ,nettle)
f61e0e79 235 ("zlib" ,zlib)))
c19700c3 236 (home-page "https://www.gnu.org/software/gnutls/")
f50d2669 237 (synopsis "Transport layer security library")
7543f865 238 (description
a22dc0c4 239 "GnuTLS is a secure communications library implementing the SSL, TLS
79c311b8 240and DTLS protocols. It is provided in the form of a C library to support the
a22dc0c4
LC
241protocols, as well as to parse and write X.5009, PKCS 12, OpenPGP and other
242required structures.")
63e8bb12
LC
243 (license license:lgpl2.1+)
244 (properties '((ftp-server . "ftp.gnutls.org")
245 (ftp-directory . "/gcrypt/gnutls")))))
cc2b77df 246
a0700787
LC
247(define-public gnutls/guile-2.0
248 ;; GnuTLS for Guile 2.0.
079f013b 249 (package
58ea4d40 250 (inherit gnutls)
a0700787
LC
251 (name "guile2.0-gnutls")
252 (inputs `(("guile" ,guile-2.0)
58ea4d40 253 ,@(alist-delete "guile" (package-inputs gnutls))))))
079f013b 254
5b9aa107 255(define-public gnutls/dane
256 ;; GnuTLS with build libgnutls-dane, implementing DNS-based
257 ;; Authentication of Named Entities. This is required for GNS functionality
258 ;; by GNUnet and gnURL. This is done in an extra package definition
259 ;; to have the choice between GnuTLS with Dane and without Dane.
260 (package
261 (inherit gnutls)
262 (name "gnutls-dane")
263 (inputs `(("unbound" ,unbound)
264 ,@(package-inputs gnutls)))))
265
d630d781
LC
266(define gnutls-3.6.10
267 ;; This is for 'guile3.0-gnutls', below. Version 3.6.10 is the first to
268 ;; introduce Guile 2.9/3.0 support.
269 (package
270 (inherit gnutls)
271 (version "3.6.10")
272 (source (origin
273 (inherit (package-source gnutls))
274 (uri (string-append "mirror://gnupg/gnutls/v"
275 (version-major+minor version)
276 "/gnutls-" version ".tar.xz"))
277 (sha256
278 (base32
279 "14r2h73yfj66cm14k9mnb3kgzq5a7qjg5b31m53bf19vcxkwmwxi"))))))
280
281(define-public guile3.0-gnutls
282 (package
283 (inherit gnutls-3.6.10)
284 (name "guile3.0-gnutls")
285 (arguments
286 (substitute-keyword-arguments (package-arguments gnutls-3.6.10)
287 ((#:phases phases '%standard-phases)
288 `(modify-phases ,phases
289 (add-before 'build 'leave-guile-stdout-open
290 (lambda _
291 ;; Work around <https://bugs.gnu.org/38348>.
292 (substitute* "guile/Makefile"
293 (("out=-") "out=/dev/null"))
294 #t))))))
295 (inputs `(("guile" ,guile-next)
296 ,@(alist-delete "guile"
297 (package-inputs gnutls-3.6.10))))))
298
cc2b77df
AE
299(define-public openssl
300 (package
301 (name "openssl")
d9bbfe04 302 (version "1.1.1c")
9ff87bb9 303 (replacement openssl-1.1.1d)
cc2b77df 304 (source (origin
4cff124b 305 (method url-fetch)
bdf0b6fc
MB
306 (uri (list (string-append "https://www.openssl.org/source/openssl-"
307 version ".tar.gz")
308 (string-append "ftp://ftp.openssl.org/source/"
c7f5c3ea 309 "openssl-" version ".tar.gz")
4cff124b
LC
310 (string-append "ftp://ftp.openssl.org/source/old/"
311 (string-trim-right version char-set:letter)
c7f5c3ea 312 "/openssl-" version ".tar.gz")))
4cff124b
LC
313 (sha256
314 (base32
d9bbfe04 315 "142c7zdlz06hjrrvinb9f276czc78bnkyhd9xma621qmmmwk1yzn"))
e74f153a 316 (patches (search-patches "openssl-1.1-c-rehash-in.patch"))))
cc2b77df 317 (build-system gnu-build-system)
8c78aeb7 318 (outputs '("out"
e74f153a
MB
319 "doc" ;6.8 MiB of man3 pages and full HTML documentation
320 "static")) ;6.4 MiB of .a files
cc2b77df
AE
321 (native-inputs `(("perl" ,perl)))
322 (arguments
d03781c3
LC
323 `(#:disallowed-references (,perl)
324 #:parallel-build? #f
cc2b77df
AE
325 #:parallel-tests? #f
326 #:test-target "test"
8c9ec203
LF
327
328 ;; Changes to OpenSSL sometimes cause Perl to "sneak in" to the closure,
329 ;; so we explicitly disallow it here.
330 #:disallowed-references ,(list (canonical-package perl))
cc2b77df 331 #:phases
b6cb1358 332 (modify-phases %standard-phases
e74f153a
MB
333 (replace 'configure
334 (lambda* (#:key outputs #:allow-other-keys)
335 (let* ((out (assoc-ref outputs "out"))
336 (lib (string-append out "/lib")))
337 ;; It's not a shebang so patch-source-shebangs misses it.
338 (substitute* "config"
339 (("/usr/bin/env")
340 (string-append (assoc-ref %build-inputs "coreutils")
341 "/bin/env")))
342 (invoke "./config"
343 "shared" ;build shared libraries
344 "--libdir=lib"
4fb254a3 345
e74f153a
MB
346 ;; The default for this catch-all directory is
347 ;; PREFIX/ssl. Change that to something more
348 ;; conventional.
349 (string-append "--openssldir=" out
350 "/share/openssl-" ,version)
4fb254a3 351
e74f153a
MB
352 (string-append "--prefix=" out)
353 (string-append "-Wl,-rpath," lib)))))
8c78aeb7
LC
354 (add-after 'install 'move-static-libraries
355 (lambda* (#:key outputs #:allow-other-keys)
356 ;; Move static libraries to the "static" output.
357 (let* ((out (assoc-ref outputs "out"))
358 (lib (string-append out "/lib"))
359 (static (assoc-ref outputs "static"))
360 (slib (string-append static "/lib")))
8c78aeb7
LC
361 (for-each (lambda (file)
362 (install-file file slib)
363 (delete-file file))
364 (find-files lib "\\.a$"))
365 #t)))
e74f153a 366 (add-after 'install 'move-extra-documentation
a909b576 367 (lambda* (#:key outputs #:allow-other-keys)
e74f153a
MB
368 ;; Move man3 pages and full HTML documentation to "doc".
369 (let* ((out (assoc-ref outputs "out"))
370 (man3 (string-append out "/share/man/man3"))
371 (html (string-append out "/share/doc/openssl"))
372 (doc (assoc-ref outputs "doc"))
373 (man-target (string-append doc "/share/man/man3"))
374 (html-target (string-append doc "/share/doc/openssl")))
375 (copy-recursively man3 man-target)
376 (delete-file-recursively man3)
377 (copy-recursively html html-target)
378 (delete-file-recursively html)
379 #t)))
784d6e91
LC
380 (add-after
381 'install 'remove-miscellany
382 (lambda* (#:key outputs #:allow-other-keys)
383 ;; The 'misc' directory contains random undocumented shell and Perl
384 ;; scripts. Remove them to avoid retaining a reference on Perl.
385 (let ((out (assoc-ref outputs "out")))
386 (delete-file-recursively (string-append out "/share/openssl-"
387 ,version "/misc"))
388 #t))))))
cc2b77df 389 (native-search-paths
cc2b77df
AE
390 (list (search-path-specification
391 (variable "SSL_CERT_DIR")
5d7a47cc 392 (separator #f) ;single entry
cc2b77df
AE
393 (files '("etc/ssl/certs")))
394 (search-path-specification
395 (variable "SSL_CERT_FILE")
5d7a47cc
MB
396 (file-type 'regular)
397 (separator #f) ;single entry
cc2b77df
AE
398 (files '("etc/ssl/certs/ca-certificates.crt")))))
399 (synopsis "SSL/TLS implementation")
400 (description
e881752c 401 "OpenSSL is an implementation of SSL/TLS.")
e9aa8d0c 402 (license license:openssl)
4631e6c9 403 (home-page "https://www.openssl.org/")))
cc2b77df 404
9ff87bb9 405(define openssl-1.1.1d
2e76ddd6
MB
406 (package
407 (inherit openssl)
9ff87bb9
LC
408 (version "1.1.1d")
409 (source (origin
763899f0 410 (method url-fetch)
77576be4
MB
411 (uri (list (string-append "https://www.openssl.org/source/openssl-"
412 version ".tar.gz")
413 (string-append "ftp://ftp.openssl.org/source/"
c7f5c3ea 414 "openssl-" version ".tar.gz")
763899f0
LF
415 (string-append "ftp://ftp.openssl.org/source/old/"
416 (string-trim-right version char-set:letter)
c7f5c3ea 417 "/openssl-" version ".tar.gz")))
9ff87bb9
LC
418 (patches (search-patches "openssl-1.1-c-rehash-in.patch"))
419 (sha256
420 (base32
421 "1whinyw402z3b9xlb3qaxv4b9sk4w1bgh9k0y8df1z4x3yy92fhy"))))))
422
e74f153a 423(define-public openssl-1.0
763899f0
LF
424 (package
425 (inherit openssl)
426 (name "openssl")
b0b79542 427 (version "1.0.2u")
763899f0 428 (source (origin
e74f153a
MB
429 (method url-fetch)
430 (uri (list (string-append "https://www.openssl.org/source/openssl-"
431 version ".tar.gz")
432 (string-append "ftp://ftp.openssl.org/source/"
433 "openssl-" version ".tar.gz")
434 (string-append "ftp://ftp.openssl.org/source/old/"
435 (string-trim-right version char-set:letter)
436 "/openssl-" version ".tar.gz")))
763899f0
LF
437 (sha256
438 (base32
b0b79542 439 "05lxcs4hzyfqd5jn0d9p0fvqna62v2s4pc9qgmq0dpcknkzwdl7c"))
e74f153a
MB
440 (patches (search-patches "openssl-runpath.patch"
441 "openssl-c-rehash-in.patch"))))
763899f0 442 (outputs '("out"
e74f153a
MB
443 "doc" ;1.5MiB of man3 pages
444 "static")) ;6MiB of .a files
763899f0
LF
445 (arguments
446 (substitute-keyword-arguments (package-arguments openssl)
8fc24f30
MB
447 ;; Parallel build is not supported in 1.0.x.
448 ((#:parallel-build? _ #f) #f)
763899f0
LF
449 ((#:phases phases)
450 `(modify-phases ,phases
e74f153a
MB
451 (add-before 'patch-source-shebangs 'patch-tests
452 (lambda* (#:key inputs native-inputs #:allow-other-keys)
453 (let ((bash (assoc-ref (or native-inputs inputs) "bash")))
454 (substitute* (find-files "test" ".*")
455 (("/bin/sh")
456 (string-append bash "/bin/sh"))
457 (("/bin/rm")
458 "rm"))
459 #t)))
460 (add-before 'configure 'patch-Makefile.org
763899f0 461 (lambda* (#:key outputs #:allow-other-keys)
e74f153a
MB
462 ;; The default MANDIR is some unusual place. Fix that.
463 (let ((out (assoc-ref outputs "out")))
464 (patch-makefile-SHELL "Makefile.org")
465 (substitute* "Makefile.org"
466 (("^MANDIR[[:blank:]]*=.*$")
467 (string-append "MANDIR = " out "/share/man\n")))
468 #t)))
469 (replace 'configure
470 ;; Override this phase because OpenSSL 1.0 does not understand -rpath.
471 (lambda* (#:key outputs #:allow-other-keys)
472 (let ((out (assoc-ref outputs "out")))
473 (invoke "./config"
474 "shared" ;build shared libraries
475 "--libdir=lib"
fc184fe2 476
e74f153a
MB
477 ;; The default for this catch-all directory is
478 ;; PREFIX/ssl. Change that to something more
479 ;; conventional.
480 (string-append "--openssldir=" out
481 "/share/openssl-" ,version)
fc184fe2 482
e74f153a
MB
483 (string-append "--prefix=" out)))))
484 (delete 'move-extra-documentation)
485 (add-after 'install 'move-man3-pages
486 (lambda* (#:key outputs #:allow-other-keys)
487 ;; Move section 3 man pages to "doc".
488 (let* ((out (assoc-ref outputs "out"))
489 (man3 (string-append out "/share/man/man3"))
490 (doc (assoc-ref outputs "doc"))
491 (target (string-append doc "/share/man/man3")))
492 (mkdir-p target)
493 (for-each (lambda (file)
494 (rename-file file
495 (string-append target "/"
496 (basename file))))
497 (find-files man3))
498 (delete-file-recursively man3)
499 #t)))
fc184fe2
MB
500 ;; XXX: Duplicate this phase to make sure 'version' evaluates
501 ;; in the current scope and not the inherited one.
502 (replace 'remove-miscellany
503 (lambda* (#:key outputs #:allow-other-keys)
504 ;; The 'misc' directory contains random undocumented shell and Perl
505 ;; scripts. Remove them to avoid retaining a reference on Perl.
506 (let ((out (assoc-ref outputs "out")))
507 (delete-file-recursively (string-append out "/share/openssl-"
508 ,version "/misc"))
763899f0
LF
509 #t)))))))))
510
cb6a802c
AE
511(define-public libressl
512 (package
513 (name "libressl")
0effadca 514 (version "2.7.4")
644e5f17
TGR
515 (source (origin
516 (method url-fetch)
517 (uri (string-append "mirror://openbsd/LibreSSL/"
ce1178d5 518 "libressl-" version ".tar.gz"))
644e5f17
TGR
519 (sha256
520 (base32
0effadca 521 "19kxa5i97q7p6rrps9qm0nd8zqhdjvzx02j72400c73cl2nryfhy"))))
cb6a802c 522 (build-system gnu-build-system)
a2d64899
LC
523 (arguments
524 ;; Do as if 'getentropy' was missing since older Linux kernels lack it
525 ;; and libc would return ENOSYS, which is not properly handled.
526 ;; See <https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00235.html>.
df08f385
LF
527 '(#:configure-flags '("ac_cv_func_getentropy=no"
528 ;; Provide a TLS-enabled netcat.
529 "--enable-nc")))
cb6a802c 530 (native-search-paths
cb6a802c
AE
531 (list (search-path-specification
532 (variable "SSL_CERT_DIR")
04cfe91e 533 (separator #f) ;single entry
cb6a802c
AE
534 (files '("etc/ssl/certs")))
535 (search-path-specification
536 (variable "SSL_CERT_FILE")
04cfe91e 537 (separator #f) ;single entry
cb6a802c 538 (files '("etc/ssl/certs/ca-certificates.crt")))))
2ed12d3f 539 (home-page "https://www.libressl.org/")
cb6a802c 540 (synopsis "SSL/TLS implementation")
df08f385
LF
541 (description "LibreSSL is a version of the TLS/crypto stack, forked from
542OpenSSL in 2014 with the goals of modernizing the codebase, improving security,
543and applying best practice development processes. This package also includes a
544netcat implementation that supports TLS.")
cb6a802c
AE
545 ;; Files taken from OpenSSL keep their license, others are under various
546 ;; non-copyleft licenses.
547 (license (list license:openssl
548 (license:non-copyleft
549 "file://COPYING"
550 "See COPYING in the distribution.")))))
551
6cefd53d 552(define-public python-acme
7890e3ba 553 (package
6cefd53d 554 (name "python-acme")
686d4259 555 ;; Remember to update the hash of certbot when updating python-acme.
9b2310a0 556 (version "1.2.0")
7890e3ba 557 (source (origin
9495cf9a 558 (method url-fetch)
f349d36e 559 (uri (pypi-uri "acme" version))
881006b6
MB
560 (sha256
561 (base32
9b2310a0 562 "1ar6mjax7cyvq3zgh64yrg485l02dy6zqddxjxg99nlvsi0cfc06"))))
7890e3ba
LF
563 (build-system python-build-system)
564 (arguments
6cefd53d 565 `(#:phases
9bee9d87 566 (modify-phases %standard-phases
1fc8476d
MB
567 (add-after 'build 'build-documentation
568 (lambda _
d4bd2453 569 (invoke "make" "-C" "docs" "man" "info")))
1fc8476d 570 (add-after 'install 'install-documentation
50a7963a
LF
571 (lambda* (#:key outputs #:allow-other-keys)
572 (let* ((out (assoc-ref outputs "out"))
573 (man (string-append out "/share/man/man1"))
574 (info (string-append out "/info")))
1fc8476d
MB
575 (install-file "docs/_build/texinfo/acme-python.info" info)
576 (install-file "docs/_build/man/acme-python.1" man)
577 #t))))))
50a7963a 578 ;; TODO: Add optional inputs for testing.
7890e3ba 579 (native-inputs
4ae65558 580 `(("python-mock" ,python-mock)
b494bbe4 581 ("python-pytest" ,python-pytest)
50a7963a
LF
582 ;; For documentation
583 ("python-sphinx" ,python-sphinx)
584 ("python-sphinxcontrib-programoutput" ,python-sphinxcontrib-programoutput)
585 ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
50a7963a 586 ("texinfo" ,texinfo)))
7890e3ba 587 (propagated-inputs
92572184
LF
588 `(("python-josepy" ,python-josepy)
589 ("python-six" ,python-six)
6cefd53d 590 ("python-requests" ,python-requests)
b494bbe4 591 ("python-requests-toolbelt" ,python-requests-toolbelt)
6cefd53d
LF
592 ("python-pytz" ,python-pytz)
593 ("python-pyrfc3339" ,python-pyrfc3339)
594 ("python-pyasn1" ,python-pyasn1)
595 ("python-cryptography" ,python-cryptography)
596 ("python-pyopenssl" ,python-pyopenssl)))
4631e6c9 597 (home-page "https://github.com/certbot/certbot")
7890e3ba
LF
598 (synopsis "ACME protocol implementation in Python")
599 (description "ACME protocol implementation in Python")
600 (license license:asl2.0)))
601
9495cf9a 602(define-public certbot
9fd0838b 603 (package
9495cf9a 604 (name "certbot")
686d4259
LF
605 ;; Certbot and python-acme are developed in the same repository, and their
606 ;; versions should remain synchronized.
607 (version (package-version python-acme))
9fd0838b
DT
608 (source (origin
609 (method url-fetch)
b380463b 610 (uri (pypi-uri "certbot" version))
9fd0838b
DT
611 (sha256
612 (base32
9b2310a0 613 "0g1p4nkaid6davjm5qz8lsln92dhjhlv3rrg8hcfpr7qhphbmp4m"))))
9fd0838b
DT
614 (build-system python-build-system)
615 (arguments
fed1898d 616 `(,@(substitute-keyword-arguments (package-arguments python-acme)
f26d6e4e
LF
617 ((#:phases phases)
618 `(modify-phases ,phases
1fc8476d 619 (replace 'install-documentation
f26d6e4e
LF
620 (lambda* (#:key outputs #:allow-other-keys)
621 (let* ((out (assoc-ref outputs "out"))
622 (man1 (string-append out "/share/man/man1"))
623 (man7 (string-append out "/share/man/man7"))
624 (info (string-append out "/info")))
1fc8476d
MB
625 (install-file "docs/_build/texinfo/Certbot.info" info)
626 (install-file "docs/_build/man/certbot.1" man1)
627 (install-file "docs/_build/man/certbot.7" man7)
628 #t))))))))
f9263d9a 629 ;; TODO: Add optional inputs for testing.
9fd0838b 630 (native-inputs
d05c14df
TGR
631 `(("python-mock" ,python-mock)
632 ("python-pytest" ,python-pytest)
f9263d9a 633 ;; For documentation
fed1898d
LF
634 ("python-sphinx" ,python-sphinx)
635 ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
636 ("python-sphinx-repoze-autointerface" ,python-sphinx-repoze-autointerface)
637 ("python-sphinxcontrib-programoutput" ,python-sphinxcontrib-programoutput)
f9263d9a 638 ("texinfo" ,texinfo)))
9fd0838b 639 (propagated-inputs
fed1898d 640 `(("python-acme" ,python-acme)
d05c14df 641 ("python-cryptography" ,python-cryptography)
fed1898d
LF
642 ("python-zope-interface" ,python-zope-interface)
643 ("python-pyrfc3339" ,python-pyrfc3339)
644 ("python-pyopenssl" ,python-pyopenssl)
645 ("python-configobj" ,python-configobj)
646 ("python-configargparse" ,python-configargparse)
b977d900 647 ("python-distro" ,python-distro)
fed1898d
LF
648 ("python-zope-component" ,python-zope-component)
649 ("python-parsedatetime" ,python-parsedatetime)
650 ("python-six" ,python-six)
651 ("python-psutil" ,python-psutil)
652 ("python-requests" ,python-requests)
653 ("python-pytz" ,python-pytz)))
d8a1be63 654 (synopsis "Let's Encrypt client by the Electronic Frontier Foundation")
80968df0
TGR
655 (description "Certbot automatically receives and installs X.509 certificates
656to enable Transport Layer Security (TLS) on servers. It interoperates with the
657Let’s Encrypt certificate authority (CA), which issues browser-trusted
658certificates for free.")
24778368 659 (home-page "https://certbot.eff.org/")
9fd0838b
DT
660 (license license:asl2.0)))
661
9495cf9a
LF
662(define-public letsencrypt
663 (package (inherit certbot)
56ab55d1
LF
664 (name "letsencrypt")
665 (properties `((superseded . ,certbot)))))
9495cf9a 666
cc2b77df
AE
667(define-public perl-net-ssleay
668 (package
669 (name "perl-net-ssleay")
966e4bea 670 (version "1.88")
cc2b77df
AE
671 (source (origin
672 (method url-fetch)
c50f15d6 673 (uri (string-append "mirror://cpan/authors/id/C/CH/CHRISN/"
cc2b77df
AE
674 "Net-SSLeay-" version ".tar.gz"))
675 (sha256
676 (base32
966e4bea 677 "1pfgh4h3szcpvqlcimc60pjbk9zwls99x5863sva0wc47i4dl010"))))
cc2b77df
AE
678 (build-system perl-build-system)
679 (inputs `(("openssl" ,openssl)))
680 (arguments
1084ec08
MW
681 `(#:phases
682 (modify-phases %standard-phases
1084ec08
MW
683 (add-before
684 'configure 'set-ssl-prefix
685 (lambda* (#:key inputs #:allow-other-keys)
686 (setenv "OPENSSL_PREFIX" (assoc-ref inputs "openssl"))
687 #t)))))
cc2b77df
AE
688 (synopsis "Perl extension for using OpenSSL")
689 (description
690 "This module offers some high level convenience functions for accessing
691web pages on SSL servers (for symmetry, the same API is offered for accessing
692http servers, too), an sslcat() function for writing your own clients, and
693finally access to the SSL api of the SSLeay/OpenSSL package so you can write
694servers or clients for more complicated applications.")
2f3108ad 695 (license license:perl-license)
9aba9b12 696 (home-page "https://metacpan.org/release/Net-SSLeay")))
4532c0c0
DM
697
698(define-public perl-crypt-openssl-rsa
699 (package
700 (name "perl-crypt-openssl-rsa")
a9994b27 701 (version "0.31")
4532c0c0
DM
702 (source
703 (origin
704 (method url-fetch)
705 (uri (string-append
683b8d47 706 "mirror://cpan/authors/id/T/TO/TODDR/Crypt-OpenSSL-RSA-"
4532c0c0
DM
707 version
708 ".tar.gz"))
709 (sha256
710 (base32
a9994b27 711 "0djl5i6kibl7862b6ih29q8dhg5zpwzq77q9j8hp6xngshx40ws1"))))
4532c0c0 712 (build-system perl-build-system)
683b8d47
TGR
713 (native-inputs
714 `(("perl-crypt-openssl-guess" ,perl-crypt-openssl-guess)))
4532c0c0
DM
715 (inputs
716 `(("perl-crypt-openssl-bignum" ,perl-crypt-openssl-bignum)
717 ("perl-crypt-openssl-random" ,perl-crypt-openssl-random)
718 ("openssl" ,openssl)))
719 (arguments perl-crypt-arguments)
720 (home-page
9aba9b12 721 "https://metacpan.org/release/Crypt-OpenSSL-RSA")
4532c0c0
DM
722 (synopsis
723 "RSA encoding and decoding, using the openSSL libraries")
724 (description "Crypt::OpenSSL::RSA does RSA encoding and decoding (using the
725OpenSSL libraries).")
2f3108ad 726 (license license:perl-license)))
adff71ca
DM
727
728(define perl-crypt-arguments
729 `(#:phases (modify-phases %standard-phases
730 (add-before 'configure 'patch-Makefile.PL
731 (lambda* (#:key inputs #:allow-other-keys)
732 (substitute* "Makefile.PL"
733 (("'LIBS'.*=>.*") (string-append "'LIBS' => ['-L"
734 (assoc-ref inputs "openssl")
735 "/lib -lcrypto'],")))
736 #t)))))
737
738(define-public perl-crypt-openssl-bignum
739 (package
740 (name "perl-crypt-openssl-bignum")
7e8aac18 741 (version "0.09")
adff71ca
DM
742 (source
743 (origin
744 (method url-fetch)
745 (uri (string-append
746 "mirror://cpan/authors/id/K/KM/KMX/Crypt-OpenSSL-Bignum-"
747 version
748 ".tar.gz"))
749 (sha256
750 (base32
7e8aac18 751 "1p22znbajq91lbk2k3yg12ig7hy5b4vy8igxwqkmbm4nhgxp4ki3"))))
adff71ca
DM
752 (build-system perl-build-system)
753 (inputs `(("openssl" ,openssl)))
754 (arguments perl-crypt-arguments)
755 (home-page
9aba9b12 756 "https://metacpan.org/release/Crypt-OpenSSL-Bignum")
adff71ca
DM
757 (synopsis
758 "OpenSSL's multiprecision integer arithmetic in Perl")
759 (description "Crypt::OpenSSL::Bignum provides multiprecision integer
760arithmetic in Perl.")
761 ;; At your option either gpl1+ or the Artistic License
2f3108ad 762 (license license:perl-license)))
cccb4d26 763
c80590f6
TGR
764(define-public perl-crypt-openssl-guess
765 (package
766 (name "perl-crypt-openssl-guess")
767 (version "0.11")
768 (source
769 (origin
770 (method url-fetch)
771 (uri (string-append
772 "mirror://cpan/authors/id/A/AK/AKIYM/Crypt-OpenSSL-Guess-"
773 version ".tar.gz"))
774 (sha256
775 (base32
776 "0rvi9l4ljcbhwwvspq019nfq2h2v746dk355h2nwnlmqikiihsxa"))))
777 (build-system perl-build-system)
9aba9b12 778 (home-page "https://metacpan.org/release/Crypt-OpenSSL-Guess")
c80590f6
TGR
779 (synopsis "Guess the OpenSSL include path")
780 (description
781 "The Crypt::OpenSSL::Guess Perl module provides helpers to guess the
782correct OpenSSL include path. It is intended for use in your
783@file{Makefile.PL}.")
784 (license license:perl-license)))
785
cccb4d26
DM
786(define-public perl-crypt-openssl-random
787 (package
788 (name "perl-crypt-openssl-random")
fa2d19cc 789 (version "0.15")
cccb4d26
DM
790 (source
791 (origin
792 (method url-fetch)
793 (uri (string-append
794 "mirror://cpan/authors/id/R/RU/RURBAN/Crypt-OpenSSL-Random-"
795 version
796 ".tar.gz"))
797 (sha256
fa2d19cc 798 (base32 "1x6ffps8q7mnawmcfq740llzy7i10g3319vap0wiw4d33fm6z1zh"))))
cccb4d26 799 (build-system perl-build-system)
b30c23c4
TGR
800 (native-inputs
801 `(("perl-crypt-openssl-guess" ,perl-crypt-openssl-guess)))
802 (inputs
803 `(("openssl" ,openssl)))
cccb4d26
DM
804 (arguments perl-crypt-arguments)
805 (home-page
9aba9b12 806 "https://metacpan.org/release/Crypt-OpenSSL-Random")
cccb4d26
DM
807 (synopsis
808 "OpenSSL/LibreSSL pseudo-random number generator access")
809 (description "Crypt::OpenSSL::Random is a OpenSSL/LibreSSL pseudo-random
810number generator")
2f3108ad 811 (license license:perl-license)))
0581c273
LF
812
813(define-public acme-client
814 (package
815 (name "acme-client")
4a6b2a21 816 (version "0.1.16")
0581c273
LF
817 (source (origin
818 (method url-fetch)
819 (uri (string-append "https://kristaps.bsd.lv/" name "/"
820 "snapshots/" name "-portable-"
821 version ".tgz"))
822 (sha256
823 (base32
4a6b2a21 824 "00q05b3b1dfnfp7sr1nbd212n0mqrycl3cr9lbs51m7ncaihbrz9"))))
0581c273
LF
825 (build-system gnu-build-system)
826 (arguments
827 '(#:tests? #f ; no test suite
828 #:make-flags
829 (list "CC=gcc"
830 (string-append "PREFIX=" (assoc-ref %outputs "out")))
831 #:phases
832 (modify-phases %standard-phases
7c1a7bf4
LF
833 (add-after 'unpack 'patch-paths
834 (lambda* (#:key inputs #:allow-other-keys)
835 (let ((pem (string-append (assoc-ref inputs "libressl")
836 "/etc/ssl/cert.pem")))
837 (substitute* "http.c"
838 (("/etc/ssl/cert.pem") pem))
839 #t)))
0581c273 840 (delete 'configure)))) ; no './configure' script
4b569a4f
LF
841 (native-inputs
842 `(("pkg-config" ,pkg-config)))
0581c273
LF
843 (inputs
844 `(("libbsd" ,libbsd)
845 ("libressl" ,libressl)))
846 (synopsis "Let's Encrypt client by the OpenBSD project")
847 (description "acme-client is a Let's Encrypt client implemented in C. It
848uses a modular design, and attempts to secure itself by dropping privileges and
849operating in a chroot where possible. acme-client is developed on OpenBSD and
850then ported to the GNU / Linux environment.")
851 (home-page "https://kristaps.bsd.lv/acme-client/")
852 ;; acme-client is distributed under the ISC license, but the files 'jsmn.h'
853 ;; and 'jsmn.c' are distributed under the Expat license.
854 (license (list license:isc license:expat))))
88522738 855
856;; The "-apache" variant is the upstreamed prefered variant. A "-gpl"
857;; variant exists in addition to the "-apache" one.
858(define-public mbedtls-apache
859 (package
860 (name "mbedtls-apache")
1b01c103 861 (version "2.16.5")
88522738 862 (source
863 (origin
864 (method url-fetch)
865 ;; XXX: The download links on the website are script redirection links
866 ;; which effectively lead to the format listed in the uri here.
867 (uri (string-append "https://tls.mbed.org/download/mbedtls-"
868 version "-apache.tgz"))
869 (sha256
870 (base32
1b01c103 871 "0kdhwy241xsk4isbadqx6z80m8sf76da5sbmqv8qy11yr37cdd35"))))
88522738 872 (build-system cmake-build-system)
a64d9d56
RW
873 (arguments
874 `(#:configure-flags
92ebd8ed
MB
875 (list "-DUSE_SHARED_MBEDTLS_LIBRARY=ON"
876 "-DUSE_STATIC_MBEDTLS_LIBRARY=OFF")))
88522738 877 (native-inputs
38a9bf80
TGR
878 `(("perl" ,perl)
879 ("python" ,python)))
88522738 880 (synopsis "Small TLS library")
881 (description
882 "@code{mbed TLS}, formerly known as PolarSSL, makes it trivially easy
883for developers to include cryptographic and SSL/TLS capabilities in their
884(embedded) products, facilitating this functionality with a minimal
885coding footprint.")
886 (home-page "https://tls.mbed.org")
887 (license license:asl2.0)))
587d1752 888
8e87aa04
TGR
889;; The Hiawatha Web server requires some specific features to be enabled.
890(define-public mbedtls-for-hiawatha
891 (hidden-package
892 (package
893 (inherit mbedtls-apache)
894 (arguments
895 (substitute-keyword-arguments
896 `(#:phases
897 (modify-phases %standard-phases
898 (add-after 'configure 'configure-extra-features
899 (lambda _
900 (for-each (lambda (feature)
901 (invoke "scripts/config.pl" "set" feature))
902 (list "MBEDTLS_THREADING_C"
903 "MBEDTLS_THREADING_PTHREAD"))
904 #t)))
905 ,@(package-arguments mbedtls-apache)))))))
906
e8b3a158
CL
907(define-public dehydrated
908 (package
909 (name "dehydrated")
2359e235 910 (version "0.6.5")
e8b3a158 911 (source (origin
2850d877 912 (method url-fetch)
e8b3a158 913 (uri (string-append
bb5ab9bf 914 "https://github.com/dehydrated-io/dehydrated/releases/download/"
2850d877 915 "v" version "/dehydrated-" version ".tar.gz"))
e8b3a158
CL
916 (sha256
917 (base32
2359e235 918 "0dgskgbdd95p13jx6s13p77y15wngb5cm6p4305cf2s54w0bvahh"))))
e8b3a158
CL
919 (build-system trivial-build-system)
920 (arguments
921 `(#:modules ((guix build utils))
922 #:builder
923 (begin
924 (use-modules (guix build utils))
925 (let* ((source (assoc-ref %build-inputs "source"))
2850d877
EF
926 (tar (assoc-ref %build-inputs "tar"))
927 (gz (assoc-ref %build-inputs "gzip"))
e8b3a158
CL
928 (out (assoc-ref %outputs "out"))
929 (bin (string-append out "/bin"))
2850d877 930 (doc (string-append out "/share/doc/"))
e8b3a158 931 (bash (in-vicinity (assoc-ref %build-inputs "bash") "bin")))
2850d877
EF
932
933 (setenv "PATH" (string-append gz "/bin"))
934 (invoke (string-append tar "/bin/tar") "xvf" source)
935 (chdir (string-append ,name "-" ,version))
936
937 (install-file "dehydrated" bin)
938 (install-file "LICENSE" (string-append doc ,name "-" ,version))
e8b3a158 939 (with-directory-excursion bin
e8b3a158
CL
940 (patch-shebang "dehydrated" (list bash))
941
942 ;; Do not try to write in the store.
943 (substitute* "dehydrated"
944 (("SCRIPTDIR=\"\\$.*\"") "SCRIPTDIR=~/.dehydrated"))
945
946 (setenv "PATH" bash)
947 (wrap-program "dehydrated"
948 `("PATH" ":" prefix
949 ,(map (lambda (dir)
950 (string-append dir "/bin"))
951 (map (lambda (input)
952 (assoc-ref %build-inputs input))
953 '("coreutils"
954 "curl"
955 "diffutils"
956 "gawk"
957 "grep"
958 "openssl"
959 "sed"))))))
960 #t))))
961 (inputs
962 `(("bash" ,bash)
963 ("coreutils" ,coreutils)
964 ("curl" ,curl)
965 ("diffutils" ,diffutils)
966 ("gawk" ,gawk)
967 ("grep" ,grep)
968 ("openssl" ,openssl)
969 ("sed" ,sed)))
2850d877
EF
970 (native-inputs
971 `(("gzip" ,gzip)
972 ("tar" ,tar)))
e8b3a158
CL
973 (home-page "https://dehydrated.io/")
974 (synopsis "Let's Encrypt/ACME client implemented as a shell script")
975 (description "Dehydrated is a client for signing certificates with an
976ACME-server (currently only provided by Let's Encrypt) implemented as a
977relatively simple Bash script.")
978 (license license:expat)))
ea22aa1f
LF
979
980(define-public go-github-com-certifi-gocertifi
a9546f8b
LF
981 (let ((commit "a5e0173ced670013bfb649c7e806bc9529c986ec")
982 (revision "1"))
ea22aa1f
LF
983 (package
984 (name "go-github-com-certifi-gocertifi")
985 (version (git-version "2018.01.18" revision commit))
986 (source (origin
987 (method git-fetch)
988 (uri (git-reference
989 (url "https://github.com/certifi/gocertifi")
990 (commit commit)))
991 (file-name (git-file-name name version))
992 (sha256
993 (base32
a9546f8b 994 "1n9drccl3q1rr8wg3nf60slkf1lgsmz5ahifrglbdrc6har3rryj"))))
ea22aa1f
LF
995 (build-system go-build-system)
996 (arguments
997 '(#:import-path "github.com/certifi/gocertifi"))
998 (synopsis "X.509 TLS root certificate bundle for Go")
999 (description "This package is a Go language X.509 TLS root certificate bundle,
1000derived from Mozilla's collection.")
1001 (home-page "https://certifi.io")
1002 (license license:mpl2.0))))