summaryrefslogtreecommitdiff
path: root/plugins/MirOTR/libgcrypt-1.4.6/doc
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/MirOTR/libgcrypt-1.4.6/doc')
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/ChangeLog455
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/HACKING66
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.am71
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.in699
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/README.apichanges115
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/authors.txt7
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.eps580
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.fig199
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.pdfbin11576 -> 0 bytes
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.pngbin15376 -> 0 bytes
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.info6839
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.texi5867
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.aim.txt22
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.architecture.txt108
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/gpl.texi397
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/lgpl.texi565
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.eps349
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.fig193
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.pdfbin6090 -> 0 bytes
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.pngbin6883 -> 0 bytes
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/mdate-sh201
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/readme.txt6
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/stamp-vti4
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/texinfo.tex7482
-rw-r--r--plugins/MirOTR/libgcrypt-1.4.6/doc/version.texi4
25 files changed, 0 insertions, 24229 deletions
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/ChangeLog b/plugins/MirOTR/libgcrypt-1.4.6/doc/ChangeLog
deleted file mode 100644
index e0843c5cb5..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/ChangeLog
+++ /dev/null
@@ -1,455 +0,0 @@
-2009-07-09 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Working with S-expressions): Describe format
- character '%S'. Typo fixes.
- (gcry_cipher_close, gcry_md_close)
- (gcry_sexp_release): Explicitly mention zeroisation.
-
-2009-04-02 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Self-Tests): Fix name of register functions.
-
-2008-12-10 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Cryptographic Functions): Explain the domain
- parameter for key generation.
-
-2008-12-05 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Updates for pubkey generation.
-
-2008-10-20 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Error handler): Fix description of
- gcry_handler_no_mem_t. Reported by Patrick Strateman. desribe
- what what the error handler is expected to do. Fixes bug #961.
-
-2008-09-18 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (FIPS Mode): Add state transition Error to Error.
- * fips-fsm.fig: Ditto.
-
-2008-09-18 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Add a couple of index items.
- (FIPS Mode): Reflect recent changes.
- (Controlling the library): Describe gcry_fips_mode_active.
-
-2008-09-16 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (FIPS Mode): Describe new transitions 18 and 19.
- * fips-fsm.fig: Add new transitions.
-
-2008-09-15 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Fold the two FIPS appendices into one.
-
-2008-09-11 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Public-Key Subsystem Architecture): Explain RSA
- blinding.
-
-2008-09-08 Marcus Brinkmann <marcus@g10code.com>
-
- * gcrypt.texi: Some typos fixed.
-
-2008-09-08 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Formatting cleanups.
- * lgpl.texi (Library Copying): Replace @appendix by @unnumbered.
- * gpl.texi (Copying): Ditto.
-
-2008-08-27 Werner Koch <wk@g10code.com>
-
- * Makefile.am (online): Take care of development versions.
-
-2008-08-18 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Top): Remove the detailmenu.
- (Public Key Cryptographi (II)): Move into a section of the PK
- interface description.
- (Hashing): Move after the encryption chapters.
-
-2008-08-15 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Controlling the library): Remove
- GCRYCTL_DUMP_CONFIG because it is not implemented.
- (Initializing the library): Describe initialization steps with
- regard to secure memory.
-
- * gcrypt.texi (Working with cipher handles): Adjust for
- implementation changes of gcry_cipher_setkey, gcry_cipher_setiv and
- gcry_cipher_setctr.
-
-2008-01-04 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Controlling the library): Add remark that the
- theoritical attack on a seed file is not feasible under Linux.
-
-2007-12-11 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Various minor corrections as reported by Elie De
- Brauer more than a year ago.
-
-2007-06-15 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Controlling the library): Clarified the use of
- GCRYCTL_ENABLE_QUICK_RANDOM.
-
-2007-04-30 Werner Koch <wk@g10code.com>
-
- * HACKING: New. Two items by Marcus.
- * README.apichanges: Move from .. to here.
- * Makefile.am (EXTRA_DIST): Add new files.
-
-2007-04-09 Marcus Brinkmann <marcus@g10code.de>
-
- * gcrypt.texi: Fix some typos.
-
-2006-11-05 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (General public-key related Functions): Typo.
-
-2006-09-19 Werner Koch <wk@g10code.com>
-
- * Makefile.am (online): New target.
-
-2006-08-29 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi (Available ciphers): Add missing ciphers.
-
-2006-03-10 Brad Hards <bradh@frogmouth.net> (wk, patch 2005-04-25)
-
- * gcrypt.texi: Document SHA-224 and typo fixes.
-
-2006-01-18 Brad Hards <bradh@frogmouth.net> (wk 2006-03-07)
-
- * gcrypt.texi (Available cipher modes): Typo fix, add a little
- more detail on cipher modes vs cipher algorithms.
-
-2006-01-08 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Added documentation for more gcry_control commands.
-
- * gcrypt.texi: Fixed several typos; thanks to Tommi Vainikainen.
-
-2005-12-16 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (MPI formats): Fix return types of functions:
- gcry_mpi_scan, gcry_mpi_print, gcry_mpi_aprint.
-
-2005-11-26 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: New chapter: Prime numbers.
-
-2005-11-12 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (MPI formats): Document that for gcry_mpi_scan and
- in the case of GCRYMPI_FMT_HEX, BUFLEN must be zero.
-
-2005-10-31 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Added more gcry_control related descriptions.
-
-2005-10-16 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Controlling the library): Start documenting the
- existing control commands.
-
-2005-04-11 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Available hash algorithms): Add entry for Whirlpool.
-
-2005-03-30 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Working with IO objects): Document ac io objects;
- adjust ac scheme functions, which do now use io objects.
-
-2005-03-19 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Working with cipher handles): Clarify CTS mode.
-
-2005-02-08 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Fixed direntry.
-
-2005-02-13 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Using cryptographic functions): Document new
- encoding and scheme crypto functionality.
-
-2005-02-03 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Fixed several typos; thanks to Michele Baldessari.
-
-2005-01-04 Werner Koch <wk@g10code.com>
-
- * gcrypt.texi: Updated to use @copying. Fixed list of copyright
- years; we had real changes in 2004. Fixed some formatting issues.
-
-2004-08-24 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Miscellaneous): Document gcry_mpi_randomize.
-
-2004-08-18 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Multi Threading): Document
- GCRY_THREAD_OPTION_PTH_IMPL, GCRY_THREAD_OPTION_PTHREAD_IMPL.
-
-2004-05-07 Moritz Schulte <moritz@g10code.de>
-
- * gcrypt.texi: Merged several fixes reported by Umberto Salsi.
-
-2004-04-08 Moritz Schulte <moritz@g10code.de>
-
- * gcrypt.texi (Multi Threading): Typo fix.
-
-2004-03-11 Marcus Brinkmann <marcus@g10code.de>
-
- * gcrypt.texi (Multi Threading): Partially document new thread
- support.
-
-2004-02-24 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Calculations): Typo fix.
-
-2004-01-25 Moritz Schulte <mo@g10code.com>
-
- * gcrypt.texi (General cipher functions): Fixed descriptions of
- the arguments for GCRYCTL_GET_KEYLEN, GCRYCTL_GET_BLKLEN; reported
- by Randy.
-
-2004-01-14 Moritz Schulte <mo@g10code.com>
-
- * gcrypt.texi (Public Key cryptography II): Adjusted to new
- gcry_ac_* API; document flags.
-
-2003-12-04 Werner Koch <wk@gnupg.org>
-
- * Makefile.am (gcrypt_TEXINFOS): Removed fdl.texi.
-
-2003-12-03 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi: Changed license from FDL to GPL because this is a
- reference manual only useful along with actual code.
- * fdl.texi: Removed.
-
- * gcrypt.texi: Minor cleanups
- (Working with keys): Clarified generation of RSA's E parameter.
- (Multi Threading): Clarified.
-
-2003-11-11 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Working with S-expressions): Added "%b".
-
-2003-11-04 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Retrieving random numbers): Add gcry_create_nonce.
-
-2003-08-30 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Working with hash algorithms): Clarified that HMAC
- does not work with all algorithms.
-
-2003-07-30 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Available asymmetric algorithms): Mention
- GCRY_AC_ELG_E.
-
-2003-07-28 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Working with keys): Mention that gcry_pk_testkey
- and gcry_ac_key_test only verify private keys.
- (Working with keys): Fix typo.
- (General public-key related Functions): Fixed some sentences,
- thanks to Neil Spring.
-
-2003-07-27 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi: Adjusted description of gcry_mpi_scan and
- gcry_mpi_dump. Add gcry_mpi_dump.
-
-2003-07-22 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Added more documentation for the register
- mechanism.
-
-2003-07-18 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Misc): Add a warning on the use of opaque values.
-
-2003-07-14 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Overview): Mention the non-thread-safe-nature of
- functions modifying context stored in handles.
-
-2003-07-12 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Available ciphers): Added: TWOFISH128.
- (Error Handling): Merged a lot of documentation taken from GPGME.
-
-2003-07-08 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Working with sets of data): Documented:
- gcry_ac_data_copy.
-
-2003-07-07 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Documented module system.
-
-2003-07-05 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Working with cipher handles): Small fix by Simon
- Josefsson <jas@extundo.com>.
-
-2003-07-02 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Documented ac interface.
-
-2003-06-18 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Small fixes.
-
-2003-06-16 Moritz Schulte <moritz@g10code.com>
-
- * cipher-ref.sgml: Removed file.
- * digest-ref.sgml: Likewise.
- * misc-ref.sgml: Likewise.
- * pubkey-ref.sgml: Likewise.
- * reference.sgml: Likewise.
- * version.sgml.in: Likewise.
-
-2003-06-15 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Documented several parts of the library, merged
- some documentation from GPGME's manual, re-structured the whole
- manual, added more menus.
-
-2003-06-14 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Hash Functions): Adjusteded description of
- gcry_md_copy.
-
-2003-06-12 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Public Key Functions): Fix example S-Exp, i.e.:
- added the number of following digits as prefix to the number of
- bits.
- (Public Key Functions): Document the general usage of `flags',
- including the no-blinding flag.
-
-2003-06-11 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (Hash Functions): Document possible values of HD.
-
-2003-06-09 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Version Check): Changed description of
- gcry_check_version; the user now *must* call the function to
- initialize the library.
-
-2003-06-08 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi: Change for libgpg-error.
-
-2003-05-22 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Public Key Functions): Fixed typo.
-
-2003-05-17 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Public Key Functions): Mention that only the
- checking of secret keys is supported currently.
-
-2003-03-30 Simon Josefsson <jas@extundo.com>
-
- * gcrypt.texi: Add CTR.
-
-2003-03-22 Simon Josefsson <jas@extundo.com>
-
- * gcrypt.texi: Add CBC-MAC.
-
-2003-03-04 Moritz Schulte <moritz@g10code.com>
-
- * gcrypt.texi (Cipher Functions): Added gcry_cipher_reset.
-
-2003-01-23 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi (gcry_pk_decrypt): Described use of FLAGS
-
-2003-01-20 Simon Josefsson <jas@extundo.com>
-
- * gcrypt.texi (Hash Functions): Add CRC.
-
-2003-01-19 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi: Most functions are now documented. Still need to
- fine tune the menu structure, document some utility functions,
- mark up indices and references and add examples.
-
-2002-08-14 Werner Koch <wk@gnupg.org>
-
- * gcrypt.texi: Typo fixes.
-
-2002-05-14 Werner Koch <wk@gnupg.org>
-
- * lgpl.texi: New.
- * gcrypt.texi: Included lgpl and commented not yet converted text.
-
-2002-04-16 Werner Koch <wk@gnupg.org>
-
- * version.sgml.in, cipher-ref.sgml, digest-ref.sgml, misc-ref.sgml
- * pubkey-ref.sgml, reference.sgml: Removed.
- * gcrypt.texi: New. Based on the old sgml version.
- * gpl.texi, fdl.texi: New.
- * Makefile.am: Adjusted for use with texinfo.
-
-2000-12-21 Werner Koch <wk@gnupg.org>
-
- Renamed the gcryptref.sgml files and removed the GnuPG stuff.
-
-Tue Oct 26 14:10:21 CEST 1999 Werner Koch <wk@gnupg.de>
-
- * Makefile.am (SUBDIRS): Removed gph from this development series
-
-Mon Sep 6 19:59:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * Makefile.am (SUBDIRS): New subdir gph for the manual.
-
-Thu Jul 22 20:03:03 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * gpg.sgml (--always-trust): Added.
-
-Wed Jul 14 19:42:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * Makefile.am: Create a dummy man page if docbook-to-man is missing.
-
-Wed Jun 16 20:16:21 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * gpg1.pod: Removed.
- * gpg.sgml: New. Replaces the pod file
- * Makefile.am: Add rule to make a man file from sgml
-
-Tue Jun 15 12:21:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * Makefile.in.in: Use DESTDIR.
-
-Mon May 31 19:41:10 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * gpg.1pod: Enhanced the Bugs section (Michael).
-
-Wed Feb 10 17:15:39 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
-
- * gpg.1pod: Spelling and grammar corrections (John A. Martin)
- * FAQ: Ditto.
- * DETAILS: Ditto.
-
- Copyright 1999, 2000, 2002, 2003, 2008 Free Software Foundation, Inc.
-
- This file is free software; as a special exception the author gives
- unlimited permission to copy and/or distribute it, with or without
- modifications, as long as this notice is preserved.
-
- This file is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/HACKING b/plugins/MirOTR/libgcrypt-1.4.6/doc/HACKING
deleted file mode 100644
index 51380b172c..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/HACKING
+++ /dev/null
@@ -1,66 +0,0 @@
- Various hacking notes -*- text -*-
- =======================
-
-
-Taking optimized MPI code out of GMP:
--------------------------------------
-
- I generated the pentium4/* files by glueing the existing assembler
- prologues to the GMP 4.2.1 assembler files generated with the m4
- tool in GMP's build process, for example:
-
- $ m4 -DHAVE_CONFIG_H -D__GMP_WITHIN_GMP -DOPERATION_rshift -DPIC \
- rshift.asm >tmp-rshift.s
-
- Then tmp-rshift will contain the assembler instructions for the
- configured platform. Unfortunately, this way the comments are lost.
- For most files I re-inserted some of the comments, but this is
- tedious work.
-
-
-Debugging math stuff:
----------------------
-
- While debugging the ECC code in libgcrypt, I was in need for some
- computer algebra system which would allow me to verify the numbers
- in the debugging easily. I found that PARI (pari-gp package in
- Debian) has support for elliptic curves. The below commands shows
- how they are set up and used with an example.
-
- ===8<========
- hextodec(s)=local(v=Vec(s),a=10,b=11,c=12,d=13,e=14,f=15,A=10,B=11,C=12,D=13,E=14,F=15,h);if(#setunion(Set(v),Vec("0123456789ABCDEFabcdef"))>22,error);for(i=1,#v,h=shift(h,4)+eval(v[i]));h
-
- p = hextodec("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
- a = hextodec("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC")
- b = hextodec("51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00")
-
- /* Set up y^2 = x^3 + ax + b mod (p). */
- e = ellinit(Mod(1,p)*[0,0,0,a,b]);
-
- gx = hextodec ("00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66")
- gy = hextodec ("011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650")
- g = Mod(1,p)*[gx,gy]
-
- n = hextodec ("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409")
-
- /* Verify that G is on the curve, and that n is the order. */
- ellisoncurve (e,g)
- isprime (n)
- ellpow (e,g,n)
-
- d = hextodec ("018F9573F25059571BDF614529953DE2540497CEDABD04F3AF78813BED7BB163A2FD919EECF822848FCA39EF55E500F8CE861C7D53D371857F7774B79428E887F81B")
-
- qx = hextodec ("00316AAAD3E905875938F588BD9E8A4785EF9BDB76D62A83A5340F82CB8E800B25619F5C3EA02B7A4FA43D7497C7702F7DFBEAC8E8F92C3CAABD9F84182FDA391B3B")
- /* Note: WRONG! (It is apparent that this is the same as X shifted by
- 8 bit). */
- qy = hextodec ("0000316AAAD3E905875938F588BD9E8A4785EF9BDB76D62A83A5340F82CB8E800B25619F5C3EA02B7A4FA43D7497C7702F7DFBEAC8E8F92C3CAABD9F84182FDA391B")
- q = Mod(1,p)*[qx,qy]
-
- /* Calculate what Q should be given d. */
- ellpow (e,g,d)
-
- /* This is not 0 and thus shows that libgcrypt gave Q and d that do
- not match. */
- ellpow (e,g,d) - q
- ====8<=====================
-
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.am b/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.am
deleted file mode 100644
index f25106438e..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.am
+++ /dev/null
@@ -1,71 +0,0 @@
-## Process this file with automake to create Makefile.in
-# Copyright (C) 2002 Free Software Foundation, Inc.
-#
-# This file is part of Libgcrypt.
-#
-# Libgcrypt is free software; you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as
-# published by the Free Software Foundation; either version 2.1 of
-# the License, or (at your option) any later version.
-#
-# Libgcrypt is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-
-EXTRA_DIST = README.apichanges HACKING \
- libgcrypt-modules.eps fips-fsm.eps \
- libgcrypt-modules.png fips-fsm.png \
- libgcrypt-modules.pdf fips-fsm.pdf
-
-DISTCLEANFILES = gcrypt.cps
-
-BUILT_SOURCES = libgcrypt-modules.eps fips-fsm.eps \
- libgcrypt-modules.png fips-fsm.png \
- libgcrypt-modules.pdf fips-fsm.pdf
-
-info_TEXINFOS = gcrypt.texi
-gcrypt_TEXINFOS = lgpl.texi gpl.texi libgcrypt-modules.fig fips-fsm.fig
-
-
-.fig.png:
- fig2dev -L png `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.jpg:
- fig2dev -L jpg `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.eps:
- fig2dev -L eps `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.pdf:
- fig2dev -L pdf `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-
-# Make sure that gcrypt.texi is touched if any other source file has
-# been modified. This is required so that the version.texi magic
-# updates the release date.
-gnupg.texi : $(gcrypt_TEXINFOS)
- touch $(srcdir)/gcrypt.texi
-
-online: gcrypt.html gcrypt.pdf gcrypt.info
- set -e; \
- echo "Uploading current manuals to www.gnupg.org ..."; \
- cp libgcrypt-modules.png gcrypt.html/; \
- cp fips-fsm.png gcrypt.html/; \
- user=werner ; dashdevel="" ; \
- if echo "@PACKAGE_VERSION@" | grep -- "-svn" >/dev/null; then \
- dashdevel="-devel" ; \
- cp gcrypt.pdf gcrypt.html/; \
- cp gcrypt.info gcrypt.html/; \
- else \
- rsync -v gcrypt.pdf gcrypt.info \
- $${user}@trithemius.gnupg.org:webspace/manuals/ ; \
- fi ; \
- cd gcrypt.html ; \
- rsync -vr --exclude='.svn' . \
- $${user}@trithemius.gnupg.org:webspace/manuals/gcrypt$${dashdevel}/
-
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.in b/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.in
deleted file mode 100644
index 56acfbe4e2..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/Makefile.in
+++ /dev/null
@@ -1,699 +0,0 @@
-# Makefile.in generated by automake 1.10.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Copyright (C) 2002 Free Software Foundation, Inc.
-#
-# This file is part of Libgcrypt.
-#
-# Libgcrypt is free software; you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as
-# published by the Free Software Foundation; either version 2.1 of
-# the License, or (at your option) any later version.
-#
-# Libgcrypt is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(gcrypt_TEXINFOS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/stamp-vti \
- $(srcdir)/version.texi ChangeLog mdate-sh texinfo.tex
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/onceonly.m4 \
- $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-INFO_DEPS = $(srcdir)/gcrypt.info
-am__TEXINFO_TEX_DIR = $(srcdir)
-DVIS = gcrypt.dvi
-PDFS = gcrypt.pdf
-PSS = gcrypt.ps
-HTMLS = gcrypt.html
-TEXINFOS = gcrypt.texi
-TEXI2DVI = texi2dvi
-TEXI2PDF = $(TEXI2DVI) --pdf --batch
-MAKEINFOHTML = $(MAKEINFO) --html
-AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
-DVIPS = dvips
-am__installdirs = "$(DESTDIR)$(infodir)"
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BUILD_FILEVERSION = @BUILD_FILEVERSION@
-BUILD_REVISION = @BUILD_REVISION@
-BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
-CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DL_LIBS = @DL_LIBS@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FALLBACK_SOCKLEN_T = @FALLBACK_SOCKLEN_T@
-FFLAGS = @FFLAGS@
-GCRYPT_CIPHERS = @GCRYPT_CIPHERS@
-GCRYPT_DIGESTS = @GCRYPT_DIGESTS@
-GCRYPT_PUBKEY_CIPHERS = @GCRYPT_PUBKEY_CIPHERS@
-GCRYPT_RANDOM = @GCRYPT_RANDOM@
-GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@
-GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@
-GPG_ERROR_LIBS = @GPG_ERROR_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBGCRYPT_CIPHERS = @LIBGCRYPT_CIPHERS@
-LIBGCRYPT_CONFIG_API_VERSION = @LIBGCRYPT_CONFIG_API_VERSION@
-LIBGCRYPT_CONFIG_CFLAGS = @LIBGCRYPT_CONFIG_CFLAGS@
-LIBGCRYPT_CONFIG_LIBS = @LIBGCRYPT_CONFIG_LIBS@
-LIBGCRYPT_DIGESTS = @LIBGCRYPT_DIGESTS@
-LIBGCRYPT_LT_AGE = @LIBGCRYPT_LT_AGE@
-LIBGCRYPT_LT_CURRENT = @LIBGCRYPT_LT_CURRENT@
-LIBGCRYPT_LT_REVISION = @LIBGCRYPT_LT_REVISION@
-LIBGCRYPT_PUBKEY_CIPHERS = @LIBGCRYPT_PUBKEY_CIPHERS@
-LIBGCRYPT_THREAD_MODULES = @LIBGCRYPT_THREAD_MODULES@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-MPI_SFLAGS = @MPI_SFLAGS@
-NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PTH_CFLAGS = @PTH_CFLAGS@
-PTH_CONFIG = @PTH_CONFIG@
-PTH_LIBS = @PTH_LIBS@
-RANLIB = @RANLIB@
-RC = @RC@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-SYS_SOCKET_H = @SYS_SOCKET_H@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = README.apichanges HACKING \
- libgcrypt-modules.eps fips-fsm.eps \
- libgcrypt-modules.png fips-fsm.png \
- libgcrypt-modules.pdf fips-fsm.pdf
-
-DISTCLEANFILES = gcrypt.cps
-BUILT_SOURCES = libgcrypt-modules.eps fips-fsm.eps \
- libgcrypt-modules.png fips-fsm.png \
- libgcrypt-modules.pdf fips-fsm.pdf
-
-info_TEXINFOS = gcrypt.texi
-gcrypt_TEXINFOS = lgpl.texi gpl.texi libgcrypt-modules.fig fips-fsm.fig
-all: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .dvi .eps .fig .html .info .jpg .pdf .png .ps .texi
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-.texi.info:
- restore=: && backupdir="$(am__leading_dot)am$$$$" && \
- am__cwd=`pwd` && cd $(srcdir) && \
- rm -rf $$backupdir && mkdir $$backupdir && \
- if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
- for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
- if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
- done; \
- else :; fi && \
- cd "$$am__cwd"; \
- if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
- -o $@ $<; \
- then \
- rc=0; \
- cd $(srcdir); \
- else \
- rc=$$?; \
- cd $(srcdir) && \
- $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
- fi; \
- rm -rf $$backupdir; exit $$rc
-
-.texi.dvi:
- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
- MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
- $(TEXI2DVI) $<
-
-.texi.pdf:
- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
- MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
- $(TEXI2PDF) $<
-
-.texi.html:
- rm -rf $(@:.html=.htp)
- if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
- -o $(@:.html=.htp) $<; \
- then \
- rm -rf $@; \
- if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
- mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
- else \
- if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
- rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
- exit 1; \
- fi
-$(srcdir)/gcrypt.info: gcrypt.texi $(srcdir)/version.texi $(gcrypt_TEXINFOS)
-gcrypt.dvi: gcrypt.texi $(srcdir)/version.texi $(gcrypt_TEXINFOS)
-gcrypt.pdf: gcrypt.texi $(srcdir)/version.texi $(gcrypt_TEXINFOS)
-gcrypt.html: gcrypt.texi $(srcdir)/version.texi $(gcrypt_TEXINFOS)
-$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
-$(srcdir)/stamp-vti: gcrypt.texi $(top_srcdir)/configure
- @(dir=.; test -f ./gcrypt.texi || dir=$(srcdir); \
- set `$(SHELL) $(srcdir)/mdate-sh $$dir/gcrypt.texi`; \
- echo "@set UPDATED $$1 $$2 $$3"; \
- echo "@set UPDATED-MONTH $$2 $$3"; \
- echo "@set EDITION $(VERSION)"; \
- echo "@set VERSION $(VERSION)") > vti.tmp
- @cmp -s vti.tmp $(srcdir)/version.texi \
- || (echo "Updating $(srcdir)/version.texi"; \
- cp vti.tmp $(srcdir)/version.texi)
- -@rm -f vti.tmp
- @cp $(srcdir)/version.texi $@
-
-mostlyclean-vti:
- -rm -f vti.tmp
-
-maintainer-clean-vti:
-@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
-.dvi.ps:
- TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
- $(DVIPS) -o $@ $<
-
-uninstall-dvi-am:
- @$(NORMAL_UNINSTALL)
- @list='$(DVIS)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
- rm -f "$(DESTDIR)$(dvidir)/$$f"; \
- done
-
-uninstall-html-am:
- @$(NORMAL_UNINSTALL)
- @list='$(HTMLS)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
- rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
- done
-
-uninstall-info-am:
- @$(PRE_UNINSTALL)
- @if test -d '$(DESTDIR)$(infodir)' && \
- (install-info --version && \
- install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
- list='$(INFO_DEPS)'; \
- for file in $$list; do \
- relfile=`echo "$$file" | sed 's|^.*/||'`; \
- echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
- install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
- done; \
- else :; fi
- @$(NORMAL_UNINSTALL)
- @list='$(INFO_DEPS)'; \
- for file in $$list; do \
- relfile=`echo "$$file" | sed 's|^.*/||'`; \
- relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
- (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
- echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
- rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
- else :; fi); \
- done
-
-uninstall-pdf-am:
- @$(NORMAL_UNINSTALL)
- @list='$(PDFS)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
- rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
- done
-
-uninstall-ps-am:
- @$(NORMAL_UNINSTALL)
- @list='$(PSS)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
- rm -f "$(DESTDIR)$(psdir)/$$f"; \
- done
-
-dist-info: $(INFO_DEPS)
- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
- list='$(INFO_DEPS)'; \
- for base in $$list; do \
- case $$base in \
- $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
- esac; \
- if test -f $$base; then d=.; else d=$(srcdir); fi; \
- base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
- for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
- if test -f $$file; then \
- relfile=`expr "$$file" : "$$d/\(.*\)"`; \
- test -f $(distdir)/$$relfile || \
- cp -p $$file $(distdir)/$$relfile; \
- else :; fi; \
- done; \
- done
-
-mostlyclean-aminfo:
- -rm -rf gcrypt.aux gcrypt.cp gcrypt.cps gcrypt.fn gcrypt.fns gcrypt.ky \
- gcrypt.kys gcrypt.log gcrypt.pg gcrypt.tmp gcrypt.toc \
- gcrypt.tp gcrypt.vr gcrypt.vrs gcrypt.dvi gcrypt.pdf \
- gcrypt.ps gcrypt.html
-
-maintainer-clean-aminfo:
- @list='$(INFO_DEPS)'; for i in $$list; do \
- i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
- echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
- rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
- done
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$(top_distdir)" distdir="$(distdir)" \
- dist-info
-check-am: all-am
-check: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(INFO_DEPS)
-installdirs:
- for dir in "$(DESTDIR)$(infodir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
- -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am: $(DVIS)
-
-html: html-am
-
-html-am: $(HTMLS)
-
-info: info-am
-
-info-am: $(INFO_DEPS)
-
-install-data-am: install-info-am
-
-install-dvi: install-dvi-am
-
-install-dvi-am: $(DVIS)
- @$(NORMAL_INSTALL)
- test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
- @list='$(DVIS)'; for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/$$f"; \
- done
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am: $(HTMLS)
- @$(NORMAL_INSTALL)
- test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
- @list='$(HTMLS)'; for p in $$list; do \
- if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- if test -d "$$d$$p"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
- $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
- echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
- else \
- echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
- fi; \
- done
-install-info: install-info-am
-
-install-info-am: $(INFO_DEPS)
- @$(NORMAL_INSTALL)
- test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
- list='$(INFO_DEPS)'; \
- for file in $$list; do \
- case $$file in \
- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
- esac; \
- if test -f $$file; then d=.; else d=$(srcdir); fi; \
- file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
- for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
- $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
- if test -f $$ifile; then \
- relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
- echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
- $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
- else : ; fi; \
- done; \
- done
- @$(POST_INSTALL)
- @if (install-info --version && \
- install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
- list='$(INFO_DEPS)'; \
- for file in $$list; do \
- relfile=`echo "$$file" | sed 's|^.*/||'`; \
- echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
- install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
- done; \
- else : ; fi
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am: $(PDFS)
- @$(NORMAL_INSTALL)
- test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
- @list='$(PDFS)'; for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/$$f"; \
- done
-install-ps: install-ps-am
-
-install-ps-am: $(PSS)
- @$(NORMAL_INSTALL)
- test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
- @list='$(PSS)'; for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(psdir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(psdir)/$$f"; \
- done
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-aminfo \
- maintainer-clean-generic maintainer-clean-vti
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
- mostlyclean-libtool mostlyclean-vti
-
-pdf: pdf-am
-
-pdf-am: $(PDFS)
-
-ps: ps-am
-
-ps-am: $(PSS)
-
-uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
- uninstall-pdf-am uninstall-ps-am
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- dist-info distclean distclean-generic distclean-libtool \
- distdir dvi dvi-am html html-am info info-am install \
- install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-aminfo \
- maintainer-clean-generic maintainer-clean-vti mostlyclean \
- mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \
- mostlyclean-vti pdf pdf-am ps ps-am uninstall uninstall-am \
- uninstall-dvi-am uninstall-html-am uninstall-info-am \
- uninstall-pdf-am uninstall-ps-am
-
-
-.fig.png:
- fig2dev -L png `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.jpg:
- fig2dev -L jpg `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.eps:
- fig2dev -L eps `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-.fig.pdf:
- fig2dev -L pdf `test -f '$<' || echo '$(srcdir)/'`$< $@
-
-# Make sure that gcrypt.texi is touched if any other source file has
-# been modified. This is required so that the version.texi magic
-# updates the release date.
-gnupg.texi : $(gcrypt_TEXINFOS)
- touch $(srcdir)/gcrypt.texi
-
-online: gcrypt.html gcrypt.pdf gcrypt.info
- set -e; \
- echo "Uploading current manuals to www.gnupg.org ..."; \
- cp libgcrypt-modules.png gcrypt.html/; \
- cp fips-fsm.png gcrypt.html/; \
- user=werner ; dashdevel="" ; \
- if echo "@PACKAGE_VERSION@" | grep -- "-svn" >/dev/null; then \
- dashdevel="-devel" ; \
- cp gcrypt.pdf gcrypt.html/; \
- cp gcrypt.info gcrypt.html/; \
- else \
- rsync -v gcrypt.pdf gcrypt.info \
- $${user}@trithemius.gnupg.org:webspace/manuals/ ; \
- fi ; \
- cd gcrypt.html ; \
- rsync -vr --exclude='.svn' . \
- $${user}@trithemius.gnupg.org:webspace/manuals/gcrypt$${dashdevel}/
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/README.apichanges b/plugins/MirOTR/libgcrypt-1.4.6/doc/README.apichanges
deleted file mode 100644
index 63b64da241..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/README.apichanges
+++ /dev/null
@@ -1,115 +0,0 @@
-README.apichanges 2003-07-28
-
- NOTE: THESE ARE API CHANGES DONE BEFORE THE FIRST STABLE RELEASE SO
- THEY ARE NOT RELEVANT ANYMORE [stable is 1.2.4 right now]
-
-We decided to change a couple of annoying things in Libgcrypt and to
-cleanup the API. The new API better fits into a multi-threaded
-environment and is more consistent. One import change is that all
-functions return error codes from a set of error codes shared between
-GnuPG, GPGME and Libgcrypt.
-
-This file contains some hints on how to port your application from
-libgcrypt <= 1.1.12 to the current API as of 1.1.42. We hope that
-there won't be another need for such a major change.
-
-
-* Types
-
- All types definitions changed to a foo_t scheme; for some time we
- will support the old names but you better start to rename them:
-
- s/GCRY_MPI/gcry_mpi_t/
- s/GcryMPI/gcry_mpi_t/
- s/GCRY_SEXP/gcry_sexp_t/
- s/GcrySexp/gcry_sexp_t/
- s/GCRY_CIPHER_HD/gcry_cipher_hd_t/
- s/GcryCipherHd/gcry_cipher_hd_t/
- s/GCRY_MD_HD/gcry_md_hd_t/
- s/GcryMDHd/gcry_md_hd_t/
-
-* Initialization
-
- For proper initialization of the library, you must call
- gcry_check_version() before calling any other function except for
- these gcry_control operations:
- GCRYCTL_SUSPEND_SECMEM_WARN
- GCRYCTL_DISABLE_INTERNAL_LOCKING
- GCRYCTL_ANY_INITIALIZATION_P
- GCRYCTL_INITIALIZATION_FINISHED_P
-
-
-* Handles
-
- gcry_cipher_open and gcry_md_open do now return an error code
- instead of a NULL handle; the handle is now returned by
- asigning it to the first argument. Example on how to change your
- code:
-
- Old:
-
- hd = gcry_md_open (algo, flags);
- if (!hd)
- {
- fprintf (stderr, "md_open failed: %s\n", gcry_errno (-1));
- ....
-
- New:
-
- rc = gcry_md_open (&hd, algo, flags);
- if (rc)
- {
- fprintf (stderr, "md_open failed: %s\n", gcry_strerror (rc));
- ....
-
- If you are not interested in the error code, you can do it in a
- simplified way:
-
- gcry_md_open (&hd, algo, flags);
- if (!hd)
- abort ();
-
- i.e. the function makes sure that HD points to NULL in case of an error.
- The required change for gcry_cipher_open is similar.
-
-* Message Digests
-
- The order of the arguments to gcry_md_copy has been changed in order
- to be more consistent with other functions of this type. This means
- that the new message digest handle will be a copy of the message
- handle specified by the second argument and stored at the address
- pointed to by the first argument.
-
-* Error codes
-
- gcry_errno () has been removed because it is hard to use in
- multi-threaded environment. You need to save the error code
- returned by the functions and use it either numerical or passing it
- to gcry_strerror (since gcry_strerror is a wrapper function for
- gpg_strerror, the latter function can also be used).
-
- Instead of using the error codes GCRYERR_*, you have to use the
- GPG_ERR_* names.
-
-* S-expressions
-
- gcry_sexp_canon_len used to return a `historical' error code in
- `errcode', this is not the case anymore; the value returned in
- `errcode' is now a standard Libgcrypt (i.e. gpg-error) error code.
-
-* MPI
-
- gcry_mpi_scan and gcry_mpi_print need the size of a provided buffer
- as input and return the number of bytes actually scanned/printed to
- the user. The old API used a single size_t Pointer for both tasks,
- the new API distinguishes between the input and the output values.
-
-* Public Key cryptography
-
- gcry_pk_decrypt used to return a `simple S-expression part' that
- contains a single MPI value. In case the `data' S-expression
- contains a `flags' element, the result S-expression is filled with a
- complete S-expression of the following format:
-
- (value PLAINTEXT)
-
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/authors.txt b/plugins/MirOTR/libgcrypt-1.4.6/doc/authors.txt
deleted file mode 100644
index 5eef49c084..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/authors.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-gpgvs
-building gnupg related projects with Visual Studio
-
-Authors:
- Francesco Picasso
- mr.s0rr0w@gmail.com
- www.s0rr0w.net \ No newline at end of file
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.eps b/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.eps
deleted file mode 100644
index ec3f683875..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.eps
+++ /dev/null
@@ -1,580 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: fips-fsm.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Thu Jul 9 13:24:33 2009
-%%For: wk@vigenere (Werner Koch,,,)
-%%BoundingBox: 0 0 497 579
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-/col32 {0.609 0.000 0.000 srgb} bind def
-/col33 {0.547 0.547 0.547 srgb} bind def
-/col34 {0.547 0.547 0.547 srgb} bind def
-/col35 {0.258 0.258 0.258 srgb} bind def
-/col36 {0.547 0.547 0.547 srgb} bind def
-/col37 {0.258 0.258 0.258 srgb} bind def
-/col38 {0.547 0.547 0.547 srgb} bind def
-/col39 {0.258 0.258 0.258 srgb} bind def
-/col40 {0.547 0.547 0.547 srgb} bind def
-/col41 {0.258 0.258 0.258 srgb} bind def
-/col42 {0.547 0.547 0.547 srgb} bind def
-/col43 {0.258 0.258 0.258 srgb} bind def
-
-end
-save
-newpath 0 579 moveto 0 0 lineto 497 0 lineto 497 579 lineto closepath clip newpath
--56.9 596.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Courier-Oblique /Courier-Oblique-iso isovec ReEncode
-/Times-Roman /Times-Roman-iso isovec ReEncode
- /DrawEllipse {
- /endangle exch def
- /startangle exch def
- /yrad exch def
- /xrad exch def
- /y exch def
- /x exch def
- /savematrix mtrx currentmatrix def
- x y tr xrad yrad sc 0 0 1 startangle endangle arc
- closepath
- savematrix setmatrix
- } def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06299 0.06299 sc
-%
-% Fig objects follow
-%
-%
-% here starts figure with depth 50
-% Ellipse
-7.500 slw
-n 3238 1735 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-3157 1805 m
-gs 1 -1 sc (1) col0 sh gr
-% Ellipse
-n 2408 3749 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-2327 3819 m
-gs 1 -1 sc (2) col0 sh gr
-% Ellipse
-n 1708 5809 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-1627 5879 m
-gs 1 -1 sc (3) col0 sh gr
-% Ellipse
-n 5848 1685 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-5767 1755 m
-gs 1 -1 sc (6) col0 sh gr
-% Ellipse
-n 6128 7899 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-6047 7969 m
-gs 1 -1 sc (7) col0 sh gr
-% Ellipse
-n 7568 4889 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-7487 4959 m
-gs 1 -1 sc (8) col0 sh gr
-% Ellipse
-n 6008 3879 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-5882 3940 m
-gs 1 -1 sc (10) col0 sh gr
-% Ellipse
-n 5418 2659 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-5292 2720 m
-gs 1 -1 sc (11) col0 sh gr
-% Ellipse
-n 4268 3715 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-4142 3776 m
-gs 1 -1 sc (12) col0 sh gr
-% Ellipse
-n 3208 5865 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-3082 5926 m
-gs 1 -1 sc (13) col0 sh gr
-% Ellipse
-n 4178 6765 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-4052 6826 m
-gs 1 -1 sc (14) col0 sh gr
-% Ellipse
-n 4558 7355 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-4432 7416 m
-gs 1 -1 sc (15) col0 sh gr
-% Ellipse
-n 5208 7365 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-5127 7435 m
-gs 1 -1 sc (5) col0 sh gr
-% Ellipse
-n 3708 7715 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-3582 7776 m
-gs 1 -1 sc (16) col0 sh gr
-% Ellipse
-n 3038 7925 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-2957 7995 m
-gs 1 -1 sc (4) col0 sh gr
-% Ellipse
-n 6568 5895 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-6487 5965 m
-gs 1 -1 sc (9) col0 sh gr
-% Polyline
-n 3900 8370 m 3600 8370 3600 9150 300 arcto 4 {pop} repeat
- 3600 9450 5670 9450 300 arcto 4 {pop} repeat
- 5970 9450 5970 8670 300 arcto 4 {pop} repeat
- 5970 8370 3900 8370 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-3870 9000 m
-gs 1 -1 sc (Operational) col0 sh gr
-% Polyline
-n 1215 4335 m 915 4335 915 5145 300 arcto 4 {pop} repeat
- 915 5445 2640 5445 300 arcto 4 {pop} repeat
- 2940 5445 2940 4635 300 arcto 4 {pop} repeat
- 2940 4335 1215 4335 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-1620 4995 m
-gs 1 -1 sc (Init) col0 sh gr
-% Polyline
-n 1230 6345 m 930 6345 930 7155 300 arcto 4 {pop} repeat
- 930 7455 2655 7455 300 arcto 4 {pop} repeat
- 2955 7455 2955 6645 300 arcto 4 {pop} repeat
- 2955 6345 1230 6345 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-1215 7020 m
-gs 1 -1 sc (Self-Test) col0 sh gr
-% Polyline
-n 7050 6360 m 6750 6360 6750 7170 300 arcto 4 {pop} repeat
- 6750 7470 8475 7470 300 arcto 4 {pop} repeat
- 8775 7470 8775 6660 300 arcto 4 {pop} repeat
- 8775 6360 7050 6360 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-7335 7020 m
-gs 1 -1 sc (Error) col0 sh gr
-% Polyline
-n 4125 4335 m 3825 4335 3825 5145 300 arcto 4 {pop} repeat
- 3825 5445 5550 5445 300 arcto 4 {pop} repeat
- 5850 5445 5850 4635 300 arcto 4 {pop} repeat
- 5850 4335 4125 4335 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-3915 4995 m
-gs 1 -1 sc (Fatal-Error) col0 sh gr
-% Polyline
-n 7050 2310 m 6750 2310 6750 3120 300 arcto 4 {pop} repeat
- 6750 3420 8475 3420 300 arcto 4 {pop} repeat
- 8775 3420 8775 2610 300 arcto 4 {pop} repeat
- 8775 2310 7050 2310 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-6930 2970 m
-gs 1 -1 sc (Shutdown) col0 sh gr
-% Polyline
-n 2775 2295 m 2475 2295 2475 3105 300 arcto 4 {pop} repeat
- 2475 3405 4200 3405 300 arcto 4 {pop} repeat
- 4500 3405 4500 2595 300 arcto 4 {pop} repeat
- 4500 2295 2775 2295 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-2655 2970 m
-gs 1 -1 sc (Power-On) col0 sh gr
-% Polyline
-n 2775 285 m 2475 285 2475 1095 300 arcto 4 {pop} repeat
- 2475 1395 4200 1395 300 arcto 4 {pop} repeat
- 4500 1395 4500 585 300 arcto 4 {pop} repeat
- 4500 285 2775 285 300 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Times-Roman-iso ff 360.00 scf sf
-2565 945 m
-gs 1 -1 sc (Power-Off) col0 sh gr
-% Ellipse
-n 4192 6338 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-4066 6399 m
-gs 1 -1 sc (17) col0 sh gr
-% Ellipse
-n 3202 4507 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-3076 4568 m
-gs 1 -1 sc (19) col0 sh gr
-% Ellipse
-n 3181 5161 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-3055 5222 m
-gs 1 -1 sc (18) col0 sh gr
-% Ellipse
-n 7709 7996 142 142 0 360 DrawEllipse gs col0 s gr
-
-/Courier-Oblique-iso ff 180.00 scf sf
-7612 8047 m
-gs 1 -1 sc (20) col0 sh gr
-% Arc
-15.000 slw
-1 slc
-gs clippath
-2899 6648 m 2920 6766 l 3203 6716 l 2957 6699 l 3182 6598 l cp
-eoclip
-n 4837.5 16740.0 10215.6 -79.2 -100.8 arcn
-gs col0 s gr
- gr
-
-% arrowhead
-0 slc
-n 3182 6598 m 2957 6699 l 3203 6716 l 3182 6598 l cp gs 0.00 setgray ef gr col0 s
-% Arc
-1 slc
-gs clippath
-2911 7184 m 2908 7304 l 3195 7313 l 2957 7246 l 3198 7193 l cp
-eoclip
-n 3026.1 8399.8 1159.2 -1.5 -95.0 arcn
-gs col0 s gr
- gr
-
-% arrowhead
-0 slc
-n 3198 7193 m 2957 7246 l 3195 7313 l 3198 7193 l cp gs 0.00 setgray ef gr col0 s
-% Arc
-1 slc
-gs clippath
-6757 6631 m 6772 6512 l 6487 6477 l 6718 6566 l 6472 6596 l cp
-eoclip
-n 7663.1 -2028.8 8647.1 123.6 96.1 arcn
-gs col0 s gr
- gr
-
-% arrowhead
-0 slc
-n 6472 6596 m 6718 6566 l 6487 6477 l 6472 6596 l cp gs 0.00 setgray ef gr col0 s
-% Arc
-1 slc
-gs clippath
-8336 7494 m 8241 7421 l 8066 7650 l 8260 7496 l 8162 7723 l cp
-eoclip
-n 7717.5 7211.2 619.2 155.3 24.7 arcn
-gs col0 s gr
- gr
-
-% arrowhead
-0 slc
-n 8162 7723 m 8260 7496 l 8066 7650 l 8162 7723 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-3360 2310 m 3480 2310 l 3480 2023 l 3420 2263 l 3360 2023 l cp
-eoclip
-n 3420 1395 m
- 3420 2295 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 3360 2023 m 3420 2263 l 3480 2023 l 3360 2023 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-4794 4378 m 4860 4278 l 4621 4118 l 4788 4302 l 4555 4218 l cp
-eoclip
-n 3465 3420 m
- 4815 4320 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 4555 4218 m 4788 4302 l 4621 4118 l 4555 4218 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-1830 6360 m 1950 6360 l 1950 6073 l 1890 6313 l 1830 6073 l cp
-eoclip
-n 1890 5445 m
- 1890 6345 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 1830 6073 m 1890 6313 l 1950 6073 l 1830 6073 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-3699 8465 m 3790 8386 l 3601 8170 l 3714 8391 l 3511 8249 l cp
-eoclip
-n 2835 7380 m
- 3735 8415 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 3511 8249 m 3714 8391 l 3601 8170 l 3511 8249 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-4785 5475 m 4665 5475 l 4665 5762 l 4725 5522 l 4785 5762 l cp
-eoclip
-n 4725 8370 m
- 4725 5490 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 4785 5762 m 4725 5522 l 4665 5762 l 4785 5762 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-7395 3432 m 7287 3380 l 7162 3639 l 7321 3449 l 7270 3691 l cp
-eoclip
-n 4950 8370 m
- 7335 3420 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 7270 3691 m 7321 3449 l 7162 3639 l 7270 3691 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-6765 6990 m 6765 6870 l 6478 6870 l 6718 6930 l 6478 6990 l cp
-eoclip
-n 2925 6930 m
- 6750 6930 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 6478 6990 m 6718 6930 l 6478 6870 l 6478 6990 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-3969 5384 m 3880 5303 l 3686 5515 l 3893 5379 l 3774 5596 l cp
-eoclip
-n 2880 6480 m
- 3915 5355 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 3774 5596 m 3893 5379 l 3686 5515 l 3774 5596 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-6765 2895 m 6765 2775 l 6478 2775 l 6718 2835 l 6478 2895 l cp
-eoclip
-n 4500 2835 m
- 6750 2835 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 6478 2895 m 6718 2835 l 6478 2775 l 6478 2895 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-7800 3405 m 7680 3405 l 7680 3692 l 7740 3452 l 7800 3692 l cp
-eoclip
-n 7740 6345 m
- 7740 3420 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 7800 3692 m 7740 3452 l 7680 3692 l 7800 3692 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-1846 4276 m 1908 4379 l 2154 4229 l 1918 4303 l 2092 4127 l cp
-eoclip
-n 3375 3420 m
- 1890 4320 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 2092 4127 m 1918 4303 l 2154 4229 l 2092 4127 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-6893 3361 m 6808 3276 l 6604 3480 l 6817 3353 l 6689 3565 l cp
-eoclip
-n 5760 4410 m
- 6840 3330 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 6689 3565 m 6817 3353 l 6604 3480 l 6689 3565 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-4510 794 m 4461 903 l 4724 1020 l 4530 868 l 4773 910 l cp
-eoclip
-n 7740 2295 m
- 4500 855 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 4773 910 m 4530 868 l 4724 1020 l 4773 910 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-5791 5301 m 5706 5386 l 5910 5590 l 5783 5378 l 5995 5505 l cp
-eoclip
-n 6840 6435 m
- 5760 5355 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 5995 5505 m 5783 5378 l 5910 5590 l 5995 5505 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-6895 7408 m 6804 7329 l 6615 7545 l 6819 7404 l 6706 7624 l cp
-eoclip
-n 5895 8460 m
- 6840 7380 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 6706 7624 m 6819 7404 l 6615 7545 l 6706 7624 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-1 slc
-gs clippath
-3840 4740 m 3840 4620 l 3553 4620 l 3793 4680 l 3553 4740 l cp
-eoclip
-n 2925 4680 m
- 3825 4680 l gs col0 s gr gr
-
-% arrowhead
-0 slc
-n 3553 4740 m 3793 4680 l 3553 4620 l 3553 4740 l cp gs 0.00 setgray ef gr col0 s
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.fig b/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.fig
deleted file mode 100644
index a4f0aeceef..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.fig
+++ /dev/null
@@ -1,199 +0,0 @@
-#FIG 3.2
-Portrait
-Center
-Metric
-A4
-100.00
-Single
--2
-1200 2
-0 32 #9c0000
-0 33 #8c8c8c
-0 34 #8c8c8c
-0 35 #424242
-0 36 #8c8c8c
-0 37 #424242
-0 38 #8c8c8c
-0 39 #424242
-0 40 #8c8c8c
-0 41 #424242
-0 42 #8c8c8c
-0 43 #424242
-6 900 270 8775 9450
-5 1 0 2 0 7 50 -1 -1 0.000 1 1 1 0 4837.500 16740.000 6750 6705 4725 6525 2925 6705
- 1 1 2.00 120.00 240.00
-5 1 0 2 0 7 50 -1 -1 0.000 1 1 1 0 3026.138 8399.825 4185 8370 3870 7605 2925 7245
- 1 1 2.00 120.00 240.00
-5 1 0 2 0 7 50 -1 -1 0.000 1 1 1 0 7663.125 -2028.750 2880 5175 4770 6120 6750 6570
- 1 1 2.00 120.00 240.00
-5 1 0 2 0 7 50 -1 -1 0.000 1 1 1 0 7717.500 7211.250 7155 7470 7740 7830 8280 7470
- 1 1 2.00 120.00 240.00
-6 3096 1593 3380 1877
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3238 1735 142 142 3238 1735 3103 1690
-4 0 0 50 -1 13 12 0.0000 4 105 105 3157 1805 1\001
--6
-6 2266 3607 2550 3891
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2408 3749 142 142 2408 3749 2273 3704
-4 0 0 50 -1 13 12 0.0000 4 105 105 2327 3819 2\001
--6
-6 1566 5667 1850 5951
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1708 5809 142 142 1708 5809 1573 5764
-4 0 0 50 -1 13 12 0.0000 4 105 105 1627 5879 3\001
--6
-6 5706 1543 5990 1827
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5848 1685 142 142 5848 1685 5713 1640
-4 0 0 50 -1 13 12 0.0000 4 105 105 5767 1755 6\001
--6
-6 5986 7757 6270 8041
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 6128 7899 142 142 6128 7899 5993 7854
-4 0 0 50 -1 13 12 0.0000 4 105 105 6047 7969 7\001
--6
-6 7426 4747 7710 5031
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 7568 4889 142 142 7568 4889 7433 4844
-4 0 0 50 -1 13 12 0.0000 4 105 105 7487 4959 8\001
--6
-6 5866 3737 6150 4021
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 6008 3879 142 142 6008 3879 5873 3834
-4 0 0 50 -1 13 12 0.0000 4 105 210 5882 3940 10\001
--6
-6 5276 2517 5560 2801
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5418 2659 142 142 5418 2659 5283 2614
-4 0 0 50 -1 13 12 0.0000 4 105 210 5292 2720 11\001
--6
-6 4126 3573 4410 3857
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4268 3715 142 142 4268 3715 4133 3670
-4 0 0 50 -1 13 12 0.0000 4 105 210 4142 3776 12\001
--6
-6 3066 5723 3350 6007
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3208 5865 142 142 3208 5865 3073 5820
-4 0 0 50 -1 13 12 0.0000 4 105 210 3082 5926 13\001
--6
-6 4036 6623 4320 6907
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4178 6765 142 142 4178 6765 4043 6720
-4 0 0 50 -1 13 12 0.0000 4 105 210 4052 6826 14\001
--6
-6 4416 7213 4700 7497
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4558 7355 142 142 4558 7355 4423 7310
-4 0 0 50 -1 13 12 0.0000 4 105 210 4432 7416 15\001
--6
-6 5066 7223 5350 7507
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5208 7365 142 142 5208 7365 5073 7320
-4 0 0 50 -1 13 12 0.0000 4 105 105 5127 7435 5\001
--6
-6 3566 7573 3850 7857
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3708 7715 142 142 3708 7715 3573 7670
-4 0 0 50 -1 13 12 0.0000 4 105 210 3582 7776 16\001
--6
-6 2896 7783 3180 8067
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3038 7925 142 142 3038 7925 2903 7880
-4 0 0 50 -1 13 12 0.0000 4 105 105 2957 7995 4\001
--6
-6 6426 5753 6710 6037
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 6568 5895 142 142 6568 5895 6433 5850
-4 0 0 50 -1 13 12 0.0000 4 105 105 6487 5965 9\001
--6
-6 3600 8370 5985 9450
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 5970 9450 3600 9450 3600 8370 5970 8370 5970 9450
-4 0 0 50 -1 0 24 0.0000 4 330 1725 3870 9000 Operational\001
--6
-6 900 4320 2970 5445
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 2940 5445 915 5445 915 4335 2940 4335 2940 5445
-4 0 0 50 -1 0 24 0.0000 4 240 510 1620 4995 Init\001
--6
-6 900 6345 2970 7470
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 2955 7455 930 7455 930 6345 2955 6345 2955 7455
-4 0 0 50 -1 0 24 0.0000 4 255 1335 1215 7020 Self-Test\001
--6
-6 6750 6345 8775 7470
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 8775 7470 6750 7470 6750 6360 8775 6360 8775 7470
-4 0 0 50 -1 0 24 0.0000 4 240 765 7335 7020 Error\001
--6
-6 3825 4320 5850 5445
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 5850 5445 3825 5445 3825 4335 5850 4335 5850 5445
-4 0 0 50 -1 0 24 0.0000 4 255 1620 3915 4995 Fatal-Error\001
--6
-6 6750 2295 8775 3420
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 8775 3420 6750 3420 6750 2310 8775 2310 8775 3420
-4 0 0 50 -1 0 24 0.0000 4 240 1455 6930 2970 Shutdown\001
--6
-6 2475 2295 4500 3420
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 4500 3405 2475 3405 2475 2295 4500 2295 4500 3405
-4 0 0 50 -1 0 24 0.0000 4 240 1470 2655 2970 Power-On\001
--6
-6 2475 270 4500 1395
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 20 0 0 5
- 4500 1395 2475 1395 2475 285 4500 285 4500 1395
-4 0 0 50 -1 0 24 0.0000 4 240 1530 2565 945 Power-Off\001
--6
-6 4050 6196 4334 6480
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4192 6338 142 142 4192 6338 4057 6293
-4 0 0 50 -1 13 12 0.0000 4 105 210 4066 6399 17\001
--6
-6 3053 4358 3351 4656
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3202 4507 142 142 3202 4507 3067 4462
-4 0 0 50 -1 13 12 0.0000 4 105 210 3076 4568 19\001
--6
-6 3032 5012 3330 5310
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3181 5161 142 142 3181 5161 3046 5116
-4 0 0 50 -1 13 12 0.0000 4 105 210 3055 5222 18\001
--6
-6 7560 7847 7858 8145
-1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 7709 7996 142 142 7709 7996 7574 7951
-4 0 0 50 -1 13 12 0.0000 4 105 210 7612 8047 20\001
--6
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 3420 1395 3420 2295
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 3465 3420 4815 4320
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 1890 5445 1890 6345
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 2835 7380 3735 8415
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 4725 8370 4725 5490
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 4950 8370 7335 3420
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 2925 6930 6750 6930
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 2880 6480 3915 5355
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 4500 2835 6750 2835
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 7740 6345 7740 3420
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 3375 3420 1890 4320
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 5760 4410 6840 3330
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 7740 2295 4500 855
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 6840 6435 5760 5355
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 5895 8460 6840 7380
-2 1 0 2 0 7 50 -1 -1 0.000 0 1 -1 1 0 2
- 1 1 2.00 120.00 240.00
- 2925 4680 3825 4680
--6
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.pdf b/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.pdf
deleted file mode 100644
index 0ea00af1f8..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.pdf
+++ /dev/null
Binary files differ
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.png b/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.png
deleted file mode 100644
index 5da2442a6c..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/fips-fsm.png
+++ /dev/null
Binary files differ
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.info b/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.info
deleted file mode 100644
index 0c6c6ee847..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.info
+++ /dev/null
@@ -1,6839 +0,0 @@
-This is gcrypt.info, produced by makeinfo version 4.13 from gcrypt.texi.
-
-This manual is for Libgcrypt (version 1.4.6, 9 July 2009), which is
-GNU's library of cryptographic building blocks.
-
- Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free
-Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version. The text of the
- license can be found in the section entitled "GNU General Public
- License".
-
-INFO-DIR-SECTION GNU Libraries
-START-INFO-DIR-ENTRY
-* libgcrypt: (gcrypt). Cryptographic function library.
-END-INFO-DIR-ENTRY
-
-
-File: gcrypt.info, Node: Top, Next: Introduction, Up: (dir)
-
-The Libgcrypt Library
-*********************
-
-This manual is for Libgcrypt (version 1.4.6, 9 July 2009), which is
-GNU's library of cryptographic building blocks.
-
- Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free
-Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version. The text of the
- license can be found in the section entitled "GNU General Public
- License".
-
-* Menu:
-
-* Introduction:: What is Libgcrypt.
-* Preparation:: What you should do before using the library.
-* Generalities:: General library functions and data types.
-* Handler Functions:: Working with handler functions.
-* Symmetric cryptography:: How to use symmetric cryptography.
-* Public Key cryptography:: How to use public key cryptography.
-* Hashing:: How to use hash and MAC algorithms.
-* Random Numbers:: How to work with random numbers.
-* S-expressions:: How to manage S-expressions.
-* MPI library:: How to work with multi-precision-integers.
-* Prime numbers:: How to use the Prime number related functions.
-* Utilities:: Utility functions.
-* Architecture:: How Libgcrypt works internally.
-
-Appendices
-
-* Self-Tests:: Description of the self-tests.
-* FIPS Mode:: Description of the FIPS mode.
-* Library Copying:: The GNU Lesser General Public License
- says how you can copy and share Libgcrypt.
-* Copying:: The GNU General Public License says how you
- can copy and share some parts of Libgcrypt.
-
-Indices
-
-* Figures and Tables:: Index of figures and tables.
-* Concept Index:: Index of concepts and programs.
-* Function and Data Index:: Index of functions, variables and data types.
-
-
-File: gcrypt.info, Node: Introduction, Next: Preparation, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-Libgcrypt is a library providing cryptographic building blocks.
-
-* Menu:
-
-* Getting Started:: How to use this manual.
-* Features:: A glance at Libgcrypt's features.
-* Overview:: Overview about the library.
-
-
-File: gcrypt.info, Node: Getting Started, Next: Features, Up: Introduction
-
-1.1 Getting Started
-===================
-
-This manual documents the Libgcrypt library application programming
-interface (API). All functions and data types provided by the library
-are explained.
-
-The reader is assumed to possess basic knowledge about applied
-cryptography.
-
- This manual can be used in several ways. If read from the beginning
-to the end, it gives a good introduction into the library and how it
-can be used in an application. Forward references are included where
-necessary. Later on, the manual can be used as a reference manual to
-get just the information needed about any particular interface of the
-library. Experienced programmers might want to start looking at the
-examples at the end of the manual, and then only read up those parts of
-the interface which are unclear.
-
-
-File: gcrypt.info, Node: Features, Next: Overview, Prev: Getting Started, Up: Introduction
-
-1.2 Features
-============
-
-Libgcrypt might have a couple of advantages over other libraries doing
-a similar job.
-
-It's Free Software
- Anybody can use, modify, and redistribute it under the terms of
- the GNU Lesser General Public License (*note Library Copying::).
- Note, that some parts (which are in general not needed by
- applications) are subject to the terms of the GNU General Public
- License (*note Copying::); please see the README file of the
- distribution for of list of these parts.
-
-It encapsulates the low level cryptography
- Libgcrypt provides a high level interface to cryptographic
- building blocks using an extensible and flexible API.
-
-
-
-File: gcrypt.info, Node: Overview, Prev: Features, Up: Introduction
-
-1.3 Overview
-============
-
-The Libgcrypt library is fully thread-safe, where it makes sense to be
-thread-safe. Not thread-safe are some cryptographic functions that
-modify a certain context stored in handles. If the user really intents
-to use such functions from different threads on the same handle, he has
-to take care of the serialization of such functions himself. If not
-described otherwise, every function is thread-safe.
-
- Libgcrypt depends on the library `libgpg-error', which contains
-common error handling related code for GnuPG components.
-
-
-File: gcrypt.info, Node: Preparation, Next: Generalities, Prev: Introduction, Up: Top
-
-2 Preparation
-*************
-
-To use Libgcrypt, you have to perform some changes to your sources and
-the build system. The necessary changes are small and explained in the
-following sections. At the end of this chapter, it is described how
-the library is initialized, and how the requirements of the library are
-verified.
-
-* Menu:
-
-* Header:: What header file you need to include.
-* Building sources:: How to build sources using the library.
-* Building sources using Automake:: How to build sources with the help of Automake.
-* Initializing the library:: How to initialize the library.
-* Multi-Threading:: How Libgcrypt can be used in a MT environment.
-* Enabling FIPS mode:: How to enable the FIPS mode.
-
-
-File: gcrypt.info, Node: Header, Next: Building sources, Up: Preparation
-
-2.1 Header
-==========
-
-All interfaces (data types and functions) of the library are defined in
-the header file `gcrypt.h'. You must include this in all source files
-using the library, either directly or through some other header file,
-like this:
-
- #include <gcrypt.h>
-
- The name space of Libgcrypt is `gcry_*' for function and type names
-and `GCRY*' for other symbols. In addition the same name prefixes with
-one prepended underscore are reserved for internal use and should never
-be used by an application. Note that Libgcrypt uses libgpg-error,
-which uses `gpg_*' as name space for function and type names and
-`GPG_*' for other symbols, including all the error codes.
-
-Certain parts of gcrypt.h may be excluded by defining these macros:
-
-`GCRYPT_NO_MPI_MACROS'
- Do not define the shorthand macros `mpi_*' for `gcry_mpi_*'.
-
-`GCRYPT_NO_DEPRECATED'
- Do not include defintions for deprecated features. This is useful
- to make sure that no deprecated features are used.
-
-
-File: gcrypt.info, Node: Building sources, Next: Building sources using Automake, Prev: Header, Up: Preparation
-
-2.2 Building sources
-====================
-
-If you want to compile a source file including the `gcrypt.h' header
-file, you must make sure that the compiler can find it in the directory
-hierarchy. This is accomplished by adding the path to the directory in
-which the header file is located to the compilers include file search
-path (via the `-I' option).
-
- However, the path to the include file is determined at the time the
-source is configured. To solve this problem, Libgcrypt ships with a
-small helper program `libgcrypt-config' that knows the path to the
-include file and other configuration options. The options that need to
-be added to the compiler invocation at compile time are output by the
-`--cflags' option to `libgcrypt-config'. The following example shows
-how it can be used at the command line:
-
- gcc -c foo.c `libgcrypt-config --cflags`
-
- Adding the output of `libgcrypt-config --cflags' to the compilers
-command line will ensure that the compiler can find the Libgcrypt header
-file.
-
- A similar problem occurs when linking the program with the library.
-Again, the compiler has to find the library files. For this to work,
-the path to the library files has to be added to the library search path
-(via the `-L' option). For this, the option `--libs' to
-`libgcrypt-config' can be used. For convenience, this option also
-outputs all other options that are required to link the program with
-the Libgcrypt libraries (in particular, the `-lgcrypt' option). The
-example shows how to link `foo.o' with the Libgcrypt library to a
-program `foo'.
-
- gcc -o foo foo.o `libgcrypt-config --libs`
-
- Of course you can also combine both examples to a single command by
-specifying both options to `libgcrypt-config':
-
- gcc -o foo foo.c `libgcrypt-config --cflags --libs`
-
-
-File: gcrypt.info, Node: Building sources using Automake, Next: Initializing the library, Prev: Building sources, Up: Preparation
-
-2.3 Building sources using Automake
-===================================
-
-It is much easier if you use GNU Automake instead of writing your own
-Makefiles. If you do that, you do not have to worry about finding and
-invoking the `libgcrypt-config' script at all. Libgcrypt provides an
-extension to Automake that does all the work for you.
-
- -- Macro: AM_PATH_LIBGCRYPT ([MINIMUM-VERSION], [ACTION-IF-FOUND],
- [ACTION-IF-NOT-FOUND])
- Check whether Libgcrypt (at least version MINIMUM-VERSION, if
- given) exists on the host system. If it is found, execute
- ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND, if given.
-
- Additionally, the function defines `LIBGCRYPT_CFLAGS' to the flags
- needed for compilation of the program to find the `gcrypt.h'
- header file, and `LIBGCRYPT_LIBS' to the linker flags needed to
- link the program to the Libgcrypt library.
-
- You can use the defined Autoconf variables like this in your
-`Makefile.am':
-
- AM_CPPFLAGS = $(LIBGCRYPT_CFLAGS)
- LDADD = $(LIBGCRYPT_LIBS)
-
-
-File: gcrypt.info, Node: Initializing the library, Next: Multi-Threading, Prev: Building sources using Automake, Up: Preparation
-
-2.4 Initializing the library
-============================
-
-Before the library can be used, it must initialize itself. This is
-achieved by invoking the function `gcry_check_version' described below.
-
- Also, it is often desirable to check that the version of Libgcrypt
-used is indeed one which fits all requirements. Even with binary
-compatibility, new features may have been introduced, but due to
-problem with the dynamic linker an old version may actually be used.
-So you may want to check that the version is okay right after program
-startup.
-
- -- Function: const char * gcry_check_version (const char *REQ_VERSION)
- The function `gcry_check_version' initializes some subsystems used
- by Libgcrypt and must be invoked before any other function in the
- library, with the exception of the `GCRYCTL_SET_THREAD_CBS' command
- (called via the `gcry_control' function). *Note Multi-Threading::.
-
- Furthermore, this function returns the version number of the
- library. It can also verify that the version number is higher
- than a certain required version number REQ_VERSION, if this value
- is not a null pointer.
-
- Libgcrypt uses a concept known as secure memory, which is a region of
-memory set aside for storing sensitive data. Because such memory is a
-scarce resource, it needs to be setup in advanced to a fixed size.
-Further, most operating systems have special requirements on how that
-secure memory can be used. For example, it might be required to install
-an application as "setuid(root)" to allow allocating such memory.
-Libgcrypt requires a sequence of initialization steps to make sure that
-this works correctly. The following examples show the necessary steps.
-
- If you don't have a need for secure memory, for example if your
-application does not use secret keys or other confidential data or it
-runs in a controlled environment where key material floating around in
-memory is not a problem, you should initialize Libgcrypt this way:
-
- /* Version check should be the very first call because it
- makes sure that important subsystems are intialized. */
- if (!gcry_check_version (GCRYPT_VERSION))
- {
- fputs ("libgcrypt version mismatch\n", stderr);
- exit (2);
- }
-
- /* Disable secure memory. */
- gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
-
- /* ... If required, other initialization goes here. */
-
- /* Tell Libgcrypt that initialization has completed. */
- gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
-
- If you have to protect your keys or other information in memory
-against being swapped out to disk and to enable an automatic overwrite
-of used and freed memory, you need to initialize Libgcrypt this way:
-
- /* Version check should be the very first call because it
- makes sure that important subsystems are intialized. */
- if (!gcry_check_version (GCRYPT_VERSION))
- {
- fputs ("libgcrypt version mismatch\n", stderr);
- exit (2);
- }
-
- /* We don't want to see any warnings, e.g. because we have not yet
- parsed program options which might be used to suppress such
- warnings. */
- gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
-
- /* ... If required, other initialization goes here. Note that the
- process might still be running with increased privileges and that
- the secure memory has not been intialized. */
-
- /* Allocate a pool of 16k secure memory. This make the secure memory
- available and also drops privileges where needed. */
- gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
-
- /* It is now okay to let Libgcrypt complain when there was/is
- a problem with the secure memory. */
- gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
-
- /* ... If required, other initialization goes here. */
-
- /* Tell Libgcrypt that initialization has completed. */
- gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
-
- It is important that these initialization steps are not done by a
-library but by the actual application. A library using Libgcrypt might
-want to check for finished initialization using:
-
- if (!gcry_control (GCRYCTL_INITIALIZATION_FINISHED_P))
- {
- fputs ("libgcrypt has not been initialized\n", stderr);
- abort ();
- }
-
- Instead of terminating the process, the library may instead print a
-warning and try to initialize Libgcrypt itself. See also the section on
-multi-threading below for more pitfalls.
-
-
-File: gcrypt.info, Node: Multi-Threading, Next: Enabling FIPS mode, Prev: Initializing the library, Up: Preparation
-
-2.5 Multi-Threading
-===================
-
-As mentioned earlier, the Libgcrypt library is thread-safe if you
-adhere to the following requirements:
-
- * If your application is multi-threaded, you must set the thread
- support callbacks with the `GCRYCTL_SET_THREAD_CBS' command
- *before* any other function in the library.
-
- This is easy enough if you are indeed writing an application using
- Libgcrypt. It is rather problematic if you are writing a library
- instead. Here are some tips what to do if you are writing a
- library:
-
- If your library requires a certain thread package, just initialize
- Libgcrypt to use this thread package. If your library supports
- multiple thread packages, but needs to be configured, you will
- have to implement a way to determine which thread package the
- application wants to use with your library anyway. Then configure
- Libgcrypt to use this thread package.
-
- If your library is fully reentrant without any special support by a
- thread package, then you are lucky indeed. Unfortunately, this
- does not relieve you from doing either of the two above, or use a
- third option. The third option is to let the application
- initialize Libgcrypt for you. Then you are not using Libgcrypt
- transparently, though.
-
- As if this was not difficult enough, a conflict may arise if two
- libraries try to initialize Libgcrypt independently of each
- others, and both such libraries are then linked into the same
- application. To make it a bit simpler for you, this will probably
- work, but only if both libraries have the same requirement for the
- thread package. This is currently only supported for the
- non-threaded case, GNU Pth and pthread. Support for more thread
- packages is easy to add, so contact us if you require it.
-
- * The function `gcry_check_version' must be called before any other
- function in the library, except the `GCRYCTL_SET_THREAD_CBS'
- command (called via the `gcry_control' function), because it
- initializes the thread support subsystem in Libgcrypt. To achieve
- this in multi-threaded programs, you must synchronize the memory
- with respect to other threads that also want to use Libgcrypt.
- For this, it is sufficient to call `gcry_check_version' before
- creating the other threads using Libgcrypt(1).
-
- * Just like the function `gpg_strerror', the function
- `gcry_strerror' is not thread safe. You have to use
- `gpg_strerror_r' instead.
-
-
- Libgcrypt contains convenient macros, which define the necessary
-thread callbacks for PThread and for GNU Pth:
-
-`GCRY_THREAD_OPTION_PTH_IMPL'
- This macro defines the following (static) symbols:
- `gcry_pth_init', `gcry_pth_mutex_init', `gcry_pth_mutex_destroy',
- `gcry_pth_mutex_lock', `gcry_pth_mutex_unlock', `gcry_pth_read',
- `gcry_pth_write', `gcry_pth_select', `gcry_pth_waitpid',
- `gcry_pth_accept', `gcry_pth_connect', `gcry_threads_pth'.
-
- After including this macro, `gcry_control()' shall be used with a
- command of `GCRYCTL_SET_THREAD_CBS' in order to register the
- thread callback structure named "gcry_threads_pth".
-
-`GCRY_THREAD_OPTION_PTHREAD_IMPL'
- This macro defines the following (static) symbols:
- `gcry_pthread_mutex_init', `gcry_pthread_mutex_destroy',
- `gcry_pthread_mutex_lock', `gcry_pthread_mutex_unlock',
- `gcry_threads_pthread'.
-
- After including this macro, `gcry_control()' shall be used with a
- command of `GCRYCTL_SET_THREAD_CBS' in order to register the
- thread callback structure named "gcry_threads_pthread".
-
- Note that these macros need to be terminated with a semicolon. Keep
-in mind that these are convenient macros for C programmers; C++
-programmers might have to wrap these macros in an "extern C" body.
-
- ---------- Footnotes ----------
-
- (1) At least this is true for POSIX threads, as `pthread_create' is
-a function that synchronizes memory with respects to other threads.
-There are many functions which have this property, a complete list can
-be found in POSIX, IEEE Std 1003.1-2003, Base Definitions, Issue 6, in
-the definition of the term "Memory Synchronization". For other thread
-packages, more relaxed or more strict rules may apply.
-
-
-File: gcrypt.info, Node: Enabling FIPS mode, Prev: Multi-Threading, Up: Preparation
-
-2.6 How to enable the FIPS mode
-===============================
-
-Libgcrypt may be used in a FIPS 140-2 mode. Note, that this does not
-necessary mean that Libcgrypt is an appoved FIPS 140-2 module. Check
-the NIST database at `http://csrc.nist.gov/groups/STM/cmvp/' to see what
-versions of Libgcrypt are approved.
-
- Because FIPS 140 has certain restrictions on the use of cryptography
-which are not always wanted, Libgcrypt needs to be put into FIPS mode
-explicitly. Three alternative mechanisms are provided to switch
-Libgcrypt into this mode:
-
- * If the file `/proc/sys/crypto/fips_enabled' exists and contains a
- numeric value other than `0', Libgcrypt is put into FIPS mode at
- initialization time. Obviously this works only on systems with a
- `proc' file system (i.e. GNU/Linux).
-
- * If the file `/etc/gcrypt/fips_enabled' exists, Libgcrypt is put
- into FIPS mode at initialization time. Note that this filename is
- hardwired and does not depend on any configuration options.
-
- * If the application requests FIPS mode using the control command
- `GCRYCTL_FORCE_FIPS_MODE'. This must be done prior to any
- initialization (i.e. before `gcry_check_version').
-
-
- In addition to the standard FIPS mode, Libgcrypt may also be put into
-an Enforced FIPS mode by writing a non-zero value into the file
-`/etc/gcrypt/fips_enabled'. The Enforced FIPS mode helps to detect
-applications which don't fulfill all requirements for using Libgcrypt
-in FIPS mode (*note FIPS Mode::).
-
- Once Libgcrypt has been put into FIPS mode, it is not possible to
-switch back to standard mode without terminating the process first. If
-the logging verbosity level of Libgcrypt has been set to at least 2,
-the state transitions and the self-tests are logged.
-
-
-File: gcrypt.info, Node: Generalities, Next: Handler Functions, Prev: Preparation, Up: Top
-
-3 Generalities
-**************
-
-* Menu:
-
-* Controlling the library:: Controlling Libgcrypt's behavior.
-* Modules:: Description of extension modules.
-* Error Handling:: Error codes and such.
-
-
-File: gcrypt.info, Node: Controlling the library, Next: Modules, Up: Generalities
-
-3.1 Controlling the library
-===========================
-
- -- Function: gcry_error_t gcry_control (enum gcry_ctl_cmds CMD, ...)
- This function can be used to influence the general behavior of
- Libgcrypt in several ways. Depending on CMD, more arguments can
- or have to be provided.
-
- `GCRYCTL_ENABLE_M_GUARD; Arguments: none'
- This command enables the built-in memory guard. It must not
- be used to activate the memory guard after the memory
- management has already been used; therefore it can ONLY be
- used at initialization time. Note that the memory guard is
- NOT used when the user of the library has set his own memory
- management callbacks.
-
- `GCRYCTL_ENABLE_QUICK_RANDOM; Arguments: none'
- This command inhibits the use the very secure random quality
- level (`GCRY_VERY_STRONG_RANDOM') and degrades all request
- down to `GCRY_STRONG_RANDOM'. In general this is not
- recommened. However, for some applications the extra quality
- random Libgcrypt tries to create is not justified and this
- option may help to get better performace. Please check with
- a crypto expert whether this option can be used for your
- application.
-
- This option can only be used at initialization time.
-
- `GCRYCTL_DUMP_RANDOM_STATS; Arguments: none'
- This command dumps randum number generator related statistics
- to the library's logging stream.
-
- `GCRYCTL_DUMP_MEMORY_STATS; Arguments: none'
- This command dumps memory managment related statistics to the
- library's logging stream.
-
- `GCRYCTL_DUMP_SECMEM_STATS; Arguments: none'
- This command dumps secure memory manamgent related statistics
- to the library's logging stream.
-
- `GCRYCTL_DROP_PRIVS; Arguments: none'
- This command disables the use of secure memory and drops the
- priviliges of the current process. This command has not much
- use; the suggested way to disable secure memory is to use
- `GCRYCTL_DISABLE_SECMEM' right after initialization.
-
- `GCRYCTL_DISABLE_SECMEM; Arguments: none'
- This command disables the use of secure memory. If this
- command is used in FIPS mode, FIPS mode will be disabled and
- the function `gcry_fips_mode_active' returns false. However,
- in Enforced FIPS mode this command has no effect at all.
-
- Many applications do not require secure memory, so they
- should disable it right away. This command should be
- executed right after `gcry_check_version'.
-
- `GCRYCTL_INIT_SECMEM; Arguments: int nbytes'
- This command is used to allocate a pool of secure memory and
- thus enabling the use of secure memory. It also drops all
- extra privileges the process has (i.e. if it is run as setuid
- (root)). If the argument NBYTES is 0, secure memory will be
- disabled. The minimum amount of secure memory allocated is
- currently 16384 bytes; you may thus use a value of 1 to
- request that default size.
-
- `GCRYCTL_TERM_SECMEM; Arguments: none'
- This command zeroises the secure memory and destroys the
- handler. The secure memory pool may not be used anymore
- after running this command. If the secure memory pool as
- already been destroyed, this command has no effect.
- Applications might want to run this command from their exit
- handler to make sure that the secure memory gets properly
- destroyed. This command is not necessarily thread-safe but
- that should not be needed in cleanup code. It may be called
- from a signal handler.
-
- `GCRYCTL_DISABLE_SECMEM_WARN; Arguments: none'
- Disable warning messages about problems with the secure memory
- subsystem. This command should be run right after
- `gcry_check_version'.
-
- `GCRYCTL_SUSPEND_SECMEM_WARN; Arguments: none'
- Postpone warning messages from the secure memory subsystem.
- *Note the initialization example: sample-use-suspend-secmem,
- on how to use it.
-
- `GCRYCTL_RESUME_SECMEM_WARN; Arguments: none'
- Resume warning messages from the secure memory subsystem.
- *Note the initialization example: sample-use-resume-secmem,
- on how to use it.
-
- `GCRYCTL_USE_SECURE_RNDPOOL; Arguments: none'
- This command tells the PRNG to store random numbers in secure
- memory. This command should be run right after
- `gcry_check_version' and not later than the command
- GCRYCTL_INIT_SECMEM. Note that in FIPS mode the secure
- memory is always used.
-
- `GCRYCTL_SET_RANDOM_SEED_FILE; Arguments: const char *filename'
- This command specifies the file, which is to be used as seed
- file for the PRNG. If the seed file is registered prior to
- initialization of the PRNG, the seed file's content (if it
- exists and seems to be valid) is fed into the PRNG pool.
- After the seed file has been registered, the PRNG can be
- signalled to write out the PRNG pool's content into the seed
- file with the following command.
-
- `GCRYCTL_UPDATE_RANDOM_SEED_FILE; Arguments: none'
- Write out the PRNG pool's content into the registered seed
- file.
-
- Multiple instances of the applications sharing the same
- random seed file can be started in parallel, in which case
- they will read out the same pool and then race for updating
- it (the last update overwrites earlier updates). They will
- differentiate only by the weak entropy that is added in
- read_seed_file based on the PID and clock, and up to 16 bytes
- of weak random non-blockingly. The consequence is that the
- output of these different instances is correlated to some
- extent. In a perfect attack scenario, the attacker can
- control (or at least guess) the PID and clock of the
- application, and drain the system's entropy pool to reduce
- the "up to 16 bytes" above to 0. Then the dependencies of the
- inital states of the pools are completely known. Note that
- this is not an issue if random of `GCRY_VERY_STRONG_RANDOM'
- quality is requested as in this case enough extra entropy
- gets mixed. It is also not an issue when using Linux
- (rndlinux driver), because this one guarantees to read full
- 16 bytes from /dev/urandom and thus there is no way for an
- attacker without kernel access to control these 16 bytes.
-
- `GCRYCTL_SET_VERBOSITY; Arguments: int level'
- This command sets the verbosity of the logging. A level of 0
- disables all extra logging whereas positive numbers enable
- more verbose logging. The level may be changed at any time
- but be aware that no memory synchronization is done so the
- effect of this command might not immediately show up in other
- threads. This command may even be used prior to
- `gcry_check_version'.
-
- `GCRYCTL_SET_DEBUG_FLAGS; Arguments: unsigned int flags'
- Set the debug flag bits as given by the argument. Be aware
- that that no memory synchronization is done so the effect of
- this command might not immediately show up in other threads.
- The debug flags are not considered part of the API and thus
- may change without notice. As of now bit 0 enables debugging
- of cipher functions and bit 1 debugging of
- multi-precision-integers. This command may even be used
- prior to `gcry_check_version'.
-
- `GCRYCTL_CLEAR_DEBUG_FLAGS; Arguments: unsigned int flags'
- Set the debug flag bits as given by the argument. Be aware
- that that no memory synchronization is done so the effect of
- this command might not immediately show up in other threads.
- This command may even be used prior to `gcry_check_version'.
-
- `GCRYCTL_DISABLE_INTERNAL_LOCKING; Arguments: none'
- This command does nothing. It exists only for backward
- compatibility.
-
- `GCRYCTL_ANY_INITIALIZATION_P; Arguments: none'
- This command returns true if the library has been basically
- initialized. Such a basic initialization happens implicitly
- with many commands to get certain internal subsystems
- running. The common and suggested way to do this basic
- intialization is by calling gcry_check_version.
-
- `GCRYCTL_INITIALIZATION_FINISHED; Arguments: none'
- This command tells the libray that the application has
- finished the intialization.
-
- `GCRYCTL_INITIALIZATION_FINISHED_P; Arguments: none'
- This command returns true if the command
- GCRYCTL_INITIALIZATION_FINISHED has already been run.
-
- `GCRYCTL_SET_THREAD_CBS; Arguments: struct ath_ops *ath_ops'
- This command registers a thread-callback structure. *Note
- Multi-Threading::.
-
- `GCRYCTL_FAST_POLL; Arguments: none'
- Run a fast random poll.
-
- `GCRYCTL_SET_RNDEGD_SOCKET; Arguments: const char *filename'
- This command may be used to override the default name of the
- EGD socket to connect to. It may be used only during
- initialization as it is not thread safe. Changing the socket
- name again is not supported. The function may return an
- error if the given filename is too long for a local socket
- name.
-
- EGD is an alternative random gatherer, used only on systems
- lacking a proper random device.
-
- `GCRYCTL_PRINT_CONFIG; Arguments: FILE *stream'
- This command dumps information pertaining to the
- configuration of the library to the given stream. If NULL is
- given for STREAM, the log system is used. This command may
- be used before the intialization has been finished but not
- before a gcry_version_check.
-
- `GCRYCTL_OPERATIONAL_P; Arguments: none'
- This command returns true if the library is in an operational
- state. This information makes only sense in FIPS mode. In
- contrast to other functions, this is a pure test function and
- won't put the library into FIPS mode or change the internal
- state. This command may be used before the intialization has
- been finished but not before a gcry_version_check.
-
- `GCRYCTL_FIPS_MODE_P; Arguments: none'
- This command returns true if the library is in FIPS mode.
- Note, that this is no indication about the current state of
- the library. This command may be used before the
- intialization has been finished but not before a
- gcry_version_check. An application may use this command or
- the convenience macro below to check whether FIPS mode is
- actually active.
-
- -- Function: int gcry_fips_mode_active (void)
- Returns true if the FIPS mode is active. Note that this
- is implemented as a macro.
-
- `GCRYCTL_FORCE_FIPS_MODE; Arguments: none'
- Running this command puts the library into FIPS mode. If the
- library is already in FIPS mode, a self-test is triggered and
- thus the library will be put into operational state. This
- command may be used before a call to gcry_check_version and
- that is actually the recommended way to let an application
- switch the library into FIPS mode. Note that Libgcrypt will
- reject an attempt to switch to fips mode during or after the
- intialization.
-
- `GCRYCTL_SELFTEST; Arguments: none'
- This may be used at anytime to have the library run all
- implemented self-tests. It works in standard and in FIPS
- mode. Returns 0 on success or an error code on failure.
-
-
-
-
-File: gcrypt.info, Node: Modules, Next: Error Handling, Prev: Controlling the library, Up: Generalities
-
-3.2 Modules
-===========
-
-Libgcrypt supports the use of `extension modules', which implement
-algorithms in addition to those already built into the library directly.
-
- -- Data type: gcry_module_t
- This data type represents a `module'.
-
- Functions registering modules provided by the user take a `module
-specification structure' as input and return a value of `gcry_module_t'
-and an ID that is unique in the modules' category. This ID can be used
-to reference the newly registered module. After registering a module
-successfully, the new functionality should be able to be used through
-the normal functions provided by Libgcrypt until it is unregistered
-again.
-
-
-File: gcrypt.info, Node: Error Handling, Prev: Modules, Up: Generalities
-
-3.3 Error Handling
-==================
-
-Many functions in Libgcrypt can return an error if they fail. For this
-reason, the application should always catch the error condition and
-take appropriate measures, for example by releasing the resources and
-passing the error up to the caller, or by displaying a descriptive
-message to the user and cancelling the operation.
-
- Some error values do not indicate a system error or an error in the
-operation, but the result of an operation that failed properly. For
-example, if you try to decrypt a tempered message, the decryption will
-fail. Another error value actually means that the end of a data buffer
-or list has been reached. The following descriptions explain for many
-error codes what they mean usually. Some error values have specific
-meanings if returned by a certain functions. Such cases are described
-in the documentation of those functions.
-
- Libgcrypt uses the `libgpg-error' library. This allows to share the
-error codes with other components of the GnuPG system, and to pass
-error values transparently from the crypto engine, or some helper
-application of the crypto engine, to the user. This way no information
-is lost. As a consequence, Libgcrypt does not use its own identifiers
-for error codes, but uses those provided by `libgpg-error'. They
-usually start with `GPG_ERR_'.
-
- However, Libgcrypt does provide aliases for the functions defined in
-libgpg-error, which might be preferred for name space consistency.
-
- Most functions in Libgcrypt return an error code in the case of
-failure. For this reason, the application should always catch the
-error condition and take appropriate measures, for example by releasing
-the resources and passing the error up to the caller, or by displaying
-a descriptive message to the user and canceling the operation.
-
- Some error values do not indicate a system error or an error in the
-operation, but the result of an operation that failed properly.
-
- GnuPG components, including Libgcrypt, use an extra library named
-libgpg-error to provide a common error handling scheme. For more
-information on libgpg-error, see the according manual.
-
-* Menu:
-
-* Error Values:: The error value and what it means.
-* Error Sources:: A list of important error sources.
-* Error Codes:: A list of important error codes.
-* Error Strings:: How to get a descriptive string from a value.
-
-
-File: gcrypt.info, Node: Error Values, Next: Error Sources, Up: Error Handling
-
-3.3.1 Error Values
-------------------
-
- -- Data type: gcry_err_code_t
- The `gcry_err_code_t' type is an alias for the `libgpg-error' type
- `gpg_err_code_t'. The error code indicates the type of an error,
- or the reason why an operation failed.
-
- A list of important error codes can be found in the next section.
-
- -- Data type: gcry_err_source_t
- The `gcry_err_source_t' type is an alias for the `libgpg-error'
- type `gpg_err_source_t'. The error source has not a precisely
- defined meaning. Sometimes it is the place where the error
- happened, sometimes it is the place where an error was encoded
- into an error value. Usually the error source will give an
- indication to where to look for the problem. This is not always
- true, but it is attempted to achieve this goal.
-
- A list of important error sources can be found in the next section.
-
- -- Data type: gcry_error_t
- The `gcry_error_t' type is an alias for the `libgpg-error' type
- `gpg_error_t'. An error value like this has always two
- components, an error code and an error source. Both together form
- the error value.
-
- Thus, the error value can not be directly compared against an error
- code, but the accessor functions described below must be used.
- However, it is guaranteed that only 0 is used to indicate success
- (`GPG_ERR_NO_ERROR'), and that in this case all other parts of the
- error value are set to 0, too.
-
- Note that in Libgcrypt, the error source is used purely for
- diagnostic purposes. Only the error code should be checked to test
- for a certain outcome of a function. The manual only documents the
- error code part of an error value. The error source is left
- unspecified and might be anything.
-
- -- Function: gcry_err_code_t gcry_err_code (gcry_error_t ERR)
- The static inline function `gcry_err_code' returns the
- `gcry_err_code_t' component of the error value ERR. This function
- must be used to extract the error code from an error value in
- order to compare it with the `GPG_ERR_*' error code macros.
-
- -- Function: gcry_err_source_t gcry_err_source (gcry_error_t ERR)
- The static inline function `gcry_err_source' returns the
- `gcry_err_source_t' component of the error value ERR. This
- function must be used to extract the error source from an error
- value in order to compare it with the `GPG_ERR_SOURCE_*' error
- source macros.
-
- -- Function: gcry_error_t gcry_err_make (gcry_err_source_t SOURCE,
- gcry_err_code_t CODE)
- The static inline function `gcry_err_make' returns the error value
- consisting of the error source SOURCE and the error code CODE.
-
- This function can be used in callback functions to construct an
- error value to return it to the library.
-
- -- Function: gcry_error_t gcry_error (gcry_err_code_t CODE)
- The static inline function `gcry_error' returns the error value
- consisting of the default error source and the error code CODE.
-
- For GCRY applications, the default error source is
- `GPG_ERR_SOURCE_USER_1'. You can define `GCRY_ERR_SOURCE_DEFAULT'
- before including `gcrypt.h' to change this default.
-
- This function can be used in callback functions to construct an
- error value to return it to the library.
-
- The `libgpg-error' library provides error codes for all system error
-numbers it knows about. If ERR is an unknown error number, the error
-code `GPG_ERR_UNKNOWN_ERRNO' is used. The following functions can be
-used to construct error values from system errno numbers.
-
- -- Function: gcry_error_t gcry_err_make_from_errno
- (gcry_err_source_t SOURCE, int ERR)
- The function `gcry_err_make_from_errno' is like `gcry_err_make',
- but it takes a system error like `errno' instead of a
- `gcry_err_code_t' error code.
-
- -- Function: gcry_error_t gcry_error_from_errno (int ERR)
- The function `gcry_error_from_errno' is like `gcry_error', but it
- takes a system error like `errno' instead of a `gcry_err_code_t'
- error code.
-
- Sometimes you might want to map system error numbers to error codes
-directly, or map an error code representing a system error back to the
-system error number. The following functions can be used to do that.
-
- -- Function: gcry_err_code_t gcry_err_code_from_errno (int ERR)
- The function `gcry_err_code_from_errno' returns the error code for
- the system error ERR. If ERR is not a known system error, the
- function returns `GPG_ERR_UNKNOWN_ERRNO'.
-
- -- Function: int gcry_err_code_to_errno (gcry_err_code_t ERR)
- The function `gcry_err_code_to_errno' returns the system error for
- the error code ERR. If ERR is not an error code representing a
- system error, or if this system error is not defined on this
- system, the function returns `0'.
-
-
-File: gcrypt.info, Node: Error Sources, Next: Error Codes, Prev: Error Values, Up: Error Handling
-
-3.3.2 Error Sources
--------------------
-
-The library `libgpg-error' defines an error source for every component
-of the GnuPG system. The error source part of an error value is not
-well defined. As such it is mainly useful to improve the diagnostic
-error message for the user.
-
- If the error code part of an error value is `0', the whole error
-value will be `0'. In this case the error source part is of course
-`GPG_ERR_SOURCE_UNKNOWN'.
-
- The list of error sources that might occur in applications using
-Libgcrypt is:
-
-`GPG_ERR_SOURCE_UNKNOWN'
- The error source is not known. The value of this error source is
- `0'.
-
-`GPG_ERR_SOURCE_GPGME'
- The error source is GPGME itself.
-
-`GPG_ERR_SOURCE_GPG'
- The error source is GnuPG, which is the crypto engine used for the
- OpenPGP protocol.
-
-`GPG_ERR_SOURCE_GPGSM'
- The error source is GPGSM, which is the crypto engine used for the
- OpenPGP protocol.
-
-`GPG_ERR_SOURCE_GCRYPT'
- The error source is `libgcrypt', which is used by crypto engines
- to perform cryptographic operations.
-
-`GPG_ERR_SOURCE_GPGAGENT'
- The error source is `gpg-agent', which is used by crypto engines
- to perform operations with the secret key.
-
-`GPG_ERR_SOURCE_PINENTRY'
- The error source is `pinentry', which is used by `gpg-agent' to
- query the passphrase to unlock a secret key.
-
-`GPG_ERR_SOURCE_SCD'
- The error source is the SmartCard Daemon, which is used by
- `gpg-agent' to delegate operations with the secret key to a
- SmartCard.
-
-`GPG_ERR_SOURCE_KEYBOX'
- The error source is `libkbx', a library used by the crypto engines
- to manage local keyrings.
-
-`GPG_ERR_SOURCE_USER_1'
-
-`GPG_ERR_SOURCE_USER_2'
-
-`GPG_ERR_SOURCE_USER_3'
-
-`GPG_ERR_SOURCE_USER_4'
- These error sources are not used by any GnuPG component and can be
- used by other software. For example, applications using Libgcrypt
- can use them to mark error values coming from callback handlers.
- Thus `GPG_ERR_SOURCE_USER_1' is the default for errors created
- with `gcry_error' and `gcry_error_from_errno', unless you define
- `GCRY_ERR_SOURCE_DEFAULT' before including `gcrypt.h'.
-
-
-File: gcrypt.info, Node: Error Codes, Next: Error Strings, Prev: Error Sources, Up: Error Handling
-
-3.3.3 Error Codes
------------------
-
-The library `libgpg-error' defines many error values. The following
-list includes the most important error codes.
-
-`GPG_ERR_EOF'
- This value indicates the end of a list, buffer or file.
-
-`GPG_ERR_NO_ERROR'
- This value indicates success. The value of this error code is
- `0'. Also, it is guaranteed that an error value made from the
- error code `0' will be `0' itself (as a whole). This means that
- the error source information is lost for this error code, however,
- as this error code indicates that no error occurred, this is
- generally not a problem.
-
-`GPG_ERR_GENERAL'
- This value means that something went wrong, but either there is not
- enough information about the problem to return a more useful error
- value, or there is no separate error value for this type of
- problem.
-
-`GPG_ERR_ENOMEM'
- This value means that an out-of-memory condition occurred.
-
-`GPG_ERR_E...'
- System errors are mapped to GPG_ERR_EFOO where FOO is the symbol
- for the system error.
-
-`GPG_ERR_INV_VALUE'
- This value means that some user provided data was out of range.
-
-`GPG_ERR_UNUSABLE_PUBKEY'
- This value means that some recipients for a message were invalid.
-
-`GPG_ERR_UNUSABLE_SECKEY'
- This value means that some signers were invalid.
-
-`GPG_ERR_NO_DATA'
- This value means that data was expected where no data was found.
-
-`GPG_ERR_CONFLICT'
- This value means that a conflict of some sort occurred.
-
-`GPG_ERR_NOT_IMPLEMENTED'
- This value indicates that the specific function (or operation) is
- not implemented. This error should never happen. It can only
- occur if you use certain values or configuration options which do
- not work, but for which we think that they should work at some
- later time.
-
-`GPG_ERR_DECRYPT_FAILED'
- This value indicates that a decryption operation was unsuccessful.
-
-`GPG_ERR_WRONG_KEY_USAGE'
- This value indicates that a key is not used appropriately.
-
-`GPG_ERR_NO_SECKEY'
- This value indicates that no secret key for the user ID is
- available.
-
-`GPG_ERR_UNSUPPORTED_ALGORITHM'
- This value means a verification failed because the cryptographic
- algorithm is not supported by the crypto backend.
-
-`GPG_ERR_BAD_SIGNATURE'
- This value means a verification failed because the signature is
- bad.
-
-`GPG_ERR_NO_PUBKEY'
- This value means a verification failed because the public key is
- not available.
-
-`GPG_ERR_NOT_OPERATIONAL'
- This value means that the library is not yet in state which allows
- to use this function. This error code is in particular returned if
- Libgcrypt is operated in FIPS mode and the internal state of the
- library does not yet or not anymore allow the use of a service.
-
- This error code is only available with newer libgpg-error
- versions, thus you might see "invalid error code" when passing
- this to `gpg_strerror'. The numeric value of this error code is
- 176.
-
-`GPG_ERR_USER_1'
-
-`GPG_ERR_USER_2'
-
-`...'
-
-`GPG_ERR_USER_16'
- These error codes are not used by any GnuPG component and can be
- freely used by other software. Applications using Libgcrypt might
- use them to mark specific errors returned by callback handlers if
- no suitable error codes (including the system errors) for these
- errors exist already.
-
-
-File: gcrypt.info, Node: Error Strings, Prev: Error Codes, Up: Error Handling
-
-3.3.4 Error Strings
--------------------
-
- -- Function: const char * gcry_strerror (gcry_error_t ERR)
- The function `gcry_strerror' returns a pointer to a statically
- allocated string containing a description of the error code
- contained in the error value ERR. This string can be used to
- output a diagnostic message to the user.
-
- -- Function: const char * gcry_strsource (gcry_error_t ERR)
- The function `gcry_strerror' returns a pointer to a statically
- allocated string containing a description of the error source
- contained in the error value ERR. This string can be used to
- output a diagnostic message to the user.
-
- The following example illustrates the use of the functions described
-above:
-
- {
- gcry_cipher_hd_t handle;
- gcry_error_t err = 0;
-
- err = gcry_cipher_open (&handle, GCRY_CIPHER_AES,
- GCRY_CIPHER_MODE_CBC, 0);
- if (err)
- {
- fprintf (stderr, "Failure: %s/%s\n",
- gcry_strsource (err),
- gcry_strerror (err));
- }
- }
-
-
-File: gcrypt.info, Node: Handler Functions, Next: Symmetric cryptography, Prev: Generalities, Up: Top
-
-4 Handler Functions
-*******************
-
-Libgcrypt makes it possible to install so called `handler functions',
-which get called by Libgcrypt in case of certain events.
-
-* Menu:
-
-* Progress handler:: Using a progress handler function.
-* Allocation handler:: Using special memory allocation functions.
-* Error handler:: Using error handler functions.
-* Logging handler:: Using a special logging function.
-
-
-File: gcrypt.info, Node: Progress handler, Next: Allocation handler, Up: Handler Functions
-
-4.1 Progress handler
-====================
-
-It is often useful to retrieve some feedback while long running
-operations are performed.
-
- -- Data type: gcry_handler_progress_t
- Progress handler functions have to be of the type
- `gcry_handler_progress_t', which is defined as:
-
- `void (*gcry_handler_progress_t) (void *, const char *, int, int,
- int)'
-
- The following function may be used to register a handler function for
-this purpose.
-
- -- Function: void gcry_set_progress_handler (gcry_handler_progress_t
- CB, void *CB_DATA)
- This function installs CB as the `Progress handler' function. It
- may be used only during initialization. CB must be defined as
- follows:
-
- void
- my_progress_handler (void *CB_DATA, const char *WHAT,
- int PRINTCHAR, int CURRENT, int TOTAL)
- {
- /* Do something. */
- }
-
- A description of the arguments of the progress handler function
- follows.
-
- CB_DATA
- The argument provided in the call to
- `gcry_set_progress_handler'.
-
- WHAT
- A string identifying the type of the progress output. The
- following values for WHAT are defined:
-
- `need_entropy'
- Not enough entropy is available. TOTAL holds the number
- of required bytes.
-
- `primegen'
- Values for PRINTCHAR:
- `\n'
- Prime generated.
-
- `!'
- Need to refresh the pool of prime numbers.
-
- `<, >'
- Number of bits adjusted.
-
- `^'
- Searching for a generator.
-
- `.'
- Fermat test on 10 candidates failed.
-
- `:'
- Restart with a new random value.
-
- `+'
- Rabin Miller test passed.
-
-
-
-
-File: gcrypt.info, Node: Allocation handler, Next: Error handler, Prev: Progress handler, Up: Handler Functions
-
-4.2 Allocation handler
-======================
-
-It is possible to make Libgcrypt use special memory allocation
-functions instead of the built-in ones.
-
- Memory allocation functions are of the following types:
-
- -- Data type: gcry_handler_alloc_t
- This type is defined as: `void *(*gcry_handler_alloc_t) (size_t
- n)'.
-
- -- Data type: gcry_handler_secure_check_t
- This type is defined as: `int *(*gcry_handler_secure_check_t)
- (const void *)'.
-
- -- Data type: gcry_handler_realloc_t
- This type is defined as: `void *(*gcry_handler_realloc_t) (void
- *p, size_t n)'.
-
- -- Data type: gcry_handler_free_t
- This type is defined as: `void *(*gcry_handler_free_t) (void *)'.
-
- Special memory allocation functions can be installed with the
-following function:
-
- -- Function: void gcry_set_allocation_handler (gcry_handler_alloc_t
- FUNC_ALLOC, gcry_handler_alloc_t FUNC_ALLOC_SECURE,
- gcry_handler_secure_check_t FUNC_SECURE_CHECK,
- gcry_handler_realloc_t FUNC_REALLOC, gcry_handler_free_t
- FUNC_FREE)
- Install the provided functions and use them instead of the built-in
- functions for doing memory allocation. Using this function is in
- general not recommended because the standard Libgcrypt allocation
- functions are guaranteed to zeroize memory if needed.
-
- This function may be used only during initialization and may not be
- used in fips mode.
-
-
-
-File: gcrypt.info, Node: Error handler, Next: Logging handler, Prev: Allocation handler, Up: Handler Functions
-
-4.3 Error handler
-=================
-
-The following functions may be used to register handler functions that
-are called by Libgcrypt in case certain error conditions occur. They
-may and should be registered prior to calling `gcry_check_version'.
-
- -- Data type: gcry_handler_no_mem_t
- This type is defined as: `int (*gcry_handler_no_mem_t) (void *,
- size_t, unsigned int)'
-
- -- Function: void gcry_set_outofcore_handler (gcry_handler_no_mem_t
- FUNC_NO_MEM, void *CB_DATA)
- This function registers FUNC_NO_MEM as `out-of-core handler',
- which means that it will be called in the case of not having enough
- memory available. The handler is called with 3 arguments: The
- first one is the pointer CB_DATA as set with this function, the
- second is the requested memory size and the last being a flag. If
- bit 0 of the flag is set, secure memory has been requested. The
- handler should either return true to indicate that Libgcrypt
- should try again allocating memory or return false to let
- Libgcrypt use its default fatal error handler.
-
- -- Data type: gcry_handler_error_t
- This type is defined as: `void (*gcry_handler_error_t) (void *,
- int, const char *)'
-
- -- Function: void gcry_set_fatalerror_handler (gcry_handler_error_t
- FUNC_ERROR, void *CB_DATA)
- This function registers FUNC_ERROR as `error handler', which means
- that it will be called in error conditions.
-
-
-File: gcrypt.info, Node: Logging handler, Prev: Error handler, Up: Handler Functions
-
-4.4 Logging handler
-===================
-
- -- Data type: gcry_handler_log_t
- This type is defined as: `void (*gcry_handler_log_t) (void *, int,
- const char *, va_list)'
-
- -- Function: void gcry_set_log_handler (gcry_handler_log_t FUNC_LOG,
- void *CB_DATA)
- This function registers FUNC_LOG as `logging handler', which means
- that it will be called in case Libgcrypt wants to log a message.
- This function may and should be used prior to calling
- `gcry_check_version'.
-
-
-File: gcrypt.info, Node: Symmetric cryptography, Next: Public Key cryptography, Prev: Handler Functions, Up: Top
-
-5 Symmetric cryptography
-************************
-
-The cipher functions are used for symmetrical cryptography, i.e.
-cryptography using a shared key. The programming model follows an
-open/process/close paradigm and is in that similar to other building
-blocks provided by Libgcrypt.
-
-* Menu:
-
-* Available ciphers:: List of ciphers supported by the library.
-* Cipher modules:: How to work with cipher modules.
-* Available cipher modes:: List of cipher modes supported by the library.
-* Working with cipher handles:: How to perform operations related to cipher handles.
-* General cipher functions:: General cipher functions independent of cipher handles.
-
-
-File: gcrypt.info, Node: Available ciphers, Next: Cipher modules, Up: Symmetric cryptography
-
-5.1 Available ciphers
-=====================
-
-`GCRY_CIPHER_NONE'
- This is not a real algorithm but used by some functions as error
- return. The value always evaluates to false.
-
-`GCRY_CIPHER_IDEA'
- This is the IDEA algorithm. The constant is provided but there is
- currently no implementation for it because the algorithm is
- patented.
-
-`GCRY_CIPHER_3DES'
- Triple-DES with 3 Keys as EDE. The key size of this algorithm is
- 168 but you have to pass 192 bits because the most significant
- bits of each byte are ignored.
-
-`GCRY_CIPHER_CAST5'
- CAST128-5 block cipher algorithm. The key size is 128 bits.
-
-`GCRY_CIPHER_BLOWFISH'
- The blowfish algorithm. The current implementation allows only for
- a key size of 128 bits.
-
-`GCRY_CIPHER_SAFER_SK128'
- Reserved and not currently implemented.
-
-`GCRY_CIPHER_DES_SK'
- Reserved and not currently implemented.
-
-`GCRY_CIPHER_AES'
-`GCRY_CIPHER_AES128'
-`GCRY_CIPHER_RIJNDAEL'
-`GCRY_CIPHER_RIJNDAEL128'
- AES (Rijndael) with a 128 bit key.
-
-`GCRY_CIPHER_AES192'
-`GCRY_CIPHER_RIJNDAEL192'
- AES (Rijndael) with a 192 bit key.
-
-`GCRY_CIPHER_AES256'
-`GCRY_CIPHER_RIJNDAEL256'
- AES (Rijndael) with a 256 bit key.
-
-`GCRY_CIPHER_TWOFISH'
- The Twofish algorithm with a 256 bit key.
-
-`GCRY_CIPHER_TWOFISH128'
- The Twofish algorithm with a 128 bit key.
-
-`GCRY_CIPHER_ARCFOUR'
- An algorithm which is 100% compatible with RSA Inc.'s RC4
- algorithm. Note that this is a stream cipher and must be used
- very carefully to avoid a couple of weaknesses.
-
-`GCRY_CIPHER_DES'
- Standard DES with a 56 bit key. You need to pass 64 bit but the
- high bits of each byte are ignored. Note, that this is a weak
- algorithm which can be broken in reasonable time using a brute
- force approach.
-
-`GCRY_CIPHER_SERPENT128'
-`GCRY_CIPHER_SERPENT192'
-`GCRY_CIPHER_SERPENT256'
- The Serpent cipher from the AES contest.
-
-`GCRY_CIPHER_RFC2268_40'
-`GCRY_CIPHER_RFC2268_128'
- Ron's Cipher 2 in the 40 and 128 bit variants. Note, that we
- currently only support the 40 bit variant. The identifier for 128
- is reserved for future use.
-
-`GCRY_CIPHER_SEED'
- A 128 bit cipher as described by RFC4269.
-
-`GCRY_CIPHER_CAMELLIA128'
-`GCRY_CIPHER_CAMELLIA192'
-`GCRY_CIPHER_CAMELLIA256'
- The Camellia cipher by NTT. See
- `http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html'.
-
-
-
-File: gcrypt.info, Node: Cipher modules, Next: Available cipher modes, Prev: Available ciphers, Up: Symmetric cryptography
-
-5.2 Cipher modules
-==================
-
-Libgcrypt makes it possible to load additional `cipher modules'; these
-ciphers can be used just like the cipher algorithms that are built into
-the library directly. For an introduction into extension modules, see
-*Note Modules::.
-
- -- Data type: gcry_cipher_spec_t
- This is the `module specification structure' needed for registering
- cipher modules, which has to be filled in by the user before it
- can be used to register a module. It contains the following
- members:
-
- `const char *name'
- The primary name of the algorithm.
-
- `const char **aliases'
- A list of strings that are `aliases' for the algorithm. The
- list must be terminated with a NULL element.
-
- `gcry_cipher_oid_spec_t *oids'
- A list of OIDs that are to be associated with the algorithm.
- The list's last element must have it's `oid' member set to
- NULL. See below for an explanation of this type.
-
- `size_t blocksize'
- The block size of the algorithm, in bytes.
-
- `size_t keylen'
- The length of the key, in bits.
-
- `size_t contextsize'
- The size of the algorithm-specific `context', that should be
- allocated for each handle.
-
- `gcry_cipher_setkey_t setkey'
- The function responsible for initializing a handle with a
- provided key. See below for a description of this type.
-
- `gcry_cipher_encrypt_t encrypt'
- The function responsible for encrypting a single block. See
- below for a description of this type.
-
- `gcry_cipher_decrypt_t decrypt'
- The function responsible for decrypting a single block. See
- below for a description of this type.
-
- `gcry_cipher_stencrypt_t stencrypt'
- Like `encrypt', for stream ciphers. See below for a
- description of this type.
-
- `gcry_cipher_stdecrypt_t stdecrypt'
- Like `decrypt', for stream ciphers. See below for a
- description of this type.
-
- -- Data type: gcry_cipher_oid_spec_t
- This type is used for associating a user-provided algorithm
- implementation with certain OIDs. It contains the following
- members:
- `const char *oid'
- Textual representation of the OID.
-
- `int mode'
- Cipher mode for which this OID is valid.
-
- -- Data type: gcry_cipher_setkey_t
- Type for the `setkey' function, defined as: gcry_err_code_t
- (*gcry_cipher_setkey_t) (void *c, const unsigned char *key,
- unsigned keylen)
-
- -- Data type: gcry_cipher_encrypt_t
- Type for the `encrypt' function, defined as: gcry_err_code_t
- (*gcry_cipher_encrypt_t) (void *c, const unsigned char *outbuf,
- const unsigned char *inbuf)
-
- -- Data type: gcry_cipher_decrypt_t
- Type for the `decrypt' function, defined as: gcry_err_code_t
- (*gcry_cipher_decrypt_t) (void *c, const unsigned char *outbuf,
- const unsigned char *inbuf)
-
- -- Data type: gcry_cipher_stencrypt_t
- Type for the `stencrypt' function, defined as: gcry_err_code_t
- (*gcry_cipher_stencrypt_t) (void *c, const unsigned char *outbuf,
- const unsigned char *, unsigned int n)
-
- -- Data type: gcry_cipher_stdecrypt_t
- Type for the `stdecrypt' function, defined as: gcry_err_code_t
- (*gcry_cipher_stdecrypt_t) (void *c, const unsigned char *outbuf,
- const unsigned char *, unsigned int n)
-
- -- Function: gcry_error_t gcry_cipher_register (gcry_cipher_spec_t
- *CIPHER, unsigned int *algorithm_id, gcry_module_t *MODULE)
- Register a new cipher module whose specification can be found in
- CIPHER. On success, a new algorithm ID is stored in ALGORITHM_ID
- and a pointer representing this module is stored in MODULE.
-
- -- Function: void gcry_cipher_unregister (gcry_module_t MODULE)
- Unregister the cipher identified by MODULE, which must have been
- registered with gcry_cipher_register.
-
- -- Function: gcry_error_t gcry_cipher_list (int *LIST, int
- *LIST_LENGTH)
- Get a list consisting of the IDs of the loaded cipher modules. If
- LIST is zero, write the number of loaded cipher modules to
- LIST_LENGTH and return. If LIST is non-zero, the first
- *LIST_LENGTH algorithm IDs are stored in LIST, which must be of
- according size. In case there are less cipher modules than
- *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.
-
-
-File: gcrypt.info, Node: Available cipher modes, Next: Working with cipher handles, Prev: Cipher modules, Up: Symmetric cryptography
-
-5.3 Available cipher modes
-==========================
-
-`GCRY_CIPHER_MODE_NONE'
- No mode specified. This should not be used. The only exception
- is that if Libgcrypt is not used in FIPS mode and if any debug
- flag has been set, this mode may be used to bypass the actual
- encryption.
-
-`GCRY_CIPHER_MODE_ECB'
- Electronic Codebook mode.
-
-`GCRY_CIPHER_MODE_CFB'
- Cipher Feedback mode. The shift size equals the block size of the
- cipher (e.g. for AES it is CFB-128).
-
-`GCRY_CIPHER_MODE_CBC'
- Cipher Block Chaining mode.
-
-`GCRY_CIPHER_MODE_STREAM'
- Stream mode, only to be used with stream cipher algorithms.
-
-`GCRY_CIPHER_MODE_OFB'
- Output Feedback mode.
-
-`GCRY_CIPHER_MODE_CTR'
- Counter mode.
-
-
-
-File: gcrypt.info, Node: Working with cipher handles, Next: General cipher functions, Prev: Available cipher modes, Up: Symmetric cryptography
-
-5.4 Working with cipher handles
-===============================
-
-To use a cipher algorithm, you must first allocate an according handle.
-This is to be done using the open function:
-
- -- Function: gcry_error_t gcry_cipher_open (gcry_cipher_hd_t *HD, int
- ALGO, int MODE, unsigned int FLAGS)
- This function creates the context handle required for most of the
- other cipher functions and returns a handle to it in `hd'. In
- case of an error, an according error code is returned.
-
- The ID of algorithm to use must be specified via ALGO. See *Note
- Available ciphers::, for a list of supported ciphers and the
- according constants.
-
- Besides using the constants directly, the function
- `gcry_cipher_map_name' may be used to convert the textual name of
- an algorithm into the according numeric ID.
-
- The cipher mode to use must be specified via MODE. See *Note
- Available cipher modes::, for a list of supported cipher modes and
- the according constants. Note that some modes are incompatible
- with some algorithms - in particular, stream mode
- (`GCRY_CIPHER_MODE_STREAM') only works with stream ciphers. Any
- block cipher mode (`GCRY_CIPHER_MODE_ECB', `GCRY_CIPHER_MODE_CBC',
- `GCRY_CIPHER_MODE_CFB', `GCRY_CIPHER_MODE_OFB' or
- `GCRY_CIPHER_MODE_CTR') will work with any block cipher algorithm.
-
- The third argument FLAGS can either be passed as `0' or as the
- bit-wise OR of the following constants.
-
- `GCRY_CIPHER_SECURE'
- Make sure that all operations are allocated in secure memory.
- This is useful when the key material is highly confidential.
-
- `GCRY_CIPHER_ENABLE_SYNC'
- This flag enables the CFB sync mode, which is a special
- feature of Libgcrypt's CFB mode implementation to allow for
- OpenPGP's CFB variant. See `gcry_cipher_sync'.
-
- `GCRY_CIPHER_CBC_CTS'
- Enable cipher text stealing (CTS) for the CBC mode. Cannot
- be used simultaneous as GCRY_CIPHER_CBC_MAC. CTS mode makes
- it possible to transform data of almost arbitrary size (only
- limitation is that it must be greater than the algorithm's
- block size).
-
- `GCRY_CIPHER_CBC_MAC'
- Compute CBC-MAC keyed checksums. This is the same as CBC
- mode, but only output the last block. Cannot be used
- simultaneous as GCRY_CIPHER_CBC_CTS.
-
- Use the following function to release an existing handle:
-
- -- Function: void gcry_cipher_close (gcry_cipher_hd_t H)
- This function releases the context created by `gcry_cipher_open'.
- It also zeroises all sensitive information associated with this
- cipher handle.
-
- In order to use a handle for performing cryptographic operations, a
-`key' has to be set first:
-
- -- Function: gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t H,
- const void *K, size_t L)
- Set the key K used for encryption or decryption in the context
- denoted by the handle H. The length L (in bytes) of the key K
- must match the required length of the algorithm set for this
- context or be in the allowed range for algorithms with variable
- key size. The function checks this and returns an error if there
- is a problem. A caller should always check for an error.
-
-
- Most crypto modes requires an initialization vector (IV), which
-usually is a non-secret random string acting as a kind of salt value.
-The CTR mode requires a counter, which is also similar to a salt value.
-To set the IV or CTR, use these functions:
-
- -- Function: gcry_error_t gcry_cipher_setiv (gcry_cipher_hd_t H, const
- void *K, size_t L)
- Set the initialization vector used for encryption or decryption.
- The vector is passed as the buffer K of length L bytes and copied
- to internal data structures. The function checks that the IV
- matches the requirement of the selected algorithm and mode.
-
- -- Function: gcry_error_t gcry_cipher_setctr (gcry_cipher_hd_t H,
- const void *C, size_t L)
- Set the counter vector used for encryption or decryption. The
- counter is passed as the buffer C of length L bytes and copied to
- internal data structures. The function checks that the counter
- matches the requirement of the selected algorithm (i.e., it must be
- the same size as the block size).
-
- -- Function: gcry_error_t gcry_cipher_reset (gcry_cipher_hd_t H)
- Set the given handle's context back to the state it had after the
- last call to gcry_cipher_setkey and clear the initialization
- vector.
-
- Note that gcry_cipher_reset is implemented as a macro.
-
- The actual encryption and decryption is done by using one of the
-following functions. They may be used as often as required to process
-all the data.
-
- -- Function: gcry_error_t gcry_cipher_encrypt (gcry_cipher_hd_t H,
- unsigned char *out, size_t OUTSIZE, const unsigned char *IN,
- size_t INLEN)
- `gcry_cipher_encrypt' is used to encrypt the data. This function
- can either work in place or with two buffers. It uses the cipher
- context already setup and described by the handle H. There are 2
- ways to use the function: If IN is passed as `NULL' and INLEN is
- `0', in-place encryption of the data in OUT or length OUTSIZE
- takes place. With IN being not `NULL', INLEN bytes are encrypted
- to the buffer OUT which must have at least a size of INLEN.
- OUTSIZE must be set to the allocated size of OUT, so that the
- function can check that there is sufficient space. Note that
- overlapping buffers are not allowed.
-
- Depending on the selected algorithms and encryption mode, the
- length of the buffers must be a multiple of the block size.
-
- The function returns `0' on success or an error code.
-
- -- Function: gcry_error_t gcry_cipher_decrypt (gcry_cipher_hd_t H,
- unsigned char *out, size_t OUTSIZE, const unsigned char *IN,
- size_t INLEN)
- `gcry_cipher_decrypt' is used to decrypt the data. This function
- can either work in place or with two buffers. It uses the cipher
- context already setup and described by the handle H. There are 2
- ways to use the function: If IN is passed as `NULL' and INLEN is
- `0', in-place decryption of the data in OUT or length OUTSIZE
- takes place. With IN being not `NULL', INLEN bytes are decrypted
- to the buffer OUT which must have at least a size of INLEN.
- OUTSIZE must be set to the allocated size of OUT, so that the
- function can check that there is sufficient space. Note that
- overlapping buffers are not allowed.
-
- Depending on the selected algorithms and encryption mode, the
- length of the buffers must be a multiple of the block size.
-
- The function returns `0' on success or an error code.
-
- OpenPGP (as defined in RFC-2440) requires a special sync operation in
-some places. The following function is used for this:
-
- -- Function: gcry_error_t gcry_cipher_sync (gcry_cipher_hd_t H)
- Perform the OpenPGP sync operation on context H. Note that this
- is a no-op unless the context was created with the flag
- `GCRY_CIPHER_ENABLE_SYNC'
-
- Some of the described functions are implemented as macros utilizing a
-catch-all control function. This control function is rarely used
-directly but there is nothing which would inhibit it:
-
- -- Function: gcry_error_t gcry_cipher_ctl (gcry_cipher_hd_t H, int
- CMD, void *BUFFER, size_t BUFLEN)
- `gcry_cipher_ctl' controls various aspects of the cipher module and
- specific cipher contexts. Usually some more specialized functions
- or macros are used for this purpose. The semantics of the
- function and its parameters depends on the the command CMD and the
- passed context handle H. Please see the comments in the source
- code (`src/global.c') for details.
-
- -- Function: gcry_error_t gcry_cipher_info (gcry_cipher_hd_t H, int
- WHAT, void *BUFFER, size_t *NBYTES)
- `gcry_cipher_info' is used to retrieve various information about a
- cipher context or the cipher module in general.
-
- Currently no information is available.
-
-
-File: gcrypt.info, Node: General cipher functions, Prev: Working with cipher handles, Up: Symmetric cryptography
-
-5.5 General cipher functions
-============================
-
-To work with the algorithms, several functions are available to map
-algorithm names to the internal identifiers, as well as ways to
-retrieve information about an algorithm or the current cipher context.
-
- -- Function: gcry_error_t gcry_cipher_algo_info (int ALGO, int WHAT,
- void *BUFFER, size_t *NBYTES)
- This function is used to retrieve information on a specific
- algorithm. You pass the cipher algorithm ID as ALGO and the type
- of information requested as WHAT. The result is either returned as
- the return code of the function or copied to the provided BUFFER
- whose allocated length must be available in an integer variable
- with the address passed in NBYTES. This variable will also
- receive the actual used length of the buffer.
-
- Here is a list of supported codes for WHAT:
-
- `GCRYCTL_GET_KEYLEN:'
- Return the length of the key. If the algorithm supports
- multiple key lengths, the maximum supported value is
- returned. The length is returned as number of octets (bytes)
- and not as number of bits in NBYTES; BUFFER must be zero.
-
- `GCRYCTL_GET_BLKLEN:'
- Return the block length of the algorithm. The length is
- returned as a number of octets in NBYTES; BUFFER must be zero.
-
- `GCRYCTL_TEST_ALGO:'
- Returns `0' when the specified algorithm is available for use.
- BUFFER and NBYTES must be zero.
-
-
-
- -- Function: const char * gcry_cipher_algo_name (int ALGO)
- `gcry_cipher_algo_name' returns a string with the name of the
- cipher algorithm ALGO. If the algorithm is not known or another
- error occurred, the string `"?"' is returned. This function should
- not be used to test for the availability of an algorithm.
-
- -- Function: int gcry_cipher_map_name (const char *NAME)
- `gcry_cipher_map_name' returns the algorithm identifier for the
- cipher algorithm described by the string NAME. If this algorithm
- is not available `0' is returned.
-
- -- Function: int gcry_cipher_mode_from_oid (const char *STRING)
- Return the cipher mode associated with an ASN.1 object identifier.
- The object identifier is expected to be in the IETF-style dotted
- decimal notation. The function returns `0' for an unknown object
- identifier or when no mode is associated with it.
-
-
-File: gcrypt.info, Node: Public Key cryptography, Next: Hashing, Prev: Symmetric cryptography, Up: Top
-
-6 Public Key cryptography
-*************************
-
-Public key cryptography, also known as asymmetric cryptography, is an
-easy way for key management and to provide digital signatures.
-Libgcrypt provides two completely different interfaces to public key
-cryptography, this chapter explains the one based on S-expressions.
-
-* Menu:
-
-* Available algorithms:: Algorithms supported by the library.
-* Used S-expressions:: Introduction into the used S-expression.
-* Public key modules:: How to work with public key modules.
-* Cryptographic Functions:: Functions for performing the cryptographic actions.
-* General public-key related Functions:: General functions, not implementing any cryptography.
-
-* AC Interface:: Alternative interface to public key functions.
-
-
-File: gcrypt.info, Node: Available algorithms, Next: Used S-expressions, Up: Public Key cryptography
-
-6.1 Available algorithms
-========================
-
-Libgcrypt supports the RSA (Rivest-Shamir-Adleman) algorithms as well
-as DSA (Digital Signature Algorithm) and Elgamal. The versatile
-interface allows to add more algorithms in the future.
-
-
-File: gcrypt.info, Node: Used S-expressions, Next: Public key modules, Prev: Available algorithms, Up: Public Key cryptography
-
-6.2 Used S-expressions
-======================
-
-Libgcrypt's API for asymmetric cryptography is based on data structures
-called S-expressions (see
-`http://people.csail.mit.edu/rivest/sexp.html') and does not work with
-contexts as most of the other building blocks of Libgcrypt do.
-
-The following information are stored in S-expressions:
-
- keys
-
- plain text data
-
- encrypted data
-
- signatures
-
-
-To describe how Libgcrypt expect keys, we use examples. Note that words
-in uppercase indicate parameters whereas lowercase words are literals.
-
- Note that all MPI (multi-precision-integers) values are expected to
-be in `GCRYMPI_FMT_USG' format. An easy way to create S-expressions is
-by using `gcry_sexp_build' which allows to pass a string with
-printf-like escapes to insert MPI values.
-
-* Menu:
-
-* RSA key parameters:: Parameters used with an RSA key.
-* DSA key parameters:: Parameters used with a DSA key.
-* ECC key parameters:: Parameters used with ECC keys.
-
-
-File: gcrypt.info, Node: RSA key parameters, Next: DSA key parameters, Up: Used S-expressions
-
-6.2.1 RSA key parameters
-------------------------
-
-An RSA private key is described by this S-expression:
-
- (private-key
- (rsa
- (n N-MPI)
- (e E-MPI)
- (d D-MPI)
- (p P-MPI)
- (q Q-MPI)
- (u U-MPI)))
-
-An RSA public key is described by this S-expression:
-
- (public-key
- (rsa
- (n N-MPI)
- (e E-MPI)))
-
-N-MPI
- RSA public modulus n.
-
-E-MPI
- RSA public exponent e.
-
-D-MPI
- RSA secret exponent d = e^-1 \bmod (p-1)(q-1).
-
-P-MPI
- RSA secret prime p.
-
-Q-MPI
- RSA secret prime q with p < q.
-
-U-MPI
- Multiplicative inverse u = p^-1 \bmod q.
-
- For signing and decryption the parameters (p, q, u) are optional but
-greatly improve the performance. Either all of these optional
-parameters must be given or none of them. They are mandatory for
-gcry_pk_testkey.
-
- Note that OpenSSL uses slighly different parameters: q < p and u =
-q^-1 \bmod p. To use these parameters you will need to swap the values
-and recompute u. Here is example code to do this:
-
- if (gcry_mpi_cmp (p, q) > 0)
- {
- gcry_mpi_swap (p, q);
- gcry_mpi_invm (u, p, q);
- }
-
-
-File: gcrypt.info, Node: DSA key parameters, Next: ECC key parameters, Prev: RSA key parameters, Up: Used S-expressions
-
-6.2.2 DSA key parameters
-------------------------
-
-A DSA private key is described by this S-expression:
-
- (private-key
- (dsa
- (p P-MPI)
- (q Q-MPI)
- (g G-MPI)
- (y Y-MPI)
- (x X-MPI)))
-
-P-MPI
- DSA prime p.
-
-Q-MPI
- DSA group order q (which is a prime divisor of p-1).
-
-G-MPI
- DSA group generator g.
-
-Y-MPI
- DSA public key value y = g^x \bmod p.
-
-X-MPI
- DSA secret exponent x.
-
- The public key is similar with "private-key" replaced by "public-key"
-and no X-MPI.
-
-
-File: gcrypt.info, Node: ECC key parameters, Prev: DSA key parameters, Up: Used S-expressions
-
-6.2.3 ECC key parameters
-------------------------
-
-An ECC private key is described by this S-expression:
-
- (private-key
- (ecc
- (p P-MPI)
- (a A-MPI)
- (b B-MPI)
- (g G-POINT)
- (n N-MPI)
- (q Q-POINT)
- (d D-MPI)))
-
-P-MPI
- Prime specifying the field GF(p).
-
-A-MPI
-B-MPI
- The two coefficients of the Weierstrass equation y^2 = x^3 + ax + b
-
-G-POINT
- Base point g.
-
-N-MPI
- Order of g
-
-Q-POINT
- The point representing the public key Q = dP.
-
-D-MPI
- The private key d
-
- All point values are encoded in standard format; Libgcrypt does
-currently only support uncompressed points, thus the first byte needs to
-be `0x04'.
-
- The public key is similar with "private-key" replaced by "public-key"
-and no D-MPI.
-
- If the domain parameters are well-known, the name of this curve may
-be used. For example
-
- (private-key
- (ecc
- (curve "NIST P-192")
- (q Q-POINT)
- (d D-MPI)))
-
- The `curve' parameter may be given in any case and is used to replace
-missing parameters.
-
-Currently implemented curves are:
-`NIST P-192'
-`1.2.840.10045.3.1.1'
-`prime192v1'
-`secp192r1'
- The NIST 192 bit curve, its OID, X9.62 and SECP aliases.
-
-`NIST P-224'
-`secp224r1'
- The NIST 224 bit curve and its SECP alias.
-
-`NIST P-256'
-`1.2.840.10045.3.1.7'
-`prime256v1'
-`secp256r1'
- The NIST 256 bit curve, its OID, X9.62 and SECP aliases.
-
-`NIST P-384'
-`secp384r1'
- The NIST 384 bit curve and its SECP alias.
-
-`NIST P-521'
-`secp521r1'
- The NIST 521 bit curve and its SECP alias.
-
- As usual the OIDs may optionally be prefixed with the string `OID.'
-or `oid.'.
-
-
-File: gcrypt.info, Node: Public key modules, Next: Cryptographic Functions, Prev: Used S-expressions, Up: Public Key cryptography
-
-6.3 Public key modules
-======================
-
-Libgcrypt makes it possible to load additional `public key modules';
-these public key algorithms can be used just like the algorithms that
-are built into the library directly. For an introduction into
-extension modules, see *Note Modules::.
-
- -- Data type: gcry_pk_spec_t
- This is the `module specification structure' needed for registering
- public key modules, which has to be filled in by the user before it
- can be used to register a module. It contains the following
- members:
-
- `const char *name'
- The primary name of this algorithm.
-
- `char **aliases'
- A list of strings that are `aliases' for the algorithm. The
- list must be terminated with a NULL element.
-
- `const char *elements_pkey'
- String containing the one-letter names of the MPI values
- contained in a public key.
-
- `const char *element_skey'
- String containing the one-letter names of the MPI values
- contained in a secret key.
-
- `const char *elements_enc'
- String containing the one-letter names of the MPI values that
- are the result of an encryption operation using this
- algorithm.
-
- `const char *elements_sig'
- String containing the one-letter names of the MPI values that
- are the result of a sign operation using this algorithm.
-
- `const char *elements_grip'
- String containing the one-letter names of the MPI values that
- are to be included in the `key grip'.
-
- `int use'
- The bitwise-OR of the following flags, depending on the
- abilities of the algorithm:
- `GCRY_PK_USAGE_SIGN'
- The algorithm supports signing and verifying of data.
-
- `GCRY_PK_USAGE_ENCR'
- The algorithm supports the encryption and decryption of
- data.
-
- `gcry_pk_generate_t generate'
- The function responsible for generating a new key pair. See
- below for a description of this type.
-
- `gcry_pk_check_secret_key_t check_secret_key'
- The function responsible for checking the sanity of a
- provided secret key. See below for a description of this
- type.
-
- `gcry_pk_encrypt_t encrypt'
- The function responsible for encrypting data. See below for a
- description of this type.
-
- `gcry_pk_decrypt_t decrypt'
- The function responsible for decrypting data. See below for a
- description of this type.
-
- `gcry_pk_sign_t sign'
- The function responsible for signing data. See below for a
- description of this type.
-
- `gcry_pk_verify_t verify'
- The function responsible for verifying that the provided
- signature matches the provided data. See below for a
- description of this type.
-
- `gcry_pk_get_nbits_t get_nbits'
- The function responsible for returning the number of bits of
- a provided key. See below for a description of this type.
-
- -- Data type: gcry_pk_generate_t
- Type for the `generate' function, defined as: gcry_err_code_t
- (*gcry_pk_generate_t) (int algo, unsigned int nbits, unsigned long
- use_e, gcry_mpi_t *skey, gcry_mpi_t **retfactors)
-
- -- Data type: gcry_pk_check_secret_key_t
- Type for the `check_secret_key' function, defined as:
- gcry_err_code_t (*gcry_pk_check_secret_key_t) (int algo,
- gcry_mpi_t *skey)
-
- -- Data type: gcry_pk_encrypt_t
- Type for the `encrypt' function, defined as: gcry_err_code_t
- (*gcry_pk_encrypt_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t
- data, gcry_mpi_t *pkey, int flags)
-
- -- Data type: gcry_pk_decrypt_t
- Type for the `decrypt' function, defined as: gcry_err_code_t
- (*gcry_pk_decrypt_t) (int algo, gcry_mpi_t *result, gcry_mpi_t
- *data, gcry_mpi_t *skey, int flags)
-
- -- Data type: gcry_pk_sign_t
- Type for the `sign' function, defined as: gcry_err_code_t
- (*gcry_pk_sign_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t data,
- gcry_mpi_t *skey)
-
- -- Data type: gcry_pk_verify_t
- Type for the `verify' function, defined as: gcry_err_code_t
- (*gcry_pk_verify_t) (int algo, gcry_mpi_t hash, gcry_mpi_t *data,
- gcry_mpi_t *pkey, int (*cmp) (void *, gcry_mpi_t), void *opaquev)
-
- -- Data type: gcry_pk_get_nbits_t
- Type for the `get_nbits' function, defined as: unsigned
- (*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey)
-
- -- Function: gcry_error_t gcry_pk_register (gcry_pk_spec_t *PUBKEY,
- unsigned int *algorithm_id, gcry_module_t *MODULE)
- Register a new public key module whose specification can be found
- in PUBKEY. On success, a new algorithm ID is stored in
- ALGORITHM_ID and a pointer representing this module is stored in
- MODULE.
-
- -- Function: void gcry_pk_unregister (gcry_module_t MODULE)
- Unregister the public key module identified by MODULE, which must
- have been registered with gcry_pk_register.
-
- -- Function: gcry_error_t gcry_pk_list (int *LIST, int *LIST_LENGTH)
- Get a list consisting of the IDs of the loaded pubkey modules. If
- LIST is zero, write the number of loaded pubkey modules to
- LIST_LENGTH and return. If LIST is non-zero, the first
- *LIST_LENGTH algorithm IDs are stored in LIST, which must be of
- according size. In case there are less pubkey modules than
- *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.
-
-
-File: gcrypt.info, Node: Cryptographic Functions, Next: General public-key related Functions, Prev: Public key modules, Up: Public Key cryptography
-
-6.4 Cryptographic Functions
-===========================
-
-Note that we will in future allow to use keys without p,q and u
-specified and may also support other parameters for performance reasons.
-
-Some functions operating on S-expressions support `flags', that
-influence the operation. These flags have to be listed in a
-sub-S-expression named `flags'; the following flags are known:
-
-`pkcs1'
- Use PKCS#1 block type 2 padding.
-
-`no-blinding'
- Do not use a technique called `blinding', which is used by default
- in order to prevent leaking of secret information. Blinding is
- only implemented by RSA, but it might be implemented by other
- algorithms in the future as well, when necessary.
-
-Now that we know the key basics, we can carry on and explain how to
-encrypt and decrypt data. In almost all cases the data is a random
-session key which is in turn used for the actual encryption of the real
-data. There are 2 functions to do this:
-
- -- Function: gcry_error_t gcry_pk_encrypt (gcry_sexp_t *R_CIPH,
- gcry_sexp_t DATA, gcry_sexp_t PKEY)
- Obviously a public key must be provided for encryption. It is
- expected as an appropriate S-expression (see above) in PKEY. The
- data to be encrypted can either be in the simple old format, which
- is a very simple S-expression consisting only of one MPI, or it
- may be a more complex S-expression which also allows to specify
- flags for operation, like e.g. padding rules.
-
- If you don't want to let Libgcrypt handle the padding, you must
- pass an appropriate MPI using this expression for DATA:
-
- (data
- (flags raw)
- (value MPI))
-
- This has the same semantics as the old style MPI only way. MPI is
- the actual data, already padded appropriate for your protocol.
- Most systems however use PKCS#1 padding and so you can use this
- S-expression for DATA:
-
- (data
- (flags pkcs1)
- (value BLOCK))
-
- Here, the "flags" list has the "pkcs1" flag which let the function
- know that it should provide PKCS#1 block type 2 padding. The
- actual data to be encrypted is passed as a string of octets in
- BLOCK. The function checks that this data actually can be used
- with the given key, does the padding and encrypts it.
-
- If the function could successfully perform the encryption, the
- return value will be 0 and a new S-expression with the encrypted
- result is allocated and assigned to the variable at the address of
- R_CIPH. The caller is responsible to release this value using
- `gcry_sexp_release'. In case of an error, an error code is
- returned and R_CIPH will be set to `NULL'.
-
- The returned S-expression has this format when used with RSA:
-
- (enc-val
- (rsa
- (a A-MPI)))
-
- Where A-MPI is an MPI with the result of the RSA operation. When
- using the Elgamal algorithm, the return value will have this
- format:
-
- (enc-val
- (elg
- (a A-MPI)
- (b B-MPI)))
-
- Where A-MPI and B-MPI are MPIs with the result of the Elgamal
- encryption operation.
-
- -- Function: gcry_error_t gcry_pk_decrypt (gcry_sexp_t *R_PLAIN,
- gcry_sexp_t DATA, gcry_sexp_t SKEY)
- Obviously a private key must be provided for decryption. It is
- expected as an appropriate S-expression (see above) in SKEY. The
- data to be decrypted must match the format of the result as
- returned by `gcry_pk_encrypt', but should be enlarged with a
- `flags' element:
-
- (enc-val
- (flags)
- (elg
- (a A-MPI)
- (b B-MPI)))
-
- Note that this function currently does not know of any padding
- methods and the caller must do any un-padding on his own.
-
- The function returns 0 on success or an error code. The variable
- at the address of R_PLAIN will be set to NULL on error or receive
- the decrypted value on success. The format of R_PLAIN is a simple
- S-expression part (i.e. not a valid one) with just one MPI if
- there was no `flags' element in DATA; if at least an empty `flags'
- is passed in DATA, the format is:
-
- (value PLAINTEXT)
-
- Another operation commonly performed using public key cryptography is
-signing data. In some sense this is even more important than
-encryption because digital signatures are an important instrument for
-key management. Libgcrypt supports digital signatures using 2
-functions, similar to the encryption functions:
-
- -- Function: gcry_error_t gcry_pk_sign (gcry_sexp_t *R_SIG,
- gcry_sexp_t DATA, gcry_sexp_t SKEY)
- This function creates a digital signature for DATA using the
- private key SKEY and place it into the variable at the address of
- R_SIG. DATA may either be the simple old style S-expression with
- just one MPI or a modern and more versatile S-expression which
- allows to let Libgcrypt handle padding:
-
- (data
- (flags pkcs1)
- (hash HASH-ALGO BLOCK))
-
- This example requests to sign the data in BLOCK after applying
- PKCS#1 block type 1 style padding. HASH-ALGO is a string with the
- hash algorithm to be encoded into the signature, this may be any
- hash algorithm name as supported by Libgcrypt. Most likely, this
- will be "sha256" or "sha1". It is obvious that the length of
- BLOCK must match the size of that message digests; the function
- checks that this and other constraints are valid.
-
- If PKCS#1 padding is not required (because the caller does already
- provide a padded value), either the old format or better the
- following format should be used:
-
- (data
- (flags raw)
- (value MPI))
-
- Here, the data to be signed is directly given as an MPI.
-
- The signature is returned as a newly allocated S-expression in
- R_SIG using this format for RSA:
-
- (sig-val
- (rsa
- (s S-MPI)))
-
- Where S-MPI is the result of the RSA sign operation. For DSA the
- S-expression returned is:
-
- (sig-val
- (dsa
- (r R-MPI)
- (s S-MPI)))
-
- Where R-MPI and S-MPI are the result of the DSA sign operation.
- For Elgamal signing (which is slow, yields large numbers and
- probably is not as secure as the other algorithms), the same
- format is used with "elg" replacing "dsa".
-
-The operation most commonly used is definitely the verification of a
-signature. Libgcrypt provides this function:
-
- -- Function: gcry_error_t gcry_pk_verify (gcry_sexp_t SIG,
- gcry_sexp_t DATA, gcry_sexp_t PKEY)
- This is used to check whether the signature SIG matches the DATA.
- The public key PKEY must be provided to perform this verification.
- This function is similar in its parameters to `gcry_pk_sign' with
- the exceptions that the public key is used instead of the private
- key and that no signature is created but a signature, in a format
- as created by `gcry_pk_sign', is passed to the function in SIG.
-
- The result is 0 for success (i.e. the data matches the signature),
- or an error code where the most relevant code is
- `GCRYERR_BAD_SIGNATURE' to indicate that the signature does not
- match the provided data.
-
-
-
-File: gcrypt.info, Node: General public-key related Functions, Next: AC Interface, Prev: Cryptographic Functions, Up: Public Key cryptography
-
-6.5 General public-key related Functions
-========================================
-
-A couple of utility functions are available to retrieve the length of
-the key, map algorithm identifiers and perform sanity checks:
-
- -- Function: const char * gcry_pk_algo_name (int ALGO)
- Map the public key algorithm id ALGO to a string representation of
- the algorithm name. For unknown algorithms this functions returns
- the string `"?"'. This function should not be used to test for the
- availability of an algorithm.
-
- -- Function: int gcry_pk_map_name (const char *NAME)
- Map the algorithm NAME to a public key algorithm Id. Returns 0 if
- the algorithm name is not known.
-
- -- Function: int gcry_pk_test_algo (int ALGO)
- Return 0 if the public key algorithm ALGO is available for use.
- Note that this is implemented as a macro.
-
- -- Function: unsigned int gcry_pk_get_nbits (gcry_sexp_t KEY)
- Return what is commonly referred as the key length for the given
- public or private in KEY.
-
- -- Function: unsigned char * gcry_pk_get_keygrip (gcry_sexp_t KEY,
- unsigned char *ARRAY)
- Return the so called "keygrip" which is the SHA-1 hash of the
- public key parameters expressed in a way depended on the
- algorithm. ARRAY must either provide space for 20 bytes or be
- `NULL'. In the latter case a newly allocated array of that size is
- returned. On success a pointer to the newly allocated space or to
- ARRAY is returned. `NULL' is returned to indicate an error which
- is most likely an unknown algorithm or one where a "keygrip" has
- not yet been defined. The function accepts public or secret keys
- in KEY.
-
- -- Function: gcry_error_t gcry_pk_testkey (gcry_sexp_t KEY)
- Return zero if the private key KEY is `sane', an error code
- otherwise. Note that it is not possible to check the `saneness'
- of a public key.
-
-
- -- Function: gcry_error_t gcry_pk_algo_info (int ALGO, int WHAT,
- void *BUFFER, size_t *NBYTES)
- Depending on the value of WHAT return various information about
- the public key algorithm with the id ALGO. Note that the function
- returns `-1' on error and the actual error code must be retrieved
- using the function `gcry_errno'. The currently defined values for
- WHAT are:
-
- `GCRYCTL_TEST_ALGO:'
- Return 0 if the specified algorithm is available for use.
- BUFFER must be `NULL', NBYTES may be passed as `NULL' or
- point to a variable with the required usage of the algorithm.
- This may be 0 for "don't care" or the bit-wise OR of these
- flags:
-
- `GCRY_PK_USAGE_SIGN'
- Algorithm is usable for signing.
-
- `GCRY_PK_USAGE_ENCR'
- Algorithm is usable for encryption.
-
- Unless you need to test for the allowed usage, it is in
- general better to use the macro gcry_pk_test_algo instead.
-
- `GCRYCTL_GET_ALGO_USAGE:'
- Return the usage flags for the given algorithm. An invalid
- algorithm return 0. Disabled algorithms are ignored here
- because we want to know whether the algorithm is at all
- capable of a certain usage.
-
- `GCRYCTL_GET_ALGO_NPKEY'
- Return the number of elements the public key for algorithm
- ALGO consist of. Return 0 for an unknown algorithm.
-
- `GCRYCTL_GET_ALGO_NSKEY'
- Return the number of elements the private key for algorithm
- ALGO consist of. Note that this value is always larger than
- that of the public key. Return 0 for an unknown algorithm.
-
- `GCRYCTL_GET_ALGO_NSIGN'
- Return the number of elements a signature created with the
- algorithm ALGO consists of. Return 0 for an unknown
- algorithm or for an algorithm not capable of creating
- signatures.
-
- `GCRYCTL_GET_ALGO_NENC'
- Return the number of elements a encrypted message created
- with the algorithm ALGO consists of. Return 0 for an unknown
- algorithm or for an algorithm not capable of encryption.
-
- Please note that parameters not required should be passed as
- `NULL'.
-
- -- Function: gcry_error_t gcry_pk_ctl (int CMD, void *BUFFER,
- size_t BUFLEN)
- This is a general purpose function to perform certain control
- operations. CMD controls what is to be done. The return value is
- 0 for success or an error code. Currently supported values for
- CMD are:
-
- `GCRYCTL_DISABLE_ALGO'
- Disable the algorithm given as an algorithm id in BUFFER.
- BUFFER must point to an `int' variable with the algorithm id
- and BUFLEN must have the value `sizeof (int)'.
-
-
-Libgcrypt also provides a function to generate public key pairs:
-
- -- Function: gcry_error_t gcry_pk_genkey (gcry_sexp_t *R_KEY,
- gcry_sexp_t PARMS)
- This function create a new public key pair using information given
- in the S-expression PARMS and stores the private and the public key
- in one new S-expression at the address given by R_KEY. In case of
- an error, R_KEY is set to `NULL'. The return code is 0 for
- success or an error code otherwise.
-
- Here is an example for PARMS to create an 2048 bit RSA key:
-
- (genkey
- (rsa
- (nbits 4:2048)))
-
- To create an Elgamal key, substitute "elg" for "rsa" and to create
- a DSA key use "dsa". Valid ranges for the key length depend on the
- algorithms; all commonly used key lengths are supported. Currently
- supported parameters are:
-
- `nbits'
- This is always required to specify the length of the key.
- The argument is a string with a number in C-notation. The
- value should be a multiple of 8.
-
- `curve NAME'
- For ECC a named curve may be used instead of giving the
- number of requested bits. This allows to request a specific
- curve to override a default selection Libgcrypt would have
- taken if `nbits' has been given. The available names are
- listed with the description of the ECC public key parameters.
-
- `rsa-use-e'
- This is only used with RSA to give a hint for the public
- exponent. The value will be used as a base to test for a
- usable exponent. Some values are special:
-
- `0'
- Use a secure and fast value. This is currently the
- number 41.
-
- `1'
- Use a value as required by some crypto policies. This
- is currently the number 65537.
-
- `2'
- Reserved
-
- `> 2'
- Use the given value.
-
- If this parameter is not used, Libgcrypt uses for historic
- reasons 65537.
-
- `qbits'
- This is only meanigful for DSA keys. If it is given the DSA
- key is generated with a Q parameyer of this size. If it is
- not given or zero Q is deduced from NBITS in this way:
- `512 <= N <= 1024'
- Q = 160
-
- `N = 2048'
- Q = 224
-
- `N = 3072'
- Q = 256
-
- `N = 7680'
- Q = 384
-
- `N = 15360'
- Q = 512
- Note that in this case only the values for N, as given in the
- table, are allowed. When specifying Q all values of N in the
- range 512 to 15680 are valid as long as they are multiples of
- 8.
-
- `transient-key'
- This is only meaningful for RSA and DSA keys. This is a flag
- with no value. If given the RSA or DSA key is created using
- a faster and a somewhat less secure random number generator.
- This flag may be used for keys which are only used for a
- short time and do not require full cryptographic strength.
-
- `domain'
- This is only meaningful for DLP algorithms. If specified
- keys are generated with domain parameters taken from this
- list. The exact format of this parameter depends on the
- actual algorithm. It is currently only implemented for DSA
- using this format:
-
- (genkey
- (dsa
- (domain
- (p P-MPI)
- (q Q-MPI)
- (g Q-MPI))))
-
- `nbits' and `qbits' may not be specified because they are
- derived from the domain parameters.
-
- `derive-parms'
- This is currently only implemented for RSA and DSA keys. It
- is not allowed to use this together with a `domain'
- specification. If given, it is used to derive the keys using
- the given parameters.
-
- If given for an RSA key the X9.31 key generation algorithm is
- used even if libgcrypt is not in FIPS mode. If given for a
- DSA key, the FIPS 186 algorithm is used even if libgcrypt is
- not in FIPS mode.
-
- (genkey
- (rsa
- (nbits 4:1024)
- (rsa-use-e 1:3)
- (derive-parms
- (Xp1 #1A1916DDB29B4EB7EB6732E128#)
- (Xp2 #192E8AAC41C576C822D93EA433#)
- (Xp #D8CD81F035EC57EFE822955149D3BFF70C53520D
- 769D6D76646C7A792E16EBD89FE6FC5B605A6493
- 39DFC925A86A4C6D150B71B9EEA02D68885F5009
- B98BD984#)
- (Xq1 #1A5CF72EE770DE50CB09ACCEA9#)
- (Xq2 #134E4CAA16D2350A21D775C404#)
- (Xq #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
- 7C9953388F97DDDC3E1CA19C35CA659EDC2FC325
- 6D29C2627479C086A699A49C4C9CEE7EF7BD1B34
- 321DE34A#))))
-
- (genkey
- (dsa
- (nbits 4:1024)
- (derive-parms
- (seed SEED-MPI))))
-
- `use-x931'
- Force the use of the ANSI X9.31 key generation algorithm
- instead of the default algorithm. This flag is only
- meaningful for RSA and usually not required. Note that this
- algorithm is implicitly used if either `derive-parms' is
- given or Libgcrypt is in FIPS mode.
-
- `use-fips186'
- Force the use of the FIPS 186 key generation algorithm
- instead of the default algorithm. This flag is only
- meaningful for DSA and usually not required. Note that this
- algorithm is implicitly used if either `derive-parms' is
- given or Libgcrypt is in FIPS mode. As of now FIPS 186-2 is
- implemented; after the approval of FIPS 186-3 the code will
- be changed to implement 186-3.
-
- `use-fips186-2'
- Force the use of the FIPS 186-2 key generation algorithm
- instead of the default algorithm. This algorithm is slighlty
- different from FIPS 186-3 and allows only 1024 bit keys.
- This flag is only meaningful for DSA and only required for
- FIPS testing backward compatibility.
-
-
- The key pair is returned in a format depending on the algorithm.
- Both private and public keys are returned in one container and may
- be accompanied by some miscellaneous information.
-
- As an example, here is what the Elgamal key generation returns:
-
- (key-data
- (public-key
- (elg
- (p P-MPI)
- (g G-MPI)
- (y Y-MPI)))
- (private-key
- (elg
- (p P-MPI)
- (g G-MPI)
- (y Y-MPI)
- (x X-MPI)))
- (misc-key-info
- (pm1-factors N1 N2 ... NN))
-
- As you can see, some of the information is duplicated, but this
- provides an easy way to extract either the public or the private
- key. Note that the order of the elements is not defined, e.g. the
- private key may be stored before the public key. N1 N2 ... NN is a
- list of prime numbers used to composite P-MPI; this is in general
- not a very useful information and only available if the key
- generation algorithm provides them.
-
-
-File: gcrypt.info, Node: AC Interface, Prev: General public-key related Functions, Up: Public Key cryptography
-
-6.6 Alternative Public Key Interface
-====================================
-
-This section documents the alternative interface to asymmetric
-cryptography (ac) that is not based on S-expressions, but on native C
-data structures. As opposed to the pk interface described in the
-former chapter, this one follows an open/use/close paradigm like other
-building blocks of the library.
-
- *This interface has a few known problems; most noteworthy an
-inherent tendency to leak memory. It might not be available in
-forthcoming versions of Libgcrypt.*
-
-* Menu:
-
-* Available asymmetric algorithms:: List of algorithms supported by the library.
-* Working with sets of data:: How to work with sets of data.
-* Working with IO objects:: How to work with IO objects.
-* Working with handles:: How to use handles.
-* Working with keys:: How to work with keys.
-* Using cryptographic functions:: How to perform cryptographic operations.
-* Handle-independent functions:: General functions independent of handles.
-
-
-File: gcrypt.info, Node: Available asymmetric algorithms, Next: Working with sets of data, Up: AC Interface
-
-6.6.1 Available asymmetric algorithms
--------------------------------------
-
-Libgcrypt supports the RSA (Rivest-Shamir-Adleman) algorithms as well
-as DSA (Digital Signature Algorithm) and Elgamal. The versatile
-interface allows to add more algorithms in the future.
-
- -- Data type: gcry_ac_id_t
- The following constants are defined for this type:
-
- `GCRY_AC_RSA'
- Rivest-Shamir-Adleman
-
- `GCRY_AC_DSA'
- Digital Signature Algorithm
-
- `GCRY_AC_ELG'
- Elgamal
-
- `GCRY_AC_ELG_E'
- Elgamal, encryption only.
-
-
-File: gcrypt.info, Node: Working with sets of data, Next: Working with IO objects, Prev: Available asymmetric algorithms, Up: AC Interface
-
-6.6.2 Working with sets of data
--------------------------------
-
-In the context of this interface the term `data set' refers to a list
-of `named MPI values' that is used by functions performing
-cryptographic operations; a named MPI value is a an MPI value,
-associated with a label.
-
- Such data sets are used for representing keys, since keys simply
-consist of a variable amount of numbers. Furthermore some functions
-return data sets to the caller that are to be provided to other
-functions.
-
- This section documents the data types, symbols and functions that are
-relevant for working with data sets.
-
- -- Data type: gcry_ac_data_t
- A single data set.
-
- The following flags are supported:
-
-`GCRY_AC_FLAG_DEALLOC'
- Used for storing data in a data set. If given, the data will be
- released by the library. Note that whenever one of the ac
- functions is about to release objects because of this flag, the
- objects are expected to be stored in memory allocated through the
- Libgcrypt memory management. In other words: gcry_free() is used
- instead of free().
-
-`GCRY_AC_FLAG_COPY'
- Used for storing/retrieving data in/from a data set. If given, the
- library will create copies of the provided/contained data, which
- will then be given to the user/associated with the data set.
-
- -- Function: gcry_error_t gcry_ac_data_new (gcry_ac_data_t *DATA)
- Creates a new, empty data set and stores it in DATA.
-
- -- Function: void gcry_ac_data_destroy (gcry_ac_data_t DATA)
- Destroys the data set DATA.
-
- -- Function: gcry_error_t gcry_ac_data_set (gcry_ac_data_t DATA,
- unsigned int FLAGS, char *NAME, gcry_mpi_t MPI)
- Add the value MPI to DATA with the label NAME. If FLAGS contains
- GCRY_AC_FLAG_COPY, the data set will contain copies of NAME and
- MPI. If FLAGS contains GCRY_AC_FLAG_DEALLOC or GCRY_AC_FLAG_COPY,
- the values contained in the data set will be deallocated when they
- are to be removed from the data set.
-
- -- Function: gcry_error_t gcry_ac_data_copy (gcry_ac_data_t *DATA_CP,
- gcry_ac_data_t DATA)
- Create a copy of the data set DATA and store it in DATA_CP.
- FIXME: exact semantics undefined.
-
- -- Function: unsigned int gcry_ac_data_length (gcry_ac_data_t DATA)
- Returns the number of named MPI values inside of the data set DATA.
-
- -- Function: gcry_error_t gcry_ac_data_get_name (gcry_ac_data_t DATA,
- unsigned int FLAGS, char *NAME, gcry_mpi_t *MPI)
- Store the value labelled with NAME found in DATA in MPI. If FLAGS
- contains GCRY_AC_FLAG_COPY, store a copy of the MPI value
- contained in the data set. MPI may be NULL (this might be useful
- for checking the existence of an MPI with extracting it).
-
- -- Function: gcry_error_t gcry_ac_data_get_index (gcry_ac_data_t DATA,
- unsigned int flags, unsigned int INDEX, const char **NAME,
- gcry_mpi_t *MPI)
- Stores in NAME and MPI the named MPI value contained in the data
- set DATA with the index IDX. If FLAGS contains GCRY_AC_FLAG_COPY,
- store copies of the values contained in the data set. NAME or MPI
- may be NULL.
-
- -- Function: void gcry_ac_data_clear (gcry_ac_data_t DATA)
- Destroys any values contained in the data set DATA.
-
- -- Function: gcry_error_t gcry_ac_data_to_sexp (gcry_ac_data_t DATA,
- gcry_sexp_t *SEXP, const char **IDENTIFIERS)
- This function converts the data set DATA into a newly created
- S-Expression, which is to be stored in SEXP; IDENTIFIERS is a NULL
- terminated list of C strings, which specifies the structure of the
- S-Expression.
-
- Example:
-
- If IDENTIFIERS is a list of pointers to the strings "foo" and
- "bar" and if DATA is a data set containing the values "val1 =
- 0x01" and "val2 = 0x02", then the resulting S-Expression will look
- like this: (foo (bar ((val1 0x01) (val2 0x02))).
-
- -- Function: gcry_error gcry_ac_data_from_sexp (gcry_ac_data_t *DATA,
- gcry_sexp_t SEXP, const char **IDENTIFIERS)
- This function converts the S-Expression SEXP into a newly created
- data set, which is to be stored in DATA; IDENTIFIERS is a NULL
- terminated list of C strings, which specifies the structure of the
- S-Expression. If the list of identifiers does not match the
- structure of the S-Expression, the function fails.
-
-
-File: gcrypt.info, Node: Working with IO objects, Next: Working with handles, Prev: Working with sets of data, Up: AC Interface
-
-6.6.3 Working with IO objects
------------------------------
-
-Note: IO objects are currently only used in the context of message
-encoding/decoding and encryption/signature schemes.
-
- -- Data type: gcry_ac_io_t
- `gcry_ac_io_t' is the type to be used for IO objects.
-
- IO objects provide an uniform IO layer on top of different underlying
-IO mechanisms; either they can be used for providing data to the
-library (mode is GCRY_AC_IO_READABLE) or they can be used for
-retrieving data from the library (mode is GCRY_AC_IO_WRITABLE).
-
- IO object need to be initialized by calling on of the following
-functions:
-
- -- Function: void gcry_ac_io_init (gcry_ac_io_t *AC_IO,
- gcry_ac_io_mode_t MODE, gcry_ac_io_type_t TYPE, ...);
- Initialize AC_IO according to MODE, TYPE and the variable list of
- arguments. The list of variable arguments to specify depends on
- the given TYPE.
-
- -- Function: void gcry_ac_io_init_va (gcry_ac_io_t *AC_IO,
- gcry_ac_io_mode_t MODE, gcry_ac_io_type_t TYPE, va_list AP);
- Initialize AC_IO according to MODE, TYPE and the variable list of
- arguments AP. The list of variable arguments to specify depends
- on the given TYPE.
-
- The following types of IO objects exist:
-
-`GCRY_AC_IO_STRING'
- In case of GCRY_AC_IO_READABLE the IO object will provide data
- from a memory string. Arguments to specify at initialization time:
- `unsigned char *'
- Pointer to the beginning of the memory string
-
- `size_t'
- Size of the memory string
- In case of GCRY_AC_IO_WRITABLE the object will store retrieved
- data in a newly allocated memory string. Arguments to specify at
- initialization time:
- `unsigned char **'
- Pointer to address, at which the pointer to the newly created
- memory string is to be stored
-
- `size_t *'
- Pointer to address, at which the size of the newly created
- memory string is to be stored
-
-`GCRY_AC_IO_CALLBACK'
- In case of GCRY_AC_IO_READABLE the object will forward read
- requests to a provided callback function. Arguments to specify at
- initialization time:
- `gcry_ac_data_read_cb_t'
- Callback function to use
-
- `void *'
- Opaque argument to provide to the callback function
- In case of GCRY_AC_IO_WRITABLE the object will forward write
- requests to a provided callback function. Arguments to specify at
- initialization time:
- `gcry_ac_data_write_cb_t'
- Callback function to use
-
- `void *'
- Opaque argument to provide to the callback function
-
-
-File: gcrypt.info, Node: Working with handles, Next: Working with keys, Prev: Working with IO objects, Up: AC Interface
-
-6.6.4 Working with handles
---------------------------
-
-In order to use an algorithm, an according handle must be created.
-This is done using the following function:
-
- -- Function: gcry_error_t gcry_ac_open (gcry_ac_handle_t *HANDLE, int
- ALGORITHM, int FLAGS)
- Creates a new handle for the algorithm ALGORITHM and stores it in
- HANDLE. FLAGS is not used currently.
-
- ALGORITHM must be a valid algorithm ID, see *Note Available
- asymmetric algorithms::, for a list of supported algorithms and the
- according constants. Besides using the listed constants directly,
- the functions `gcry_pk_name_to_id' may be used to convert the
- textual name of an algorithm into the according numeric ID.
-
- -- Function: void gcry_ac_close (gcry_ac_handle_t HANDLE)
- Destroys the handle HANDLE.
-
-
-File: gcrypt.info, Node: Working with keys, Next: Using cryptographic functions, Prev: Working with handles, Up: AC Interface
-
-6.6.5 Working with keys
------------------------
-
- -- Data type: gcry_ac_key_type_t
- Defined constants:
-
- `GCRY_AC_KEY_SECRET'
- Specifies a secret key.
-
- `GCRY_AC_KEY_PUBLIC'
- Specifies a public key.
-
- -- Data type: gcry_ac_key_t
- This type represents a single `key', either a secret one or a
- public one.
-
- -- Data type: gcry_ac_key_pair_t
- This type represents a `key pair' containing a secret and a public
- key.
-
- Key data structures can be created in two different ways; a new key
-pair can be generated, resulting in ready-to-use key. Alternatively a
-key can be initialized from a given data set.
-
- -- Function: gcry_error_t gcry_ac_key_init (gcry_ac_key_t *KEY,
- gcry_ac_handle_t HANDLE, gcry_ac_key_type_t TYPE,
- gcry_ac_data_t DATA)
- Creates a new key of type TYPE, consisting of the MPI values
- contained in the data set DATA and stores it in KEY.
-
- -- Function: gcry_error_t gcry_ac_key_pair_generate (gcry_ac_handle_t
- HANDLE, unsigned int NBITS, void *KEY_SPEC,
- gcry_ac_key_pair_t *KEY_PAIR, gcry_mpi_t **MISC_DATA)
- Generates a new key pair via the handle HANDLE of NBITS bits and
- stores it in KEY_PAIR.
-
- In case non-standard settings are wanted, a pointer to a structure
- of type `gcry_ac_key_spec_<algorithm>_t', matching the selected
- algorithm, can be given as KEY_SPEC. MISC_DATA is not used yet.
- Such a structure does only exist for RSA. A description of the
- members of the supported structures follows.
-
- `gcry_ac_key_spec_rsa_t'
-
- `gcry_mpi_t e'
- Generate the key pair using a special `e'. The value of
- `e' has the following meanings:
- `= 0'
- Let Libgcrypt decide what exponent should be used.
-
- `= 1'
- Request the use of a "secure" exponent; this is
- required by some specification to be 65537.
-
- `> 2'
- Try starting at this value until a working exponent
- is found. Note that the current implementation
- leaks some information about the private key
- because the incrementation used is not randomized.
- Thus, this function will be changed in the future
- to return a random exponent of the given size.
-
- Example code:
- {
- gcry_ac_key_pair_t key_pair;
- gcry_ac_key_spec_rsa_t rsa_spec;
-
- rsa_spec.e = gcry_mpi_new (0);
- gcry_mpi_set_ui (rsa_spec.e, 1);
-
- err = gcry_ac_open (&handle, GCRY_AC_RSA, 0);
- assert (! err);
-
- err = gcry_ac_key_pair_generate (handle, 1024, &rsa_spec,
- &key_pair, NULL);
- assert (! err);
- }
-
- -- Function: gcry_ac_key_t gcry_ac_key_pair_extract
- (gcry_ac_key_pair_t KEY_PAIR, gcry_ac_key_type_t WHICH)
- Returns the key of type WHICH out of the key pair KEY_PAIR.
-
- -- Function: void gcry_ac_key_destroy (gcry_ac_key_t KEY)
- Destroys the key KEY.
-
- -- Function: void gcry_ac_key_pair_destroy (gcry_ac_key_pair_t
- KEY_PAIR)
- Destroys the key pair KEY_PAIR.
-
- -- Function: gcry_ac_data_t gcry_ac_key_data_get (gcry_ac_key_t KEY)
- Returns the data set contained in the key KEY.
-
- -- Function: gcry_error_t gcry_ac_key_test (gcry_ac_handle_t HANDLE,
- gcry_ac_key_t KEY)
- Verifies that the private key KEY is sane via HANDLE.
-
- -- Function: gcry_error_t gcry_ac_key_get_nbits (gcry_ac_handle_t
- HANDLE, gcry_ac_key_t KEY, unsigned int *NBITS)
- Stores the number of bits of the key KEY in NBITS via HANDLE.
-
- -- Function: gcry_error_t gcry_ac_key_get_grip (gcry_ac_handle_t
- HANDLE, gcry_ac_key_t KEY, unsigned char *KEY_GRIP)
- Writes the 20 byte long key grip of the key KEY to KEY_GRIP via
- HANDLE.
-
-
-File: gcrypt.info, Node: Using cryptographic functions, Next: Handle-independent functions, Prev: Working with keys, Up: AC Interface
-
-6.6.6 Using cryptographic functions
------------------------------------
-
-The following flags might be relevant:
-
-`GCRY_AC_FLAG_NO_BLINDING'
- Disable any blinding, which might be supported by the chosen
- algorithm; blinding is the default.
-
- There exist two kinds of cryptographic functions available through
-the ac interface: primitives, and high-level functions.
-
- Primitives deal with MPIs (data sets) directly; what they provide is
-direct access to the cryptographic operations provided by an algorithm
-implementation.
-
- High-level functions deal with octet strings, according to a
-specified "scheme". Schemes make use of "encoding methods", which are
-responsible for converting the provided octet strings into MPIs, which
-are then forwared to the cryptographic primitives. Since schemes are
-to be used for a special purpose in order to achieve a particular
-security goal, there exist "encryption schemes" and "signature
-schemes". Encoding methods can be used seperately or implicitly
-through schemes.
-
- What follows is a description of the cryptographic primitives.
-
- -- Function: gcry_error_t gcry_ac_data_encrypt (gcry_ac_handle_t
- HANDLE, unsigned int FLAGS, gcry_ac_key_t KEY, gcry_mpi_t
- DATA_PLAIN, gcry_ac_data_t *DATA_ENCRYPTED)
- Encrypts the plain text MPI value DATA_PLAIN with the key public
- KEY under the control of the flags FLAGS and stores the resulting
- data set into DATA_ENCRYPTED.
-
- -- Function: gcry_error_t gcry_ac_data_decrypt (gcry_ac_handle_t
- HANDLE, unsigned int FLAGS, gcry_ac_key_t KEY, gcry_mpi_t
- *DATA_PLAIN, gcry_ac_data_t DATA_ENCRYPTED)
- Decrypts the encrypted data contained in the data set
- DATA_ENCRYPTED with the secret key KEY under the control of the
- flags FLAGS and stores the resulting plain text MPI value in
- DATA_PLAIN.
-
- -- Function: gcry_error_t gcry_ac_data_sign (gcry_ac_handle_t HANDLE,
- gcry_ac_key_t KEY, gcry_mpi_t DATA, gcry_ac_data_t
- *DATA_SIGNATURE)
- Signs the data contained in DATA with the secret key KEY and
- stores the resulting signature in the data set DATA_SIGNATURE.
-
- -- Function: gcry_error_t gcry_ac_data_verify (gcry_ac_handle_t
- HANDLE, gcry_ac_key_t KEY, gcry_mpi_t DATA, gcry_ac_data_t
- DATA_SIGNATURE)
- Verifies that the signature contained in the data set
- DATA_SIGNATURE is indeed the result of signing the data contained
- in DATA with the secret key belonging to the public key KEY.
-
- What follows is a description of the high-level functions.
-
- The type "gcry_ac_em_t" is used for specifying encoding methods; the
-following methods are supported:
-
-`GCRY_AC_EME_PKCS_V1_5'
- PKCS-V1_5 Encoding Method for Encryption. Options must be provided
- through a pointer to a correctly initialized object of type
- gcry_ac_eme_pkcs_v1_5_t.
-
-`GCRY_AC_EMSA_PKCS_V1_5'
- PKCS-V1_5 Encoding Method for Signatures with Appendix. Options
- must be provided through a pointer to a correctly initialized
- object of type gcry_ac_emsa_pkcs_v1_5_t.
-
- Option structure types:
-
-`gcry_ac_eme_pkcs_v1_5_t'
-
- `gcry_ac_key_t key'
-
- `gcry_ac_handle_t handle'
-
-`gcry_ac_emsa_pkcs_v1_5_t'
-
- `gcry_md_algo_t md'
-
- `size_t em_n'
-
- Encoding methods can be used directly through the following
-functions:
-
- -- Function: gcry_error_t gcry_ac_data_encode (gcry_ac_em_t METHOD,
- unsigned int FLAGS, void *OPTIONS, unsigned char *M, size_t
- M_N, unsigned char **EM, size_t *EM_N)
- Encodes the message contained in M of size M_N according to
- METHOD, FLAGS and OPTIONS. The newly created encoded message is
- stored in EM and EM_N.
-
- -- Function: gcry_error_t gcry_ac_data_decode (gcry_ac_em_t METHOD,
- unsigned int FLAGS, void *OPTIONS, unsigned char *EM, size_t
- EM_N, unsigned char **M, size_t *M_N)
- Decodes the message contained in EM of size EM_N according to
- METHOD, FLAGS and OPTIONS. The newly created decoded message is
- stored in M and M_N.
-
- The type "gcry_ac_scheme_t" is used for specifying schemes; the
-following schemes are supported:
-
-`GCRY_AC_ES_PKCS_V1_5'
- PKCS-V1_5 Encryption Scheme. No options can be provided.
-
-`GCRY_AC_SSA_PKCS_V1_5'
- PKCS-V1_5 Signature Scheme (with Appendix). Options can be
- provided through a pointer to a correctly initialized object of
- type gcry_ac_ssa_pkcs_v1_5_t.
-
- Option structure types:
-
-`gcry_ac_ssa_pkcs_v1_5_t'
-
- `gcry_md_algo_t md'
-
- The functions implementing schemes:
-
- -- Function: gcry_error_t gcry_ac_data_encrypt_scheme
- (gcry_ac_handle_t HANDLE, gcry_ac_scheme_t SCHEME, unsigned
- int FLAGS, void *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t
- *IO_MESSAGE, gcry_ac_io_t *IO_CIPHER)
- Encrypts the plain text readable from IO_MESSAGE through HANDLE
- with the public key KEY according to SCHEME, FLAGS and OPTS. If
- OPTS is not NULL, it has to be a pointer to a structure specific
- to the chosen scheme (gcry_ac_es_*_t). The encrypted message is
- written to IO_CIPHER.
-
- -- Function: gcry_error_t gcry_ac_data_decrypt_scheme
- (gcry_ac_handle_t HANDLE, gcry_ac_scheme_t SCHEME, unsigned
- int FLAGS, void *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t
- *IO_CIPHER, gcry_ac_io_t *IO_MESSAGE)
- Decrypts the cipher text readable from IO_CIPHER through HANDLE
- with the secret key KEY according to SCHEME, FLAGS and OPTS. If
- OPTS is not NULL, it has to be a pointer to a structure specific
- to the chosen scheme (gcry_ac_es_*_t). The decrypted message is
- written to IO_MESSAGE.
-
- -- Function: gcry_error_t gcry_ac_data_sign_scheme (gcry_ac_handle_t
- HANDLE, gcry_ac_scheme_t SCHEME, unsigned int FLAGS, void
- *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t *IO_MESSAGE,
- gcry_ac_io_t *IO_SIGNATURE)
- Signs the message readable from IO_MESSAGE through HANDLE with the
- secret key KEY according to SCHEME, FLAGS and OPTS. If OPTS is
- not NULL, it has to be a pointer to a structure specific to the
- chosen scheme (gcry_ac_ssa_*_t). The signature is written to
- IO_SIGNATURE.
-
- -- Function: gcry_error_t gcry_ac_data_verify_scheme (gcry_ac_handle_t
- HANDLE, gcry_ac_scheme_t SCHEME, unsigned int FLAGS, void
- *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t *IO_MESSAGE,
- gcry_ac_io_t *IO_SIGNATURE)
- Verifies through HANDLE that the signature readable from
- IO_SIGNATURE is indeed the result of signing the message readable
- from IO_MESSAGE with the secret key belonging to the public key
- KEY according to SCHEME and OPTS. If OPTS is not NULL, it has to
- be an anonymous structure (gcry_ac_ssa_*_t) specific to the chosen
- scheme.
-
-
-File: gcrypt.info, Node: Handle-independent functions, Prev: Using cryptographic functions, Up: AC Interface
-
-6.6.7 Handle-independent functions
-----------------------------------
-
-These two functions are deprecated; do not use them for new code.
-
- -- Function: gcry_error_t gcry_ac_id_to_name (gcry_ac_id_t ALGORITHM,
- const char **NAME)
- Stores the textual representation of the algorithm whose id is
- given in ALGORITHM in NAME. Deprecated; use `gcry_pk_algo_name'.
-
- -- Function: gcry_error_t gcry_ac_name_to_id (const char *NAME,
- gcry_ac_id_t *ALGORITHM)
- Stores the numeric ID of the algorithm whose textual
- representation is contained in NAME in ALGORITHM. Deprecated; use
- `gcry_pk_map_name'.
-
-
-File: gcrypt.info, Node: Hashing, Next: Random Numbers, Prev: Public Key cryptography, Up: Top
-
-7 Hashing
-*********
-
-Libgcrypt provides an easy and consistent to use interface for hashing.
-Hashing is buffered and several hash algorithms can be updated at once.
-It is possible to compute a MAC using the same routines. The
-programming model follows an open/process/close paradigm and is in that
-similar to other building blocks provided by Libgcrypt.
-
- For convenience reasons, a few cyclic redundancy check value
-operations are also supported.
-
-* Menu:
-
-* Available hash algorithms:: List of hash algorithms supported by the library.
-* Hash algorithm modules:: How to work with hash algorithm modules.
-* Working with hash algorithms:: List of functions related to hashing.
-
-
-File: gcrypt.info, Node: Available hash algorithms, Next: Hash algorithm modules, Up: Hashing
-
-7.1 Available hash algorithms
-=============================
-
-`GCRY_MD_NONE'
- This is not a real algorithm but used by some functions as an error
- return value. This constant is guaranteed to have the value `0'.
-
-`GCRY_MD_SHA1'
- This is the SHA-1 algorithm which yields a message digest of 20
- bytes. Note that SHA-1 begins to show some weaknesses and it is
- suggested to fade out its use if strong cryptographic properties
- are required.
-
-`GCRY_MD_RMD160'
- This is the 160 bit version of the RIPE message digest
- (RIPE-MD-160). Like SHA-1 it also yields a digest of 20 bytes.
- This algorithm share a lot of design properties with SHA-1 and
- thus it is advisable not to use it for new protocols.
-
-`GCRY_MD_MD5'
- This is the well known MD5 algorithm, which yields a message
- digest of 16 bytes. Note that the MD5 algorithm has severe
- weaknesses, for example it is easy to compute two messages
- yielding the same hash (collision attack). The use of this
- algorithm is only justified for non-cryptographic application.
-
-`GCRY_MD_MD4'
- This is the MD4 algorithm, which yields a message digest of 16
- bytes. This algorithms ha severe weaknesses and should not be
- used.
-
-`GCRY_MD_MD2'
- This is an reserved identifier for MD-2; there is no
- implementation yet. This algorithm has severe weaknesses and
- should not be used.
-
-`GCRY_MD_TIGER'
- This is the TIGER/192 algorithm which yields a message digest of
- 24 bytes.
-
-`GCRY_MD_HAVAL'
- This is an reserved value for the HAVAL algorithm with 5 passes
- and 160 bit. It yields a message digest of 20 bytes. Note that
- there is no implementation yet available.
-
-`GCRY_MD_SHA224'
- This is the SHA-224 algorithm which yields a message digest of 28
- bytes. See Change Notice 1 for FIPS 180-2 for the specification.
-
-`GCRY_MD_SHA256'
- This is the SHA-256 algorithm which yields a message digest of 32
- bytes. See FIPS 180-2 for the specification.
-
-`GCRY_MD_SHA384'
- This is the SHA-384 algorithm which yields a message digest of 48
- bytes. See FIPS 180-2 for the specification.
-
-`GCRY_MD_SHA512'
- This is the SHA-384 algorithm which yields a message digest of 64
- bytes. See FIPS 180-2 for the specification.
-
-`GCRY_MD_CRC32'
- This is the ISO 3309 and ITU-T V.42 cyclic redundancy check. It
- yields an output of 4 bytes. Note that this is not a hash
- algorithm in the cryptographic sense.
-
-`GCRY_MD_CRC32_RFC1510'
- This is the above cyclic redundancy check function, as modified by
- RFC 1510. It yields an output of 4 bytes. Note that this is not
- a hash algorithm in the cryptographic sense.
-
-`GCRY_MD_CRC24_RFC2440'
- This is the OpenPGP cyclic redundancy check function. It yields an
- output of 3 bytes. Note that this is not a hash algorithm in the
- cryptographic sense.
-
-`GCRY_MD_WHIRLPOOL'
- This is the Whirlpool algorithm which yields a message digest of 64
- bytes.
-
-
-
-File: gcrypt.info, Node: Hash algorithm modules, Next: Working with hash algorithms, Prev: Available hash algorithms, Up: Hashing
-
-7.2 Hash algorithm modules
-==========================
-
-Libgcrypt makes it possible to load additional `message digest
-modules'; these digests can be used just like the message digest
-algorithms that are built into the library directly. For an
-introduction into extension modules, see *Note Modules::.
-
- -- Data type: gcry_md_spec_t
- This is the `module specification structure' needed for registering
- message digest modules, which has to be filled in by the user
- before it can be used to register a module. It contains the
- following members:
-
- `const char *name'
- The primary name of this algorithm.
-
- `unsigned char *asnoid'
- Array of bytes that form the ASN OID.
-
- `int asnlen'
- Length of bytes in `asnoid'.
-
- `gcry_md_oid_spec_t *oids'
- A list of OIDs that are to be associated with the algorithm.
- The list's last element must have it's `oid' member set to
- NULL. See below for an explanation of this type. See below
- for an explanation of this type.
-
- `int mdlen'
- Length of the message digest algorithm. See below for an
- explanation of this type.
-
- `gcry_md_init_t init'
- The function responsible for initializing a handle. See
- below for an explanation of this type.
-
- `gcry_md_write_t write'
- The function responsible for writing data into a message
- digest context. See below for an explanation of this type.
-
- `gcry_md_final_t final'
- The function responsible for `finalizing' a message digest
- context. See below for an explanation of this type.
-
- `gcry_md_read_t read'
- The function responsible for reading out a message digest
- result. See below for an explanation of this type.
-
- `size_t contextsize'
- The size of the algorithm-specific `context', that should be
- allocated for each handle.
-
- -- Data type: gcry_md_oid_spec_t
- This type is used for associating a user-provided algorithm
- implementation with certain OIDs. It contains the following
- members:
-
- `const char *oidstring'
- Textual representation of the OID.
-
- -- Data type: gcry_md_init_t
- Type for the `init' function, defined as: void (*gcry_md_init_t)
- (void *c)
-
- -- Data type: gcry_md_write_t
- Type for the `write' function, defined as: void (*gcry_md_write_t)
- (void *c, unsigned char *buf, size_t nbytes)
-
- -- Data type: gcry_md_final_t
- Type for the `final' function, defined as: void (*gcry_md_final_t)
- (void *c)
-
- -- Data type: gcry_md_read_t
- Type for the `read' function, defined as: unsigned char
- *(*gcry_md_read_t) (void *c)
-
- -- Function: gcry_error_t gcry_md_register (gcry_md_spec_t *DIGEST,
- unsigned int *algorithm_id, gcry_module_t *MODULE)
- Register a new digest module whose specification can be found in
- DIGEST. On success, a new algorithm ID is stored in ALGORITHM_ID
- and a pointer representing this module is stored in MODULE.
-
- -- Function: void gcry_md_unregister (gcry_module_t MODULE)
- Unregister the digest identified by MODULE, which must have been
- registered with gcry_md_register.
-
- -- Function: gcry_error_t gcry_md_list (int *LIST, int *LIST_LENGTH)
- Get a list consisting of the IDs of the loaded message digest
- modules. If LIST is zero, write the number of loaded message
- digest modules to LIST_LENGTH and return. If LIST is non-zero,
- the first *LIST_LENGTH algorithm IDs are stored in LIST, which
- must be of according size. In case there are less message digests
- modules than *LIST_LENGTH, *LIST_LENGTH is updated to the correct
- number.
-
-
-File: gcrypt.info, Node: Working with hash algorithms, Prev: Hash algorithm modules, Up: Hashing
-
-7.3 Working with hash algorithms
-================================
-
-To use most of these function it is necessary to create a context; this
-is done using:
-
- -- Function: gcry_error_t gcry_md_open (gcry_md_hd_t *HD, int ALGO,
- unsigned int FLAGS)
- Create a message digest object for algorithm ALGO. FLAGS may be
- given as an bitwise OR of constants described below. ALGO may be
- given as `0' if the algorithms to use are later set using
- `gcry_md_enable'. HD is guaranteed to either receive a valid
- handle or NULL.
-
- For a list of supported algorithms, see *Note Available hash
- algorithms::.
-
- The flags allowed for MODE are:
-
- `GCRY_MD_FLAG_SECURE'
- Allocate all buffers and the resulting digest in "secure
- memory". Use this is the hashed data is highly confidential.
-
- `GCRY_MD_FLAG_HMAC'
- Turn the algorithm into a HMAC message authentication
- algorithm. This only works if just one algorithm is enabled
- for the handle. Note that the function `gcry_md_setkey' must
- be used to set the MAC key. The size of the MAC is equal to
- the message digest of the underlying hash algorithm. If you
- want CBC message authentication codes based on a cipher, see
- *Note Working with cipher handles::.
-
-
- You may use the function `gcry_md_is_enabled' to later check
- whether an algorithm has been enabled.
-
-
- If you want to calculate several hash algorithms at the same time,
-you have to use the following function right after the `gcry_md_open':
-
- -- Function: gcry_error_t gcry_md_enable (gcry_md_hd_t H, int ALGO)
- Add the message digest algorithm ALGO to the digest object
- described by handle H. Duplicated enabling of algorithms is
- detected and ignored.
-
- If the flag `GCRY_MD_FLAG_HMAC' was used, the key for the MAC must
-be set using the function:
-
- -- Function: gcry_error_t gcry_md_setkey (gcry_md_hd_t H, const void
- *KEY, size_t KEYLEN)
- For use with the HMAC feature, set the MAC key to the value of KEY
- of length KEYLEN bytes. There is no restriction on the length of
- the key.
-
- After you are done with the hash calculation, you should release the
-resources by using:
-
- -- Function: void gcry_md_close (gcry_md_hd_t H)
- Release all resources of hash context H. H should not be used
- after a call to this function. A `NULL' passed as H is ignored.
- The function also zeroises all sensitive information associated
- with this handle.
-
-
- Often you have to do several hash operations using the same
-algorithm. To avoid the overhead of creating and releasing context, a
-reset function is provided:
-
- -- Function: void gcry_md_reset (gcry_md_hd_t H)
- Reset the current context to its initial state. This is
- effectively identical to a close followed by an open and enabling
- all currently active algorithms.
-
- Often it is necessary to start hashing some data and then continue to
-hash different data. To avoid hashing the same data several times
-(which might not even be possible if the data is received from a pipe),
-a snapshot of the current hash context can be taken and turned into a
-new context:
-
- -- Function: gcry_error_t gcry_md_copy (gcry_md_hd_t *HANDLE_DST,
- gcry_md_hd_t HANDLE_SRC)
- Create a new digest object as an exact copy of the object
- described by handle HANDLE_SRC and store it in HANDLE_DST. The
- context is not reset and you can continue to hash data using this
- context and independently using the original context.
-
- Now that we have prepared everything to calculate hashes, it is time
-to see how it is actually done. There are two ways for this, one to
-update the hash with a block of memory and one macro to update the hash
-by just one character. Both methods can be used on the same hash
-context.
-
- -- Function: void gcry_md_write (gcry_md_hd_t H, const void *BUFFER,
- size_t LENGTH)
- Pass LENGTH bytes of the data in BUFFER to the digest object with
- handle H to update the digest values. This function should be used
- for large blocks of data.
-
- -- Function: void gcry_md_putc (gcry_md_hd_t H, int C)
- Pass the byte in C to the digest object with handle H to update
- the digest value. This is an efficient function, implemented as a
- macro to buffer the data before an actual update.
-
- The semantics of the hash functions do not provide for reading out
-intermediate message digests because the calculation must be finalized
-first. This finalization may for example include the number of bytes
-hashed in the message digest or some padding.
-
- -- Function: void gcry_md_final (gcry_md_hd_t H)
- Finalize the message digest calculation. This is not really needed
- because `gcry_md_read' does this implicitly. After this has been
- done no further updates (by means of `gcry_md_write' or
- `gcry_md_putc' are allowed. Only the first call to this function
- has an effect. It is implemented as a macro.
-
- The way to read out the calculated message digest is by using the
-function:
-
- -- Function: unsigned char * gcry_md_read (gcry_md_hd_t H, int ALGO)
- `gcry_md_read' returns the message digest after finalizing the
- calculation. This function may be used as often as required but
- it will always return the same value for one handle. The returned
- message digest is allocated within the message context and
- therefore valid until the handle is released or reseted (using
- `gcry_md_close' or `gcry_md_reset'. ALGO may be given as 0 to
- return the only enabled message digest or it may specify one of
- the enabled algorithms. The function does return `NULL' if the
- requested algorithm has not been enabled.
-
- Because it is often necessary to get the message digest of one block
-of memory, a fast convenience function is available for this task:
-
- -- Function: void gcry_md_hash_buffer (int ALGO, void *DIGEST, const
- void *BUFFER, size_t LENGTH);
- `gcry_md_hash_buffer' is a shortcut function to calculate a message
- digest of a buffer. This function does not require a context and
- immediately returns the message digest of the LENGTH bytes at
- BUFFER. DIGEST must be allocated by the caller, large enough to
- hold the message digest yielded by the the specified algorithm
- ALGO. This required size may be obtained by using the function
- `gcry_md_get_algo_dlen'.
-
- Note that this function will abort the process if an unavailable
- algorithm is used.
-
- Hash algorithms are identified by internal algorithm numbers (see
-`gcry_md_open' for a list). However, in most applications they are
-used by names, so two functions are available to map between string
-representations and hash algorithm identifiers.
-
- -- Function: const char * gcry_md_algo_name (int ALGO)
- Map the digest algorithm id ALGO to a string representation of the
- algorithm name. For unknown algorithms this function returns the
- string `"?"'. This function should not be used to test for the
- availability of an algorithm.
-
- -- Function: int gcry_md_map_name (const char *NAME)
- Map the algorithm with NAME to a digest algorithm identifier.
- Returns 0 if the algorithm name is not known. Names representing
- ASN.1 object identifiers are recognized if the IETF dotted format
- is used and the OID is prefixed with either "`oid.'" or "`OID.'".
- For a list of supported OIDs, see the source code at
- `cipher/md.c'. This function should not be used to test for the
- availability of an algorithm.
-
- -- Function: gcry_error_t gcry_md_get_asnoid (int ALGO, void *BUFFER,
- size_t *LENGTH)
- Return an DER encoded ASN.1 OID for the algorithm ALGO in the user
- allocated BUFFER. LENGTH must point to variable with the available
- size of BUFFER and receives after return the actual size of the
- returned OID. The returned error code may be `GPG_ERR_TOO_SHORT'
- if the provided buffer is to short to receive the OID; it is
- possible to call the function with `NULL' for BUFFER to have it
- only return the required size. The function returns 0 on success.
-
-
- To test whether an algorithm is actually available for use, the
-following macro should be used:
-
- -- Function: gcry_error_t gcry_md_test_algo (int ALGO)
- The macro returns 0 if the algorithm ALGO is available for use.
-
- If the length of a message digest is not known, it can be retrieved
-using the following function:
-
- -- Function: unsigned int gcry_md_get_algo_dlen (int ALGO)
- Retrieve the length in bytes of the digest yielded by algorithm
- ALGO. This is often used prior to `gcry_md_read' to allocate
- sufficient memory for the digest.
-
- In some situations it might be hard to remember the algorithm used
-for the ongoing hashing. The following function might be used to get
-that information:
-
- -- Function: int gcry_md_get_algo (gcry_md_hd_t H)
- Retrieve the algorithm used with the handle H. Note that this
- does not work reliable if more than one algorithm is enabled in H.
-
- The following macro might also be useful:
-
- -- Function: int gcry_md_is_secure (gcry_md_hd_t H)
- This function returns true when the digest object H is allocated
- in "secure memory"; i.e. H was created with the
- `GCRY_MD_FLAG_SECURE'.
-
- -- Function: int gcry_md_is_enabled (gcry_md_hd_t H, int ALGO)
- This function returns true when the algorithm ALGO has been
- enabled for the digest object H.
-
- Tracking bugs related to hashing is often a cumbersome task which
-requires to add a lot of printf statements into the code. Libgcrypt
-provides an easy way to avoid this. The actual data hashed can be
-written to files on request.
-
- -- Function: void gcry_md_debug (gcry_md_hd_t H, const char *SUFFIX)
- Enable debugging for the digest object with handle H. This
- creates create files named `dbgmd-<n>.<string>' while doing the
- actual hashing. SUFFIX is the string part in the filename. The
- number is a counter incremented for each new hashing. The data in
- the file is the raw data as passed to `gcry_md_write' or
- `gcry_md_putc'. If `NULL' is used for SUFFIX, the debugging is
- stopped and the file closed. This is only rarely required because
- `gcry_md_close' implicitly stops debugging.
-
- The following two deprecated macros are used for debugging by old
-code. They shopuld be replaced by `gcry_md_debug'.
-
- -- Function: void gcry_md_start_debug (gcry_md_hd_t H, const char
- *SUFFIX)
- Enable debugging for the digest object with handle H. This
- creates create files named `dbgmd-<n>.<string>' while doing the
- actual hashing. SUFFIX is the string part in the filename. The
- number is a counter incremented for each new hashing. The data in
- the file is the raw data as passed to `gcry_md_write' or
- `gcry_md_putc'.
-
- -- Function: void gcry_md_stop_debug (gcry_md_hd_t H, int RESERVED)
- Stop debugging on handle H. RESERVED should be specified as 0.
- This function is usually not required because `gcry_md_close' does
- implicitly stop debugging.
-
-
-File: gcrypt.info, Node: Random Numbers, Next: S-expressions, Prev: Hashing, Up: Top
-
-8 Random Numbers
-****************
-
-* Menu:
-
-* Quality of random numbers:: Libgcrypt uses different quality levels.
-* Retrieving random numbers:: How to retrieve random numbers.
-
-
-File: gcrypt.info, Node: Quality of random numbers, Next: Retrieving random numbers, Up: Random Numbers
-
-8.1 Quality of random numbers
-=============================
-
-Libgcypt offers random numbers of different quality levels:
-
- -- Data type: gcry_random_level_t
- The constants for the random quality levels are of this enum type.
-
-`GCRY_WEAK_RANDOM'
- For all functions, except for `gcry_mpi_randomize', this level maps
- to GCRY_STRONG_RANDOM. If you do not want this, consider using
- `gcry_create_nonce'.
-
-`GCRY_STRONG_RANDOM'
- Use this level for session keys and similar purposes.
-
-`GCRY_VERY_STRONG_RANDOM'
- Use this level for long term key material.
-
-
-File: gcrypt.info, Node: Retrieving random numbers, Prev: Quality of random numbers, Up: Random Numbers
-
-8.2 Retrieving random numbers
-=============================
-
- -- Function: void gcry_randomize (unsigned char *BUFFER, size_t
- LENGTH, enum gcry_random_level LEVEL)
- Fill BUFFER with LENGTH random bytes using a random quality as
- defined by LEVEL.
-
- -- Function: void * gcry_random_bytes (size_t NBYTES, enum
- gcry_random_level LEVEL)
- Convenience function to allocate a memory block consisting of
- NBYTES fresh random bytes using a random quality as defined by
- LEVEL.
-
- -- Function: void * gcry_random_bytes_secure (size_t NBYTES, enum
- gcry_random_level LEVEL)
- Convenience function to allocate a memory block consisting of
- NBYTES fresh random bytes using a random quality as defined by
- LEVEL. This function differs from `gcry_random_bytes' in that the
- returned buffer is allocated in a "secure" area of the memory.
-
- -- Function: void gcry_create_nonce (unsigned char *BUFFER, size_t
- LENGTH)
- Fill BUFFER with LENGTH unpredictable bytes. This is commonly
- called a nonce and may also be used for initialization vectors and
- padding. This is an extra function nearly independent of the
- other random function for 3 reasons: It better protects the
- regular random generator's internal state, provides better
- performance and does not drain the precious entropy pool.
-
-
-
-File: gcrypt.info, Node: S-expressions, Next: MPI library, Prev: Random Numbers, Up: Top
-
-9 S-expressions
-***************
-
-S-expressions are used by the public key functions to pass complex data
-structures around. These LISP like objects are used by some
-cryptographic protocols (cf. RFC-2692) and Libgcrypt provides functions
-to parse and construct them. For detailed information, see `Ron
-Rivest, code and description of S-expressions,
-`http://theory.lcs.mit.edu/~rivest/sexp.html''.
-
-* Menu:
-
-* Data types for S-expressions:: Data types related with S-expressions.
-* Working with S-expressions:: How to work with S-expressions.
-
-
-File: gcrypt.info, Node: Data types for S-expressions, Next: Working with S-expressions, Up: S-expressions
-
-9.1 Data types for S-expressions
-================================
-
- -- Data type: gcry_sexp_t
- The `gcry_sexp_t' type describes an object with the Libgcrypt
- internal representation of an S-expression.
-
-
-File: gcrypt.info, Node: Working with S-expressions, Prev: Data types for S-expressions, Up: S-expressions
-
-9.2 Working with S-expressions
-==============================
-
-There are several functions to create an Libgcrypt S-expression object
-from its external representation or from a string template. There is
-also a function to convert the internal representation back into one of
-the external formats:
-
- -- Function: gcry_error_t gcry_sexp_new (gcry_sexp_t *R_SEXP,
- const void *BUFFER, size_t LENGTH, int AUTODETECT)
- This is the generic function to create an new S-expression object
- from its external representation in BUFFER of LENGTH bytes. On
- success the result is stored at the address given by R_SEXP. With
- AUTODETECT set to 0, the data in BUFFER is expected to be in
- canonized format, with AUTODETECT set to 1 the parses any of the
- defined external formats. If BUFFER does not hold a valid
- S-expression an error code is returned and R_SEXP set to `NULL'.
- Note that the caller is responsible for releasing the newly
- allocated S-expression using `gcry_sexp_release'.
-
- -- Function: gcry_error_t gcry_sexp_create (gcry_sexp_t *R_SEXP,
- void *BUFFER, size_t LENGTH, int AUTODETECT,
- void (*FREEFNC)(void*))
- This function is identical to `gcry_sexp_new' but has an extra
- argument FREEFNC, which, when not set to `NULL', is expected to be
- a function to release the BUFFER; most likely the standard `free'
- function is used for this argument. This has the effect of
- transferring the ownership of BUFFER to the created object in
- R_SEXP. The advantage of using this function is that Libgcrypt
- might decide to directly use the provided buffer and thus avoid
- extra copying.
-
- -- Function: gcry_error_t gcry_sexp_sscan (gcry_sexp_t *R_SEXP,
- size_t *ERROFF, const char *BUFFER, size_t LENGTH)
- This is another variant of the above functions. It behaves nearly
- identical but provides an ERROFF argument which will receive the
- offset into the buffer where the parsing stopped on error.
-
- -- Function: gcry_error_t gcry_sexp_build (gcry_sexp_t *R_SEXP,
- size_t *ERROFF, const char *FORMAT, ...)
- This function creates an internal S-expression from the string
- template FORMAT and stores it at the address of R_SEXP. If there
- is a parsing error, the function returns an appropriate error code
- and stores the offset into FORMAT where the parsing stopped in
- ERROFF. The function supports a couple of printf-like formatting
- characters and expects arguments for some of these escape
- sequences right after FORMAT. The following format characters are
- defined:
-
- `%m'
- The next argument is expected to be of type `gcry_mpi_t' and
- a copy of its value is inserted into the resulting
- S-expression.
-
- `%s'
- The next argument is expected to be of type `char *' and that
- string is inserted into the resulting S-expression.
-
- `%d'
- The next argument is expected to be of type `int' and its
- value is inserted into the resulting S-expression.
-
- `%b'
- The next argument is expected to be of type `int' directly
- followed by an argument of type `char *'. This represents a
- buffer of given length to be inserted into the resulting
- S-expression.
-
- `%S'
- The next argument is expected to be of type `gcry_sexp_t' and
- a copy of that S-expression is embedded in the resulting
- S-expression. The argument needs to be a regular
- S-expression, starting with a parenthesis.
-
-
- No other format characters are defined and would return an error.
- Note that the format character `%%' does not exists, because a
- percent sign is not a valid character in an S-expression.
-
- -- Function: void gcry_sexp_release (gcry_sexp_t SEXP)
- Release the S-expression object SEXP. If the S-expression is
- stored in secure memory it explicitly zeroises that memory; note
- that this is done in addition to the zeroisation always done when
- freeing secure memory.
-
-The next 2 functions are used to convert the internal representation
-back into a regular external S-expression format and to show the
-structure for debugging.
-
- -- Function: size_t gcry_sexp_sprint (gcry_sexp_t SEXP, int MODE,
- char *BUFFER, size_t MAXLENGTH)
- Copies the S-expression object SEXP into BUFFER using the format
- specified in MODE. MAXLENGTH must be set to the allocated length
- of BUFFER. The function returns the actual length of valid bytes
- put into BUFFER or 0 if the provided buffer is too short. Passing
- `NULL' for BUFFER returns the required length for BUFFER. For
- convenience reasons an extra byte with value 0 is appended to the
- buffer.
-
- The following formats are supported:
-
- `GCRYSEXP_FMT_DEFAULT'
- Returns a convenient external S-expression representation.
-
- `GCRYSEXP_FMT_CANON'
- Return the S-expression in canonical format.
-
- `GCRYSEXP_FMT_BASE64'
- Not currently supported.
-
- `GCRYSEXP_FMT_ADVANCED'
- Returns the S-expression in advanced format.
-
- -- Function: void gcry_sexp_dump (gcry_sexp_t SEXP)
- Dumps SEXP in a format suitable for debugging to Libgcrypt's
- logging stream.
-
-Often canonical encoding is used in the external representation. The
-following function can be used to check for valid encoding and to learn
-the length of the S-expression"
-
- -- Function: size_t gcry_sexp_canon_len (const unsigned char *BUFFER,
- size_t LENGTH, size_t *ERROFF, int *ERRCODE)
- Scan the canonical encoded BUFFER with implicit length values and
- return the actual length this S-expression uses. For a valid
- S-expression it should never return 0. If LENGTH is not 0, the
- maximum length to scan is given; this can be used for syntax
- checks of data passed from outside. ERRCODE and ERROFF may both be
- passed as `NULL'.
-
-
-There are functions to parse S-expressions and retrieve elements:
-
- -- Function: gcry_sexp_t gcry_sexp_find_token (const gcry_sexp_t LIST,
- const char *TOKEN, size_t TOKLEN)
- Scan the S-expression for a sublist with a type (the car of the
- list) matching the string TOKEN. If TOKLEN is not 0, the token is
- assumed to be raw memory of this length. The function returns a
- newly allocated S-expression consisting of the found sublist or
- `NULL' when not found.
-
- -- Function: int gcry_sexp_length (const gcry_sexp_t LIST)
- Return the length of the LIST. For a valid S-expression this
- should be at least 1.
-
- -- Function: gcry_sexp_t gcry_sexp_nth (const gcry_sexp_t LIST,
- int NUMBER)
- Create and return a new S-expression from the element with index
- NUMBER in LIST. Note that the first element has the index 0. If
- there is no such element, `NULL' is returned.
-
- -- Function: gcry_sexp_t gcry_sexp_car (const gcry_sexp_t LIST)
- Create and return a new S-expression from the first element in
- LIST; this called the "type" and should always exist and be a
- string. `NULL' is returned in case of a problem.
-
- -- Function: gcry_sexp_t gcry_sexp_cdr (const gcry_sexp_t LIST)
- Create and return a new list form all elements except for the
- first one. Note that this function may return an invalid
- S-expression because it is not guaranteed, that the type exists
- and is a string. However, for parsing a complex S-expression it
- might be useful for intermediate lists. Returns `NULL' on error.
-
- -- Function: const char * gcry_sexp_nth_data (const gcry_sexp_t LIST,
- int NUMBER, size_t *DATALEN)
- This function is used to get data from a LIST. A pointer to the
- actual data with index NUMBER is returned and the length of this
- data will be stored to DATALEN. If there is no data at the given
- index or the index represents another list, `NULL' is returned.
- *Caution:* The returned pointer is valid as long as LIST is not
- modified or released.
-
- Here is an example on how to extract and print the surname (Meier)
- from the S-expression `(Name Otto Meier (address Burgplatz 3))':
-
- size_t len;
- const char *name;
-
- name = gcry_sexp_nth_data (list, 2, &len);
- printf ("my name is %.*s\n", (int)len, name);
-
- -- Function: char * gcry_sexp_nth_string (gcry_sexp_t LIST, int NUMBER)
- This function is used to get and convert data from a LIST. The
- data is assumed to be a Nul terminated string. The caller must
- release this returned value using `gcry_free'. If there is no
- data at the given index, the index represents a list or the value
- can't be converted to a string, `NULL' is returned.
-
- -- Function: gcry_mpi_t gcry_sexp_nth_mpi (gcry_sexp_t LIST,
- int NUMBER, int MPIFMT)
- This function is used to get and convert data from a LIST. This
- data is assumed to be an MPI stored in the format described by
- MPIFMT and returned as a standard Libgcrypt MPI. The caller must
- release this returned value using `gcry_mpi_release'. If there is
- no data at the given index, the index represents a list or the
- value can't be converted to an MPI, `NULL' is returned.
-
-
-File: gcrypt.info, Node: MPI library, Next: Prime numbers, Prev: S-expressions, Up: Top
-
-10 MPI library
-**************
-
-* Menu:
-
-* Data types:: MPI related data types.
-* Basic functions:: First steps with MPI numbers.
-* MPI formats:: External representation of MPIs.
-* Calculations:: Performing MPI calculations.
-* Comparisons:: How to compare MPI values.
-* Bit manipulations:: How to access single bits of MPI values.
-* Miscellaneous:: Miscellaneous MPI functions.
-
- Public key cryptography is based on mathematics with large numbers.
-To implement the public key functions, a library for handling these
-large numbers is required. Because of the general usefulness of such a
-library, its interface is exposed by Libgcrypt. In the context of
-Libgcrypt and in most other applications, these large numbers are
-called MPIs (multi-precision-integers).
-
-
-File: gcrypt.info, Node: Data types, Next: Basic functions, Up: MPI library
-
-10.1 Data types
-===============
-
- -- Data type: gcry_mpi_t
- This type represents an object to hold an MPI.
-
-
-File: gcrypt.info, Node: Basic functions, Next: MPI formats, Prev: Data types, Up: MPI library
-
-10.2 Basic functions
-====================
-
-To work with MPIs, storage must be allocated and released for the
-numbers. This can be done with one of these functions:
-
- -- Function: gcry_mpi_t gcry_mpi_new (unsigned int NBITS)
- Allocate a new MPI object, initialize it to 0 and initially
- allocate enough memory for a number of at least NBITS. This
- pre-allocation is only a small performance issue and not actually
- necessary because Libgcrypt automatically re-allocates the
- required memory.
-
- -- Function: gcry_mpi_t gcry_mpi_snew (unsigned int NBITS)
- This is identical to `gcry_mpi_new' but allocates the MPI in the so
- called "secure memory" which in turn will take care that all
- derived values will also be stored in this "secure memory". Use
- this for highly confidential data like private key parameters.
-
- -- Function: gcry_mpi_t gcry_mpi_copy (const gcry_mpi_t A)
- Create a new MPI as the exact copy of A.
-
- -- Function: void gcry_mpi_release (gcry_mpi_t A)
- Release the MPI A and free all associated resources. Passing
- `NULL' is allowed and ignored. When a MPI stored in the "secure
- memory" is released, that memory gets wiped out immediately.
-
-The simplest operations are used to assign a new value to an MPI:
-
- -- Function: gcry_mpi_t gcry_mpi_set (gcry_mpi_t W, const gcry_mpi_t U)
- Assign the value of U to W and return W. If `NULL' is passed for
- W, a new MPI is allocated, set to the value of U and returned.
-
- -- Function: gcry_mpi_t gcry_mpi_set_ui (gcry_mpi_t W, unsigned long U)
- Assign the value of U to W and return W. If `NULL' is passed for
- W, a new MPI is allocated, set to the value of U and returned.
- This function takes an `unsigned int' as type for U and thus it is
- only possible to set W to small values (usually up to the word
- size of the CPU).
-
- -- Function: void gcry_mpi_swap (gcry_mpi_t A, gcry_mpi_t B)
- Swap the values of A and B.
-
-
-File: gcrypt.info, Node: MPI formats, Next: Calculations, Prev: Basic functions, Up: MPI library
-
-10.3 MPI formats
-================
-
-The following functions are used to convert between an external
-representation of an MPI and the internal one of Libgcrypt.
-
- -- Function: gcry_error_t gcry_mpi_scan (gcry_mpi_t *R_MPI,
- enum gcry_mpi_format FORMAT, const unsigned char *BUFFER,
- size_t BUFLEN, size_t *NSCANNED)
- Convert the external representation of an integer stored in BUFFER
- with a length of BUFLEN into a newly created MPI returned which
- will be stored at the address of R_MPI. For certain formats the
- length argument is not required and should be passed as `0'.
- After a successful operation the variable NSCANNED receives the
- number of bytes actually scanned unless NSCANNED was given as
- `NULL'. FORMAT describes the format of the MPI as stored in BUFFER:
-
- `GCRYMPI_FMT_STD'
- 2-complement stored without a length header.
-
- `GCRYMPI_FMT_PGP'
- As used by OpenPGP (only defined as unsigned). This is
- basically `GCRYMPI_FMT_STD' with a 2 byte big endian length
- header.
-
- `GCRYMPI_FMT_SSH'
- As used in the Secure Shell protocol. This is
- `GCRYMPI_FMT_STD' with a 4 byte big endian header.
-
- `GCRYMPI_FMT_HEX'
- Stored as a C style string with each byte of the MPI encoded
- as 2 hex digits. When using this format, BUFLEN must be zero.
-
- `GCRYMPI_FMT_USG'
- Simple unsigned integer.
-
- Note that all of the above formats store the integer in big-endian
- format (MSB first).
-
- -- Function: gcry_error_t gcry_mpi_print (enum gcry_mpi_format FORMAT,
- unsigned char *BUFFER, size_t BUFLEN, size_t *NWRITTEN,
- const gcry_mpi_t A)
- Convert the MPI A into an external representation described by
- FORMAT (see above) and store it in the provided BUFFER which has a
- usable length of at least the BUFLEN bytes. If NWRITTEN is not
- NULL, it will receive the number of bytes actually stored in
- BUFFER after a successful operation.
-
- -- Function: gcry_error_t gcry_mpi_aprint
- (enum gcry_mpi_format FORMAT, unsigned char **BUFFER,
- size_t *NBYTES, const gcry_mpi_t A)
- Convert the MPI A into an external representation described by
- FORMAT (see above) and store it in a newly allocated buffer which
- address will be stored in the variable BUFFER points to. The
- number of bytes stored in this buffer will be stored in the
- variable NBYTES points to, unless NBYTES is `NULL'.
-
- -- Function: void gcry_mpi_dump (const gcry_mpi_t A)
- Dump the value of A in a format suitable for debugging to
- Libgcrypt's logging stream. Note that one leading space but no
- trailing space or linefeed will be printed. It is okay to pass
- `NULL' for A.
-
-
-File: gcrypt.info, Node: Calculations, Next: Comparisons, Prev: MPI formats, Up: MPI library
-
-10.4 Calculations
-=================
-
-Basic arithmetic operations:
-
- -- Function: void gcry_mpi_add (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V)
- W = U + V.
-
- -- Function: void gcry_mpi_add_ui (gcry_mpi_t W, gcry_mpi_t U,
- unsigned long V)
- W = U + V. Note that V is an unsigned integer.
-
- -- Function: void gcry_mpi_addm (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V, gcry_mpi_t M)
- W = U + V \bmod M.
-
- -- Function: void gcry_mpi_sub (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V)
- W = U - V.
-
- -- Function: void gcry_mpi_sub_ui (gcry_mpi_t W, gcry_mpi_t U,
- unsigned long V)
- W = U - V. V is an unsigned integer.
-
- -- Function: void gcry_mpi_subm (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V, gcry_mpi_t M)
- W = U - V \bmod M.
-
- -- Function: void gcry_mpi_mul (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V)
- W = U * V.
-
- -- Function: void gcry_mpi_mul_ui (gcry_mpi_t W, gcry_mpi_t U,
- unsigned long V)
- W = U * V. V is an unsigned integer.
-
- -- Function: void gcry_mpi_mulm (gcry_mpi_t W, gcry_mpi_t U,
- gcry_mpi_t V, gcry_mpi_t M)
- W = U * V \bmod M.
-
- -- Function: void gcry_mpi_mul_2exp (gcry_mpi_t W, gcry_mpi_t U,
- unsigned long E)
- W = U * 2^e.
-
- -- Function: void gcry_mpi_div (gcry_mpi_t Q, gcry_mpi_t R,
- gcry_mpi_t DIVIDEND, gcry_mpi_t DIVISOR, int ROUND)
- Q = DIVIDEND / DIVISOR, R = DIVIDEND \bmod DIVISOR. Q and R may
- be passed as `NULL'. ROUND should be negative or 0.
-
- -- Function: void gcry_mpi_mod (gcry_mpi_t R, gcry_mpi_t DIVIDEND,
- gcry_mpi_t DIVISOR)
- R = DIVIDEND \bmod DIVISOR.
-
- -- Function: void gcry_mpi_powm (gcry_mpi_t W, const gcry_mpi_t B,
- const gcry_mpi_t E, const gcry_mpi_t M)
- W = B^e \bmod M.
-
- -- Function: int gcry_mpi_gcd (gcry_mpi_t G, gcry_mpi_t A,
- gcry_mpi_t B)
- Set G to the greatest common divisor of A and B. Return true if
- the G is 1.
-
- -- Function: int gcry_mpi_invm (gcry_mpi_t X, gcry_mpi_t A,
- gcry_mpi_t M)
- Set X to the multiplicative inverse of A \bmod M. Return true if
- the inverse exists.
-
-
-File: gcrypt.info, Node: Comparisons, Next: Bit manipulations, Prev: Calculations, Up: MPI library
-
-10.5 Comparisons
-================
-
-The next 2 functions are used to compare MPIs:
-
- -- Function: int gcry_mpi_cmp (const gcry_mpi_t U, const gcry_mpi_t V)
- Compare the multi-precision-integers number U and V returning 0
- for equality, a positive value for U > V and a negative for U < V.
-
- -- Function: int gcry_mpi_cmp_ui (const gcry_mpi_t U, unsigned long V)
- Compare the multi-precision-integers number U with the unsigned
- integer V returning 0 for equality, a positive value for U > V and
- a negative for U < V.
-
-
-File: gcrypt.info, Node: Bit manipulations, Next: Miscellaneous, Prev: Comparisons, Up: MPI library
-
-10.6 Bit manipulations
-======================
-
-There are a couple of functions to get information on arbitrary bits in
-an MPI and to set or clear them:
-
- -- Function: unsigned int gcry_mpi_get_nbits (gcry_mpi_t A)
- Return the number of bits required to represent A.
-
- -- Function: int gcry_mpi_test_bit (gcry_mpi_t A, unsigned int N)
- Return true if bit number N (counting from 0) is set in A.
-
- -- Function: void gcry_mpi_set_bit (gcry_mpi_t A, unsigned int N)
- Set bit number N in A.
-
- -- Function: void gcry_mpi_clear_bit (gcry_mpi_t A, unsigned int N)
- Clear bit number N in A.
-
- -- Function: void gcry_mpi_set_highbit (gcry_mpi_t A, unsigned int N)
- Set bit number N in A and clear all bits greater than N.
-
- -- Function: void gcry_mpi_clear_highbit (gcry_mpi_t A, unsigned int N)
- Clear bit number N in A and all bits greater than N.
-
- -- Function: void gcry_mpi_rshift (gcry_mpi_t X, gcry_mpi_t A,
- unsigned int N)
- Shift the value of A by N bits to the right and store the result
- in X.
-
- -- Function: void gcry_mpi_lshift (gcry_mpi_t X, gcry_mpi_t A,
- unsigned int N)
- Shift the value of A by N bits to the left and store the result in
- X.
-
-
-File: gcrypt.info, Node: Miscellaneous, Prev: Bit manipulations, Up: MPI library
-
-10.7 Miscellaneous
-==================
-
- -- Function: gcry_mpi_t gcry_mpi_set_opaque (gcry_mpi_t A, void *P,
- unsigned int NBITS)
- Store NBITS of the value P points to in A and mark A as an opaque
- value (i.e. an value that can't be used for any math calculation
- and is only used to store an arbitrary bit pattern in A).
-
- WARNING: Never use an opaque MPI for actual math operations. The
- only valid functions are gcry_mpi_get_opaque and gcry_mpi_release.
- Use gcry_mpi_scan to convert a string of arbitrary bytes into an
- MPI.
-
-
- -- Function: void * gcry_mpi_get_opaque (gcry_mpi_t A,
- unsigned int *NBITS)
- Return a pointer to an opaque value stored in A and return its
- size in NBITS. Note that the returned pointer is still owned by A
- and that the function should never be used for an non-opaque MPI.
-
- -- Function: void gcry_mpi_set_flag (gcry_mpi_t A,
- enum gcry_mpi_flag FLAG)
- Set the FLAG for the MPI A. Currently only the flag
- `GCRYMPI_FLAG_SECURE' is allowed to convert A into an MPI stored
- in "secure memory".
-
- -- Function: void gcry_mpi_clear_flag (gcry_mpi_t A,
- enum gcry_mpi_flag FLAG)
- Clear FLAG for the multi-precision-integers A. Note that this
- function is currently useless as no flags are allowed.
-
- -- Function: int gcry_mpi_get_flag (gcry_mpi_t A,
- enum gcry_mpi_flag FLAG)
- Return true when the FLAG is set for A.
-
- -- Function: void gcry_mpi_randomize (gcry_mpi_t W,
- unsigned int NBITS, enum gcry_random_level LEVEL)
- Set the multi-precision-integers W to a random value of NBITS,
- using random data quality of level LEVEL. In case NBITS is not a
- multiple of a byte, NBITS is rounded up to the next byte boundary.
- When using a LEVEL of `GCRY_WEAK_RANDOM' this function makes use of
- `gcry_create_nonce'.
-
-
-File: gcrypt.info, Node: Prime numbers, Next: Utilities, Prev: MPI library, Up: Top
-
-11 Prime numbers
-****************
-
-* Menu:
-
-* Generation:: Generation of new prime numbers.
-* Checking:: Checking if a given number is prime.
-
-
-File: gcrypt.info, Node: Generation, Next: Checking, Up: Prime numbers
-
-11.1 Generation
-===============
-
- -- Function: gcry_error_t gcry_prime_generate (gcry_mpi_t
- *PRIME,unsigned int PRIME_BITS, unsigned int FACTOR_BITS,
- gcry_mpi_t **FACTORS, gcry_prime_check_func_t CB_FUNC, void
- *CB_ARG, gcry_random_level_t RANDOM_LEVEL, unsigned int FLAGS)
- Generate a new prime number of PRIME_BITS bits and store it in
- PRIME. If FACTOR_BITS is non-zero, one of the prime factors of
- (PRIME - 1) / 2 must be FACTOR_BITS bits long. If FACTORS is
- non-zero, allocate a new, `NULL'-terminated array holding the
- prime factors and store it in FACTORS. FLAGS might be used to
- influence the prime number generation process.
-
- -- Function: gcry_error_t gcry_prime_group_generator (gcry_mpi_t *R_G,
- gcry_mpi_t PRIME, gcry_mpi_t *FACTORS, gcry_mpi_t START_G)
- Find a generator for PRIME where the factorization of (PRIME-1) is
- in the `NULL' terminated array FACTORS. Return the generator as a
- newly allocated MPI in R_G. If START_G is not NULL, use this as
- the start for the search.
-
- -- Function: void gcry_prime_release_factors (gcry_mpi_t *FACTORS)
- Convenience function to release the FACTORS array.
-
-
-File: gcrypt.info, Node: Checking, Prev: Generation, Up: Prime numbers
-
-11.2 Checking
-=============
-
- -- Function: gcry_error_t gcry_prime_check (gcry_mpi_t P, unsigned int
- FLAGS)
- Check wether the number P is prime. Returns zero in case P is
- indeed a prime, returns `GPG_ERR_NO_PRIME' in case P is not a
- prime and a different error code in case something went horribly
- wrong.
-
-
-File: gcrypt.info, Node: Utilities, Next: Architecture, Prev: Prime numbers, Up: Top
-
-12 Utilities
-************
-
-* Menu:
-
-* Memory allocation:: Functions related with memory allocation.
-
-
-File: gcrypt.info, Node: Memory allocation, Up: Utilities
-
-12.1 Memory allocation
-======================
-
- -- Function: void * gcry_malloc (size_t N)
- This function tries to allocate N bytes of memory. On success it
- returns a pointer to the memory area, in an out-of-core condition,
- it returns NULL.
-
- -- Function: void * gcry_malloc_secure (size_t N)
- Like `gcry_malloc', but uses secure memory.
-
- -- Function: void * gcry_calloc (size_t N, size_t M)
- This function allocates a cleared block of memory (i.e.
- initialized with zero bytes) long enough to contain a vector of N
- elements, each of size M bytes. On success it returns a pointer
- to the memory block; in an out-of-core condition, it returns NULL.
-
- -- Function: void * gcry_calloc_secure (size_t N, size_t M)
- Like `gcry_calloc', but uses secure memory.
-
- -- Function: void * gcry_realloc (void *P, size_t N)
- This function tries to resize the memory area pointed to by P to N
- bytes. On success it returns a pointer to the new memory area, in
- an out-of-core condition, it returns NULL. Depending on whether
- the memory pointed to by P is secure memory or not, gcry_realloc
- tries to use secure memory as well.
-
- -- Function: void gcry_free (void *P)
- Release the memory area pointed to by P.
-
-
-File: gcrypt.info, Node: Architecture, Next: Self-Tests, Prev: Utilities, Up: Top
-
-13 Architecture
-***************
-
-This chapter describes the internal architecture of Libgcrypt.
-
- Libgcrypt is a function library written in ISO C-90. Any compliant
-compiler should be able to build Libgcrypt as long as the target is
-either a POSIX platform or compatible to the API used by Windows NT.
-Provisions have been take so that the library can be directly used from
-C++ applications; however building with a C++ compiler is not supported.
-
- Building Libgcrypt is done by using the common `./configure && make'
-approach. The configure command is included in the source distribution
-and as a portable shell script it works on any Unix-alike system. The
-result of running the configure script are a C header file
-(`config.h'), customized Makefiles, the setup of symbolic links and a
-few other things. After that the make tool builds and optionally
-installs the library and the documentation. See the files `INSTALL'
-and `README' in the source distribution on how to do this.
-
- Libgcrypt is developed using a Subversion(1) repository. Although
-all released versions are tagged in this repository, they should not be
-used to build production versions of Libgcrypt. Instead released
-tarballs should be used. These tarballs are available from several
-places with the master copy at <ftp://ftp.gnupg.org/gcrypt/libgcrypt/>.
-Announcements of new releases are posted to the
-<gnupg-announce@gnupg.org> mailing list(2).
-
-
-Figure 13.1: Libgcrypt subsystems
-
- Libgcrypt consists of several subsystems (*note Figure 13.1:
-fig:subsystems.) and all these subsystems provide a public API; this
-includes the helper subsystems like the one for S-expressions. The API
-style depends on the subsystem; in general an open-use-close approach
-is implemented. The open returns a handle to a context used for all
-further operations on this handle, several functions may then be used
-on this handle and a final close function releases all resources
-associated with the handle.
-
-* Menu:
-
-* Public-Key Subsystem Architecture:: About public keys.
-* Symmetric Encryption Subsystem Architecture:: About standard ciphers.
-* Hashing and MACing Subsystem Architecture:: About hashing.
-* Multi-Precision-Integer Subsystem Architecture:: About big integers.
-* Prime-Number-Generator Subsystem Architecture:: About prime numbers.
-* Random-Number Subsystem Architecture:: About random stuff.
-
- ---------- Footnotes ----------
-
- (1) A version control system available for many platforms
-
- (2) See `http://www.gnupg.org/documentation/mailing-lists.en.html'
-for details.
-
-
-File: gcrypt.info, Node: Public-Key Subsystem Architecture, Next: Symmetric Encryption Subsystem Architecture, Up: Architecture
-
-13.1 Public-Key Architecture
-============================
-
-Libgcrypt implements two interfaces for public key cryptography: The
-standard interface is PK interface using functions in the `gcry_pk_'
-name space. The AC interface in an alternative one which is now
-deprecated and will not be further described. The AC interface is also
-disabled in FIPS mode.
-
- Because public key cryptography is almost always used to process
-small amounts of data (hash values or session keys), the interface is
-not implemented using the open-use-close paradigm, but with single
-self-contained functions. Due to the wide variety of parameters
-required by different algorithms S-expressions, as flexible way to
-convey these parameters, are used. There is a set of helper functions
-to work with these S-expressions.
-
- Aside of functions to register new algorithms, map algorithms names
-to algorithms identifiers and to lookup properties of a key, the
-following main functions are available:
-
-`gcry_pk_encrypt'
- Encrypt data using a public key.
-
-`gcry_pk_decrypt'
- Decrypt data using a private key.
-
-`gcry_pk_sign'
- Sign data using a private key.
-
-`gcry_pk_verify'
- Verify that a signature matches the data.
-
-`gcry_pk_testkey'
- Perform a consistency over a public or private key.
-
-`gcry_pk_genkey'
- Create a new public/private key pair.
-
-
- With the help of the module registration system all these functions
-lookup the module implementing the algorithm and pass the actual work
-to that module. The parsing of the S-expression input and the
-construction of S-expression for the return values is done by the high
-level code (`cipher/pubkey.c'). Thus the internal interface between
-the algorithm modules and the high level functions passes data in a
-custom format. The interface to the modules is published
-(`gcrypt-modules.h') so that it can used to register external
-implementations of algorithms with Libgcrypt. However, for some
-algorithms this module interface is to limited and thus for the
-internal modules an extra interface is sometimes used to convey more
-information.
-
- By default Libgcrypt uses a blinding technique for RSA decryption to
-mitigate real world timing attacks over a network: Instead of using the
-RSA decryption directly, a blinded value y = x r^e \bmod n is decrypted
-and the unblinded value x' = y' r^-1 \bmod n returned. The blinding
-value r is a random value with the size of the modulus n and generated
-with `GCRY_WEAK_RANDOM' random level.
-
- The algorithm used for RSA and DSA key generation depends on whether
-Libgcrypt is operated in standard or in FIPS mode. In standard mode an
-algorithm based on the Lim-Lee prime number generator is used. In FIPS
-mode RSA keys are generated as specified in ANSI X9.31 (1998) and DSA
-keys as specified in FIPS 186-2.
-
-
-File: gcrypt.info, Node: Symmetric Encryption Subsystem Architecture, Next: Hashing and MACing Subsystem Architecture, Prev: Public-Key Subsystem Architecture, Up: Architecture
-
-13.2 Symmetric Encryption Subsystem Architecture
-================================================
-
-The interface to work with symmetric encryption algorithms is made up
-of functions from the `gcry_cipher_' name space. The implementation
-follows the open-use-close paradigm and uses registered algorithm
-modules for the actual work. Unless a module implements optimized
-cipher mode implementations, the high level code (`cipher/cipher.c')
-implements the modes and calls the core algorithm functions to process
-each block.
-
- The most important functions are:
-
-`gcry_cipher_open'
- Create a new instance to encrypt or decrypt using a specified
- algorithm and mode.
-
-`gcry_cipher_close'
- Release an instance.
-
-`gcry_cipher_setkey'
- Set a key to be used for encryption or decryption.
-
-`gcry_cipher_setiv'
- Set an initialization vector to be used for encryption or
- decryption.
-
-`gcry_cipher_encrypt'
-`gcry_cipher_decrypt'
- Encrypt or decrypt data. These functions may be called with
- arbitrary amounts of data and as often as needed to encrypt or
- decrypt all data.
-
-
- There are also functions to query properties of algorithms or
-context, like block length, key length, map names or to enable features
-like padding methods.
-
-
-File: gcrypt.info, Node: Hashing and MACing Subsystem Architecture, Next: Multi-Precision-Integer Subsystem Architecture, Prev: Symmetric Encryption Subsystem Architecture, Up: Architecture
-
-13.3 Hashing and MACing Subsystem Architecture
-==============================================
-
-The interface to work with message digests and CRC algorithms is made
-up of functions from the `gcry_md_' name space. The implementation
-follows the open-use-close paradigm and uses registered algorithm
-modules for the actual work. Although CRC algorithms are not
-considered cryptographic hash algorithms, they share enough properties
-so that it makes sense to handle them in the same way. It is possible
-to use several algorithms at once with one context and thus compute
-them all on the same data.
-
- The most important functions are:
-
-`gcry_md_open'
- Create a new message digest instance and optionally enable one
- algorithm. A flag may be used to turn the message digest algorithm
- into a HMAC algorithm.
-
-`gcry_md_enable'
- Enable an additional algorithm for the instance.
-
-`gcry_md_setkey'
- Set the key for the MAC.
-
-`gcry_md_write'
- Pass more data for computing the message digest to an instance.
-
-`gcry_md_putc'
- Buffered version of `gcry_md_write' implemented as a macro.
-
-`gcry_md_read'
- Finalize the computation of the message digest or HMAC and return
- the result.
-
-`gcry_md_close'
- Release an instance
-
-`gcry_md_hash_buffer'
- Convenience function to directly compute a message digest over a
- memory buffer without the need to create an instance first.
-
-
- There are also functions to query properties of algorithms or the
-instance, like enabled algorithms, digest length, map algorithm names.
-it is also possible to reset an instance or to copy the current state
-of an instance at any time. Debug functions to write the hashed data
-to files are available as well.
-
-
-File: gcrypt.info, Node: Multi-Precision-Integer Subsystem Architecture, Next: Prime-Number-Generator Subsystem Architecture, Prev: Hashing and MACing Subsystem Architecture, Up: Architecture
-
-13.4 Multi-Precision-Integer Subsystem Architecture
-===================================================
-
-The implementation of Libgcrypt's big integer computation code is based
-on an old release of GNU Multi-Precision Library (GMP). The decision
-not to use the GMP library directly was due to stalled development at
-that time and due to security requirements which could not be provided
-by the code in GMP. As GMP does, Libgcrypt provides high performance
-assembler implementations of low level code for several CPUS to gain
-much better performance than with a generic C implementation.
-
-Major features of Libgcrypt's multi-precision-integer code compared to
-GMP are:
-
- * Avoidance of stack based allocations to allow protection against
- swapping out of sensitive data and for easy zeroing of sensitive
- intermediate results.
-
- * Optional use of secure memory and tracking of its use so that
- results are also put into secure memory.
-
- * MPIs are identified by a handle (implemented as a pointer) to give
- better control over allocations and to augment them with extra
- properties like opaque data.
-
- * Removal of unnecessary code to reduce complexity.
-
- * Functions specialized for public key cryptography.
-
-
-
-File: gcrypt.info, Node: Prime-Number-Generator Subsystem Architecture, Next: Random-Number Subsystem Architecture, Prev: Multi-Precision-Integer Subsystem Architecture, Up: Architecture
-
-13.5 Prime-Number-Generator Subsystem Architecture
-==================================================
-
-Libgcrypt provides an interface to its prime number generator. These
-functions make use of the internal prime number generator which is
-required for the generation for public key key pairs. The plain prime
-checking function is exported as well.
-
- The generation of random prime numbers is based on the Lim and Lee
-algorithm to create practically save primes.(1) This algorithm creates
-a pool of smaller primes, select a few of them to create candidate
-primes of the form 2 * p_0 * p_1 * ... * p_n + 1, tests the candidate
-for primality and permutates the pool until a prime has been found. It
-is possible to clamp one of the small primes to a certain size to help
-DSA style algorithms. Because most of the small primes in the pool are
-not used for the resulting prime number, they are saved for later use
-(see `save_pool_prime' and `get_pool_prime' in `cipher/primegen.c').
-The prime generator optionally supports the finding of an appropriate
-generator.
-
-The primality test works in three steps:
-
- 1. The standard sieve algorithm using the primes up to 4999 is used
- as a quick first check.
-
- 2. A Fermat test filters out almost all non-primes.
-
- 3. A 5 round Rabin-Miller test is finally used. The first round uses
- a witness of 2, whereas the next rounds use a random witness.
-
-
- To support the generation of RSA and DSA keys in FIPS mode according
-to X9.31 and FIPS 186-2, Libgcrypt implements two additional prime
-generation functions: `_gcry_derive_x931_prime' and
-`_gcry_generate_fips186_2_prime'. These functions are internal and not
-available through the public API.
-
- ---------- Footnotes ----------
-
- (1) Chae Hoon Lim and Pil Joong Lee. A key recovery attack on
-discrete log-based shemes using a prime order subgroup. In Burton S.
-Kaliski Jr., editor, Advances in Cryptology: Crypto '97, pages
-249­-263, Berlin / Heidelberg / New York, 1997. Springer-Verlag.
-Described on page 260.
-
-
-File: gcrypt.info, Node: Random-Number Subsystem Architecture, Prev: Prime-Number-Generator Subsystem Architecture, Up: Architecture
-
-13.6 Random-Number Subsystem Architecture
-=========================================
-
-Libgcrypt provides 3 levels or random quality: The level
-`GCRY_VERY_STRONG_RANDOM' usually used for key generation, the level
-`GCRY_STRONG_RANDOM' for all other strong random requirements and the
-function `gcry_create_nonce' which is used for weaker usages like
-nonces. There is also a level `GCRY_WEAK_RANDOM' which in general maps
-to `GCRY_STRONG_RANDOM' except when used with the function
-`gcry_mpi_randomize', where it randomizes an multi-precision-integer
-using the `gcry_create_nonce' function.
-
-There are two distinct random generators available:
-
- * The Continuously Seeded Pseudo Random Number Generator (CSPRNG),
- which is based on the classic GnuPG derived big pool
- implementation. Implemented in `random/random-csprng.c' and used
- by default.
-
- * A FIPS approved ANSI X9.31 PRNG using AES with a 128 bit key.
- Implemented in `random/random-fips.c' and used if Libgcrypt is in
- FIPS mode.
-
-Both generators make use of so-called entropy gathering modules:
-
-rndlinux
- Uses the operating system provided `/dev/random' and
- `/dev/urandom' devices.
-
-rndunix
- Runs several operating system commands to collect entropy from
- sources like virtual machine and process statistics. It is a kind
- of poor-man's `/dev/random' implementation. It is not available in
- FIPS mode.
-
-rndegd
- Uses the operating system provided Entropy Gathering Daemon (EGD).
- The EGD basically uses the same algorithms as rndunix does.
- However as a system daemon it keeps on running and thus can serve
- several processes requiring entropy input and does not waste
- collected entropy if the application does not need all the
- collected entropy. It is not available in FIPS mode.
-
-rndw32
- Targeted for the Microsoft Windows OS. It uses certain properties
- of that system and is the only gathering module available for that
- OS.
-
-rndhw
- Extra module to collect additional entropy by utilizing a hardware
- random number generator. As of now the only supported hardware
- RNG is the Padlock engine of VIA (Centaur) CPUs. It is not
- available in FIPS mode.
-
-
-* Menu:
-
-* CSPRNG Description:: Description of the CSPRNG.
-* FIPS PRNG Description:: Description of the FIPS X9.31 PRNG.
-
-
-File: gcrypt.info, Node: CSPRNG Description, Next: FIPS PRNG Description, Up: Random-Number Subsystem Architecture
-
-13.6.1 Description of the CSPRNG
---------------------------------
-
-This random number generator is loosely modelled after the one
-described in Peter Gutmann's paper: "Software Generation of Practically
-Strong Random Numbers".(1)
-
- A pool of 600 bytes is used and mixed using the core RIPE-MD160 hash
-transform function. Several extra features are used to make the robust
-against a wide variety of attacks and to protect against failures of
-subsystems. The state of the generator may be saved to a file and
-initially seed form a file.
-
- Depending on how Libgcrypt was build the generator is able to select
-the best working entropy gathering module. It makes use of the slow
-and fast collection methods and requires the pool to initially seeded
-form the slow gatherer or a seed file. An entropy estimation is used
-to mix in enough data from the gather modules before returning the
-actual random output. Process fork detection and protection is
-implemented.
-
- The implementation of the nonce generator (for `gcry_create_nonce')
-is a straightforward repeated hash design: A 28 byte buffer is
-initially seeded with the PID and the time in seconds in the first 20
-bytes and with 8 bytes of random taken from the `GCRY_STRONG_RANDOM'
-generator. Random numbers are then created by hashing all the 28 bytes
-with SHA-1 and saving that again in the first 20 bytes. The hash is
-also returned as result.
-
- ---------- Footnotes ----------
-
- (1) Also described in chapter 6 of his book "Cryptographic Security
-Architecture", New York, 2004, ISBN 0-387-95387-6.
-
-
-File: gcrypt.info, Node: FIPS PRNG Description, Prev: CSPRNG Description, Up: Random-Number Subsystem Architecture
-
-13.6.2 Description of the FIPS X9.31 PRNG
------------------------------------------
-
-The core of this deterministic random number generator is implemented
-according to the document "NIST-Recommended Random Number Generator
-Based on ANSI X9.31 Appendix A.2.4 Using the 3-Key Triple DES and AES
-Algorithms", dated 2005-01-31. This implementation uses the AES
-variant.
-
- The generator is based on contexts to utilize the same core functions
-for all random levels as required by the high-level interface. All
-random generators return their data in 128 bit blocks. If the caller
-requests less bits, the extra bits are not used. The key for each
-generator is only set once at the first time a generator context is
-used. The seed value is set along with the key and again after 1000
-output blocks.
-
- On Unix like systems the `GCRY_VERY_STRONG_RANDOM' and
-`GCRY_STRONG_RANDOM' generators are keyed and seeded using the rndlinux
-module with the `/dev/radnom' device. Thus these generators may block
-until the OS kernel has collected enough entropy. When used with
-Microsoft Windows the rndw32 module is used instead.
-
- The generator used for `gcry_create_nonce' is keyed and seeded from
-the `GCRY_STRONG_RANDOM' generator. Thus is may also block if the
-`GCRY_STRONG_RANDOM' generator has not yet been used before and thus
-gets initialized on the first use by `gcry_create_nonce'. This special
-treatment is justified by the weaker requirements for a nonce generator
-and to save precious kernel entropy for use by the "real" random
-generators.
-
- A self-test facility uses a separate context to check the
-functionality of the core X9.31 functions using a known answers test.
-During runtime each output block is compared to the previous one to
-detect a stucked generator.
-
- The DT value for the generator is made up of the current time down to
-microseconds (if available) and a free running 64 bit counter. When
-used with the test context the DT value is taken from the context and
-incremented on each use.
-
-
-File: gcrypt.info, Node: Self-Tests, Next: FIPS Mode, Prev: Architecture, Up: Top
-
-Appendix A Description of the Self-Tests
-****************************************
-
-In addition to the build time regression test suite, Libgcrypt
-implements self-tests to be performed at runtime. Which self-tests are
-actually used depends on the mode Libgcrypt is used in. In standard
-mode a limited set of self-tests is run at the time an algorithm is
-first used. Note that not all algorithms feature a self-test in
-standard mode. The `GCRYCTL_SELFTEST' control command may be used to
-run all implemented self-tests at any time; this will even run more
-tests than those run in FIPS mode.
-
- If any of the self-tests fails, the library immediately returns an
-error code to the caller. If Libgcrypt is in FIPS mode the self-tests
-will be performed within the "Self-Test" state and any failure puts the
-library into the "Error" state.
-
-A.1 Power-Up Tests
-==================
-
-Power-up tests are only performed if Libgcrypt is in FIPS mode.
-
-A.1.1 Symmetric Cipher Algorithm Power-Up Tests
------------------------------------------------
-
-The following symmetric encryption algorithm tests are run during
-power-up:
-
-3DES
- To test the 3DES 3-key EDE encryption in ECB mode these tests are
- run:
- 1. A known answer test is run on a 64 bit test vector processed
- by 64 rounds of Single-DES block encryption and decryption
- using a key changed with each round.
-
- 2. A known answer test is run on a 64 bit test vector processed
- by 16 rounds of 2-key and 3-key Triple-DES block encryption
- and decryptions using a key changed with each round.
-
- 3. 10 known answer tests using 3-key Triple-DES EDE encryption,
- comparing the ciphertext to the known value, then running a
- decryption and comparing it to the initial plaintext.
- (`cipher/des.c:selftest')
-
-AES-128
- A known answer tests is run using one test vector and one test key
- with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_128')
-
-AES-192
- A known answer tests is run using one test vector and one test key
- with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_192')
-
-AES-256
- A known answer tests is run using one test vector and one test key
- with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_256')
-
-A.1.2 Hash Algorithm Power-Up Tests
------------------------------------
-
-The following hash algorithm tests are run during power-up:
-
-SHA-1
- A known answer test using the string `"abc"' is run.
- (`cipher/sha1.c:selftests_sha1')
-
-SHA-224
- A known answer test using the string `"abc"' is run.
- (`cipher/sha256.c:selftests_sha224')
-
-SHA-256
- A known answer test using the string `"abc"' is run.
- (`cipher/sha256.c:selftests_sha256')
-
-SHA-384
- A known answer test using the string `"abc"' is run.
- (`cipher/sha512.c:selftests_sha384')
-
-SHA-512
- A known answer test using the string `"abc"' is run.
- (`cipher/sha512.c:selftests_sha512')
-
-A.1.3 MAC Algorithm Power-Up Tests
-----------------------------------
-
-The following MAC algorithm tests are run during power-up:
-
-HMAC SHA-1
- A known answer test using 9 byte of data and a 64 byte key is run.
- (`cipher/hmac-tests.c:selftests_sha1')
-
-HMAC SHA-224
- A known answer test using 28 byte of data and a 4 byte key is run.
- (`cipher/hmac-tests.c:selftests_sha224')
-
-HMAC SHA-256
- A known answer test using 28 byte of data and a 4 byte key is run.
- (`cipher/hmac-tests.c:selftests_sha256')
-
-HMAC SHA-384
- A known answer test using 28 byte of data and a 4 byte key is run.
- (`cipher/hmac-tests.c:selftests_sha384')
-
-HMAC SHA-512
- A known answer test using 28 byte of data and a 4 byte key is run.
- (`cipher/hmac-tests.c:selftests_sha512')
-
-A.1.4 Random Number Power-Up Test
----------------------------------
-
-The DRNG is tested during power-up this way:
-
- 1. Requesting one block of random using the public interface to check
- general working and the duplicated block detection.
-
- 2. 3 know answer tests using pre-defined keys, seed and initial DT
- values. For each test 3 blocks of 16 bytes are requested and
- compared to the expected result. The DT value is incremented for
- each block.
-
-A.1.5 Public Key Algorithm Power-Up Tests
------------------------------------------
-
-The public key algorithms are tested during power-up:
-
-RSA
- A pre-defined 1024 bit RSA key is used and these tests are run in
- turn:
- 1. Conversion of S-expression to internal format.
- (`cipher/rsa.c:selftests_rsa')
-
- 2. Private key consistency check. (`cipher/rsa.c:selftests_rsa')
-
- 3. A pre-defined 20 byte value is signed with PKCS#1 padding for
- SHA-1. The result is verified using the public key against
- the original data and against modified data.
- (`cipher/rsa.c:selftest_sign_1024')
-
- 4. A 1000 bit random value is encrypted and checked that it does
- not match the orginal random value. The encrtypted result is
- then decrypted and checked that it macthes the original
- random value. (`cipher/rsa.c:selftest_encr_1024')
-
-DSA
- A pre-defined 1024 bit DSA key is used and these tests are run in
- turn:
- 1. Conversion of S-expression to internal format.
- (`cipher/dsa.c:selftests_dsa')
-
- 2. Private key consistency check. (`cipher/dsa.c:selftests_dsa')
-
- 3. A pre-defined 20 byte value is signed with PKCS#1 padding for
- SHA-1. The result is verified using the public key against
- the original data and against modified data.
- (`cipher/dsa.c:selftest_sign_1024')
-
-A.1.6 Integrity Power-Up Tests
-------------------------------
-
-The integrity of the Libgcrypt is tested during power-up but only if
-checking has been enabled at build time. The check works by computing
-a HMAC SHA-256 checksum over the file used to load Libgcrypt into
-memory. That checksum is compared against a checksum stored in a file
-of the same name but with a single dot as a prefix and a suffix of
-`.hmac'.
-
-A.1.7 Critical Functions Power-Up Tests
----------------------------------------
-
-The 3DES weak key detection is tested during power-up by calling the
-detection function with keys taken from a table listening all weak
-keys. The table itself is protected using a SHA-1 hash.
-(`cipher/des.c:selftest')
-
-A.2 Conditional Tests
-=====================
-
-The conditional tests are performed if a certain contidion is met.
-This may occur at any time; the library does not necessary enter the
-"Self-Test" state to run these tests but will transit to the "Error"
-state if a test failed.
-
-A.2.1 Key-Pair Generation Tests
--------------------------------
-
-After an asymmetric key-pair has been generated, Libgcrypt runs a
-pair-wise consistency tests on the generated key. On failure the
-generated key is not used, an error code is returned and, if in FIPS
-mode, the library is put into the "Error" state.
-
-RSA
- The test uses a random number 64 bits less the size of the modulus
- as plaintext and runs an encryption and decryption operation in
- turn. The encrypted value is checked to not match the plaintext
- and the result of the decryption is checked to match the plaintext.
-
- A new random number of the same size is generated, signed and
- verified to test the correctness of the signing operation. As a
- second signing test, the signature is modified by incrementing its
- value and then verified with the expected result that the
- verification fails. (`cipher/rsa.c:test_keys')
-
-DSA
- The test uses a random number of the size of the Q parameter to
- create a signature and then checks that the signature verifies.
- As a second signing test, the data is modified by incrementing its
- value and then verified against the signature with the expected
- result that the verification fails. (`cipher/dsa.c:test_keys')
-
-A.2.2 Software Load Tests
--------------------------
-
-Loading of extra modules into libgcrypt is disabled in FIPS mode and
-thus no tests are implemented. (`cipher/cipher.c:_gcry_cipher_register',
-`cipher/md.c:_gcry_md_register', `cipher/pubkey.c:_gcry_pk_register')
-
-A.2.3 Manual Key Entry Tests
-----------------------------
-
-A manual key entry feature is not implemented in Libgcrypt.
-
-A.2.4 Continuous RNG Tests
---------------------------
-
-The continuous random number test is only used in FIPS mode. The RNG
-generates blocks of 128 bit size; the first block generated per context
-is saved in the context and another block is generated to be returned
-to the caller. Each block is compared against the saved block and then
-stored in the context. If a duplicated block is detected an error is
-signaled and the libray is put into the "Fatal-Error" state.
-(`random/random-fips.c:x931_aes_driver')
-
-A.3 Application Requested Tests
-===============================
-
-The application may requests tests at any time by means of the
-`GCRYCTL_SELFTEST' control command. Note that using these tests is not
-FIPS conform: Although Libgcrypt rejects all application requests for
-services while running self-tests, it does not ensure that no other
-operations of Libgcrypt are still being executed. Thus, in FIPS mode
-an application requesting self-tests needs to power-cycle Libgcrypt
-instead.
-
- When self-tests are requested, Libgcrypt runs all the tests it does
-during power-up as well as a few extra checks as described below.
-
-A.3.1 Symmetric Cipher Algorithm Tests
---------------------------------------
-
-The following symmetric encryption algorithm tests are run in addition
-to the power-up tests:
-
-AES-128
- A known answer tests with test vectors taken from NIST SP800-38a
- and using the high level functions is run for block modes CFB and
- OFB.
-
-
-A.3.2 Hash Algorithm Tests
---------------------------
-
-The following hash algorithm tests are run in addition to the power-up
-tests:
-
-SHA-1
-SHA-224
-SHA-256
- 1. A known answer test using a 56 byte string is run.
-
- 2. A known answer test using a string of one million letters "a"
- is run.
- (`cipher/sha1.c:selftests_sha1',
- `cipher/sha256.c:selftests_sha224',
- `cipher/sha256.c:selftests_sha256')
-
-SHA-384
-
-SHA-512
- 1. A known answer test using a 112 byte string is run.
-
- 2. A known answer test using a string of one million letters "a"
- is run.
- (`cipher/sha512.c:selftests_sha384',
- `cipher/sha512.c:selftests_sha512')
-
-A.3.3 MAC Algorithm Tests
--------------------------
-
-The following MAC algorithm tests are run in addition to the power-up
-tests:
-
-HMAC SHA-1
- 1. A known answer test using 9 byte of data and a 20 byte key is
- run.
-
- 2. A known answer test using 9 byte of data and a 100 byte key
- is run.
-
- 3. A known answer test using 9 byte of data and a 49 byte key is
- run.
- (`cipher/hmac-tests.c:selftests_sha1')
-
-HMAC SHA-224
-HMAC SHA-256
-HMAC SHA-384
-HMAC SHA-512
- 1. A known answer test using 9 byte of data and a 20 byte key is
- run.
-
- 2. A known answer test using 50 byte of data and a 20 byte key
- is run.
-
- 3. A known answer test using 50 byte of data and a 26 byte key
- is run.
-
- 4. A known answer test using 54 byte of data and a 131 byte key
- is run.
-
- 5. A known answer test using 152 byte of data and a 131 byte key
- is run.
- (`cipher/hmac-tests.c:selftests_sha224',
- `cipher/hmac-tests.c:selftests_sha256',
- `cipher/hmac-tests.c:selftests_sha384',
- `cipher/hmac-tests.c:selftests_sha512')
-
-
-File: gcrypt.info, Node: FIPS Mode, Next: Library Copying, Prev: Self-Tests, Up: Top
-
-Appendix B Description of the FIPS Mode
-***************************************
-
-This appendix gives detailed information pertaining to the FIPS mode.
-In particular, the changes to the standard mode and the finite state
-machine are described. The self-tests required in this mode are
-described in the appendix on self-tests.
-
-B.1 Restrictions in FIPS Mode
-=============================
-
-If Libgcrypt is used in FIPS mode these restrictions are effective:
-
- * The cryptographic algorithms are restricted to this list:
-
- GCRY_CIPHER_3DES
- 3 key EDE Triple-DES symmetric encryption.
-
- GCRY_CIPHER_AES128
- AES 128 bit symmetric encryption.
-
- GCRY_CIPHER_AES192
- AES 192 bit symmetric encryption.
-
- GCRY_CIPHER_AES256
- AES 256 bit symmetric encryption.
-
- GCRY_MD_SHA1
- SHA-1 message digest.
-
- GCRY_MD_SHA224
- SHA-224 message digest.
-
- GCRY_MD_SHA256
- SHA-256 message digest.
-
- GCRY_MD_SHA384
- SHA-384 message digest.
-
- GCRY_MD_SHA512
- SHA-512 message digest.
-
- GCRY_MD_SHA1,GCRY_MD_FLAG_HMAC
- HMAC using a SHA-1 message digest.
-
- GCRY_MD_SHA224,GCRY_MD_FLAG_HMAC
- HMAC using a SHA-224 message digest.
-
- GCRY_MD_SHA256,GCRY_MD_FLAG_HMAC
- HMAC using a SHA-256 message digest.
-
- GCRY_MD_SHA384,GCRY_MD_FLAG_HMAC
- HMAC using a SHA-384 message digest.
-
- GCRY_MD_SHA512,GCRY_MD_FLAG_HMAC
- HMAC using a SHA-512 message digest.
-
- GCRY_PK_RSA
- RSA encryption and signing.
-
- GCRY_PK_DSA
- DSA signing.
-
- Note that the CRC algorithms are not considered cryptographic
- algorithms and thus are in addition available.
-
- * RSA key generation refuses to create a key with a keysize of less
- than 1024 bits.
-
- * DSA key generation refuses to create a key with a keysize other
- than 1024 bits.
-
- * The `transient-key' flag for RSA and DSA key generation is ignored.
-
- * Support for the VIA Padlock engine is disabled.
-
- * FIPS mode may only be used on systems with a /dev/random device.
- Switching into FIPS mode on other systems will fail at runtime.
-
- * Saving and loading a random seed file is ignored.
-
- * An X9.31 style random number generator is used in place of the
- large-pool-CSPRNG generator.
-
- * The command `GCRYCTL_ENABLE_QUICK_RANDOM' is ignored.
-
- * The Alternative Public Key Interface (`gcry_ac_xxx') is not
- supported and all API calls return an error.
-
- * Registration of external modules is not supported.
-
- * Message digest debugging is disabled.
-
- * All debug output related to cryptographic data is suppressed.
-
- * On-the-fly self-tests are not performed, instead self-tests are run
- before entering operational state.
-
- * The function `gcry_set_allocation_handler' may not be used. If it
- is used Libgcrypt disables FIPS mode unless Enforced FIPS mode is
- enabled, in which case Libgcrypt will enter the error state.
-
- * The digest algorithm MD5 may not be used. If it is used Libgcrypt
- disables FIPS mode unless Enforced FIPS mode is enabled, in which
- case Libgcrypt will enter the error state.
-
- * In Enforced FIPS mode the command `GCRYCTL_DISABLE_SECMEM' is
- ignored. In standard FIPS mode it disables FIPS mode.
-
- * A handler set by `gcry_set_outofcore_handler' is ignored.
-
- * A handler set by `gcry_set_fatalerror_handler' is ignored.
-
-
- Note that when we speak about disabling FIPS mode, it merely means
-that the function `gcry_fips_mode_active' returns false; it does not
-mean that any non FIPS algorithms are allowed.
-
-B.2 FIPS Finite State Machine
-=============================
-
-The FIPS mode of libgcrypt implements a finite state machine (FSM) using
-8 states (*note tbl:fips-states::) and checks at runtime that only valid
-transitions (*note tbl:fips-state-transitions::) may happen.
-
-
-Figure B.1: FIPS mode state diagram
-
-States used by the FIPS FSM:
-Power-Off
- Libgcrypt is not runtime linked to another application. This
- usually means that the library is not loaded into main memory.
- This state is documentation only.
-
-Power-On
- Libgcrypt is loaded into memory and API calls may be made.
- Compiler introducted constructor functions may be run. Note that
- Libgcrypt does not implement any arbitrary constructor functions
- to be called by the operating system
-
-Init
- The Libgcrypt initialization functions are performed and the
- library has not yet run any self-test.
-
-Self-Test
- Libgcrypt is performing self-tests.
-
-Operational
- Libgcrypt is in the operational state and all interfaces may be
- used.
-
-Error
- Libgrypt is in the error state. When calling any FIPS relevant
- interfaces they either return an error (`GPG_ERR_NOT_OPERATIONAL')
- or put Libgcrypt into the Fatal-Error state and won't return.
-
-Fatal-Error
- Libgcrypt is in a non-recoverable error state and will
- automatically transit into the Shutdown state.
-
-Shutdown
- Libgcrypt is about to be terminated and removed from the memory.
- The application may at this point still runing cleanup handlers.
-
-
-Table B.1: FIPS mode states
-
-The valid state transitions (*note Figure B.1: fig:fips-fsm.) are:
-`1'
- Power-Off to Power-On is implicitly done by the OS loading
- Libgcrypt as a shared library and having it linked to an
- application.
-
-`2'
- Power-On to Init is triggered by the application calling the
- Libgcrypt intialization function `gcry_check_version'.
-
-`3'
- Init to Self-Test is either triggred by a dedicated API call or
- implicit by invoking a libgrypt service conrolled by the FSM.
-
-`4'
- Self-Test to Operational is triggered after all self-tests passed
- successfully.
-
-`5'
- Operational to Shutdown is an artifical state without any direct
- action in Libgcrypt. When reaching the Shutdown state the library
- is deinitialized and can't return to any other state again.
-
-`6'
- Shutdown to Power-off is the process of removing Libgcrypt from the
- computer's memory. For obvious reasons the Power-Off state can't
- be represented within Libgcrypt and thus this transition is for
- documentation only.
-
-`7'
- Operational to Error is triggered if Libgcrypt detected an
- application error which can't be returned to the caller but still
- allows Libgcrypt to properly run. In the Error state all FIPS
- relevant interfaces return an error code.
-
-`8'
- Error to Shutdown is similar to the Operational to Shutdown
- transition (5).
-
-`9'
- Error to Fatal-Error is triggred if Libgrypt detects an fatal error
- while already being in Error state.
-
-`10'
- Fatal-Error to Shutdown is automatically entered by Libgcrypt
- after having reported the error.
-
-`11'
- Power-On to Shutdown is an artifical state to document that
- Libgcrypt has not ye been initializaed but the process is about to
- terminate.
-
-`12'
- Power-On to Fatal-Error will be triggerd if certain Libgcrypt
- functions are used without having reached the Init state.
-
-`13'
- Self-Test to Fatal-Error is triggred by severe errors in Libgcrypt
- while running self-tests.
-
-`14'
- Self-Test to Error is triggred by a failed self-test.
-
-`15'
- Operational to Fatal-Error is triggered if Libcrypt encountered a
- non-recoverable error.
-
-`16'
- Operational to Self-Test is triggred if the application requested
- to run the self-tests again.
-
-`17'
- Error to Self-Test is triggered if the application has requested
- to run self-tests to get to get back into operational state after
- an error.
-
-`18'
- Init to Error is triggered by errors in the initialization code.
-
-`19'
- Init to Fatal-Error is triggered by non-recoverable errors in the
- initialization code.
-
-`20'
- Error to Error is triggered by errors while already in the Error
- state.
-
-
-Table B.2: FIPS mode state transitions
-
-B.3 FIPS Miscellaneous Information
-==================================
-
-Libgcrypt does not do any key management on itself; the application
-needs to care about it. Keys which are passed to Libgcrypt should be
-allocated in secure memory as available with the functions
-`gcry_malloc_secure' and `gcry_calloc_secure'. By calling `gcry_free'
-on this memory, the memory and thus the keys are overwritten with zero
-bytes before releasing the memory.
-
- For use with the random number generator, Libgcrypt generates 3
-internal keys which are stored in the encryption contexts used by the
-RNG. These keys are stored in secure memory for the lifetime of the
-process. Application are required to use `GCRYCTL_TERM_SECMEM' before
-process termination. This will zero out the entire secure memory and
-thus also the encryption contexts with these keys.
-
-
-File: gcrypt.info, Node: Library Copying, Next: Copying, Prev: FIPS Mode, Up: Top
-
-GNU Lesser General Public License
-*********************************
-
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- [This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence the
- version number 2.1.]
-
-Preamble
-========
-
-The licenses for most software are designed to take away your freedom
-to share and change it. By contrast, the GNU General Public Licenses
-are intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software--typically libraries--of the Free
-Software Foundation and other authors who decide to use it. You can use
-it too, but we suggest you first think carefully about whether this
-license or the ordinary General Public License is the better strategy to
-use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of it
-in new free programs; and that you are informed that you can do these
-things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know that
-what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and is
-quite different from the ordinary General Public License. We use this
-license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does _Less_ to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it
-becomes a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of free
-software. For example, permission to use the GNU C Library in non-free
-programs enables many more people to use the whole GNU operating
-system, as well as its variant, the GNU/Linux operating system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run that
-program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 0. This License Agreement applies to any software library or other
- program which contains a notice placed by the copyright holder or
- other authorized party saying it may be distributed under the
- terms of this Lesser General Public License (also called "this
- License"). Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
- prepared so as to be conveniently linked with application programs
- (which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
- which has been distributed under these terms. A "work based on the
- Library" means either the Library or any derivative work under
- copyright law: that is to say, a work containing the Library or a
- portion of it, either verbatim or with modifications and/or
- translated straightforwardly into another language. (Hereinafter,
- translation is included without limitation in the term
- "modification".)
-
- "Source code" for a work means the preferred form of the work for
- making modifications to it. For a library, complete source code
- means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to
- control compilation and installation of the library.
-
- Activities other than copying, distribution and modification are
- not covered by this License; they are outside its scope. The act
- of running a program using the Library is not restricted, and
- output from such a program is covered only if its contents
- constitute a work based on the Library (independent of the use of
- the Library in a tool for writing it). Whether that is true
- depends on what the Library does and what the program that uses
- the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
- complete source code as you receive it, in any medium, provided
- that you conspicuously and appropriately publish on each copy an
- appropriate copyright notice and disclaimer of warranty; keep
- intact all the notices that refer to this License and to the
- absence of any warranty; and distribute a copy of this License
- along with the Library.
-
- You may charge a fee for the physical act of transferring a copy,
- and you may at your option offer warranty protection in exchange
- for a fee.
-
- 2. You may modify your copy or copies of the Library or any portion
- of it, thus forming a work based on the Library, and copy and
- distribute such modifications or work under the terms of Section 1
- above, provided that you also meet all of these conditions:
-
- a. The modified work must itself be a software library.
-
- b. You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c. You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d. If a facility in the modified Library refers to a function or
- a table of data to be supplied by an application program that
- uses the facility, other than as an argument passed when the
- facility is invoked, then you must make a good faith effort
- to ensure that, in the event an application does not supply
- such function or table, the facility still operates, and
- performs whatever part of its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots
- has a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function
- must be optional: if the application does not supply it, the
- square root function must still compute square roots.)
-
- These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the
- Library, and can be reasonably considered independent and separate
- works in themselves, then this License, and its terms, do not
- apply to those sections when you distribute them as separate
- works. But when you distribute the same sections as part of a
- whole which is a work based on the Library, the distribution of
- the whole must be on the terms of this License, whose permissions
- for other licensees extend to the entire whole, and thus to each
- and every part regardless of who wrote it.
-
- Thus, it is not the intent of this section to claim rights or
- contest your rights to work written entirely by you; rather, the
- intent is to exercise the right to control the distribution of
- derivative or collective works based on the Library.
-
- In addition, mere aggregation of another work not based on the
- Library with the Library (or with a work based on the Library) on
- a volume of a storage or distribution medium does not bring the
- other work under the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
- License instead of this License to a given copy of the Library.
- To do this, you must alter all the notices that refer to this
- License, so that they refer to the ordinary GNU General Public
- License, version 2, instead of to this License. (If a newer
- version than version 2 of the ordinary GNU General Public License
- has appeared, then you can specify that version instead if you
- wish.) Do not make any other change in these notices.
-
- Once this change is made in a given copy, it is irreversible for
- that copy, so the ordinary GNU General Public License applies to
- all subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
- the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
- derivative of it, under Section 2) in object code or executable
- form under the terms of Sections 1 and 2 above provided that you
- accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software
- interchange.
-
- If distribution of object code is made by offering access to copy
- from a designated place, then offering equivalent access to copy
- the source code from the same place satisfies the requirement to
- distribute the source code, even though third parties are not
- compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
- Library, but is designed to work with the Library by being
- compiled or linked with it, is called a "work that uses the
- Library". Such a work, in isolation, is not a derivative work of
- the Library, and therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
- creates an executable that is a derivative of the Library (because
- it contains portions of the Library), rather than a "work that
- uses the library". The executable is therefore covered by this
- License. Section 6 states terms for distribution of such
- executables.
-
- When a "work that uses the Library" uses material from a header
- file that is part of the Library, the object code for the work may
- be a derivative work of the Library even though the source code is
- not. Whether this is true is especially significant if the work
- can be linked without the Library, or if the work is itself a
- library. The threshold for this to be true is not precisely
- defined by law.
-
- If such an object file uses only numerical parameters, data
- structure layouts and accessors, and small macros and small inline
- functions (ten lines or less in length), then the use of the object
- file is unrestricted, regardless of whether it is legally a
- derivative work. (Executables containing this object code plus
- portions of the Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
- distribute the object code for the work under the terms of Section
- 6. Any executables containing that work also fall under Section 6,
- whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
- link a "work that uses the Library" with the Library to produce a
- work containing portions of the Library, and distribute that work
- under terms of your choice, provided that the terms permit
- modification of the work for the customer's own use and reverse
- engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
- Library is used in it and that the Library and its use are covered
- by this License. You must supply a copy of this License. If the
- work during execution displays copyright notices, you must include
- the copyright notice for the Library among them, as well as a
- reference directing the user to the copy of this License. Also,
- you must do one of these things:
-
- a. Accompany the work with the complete corresponding
- machine-readable source code for the Library including
- whatever changes were used in the work (which must be
- distributed under Sections 1 and 2 above); and, if the work
- is an executable linked with the Library, with the complete
- machine-readable "work that uses the Library", as object code
- and/or source code, so that the user can modify the Library
- and then relink to produce a modified executable containing
- the modified Library. (It is understood that the user who
- changes the contents of definitions files in the Library will
- not necessarily be able to recompile the application to use
- the modified definitions.)
-
- b. Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run
- time a copy of the library already present on the user's
- computer system, rather than copying library functions into
- the executable, and (2) will operate properly with a modified
- version of the library, if the user installs one, as long as
- the modified version is interface-compatible with the version
- that the work was made with.
-
- c. Accompany the work with a written offer, valid for at least
- three years, to give the same user the materials specified in
- Subsection 6a, above, for a charge no more than the cost of
- performing this distribution.
-
- d. If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the
- above specified materials from the same place.
-
- e. Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
- Library" must include any data and utility programs needed for
- reproducing the executable from it. However, as a special
- exception, the materials to be distributed need not include
- anything that is normally distributed (in either source or binary
- form) with the major components (compiler, kernel, and so on) of
- the operating system on which the executable runs, unless that
- component itself accompanies the executable.
-
- It may happen that this requirement contradicts the license
- restrictions of other proprietary libraries that do not normally
- accompany the operating system. Such a contradiction means you
- cannot use both them and the Library together in an executable
- that you distribute.
-
- 7. You may place library facilities that are a work based on the
- Library side-by-side in a single library together with other
- library facilities not covered by this License, and distribute
- such a combined library, provided that the separate distribution
- of the work based on the Library and of the other library
- facilities is otherwise permitted, and provided that you do these
- two things:
-
- a. Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b. Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same
- work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute the
- Library except as expressly provided under this License. Any
- attempt otherwise to copy, modify, sublicense, link with, or
- distribute the Library is void, and will automatically terminate
- your rights under this License. However, parties who have
- received copies, or rights, from you under this License will not
- have their licenses terminated so long as such parties remain in
- full compliance.
-
- 9. You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify
- or distribute the Library or its derivative works. These actions
- are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Library (or any work
- based on the Library), you indicate your acceptance of this
- License to do so, and all its terms and conditions for copying,
- distributing or modifying the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
- Library), the recipient automatically receives a license from the
- original licensor to copy, distribute, link with or modify the
- Library subject to these terms and conditions. You may not impose
- any further restrictions on the recipients' exercise of the rights
- granted herein. You are not responsible for enforcing compliance
- by third parties with this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent
- issues), conditions are imposed on you (whether by court order,
- agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this
- License. If you cannot distribute so as to satisfy simultaneously
- your obligations under this License and any other pertinent
- obligations, then as a consequence you may not distribute the
- Library at all. For example, if a patent license would not permit
- royalty-free redistribution of the Library by all those who
- receive copies directly or indirectly through you, then the only
- way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Library.
-
- If any portion of this section is held invalid or unenforceable
- under any particular circumstance, the balance of the section is
- intended to apply, and the section as a whole is intended to apply
- in other circumstances.
-
- It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of
- any such claims; this section has the sole purpose of protecting
- the integrity of the free software distribution system which is
- implemented by public license practices. Many people have made
- generous contributions to the wide range of software distributed
- through that system in reliance on consistent application of that
- system; it is up to the author/donor to decide if he or she is
- willing to distribute software through any other system and a
- licensee cannot impose that choice.
-
- This section is intended to make thoroughly clear what is believed
- to be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
- certain countries either by patents or by copyrighted interfaces,
- the original copyright holder who places the Library under this
- License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only
- in or among countries not thus excluded. In such case, this
- License incorporates the limitation as if written in the body of
- this License.
-
- 13. The Free Software Foundation may publish revised and/or new
- versions of the Lesser General Public License from time to time.
- Such new versions will be similar in spirit to the present version,
- but may differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
- Library specifies a version number of this License which applies
- to it and "any later version", you have the option of following
- the terms and conditions either of that version or of any later
- version published by the Free Software Foundation. If the Library
- does not specify a license version number, you may choose any
- version ever published by the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
- programs whose distribution conditions are incompatible with these,
- write to the author to ask for permission. For software which is
- copyrighted by the Free Software Foundation, write to the Free
- Software Foundation; we sometimes make exceptions for this. Our
- decision will be guided by the two goals of preserving the free
- status of all derivatives of our free software and of promoting
- the sharing and reuse of software generally.
-
- NO WARRANTY
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
- WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
- LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
- NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
- QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE
- LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
- SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
- MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
- INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
- INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
- OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
- OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-How to Apply These Terms to Your New Libraries
-==============================================
-
-If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of
-the ordinary General Public License).
-
- To apply these terms, attach the following notices to the library.
-It is safest to attach them to the start of each source file to most
-effectively convey the exclusion of warranty; and each file should have
-at least the "copyright" line and a pointer to where the full notice is
-found.
-
- ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
- Copyright (C) YEAR NAME OF AUTHOR
-
- This library is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or (at
- your option) any later version.
-
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
- USA.
-
- Also add information on how to contact you by electronic and paper
-mail.
-
- You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the library,
-if necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the library
- `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- SIGNATURE OF TY COON, 1 April 1990
- Ty Coon, President of Vice
-
- That's all there is to it!
-
-
-File: gcrypt.info, Node: Copying, Next: Figures and Tables, Prev: Library Copying, Up: Top
-
-GNU General Public License
-**************************
-
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-Preamble
-========
-
-The licenses for most software are designed to take away your freedom
-to share and change it. By contrast, the GNU General Public License is
-intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it in
-new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software,
-and (2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 1. This License applies to any program or other work which contains a
- notice placed by the copyright holder saying it may be distributed
- under the terms of this General Public License. The "Program",
- below, refers to any such program or work, and a "work based on
- the Program" means either the Program or any derivative work under
- copyright law: that is to say, a work containing the Program or a
- portion of it, either verbatim or with modifications and/or
- translated into another language. (Hereinafter, translation is
- included without limitation in the term "modification".) Each
- licensee is addressed as "you".
-
- Activities other than copying, distribution and modification are
- not covered by this License; they are outside its scope. The act
- of running the Program is not restricted, and the output from the
- Program is covered only if its contents constitute a work based on
- the Program (independent of having been made by running the
- Program). Whether that is true depends on what the Program does.
-
- 2. You may copy and distribute verbatim copies of the Program's
- source code as you receive it, in any medium, provided that you
- conspicuously and appropriately publish on each copy an appropriate
- copyright notice and disclaimer of warranty; keep intact all the
- notices that refer to this License and to the absence of any
- warranty; and give any other recipients of the Program a copy of
- this License along with the Program.
-
- You may charge a fee for the physical act of transferring a copy,
- and you may at your option offer warranty protection in exchange
- for a fee.
-
- 3. You may modify your copy or copies of the Program or any portion
- of it, thus forming a work based on the Program, and copy and
- distribute such modifications or work under the terms of Section 1
- above, provided that you also meet all of these conditions:
-
- a. You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b. You must cause any work that you distribute or publish, that
- in whole or in part contains or is derived from the Program
- or any part thereof, to be licensed as a whole at no charge
- to all third parties under the terms of this License.
-
- c. If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display
- an announcement including an appropriate copyright notice and
- a notice that there is no warranty (or else, saying that you
- provide a warranty) and that users may redistribute the
- program under these conditions, and telling the user how to
- view a copy of this License. (Exception: if the Program
- itself is interactive but does not normally print such an
- announcement, your work based on the Program is not required
- to print an announcement.)
-
- These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the
- Program, and can be reasonably considered independent and separate
- works in themselves, then this License, and its terms, do not
- apply to those sections when you distribute them as separate
- works. But when you distribute the same sections as part of a
- whole which is a work based on the Program, the distribution of
- the whole must be on the terms of this License, whose permissions
- for other licensees extend to the entire whole, and thus to each
- and every part regardless of who wrote it.
-
- Thus, it is not the intent of this section to claim rights or
- contest your rights to work written entirely by you; rather, the
- intent is to exercise the right to control the distribution of
- derivative or collective works based on the Program.
-
- In addition, mere aggregation of another work not based on the
- Program with the Program (or with a work based on the Program) on
- a volume of a storage or distribution medium does not bring the
- other work under the scope of this License.
-
- 4. You may copy and distribute the Program (or a work based on it,
- under Section 2) in object code or executable form under the terms
- of Sections 1 and 2 above provided that you also do one of the
- following:
-
- a. Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of
- Sections 1 and 2 above on a medium customarily used for
- software interchange; or,
-
- b. Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a
- medium customarily used for software interchange; or,
-
- c. Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with
- such an offer, in accord with Subsection b above.)
-
- The source code for a work means the preferred form of the work for
- making modifications to it. For an executable work, complete
- source code means all the source code for all modules it contains,
- plus any associated interface definition files, plus the scripts
- used to control compilation and installation of the executable.
- However, as a special exception, the source code distributed need
- not include anything that is normally distributed (in either
- source or binary form) with the major components (compiler,
- kernel, and so on) of the operating system on which the executable
- runs, unless that component itself accompanies the executable.
-
- If distribution of executable or object code is made by offering
- access to copy from a designated place, then offering equivalent
- access to copy the source code from the same place counts as
- distribution of the source code, even though third parties are not
- compelled to copy the source along with the object code.
-
- 5. You may not copy, modify, sublicense, or distribute the Program
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense or distribute the Program is
- void, and will automatically terminate your rights under this
- License. However, parties who have received copies, or rights,
- from you under this License will not have their licenses
- terminated so long as such parties remain in full compliance.
-
- 6. You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify
- or distribute the Program or its derivative works. These actions
- are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Program (or any work
- based on the Program), you indicate your acceptance of this
- License to do so, and all its terms and conditions for copying,
- distributing or modifying the Program or works based on it.
-
- 7. Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the
- original licensor to copy, distribute or modify the Program
- subject to these terms and conditions. You may not impose any
- further restrictions on the recipients' exercise of the rights
- granted herein. You are not responsible for enforcing compliance
- by third parties to this License.
-
- 8. If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent
- issues), conditions are imposed on you (whether by court order,
- agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this
- License. If you cannot distribute so as to satisfy simultaneously
- your obligations under this License and any other pertinent
- obligations, then as a consequence you may not distribute the
- Program at all. For example, if a patent license would not permit
- royalty-free redistribution of the Program by all those who
- receive copies directly or indirectly through you, then the only
- way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Program.
-
- If any portion of this section is held invalid or unenforceable
- under any particular circumstance, the balance of the section is
- intended to apply and the section as a whole is intended to apply
- in other circumstances.
-
- It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of
- any such claims; this section has the sole purpose of protecting
- the integrity of the free software distribution system, which is
- implemented by public license practices. Many people have made
- generous contributions to the wide range of software distributed
- through that system in reliance on consistent application of that
- system; it is up to the author/donor to decide if he or she is
- willing to distribute software through any other system and a
- licensee cannot impose that choice.
-
- This section is intended to make thoroughly clear what is believed
- to be a consequence of the rest of this License.
-
- 9. If the distribution and/or use of the Program is restricted in
- certain countries either by patents or by copyrighted interfaces,
- the original copyright holder who places the Program under this
- License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only
- in or among countries not thus excluded. In such case, this
- License incorporates the limitation as if written in the body of
- this License.
-
- 10. The Free Software Foundation may publish revised and/or new
- versions of the General Public License from time to time. Such
- new versions will be similar in spirit to the present version, but
- may differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
- Program specifies a version number of this License which applies
- to it and "any later version", you have the option of following
- the terms and conditions either of that version or of any later
- version published by the Free Software Foundation. If the Program
- does not specify a version number of this License, you may choose
- any version ever published by the Free Software Foundation.
-
- 11. If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the
- author to ask for permission. For software which is copyrighted
- by the Free Software Foundation, write to the Free Software
- Foundation; we sometimes make exceptions for this. Our decision
- will be guided by the two goals of preserving the free status of
- all derivatives of our free software and of promoting the sharing
- and reuse of software generally.
-
- NO WARRANTY
- 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
- WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
- LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
- NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
- QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
- SERVICING, REPAIR OR CORRECTION.
-
- 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
- MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
- INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
- INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
- OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
- OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-How to Apply These Terms to Your New Programs
-=============================================
-
-If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these
-terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
- Copyright (C) 19YY NAME OF AUTHOR
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-
- Also add information on how to contact you by electronic and paper
-mail.
-
- If the program is interactive, make it output a short notice like
-this when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
- type `show w'. This is free software, and you are welcome
- to redistribute it under certain conditions; type `show c'
- for details.
-
- The hypothetical commands `show w' and `show c' should show the
-appropriate parts of the General Public License. Of course, the
-commands you use may be called something other than `show w' and `show
-c'; they could even be mouse-clicks or menu items--whatever suits your
-program.
-
- You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the program,
-if necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright
- interest in the program `Gnomovision'
- (which makes passes at compilers) written
- by James Hacker.
-
- SIGNATURE OF TY COON, 1 April 1989
- Ty Coon, President of Vice
-
- This General Public License does not permit incorporating your
-program into proprietary programs. If your program is a subroutine
-library, you may consider it more useful to permit linking proprietary
-applications with the library. If this is what you want to do, use the
-GNU Library General Public License instead of this License.
-
-
-File: gcrypt.info, Node: Figures and Tables, Next: Concept Index, Prev: Copying, Up: Top
-
-List of Figures and Tables
-**************************
-
-* Menu:
-
-* Figure 13.1: Libgcrypt subsystems: fig:subsystems.
-* Figure B.1: FIPS mode state ...: fig:fips-fsm.
-
-* Menu:
-
-* Table B.1: FIPS mode states: tbl:fips-states.
-* Table B.2: FIPS mode state ...: tbl:fips-state-transitions.
-
-
-File: gcrypt.info, Node: Concept Index, Next: Function and Data Index, Prev: Figures and Tables, Up: Top
-
-Concept Index
-*************
-
-
-* Menu:
-
-* 3DES: Available ciphers. (line 16)
-* Advanced Encryption Standard: Available ciphers. (line 37)
-* AES: Available ciphers. (line 37)
-* Arcfour: Available ciphers. (line 54)
-* Blowfish: Available ciphers. (line 24)
-* Camellia: Available ciphers. (line 81)
-* CAST5: Available ciphers. (line 21)
-* CBC, Cipher Block Chaining mode: Available cipher modes.
- (line 20)
-* CBC-MAC: Working with cipher handles.
- (line 52)
-* CFB, Cipher Feedback mode: Available cipher modes.
- (line 16)
-* cipher text stealing: Working with cipher handles.
- (line 45)
-* CRC32: Available hash algorithms.
- (line 6)
-* CTR, Counter mode: Available cipher modes.
- (line 29)
-* DES: Available ciphers. (line 59)
-* DES-EDE: Available ciphers. (line 16)
-* Digital Encryption Standard: Available ciphers. (line 16)
-* ECB, Electronic Codebook mode: Available cipher modes.
- (line 13)
-* Enforced FIPS mode: Enabling FIPS mode. (line 30)
-* error codes: Error Values. (line 6)
-* error codes, list of <1>: Error Codes. (line 6)
-* error codes, list of: Error Sources. (line 6)
-* error codes, printing of: Error Strings. (line 6)
-* error sources: Error Values. (line 6)
-* error sources, printing of: Error Strings. (line 6)
-* error strings: Error Strings. (line 6)
-* error values: Error Values. (line 6)
-* error values, printing of: Error Strings. (line 6)
-* FIPS 140: Enabling FIPS mode. (line 6)
-* FIPS 186 <1>: Public-Key Subsystem Architecture.
- (line 63)
-* FIPS 186: General public-key related Functions.
- (line 256)
-* FIPS mode: Enabling FIPS mode. (line 6)
-* GPL, GNU General Public License: Copying. (line 6)
-* HAVAL: Available hash algorithms.
- (line 6)
-* HMAC: Working with hash algorithms.
- (line 27)
-* IDEA: Available ciphers. (line 11)
-* LGPL, GNU Lesser General Public License: Library Copying. (line 6)
-* MD2, MD4, MD5: Available hash algorithms.
- (line 6)
-* OFB, Output Feedback mode: Available cipher modes.
- (line 26)
-* RC2: Available ciphers. (line 71)
-* RC4: Available ciphers. (line 54)
-* rfc-2268: Available ciphers. (line 71)
-* Rijndael: Available ciphers. (line 37)
-* RIPE-MD-160: Available hash algorithms.
- (line 6)
-* Seed (cipher): Available ciphers. (line 76)
-* Serpent: Available ciphers. (line 67)
-* SHA-1: Available hash algorithms.
- (line 6)
-* SHA-224, SHA-256, SHA-384, SHA-512: Available hash algorithms.
- (line 6)
-* sync mode (OpenPGP): Working with cipher handles.
- (line 40)
-* TIGER: Available hash algorithms.
- (line 6)
-* Triple-DES: Available ciphers. (line 16)
-* Twofish: Available ciphers. (line 48)
-* Whirlpool: Available hash algorithms.
- (line 6)
-* X9.31 <1>: Public-Key Subsystem Architecture.
- (line 63)
-* X9.31: General public-key related Functions.
- (line 249)
-
-
-File: gcrypt.info, Node: Function and Data Index, Prev: Concept Index, Up: Top
-
-Function and Data Index
-***********************
-
-
-* Menu:
-
-* AM_PATH_LIBGCRYPT: Building sources using Automake.
- (line 13)
-* gcry_ac_close: Working with handles.
- (line 21)
-* gcry_ac_data_clear: Working with sets of data.
- (line 75)
-* gcry_ac_data_copy: Working with sets of data.
- (line 53)
-* gcry_ac_data_decode: Using cryptographic functions.
- (line 100)
-* gcry_ac_data_decrypt: Using cryptographic functions.
- (line 40)
-* gcry_ac_data_decrypt_scheme: Using cryptographic functions.
- (line 137)
-* gcry_ac_data_destroy: Working with sets of data.
- (line 41)
-* gcry_ac_data_encode: Using cryptographic functions.
- (line 93)
-* gcry_ac_data_encrypt: Using cryptographic functions.
- (line 33)
-* gcry_ac_data_encrypt_scheme: Using cryptographic functions.
- (line 127)
-* gcry_ac_data_from_sexp: Working with sets of data.
- (line 93)
-* gcry_ac_data_get_index: Working with sets of data.
- (line 69)
-* gcry_ac_data_get_name: Working with sets of data.
- (line 61)
-* gcry_ac_data_length: Working with sets of data.
- (line 57)
-* gcry_ac_data_new: Working with sets of data.
- (line 38)
-* gcry_ac_data_set: Working with sets of data.
- (line 45)
-* gcry_ac_data_sign: Using cryptographic functions.
- (line 48)
-* gcry_ac_data_sign_scheme: Using cryptographic functions.
- (line 147)
-* gcry_ac_data_t: Working with sets of data.
- (line 20)
-* gcry_ac_data_to_sexp: Working with sets of data.
- (line 79)
-* gcry_ac_data_verify: Using cryptographic functions.
- (line 54)
-* gcry_ac_data_verify_scheme: Using cryptographic functions.
- (line 157)
-* gcry_ac_id_t: Available asymmetric algorithms.
- (line 11)
-* gcry_ac_id_to_name: Handle-independent functions.
- (line 10)
-* gcry_ac_io_init: Working with IO objects.
- (line 22)
-* gcry_ac_io_init_va: Working with IO objects.
- (line 28)
-* gcry_ac_io_t: Working with IO objects.
- (line 10)
-* gcry_ac_key_data_get: Working with keys. (line 93)
-* gcry_ac_key_destroy: Working with keys. (line 86)
-* gcry_ac_key_get_grip: Working with keys. (line 105)
-* gcry_ac_key_get_nbits: Working with keys. (line 101)
-* gcry_ac_key_init: Working with keys. (line 30)
-* gcry_ac_key_pair_destroy: Working with keys. (line 90)
-* gcry_ac_key_pair_extract: Working with keys. (line 83)
-* gcry_ac_key_pair_generate: Working with keys. (line 36)
-* gcry_ac_key_pair_t: Working with keys. (line 20)
-* gcry_ac_key_t: Working with keys. (line 16)
-* gcry_ac_key_test: Working with keys. (line 97)
-* gcry_ac_key_type_t: Working with keys. (line 7)
-* gcry_ac_name_to_id: Handle-independent functions.
- (line 15)
-* gcry_ac_open: Working with handles.
- (line 11)
-* gcry_calloc: Memory allocation. (line 15)
-* gcry_calloc_secure: Memory allocation. (line 21)
-* gcry_check_version: Initializing the library.
- (line 17)
-* gcry_cipher_algo_info: General cipher functions.
- (line 12)
-* gcry_cipher_algo_name: General cipher functions.
- (line 39)
-* gcry_cipher_close: Working with cipher handles.
- (line 59)
-* gcry_cipher_ctl: Working with cipher handles.
- (line 159)
-* gcry_cipher_decrypt: Working with cipher handles.
- (line 129)
-* gcry_cipher_decrypt_t: Cipher modules. (line 80)
-* gcry_cipher_encrypt: Working with cipher handles.
- (line 110)
-* gcry_cipher_encrypt_t: Cipher modules. (line 75)
-* gcry_cipher_info: Working with cipher handles.
- (line 168)
-* gcry_cipher_list: Cipher modules. (line 106)
-* gcry_cipher_map_name: General cipher functions.
- (line 45)
-* gcry_cipher_mode_from_oid: General cipher functions.
- (line 50)
-* gcry_cipher_oid_spec_t: Cipher modules. (line 60)
-* gcry_cipher_open: Working with cipher handles.
- (line 11)
-* gcry_cipher_register: Cipher modules. (line 96)
-* gcry_cipher_reset: Working with cipher handles.
- (line 97)
-* gcry_cipher_setctr: Working with cipher handles.
- (line 90)
-* gcry_cipher_setiv: Working with cipher handles.
- (line 83)
-* gcry_cipher_setkey: Working with cipher handles.
- (line 68)
-* gcry_cipher_setkey_t: Cipher modules. (line 70)
-* gcry_cipher_spec_t: Cipher modules. (line 12)
-* gcry_cipher_stdecrypt_t: Cipher modules. (line 90)
-* gcry_cipher_stencrypt_t: Cipher modules. (line 85)
-* gcry_cipher_sync: Working with cipher handles.
- (line 149)
-* gcry_cipher_unregister: Cipher modules. (line 101)
-* gcry_control: Controlling the library.
- (line 7)
-* gcry_create_nonce: Retrieving random numbers.
- (line 26)
-* gcry_err_code: Error Values. (line 43)
-* gcry_err_code_from_errno: Error Values. (line 95)
-* gcry_err_code_t: Error Values. (line 7)
-* gcry_err_code_to_errno: Error Values. (line 100)
-* gcry_err_make: Error Values. (line 57)
-* gcry_err_make_from_errno: Error Values. (line 81)
-* gcry_err_source: Error Values. (line 49)
-* gcry_err_source_t: Error Values. (line 14)
-* gcry_error: Error Values. (line 64)
-* gcry_error_from_errno: Error Values. (line 86)
-* gcry_error_t: Error Values. (line 25)
-* gcry_fips_mode_active: Controlling the library.
- (line 221)
-* gcry_free: Memory allocation. (line 31)
-* gcry_handler_alloc_t: Allocation handler. (line 12)
-* gcry_handler_error_t: Error handler. (line 27)
-* gcry_handler_free_t: Allocation handler. (line 24)
-* gcry_handler_log_t: Logging handler. (line 7)
-* gcry_handler_no_mem_t: Error handler. (line 11)
-* gcry_handler_progress_t: Progress handler. (line 10)
-* gcry_handler_realloc_t: Allocation handler. (line 20)
-* gcry_handler_secure_check_t: Allocation handler. (line 16)
-* gcry_malloc: Memory allocation. (line 7)
-* gcry_malloc_secure: Memory allocation. (line 12)
-* gcry_md_algo_name: Working with hash algorithms.
- (line 154)
-* gcry_md_close: Working with hash algorithms.
- (line 61)
-* gcry_md_copy: Working with hash algorithms.
- (line 84)
-* gcry_md_debug: Working with hash algorithms.
- (line 218)
-* gcry_md_enable: Working with hash algorithms.
- (line 44)
-* gcry_md_final: Working with hash algorithms.
- (line 112)
-* gcry_md_final_t: Hash algorithm modules.
- (line 73)
-* gcry_md_get_algo: Working with hash algorithms.
- (line 198)
-* gcry_md_get_algo_dlen: Working with hash algorithms.
- (line 189)
-* gcry_md_get_asnoid: Working with hash algorithms.
- (line 170)
-* gcry_md_hash_buffer: Working with hash algorithms.
- (line 137)
-* gcry_md_init_t: Hash algorithm modules.
- (line 65)
-* gcry_md_is_enabled: Working with hash algorithms.
- (line 209)
-* gcry_md_is_secure: Working with hash algorithms.
- (line 204)
-* gcry_md_list: Hash algorithm modules.
- (line 91)
-* gcry_md_map_name: Working with hash algorithms.
- (line 160)
-* gcry_md_oid_spec_t: Hash algorithm modules.
- (line 57)
-* gcry_md_open: Working with hash algorithms.
- (line 11)
-* gcry_md_putc: Working with hash algorithms.
- (line 102)
-* gcry_md_read: Working with hash algorithms.
- (line 122)
-* gcry_md_read_t: Hash algorithm modules.
- (line 77)
-* gcry_md_register: Hash algorithm modules.
- (line 82)
-* gcry_md_reset: Working with hash algorithms.
- (line 72)
-* gcry_md_setkey: Working with hash algorithms.
- (line 53)
-* gcry_md_spec_t: Hash algorithm modules.
- (line 12)
-* gcry_md_start_debug: Working with hash algorithms.
- (line 232)
-* gcry_md_stop_debug: Working with hash algorithms.
- (line 240)
-* gcry_md_test_algo: Working with hash algorithms.
- (line 183)
-* gcry_md_unregister: Hash algorithm modules.
- (line 87)
-* gcry_md_write: Working with hash algorithms.
- (line 97)
-* gcry_md_write_t: Hash algorithm modules.
- (line 69)
-* gcry_module_t: Modules. (line 10)
-* gcry_mpi_add: Calculations. (line 10)
-* gcry_mpi_add_ui: Calculations. (line 14)
-* gcry_mpi_addm: Calculations. (line 18)
-* gcry_mpi_aprint: MPI formats. (line 54)
-* gcry_mpi_clear_bit: Bit manipulations. (line 19)
-* gcry_mpi_clear_flag: Miscellaneous. (line 32)
-* gcry_mpi_clear_highbit: Bit manipulations. (line 25)
-* gcry_mpi_cmp: Comparisons. (line 9)
-* gcry_mpi_cmp_ui: Comparisons. (line 13)
-* gcry_mpi_copy: Basic functions. (line 23)
-* gcry_mpi_div: Calculations. (line 50)
-* gcry_mpi_dump: MPI formats. (line 61)
-* gcry_mpi_gcd: Calculations. (line 63)
-* gcry_mpi_get_flag: Miscellaneous. (line 37)
-* gcry_mpi_get_nbits: Bit manipulations. (line 10)
-* gcry_mpi_get_opaque: Miscellaneous. (line 20)
-* gcry_mpi_invm: Calculations. (line 68)
-* gcry_mpi_lshift: Bit manipulations. (line 34)
-* gcry_mpi_mod: Calculations. (line 55)
-* gcry_mpi_mul: Calculations. (line 34)
-* gcry_mpi_mul_2exp: Calculations. (line 46)
-* gcry_mpi_mul_ui: Calculations. (line 38)
-* gcry_mpi_mulm: Calculations. (line 42)
-* gcry_mpi_new: Basic functions. (line 10)
-* gcry_mpi_powm: Calculations. (line 59)
-* gcry_mpi_print: MPI formats. (line 45)
-* gcry_mpi_randomize: Miscellaneous. (line 41)
-* gcry_mpi_release: Basic functions. (line 26)
-* gcry_mpi_rshift: Bit manipulations. (line 29)
-* gcry_mpi_scan: MPI formats. (line 12)
-* gcry_mpi_set: Basic functions. (line 33)
-* gcry_mpi_set_bit: Bit manipulations. (line 16)
-* gcry_mpi_set_flag: Miscellaneous. (line 26)
-* gcry_mpi_set_highbit: Bit manipulations. (line 22)
-* gcry_mpi_set_opaque: Miscellaneous. (line 8)
-* gcry_mpi_set_ui: Basic functions. (line 37)
-* gcry_mpi_snew: Basic functions. (line 17)
-* gcry_mpi_sub: Calculations. (line 22)
-* gcry_mpi_sub_ui: Calculations. (line 26)
-* gcry_mpi_subm: Calculations. (line 30)
-* gcry_mpi_swap: Basic functions. (line 44)
-* gcry_mpi_t: Data types. (line 7)
-* gcry_mpi_test_bit: Bit manipulations. (line 13)
-* gcry_pk_algo_info: General public-key related Functions.
- (line 47)
-* gcry_pk_algo_name: General public-key related Functions.
- (line 10)
-* gcry_pk_check_secret_key_t: Public key modules. (line 91)
-* gcry_pk_ctl: General public-key related Functions.
- (line 100)
-* gcry_pk_decrypt: Cryptographic Functions.
- (line 85)
-* gcry_pk_decrypt_t: Public key modules. (line 101)
-* gcry_pk_encrypt: Cryptographic Functions.
- (line 29)
-* gcry_pk_encrypt_t: Public key modules. (line 96)
-* gcry_pk_generate_t: Public key modules. (line 86)
-* gcry_pk_genkey: General public-key related Functions.
- (line 115)
-* gcry_pk_get_keygrip: General public-key related Functions.
- (line 29)
-* gcry_pk_get_nbits: General public-key related Functions.
- (line 24)
-* gcry_pk_get_nbits_t: Public key modules. (line 116)
-* gcry_pk_list: Public key modules. (line 131)
-* gcry_pk_map_name: General public-key related Functions.
- (line 16)
-* gcry_pk_register: Public key modules. (line 121)
-* gcry_pk_sign: Cryptographic Functions.
- (line 117)
-* gcry_pk_sign_t: Public key modules. (line 106)
-* gcry_pk_spec_t: Public key modules. (line 12)
-* gcry_pk_test_algo: General public-key related Functions.
- (line 20)
-* gcry_pk_testkey: General public-key related Functions.
- (line 40)
-* gcry_pk_unregister: Public key modules. (line 127)
-* gcry_pk_verify: Cryptographic Functions.
- (line 170)
-* gcry_pk_verify_t: Public key modules. (line 111)
-* gcry_prime_check: Checking. (line 8)
-* gcry_prime_generate: Generation. (line 10)
-* gcry_prime_group_generator: Generation. (line 19)
-* gcry_prime_release_factors: Generation. (line 25)
-* gcry_random_bytes: Retrieving random numbers.
- (line 13)
-* gcry_random_bytes_secure: Retrieving random numbers.
- (line 19)
-* gcry_random_level_t: Quality of random numbers.
- (line 9)
-* gcry_randomize: Retrieving random numbers.
- (line 8)
-* gcry_realloc: Memory allocation. (line 24)
-* gcry_set_allocation_handler: Allocation handler. (line 34)
-* gcry_set_fatalerror_handler: Error handler. (line 32)
-* gcry_set_log_handler: Logging handler. (line 12)
-* gcry_set_outofcore_handler: Error handler. (line 16)
-* gcry_set_progress_handler: Progress handler. (line 21)
-* gcry_sexp_build: Working with S-expressions.
- (line 43)
-* gcry_sexp_canon_len: Working with S-expressions.
- (line 126)
-* gcry_sexp_car: Working with S-expressions.
- (line 155)
-* gcry_sexp_cdr: Working with S-expressions.
- (line 160)
-* gcry_sexp_create: Working with S-expressions.
- (line 26)
-* gcry_sexp_dump: Working with S-expressions.
- (line 117)
-* gcry_sexp_find_token: Working with S-expressions.
- (line 138)
-* gcry_sexp_length: Working with S-expressions.
- (line 145)
-* gcry_sexp_new: Working with S-expressions.
- (line 13)
-* gcry_sexp_nth: Working with S-expressions.
- (line 150)
-* gcry_sexp_nth_data: Working with S-expressions.
- (line 168)
-* gcry_sexp_nth_mpi: Working with S-expressions.
- (line 193)
-* gcry_sexp_nth_string: Working with S-expressions.
- (line 185)
-* gcry_sexp_release: Working with S-expressions.
- (line 83)
-* gcry_sexp_sprint: Working with S-expressions.
- (line 94)
-* gcry_sexp_sscan: Working with S-expressions.
- (line 37)
-* gcry_sexp_t: Data types for S-expressions.
- (line 7)
-* gcry_strerror: Error Strings. (line 7)
-* gcry_strsource: Error Strings. (line 13)
-
-
-
-Tag Table:
-Node: Top775
-Node: Introduction2994
-Node: Getting Started3366
-Node: Features4247
-Node: Overview5031
-Node: Preparation5662
-Node: Header6519
-Node: Building sources7589
-Node: Building sources using Automake9503
-Node: Initializing the library10685
-Ref: sample-use-suspend-secmem13860
-Ref: sample-use-resume-secmem14480
-Node: Multi-Threading15376
-Ref: Multi-Threading-Footnote-119389
-Node: Enabling FIPS mode19797
-Node: Generalities21663
-Node: Controlling the library21988
-Node: Modules34155
-Node: Error Handling34934
-Node: Error Values37457
-Node: Error Sources42397
-Node: Error Codes44668
-Node: Error Strings48153
-Node: Handler Functions49336
-Node: Progress handler49895
-Node: Allocation handler51891
-Node: Error handler53442
-Node: Logging handler55009
-Node: Symmetric cryptography55601
-Node: Available ciphers56406
-Node: Cipher modules58913
-Node: Available cipher modes63437
-Node: Working with cipher handles64316
-Node: General cipher functions72631
-Node: Public Key cryptography75149
-Node: Available algorithms76064
-Node: Used S-expressions76413
-Node: RSA key parameters77525
-Node: DSA key parameters78800
-Node: ECC key parameters79458
-Node: Public key modules81223
-Node: Cryptographic Functions86807
-Node: General public-key related Functions94287
-Node: AC Interface106576
-Node: Available asymmetric algorithms107711
-Node: Working with sets of data108380
-Node: Working with IO objects112882
-Node: Working with handles115602
-Node: Working with keys116549
-Node: Using cryptographic functions120631
-Node: Handle-independent functions127538
-Node: Hashing128286
-Node: Available hash algorithms129077
-Node: Hash algorithm modules132184
-Node: Working with hash algorithms136032
-Node: Random Numbers147334
-Node: Quality of random numbers147608
-Node: Retrieving random numbers148292
-Node: S-expressions149776
-Node: Data types for S-expressions150418
-Node: Working with S-expressions150742
-Node: MPI library160113
-Node: Data types161071
-Node: Basic functions161265
-Node: MPI formats163333
-Node: Calculations166216
-Node: Comparisons168470
-Node: Bit manipulations169114
-Node: Miscellaneous170429
-Node: Prime numbers172398
-Node: Generation172668
-Node: Checking173952
-Node: Utilities174365
-Node: Memory allocation174558
-Node: Architecture175885
-Ref: fig:subsystems177405
-Ref: Architecture-Footnote-1178490
-Ref: Architecture-Footnote-2178552
-Node: Public-Key Subsystem Architecture178636
-Node: Symmetric Encryption Subsystem Architecture181577
-Node: Hashing and MACing Subsystem Architecture183024
-Node: Multi-Precision-Integer Subsystem Architecture184948
-Node: Prime-Number-Generator Subsystem Architecture186389
-Ref: Prime-Number-Generator Subsystem Architecture-Footnote-1188320
-Node: Random-Number Subsystem Architecture188607
-Node: CSPRNG Description191096
-Ref: CSPRNG Description-Footnote-1192658
-Node: FIPS PRNG Description192781
-Node: Self-Tests194916
-Node: FIPS Mode206607
-Ref: fig:fips-fsm210587
-Ref: tbl:fips-states210689
-Ref: tbl:fips-state-transitions211942
-Node: Library Copying215556
-Node: Copying243674
-Node: Figures and Tables262848
-Node: Concept Index263258
-Node: Function and Data Index268823
-
-End Tag Table
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.texi b/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.texi
deleted file mode 100644
index a2993df97e..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/gcrypt.texi
+++ /dev/null
@@ -1,5867 +0,0 @@
-\input texinfo @c -*- Texinfo -*-
-@c %**start of header
-@setfilename gcrypt.info
-@include version.texi
-@settitle The Libgcrypt Reference Manual
-@c Unify some of the indices.
-@syncodeindex tp fn
-@syncodeindex pg fn
-@c %**end of header
-@copying
-This manual is for Libgcrypt
-(version @value{VERSION}, @value{UPDATED}),
-which is GNU's library of cryptographic building blocks.
-
-Copyright @copyright{} 2000, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-
-@quotation
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2 of the License, or (at your
-option) any later version. The text of the license can be found in the
-section entitled ``GNU General Public License''.
-@end quotation
-@end copying
-
-@dircategory GNU Libraries
-@direntry
-* libgcrypt: (gcrypt). Cryptographic function library.
-@end direntry
-
-
-
-@c
-@c Titlepage
-@c
-@setchapternewpage odd
-@titlepage
-@title The Libgcrypt Reference Manual
-@subtitle Version @value{VERSION}
-@subtitle @value{UPDATED}
-@author Werner Koch (@email{wk@@gnupg.org})
-@author Moritz Schulte (@email{mo@@g10code.com})
-
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-
-@ifnothtml
-@summarycontents
-@contents
-@page
-@end ifnothtml
-
-
-@ifnottex
-@node Top
-@top The Libgcrypt Library
-@insertcopying
-@end ifnottex
-
-
-@menu
-* Introduction:: What is Libgcrypt.
-* Preparation:: What you should do before using the library.
-* Generalities:: General library functions and data types.
-* Handler Functions:: Working with handler functions.
-* Symmetric cryptography:: How to use symmetric cryptography.
-* Public Key cryptography:: How to use public key cryptography.
-* Hashing:: How to use hash and MAC algorithms.
-* Random Numbers:: How to work with random numbers.
-* S-expressions:: How to manage S-expressions.
-* MPI library:: How to work with multi-precision-integers.
-* Prime numbers:: How to use the Prime number related functions.
-* Utilities:: Utility functions.
-* Architecture:: How Libgcrypt works internally.
-
-Appendices
-
-* Self-Tests:: Description of the self-tests.
-* FIPS Mode:: Description of the FIPS mode.
-* Library Copying:: The GNU Lesser General Public License
- says how you can copy and share Libgcrypt.
-* Copying:: The GNU General Public License says how you
- can copy and share some parts of Libgcrypt.
-
-Indices
-
-* Figures and Tables:: Index of figures and tables.
-* Concept Index:: Index of concepts and programs.
-* Function and Data Index:: Index of functions, variables and data types.
-
-@end menu
-
-@ifhtml
-@page
-@summarycontents
-@contents
-@end ifhtml
-
-
-@c **********************************************************
-@c ******************* Introduction ***********************
-@c **********************************************************
-@node Introduction
-@chapter Introduction
-
-Libgcrypt is a library providing cryptographic building blocks.
-
-@menu
-* Getting Started:: How to use this manual.
-* Features:: A glance at Libgcrypt's features.
-* Overview:: Overview about the library.
-@end menu
-
-@node Getting Started
-@section Getting Started
-
-This manual documents the Libgcrypt library application programming
-interface (API). All functions and data types provided by the library
-are explained.
-
-@noindent
-The reader is assumed to possess basic knowledge about applied
-cryptography.
-
-This manual can be used in several ways. If read from the beginning
-to the end, it gives a good introduction into the library and how it
-can be used in an application. Forward references are included where
-necessary. Later on, the manual can be used as a reference manual to
-get just the information needed about any particular interface of the
-library. Experienced programmers might want to start looking at the
-examples at the end of the manual, and then only read up those parts
-of the interface which are unclear.
-
-
-@node Features
-@section Features
-
-Libgcrypt might have a couple of advantages over other libraries doing
-a similar job.
-
-@table @asis
-@item It's Free Software
-Anybody can use, modify, and redistribute it under the terms of the GNU
-Lesser General Public License (@pxref{Library Copying}). Note, that
-some parts (which are in general not needed by applications) are subject
-to the terms of the GNU General Public License (@pxref{Copying}); please
-see the README file of the distribution for of list of these parts.
-
-@item It encapsulates the low level cryptography
-Libgcrypt provides a high level interface to cryptographic
-building blocks using an extensible and flexible API.
-
-@end table
-
-@node Overview
-@section Overview
-
-@noindent
-The Libgcrypt library is fully thread-safe, where it makes
-sense to be thread-safe. Not thread-safe are some cryptographic
-functions that modify a certain context stored in handles. If the
-user really intents to use such functions from different threads on
-the same handle, he has to take care of the serialization of such
-functions himself. If not described otherwise, every function is
-thread-safe.
-
-Libgcrypt depends on the library `libgpg-error', which
-contains common error handling related code for GnuPG components.
-
-@c **********************************************************
-@c ******************* Preparation ************************
-@c **********************************************************
-@node Preparation
-@chapter Preparation
-
-To use Libgcrypt, you have to perform some changes to your
-sources and the build system. The necessary changes are small and
-explained in the following sections. At the end of this chapter, it
-is described how the library is initialized, and how the requirements
-of the library are verified.
-
-@menu
-* Header:: What header file you need to include.
-* Building sources:: How to build sources using the library.
-* Building sources using Automake:: How to build sources with the help of Automake.
-* Initializing the library:: How to initialize the library.
-* Multi-Threading:: How Libgcrypt can be used in a MT environment.
-* Enabling FIPS mode:: How to enable the FIPS mode.
-@end menu
-
-
-@node Header
-@section Header
-
-All interfaces (data types and functions) of the library are defined
-in the header file @file{gcrypt.h}. You must include this in all source
-files using the library, either directly or through some other header
-file, like this:
-
-@example
-#include <gcrypt.h>
-@end example
-
-The name space of Libgcrypt is @code{gcry_*} for function
-and type names and @code{GCRY*} for other symbols. In addition the
-same name prefixes with one prepended underscore are reserved for
-internal use and should never be used by an application. Note that
-Libgcrypt uses libgpg-error, which uses @code{gpg_*} as
-name space for function and type names and @code{GPG_*} for other
-symbols, including all the error codes.
-
-@noindent
-Certain parts of gcrypt.h may be excluded by defining these macros:
-
-@table @code
-@item GCRYPT_NO_MPI_MACROS
-Do not define the shorthand macros @code{mpi_*} for @code{gcry_mpi_*}.
-
-@item GCRYPT_NO_DEPRECATED
-Do not include defintions for deprecated features. This is useful to
-make sure that no deprecated features are used.
-@end table
-
-@node Building sources
-@section Building sources
-
-If you want to compile a source file including the `gcrypt.h' header
-file, you must make sure that the compiler can find it in the
-directory hierarchy. This is accomplished by adding the path to the
-directory in which the header file is located to the compilers include
-file search path (via the @option{-I} option).
-
-However, the path to the include file is determined at the time the
-source is configured. To solve this problem, Libgcrypt ships with a small
-helper program @command{libgcrypt-config} that knows the path to the
-include file and other configuration options. The options that need
-to be added to the compiler invocation at compile time are output by
-the @option{--cflags} option to @command{libgcrypt-config}. The following
-example shows how it can be used at the command line:
-
-@example
-gcc -c foo.c `libgcrypt-config --cflags`
-@end example
-
-Adding the output of @samp{libgcrypt-config --cflags} to the compilers
-command line will ensure that the compiler can find the Libgcrypt header
-file.
-
-A similar problem occurs when linking the program with the library.
-Again, the compiler has to find the library files. For this to work,
-the path to the library files has to be added to the library search path
-(via the @option{-L} option). For this, the option @option{--libs} to
-@command{libgcrypt-config} can be used. For convenience, this option
-also outputs all other options that are required to link the program
-with the Libgcrypt libraries (in particular, the @samp{-lgcrypt}
-option). The example shows how to link @file{foo.o} with the Libgcrypt
-library to a program @command{foo}.
-
-@example
-gcc -o foo foo.o `libgcrypt-config --libs`
-@end example
-
-Of course you can also combine both examples to a single command by
-specifying both options to @command{libgcrypt-config}:
-
-@example
-gcc -o foo foo.c `libgcrypt-config --cflags --libs`
-@end example
-
-@node Building sources using Automake
-@section Building sources using Automake
-
-It is much easier if you use GNU Automake instead of writing your own
-Makefiles. If you do that, you do not have to worry about finding and
-invoking the @command{libgcrypt-config} script at all.
-Libgcrypt provides an extension to Automake that does all
-the work for you.
-
-@c A simple macro for optional variables.
-@macro ovar{varname}
-@r{[}@var{\varname\}@r{]}
-@end macro
-@defmac AM_PATH_LIBGCRYPT (@ovar{minimum-version}, @ovar{action-if-found}, @ovar{action-if-not-found})
-Check whether Libgcrypt (at least version
-@var{minimum-version}, if given) exists on the host system. If it is
-found, execute @var{action-if-found}, otherwise do
-@var{action-if-not-found}, if given.
-
-Additionally, the function defines @code{LIBGCRYPT_CFLAGS} to the
-flags needed for compilation of the program to find the
-@file{gcrypt.h} header file, and @code{LIBGCRYPT_LIBS} to the linker
-flags needed to link the program to the Libgcrypt library.
-@end defmac
-
-You can use the defined Autoconf variables like this in your
-@file{Makefile.am}:
-
-@example
-AM_CPPFLAGS = $(LIBGCRYPT_CFLAGS)
-LDADD = $(LIBGCRYPT_LIBS)
-@end example
-
-@node Initializing the library
-@section Initializing the library
-
-Before the library can be used, it must initialize itself. This is
-achieved by invoking the function @code{gcry_check_version} described
-below.
-
-Also, it is often desirable to check that the version of
-Libgcrypt used is indeed one which fits all requirements.
-Even with binary compatibility, new features may have been introduced,
-but due to problem with the dynamic linker an old version may actually
-be used. So you may want to check that the version is okay right
-after program startup.
-
-@deftypefun {const char *} gcry_check_version (const char *@var{req_version})
-
-The function @code{gcry_check_version} initializes some subsystems used
-by Libgcrypt and must be invoked before any other function in the
-library, with the exception of the @code{GCRYCTL_SET_THREAD_CBS} command
-(called via the @code{gcry_control} function).
-@xref{Multi-Threading}.
-
-Furthermore, this function returns the version number of the library.
-It can also verify that the version number is higher than a certain
-required version number @var{req_version}, if this value is not a null
-pointer.
-@end deftypefun
-
-Libgcrypt uses a concept known as secure memory, which is a region of
-memory set aside for storing sensitive data. Because such memory is a
-scarce resource, it needs to be setup in advanced to a fixed size.
-Further, most operating systems have special requirements on how that
-secure memory can be used. For example, it might be required to install
-an application as ``setuid(root)'' to allow allocating such memory.
-Libgcrypt requires a sequence of initialization steps to make sure that
-this works correctly. The following examples show the necessary steps.
-
-If you don't have a need for secure memory, for example if your
-application does not use secret keys or other confidential data or it
-runs in a controlled environment where key material floating around in
-memory is not a problem, you should initialize Libgcrypt this way:
-
-@example
- /* Version check should be the very first call because it
- makes sure that important subsystems are intialized. */
- if (!gcry_check_version (GCRYPT_VERSION))
- @{
- fputs ("libgcrypt version mismatch\n", stderr);
- exit (2);
- @}
-
- /* Disable secure memory. */
- gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
-
- /* ... If required, other initialization goes here. */
-
- /* Tell Libgcrypt that initialization has completed. */
- gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
-@end example
-
-
-If you have to protect your keys or other information in memory against
-being swapped out to disk and to enable an automatic overwrite of used
-and freed memory, you need to initialize Libgcrypt this way:
-
-@example
- /* Version check should be the very first call because it
- makes sure that important subsystems are intialized. */
- if (!gcry_check_version (GCRYPT_VERSION))
- @{
- fputs ("libgcrypt version mismatch\n", stderr);
- exit (2);
- @}
-
-@anchor{sample-use-suspend-secmem}
- /* We don't want to see any warnings, e.g. because we have not yet
- parsed program options which might be used to suppress such
- warnings. */
- gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
-
- /* ... If required, other initialization goes here. Note that the
- process might still be running with increased privileges and that
- the secure memory has not been intialized. */
-
- /* Allocate a pool of 16k secure memory. This make the secure memory
- available and also drops privileges where needed. */
- gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
-
-@anchor{sample-use-resume-secmem}
- /* It is now okay to let Libgcrypt complain when there was/is
- a problem with the secure memory. */
- gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
-
- /* ... If required, other initialization goes here. */
-
- /* Tell Libgcrypt that initialization has completed. */
- gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
-@end example
-
-It is important that these initialization steps are not done by a
-library but by the actual application. A library using Libgcrypt might
-want to check for finished initialization using:
-
-@example
- if (!gcry_control (GCRYCTL_INITIALIZATION_FINISHED_P))
- @{
- fputs ("libgcrypt has not been initialized\n", stderr);
- abort ();
- @}
-@end example
-
-Instead of terminating the process, the library may instead print a
-warning and try to initialize Libgcrypt itself. See also the section on
-multi-threading below for more pitfalls.
-
-
-
-@node Multi-Threading
-@section Multi-Threading
-
-As mentioned earlier, the Libgcrypt library is
-thread-safe if you adhere to the following requirements:
-
-@itemize @bullet
-@item
-If your application is multi-threaded, you must set the thread support
-callbacks with the @code{GCRYCTL_SET_THREAD_CBS} command
-@strong{before} any other function in the library.
-
-This is easy enough if you are indeed writing an application using
-Libgcrypt. It is rather problematic if you are writing a library
-instead. Here are some tips what to do if you are writing a library:
-
-If your library requires a certain thread package, just initialize
-Libgcrypt to use this thread package. If your library supports multiple
-thread packages, but needs to be configured, you will have to
-implement a way to determine which thread package the application
-wants to use with your library anyway. Then configure Libgcrypt to use
-this thread package.
-
-If your library is fully reentrant without any special support by a
-thread package, then you are lucky indeed. Unfortunately, this does
-not relieve you from doing either of the two above, or use a third
-option. The third option is to let the application initialize Libgcrypt
-for you. Then you are not using Libgcrypt transparently, though.
-
-As if this was not difficult enough, a conflict may arise if two
-libraries try to initialize Libgcrypt independently of each others, and
-both such libraries are then linked into the same application. To
-make it a bit simpler for you, this will probably work, but only if
-both libraries have the same requirement for the thread package. This
-is currently only supported for the non-threaded case, GNU Pth and
-pthread. Support for more thread packages is easy to add, so contact
-us if you require it.
-
-@item
-The function @code{gcry_check_version} must be called before any other
-function in the library, except the @code{GCRYCTL_SET_THREAD_CBS}
-command (called via the @code{gcry_control} function), because it
-initializes the thread support subsystem in Libgcrypt. To
-achieve this in multi-threaded programs, you must synchronize the
-memory with respect to other threads that also want to use
-Libgcrypt. For this, it is sufficient to call
-@code{gcry_check_version} before creating the other threads using
-Libgcrypt@footnote{At least this is true for POSIX threads,
-as @code{pthread_create} is a function that synchronizes memory with
-respects to other threads. There are many functions which have this
-property, a complete list can be found in POSIX, IEEE Std 1003.1-2003,
-Base Definitions, Issue 6, in the definition of the term ``Memory
-Synchronization''. For other thread packages, more relaxed or more
-strict rules may apply.}.
-
-@item
-Just like the function @code{gpg_strerror}, the function
-@code{gcry_strerror} is not thread safe. You have to use
-@code{gpg_strerror_r} instead.
-
-@end itemize
-
-
-Libgcrypt contains convenient macros, which define the
-necessary thread callbacks for PThread and for GNU Pth:
-
-@table @code
-@item GCRY_THREAD_OPTION_PTH_IMPL
-
-This macro defines the following (static) symbols:
-@code{gcry_pth_init}, @code{gcry_pth_mutex_init},
-@code{gcry_pth_mutex_destroy}, @code{gcry_pth_mutex_lock},
-@code{gcry_pth_mutex_unlock}, @code{gcry_pth_read},
-@code{gcry_pth_write}, @code{gcry_pth_select},
-@code{gcry_pth_waitpid}, @code{gcry_pth_accept},
-@code{gcry_pth_connect}, @code{gcry_threads_pth}.
-
-After including this macro, @code{gcry_control()} shall be used with a
-command of @code{GCRYCTL_SET_THREAD_CBS} in order to register the
-thread callback structure named ``gcry_threads_pth''.
-
-@item GCRY_THREAD_OPTION_PTHREAD_IMPL
-
-This macro defines the following (static) symbols:
-@code{gcry_pthread_mutex_init}, @code{gcry_pthread_mutex_destroy},
-@code{gcry_pthread_mutex_lock}, @code{gcry_pthread_mutex_unlock},
-@code{gcry_threads_pthread}.
-
-After including this macro, @code{gcry_control()} shall be used with a
-command of @code{GCRYCTL_SET_THREAD_CBS} in order to register the
-thread callback structure named ``gcry_threads_pthread''.
-@end table
-
-Note that these macros need to be terminated with a semicolon. Keep
-in mind that these are convenient macros for C programmers; C++
-programmers might have to wrap these macros in an ``extern C'' body.
-
-
-@node Enabling FIPS mode
-@section How to enable the FIPS mode
-@cindex FIPS mode
-@cindex FIPS 140
-
-Libgcrypt may be used in a FIPS 140-2 mode. Note, that this does not
-necessary mean that Libcgrypt is an appoved FIPS 140-2 module. Check the
-NIST database at @url{http://csrc.nist.gov/groups/STM/cmvp/} to see what
-versions of Libgcrypt are approved.
-
-Because FIPS 140 has certain restrictions on the use of cryptography
-which are not always wanted, Libgcrypt needs to be put into FIPS mode
-explicitly. Three alternative mechanisms are provided to switch
-Libgcrypt into this mode:
-
-@itemize
-@item
-If the file @file{/proc/sys/crypto/fips_enabled} exists and contains a
-numeric value other than @code{0}, Libgcrypt is put into FIPS mode at
-initialization time. Obviously this works only on systems with a
-@code{proc} file system (i.e. GNU/Linux).
-
-@item
-If the file @file{/etc/gcrypt/fips_enabled} exists, Libgcrypt is put
-into FIPS mode at initialization time. Note that this filename is
-hardwired and does not depend on any configuration options.
-
-@item
-If the application requests FIPS mode using the control command
-@code{GCRYCTL_FORCE_FIPS_MODE}. This must be done prior to any
-initialization (i.e. before @code{gcry_check_version}).
-
-@end itemize
-
-@cindex Enforced FIPS mode
-
-In addition to the standard FIPS mode, Libgcrypt may also be put into
-an Enforced FIPS mode by writing a non-zero value into the file
-@file{/etc/gcrypt/fips_enabled}. The Enforced FIPS mode helps to
-detect applications which don't fulfill all requirements for using
-Libgcrypt in FIPS mode (@pxref{FIPS Mode}).
-
-Once Libgcrypt has been put into FIPS mode, it is not possible to
-switch back to standard mode without terminating the process first.
-If the logging verbosity level of Libgcrypt has been set to at least
-2, the state transitions and the self-tests are logged.
-
-
-
-@c **********************************************************
-@c ******************* General ****************************
-@c **********************************************************
-@node Generalities
-@chapter Generalities
-
-@menu
-* Controlling the library:: Controlling Libgcrypt's behavior.
-* Modules:: Description of extension modules.
-* Error Handling:: Error codes and such.
-@end menu
-
-@node Controlling the library
-@section Controlling the library
-
-@deftypefun gcry_error_t gcry_control (enum gcry_ctl_cmds @var{cmd}, ...)
-
-This function can be used to influence the general behavior of
-Libgcrypt in several ways. Depending on @var{cmd}, more
-arguments can or have to be provided.
-
-@table @code
-@item GCRYCTL_ENABLE_M_GUARD; Arguments: none
-This command enables the built-in memory guard. It must not be used to
-activate the memory guard after the memory management has already been
-used; therefore it can ONLY be used at initialization time. Note that
-the memory guard is NOT used when the user of the library has set his
-own memory management callbacks.
-
-@item GCRYCTL_ENABLE_QUICK_RANDOM; Arguments: none
-This command inhibits the use the very secure random quality level
-(@code{GCRY_VERY_STRONG_RANDOM}) and degrades all request down to
-@code{GCRY_STRONG_RANDOM}. In general this is not recommened. However,
-for some applications the extra quality random Libgcrypt tries to create
-is not justified and this option may help to get better performace.
-Please check with a crypto expert whether this option can be used for
-your application.
-
-This option can only be used at initialization time.
-
-
-@item GCRYCTL_DUMP_RANDOM_STATS; Arguments: none
-This command dumps randum number generator related statistics to the
-library's logging stream.
-
-@item GCRYCTL_DUMP_MEMORY_STATS; Arguments: none
-This command dumps memory managment related statistics to the library's
-logging stream.
-
-@item GCRYCTL_DUMP_SECMEM_STATS; Arguments: none
-This command dumps secure memory manamgent related statistics to the
-library's logging stream.
-
-@item GCRYCTL_DROP_PRIVS; Arguments: none
-This command disables the use of secure memory and drops the priviliges
-of the current process. This command has not much use; the suggested way
-to disable secure memory is to use @code{GCRYCTL_DISABLE_SECMEM} right
-after initialization.
-
-@item GCRYCTL_DISABLE_SECMEM; Arguments: none
-This command disables the use of secure memory. If this command is
-used in FIPS mode, FIPS mode will be disabled and the function
-@code{gcry_fips_mode_active} returns false. However, in Enforced FIPS
-mode this command has no effect at all.
-
-Many applications do not require secure memory, so they should disable
-it right away. This command should be executed right after
-@code{gcry_check_version}.
-
-@item GCRYCTL_INIT_SECMEM; Arguments: int nbytes
-This command is used to allocate a pool of secure memory and thus
-enabling the use of secure memory. It also drops all extra privileges
-the process has (i.e. if it is run as setuid (root)). If the argument
-@var{nbytes} is 0, secure memory will be disabled. The minimum amount
-of secure memory allocated is currently 16384 bytes; you may thus use a
-value of 1 to request that default size.
-
-@item GCRYCTL_TERM_SECMEM; Arguments: none
-This command zeroises the secure memory and destroys the handler. The
-secure memory pool may not be used anymore after running this command.
-If the secure memory pool as already been destroyed, this command has
-no effect. Applications might want to run this command from their
-exit handler to make sure that the secure memory gets properly
-destroyed. This command is not necessarily thread-safe but that
-should not be needed in cleanup code. It may be called from a signal
-handler.
-
-@item GCRYCTL_DISABLE_SECMEM_WARN; Arguments: none
-Disable warning messages about problems with the secure memory
-subsystem. This command should be run right after
-@code{gcry_check_version}.
-
-@item GCRYCTL_SUSPEND_SECMEM_WARN; Arguments: none
-Postpone warning messages from the secure memory subsystem.
-@xref{sample-use-suspend-secmem,,the initialization example}, on how to
-use it.
-
-@item GCRYCTL_RESUME_SECMEM_WARN; Arguments: none
-Resume warning messages from the secure memory subsystem.
-@xref{sample-use-resume-secmem,,the initialization example}, on how to
-use it.
-
-@item GCRYCTL_USE_SECURE_RNDPOOL; Arguments: none
-This command tells the PRNG to store random numbers in secure memory.
-This command should be run right after @code{gcry_check_version} and not
-later than the command GCRYCTL_INIT_SECMEM. Note that in FIPS mode the
-secure memory is always used.
-
-@item GCRYCTL_SET_RANDOM_SEED_FILE; Arguments: const char *filename
-This command specifies the file, which is to be used as seed file for
-the PRNG. If the seed file is registered prior to initialization of the
-PRNG, the seed file's content (if it exists and seems to be valid) is
-fed into the PRNG pool. After the seed file has been registered, the
-PRNG can be signalled to write out the PRNG pool's content into the seed
-file with the following command.
-
-
-@item GCRYCTL_UPDATE_RANDOM_SEED_FILE; Arguments: none
-Write out the PRNG pool's content into the registered seed file.
-
-Multiple instances of the applications sharing the same random seed file
-can be started in parallel, in which case they will read out the same
-pool and then race for updating it (the last update overwrites earlier
-updates). They will differentiate only by the weak entropy that is
-added in read_seed_file based on the PID and clock, and up to 16 bytes
-of weak random non-blockingly. The consequence is that the output of
-these different instances is correlated to some extent. In a perfect
-attack scenario, the attacker can control (or at least guess) the PID
-and clock of the application, and drain the system's entropy pool to
-reduce the "up to 16 bytes" above to 0. Then the dependencies of the
-inital states of the pools are completely known. Note that this is not
-an issue if random of @code{GCRY_VERY_STRONG_RANDOM} quality is
-requested as in this case enough extra entropy gets mixed. It is also
-not an issue when using Linux (rndlinux driver), because this one
-guarantees to read full 16 bytes from /dev/urandom and thus there is no
-way for an attacker without kernel access to control these 16 bytes.
-
-@item GCRYCTL_SET_VERBOSITY; Arguments: int level
-This command sets the verbosity of the logging. A level of 0 disables
-all extra logging whereas positive numbers enable more verbose logging.
-The level may be changed at any time but be aware that no memory
-synchronization is done so the effect of this command might not
-immediately show up in other threads. This command may even be used
-prior to @code{gcry_check_version}.
-
-@item GCRYCTL_SET_DEBUG_FLAGS; Arguments: unsigned int flags
-Set the debug flag bits as given by the argument. Be aware that that no
-memory synchronization is done so the effect of this command might not
-immediately show up in other threads. The debug flags are not
-considered part of the API and thus may change without notice. As of
-now bit 0 enables debugging of cipher functions and bit 1 debugging of
-multi-precision-integers. This command may even be used prior to
-@code{gcry_check_version}.
-
-@item GCRYCTL_CLEAR_DEBUG_FLAGS; Arguments: unsigned int flags
-Set the debug flag bits as given by the argument. Be aware that that no
-memory synchronization is done so the effect of this command might not
-immediately show up in other threads. This command may even be used
-prior to @code{gcry_check_version}.
-
-@item GCRYCTL_DISABLE_INTERNAL_LOCKING; Arguments: none
-This command does nothing. It exists only for backward compatibility.
-
-@item GCRYCTL_ANY_INITIALIZATION_P; Arguments: none
-This command returns true if the library has been basically initialized.
-Such a basic initialization happens implicitly with many commands to get
-certain internal subsystems running. The common and suggested way to
-do this basic intialization is by calling gcry_check_version.
-
-@item GCRYCTL_INITIALIZATION_FINISHED; Arguments: none
-This command tells the libray that the application has finished the
-intialization.
-
-@item GCRYCTL_INITIALIZATION_FINISHED_P; Arguments: none
-This command returns true if the command@*
-GCRYCTL_INITIALIZATION_FINISHED has already been run.
-
-@item GCRYCTL_SET_THREAD_CBS; Arguments: struct ath_ops *ath_ops
-This command registers a thread-callback structure.
-@xref{Multi-Threading}.
-
-@item GCRYCTL_FAST_POLL; Arguments: none
-Run a fast random poll.
-
-@item GCRYCTL_SET_RNDEGD_SOCKET; Arguments: const char *filename
-This command may be used to override the default name of the EGD socket
-to connect to. It may be used only during initialization as it is not
-thread safe. Changing the socket name again is not supported. The
-function may return an error if the given filename is too long for a
-local socket name.
-
-EGD is an alternative random gatherer, used only on systems lacking a
-proper random device.
-
-@item GCRYCTL_PRINT_CONFIG; Arguments: FILE *stream
-This command dumps information pertaining to the configuration of the
-library to the given stream. If NULL is given for @var{stream}, the log
-system is used. This command may be used before the intialization has
-been finished but not before a gcry_version_check.
-
-@item GCRYCTL_OPERATIONAL_P; Arguments: none
-This command returns true if the library is in an operational state.
-This information makes only sense in FIPS mode. In contrast to other
-functions, this is a pure test function and won't put the library into
-FIPS mode or change the internal state. This command may be used before
-the intialization has been finished but not before a gcry_version_check.
-
-@item GCRYCTL_FIPS_MODE_P; Arguments: none
-This command returns true if the library is in FIPS mode. Note, that
-this is no indication about the current state of the library. This
-command may be used before the intialization has been finished but not
-before a gcry_version_check. An application may use this command or
-the convenience macro below to check whether FIPS mode is actually
-active.
-
-@deftypefun int gcry_fips_mode_active (void)
-
-Returns true if the FIPS mode is active. Note that this is
-implemented as a macro.
-@end deftypefun
-
-
-
-@item GCRYCTL_FORCE_FIPS_MODE; Arguments: none
-Running this command puts the library into FIPS mode. If the library is
-already in FIPS mode, a self-test is triggered and thus the library will
-be put into operational state. This command may be used before a call
-to gcry_check_version and that is actually the recommended way to let an
-application switch the library into FIPS mode. Note that Libgcrypt will
-reject an attempt to switch to fips mode during or after the intialization.
-
-@item GCRYCTL_SELFTEST; Arguments: none
-This may be used at anytime to have the library run all implemented
-self-tests. It works in standard and in FIPS mode. Returns 0 on
-success or an error code on failure.
-
-
-@end table
-
-@end deftypefun
-
-@node Modules
-@section Modules
-
-Libgcrypt supports the use of `extension modules', which
-implement algorithms in addition to those already built into the library
-directly.
-
-@deftp {Data type} gcry_module_t
-This data type represents a `module'.
-@end deftp
-
-Functions registering modules provided by the user take a `module
-specification structure' as input and return a value of
-@code{gcry_module_t} and an ID that is unique in the modules'
-category. This ID can be used to reference the newly registered
-module. After registering a module successfully, the new functionality
-should be able to be used through the normal functions provided by
-Libgcrypt until it is unregistered again.
-
-@c **********************************************************
-@c ******************* Errors ****************************
-@c **********************************************************
-@node Error Handling
-@section Error Handling
-
-Many functions in Libgcrypt can return an error if they
-fail. For this reason, the application should always catch the error
-condition and take appropriate measures, for example by releasing the
-resources and passing the error up to the caller, or by displaying a
-descriptive message to the user and cancelling the operation.
-
-Some error values do not indicate a system error or an error in the
-operation, but the result of an operation that failed properly. For
-example, if you try to decrypt a tempered message, the decryption will
-fail. Another error value actually means that the end of a data
-buffer or list has been reached. The following descriptions explain
-for many error codes what they mean usually. Some error values have
-specific meanings if returned by a certain functions. Such cases are
-described in the documentation of those functions.
-
-Libgcrypt uses the @code{libgpg-error} library. This allows to share
-the error codes with other components of the GnuPG system, and to pass
-error values transparently from the crypto engine, or some helper
-application of the crypto engine, to the user. This way no
-information is lost. As a consequence, Libgcrypt does not use its own
-identifiers for error codes, but uses those provided by
-@code{libgpg-error}. They usually start with @code{GPG_ERR_}.
-
-However, Libgcrypt does provide aliases for the functions
-defined in libgpg-error, which might be preferred for name space
-consistency.
-
-
-Most functions in Libgcrypt return an error code in the case
-of failure. For this reason, the application should always catch the
-error condition and take appropriate measures, for example by
-releasing the resources and passing the error up to the caller, or by
-displaying a descriptive message to the user and canceling the
-operation.
-
-Some error values do not indicate a system error or an error in the
-operation, but the result of an operation that failed properly.
-
-GnuPG components, including Libgcrypt, use an extra library named
-libgpg-error to provide a common error handling scheme. For more
-information on libgpg-error, see the according manual.
-
-@menu
-* Error Values:: The error value and what it means.
-* Error Sources:: A list of important error sources.
-* Error Codes:: A list of important error codes.
-* Error Strings:: How to get a descriptive string from a value.
-@end menu
-
-
-@node Error Values
-@subsection Error Values
-@cindex error values
-@cindex error codes
-@cindex error sources
-
-@deftp {Data type} {gcry_err_code_t}
-The @code{gcry_err_code_t} type is an alias for the
-@code{libgpg-error} type @code{gpg_err_code_t}. The error code
-indicates the type of an error, or the reason why an operation failed.
-
-A list of important error codes can be found in the next section.
-@end deftp
-
-@deftp {Data type} {gcry_err_source_t}
-The @code{gcry_err_source_t} type is an alias for the
-@code{libgpg-error} type @code{gpg_err_source_t}. The error source
-has not a precisely defined meaning. Sometimes it is the place where
-the error happened, sometimes it is the place where an error was
-encoded into an error value. Usually the error source will give an
-indication to where to look for the problem. This is not always true,
-but it is attempted to achieve this goal.
-
-A list of important error sources can be found in the next section.
-@end deftp
-
-@deftp {Data type} {gcry_error_t}
-The @code{gcry_error_t} type is an alias for the @code{libgpg-error}
-type @code{gpg_error_t}. An error value like this has always two
-components, an error code and an error source. Both together form the
-error value.
-
-Thus, the error value can not be directly compared against an error
-code, but the accessor functions described below must be used.
-However, it is guaranteed that only 0 is used to indicate success
-(@code{GPG_ERR_NO_ERROR}), and that in this case all other parts of
-the error value are set to 0, too.
-
-Note that in Libgcrypt, the error source is used purely for
-diagnostic purposes. Only the error code should be checked to test
-for a certain outcome of a function. The manual only documents the
-error code part of an error value. The error source is left
-unspecified and might be anything.
-@end deftp
-
-@deftypefun {gcry_err_code_t} gcry_err_code (@w{gcry_error_t @var{err}})
-The static inline function @code{gcry_err_code} returns the
-@code{gcry_err_code_t} component of the error value @var{err}. This
-function must be used to extract the error code from an error value in
-order to compare it with the @code{GPG_ERR_*} error code macros.
-@end deftypefun
-
-@deftypefun {gcry_err_source_t} gcry_err_source (@w{gcry_error_t @var{err}})
-The static inline function @code{gcry_err_source} returns the
-@code{gcry_err_source_t} component of the error value @var{err}. This
-function must be used to extract the error source from an error value in
-order to compare it with the @code{GPG_ERR_SOURCE_*} error source macros.
-@end deftypefun
-
-@deftypefun {gcry_error_t} gcry_err_make (@w{gcry_err_source_t @var{source}}, @w{gcry_err_code_t @var{code}})
-The static inline function @code{gcry_err_make} returns the error
-value consisting of the error source @var{source} and the error code
-@var{code}.
-
-This function can be used in callback functions to construct an error
-value to return it to the library.
-@end deftypefun
-
-@deftypefun {gcry_error_t} gcry_error (@w{gcry_err_code_t @var{code}})
-The static inline function @code{gcry_error} returns the error value
-consisting of the default error source and the error code @var{code}.
-
-For @acronym{GCRY} applications, the default error source is
-@code{GPG_ERR_SOURCE_USER_1}. You can define
-@code{GCRY_ERR_SOURCE_DEFAULT} before including @file{gcrypt.h} to
-change this default.
-
-This function can be used in callback functions to construct an error
-value to return it to the library.
-@end deftypefun
-
-The @code{libgpg-error} library provides error codes for all system
-error numbers it knows about. If @var{err} is an unknown error
-number, the error code @code{GPG_ERR_UNKNOWN_ERRNO} is used. The
-following functions can be used to construct error values from system
-errno numbers.
-
-@deftypefun {gcry_error_t} gcry_err_make_from_errno (@w{gcry_err_source_t @var{source}}, @w{int @var{err}})
-The function @code{gcry_err_make_from_errno} is like
-@code{gcry_err_make}, but it takes a system error like @code{errno}
-instead of a @code{gcry_err_code_t} error code.
-@end deftypefun
-
-@deftypefun {gcry_error_t} gcry_error_from_errno (@w{int @var{err}})
-The function @code{gcry_error_from_errno} is like @code{gcry_error},
-but it takes a system error like @code{errno} instead of a
-@code{gcry_err_code_t} error code.
-@end deftypefun
-
-Sometimes you might want to map system error numbers to error codes
-directly, or map an error code representing a system error back to the
-system error number. The following functions can be used to do that.
-
-@deftypefun {gcry_err_code_t} gcry_err_code_from_errno (@w{int @var{err}})
-The function @code{gcry_err_code_from_errno} returns the error code
-for the system error @var{err}. If @var{err} is not a known system
-error, the function returns @code{GPG_ERR_UNKNOWN_ERRNO}.
-@end deftypefun
-
-@deftypefun {int} gcry_err_code_to_errno (@w{gcry_err_code_t @var{err}})
-The function @code{gcry_err_code_to_errno} returns the system error
-for the error code @var{err}. If @var{err} is not an error code
-representing a system error, or if this system error is not defined on
-this system, the function returns @code{0}.
-@end deftypefun
-
-
-@node Error Sources
-@subsection Error Sources
-@cindex error codes, list of
-
-The library @code{libgpg-error} defines an error source for every
-component of the GnuPG system. The error source part of an error
-value is not well defined. As such it is mainly useful to improve the
-diagnostic error message for the user.
-
-If the error code part of an error value is @code{0}, the whole error
-value will be @code{0}. In this case the error source part is of
-course @code{GPG_ERR_SOURCE_UNKNOWN}.
-
-The list of error sources that might occur in applications using
-@acronym{Libgcrypt} is:
-
-@table @code
-@item GPG_ERR_SOURCE_UNKNOWN
-The error source is not known. The value of this error source is
-@code{0}.
-
-@item GPG_ERR_SOURCE_GPGME
-The error source is @acronym{GPGME} itself.
-
-@item GPG_ERR_SOURCE_GPG
-The error source is GnuPG, which is the crypto engine used for the
-OpenPGP protocol.
-
-@item GPG_ERR_SOURCE_GPGSM
-The error source is GPGSM, which is the crypto engine used for the
-OpenPGP protocol.
-
-@item GPG_ERR_SOURCE_GCRYPT
-The error source is @code{libgcrypt}, which is used by crypto engines
-to perform cryptographic operations.
-
-@item GPG_ERR_SOURCE_GPGAGENT
-The error source is @command{gpg-agent}, which is used by crypto
-engines to perform operations with the secret key.
-
-@item GPG_ERR_SOURCE_PINENTRY
-The error source is @command{pinentry}, which is used by
-@command{gpg-agent} to query the passphrase to unlock a secret key.
-
-@item GPG_ERR_SOURCE_SCD
-The error source is the SmartCard Daemon, which is used by
-@command{gpg-agent} to delegate operations with the secret key to a
-SmartCard.
-
-@item GPG_ERR_SOURCE_KEYBOX
-The error source is @code{libkbx}, a library used by the crypto
-engines to manage local keyrings.
-
-@item GPG_ERR_SOURCE_USER_1
-@item GPG_ERR_SOURCE_USER_2
-@item GPG_ERR_SOURCE_USER_3
-@item GPG_ERR_SOURCE_USER_4
-These error sources are not used by any GnuPG component and can be
-used by other software. For example, applications using
-Libgcrypt can use them to mark error values coming from callback
-handlers. Thus @code{GPG_ERR_SOURCE_USER_1} is the default for errors
-created with @code{gcry_error} and @code{gcry_error_from_errno},
-unless you define @code{GCRY_ERR_SOURCE_DEFAULT} before including
-@file{gcrypt.h}.
-@end table
-
-
-@node Error Codes
-@subsection Error Codes
-@cindex error codes, list of
-
-The library @code{libgpg-error} defines many error values. The
-following list includes the most important error codes.
-
-@table @code
-@item GPG_ERR_EOF
-This value indicates the end of a list, buffer or file.
-
-@item GPG_ERR_NO_ERROR
-This value indicates success. The value of this error code is
-@code{0}. Also, it is guaranteed that an error value made from the
-error code @code{0} will be @code{0} itself (as a whole). This means
-that the error source information is lost for this error code,
-however, as this error code indicates that no error occurred, this is
-generally not a problem.
-
-@item GPG_ERR_GENERAL
-This value means that something went wrong, but either there is not
-enough information about the problem to return a more useful error
-value, or there is no separate error value for this type of problem.
-
-@item GPG_ERR_ENOMEM
-This value means that an out-of-memory condition occurred.
-
-@item GPG_ERR_E...
-System errors are mapped to GPG_ERR_EFOO where FOO is the symbol for
-the system error.
-
-@item GPG_ERR_INV_VALUE
-This value means that some user provided data was out of range.
-
-@item GPG_ERR_UNUSABLE_PUBKEY
-This value means that some recipients for a message were invalid.
-
-@item GPG_ERR_UNUSABLE_SECKEY
-This value means that some signers were invalid.
-
-@item GPG_ERR_NO_DATA
-This value means that data was expected where no data was found.
-
-@item GPG_ERR_CONFLICT
-This value means that a conflict of some sort occurred.
-
-@item GPG_ERR_NOT_IMPLEMENTED
-This value indicates that the specific function (or operation) is not
-implemented. This error should never happen. It can only occur if
-you use certain values or configuration options which do not work,
-but for which we think that they should work at some later time.
-
-@item GPG_ERR_DECRYPT_FAILED
-This value indicates that a decryption operation was unsuccessful.
-
-@item GPG_ERR_WRONG_KEY_USAGE
-This value indicates that a key is not used appropriately.
-
-@item GPG_ERR_NO_SECKEY
-This value indicates that no secret key for the user ID is available.
-
-@item GPG_ERR_UNSUPPORTED_ALGORITHM
-This value means a verification failed because the cryptographic
-algorithm is not supported by the crypto backend.
-
-@item GPG_ERR_BAD_SIGNATURE
-This value means a verification failed because the signature is bad.
-
-@item GPG_ERR_NO_PUBKEY
-This value means a verification failed because the public key is not
-available.
-
-@item GPG_ERR_NOT_OPERATIONAL
-This value means that the library is not yet in state which allows to
-use this function. This error code is in particular returned if
-Libgcrypt is operated in FIPS mode and the internal state of the
-library does not yet or not anymore allow the use of a service.
-
-This error code is only available with newer libgpg-error versions, thus
-you might see ``invalid error code'' when passing this to
-@code{gpg_strerror}. The numeric value of this error code is 176.
-
-@item GPG_ERR_USER_1
-@item GPG_ERR_USER_2
-@item ...
-@item GPG_ERR_USER_16
-These error codes are not used by any GnuPG component and can be
-freely used by other software. Applications using Libgcrypt
-might use them to mark specific errors returned by callback handlers
-if no suitable error codes (including the system errors) for these
-errors exist already.
-@end table
-
-
-@node Error Strings
-@subsection Error Strings
-@cindex error values, printing of
-@cindex error codes, printing of
-@cindex error sources, printing of
-@cindex error strings
-
-@deftypefun {const char *} gcry_strerror (@w{gcry_error_t @var{err}})
-The function @code{gcry_strerror} returns a pointer to a statically
-allocated string containing a description of the error code contained
-in the error value @var{err}. This string can be used to output a
-diagnostic message to the user.
-@end deftypefun
-
-
-@deftypefun {const char *} gcry_strsource (@w{gcry_error_t @var{err}})
-The function @code{gcry_strerror} returns a pointer to a statically
-allocated string containing a description of the error source
-contained in the error value @var{err}. This string can be used to
-output a diagnostic message to the user.
-@end deftypefun
-
-The following example illustrates the use of the functions described
-above:
-
-@example
-@{
- gcry_cipher_hd_t handle;
- gcry_error_t err = 0;
-
- err = gcry_cipher_open (&handle, GCRY_CIPHER_AES,
- GCRY_CIPHER_MODE_CBC, 0);
- if (err)
- @{
- fprintf (stderr, "Failure: %s/%s\n",
- gcry_strsource (err),
- gcry_strerror (err));
- @}
-@}
-@end example
-
-@c **********************************************************
-@c ******************* General ****************************
-@c **********************************************************
-@node Handler Functions
-@chapter Handler Functions
-
-Libgcrypt makes it possible to install so called `handler functions',
-which get called by Libgcrypt in case of certain events.
-
-@menu
-* Progress handler:: Using a progress handler function.
-* Allocation handler:: Using special memory allocation functions.
-* Error handler:: Using error handler functions.
-* Logging handler:: Using a special logging function.
-@end menu
-
-@node Progress handler
-@section Progress handler
-
-It is often useful to retrieve some feedback while long running
-operations are performed.
-
-@deftp {Data type} gcry_handler_progress_t
-Progress handler functions have to be of the type
-@code{gcry_handler_progress_t}, which is defined as:
-
-@code{void (*gcry_handler_progress_t) (void *, const char *, int, int, int)}
-@end deftp
-
-The following function may be used to register a handler function for
-this purpose.
-
-@deftypefun void gcry_set_progress_handler (gcry_handler_progress_t @var{cb}, void *@var{cb_data})
-
-This function installs @var{cb} as the `Progress handler' function.
-It may be used only during initialization. @var{cb} must be defined
-as follows:
-
-@example
-void
-my_progress_handler (void *@var{cb_data}, const char *@var{what},
- int @var{printchar}, int @var{current}, int @var{total})
-@{
- /* Do something. */
-@}
-@end example
-
-A description of the arguments of the progress handler function follows.
-
-@table @var
-@item cb_data
-The argument provided in the call to @code{gcry_set_progress_handler}.
-@item what
-A string identifying the type of the progress output. The following
-values for @var{what} are defined:
-
-@table @code
-@item need_entropy
-Not enough entropy is available. @var{total} holds the number of
-required bytes.
-
-@item primegen
-Values for @var{printchar}:
-@table @code
-@item \n
-Prime generated.
-@item !
-Need to refresh the pool of prime numbers.
-@item <, >
-Number of bits adjusted.
-@item ^
-Searching for a generator.
-@item .
-Fermat test on 10 candidates failed.
-@item :
-Restart with a new random value.
-@item +
-Rabin Miller test passed.
-@end table
-
-@end table
-
-@end table
-@end deftypefun
-
-@node Allocation handler
-@section Allocation handler
-
-It is possible to make Libgcrypt use special memory
-allocation functions instead of the built-in ones.
-
-Memory allocation functions are of the following types:
-@deftp {Data type} gcry_handler_alloc_t
-This type is defined as: @code{void *(*gcry_handler_alloc_t) (size_t n)}.
-@end deftp
-@deftp {Data type} gcry_handler_secure_check_t
-This type is defined as: @code{int *(*gcry_handler_secure_check_t) (const void *)}.
-@end deftp
-@deftp {Data type} gcry_handler_realloc_t
-This type is defined as: @code{void *(*gcry_handler_realloc_t) (void *p, size_t n)}.
-@end deftp
-@deftp {Data type} gcry_handler_free_t
-This type is defined as: @code{void *(*gcry_handler_free_t) (void *)}.
-@end deftp
-
-Special memory allocation functions can be installed with the
-following function:
-
-@deftypefun void gcry_set_allocation_handler (gcry_handler_alloc_t @var{func_alloc}, gcry_handler_alloc_t @var{func_alloc_secure}, gcry_handler_secure_check_t @var{func_secure_check}, gcry_handler_realloc_t @var{func_realloc}, gcry_handler_free_t @var{func_free})
-Install the provided functions and use them instead of the built-in
-functions for doing memory allocation. Using this function is in
-general not recommended because the standard Libgcrypt allocation
-functions are guaranteed to zeroize memory if needed.
-
-This function may be used only during initialization and may not be
-used in fips mode.
-
-
-@end deftypefun
-
-@node Error handler
-@section Error handler
-
-The following functions may be used to register handler functions that
-are called by Libgcrypt in case certain error conditions occur. They
-may and should be registered prior to calling @code{gcry_check_version}.
-
-@deftp {Data type} gcry_handler_no_mem_t
-This type is defined as: @code{int (*gcry_handler_no_mem_t) (void *, size_t, unsigned int)}
-@end deftp
-@deftypefun void gcry_set_outofcore_handler (gcry_handler_no_mem_t @var{func_no_mem}, void *@var{cb_data})
-This function registers @var{func_no_mem} as `out-of-core handler',
-which means that it will be called in the case of not having enough
-memory available. The handler is called with 3 arguments: The first
-one is the pointer @var{cb_data} as set with this function, the second
-is the requested memory size and the last being a flag. If bit 0 of
-the flag is set, secure memory has been requested. The handler should
-either return true to indicate that Libgcrypt should try again
-allocating memory or return false to let Libgcrypt use its default
-fatal error handler.
-@end deftypefun
-
-@deftp {Data type} gcry_handler_error_t
-This type is defined as: @code{void (*gcry_handler_error_t) (void *, int, const char *)}
-@end deftp
-
-@deftypefun void gcry_set_fatalerror_handler (gcry_handler_error_t @var{func_error}, void *@var{cb_data})
-This function registers @var{func_error} as `error handler',
-which means that it will be called in error conditions.
-@end deftypefun
-
-@node Logging handler
-@section Logging handler
-
-@deftp {Data type} gcry_handler_log_t
-This type is defined as: @code{void (*gcry_handler_log_t) (void *, int, const char *, va_list)}
-@end deftp
-
-@deftypefun void gcry_set_log_handler (gcry_handler_log_t @var{func_log}, void *@var{cb_data})
-This function registers @var{func_log} as `logging handler', which means
-that it will be called in case Libgcrypt wants to log a message. This
-function may and should be used prior to calling
-@code{gcry_check_version}.
-@end deftypefun
-
-@c **********************************************************
-@c ******************* Ciphers ****************************
-@c **********************************************************
-@c @include cipher-ref.texi
-@node Symmetric cryptography
-@chapter Symmetric cryptography
-
-The cipher functions are used for symmetrical cryptography,
-i.e. cryptography using a shared key. The programming model follows
-an open/process/close paradigm and is in that similar to other
-building blocks provided by Libgcrypt.
-
-@menu
-* Available ciphers:: List of ciphers supported by the library.
-* Cipher modules:: How to work with cipher modules.
-* Available cipher modes:: List of cipher modes supported by the library.
-* Working with cipher handles:: How to perform operations related to cipher handles.
-* General cipher functions:: General cipher functions independent of cipher handles.
-@end menu
-
-@node Available ciphers
-@section Available ciphers
-
-@table @code
-@item GCRY_CIPHER_NONE
-This is not a real algorithm but used by some functions as error return.
-The value always evaluates to false.
-
-@item GCRY_CIPHER_IDEA
-@cindex IDEA
-This is the IDEA algorithm. The constant is provided but there is
-currently no implementation for it because the algorithm is patented.
-
-@item GCRY_CIPHER_3DES
-@cindex 3DES
-@cindex Triple-DES
-@cindex DES-EDE
-@cindex Digital Encryption Standard
-Triple-DES with 3 Keys as EDE. The key size of this algorithm is 168 but
-you have to pass 192 bits because the most significant bits of each byte
-are ignored.
-
-@item GCRY_CIPHER_CAST5
-@cindex CAST5
-CAST128-5 block cipher algorithm. The key size is 128 bits.
-
-@item GCRY_CIPHER_BLOWFISH
-@cindex Blowfish
-The blowfish algorithm. The current implementation allows only for a key
-size of 128 bits.
-
-@item GCRY_CIPHER_SAFER_SK128
-Reserved and not currently implemented.
-
-@item GCRY_CIPHER_DES_SK
-Reserved and not currently implemented.
-
-@item GCRY_CIPHER_AES
-@itemx GCRY_CIPHER_AES128
-@itemx GCRY_CIPHER_RIJNDAEL
-@itemx GCRY_CIPHER_RIJNDAEL128
-@cindex Rijndael
-@cindex AES
-@cindex Advanced Encryption Standard
-AES (Rijndael) with a 128 bit key.
-
-@item GCRY_CIPHER_AES192
-@itemx GCRY_CIPHER_RIJNDAEL192
-AES (Rijndael) with a 192 bit key.
-
-@item GCRY_CIPHER_AES256
-@itemx GCRY_CIPHER_RIJNDAEL256
-AES (Rijndael) with a 256 bit key.
-
-@item GCRY_CIPHER_TWOFISH
-@cindex Twofish
-The Twofish algorithm with a 256 bit key.
-
-@item GCRY_CIPHER_TWOFISH128
-The Twofish algorithm with a 128 bit key.
-
-@item GCRY_CIPHER_ARCFOUR
-@cindex Arcfour
-@cindex RC4
-An algorithm which is 100% compatible with RSA Inc.'s RC4 algorithm.
-Note that this is a stream cipher and must be used very carefully to
-avoid a couple of weaknesses.
-
-@item GCRY_CIPHER_DES
-@cindex DES
-Standard DES with a 56 bit key. You need to pass 64 bit but the high
-bits of each byte are ignored. Note, that this is a weak algorithm
-which can be broken in reasonable time using a brute force approach.
-
-@item GCRY_CIPHER_SERPENT128
-@itemx GCRY_CIPHER_SERPENT192
-@itemx GCRY_CIPHER_SERPENT256
-@cindex Serpent
-The Serpent cipher from the AES contest.
-
-@item GCRY_CIPHER_RFC2268_40
-@itemx GCRY_CIPHER_RFC2268_128
-@cindex rfc-2268
-@cindex RC2
-Ron's Cipher 2 in the 40 and 128 bit variants. Note, that we currently
-only support the 40 bit variant. The identifier for 128 is reserved for
-future use.
-
-@item GCRY_CIPHER_SEED
-@cindex Seed (cipher)
-A 128 bit cipher as described by RFC4269.
-
-@item GCRY_CIPHER_CAMELLIA128
-@itemx GCRY_CIPHER_CAMELLIA192
-@itemx GCRY_CIPHER_CAMELLIA256
-@cindex Camellia
-The Camellia cipher by NTT. See
-@uref{http://info.isl.ntt.co.jp/@/crypt/@/eng/@/camellia/@/specifications.html}.
-
-@end table
-
-@node Cipher modules
-@section Cipher modules
-
-Libgcrypt makes it possible to load additional `cipher modules'; these
-ciphers can be used just like the cipher algorithms that are built
-into the library directly. For an introduction into extension
-modules, see @xref{Modules}.
-
-@deftp {Data type} gcry_cipher_spec_t
-This is the `module specification structure' needed for registering
-cipher modules, which has to be filled in by the user before it can be
-used to register a module. It contains the following members:
-
-@table @code
-@item const char *name
-The primary name of the algorithm.
-@item const char **aliases
-A list of strings that are `aliases' for the algorithm. The list must
-be terminated with a NULL element.
-@item gcry_cipher_oid_spec_t *oids
-A list of OIDs that are to be associated with the algorithm. The
-list's last element must have it's `oid' member set to NULL. See
-below for an explanation of this type.
-@item size_t blocksize
-The block size of the algorithm, in bytes.
-@item size_t keylen
-The length of the key, in bits.
-@item size_t contextsize
-The size of the algorithm-specific `context', that should be allocated
-for each handle.
-@item gcry_cipher_setkey_t setkey
-The function responsible for initializing a handle with a provided
-key. See below for a description of this type.
-@item gcry_cipher_encrypt_t encrypt
-The function responsible for encrypting a single block. See below for
-a description of this type.
-@item gcry_cipher_decrypt_t decrypt
-The function responsible for decrypting a single block. See below for
-a description of this type.
-@item gcry_cipher_stencrypt_t stencrypt
-Like `encrypt', for stream ciphers. See below for a description of
-this type.
-@item gcry_cipher_stdecrypt_t stdecrypt
-Like `decrypt', for stream ciphers. See below for a description of
-this type.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_cipher_oid_spec_t
-This type is used for associating a user-provided algorithm
-implementation with certain OIDs. It contains the following members:
-@table @code
-@item const char *oid
-Textual representation of the OID.
-@item int mode
-Cipher mode for which this OID is valid.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_cipher_setkey_t
-Type for the `setkey' function, defined as: gcry_err_code_t
-(*gcry_cipher_setkey_t) (void *c, const unsigned char *key, unsigned
-keylen)
-@end deftp
-
-@deftp {Data type} gcry_cipher_encrypt_t
-Type for the `encrypt' function, defined as: gcry_err_code_t
-(*gcry_cipher_encrypt_t) (void *c, const unsigned char *outbuf, const
-unsigned char *inbuf)
-@end deftp
-
-@deftp {Data type} gcry_cipher_decrypt_t
-Type for the `decrypt' function, defined as: gcry_err_code_t
-(*gcry_cipher_decrypt_t) (void *c, const unsigned char *outbuf, const
-unsigned char *inbuf)
-@end deftp
-
-@deftp {Data type} gcry_cipher_stencrypt_t
-Type for the `stencrypt' function, defined as: gcry_err_code_t
-(*gcry_@/cipher_@/stencrypt_@/t) (void *c, const unsigned char *outbuf, const
-unsigned char *, unsigned int n)
-@end deftp
-
-@deftp {Data type} gcry_cipher_stdecrypt_t
-Type for the `stdecrypt' function, defined as: gcry_err_code_t
-(*gcry_@/cipher_@/stdecrypt_@/t) (void *c, const unsigned char *outbuf, const
-unsigned char *, unsigned int n)
-@end deftp
-
-@deftypefun gcry_error_t gcry_cipher_register (gcry_cipher_spec_t *@var{cipher}, unsigned int *algorithm_id, gcry_module_t *@var{module})
-
-Register a new cipher module whose specification can be found in
-@var{cipher}. On success, a new algorithm ID is stored in
-@var{algorithm_id} and a pointer representing this module is stored
-in @var{module}.
-@end deftypefun
-
-@deftypefun void gcry_cipher_unregister (gcry_module_t @var{module})
-Unregister the cipher identified by @var{module}, which must have been
-registered with gcry_cipher_register.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_cipher_list (int *@var{list}, int *@var{list_length})
-Get a list consisting of the IDs of the loaded cipher modules. If
-@var{list} is zero, write the number of loaded cipher modules to
-@var{list_length} and return. If @var{list} is non-zero, the first
-*@var{list_length} algorithm IDs are stored in @var{list}, which must
-be of according size. In case there are less cipher modules than
-*@var{list_length}, *@var{list_length} is updated to the correct
-number.
-@end deftypefun
-
-@node Available cipher modes
-@section Available cipher modes
-
-@table @code
-@item GCRY_CIPHER_MODE_NONE
-No mode specified. This should not be used. The only exception is that
-if Libgcrypt is not used in FIPS mode and if any debug flag has been
-set, this mode may be used to bypass the actual encryption.
-
-@item GCRY_CIPHER_MODE_ECB
-@cindex ECB, Electronic Codebook mode
-Electronic Codebook mode.
-
-@item GCRY_CIPHER_MODE_CFB
-@cindex CFB, Cipher Feedback mode
-Cipher Feedback mode. The shift size equals the block size of the
-cipher (e.g. for AES it is CFB-128).
-
-@item GCRY_CIPHER_MODE_CBC
-@cindex CBC, Cipher Block Chaining mode
-Cipher Block Chaining mode.
-
-@item GCRY_CIPHER_MODE_STREAM
-Stream mode, only to be used with stream cipher algorithms.
-
-@item GCRY_CIPHER_MODE_OFB
-@cindex OFB, Output Feedback mode
-Output Feedback mode.
-
-@item GCRY_CIPHER_MODE_CTR
-@cindex CTR, Counter mode
-Counter mode.
-
-@end table
-
-@node Working with cipher handles
-@section Working with cipher handles
-
-To use a cipher algorithm, you must first allocate an according
-handle. This is to be done using the open function:
-
-@deftypefun gcry_error_t gcry_cipher_open (gcry_cipher_hd_t *@var{hd}, int @var{algo}, int @var{mode}, unsigned int @var{flags})
-
-This function creates the context handle required for most of the
-other cipher functions and returns a handle to it in `hd'. In case of
-an error, an according error code is returned.
-
-The ID of algorithm to use must be specified via @var{algo}. See
-@xref{Available ciphers}, for a list of supported ciphers and the
-according constants.
-
-Besides using the constants directly, the function
-@code{gcry_cipher_map_name} may be used to convert the textual name of
-an algorithm into the according numeric ID.
-
-The cipher mode to use must be specified via @var{mode}. See
-@xref{Available cipher modes}, for a list of supported cipher modes
-and the according constants. Note that some modes are incompatible
-with some algorithms - in particular, stream mode
-(@code{GCRY_CIPHER_MODE_STREAM}) only works with stream ciphers. Any
-block cipher mode (@code{GCRY_CIPHER_MODE_ECB},
-@code{GCRY_CIPHER_MODE_CBC}, @code{GCRY_CIPHER_MODE_CFB},
-@code{GCRY_CIPHER_MODE_OFB} or @code{GCRY_CIPHER_MODE_CTR}) will work
-with any block cipher algorithm.
-
-The third argument @var{flags} can either be passed as @code{0} or as
-the bit-wise OR of the following constants.
-
-@table @code
-@item GCRY_CIPHER_SECURE
-Make sure that all operations are allocated in secure memory. This is
-useful when the key material is highly confidential.
-@item GCRY_CIPHER_ENABLE_SYNC
-@cindex sync mode (OpenPGP)
-This flag enables the CFB sync mode, which is a special feature of
-Libgcrypt's CFB mode implementation to allow for OpenPGP's CFB variant.
-See @code{gcry_cipher_sync}.
-@item GCRY_CIPHER_CBC_CTS
-@cindex cipher text stealing
-Enable cipher text stealing (CTS) for the CBC mode. Cannot be used
-simultaneous as GCRY_CIPHER_CBC_MAC. CTS mode makes it possible to
-transform data of almost arbitrary size (only limitation is that it
-must be greater than the algorithm's block size).
-@item GCRY_CIPHER_CBC_MAC
-@cindex CBC-MAC
-Compute CBC-MAC keyed checksums. This is the same as CBC mode, but
-only output the last block. Cannot be used simultaneous as
-GCRY_CIPHER_CBC_CTS.
-@end table
-@end deftypefun
-
-Use the following function to release an existing handle:
-
-@deftypefun void gcry_cipher_close (gcry_cipher_hd_t @var{h})
-
-This function releases the context created by @code{gcry_cipher_open}.
-It also zeroises all sensitive information associated with this cipher
-handle.
-@end deftypefun
-
-In order to use a handle for performing cryptographic operations, a
-`key' has to be set first:
-
-@deftypefun gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t @var{h}, const void *@var{k}, size_t @var{l})
-
-Set the key @var{k} used for encryption or decryption in the context
-denoted by the handle @var{h}. The length @var{l} (in bytes) of the
-key @var{k} must match the required length of the algorithm set for
-this context or be in the allowed range for algorithms with variable
-key size. The function checks this and returns an error if there is a
-problem. A caller should always check for an error.
-
-@end deftypefun
-
-Most crypto modes requires an initialization vector (IV), which
-usually is a non-secret random string acting as a kind of salt value.
-The CTR mode requires a counter, which is also similar to a salt
-value. To set the IV or CTR, use these functions:
-
-@deftypefun gcry_error_t gcry_cipher_setiv (gcry_cipher_hd_t @var{h}, const void *@var{k}, size_t @var{l})
-
-Set the initialization vector used for encryption or decryption. The
-vector is passed as the buffer @var{K} of length @var{l} bytes and
-copied to internal data structures. The function checks that the IV
-matches the requirement of the selected algorithm and mode.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_cipher_setctr (gcry_cipher_hd_t @var{h}, const void *@var{c}, size_t @var{l})
-
-Set the counter vector used for encryption or decryption. The counter
-is passed as the buffer @var{c} of length @var{l} bytes and copied to
-internal data structures. The function checks that the counter
-matches the requirement of the selected algorithm (i.e., it must be
-the same size as the block size).
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_cipher_reset (gcry_cipher_hd_t @var{h})
-
-Set the given handle's context back to the state it had after the last
-call to gcry_cipher_setkey and clear the initialization vector.
-
-Note that gcry_cipher_reset is implemented as a macro.
-@end deftypefun
-
-The actual encryption and decryption is done by using one of the
-following functions. They may be used as often as required to process
-all the data.
-
-@deftypefun gcry_error_t gcry_cipher_encrypt (gcry_cipher_hd_t @var{h}, unsigned char *{out}, size_t @var{outsize}, const unsigned char *@var{in}, size_t @var{inlen})
-
-@code{gcry_cipher_encrypt} is used to encrypt the data. This function
-can either work in place or with two buffers. It uses the cipher
-context already setup and described by the handle @var{h}. There are 2
-ways to use the function: If @var{in} is passed as @code{NULL} and
-@var{inlen} is @code{0}, in-place encryption of the data in @var{out} or
-length @var{outsize} takes place. With @var{in} being not @code{NULL},
-@var{inlen} bytes are encrypted to the buffer @var{out} which must have
-at least a size of @var{inlen}. @var{outsize} must be set to the
-allocated size of @var{out}, so that the function can check that there
-is sufficient space. Note that overlapping buffers are not allowed.
-
-Depending on the selected algorithms and encryption mode, the length of
-the buffers must be a multiple of the block size.
-
-The function returns @code{0} on success or an error code.
-@end deftypefun
-
-
-@deftypefun gcry_error_t gcry_cipher_decrypt (gcry_cipher_hd_t @var{h}, unsigned char *{out}, size_t @var{outsize}, const unsigned char *@var{in}, size_t @var{inlen})
-
-@code{gcry_cipher_decrypt} is used to decrypt the data. This function
-can either work in place or with two buffers. It uses the cipher
-context already setup and described by the handle @var{h}. There are 2
-ways to use the function: If @var{in} is passed as @code{NULL} and
-@var{inlen} is @code{0}, in-place decryption of the data in @var{out} or
-length @var{outsize} takes place. With @var{in} being not @code{NULL},
-@var{inlen} bytes are decrypted to the buffer @var{out} which must have
-at least a size of @var{inlen}. @var{outsize} must be set to the
-allocated size of @var{out}, so that the function can check that there
-is sufficient space. Note that overlapping buffers are not allowed.
-
-Depending on the selected algorithms and encryption mode, the length of
-the buffers must be a multiple of the block size.
-
-The function returns @code{0} on success or an error code.
-@end deftypefun
-
-
-OpenPGP (as defined in RFC-2440) requires a special sync operation in
-some places. The following function is used for this:
-
-@deftypefun gcry_error_t gcry_cipher_sync (gcry_cipher_hd_t @var{h})
-
-Perform the OpenPGP sync operation on context @var{h}. Note that this
-is a no-op unless the context was created with the flag
-@code{GCRY_CIPHER_ENABLE_SYNC}
-@end deftypefun
-
-Some of the described functions are implemented as macros utilizing a
-catch-all control function. This control function is rarely used
-directly but there is nothing which would inhibit it:
-
-@deftypefun gcry_error_t gcry_cipher_ctl (gcry_cipher_hd_t @var{h}, int @var{cmd}, void *@var{buffer}, size_t @var{buflen})
-
-@code{gcry_cipher_ctl} controls various aspects of the cipher module and
-specific cipher contexts. Usually some more specialized functions or
-macros are used for this purpose. The semantics of the function and its
-parameters depends on the the command @var{cmd} and the passed context
-handle @var{h}. Please see the comments in the source code
-(@code{src/global.c}) for details.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_cipher_info (gcry_cipher_hd_t @var{h}, int @var{what}, void *@var{buffer}, size_t *@var{nbytes})
-
-@code{gcry_cipher_info} is used to retrieve various
-information about a cipher context or the cipher module in general.
-
-Currently no information is available.
-@end deftypefun
-
-@node General cipher functions
-@section General cipher functions
-
-To work with the algorithms, several functions are available to map
-algorithm names to the internal identifiers, as well as ways to
-retrieve information about an algorithm or the current cipher context.
-
-@deftypefun gcry_error_t gcry_cipher_algo_info (int @var{algo}, int @var{what}, void *@var{buffer}, size_t *@var{nbytes})
-
-This function is used to retrieve information on a specific algorithm.
-You pass the cipher algorithm ID as @var{algo} and the type of
-information requested as @var{what}. The result is either returned as
-the return code of the function or copied to the provided @var{buffer}
-whose allocated length must be available in an integer variable with the
-address passed in @var{nbytes}. This variable will also receive the
-actual used length of the buffer.
-
-Here is a list of supported codes for @var{what}:
-
-@c begin constants for gcry_cipher_algo_info
-@table @code
-@item GCRYCTL_GET_KEYLEN:
-Return the length of the key. If the algorithm supports multiple key
-lengths, the maximum supported value is returned. The length is
-returned as number of octets (bytes) and not as number of bits in
-@var{nbytes}; @var{buffer} must be zero.
-
-@item GCRYCTL_GET_BLKLEN:
-Return the block length of the algorithm. The length is returned as a
-number of octets in @var{nbytes}; @var{buffer} must be zero.
-
-@item GCRYCTL_TEST_ALGO:
-Returns @code{0} when the specified algorithm is available for use.
-@var{buffer} and @var{nbytes} must be zero.
-
-@end table
-@c end constants for gcry_cipher_algo_info
-
-@end deftypefun
-@c end gcry_cipher_algo_info
-
-@deftypefun {const char *} gcry_cipher_algo_name (int @var{algo})
-
-@code{gcry_cipher_algo_name} returns a string with the name of the
-cipher algorithm @var{algo}. If the algorithm is not known or another
-error occurred, the string @code{"?"} is returned. This function should
-not be used to test for the availability of an algorithm.
-@end deftypefun
-
-@deftypefun int gcry_cipher_map_name (const char *@var{name})
-
-@code{gcry_cipher_map_name} returns the algorithm identifier for the
-cipher algorithm described by the string @var{name}. If this algorithm
-is not available @code{0} is returned.
-@end deftypefun
-
-@deftypefun int gcry_cipher_mode_from_oid (const char *@var{string})
-
-Return the cipher mode associated with an @acronym{ASN.1} object
-identifier. The object identifier is expected to be in the
-@acronym{IETF}-style dotted decimal notation. The function returns
-@code{0} for an unknown object identifier or when no mode is associated
-with it.
-@end deftypefun
-
-
-@c **********************************************************
-@c ******************* Public Key *************************
-@c **********************************************************
-@node Public Key cryptography
-@chapter Public Key cryptography
-
-Public key cryptography, also known as asymmetric cryptography, is an
-easy way for key management and to provide digital signatures.
-Libgcrypt provides two completely different interfaces to
-public key cryptography, this chapter explains the one based on
-S-expressions.
-
-@menu
-* Available algorithms:: Algorithms supported by the library.
-* Used S-expressions:: Introduction into the used S-expression.
-* Public key modules:: How to work with public key modules.
-* Cryptographic Functions:: Functions for performing the cryptographic actions.
-* General public-key related Functions:: General functions, not implementing any cryptography.
-
-* AC Interface:: Alternative interface to public key functions.
-@end menu
-
-@node Available algorithms
-@section Available algorithms
-
-Libgcrypt supports the RSA (Rivest-Shamir-Adleman) algorithms as well
-as DSA (Digital Signature Algorithm) and Elgamal. The versatile
-interface allows to add more algorithms in the future.
-
-@node Used S-expressions
-@section Used S-expressions
-
-Libgcrypt's API for asymmetric cryptography is based on data structures
-called S-expressions (see
-@uref{http://people.csail.mit.edu/@/rivest/@/sexp.html}) and does not work
-with contexts as most of the other building blocks of Libgcrypt do.
-
-@noindent
-The following information are stored in S-expressions:
-
-@itemize @asis
-@item keys
-
-@item plain text data
-
-@item encrypted data
-
-@item signatures
-
-@end itemize
-
-@noindent
-To describe how Libgcrypt expect keys, we use examples. Note that
-words in
-@ifnottex
-uppercase
-@end ifnottex
-@iftex
-italics
-@end iftex
-indicate parameters whereas lowercase words are literals.
-
-Note that all MPI (multi-precision-integers) values are expected to be in
-@code{GCRYMPI_FMT_USG} format. An easy way to create S-expressions is
-by using @code{gcry_sexp_build} which allows to pass a string with
-printf-like escapes to insert MPI values.
-
-@menu
-* RSA key parameters:: Parameters used with an RSA key.
-* DSA key parameters:: Parameters used with a DSA key.
-* ECC key parameters:: Parameters used with ECC keys.
-@end menu
-
-@node RSA key parameters
-@subsection RSA key parameters
-
-@noindent
-An RSA private key is described by this S-expression:
-
-@example
-(private-key
- (rsa
- (n @var{n-mpi})
- (e @var{e-mpi})
- (d @var{d-mpi})
- (p @var{p-mpi})
- (q @var{q-mpi})
- (u @var{u-mpi})))
-@end example
-
-@noindent
-An RSA public key is described by this S-expression:
-
-@example
-(public-key
- (rsa
- (n @var{n-mpi})
- (e @var{e-mpi})))
-@end example
-
-
-@table @var
-@item n-mpi
-RSA public modulus @math{n}.
-@item e-mpi
-RSA public exponent @math{e}.
-@item d-mpi
-RSA secret exponent @math{d = e^{-1} \bmod (p-1)(q-1)}.
-@item p-mpi
-RSA secret prime @math{p}.
-@item q-mpi
-RSA secret prime @math{q} with @math{p < q}.
-@item u-mpi
-Multiplicative inverse @math{u = p^{-1} \bmod q}.
-@end table
-
-For signing and decryption the parameters @math{(p, q, u)} are optional
-but greatly improve the performance. Either all of these optional
-parameters must be given or none of them. They are mandatory for
-gcry_pk_testkey.
-
-Note that OpenSSL uses slighly different parameters: @math{q < p} and
- @math{u = q^{-1} \bmod p}. To use these parameters you will need to
-swap the values and recompute @math{u}. Here is example code to do this:
-
-@example
- if (gcry_mpi_cmp (p, q) > 0)
- @{
- gcry_mpi_swap (p, q);
- gcry_mpi_invm (u, p, q);
- @}
-@end example
-
-
-
-
-@node DSA key parameters
-@subsection DSA key parameters
-
-@noindent
-A DSA private key is described by this S-expression:
-
-@example
-(private-key
- (dsa
- (p @var{p-mpi})
- (q @var{q-mpi})
- (g @var{g-mpi})
- (y @var{y-mpi})
- (x @var{x-mpi})))
-@end example
-
-@table @var
-@item p-mpi
-DSA prime @math{p}.
-@item q-mpi
-DSA group order @math{q} (which is a prime divisor of @math{p-1}).
-@item g-mpi
-DSA group generator @math{g}.
-@item y-mpi
-DSA public key value @math{y = g^x \bmod p}.
-@item x-mpi
-DSA secret exponent x.
-@end table
-
-The public key is similar with "private-key" replaced by "public-key"
-and no @var{x-mpi}.
-
-
-@node ECC key parameters
-@subsection ECC key parameters
-
-@noindent
-An ECC private key is described by this S-expression:
-
-@example
-(private-key
- (ecc
- (p @var{p-mpi})
- (a @var{a-mpi})
- (b @var{b-mpi})
- (g @var{g-point})
- (n @var{n-mpi})
- (q @var{q-point})
- (d @var{d-mpi})))
-@end example
-
-@table @var
-@item p-mpi
-Prime specifying the field @math{GF(p)}.
-@item a-mpi
-@itemx b-mpi
-The two coefficients of the Weierstrass equation @math{y^2 = x^3 + ax + b}
-@item g-point
-Base point @math{g}.
-@item n-mpi
-Order of @math{g}
-@item q-point
-The point representing the public key @math{Q = dP}.
-@item d-mpi
-The private key @math{d}
-@end table
-
-All point values are encoded in standard format; Libgcrypt does
-currently only support uncompressed points, thus the first byte needs to
-be @code{0x04}.
-
-The public key is similar with "private-key" replaced by "public-key"
-and no @var{d-mpi}.
-
-If the domain parameters are well-known, the name of this curve may be
-used. For example
-
-@example
-(private-key
- (ecc
- (curve "NIST P-192")
- (q @var{q-point})
- (d @var{d-mpi})))
-@end example
-
-The @code{curve} parameter may be given in any case and is used to replace
-missing parameters.
-
-@noindent
-Currently implemented curves are:
-@table @code
-@item NIST P-192
-@itemx 1.2.840.10045.3.1.1
-@itemx prime192v1
-@itemx secp192r1
-The NIST 192 bit curve, its OID, X9.62 and SECP aliases.
-
-@item NIST P-224
-@itemx secp224r1
-The NIST 224 bit curve and its SECP alias.
-
-@item NIST P-256
-@itemx 1.2.840.10045.3.1.7
-@itemx prime256v1
-@itemx secp256r1
-The NIST 256 bit curve, its OID, X9.62 and SECP aliases.
-
-@item NIST P-384
-@itemx secp384r1
-The NIST 384 bit curve and its SECP alias.
-
-@item NIST P-521
-@itemx secp521r1
-The NIST 521 bit curve and its SECP alias.
-
-@end table
-As usual the OIDs may optionally be prefixed with the string @code{OID.}
-or @code{oid.}.
-
-
-
-@node Public key modules
-@section Public key modules
-
-Libgcrypt makes it possible to load additional `public key
-modules'; these public key algorithms can be used just like the
-algorithms that are built into the library directly. For an
-introduction into extension modules, see @xref{Modules}.
-
-@deftp {Data type} gcry_pk_spec_t
-This is the `module specification structure' needed for registering
-public key modules, which has to be filled in by the user before it
-can be used to register a module. It contains the following members:
-
-@table @code
-@item const char *name
-The primary name of this algorithm.
-@item char **aliases
-A list of strings that are `aliases' for the algorithm. The list
-must be terminated with a NULL element.
-@item const char *elements_pkey
-String containing the one-letter names of the MPI values contained in
-a public key.
-@item const char *element_skey
-String containing the one-letter names of the MPI values contained in
-a secret key.
-@item const char *elements_enc
-String containing the one-letter names of the MPI values that are the
-result of an encryption operation using this algorithm.
-@item const char *elements_sig
-String containing the one-letter names of the MPI values that are the
-result of a sign operation using this algorithm.
-@item const char *elements_grip
-String containing the one-letter names of the MPI values that are to
-be included in the `key grip'.
-@item int use
-The bitwise-OR of the following flags, depending on the abilities of
-the algorithm:
-@table @code
-@item GCRY_PK_USAGE_SIGN
-The algorithm supports signing and verifying of data.
-@item GCRY_PK_USAGE_ENCR
-The algorithm supports the encryption and decryption of data.
-@end table
-@item gcry_pk_generate_t generate
-The function responsible for generating a new key pair. See below for
-a description of this type.
-@item gcry_pk_check_secret_key_t check_secret_key
-The function responsible for checking the sanity of a provided secret
-key. See below for a description of this type.
-@item gcry_pk_encrypt_t encrypt
-The function responsible for encrypting data. See below for a
-description of this type.
-@item gcry_pk_decrypt_t decrypt
-The function responsible for decrypting data. See below for a
-description of this type.
-@item gcry_pk_sign_t sign
-The function responsible for signing data. See below for a description
-of this type.
-@item gcry_pk_verify_t verify
-The function responsible for verifying that the provided signature
-matches the provided data. See below for a description of this type.
-@item gcry_pk_get_nbits_t get_nbits
-The function responsible for returning the number of bits of a provided
-key. See below for a description of this type.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_pk_generate_t
-Type for the `generate' function, defined as: gcry_err_code_t
-(*gcry_pk_generate_t) (int algo, unsigned int nbits, unsigned long
-use_e, gcry_mpi_t *skey, gcry_mpi_t **retfactors)
-@end deftp
-
-@deftp {Data type} gcry_pk_check_secret_key_t
-Type for the `check_secret_key' function, defined as: gcry_err_code_t
-(*gcry_pk_check_secret_key_t) (int algo, gcry_mpi_t *skey)
-@end deftp
-
-@deftp {Data type} gcry_pk_encrypt_t
-Type for the `encrypt' function, defined as: gcry_err_code_t
-(*gcry_pk_encrypt_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t data,
-gcry_mpi_t *pkey, int flags)
-@end deftp
-
-@deftp {Data type} gcry_pk_decrypt_t
-Type for the `decrypt' function, defined as: gcry_err_code_t
-(*gcry_pk_decrypt_t) (int algo, gcry_mpi_t *result, gcry_mpi_t *data,
-gcry_mpi_t *skey, int flags)
-@end deftp
-
-@deftp {Data type} gcry_pk_sign_t
-Type for the `sign' function, defined as: gcry_err_code_t
-(*gcry_pk_sign_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t data,
-gcry_mpi_t *skey)
-@end deftp
-
-@deftp {Data type} gcry_pk_verify_t
-Type for the `verify' function, defined as: gcry_err_code_t
-(*gcry_pk_verify_t) (int algo, gcry_mpi_t hash, gcry_mpi_t *data,
-gcry_mpi_t *pkey, int (*cmp) (void *, gcry_mpi_t), void *opaquev)
-@end deftp
-
-@deftp {Data type} gcry_pk_get_nbits_t
-Type for the `get_nbits' function, defined as: unsigned
-(*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey)
-@end deftp
-
-@deftypefun gcry_error_t gcry_pk_register (gcry_pk_spec_t *@var{pubkey}, unsigned int *algorithm_id, gcry_module_t *@var{module})
-
-Register a new public key module whose specification can be found in
-@var{pubkey}. On success, a new algorithm ID is stored in
-@var{algorithm_id} and a pointer representing this module is stored
-in @var{module}.
-@end deftypefun
-
-@deftypefun void gcry_pk_unregister (gcry_module_t @var{module})
-Unregister the public key module identified by @var{module}, which
-must have been registered with gcry_pk_register.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_pk_list (int *@var{list}, int *@var{list_length})
-Get a list consisting of the IDs of the loaded pubkey modules. If
-@var{list} is zero, write the number of loaded pubkey modules to
-@var{list_length} and return. If @var{list} is non-zero, the first
-*@var{list_length} algorithm IDs are stored in @var{list}, which must
-be of according size. In case there are less pubkey modules than
-*@var{list_length}, *@var{list_length} is updated to the correct
-number.
-@end deftypefun
-
-@node Cryptographic Functions
-@section Cryptographic Functions
-
-@noindent
-Note that we will in future allow to use keys without p,q and u
-specified and may also support other parameters for performance
-reasons.
-
-@noindent
-
-Some functions operating on S-expressions support `flags', that
-influence the operation. These flags have to be listed in a
-sub-S-expression named `flags'; the following flags are known:
-
-@table @code
-@item pkcs1
-Use PKCS#1 block type 2 padding.
-@item no-blinding
-Do not use a technique called `blinding', which is used by default in
-order to prevent leaking of secret information. Blinding is only
-implemented by RSA, but it might be implemented by other algorithms in
-the future as well, when necessary.
-@end table
-
-@noindent
-Now that we know the key basics, we can carry on and explain how to
-encrypt and decrypt data. In almost all cases the data is a random
-session key which is in turn used for the actual encryption of the real
-data. There are 2 functions to do this:
-
-@deftypefun gcry_error_t gcry_pk_encrypt (@w{gcry_sexp_t *@var{r_ciph},} @w{gcry_sexp_t @var{data},} @w{gcry_sexp_t @var{pkey}})
-
-Obviously a public key must be provided for encryption. It is
-expected as an appropriate S-expression (see above) in @var{pkey}.
-The data to be encrypted can either be in the simple old format, which
-is a very simple S-expression consisting only of one MPI, or it may be
-a more complex S-expression which also allows to specify flags for
-operation, like e.g. padding rules.
-
-@noindent
-If you don't want to let Libgcrypt handle the padding, you must pass an
-appropriate MPI using this expression for @var{data}:
-
-@example
-(data
- (flags raw)
- (value @var{mpi}))
-@end example
-
-@noindent
-This has the same semantics as the old style MPI only way. @var{MPI} is
-the actual data, already padded appropriate for your protocol. Most
-systems however use PKCS#1 padding and so you can use this S-expression
-for @var{data}:
-
-@example
-(data
- (flags pkcs1)
- (value @var{block}))
-@end example
-
-@noindent
-Here, the "flags" list has the "pkcs1" flag which let the function know
-that it should provide PKCS#1 block type 2 padding. The actual data to
-be encrypted is passed as a string of octets in @var{block}. The
-function checks that this data actually can be used with the given key,
-does the padding and encrypts it.
-
-If the function could successfully perform the encryption, the return
-value will be 0 and a new S-expression with the encrypted result is
-allocated and assigned to the variable at the address of @var{r_ciph}.
-The caller is responsible to release this value using
-@code{gcry_sexp_release}. In case of an error, an error code is
-returned and @var{r_ciph} will be set to @code{NULL}.
-
-@noindent
-The returned S-expression has this format when used with RSA:
-
-@example
-(enc-val
- (rsa
- (a @var{a-mpi})))
-@end example
-
-@noindent
-Where @var{a-mpi} is an MPI with the result of the RSA operation. When
-using the Elgamal algorithm, the return value will have this format:
-
-@example
-(enc-val
- (elg
- (a @var{a-mpi})
- (b @var{b-mpi})))
-@end example
-
-@noindent
-Where @var{a-mpi} and @var{b-mpi} are MPIs with the result of the
-Elgamal encryption operation.
-@end deftypefun
-@c end gcry_pk_encrypt
-
-@deftypefun gcry_error_t gcry_pk_decrypt (@w{gcry_sexp_t *@var{r_plain},} @w{gcry_sexp_t @var{data},} @w{gcry_sexp_t @var{skey}})
-
-Obviously a private key must be provided for decryption. It is expected
-as an appropriate S-expression (see above) in @var{skey}. The data to
-be decrypted must match the format of the result as returned by
-@code{gcry_pk_encrypt}, but should be enlarged with a @code{flags}
-element:
-
-@example
-(enc-val
- (flags)
- (elg
- (a @var{a-mpi})
- (b @var{b-mpi})))
-@end example
-
-@noindent
-Note that this function currently does not know of any padding
-methods and the caller must do any un-padding on his own.
-
-@noindent
-The function returns 0 on success or an error code. The variable at the
-address of @var{r_plain} will be set to NULL on error or receive the
-decrypted value on success. The format of @var{r_plain} is a
-simple S-expression part (i.e. not a valid one) with just one MPI if
-there was no @code{flags} element in @var{data}; if at least an empty
-@code{flags} is passed in @var{data}, the format is:
-
-@example
-(value @var{plaintext})
-@end example
-@end deftypefun
-@c end gcry_pk_decrypt
-
-
-Another operation commonly performed using public key cryptography is
-signing data. In some sense this is even more important than
-encryption because digital signatures are an important instrument for
-key management. Libgcrypt supports digital signatures using
-2 functions, similar to the encryption functions:
-
-@deftypefun gcry_error_t gcry_pk_sign (@w{gcry_sexp_t *@var{r_sig},} @w{gcry_sexp_t @var{data},} @w{gcry_sexp_t @var{skey}})
-
-This function creates a digital signature for @var{data} using the
-private key @var{skey} and place it into the variable at the address of
-@var{r_sig}. @var{data} may either be the simple old style S-expression
-with just one MPI or a modern and more versatile S-expression which
-allows to let Libgcrypt handle padding:
-
-@example
- (data
- (flags pkcs1)
- (hash @var{hash-algo} @var{block}))
-@end example
-
-@noindent
-This example requests to sign the data in @var{block} after applying
-PKCS#1 block type 1 style padding. @var{hash-algo} is a string with the
-hash algorithm to be encoded into the signature, this may be any hash
-algorithm name as supported by Libgcrypt. Most likely, this will be
-"sha256" or "sha1". It is obvious that the length of @var{block} must
-match the size of that message digests; the function checks that this
-and other constraints are valid.
-
-@noindent
-If PKCS#1 padding is not required (because the caller does already
-provide a padded value), either the old format or better the following
-format should be used:
-
-@example
-(data
- (flags raw)
- (value @var{mpi}))
-@end example
-
-@noindent
-Here, the data to be signed is directly given as an @var{MPI}.
-
-@noindent
-The signature is returned as a newly allocated S-expression in
-@var{r_sig} using this format for RSA:
-
-@example
-(sig-val
- (rsa
- (s @var{s-mpi})))
-@end example
-
-Where @var{s-mpi} is the result of the RSA sign operation. For DSA the
-S-expression returned is:
-
-@example
-(sig-val
- (dsa
- (r @var{r-mpi})
- (s @var{s-mpi})))
-@end example
-
-Where @var{r-mpi} and @var{s-mpi} are the result of the DSA sign
-operation. For Elgamal signing (which is slow, yields large numbers
-and probably is not as secure as the other algorithms), the same format is
-used with "elg" replacing "dsa".
-@end deftypefun
-@c end gcry_pk_sign
-
-@noindent
-The operation most commonly used is definitely the verification of a
-signature. Libgcrypt provides this function:
-
-@deftypefun gcry_error_t gcry_pk_verify (@w{gcry_sexp_t @var{sig}}, @w{gcry_sexp_t @var{data}}, @w{gcry_sexp_t @var{pkey}})
-
-This is used to check whether the signature @var{sig} matches the
-@var{data}. The public key @var{pkey} must be provided to perform this
-verification. This function is similar in its parameters to
-@code{gcry_pk_sign} with the exceptions that the public key is used
-instead of the private key and that no signature is created but a
-signature, in a format as created by @code{gcry_pk_sign}, is passed to
-the function in @var{sig}.
-
-@noindent
-The result is 0 for success (i.e. the data matches the signature), or an
-error code where the most relevant code is @code{GCRYERR_BAD_SIGNATURE}
-to indicate that the signature does not match the provided data.
-
-@end deftypefun
-@c end gcry_pk_verify
-
-@node General public-key related Functions
-@section General public-key related Functions
-
-@noindent
-A couple of utility functions are available to retrieve the length of
-the key, map algorithm identifiers and perform sanity checks:
-
-@deftypefun {const char *} gcry_pk_algo_name (int @var{algo})
-
-Map the public key algorithm id @var{algo} to a string representation of
-the algorithm name. For unknown algorithms this functions returns the
-string @code{"?"}. This function should not be used to test for the
-availability of an algorithm.
-@end deftypefun
-
-@deftypefun int gcry_pk_map_name (const char *@var{name})
-
-Map the algorithm @var{name} to a public key algorithm Id. Returns 0 if
-the algorithm name is not known.
-@end deftypefun
-
-@deftypefun int gcry_pk_test_algo (int @var{algo})
-
-Return 0 if the public key algorithm @var{algo} is available for use.
-Note that this is implemented as a macro.
-@end deftypefun
-
-
-@deftypefun {unsigned int} gcry_pk_get_nbits (gcry_sexp_t @var{key})
-
-Return what is commonly referred as the key length for the given
-public or private in @var{key}.
-@end deftypefun
-
-@deftypefun {unsigned char *} gcry_pk_get_keygrip (@w{gcry_sexp_t @var{key}}, @w{unsigned char *@var{array}})
-
-Return the so called "keygrip" which is the SHA-1 hash of the public key
-parameters expressed in a way depended on the algorithm. @var{array}
-must either provide space for 20 bytes or be @code{NULL}. In the latter
-case a newly allocated array of that size is returned. On success a
-pointer to the newly allocated space or to @var{array} is returned.
-@code{NULL} is returned to indicate an error which is most likely an
-unknown algorithm or one where a "keygrip" has not yet been defined.
-The function accepts public or secret keys in @var{key}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_pk_testkey (gcry_sexp_t @var{key})
-
-Return zero if the private key @var{key} is `sane', an error code otherwise.
-Note that it is not possible to check the `saneness' of a public key.
-
-@end deftypefun
-
-
-@deftypefun gcry_error_t gcry_pk_algo_info (@w{int @var{algo}}, @w{int @var{what}}, @w{void *@var{buffer}}, @w{size_t *@var{nbytes}})
-
-Depending on the value of @var{what} return various information about
-the public key algorithm with the id @var{algo}. Note that the
-function returns @code{-1} on error and the actual error code must be
-retrieved using the function @code{gcry_errno}. The currently defined
-values for @var{what} are:
-
-@table @code
-@item GCRYCTL_TEST_ALGO:
-Return 0 if the specified algorithm is available for use.
-@var{buffer} must be @code{NULL}, @var{nbytes} may be passed as
-@code{NULL} or point to a variable with the required usage of the
-algorithm. This may be 0 for "don't care" or the bit-wise OR of these
-flags:
-
-@table @code
-@item GCRY_PK_USAGE_SIGN
-Algorithm is usable for signing.
-@item GCRY_PK_USAGE_ENCR
-Algorithm is usable for encryption.
-@end table
-
-Unless you need to test for the allowed usage, it is in general better
-to use the macro gcry_pk_test_algo instead.
-
-@item GCRYCTL_GET_ALGO_USAGE:
-Return the usage flags for the given algorithm. An invalid algorithm
-return 0. Disabled algorithms are ignored here because we
-want to know whether the algorithm is at all capable of a certain usage.
-
-@item GCRYCTL_GET_ALGO_NPKEY
-Return the number of elements the public key for algorithm @var{algo}
-consist of. Return 0 for an unknown algorithm.
-
-@item GCRYCTL_GET_ALGO_NSKEY
-Return the number of elements the private key for algorithm @var{algo}
-consist of. Note that this value is always larger than that of the
-public key. Return 0 for an unknown algorithm.
-
-@item GCRYCTL_GET_ALGO_NSIGN
-Return the number of elements a signature created with the algorithm
-@var{algo} consists of. Return 0 for an unknown algorithm or for an
-algorithm not capable of creating signatures.
-
-@item GCRYCTL_GET_ALGO_NENC
-Return the number of elements a encrypted message created with the algorithm
-@var{algo} consists of. Return 0 for an unknown algorithm or for an
-algorithm not capable of encryption.
-@end table
-
-@noindent
-Please note that parameters not required should be passed as @code{NULL}.
-@end deftypefun
-@c end gcry_pk_algo_info
-
-
-@deftypefun gcry_error_t gcry_pk_ctl (@w{int @var{cmd}}, @w{void *@var{buffer}}, @w{size_t @var{buflen}})
-
-This is a general purpose function to perform certain control
-operations. @var{cmd} controls what is to be done. The return value is
-0 for success or an error code. Currently supported values for
-@var{cmd} are:
-
-@table @code
-@item GCRYCTL_DISABLE_ALGO
-Disable the algorithm given as an algorithm id in @var{buffer}.
-@var{buffer} must point to an @code{int} variable with the algorithm id
-and @var{buflen} must have the value @code{sizeof (int)}.
-
-@end table
-@end deftypefun
-@c end gcry_pk_ctl
-
-@noindent
-Libgcrypt also provides a function to generate public key
-pairs:
-
-@deftypefun gcry_error_t gcry_pk_genkey (@w{gcry_sexp_t *@var{r_key}}, @w{gcry_sexp_t @var{parms}})
-
-This function create a new public key pair using information given in
-the S-expression @var{parms} and stores the private and the public key
-in one new S-expression at the address given by @var{r_key}. In case of
-an error, @var{r_key} is set to @code{NULL}. The return code is 0 for
-success or an error code otherwise.
-
-@noindent
-Here is an example for @var{parms} to create an 2048 bit RSA key:
-
-@example
-(genkey
- (rsa
- (nbits 4:2048)))
-@end example
-
-@noindent
-To create an Elgamal key, substitute "elg" for "rsa" and to create a DSA
-key use "dsa". Valid ranges for the key length depend on the
-algorithms; all commonly used key lengths are supported. Currently
-supported parameters are:
-
-@table @code
-@item nbits
-This is always required to specify the length of the key. The argument
-is a string with a number in C-notation. The value should be a multiple
-of 8.
-
-@item curve @var{name}
-For ECC a named curve may be used instead of giving the number of
-requested bits. This allows to request a specific curve to override a
-default selection Libgcrypt would have taken if @code{nbits} has been
-given. The available names are listed with the description of the ECC
-public key parameters.
-
-@item rsa-use-e
-This is only used with RSA to give a hint for the public exponent. The
-value will be used as a base to test for a usable exponent. Some values
-are special:
-
-@table @samp
-@item 0
-Use a secure and fast value. This is currently the number 41.
-@item 1
-Use a value as required by some crypto policies. This is currently
-the number 65537.
-@item 2
-Reserved
-@item > 2
-Use the given value.
-@end table
-
-@noindent
-If this parameter is not used, Libgcrypt uses for historic reasons
-65537.
-
-@item qbits
-This is only meanigful for DSA keys. If it is given the DSA key is
-generated with a Q parameyer of this size. If it is not given or zero
-Q is deduced from NBITS in this way:
-@table @samp
-@item 512 <= N <= 1024
-Q = 160
-@item N = 2048
-Q = 224
-@item N = 3072
-Q = 256
-@item N = 7680
-Q = 384
-@item N = 15360
-Q = 512
-@end table
-Note that in this case only the values for N, as given in the table,
-are allowed. When specifying Q all values of N in the range 512 to
-15680 are valid as long as they are multiples of 8.
-
-@item transient-key
-This is only meaningful for RSA and DSA keys. This is a flag with no
-value. If given the RSA or DSA key is created using a faster and a
-somewhat less secure random number generator. This flag may be used
-for keys which are only used for a short time and do not require full
-cryptographic strength.
-
-@item domain
-This is only meaningful for DLP algorithms. If specified keys are
-generated with domain parameters taken from this list. The exact
-format of this parameter depends on the actual algorithm. It is
-currently only implemented for DSA using this format:
-
-@example
-(genkey
- (dsa
- (domain
- (p @var{p-mpi})
- (q @var{q-mpi})
- (g @var{q-mpi}))))
-@end example
-
-@code{nbits} and @code{qbits} may not be specified because they are
-derived from the domain parameters.
-
-@item derive-parms
-This is currently only implemented for RSA and DSA keys. It is not
-allowed to use this together with a @code{domain} specification. If
-given, it is used to derive the keys using the given parameters.
-
-If given for an RSA key the X9.31 key generation algorithm is used
-even if libgcrypt is not in FIPS mode. If given for a DSA key, the
-FIPS 186 algorithm is used even if libgcrypt is not in FIPS mode.
-
-@example
-(genkey
- (rsa
- (nbits 4:1024)
- (rsa-use-e 1:3)
- (derive-parms
- (Xp1 #1A1916DDB29B4EB7EB6732E128#)
- (Xp2 #192E8AAC41C576C822D93EA433#)
- (Xp #D8CD81F035EC57EFE822955149D3BFF70C53520D
- 769D6D76646C7A792E16EBD89FE6FC5B605A6493
- 39DFC925A86A4C6D150B71B9EEA02D68885F5009
- B98BD984#)
- (Xq1 #1A5CF72EE770DE50CB09ACCEA9#)
- (Xq2 #134E4CAA16D2350A21D775C404#)
- (Xq #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
- 7C9953388F97DDDC3E1CA19C35CA659EDC2FC325
- 6D29C2627479C086A699A49C4C9CEE7EF7BD1B34
- 321DE34A#))))
-@end example
-
-@example
-(genkey
- (dsa
- (nbits 4:1024)
- (derive-parms
- (seed @var{seed-mpi}))))
-@end example
-
-
-@item use-x931
-@cindex X9.31
-Force the use of the ANSI X9.31 key generation algorithm instead of
-the default algorithm. This flag is only meaningful for RSA and
-usually not required. Note that this algorithm is implicitly used if
-either @code{derive-parms} is given or Libgcrypt is in FIPS mode.
-
-@item use-fips186
-@cindex FIPS 186
-Force the use of the FIPS 186 key generation algorithm instead of the
-default algorithm. This flag is only meaningful for DSA and usually
-not required. Note that this algorithm is implicitly used if either
-@code{derive-parms} is given or Libgcrypt is in FIPS mode. As of now
-FIPS 186-2 is implemented; after the approval of FIPS 186-3 the code
-will be changed to implement 186-3.
-
-
-@item use-fips186-2
-Force the use of the FIPS 186-2 key generation algorithm instead of
-the default algorithm. This algorithm is slighlty different from
-FIPS 186-3 and allows only 1024 bit keys. This flag is only meaningful
-for DSA and only required for FIPS testing backward compatibility.
-
-
-@end table
-@c end table of parameters
-
-@noindent
-The key pair is returned in a format depending on the algorithm. Both
-private and public keys are returned in one container and may be
-accompanied by some miscellaneous information.
-
-@noindent
-As an example, here is what the Elgamal key generation returns:
-
-@example
-(key-data
- (public-key
- (elg
- (p @var{p-mpi})
- (g @var{g-mpi})
- (y @var{y-mpi})))
- (private-key
- (elg
- (p @var{p-mpi})
- (g @var{g-mpi})
- (y @var{y-mpi})
- (x @var{x-mpi})))
- (misc-key-info
- (pm1-factors @var{n1 n2 ... nn}))
-@end example
-
-@noindent
-As you can see, some of the information is duplicated, but this
-provides an easy way to extract either the public or the private key.
-Note that the order of the elements is not defined, e.g. the private
-key may be stored before the public key. @var{n1 n2 ... nn} is a list
-of prime numbers used to composite @var{p-mpi}; this is in general not
-a very useful information and only available if the key generation
-algorithm provides them.
-@end deftypefun
-@c end gcry_pk_genkey
-
-@node AC Interface
-@section Alternative Public Key Interface
-
-This section documents the alternative interface to asymmetric
-cryptography (ac) that is not based on S-expressions, but on native C
-data structures. As opposed to the pk interface described in the
-former chapter, this one follows an open/use/close paradigm like other
-building blocks of the library.
-
-@strong{This interface has a few known problems; most noteworthy an
-inherent tendency to leak memory. It might not be available in
-forthcoming versions of Libgcrypt.}
-
-
-@menu
-* Available asymmetric algorithms:: List of algorithms supported by the library.
-* Working with sets of data:: How to work with sets of data.
-* Working with IO objects:: How to work with IO objects.
-* Working with handles:: How to use handles.
-* Working with keys:: How to work with keys.
-* Using cryptographic functions:: How to perform cryptographic operations.
-* Handle-independent functions:: General functions independent of handles.
-@end menu
-
-@node Available asymmetric algorithms
-@subsection Available asymmetric algorithms
-
-Libgcrypt supports the RSA (Rivest-Shamir-Adleman)
-algorithms as well as DSA (Digital Signature Algorithm) and Elgamal.
-The versatile interface allows to add more algorithms in the future.
-
-@deftp {Data type} gcry_ac_id_t
-
-The following constants are defined for this type:
-
-@table @code
-@item GCRY_AC_RSA
-Rivest-Shamir-Adleman
-@item GCRY_AC_DSA
-Digital Signature Algorithm
-@item GCRY_AC_ELG
-Elgamal
-@item GCRY_AC_ELG_E
-Elgamal, encryption only.
-@end table
-@end deftp
-
-@node Working with sets of data
-@subsection Working with sets of data
-
-In the context of this interface the term `data set' refers to a list
-of `named MPI values' that is used by functions performing
-cryptographic operations; a named MPI value is a an MPI value,
-associated with a label.
-
-Such data sets are used for representing keys, since keys simply
-consist of a variable amount of numbers. Furthermore some functions
-return data sets to the caller that are to be provided to other
-functions.
-
-This section documents the data types, symbols and functions that are
-relevant for working with data sets.
-
-@deftp {Data type} gcry_ac_data_t
-A single data set.
-@end deftp
-
-The following flags are supported:
-
-@table @code
-@item GCRY_AC_FLAG_DEALLOC
-Used for storing data in a data set. If given, the data will be
-released by the library. Note that whenever one of the ac functions
-is about to release objects because of this flag, the objects are
-expected to be stored in memory allocated through the Libgcrypt memory
-management. In other words: gcry_free() is used instead of free().
-
-@item GCRY_AC_FLAG_COPY
-Used for storing/retrieving data in/from a data set. If given, the
-library will create copies of the provided/contained data, which will
-then be given to the user/associated with the data set.
-@end table
-
-@deftypefun gcry_error_t gcry_ac_data_new (gcry_ac_data_t *@var{data})
-Creates a new, empty data set and stores it in @var{data}.
-@end deftypefun
-
-@deftypefun void gcry_ac_data_destroy (gcry_ac_data_t @var{data})
-Destroys the data set @var{data}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_set (gcry_ac_data_t @var{data}, unsigned int @var{flags}, char *@var{name}, gcry_mpi_t @var{mpi})
-Add the value @var{mpi} to @var{data} with the label @var{name}. If
-@var{flags} contains GCRY_AC_FLAG_COPY, the data set will contain
-copies of @var{name} and @var{mpi}. If @var{flags} contains
-GCRY_AC_FLAG_DEALLOC or GCRY_AC_FLAG_COPY, the values
-contained in the data set will be deallocated when they are to be
-removed from the data set.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_copy (gcry_ac_data_t *@var{data_cp}, gcry_ac_data_t @var{data})
-Create a copy of the data set @var{data} and store it in
-@var{data_cp}. FIXME: exact semantics undefined.
-@end deftypefun
-
-@deftypefun {unsigned int} gcry_ac_data_length (gcry_ac_data_t @var{data})
-Returns the number of named MPI values inside of the data set
-@var{data}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_get_name (gcry_ac_data_t @var{data}, unsigned int @var{flags}, char *@var{name}, gcry_mpi_t *@var{mpi})
-Store the value labelled with @var{name} found in @var{data} in
-@var{mpi}. If @var{flags} contains GCRY_AC_FLAG_COPY, store a copy of
-the @var{mpi} value contained in the data set. @var{mpi} may be NULL
-(this might be useful for checking the existence of an MPI with
-extracting it).
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_get_index (gcry_ac_data_t @var{data}, unsigned int flags, unsigned int @var{index}, const char **@var{name}, gcry_mpi_t *@var{mpi})
-Stores in @var{name} and @var{mpi} the named @var{mpi} value contained
-in the data set @var{data} with the index @var{idx}. If @var{flags}
-contains GCRY_AC_FLAG_COPY, store copies of the values contained in
-the data set. @var{name} or @var{mpi} may be NULL.
-@end deftypefun
-
-@deftypefun void gcry_ac_data_clear (gcry_ac_data_t @var{data})
-Destroys any values contained in the data set @var{data}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_to_sexp (gcry_ac_data_t @var{data}, gcry_sexp_t *@var{sexp}, const char **@var{identifiers})
-This function converts the data set @var{data} into a newly created
-S-Expression, which is to be stored in @var{sexp}; @var{identifiers}
-is a NULL terminated list of C strings, which specifies the structure
-of the S-Expression.
-
-Example:
-
-If @var{identifiers} is a list of pointers to the strings ``foo'' and
-``bar'' and if @var{data} is a data set containing the values ``val1 =
-0x01'' and ``val2 = 0x02'', then the resulting S-Expression will look
-like this: (foo (bar ((val1 0x01) (val2 0x02))).
-@end deftypefun
-
-@deftypefun gcry_error gcry_ac_data_from_sexp (gcry_ac_data_t *@var{data}, gcry_sexp_t @var{sexp}, const char **@var{identifiers})
-This function converts the S-Expression @var{sexp} into a newly
-created data set, which is to be stored in @var{data};
-@var{identifiers} is a NULL terminated list of C strings, which
-specifies the structure of the S-Expression. If the list of
-identifiers does not match the structure of the S-Expression, the
-function fails.
-@end deftypefun
-
-@node Working with IO objects
-@subsection Working with IO objects
-
-Note: IO objects are currently only used in the context of message
-encoding/decoding and encryption/signature schemes.
-
-@deftp {Data type} {gcry_ac_io_t}
-@code{gcry_ac_io_t} is the type to be used for IO objects.
-@end deftp
-
-IO objects provide an uniform IO layer on top of different underlying
-IO mechanisms; either they can be used for providing data to the
-library (mode is GCRY_AC_IO_READABLE) or they can be used for
-retrieving data from the library (mode is GCRY_AC_IO_WRITABLE).
-
-IO object need to be initialized by calling on of the following
-functions:
-
-@deftypefun void gcry_ac_io_init (gcry_ac_io_t *@var{ac_io}, gcry_ac_io_mode_t @var{mode}, gcry_ac_io_type_t @var{type}, ...);
-Initialize @var{ac_io} according to @var{mode}, @var{type} and the
-variable list of arguments. The list of variable arguments to specify
-depends on the given @var{type}.
-@end deftypefun
-
-@deftypefun void gcry_ac_io_init_va (gcry_ac_io_t *@var{ac_io}, gcry_ac_io_mode_t @var{mode}, gcry_ac_io_type_t @var{type}, va_list @var{ap});
-Initialize @var{ac_io} according to @var{mode}, @var{type} and the
-variable list of arguments @var{ap}. The list of variable arguments
-to specify depends on the given @var{type}.
-@end deftypefun
-
-The following types of IO objects exist:
-
-@table @code
-@item GCRY_AC_IO_STRING
-In case of GCRY_AC_IO_READABLE the IO object will provide data from a
-memory string. Arguments to specify at initialization time:
-@table @code
-@item unsigned char *
-Pointer to the beginning of the memory string
-@item size_t
-Size of the memory string
-@end table
-In case of GCRY_AC_IO_WRITABLE the object will store retrieved data in
-a newly allocated memory string. Arguments to specify at
-initialization time:
-@table @code
-@item unsigned char **
-Pointer to address, at which the pointer to the newly created memory
-string is to be stored
-@item size_t *
-Pointer to address, at which the size of the newly created memory
-string is to be stored
-@end table
-
-@item GCRY_AC_IO_CALLBACK
-In case of GCRY_AC_IO_READABLE the object will forward read requests
-to a provided callback function. Arguments to specify at
-initialization time:
-@table @code
-@item gcry_ac_data_read_cb_t
-Callback function to use
-@item void *
-Opaque argument to provide to the callback function
-@end table
-In case of GCRY_AC_IO_WRITABLE the object will forward write requests
-to a provided callback function. Arguments to specify at
-initialization time:
-@table @code
-@item gcry_ac_data_write_cb_t
-Callback function to use
-@item void *
-Opaque argument to provide to the callback function
-@end table
-@end table
-
-@node Working with handles
-@subsection Working with handles
-
-In order to use an algorithm, an according handle must be created.
-This is done using the following function:
-
-@deftypefun gcry_error_t gcry_ac_open (gcry_ac_handle_t *@var{handle}, int @var{algorithm}, int @var{flags})
-
-Creates a new handle for the algorithm @var{algorithm} and stores it
-in @var{handle}. @var{flags} is not used currently.
-
-@var{algorithm} must be a valid algorithm ID, see @xref{Available
-asymmetric algorithms}, for a list of supported algorithms and the
-according constants. Besides using the listed constants directly, the
-functions @code{gcry_pk_name_to_id} may be used to convert the textual
-name of an algorithm into the according numeric ID.
-@end deftypefun
-
-@deftypefun void gcry_ac_close (gcry_ac_handle_t @var{handle})
-Destroys the handle @var{handle}.
-@end deftypefun
-
-@node Working with keys
-@subsection Working with keys
-
-@deftp {Data type} gcry_ac_key_type_t
-Defined constants:
-
-@table @code
-@item GCRY_AC_KEY_SECRET
-Specifies a secret key.
-@item GCRY_AC_KEY_PUBLIC
-Specifies a public key.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_ac_key_t
-This type represents a single `key', either a secret one or a public
-one.
-@end deftp
-
-@deftp {Data type} gcry_ac_key_pair_t
-This type represents a `key pair' containing a secret and a public key.
-@end deftp
-
-Key data structures can be created in two different ways; a new key
-pair can be generated, resulting in ready-to-use key. Alternatively a
-key can be initialized from a given data set.
-
-@deftypefun gcry_error_t gcry_ac_key_init (gcry_ac_key_t *@var{key}, gcry_ac_handle_t @var{handle}, gcry_ac_key_type_t @var{type}, gcry_ac_data_t @var{data})
-Creates a new key of type @var{type}, consisting of the MPI values
-contained in the data set @var{data} and stores it in @var{key}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_key_pair_generate (gcry_ac_handle_t @var{handle}, unsigned int @var{nbits}, void *@var{key_spec}, gcry_ac_key_pair_t *@var{key_pair}, gcry_mpi_t **@var{misc_data})
-
-Generates a new key pair via the handle @var{handle} of @var{NBITS}
-bits and stores it in @var{key_pair}.
-
-In case non-standard settings are wanted, a pointer to a structure of
-type @code{gcry_ac_key_spec_<algorithm>_t}, matching the selected
-algorithm, can be given as @var{key_spec}. @var{misc_data} is not
-used yet. Such a structure does only exist for RSA. A description
-of the members of the supported structures follows.
-
-@table @code
-@item gcry_ac_key_spec_rsa_t
-@table @code
-@item gcry_mpi_t e
-Generate the key pair using a special @code{e}. The value of @code{e}
-has the following meanings:
-@table @code
-@item = 0
-Let Libgcrypt decide what exponent should be used.
-@item = 1
-Request the use of a ``secure'' exponent; this is required by some
-specification to be 65537.
-@item > 2
-Try starting at this value until a working exponent is found. Note
-that the current implementation leaks some information about the
-private key because the incrementation used is not randomized. Thus,
-this function will be changed in the future to return a random
-exponent of the given size.
-@end table
-@end table
-@end table
-
-Example code:
-@example
-@{
- gcry_ac_key_pair_t key_pair;
- gcry_ac_key_spec_rsa_t rsa_spec;
-
- rsa_spec.e = gcry_mpi_new (0);
- gcry_mpi_set_ui (rsa_spec.e, 1);
-
- err = gcry_ac_open (&handle, GCRY_AC_RSA, 0);
- assert (! err);
-
- err = gcry_ac_key_pair_generate (handle, 1024, &rsa_spec,
- &key_pair, NULL);
- assert (! err);
-@}
-@end example
-@end deftypefun
-
-
-@deftypefun gcry_ac_key_t gcry_ac_key_pair_extract (gcry_ac_key_pair_t @var{key_pair}, gcry_ac_key_type_t @var{which})
-Returns the key of type @var{which} out of the key pair
-@var{key_pair}.
-@end deftypefun
-
-@deftypefun void gcry_ac_key_destroy (gcry_ac_key_t @var{key})
-Destroys the key @var{key}.
-@end deftypefun
-
-@deftypefun void gcry_ac_key_pair_destroy (gcry_ac_key_pair_t @var{key_pair})
-Destroys the key pair @var{key_pair}.
-@end deftypefun
-
-@deftypefun gcry_ac_data_t gcry_ac_key_data_get (gcry_ac_key_t @var{key})
-Returns the data set contained in the key @var{key}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_key_test (gcry_ac_handle_t @var{handle}, gcry_ac_key_t @var{key})
-Verifies that the private key @var{key} is sane via @var{handle}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_key_get_nbits (gcry_ac_handle_t @var{handle}, gcry_ac_key_t @var{key}, unsigned int *@var{nbits})
-Stores the number of bits of the key @var{key} in @var{nbits} via @var{handle}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_key_get_grip (gcry_ac_handle_t @var{handle}, gcry_ac_key_t @var{key}, unsigned char *@var{key_grip})
-Writes the 20 byte long key grip of the key @var{key} to
-@var{key_grip} via @var{handle}.
-@end deftypefun
-
-@node Using cryptographic functions
-@subsection Using cryptographic functions
-
-The following flags might be relevant:
-
-@table @code
-@item GCRY_AC_FLAG_NO_BLINDING
-Disable any blinding, which might be supported by the chosen
-algorithm; blinding is the default.
-@end table
-
-There exist two kinds of cryptographic functions available through the
-ac interface: primitives, and high-level functions.
-
-Primitives deal with MPIs (data sets) directly; what they provide is
-direct access to the cryptographic operations provided by an algorithm
-implementation.
-
-High-level functions deal with octet strings, according to a specified
-``scheme''. Schemes make use of ``encoding methods'', which are
-responsible for converting the provided octet strings into MPIs, which
-are then forwared to the cryptographic primitives. Since schemes are
-to be used for a special purpose in order to achieve a particular
-security goal, there exist ``encryption schemes'' and ``signature
-schemes''. Encoding methods can be used seperately or implicitly
-through schemes.
-
-What follows is a description of the cryptographic primitives.
-
-@deftypefun gcry_error_t gcry_ac_data_encrypt (gcry_ac_handle_t @var{handle}, unsigned int @var{flags}, gcry_ac_key_t @var{key}, gcry_mpi_t @var{data_plain}, gcry_ac_data_t *@var{data_encrypted})
-Encrypts the plain text MPI value @var{data_plain} with the key public
-@var{key} under the control of the flags @var{flags} and stores the
-resulting data set into @var{data_encrypted}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_decrypt (gcry_ac_handle_t @var{handle}, unsigned int @var{flags}, gcry_ac_key_t @var{key}, gcry_mpi_t *@var{data_plain}, gcry_ac_data_t @var{data_encrypted})
-Decrypts the encrypted data contained in the data set
-@var{data_encrypted} with the secret key KEY under the control of the
-flags @var{flags} and stores the resulting plain text MPI value in
-@var{DATA_PLAIN}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_sign (gcry_ac_handle_t @var{handle}, gcry_ac_key_t @var{key}, gcry_mpi_t @var{data}, gcry_ac_data_t *@var{data_signature})
-Signs the data contained in @var{data} with the secret key @var{key}
-and stores the resulting signature in the data set
-@var{data_signature}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_verify (gcry_ac_handle_t @var{handle}, gcry_ac_key_t @var{key}, gcry_mpi_t @var{data}, gcry_ac_data_t @var{data_signature})
-Verifies that the signature contained in the data set
-@var{data_signature} is indeed the result of signing the data
-contained in @var{data} with the secret key belonging to the public
-key @var{key}.
-@end deftypefun
-
-What follows is a description of the high-level functions.
-
-The type ``gcry_ac_em_t'' is used for specifying encoding methods; the
-following methods are supported:
-
-@table @code
-@item GCRY_AC_EME_PKCS_V1_5
-PKCS-V1_5 Encoding Method for Encryption. Options must be provided
-through a pointer to a correctly initialized object of type
-gcry_ac_eme_pkcs_v1_5_t.
-
-@item GCRY_AC_EMSA_PKCS_V1_5
-PKCS-V1_5 Encoding Method for Signatures with Appendix. Options must
-be provided through a pointer to a correctly initialized object of
-type gcry_ac_emsa_pkcs_v1_5_t.
-@end table
-
-Option structure types:
-
-@table @code
-@item gcry_ac_eme_pkcs_v1_5_t
-@table @code
-@item gcry_ac_key_t key
-@item gcry_ac_handle_t handle
-@end table
-@item gcry_ac_emsa_pkcs_v1_5_t
-@table @code
-@item gcry_md_algo_t md
-@item size_t em_n
-@end table
-@end table
-
-Encoding methods can be used directly through the following functions:
-
-@deftypefun gcry_error_t gcry_ac_data_encode (gcry_ac_em_t @var{method}, unsigned int @var{flags}, void *@var{options}, unsigned char *@var{m}, size_t @var{m_n}, unsigned char **@var{em}, size_t *@var{em_n})
-Encodes the message contained in @var{m} of size @var{m_n} according
-to @var{method}, @var{flags} and @var{options}. The newly created
-encoded message is stored in @var{em} and @var{em_n}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_decode (gcry_ac_em_t @var{method}, unsigned int @var{flags}, void *@var{options}, unsigned char *@var{em}, size_t @var{em_n}, unsigned char **@var{m}, size_t *@var{m_n})
-Decodes the message contained in @var{em} of size @var{em_n} according
-to @var{method}, @var{flags} and @var{options}. The newly created
-decoded message is stored in @var{m} and @var{m_n}.
-@end deftypefun
-
-The type ``gcry_ac_scheme_t'' is used for specifying schemes; the
-following schemes are supported:
-
-@table @code
-@item GCRY_AC_ES_PKCS_V1_5
-PKCS-V1_5 Encryption Scheme. No options can be provided.
-@item GCRY_AC_SSA_PKCS_V1_5
-PKCS-V1_5 Signature Scheme (with Appendix). Options can be provided
-through a pointer to a correctly initialized object of type
-gcry_ac_ssa_pkcs_v1_5_t.
-@end table
-
-Option structure types:
-
-@table @code
-@item gcry_ac_ssa_pkcs_v1_5_t
-@table @code
-@item gcry_md_algo_t md
-@end table
-@end table
-
-The functions implementing schemes:
-
-@deftypefun gcry_error_t gcry_ac_data_encrypt_scheme (gcry_ac_handle_t @var{handle}, gcry_ac_scheme_t @var{scheme}, unsigned int @var{flags}, void *@var{opts}, gcry_ac_key_t @var{key}, gcry_ac_io_t *@var{io_message}, gcry_ac_io_t *@var{io_cipher})
-Encrypts the plain text readable from @var{io_message} through
-@var{handle} with the public key @var{key} according to @var{scheme},
-@var{flags} and @var{opts}. If @var{opts} is not NULL, it has to be a
-pointer to a structure specific to the chosen scheme (gcry_ac_es_*_t).
-The encrypted message is written to @var{io_cipher}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_decrypt_scheme (gcry_ac_handle_t @var{handle}, gcry_ac_scheme_t @var{scheme}, unsigned int @var{flags}, void *@var{opts}, gcry_ac_key_t @var{key}, gcry_ac_io_t *@var{io_cipher}, gcry_ac_io_t *@var{io_message})
-Decrypts the cipher text readable from @var{io_cipher} through
-@var{handle} with the secret key @var{key} according to @var{scheme},
-@var{flags} and @var{opts}. If @var{opts} is not NULL, it has to be a
-pointer to a structure specific to the chosen scheme (gcry_ac_es_*_t).
-The decrypted message is written to @var{io_message}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_sign_scheme (gcry_ac_handle_t @var{handle}, gcry_ac_scheme_t @var{scheme}, unsigned int @var{flags}, void *@var{opts}, gcry_ac_key_t @var{key}, gcry_ac_io_t *@var{io_message}, gcry_ac_io_t *@var{io_signature})
-Signs the message readable from @var{io_message} through @var{handle}
-with the secret key @var{key} according to @var{scheme}, @var{flags}
-and @var{opts}. If @var{opts} is not NULL, it has to be a pointer to
-a structure specific to the chosen scheme (gcry_ac_ssa_*_t). The
-signature is written to @var{io_signature}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_data_verify_scheme (gcry_ac_handle_t @var{handle}, gcry_ac_scheme_t @var{scheme}, unsigned int @var{flags}, void *@var{opts}, gcry_ac_key_t @var{key}, gcry_ac_io_t *@var{io_message}, gcry_ac_io_t *@var{io_signature})
-Verifies through @var{handle} that the signature readable from
-@var{io_signature} is indeed the result of signing the message
-readable from @var{io_message} with the secret key belonging to the
-public key @var{key} according to @var{scheme} and @var{opts}. If
-@var{opts} is not NULL, it has to be an anonymous structure
-(gcry_ac_ssa_*_t) specific to the chosen scheme.
-@end deftypefun
-
-@node Handle-independent functions
-@subsection Handle-independent functions
-
-These two functions are deprecated; do not use them for new code.
-
-@deftypefun gcry_error_t gcry_ac_id_to_name (gcry_ac_id_t @var{algorithm}, const char **@var{name})
-Stores the textual representation of the algorithm whose id is given
-in @var{algorithm} in @var{name}. Deprecated; use @code{gcry_pk_algo_name}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_ac_name_to_id (const char *@var{name}, gcry_ac_id_t *@var{algorithm})
-Stores the numeric ID of the algorithm whose textual representation is
-contained in @var{name} in @var{algorithm}. Deprecated; use
-@code{gcry_pk_map_name}.
-@end deftypefun
-
-@c **********************************************************
-@c ******************* Hash Functions *********************
-@c **********************************************************
-@node Hashing
-@chapter Hashing
-
-Libgcrypt provides an easy and consistent to use interface for hashing.
-Hashing is buffered and several hash algorithms can be updated at once.
-It is possible to compute a MAC using the same routines. The
-programming model follows an open/process/close paradigm and is in that
-similar to other building blocks provided by Libgcrypt.
-
-For convenience reasons, a few cyclic redundancy check value operations
-are also supported.
-
-@menu
-* Available hash algorithms:: List of hash algorithms supported by the library.
-* Hash algorithm modules:: How to work with hash algorithm modules.
-* Working with hash algorithms:: List of functions related to hashing.
-@end menu
-
-@node Available hash algorithms
-@section Available hash algorithms
-
-@c begin table of hash algorithms
-@cindex SHA-1
-@cindex SHA-224, SHA-256, SHA-384, SHA-512
-@cindex RIPE-MD-160
-@cindex MD2, MD4, MD5
-@cindex TIGER
-@cindex HAVAL
-@cindex Whirlpool
-@cindex CRC32
-@table @code
-@item GCRY_MD_NONE
-This is not a real algorithm but used by some functions as an error
-return value. This constant is guaranteed to have the value @code{0}.
-
-@item GCRY_MD_SHA1
-This is the SHA-1 algorithm which yields a message digest of 20 bytes.
-Note that SHA-1 begins to show some weaknesses and it is suggested to
-fade out its use if strong cryptographic properties are required.
-
-@item GCRY_MD_RMD160
-This is the 160 bit version of the RIPE message digest (RIPE-MD-160).
-Like SHA-1 it also yields a digest of 20 bytes. This algorithm share a
-lot of design properties with SHA-1 and thus it is advisable not to use
-it for new protocols.
-
-@item GCRY_MD_MD5
-This is the well known MD5 algorithm, which yields a message digest of
-16 bytes. Note that the MD5 algorithm has severe weaknesses, for
-example it is easy to compute two messages yielding the same hash
-(collision attack). The use of this algorithm is only justified for
-non-cryptographic application.
-
-
-@item GCRY_MD_MD4
-This is the MD4 algorithm, which yields a message digest of 16 bytes.
-This algorithms ha severe weaknesses and should not be used.
-
-@item GCRY_MD_MD2
-This is an reserved identifier for MD-2; there is no implementation yet.
-This algorithm has severe weaknesses and should not be used.
-
-@item GCRY_MD_TIGER
-This is the TIGER/192 algorithm which yields a message digest of 24 bytes.
-
-@item GCRY_MD_HAVAL
-This is an reserved value for the HAVAL algorithm with 5 passes and 160
-bit. It yields a message digest of 20 bytes. Note that there is no
-implementation yet available.
-
-@item GCRY_MD_SHA224
-This is the SHA-224 algorithm which yields a message digest of 28 bytes.
-See Change Notice 1 for FIPS 180-2 for the specification.
-
-@item GCRY_MD_SHA256
-This is the SHA-256 algorithm which yields a message digest of 32 bytes.
-See FIPS 180-2 for the specification.
-
-@item GCRY_MD_SHA384
-This is the SHA-384 algorithm which yields a message digest of 48 bytes.
-See FIPS 180-2 for the specification.
-
-@item GCRY_MD_SHA512
-This is the SHA-384 algorithm which yields a message digest of 64 bytes.
-See FIPS 180-2 for the specification.
-
-@item GCRY_MD_CRC32
-This is the ISO 3309 and ITU-T V.42 cyclic redundancy check. It yields
-an output of 4 bytes. Note that this is not a hash algorithm in the
-cryptographic sense.
-
-@item GCRY_MD_CRC32_RFC1510
-This is the above cyclic redundancy check function, as modified by RFC
-1510. It yields an output of 4 bytes. Note that this is not a hash
-algorithm in the cryptographic sense.
-
-@item GCRY_MD_CRC24_RFC2440
-This is the OpenPGP cyclic redundancy check function. It yields an
-output of 3 bytes. Note that this is not a hash algorithm in the
-cryptographic sense.
-
-@item GCRY_MD_WHIRLPOOL
-This is the Whirlpool algorithm which yields a message digest of 64
-bytes.
-
-@end table
-@c end table of hash algorithms
-
-@node Hash algorithm modules
-@section Hash algorithm modules
-
-Libgcrypt makes it possible to load additional `message
-digest modules'; these digests can be used just like the message digest
-algorithms that are built into the library directly. For an
-introduction into extension modules, see @xref{Modules}.
-
-@deftp {Data type} gcry_md_spec_t
-This is the `module specification structure' needed for registering
-message digest modules, which has to be filled in by the user before
-it can be used to register a module. It contains the following
-members:
-
-@table @code
-@item const char *name
-The primary name of this algorithm.
-@item unsigned char *asnoid
-Array of bytes that form the ASN OID.
-@item int asnlen
-Length of bytes in `asnoid'.
-@item gcry_md_oid_spec_t *oids
-A list of OIDs that are to be associated with the algorithm. The
-list's last element must have it's `oid' member set to NULL. See
-below for an explanation of this type. See below for an explanation
-of this type.
-@item int mdlen
-Length of the message digest algorithm. See below for an explanation
-of this type.
-@item gcry_md_init_t init
-The function responsible for initializing a handle. See below for an
-explanation of this type.
-@item gcry_md_write_t write
-The function responsible for writing data into a message digest
-context. See below for an explanation of this type.
-@item gcry_md_final_t final
-The function responsible for `finalizing' a message digest context.
-See below for an explanation of this type.
-@item gcry_md_read_t read
-The function responsible for reading out a message digest result. See
-below for an explanation of this type.
-@item size_t contextsize
-The size of the algorithm-specific `context', that should be
-allocated for each handle.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_md_oid_spec_t
-This type is used for associating a user-provided algorithm
-implementation with certain OIDs. It contains the following members:
-
-@table @code
-@item const char *oidstring
-Textual representation of the OID.
-@end table
-@end deftp
-
-@deftp {Data type} gcry_md_init_t
-Type for the `init' function, defined as: void (*gcry_md_init_t) (void
-*c)
-@end deftp
-
-@deftp {Data type} gcry_md_write_t
-Type for the `write' function, defined as: void (*gcry_md_write_t)
-(void *c, unsigned char *buf, size_t nbytes)
-@end deftp
-
-@deftp {Data type} gcry_md_final_t
-Type for the `final' function, defined as: void (*gcry_md_final_t)
-(void *c)
-@end deftp
-
-@deftp {Data type} gcry_md_read_t
-Type for the `read' function, defined as: unsigned char
-*(*gcry_md_read_t) (void *c)
-@end deftp
-
-@deftypefun gcry_error_t gcry_md_register (gcry_md_spec_t *@var{digest}, unsigned int *algorithm_id, gcry_module_t *@var{module})
-
-Register a new digest module whose specification can be found in
-@var{digest}. On success, a new algorithm ID is stored in
-@var{algorithm_id} and a pointer representing this module is stored
-in @var{module}.
-@end deftypefun
-
-@deftypefun void gcry_md_unregister (gcry_module_t @var{module})
-Unregister the digest identified by @var{module}, which must have been
-registered with gcry_md_register.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_md_list (int *@var{list}, int *@var{list_length})
-Get a list consisting of the IDs of the loaded message digest modules.
-If @var{list} is zero, write the number of loaded message digest
-modules to @var{list_length} and return. If @var{list} is non-zero,
-the first *@var{list_length} algorithm IDs are stored in @var{list},
-which must be of according size. In case there are less message
-digests modules than *@var{list_length}, *@var{list_length} is updated
-to the correct number.
-@end deftypefun
-
-@node Working with hash algorithms
-@section Working with hash algorithms
-
-To use most of these function it is necessary to create a context;
-this is done using:
-
-@deftypefun gcry_error_t gcry_md_open (gcry_md_hd_t *@var{hd}, int @var{algo}, unsigned int @var{flags})
-
-Create a message digest object for algorithm @var{algo}. @var{flags}
-may be given as an bitwise OR of constants described below. @var{algo}
-may be given as @code{0} if the algorithms to use are later set using
-@code{gcry_md_enable}. @var{hd} is guaranteed to either receive a valid
-handle or NULL.
-
-For a list of supported algorithms, see @xref{Available hash
-algorithms}.
-
-The flags allowed for @var{mode} are:
-
-@c begin table of hash flags
-@table @code
-@item GCRY_MD_FLAG_SECURE
-Allocate all buffers and the resulting digest in "secure memory". Use
-this is the hashed data is highly confidential.
-
-@item GCRY_MD_FLAG_HMAC
-@cindex HMAC
-Turn the algorithm into a HMAC message authentication algorithm. This
-only works if just one algorithm is enabled for the handle. Note that
-the function @code{gcry_md_setkey} must be used to set the MAC key.
-The size of the MAC is equal to the message digest of the underlying
-hash algorithm. If you want CBC message authentication codes based on
-a cipher, see @xref{Working with cipher handles}.
-
-@end table
-@c begin table of hash flags
-
-You may use the function @code{gcry_md_is_enabled} to later check
-whether an algorithm has been enabled.
-
-@end deftypefun
-@c end function gcry_md_open
-
-If you want to calculate several hash algorithms at the same time, you
-have to use the following function right after the @code{gcry_md_open}:
-
-@deftypefun gcry_error_t gcry_md_enable (gcry_md_hd_t @var{h}, int @var{algo})
-
-Add the message digest algorithm @var{algo} to the digest object
-described by handle @var{h}. Duplicated enabling of algorithms is
-detected and ignored.
-@end deftypefun
-
-If the flag @code{GCRY_MD_FLAG_HMAC} was used, the key for the MAC must
-be set using the function:
-
-@deftypefun gcry_error_t gcry_md_setkey (gcry_md_hd_t @var{h}, const void *@var{key}, size_t @var{keylen})
-
-For use with the HMAC feature, set the MAC key to the value of
-@var{key} of length @var{keylen} bytes. There is no restriction on
-the length of the key.
-@end deftypefun
-
-
-After you are done with the hash calculation, you should release the
-resources by using:
-
-@deftypefun void gcry_md_close (gcry_md_hd_t @var{h})
-
-Release all resources of hash context @var{h}. @var{h} should not be
-used after a call to this function. A @code{NULL} passed as @var{h} is
-ignored. The function also zeroises all sensitive information
-associated with this handle.
-
-
-@end deftypefun
-
-Often you have to do several hash operations using the same algorithm.
-To avoid the overhead of creating and releasing context, a reset function
-is provided:
-
-@deftypefun void gcry_md_reset (gcry_md_hd_t @var{h})
-
-Reset the current context to its initial state. This is effectively
-identical to a close followed by an open and enabling all currently
-active algorithms.
-@end deftypefun
-
-
-Often it is necessary to start hashing some data and then continue to
-hash different data. To avoid hashing the same data several times (which
-might not even be possible if the data is received from a pipe), a
-snapshot of the current hash context can be taken and turned into a new
-context:
-
-@deftypefun gcry_error_t gcry_md_copy (gcry_md_hd_t *@var{handle_dst}, gcry_md_hd_t @var{handle_src})
-
-Create a new digest object as an exact copy of the object described by
-handle @var{handle_src} and store it in @var{handle_dst}. The context
-is not reset and you can continue to hash data using this context and
-independently using the original context.
-@end deftypefun
-
-
-Now that we have prepared everything to calculate hashes, it is time to
-see how it is actually done. There are two ways for this, one to
-update the hash with a block of memory and one macro to update the hash
-by just one character. Both methods can be used on the same hash context.
-
-@deftypefun void gcry_md_write (gcry_md_hd_t @var{h}, const void *@var{buffer}, size_t @var{length})
-
-Pass @var{length} bytes of the data in @var{buffer} to the digest object
-with handle @var{h} to update the digest values. This
-function should be used for large blocks of data.
-@end deftypefun
-
-@deftypefun void gcry_md_putc (gcry_md_hd_t @var{h}, int @var{c})
-
-Pass the byte in @var{c} to the digest object with handle @var{h} to
-update the digest value. This is an efficient function, implemented as
-a macro to buffer the data before an actual update.
-@end deftypefun
-
-The semantics of the hash functions do not provide for reading out intermediate
-message digests because the calculation must be finalized first. This
-finalization may for example include the number of bytes hashed in the
-message digest or some padding.
-
-@deftypefun void gcry_md_final (gcry_md_hd_t @var{h})
-
-Finalize the message digest calculation. This is not really needed
-because @code{gcry_md_read} does this implicitly. After this has been
-done no further updates (by means of @code{gcry_md_write} or
-@code{gcry_md_putc} are allowed. Only the first call to this function
-has an effect. It is implemented as a macro.
-@end deftypefun
-
-The way to read out the calculated message digest is by using the
-function:
-
-@deftypefun {unsigned char *} gcry_md_read (gcry_md_hd_t @var{h}, int @var{algo})
-
-@code{gcry_md_read} returns the message digest after finalizing the
-calculation. This function may be used as often as required but it will
-always return the same value for one handle. The returned message digest
-is allocated within the message context and therefore valid until the
-handle is released or reseted (using @code{gcry_md_close} or
-@code{gcry_md_reset}. @var{algo} may be given as 0 to return the only
-enabled message digest or it may specify one of the enabled algorithms.
-The function does return @code{NULL} if the requested algorithm has not
-been enabled.
-@end deftypefun
-
-Because it is often necessary to get the message digest of one block of
-memory, a fast convenience function is available for this task:
-
-@deftypefun void gcry_md_hash_buffer (int @var{algo}, void *@var{digest}, const void *@var{buffer}, size_t @var{length});
-
-@code{gcry_md_hash_buffer} is a shortcut function to calculate a message
-digest of a buffer. This function does not require a context and
-immediately returns the message digest of the @var{length} bytes at
-@var{buffer}. @var{digest} must be allocated by the caller, large
-enough to hold the message digest yielded by the the specified algorithm
-@var{algo}. This required size may be obtained by using the function
-@code{gcry_md_get_algo_dlen}.
-
-Note that this function will abort the process if an unavailable
-algorithm is used.
-@end deftypefun
-
-@c ***********************************
-@c ***** MD info functions ***********
-@c ***********************************
-
-Hash algorithms are identified by internal algorithm numbers (see
-@code{gcry_md_open} for a list). However, in most applications they are
-used by names, so two functions are available to map between string
-representations and hash algorithm identifiers.
-
-@deftypefun {const char *} gcry_md_algo_name (int @var{algo})
-
-Map the digest algorithm id @var{algo} to a string representation of the
-algorithm name. For unknown algorithms this function returns the
-string @code{"?"}. This function should not be used to test for the
-availability of an algorithm.
-@end deftypefun
-
-@deftypefun int gcry_md_map_name (const char *@var{name})
-
-Map the algorithm with @var{name} to a digest algorithm identifier.
-Returns 0 if the algorithm name is not known. Names representing
-@acronym{ASN.1} object identifiers are recognized if the @acronym{IETF}
-dotted format is used and the OID is prefixed with either "@code{oid.}"
-or "@code{OID.}". For a list of supported OIDs, see the source code at
-@file{cipher/md.c}. This function should not be used to test for the
-availability of an algorithm.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_md_get_asnoid (int @var{algo}, void *@var{buffer}, size_t *@var{length})
-
-Return an DER encoded ASN.1 OID for the algorithm @var{algo} in the
-user allocated @var{buffer}. @var{length} must point to variable with
-the available size of @var{buffer} and receives after return the
-actual size of the returned OID. The returned error code may be
-@code{GPG_ERR_TOO_SHORT} if the provided buffer is to short to receive
-the OID; it is possible to call the function with @code{NULL} for
-@var{buffer} to have it only return the required size. The function
-returns 0 on success.
-
-@end deftypefun
-
-
-To test whether an algorithm is actually available for use, the
-following macro should be used:
-
-@deftypefun gcry_error_t gcry_md_test_algo (int @var{algo})
-
-The macro returns 0 if the algorithm @var{algo} is available for use.
-@end deftypefun
-
-If the length of a message digest is not known, it can be retrieved
-using the following function:
-
-@deftypefun {unsigned int} gcry_md_get_algo_dlen (int @var{algo})
-
-Retrieve the length in bytes of the digest yielded by algorithm
-@var{algo}. This is often used prior to @code{gcry_md_read} to allocate
-sufficient memory for the digest.
-@end deftypefun
-
-
-In some situations it might be hard to remember the algorithm used for
-the ongoing hashing. The following function might be used to get that
-information:
-
-@deftypefun int gcry_md_get_algo (gcry_md_hd_t @var{h})
-
-Retrieve the algorithm used with the handle @var{h}. Note that this
-does not work reliable if more than one algorithm is enabled in @var{h}.
-@end deftypefun
-
-The following macro might also be useful:
-
-@deftypefun int gcry_md_is_secure (gcry_md_hd_t @var{h})
-
-This function returns true when the digest object @var{h} is allocated
-in "secure memory"; i.e. @var{h} was created with the
-@code{GCRY_MD_FLAG_SECURE}.
-@end deftypefun
-
-@deftypefun int gcry_md_is_enabled (gcry_md_hd_t @var{h}, int @var{algo})
-
-This function returns true when the algorithm @var{algo} has been
-enabled for the digest object @var{h}.
-@end deftypefun
-
-
-
-Tracking bugs related to hashing is often a cumbersome task which
-requires to add a lot of printf statements into the code.
-Libgcrypt provides an easy way to avoid this. The actual data
-hashed can be written to files on request.
-
-@deftypefun void gcry_md_debug (gcry_md_hd_t @var{h}, const char *@var{suffix})
-
-Enable debugging for the digest object with handle @var{h}. This
-creates create files named @file{dbgmd-<n>.<string>} while doing the
-actual hashing. @var{suffix} is the string part in the filename. The
-number is a counter incremented for each new hashing. The data in the
-file is the raw data as passed to @code{gcry_md_write} or
-@code{gcry_md_putc}. If @code{NULL} is used for @var{suffix}, the
-debugging is stopped and the file closed. This is only rarely required
-because @code{gcry_md_close} implicitly stops debugging.
-@end deftypefun
-
-
-The following two deprecated macros are used for debugging by old code.
-They shopuld be replaced by @code{gcry_md_debug}.
-
-@deftypefun void gcry_md_start_debug (gcry_md_hd_t @var{h}, const char *@var{suffix})
-
-Enable debugging for the digest object with handle @var{h}. This
-creates create files named @file{dbgmd-<n>.<string>} while doing the
-actual hashing. @var{suffix} is the string part in the filename. The
-number is a counter incremented for each new hashing. The data in the
-file is the raw data as passed to @code{gcry_md_write} or
-@code{gcry_md_putc}.
-@end deftypefun
-
-
-@deftypefun void gcry_md_stop_debug (gcry_md_hd_t @var{h}, int @var{reserved})
-
-Stop debugging on handle @var{h}. @var{reserved} should be specified as
-0. This function is usually not required because @code{gcry_md_close}
-does implicitly stop debugging.
-@end deftypefun
-
-
-@c **********************************************************
-@c ******************* Random *****************************
-@c **********************************************************
-@node Random Numbers
-@chapter Random Numbers
-
-@menu
-* Quality of random numbers:: Libgcrypt uses different quality levels.
-* Retrieving random numbers:: How to retrieve random numbers.
-@end menu
-
-@node Quality of random numbers
-@section Quality of random numbers
-
-@acronym{Libgcypt} offers random numbers of different quality levels:
-
-@deftp {Data type} gcry_random_level_t
-The constants for the random quality levels are of this enum type.
-@end deftp
-
-@table @code
-@item GCRY_WEAK_RANDOM
-For all functions, except for @code{gcry_mpi_randomize}, this level maps
-to GCRY_STRONG_RANDOM. If you do not want this, consider using
-@code{gcry_create_nonce}.
-@item GCRY_STRONG_RANDOM
-Use this level for session keys and similar purposes.
-@item GCRY_VERY_STRONG_RANDOM
-Use this level for long term key material.
-@end table
-
-@node Retrieving random numbers
-@section Retrieving random numbers
-
-@deftypefun void gcry_randomize (unsigned char *@var{buffer}, size_t @var{length}, enum gcry_random_level @var{level})
-
-Fill @var{buffer} with @var{length} random bytes using a random quality
-as defined by @var{level}.
-@end deftypefun
-
-@deftypefun {void *} gcry_random_bytes (size_t @var{nbytes}, enum gcry_random_level @var{level})
-
-Convenience function to allocate a memory block consisting of
-@var{nbytes} fresh random bytes using a random quality as defined by
-@var{level}.
-@end deftypefun
-
-@deftypefun {void *} gcry_random_bytes_secure (size_t @var{nbytes}, enum gcry_random_level @var{level})
-
-Convenience function to allocate a memory block consisting of
-@var{nbytes} fresh random bytes using a random quality as defined by
-@var{level}. This function differs from @code{gcry_random_bytes} in
-that the returned buffer is allocated in a ``secure'' area of the
-memory.
-@end deftypefun
-
-@deftypefun void gcry_create_nonce (unsigned char *@var{buffer}, size_t @var{length})
-
-Fill @var{buffer} with @var{length} unpredictable bytes. This is
-commonly called a nonce and may also be used for initialization
-vectors and padding. This is an extra function nearly independent of
-the other random function for 3 reasons: It better protects the
-regular random generator's internal state, provides better performance
-and does not drain the precious entropy pool.
-
-@end deftypefun
-
-
-
-@c **********************************************************
-@c ******************* S-Expressions ***********************
-@c **********************************************************
-@node S-expressions
-@chapter S-expressions
-
-S-expressions are used by the public key functions to pass complex data
-structures around. These LISP like objects are used by some
-cryptographic protocols (cf. RFC-2692) and Libgcrypt provides functions
-to parse and construct them. For detailed information, see
-@cite{Ron Rivest, code and description of S-expressions,
-@uref{http://theory.lcs.mit.edu/~rivest/sexp.html}}.
-
-@menu
-* Data types for S-expressions:: Data types related with S-expressions.
-* Working with S-expressions:: How to work with S-expressions.
-@end menu
-
-@node Data types for S-expressions
-@section Data types for S-expressions
-
-@deftp {Data type} gcry_sexp_t
-The @code{gcry_sexp_t} type describes an object with the Libgcrypt internal
-representation of an S-expression.
-@end deftp
-
-@node Working with S-expressions
-@section Working with S-expressions
-
-@noindent
-There are several functions to create an Libgcrypt S-expression object
-from its external representation or from a string template. There is
-also a function to convert the internal representation back into one of
-the external formats:
-
-
-@deftypefun gcry_error_t gcry_sexp_new (@w{gcry_sexp_t *@var{r_sexp}}, @w{const void *@var{buffer}}, @w{size_t @var{length}}, @w{int @var{autodetect}})
-
-This is the generic function to create an new S-expression object from
-its external representation in @var{buffer} of @var{length} bytes. On
-success the result is stored at the address given by @var{r_sexp}.
-With @var{autodetect} set to 0, the data in @var{buffer} is expected to
-be in canonized format, with @var{autodetect} set to 1 the parses any of
-the defined external formats. If @var{buffer} does not hold a valid
-S-expression an error code is returned and @var{r_sexp} set to
-@code{NULL}.
-Note that the caller is responsible for releasing the newly allocated
-S-expression using @code{gcry_sexp_release}.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_sexp_create (@w{gcry_sexp_t *@var{r_sexp}}, @w{void *@var{buffer}}, @w{size_t @var{length}}, @w{int @var{autodetect}}, @w{void (*@var{freefnc})(void*)})
-
-This function is identical to @code{gcry_sexp_new} but has an extra
-argument @var{freefnc}, which, when not set to @code{NULL}, is expected
-to be a function to release the @var{buffer}; most likely the standard
-@code{free} function is used for this argument. This has the effect of
-transferring the ownership of @var{buffer} to the created object in
-@var{r_sexp}. The advantage of using this function is that Libgcrypt
-might decide to directly use the provided buffer and thus avoid extra
-copying.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_sexp_sscan (@w{gcry_sexp_t *@var{r_sexp}}, @w{size_t *@var{erroff}}, @w{const char *@var{buffer}}, @w{size_t @var{length}})
-
-This is another variant of the above functions. It behaves nearly
-identical but provides an @var{erroff} argument which will receive the
-offset into the buffer where the parsing stopped on error.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_sexp_build (@w{gcry_sexp_t *@var{r_sexp}}, @w{size_t *@var{erroff}}, @w{const char *@var{format}, ...})
-
-This function creates an internal S-expression from the string template
-@var{format} and stores it at the address of @var{r_sexp}. If there is a
-parsing error, the function returns an appropriate error code and stores
-the offset into @var{format} where the parsing stopped in @var{erroff}.
-The function supports a couple of printf-like formatting characters and
-expects arguments for some of these escape sequences right after
-@var{format}. The following format characters are defined:
-
-@table @samp
-@item %m
-The next argument is expected to be of type @code{gcry_mpi_t} and a copy of
-its value is inserted into the resulting S-expression.
-@item %s
-The next argument is expected to be of type @code{char *} and that
-string is inserted into the resulting S-expression.
-@item %d
-The next argument is expected to be of type @code{int} and its value is
-inserted into the resulting S-expression.
-@item %b
-The next argument is expected to be of type @code{int} directly
-followed by an argument of type @code{char *}. This represents a
-buffer of given length to be inserted into the resulting S-expression.
-@item %S
-The next argument is expected to be of type @code{gcry_sexp_t} and a
-copy of that S-expression is embedded in the resulting S-expression.
-The argument needs to be a regular S-expression, starting with a
-parenthesis.
-
-@end table
-
-@noindent
-No other format characters are defined and would return an error. Note
-that the format character @samp{%%} does not exists, because a percent
-sign is not a valid character in an S-expression.
-@end deftypefun
-
-@deftypefun void gcry_sexp_release (@w{gcry_sexp_t @var{sexp}})
-
-Release the S-expression object @var{sexp}. If the S-expression is
-stored in secure memory it explicitly zeroises that memory; note that
-this is done in addition to the zeroisation always done when freeing
-secure memory.
-@end deftypefun
-
-
-@noindent
-The next 2 functions are used to convert the internal representation
-back into a regular external S-expression format and to show the
-structure for debugging.
-
-@deftypefun size_t gcry_sexp_sprint (@w{gcry_sexp_t @var{sexp}}, @w{int @var{mode}}, @w{char *@var{buffer}}, @w{size_t @var{maxlength}})
-
-Copies the S-expression object @var{sexp} into @var{buffer} using the
-format specified in @var{mode}. @var{maxlength} must be set to the
-allocated length of @var{buffer}. The function returns the actual
-length of valid bytes put into @var{buffer} or 0 if the provided buffer
-is too short. Passing @code{NULL} for @var{buffer} returns the required
-length for @var{buffer}. For convenience reasons an extra byte with
-value 0 is appended to the buffer.
-
-@noindent
-The following formats are supported:
-
-@table @code
-@item GCRYSEXP_FMT_DEFAULT
-Returns a convenient external S-expression representation.
-
-@item GCRYSEXP_FMT_CANON
-Return the S-expression in canonical format.
-
-@item GCRYSEXP_FMT_BASE64
-Not currently supported.
-
-@item GCRYSEXP_FMT_ADVANCED
-Returns the S-expression in advanced format.
-@end table
-@end deftypefun
-
-@deftypefun void gcry_sexp_dump (@w{gcry_sexp_t @var{sexp}})
-
-Dumps @var{sexp} in a format suitable for debugging to Libgcrypt's
-logging stream.
-@end deftypefun
-
-@noindent
-Often canonical encoding is used in the external representation. The
-following function can be used to check for valid encoding and to learn
-the length of the S-expression"
-
-@deftypefun size_t gcry_sexp_canon_len (@w{const unsigned char *@var{buffer}}, @w{size_t @var{length}}, @w{size_t *@var{erroff}}, @w{int *@var{errcode}})
-
-Scan the canonical encoded @var{buffer} with implicit length values and
-return the actual length this S-expression uses. For a valid S-expression
-it should never return 0. If @var{length} is not 0, the maximum
-length to scan is given; this can be used for syntax checks of
-data passed from outside. @var{errcode} and @var{erroff} may both be
-passed as @code{NULL}.
-
-@end deftypefun
-
-
-@noindent
-There are functions to parse S-expressions and retrieve elements:
-
-@deftypefun gcry_sexp_t gcry_sexp_find_token (@w{const gcry_sexp_t @var{list}}, @w{const char *@var{token}}, @w{size_t @var{toklen}})
-
-Scan the S-expression for a sublist with a type (the car of the list)
-matching the string @var{token}. If @var{toklen} is not 0, the token is
-assumed to be raw memory of this length. The function returns a newly
-allocated S-expression consisting of the found sublist or @code{NULL}
-when not found.
-@end deftypefun
-
-
-@deftypefun int gcry_sexp_length (@w{const gcry_sexp_t @var{list}})
-
-Return the length of the @var{list}. For a valid S-expression this
-should be at least 1.
-@end deftypefun
-
-
-@deftypefun gcry_sexp_t gcry_sexp_nth (@w{const gcry_sexp_t @var{list}}, @w{int @var{number}})
-
-Create and return a new S-expression from the element with index @var{number} in
-@var{list}. Note that the first element has the index 0. If there is
-no such element, @code{NULL} is returned.
-@end deftypefun
-
-@deftypefun gcry_sexp_t gcry_sexp_car (@w{const gcry_sexp_t @var{list}})
-
-Create and return a new S-expression from the first element in
-@var{list}; this called the "type" and should always exist and be a
-string. @code{NULL} is returned in case of a problem.
-@end deftypefun
-
-@deftypefun gcry_sexp_t gcry_sexp_cdr (@w{const gcry_sexp_t @var{list}})
-
-Create and return a new list form all elements except for the first one.
-Note that this function may return an invalid S-expression because it
-is not guaranteed, that the type exists and is a string. However, for
-parsing a complex S-expression it might be useful for intermediate
-lists. Returns @code{NULL} on error.
-@end deftypefun
-
-
-@deftypefun {const char *} gcry_sexp_nth_data (@w{const gcry_sexp_t @var{list}}, @w{int @var{number}}, @w{size_t *@var{datalen}})
-
-This function is used to get data from a @var{list}. A pointer to the
-actual data with index @var{number} is returned and the length of this
-data will be stored to @var{datalen}. If there is no data at the given
-index or the index represents another list, @code{NULL} is returned.
-@strong{Caution:} The returned pointer is valid as long as @var{list} is
-not modified or released.
-
-@noindent
-Here is an example on how to extract and print the surname (Meier) from
-the S-expression @samp{(Name Otto Meier (address Burgplatz 3))}:
-
-@example
-size_t len;
-const char *name;
-
-name = gcry_sexp_nth_data (list, 2, &len);
-printf ("my name is %.*s\n", (int)len, name);
-@end example
-@end deftypefun
-
-@deftypefun {char *} gcry_sexp_nth_string (@w{gcry_sexp_t @var{list}}, @w{int @var{number}})
-
-This function is used to get and convert data from a @var{list}. The
-data is assumed to be a Nul terminated string. The caller must
-release this returned value using @code{gcry_free}. If there is
-no data at the given index, the index represents a list or the value
-can't be converted to a string, @code{NULL} is returned.
-@end deftypefun
-
-@deftypefun gcry_mpi_t gcry_sexp_nth_mpi (@w{gcry_sexp_t @var{list}}, @w{int @var{number}}, @w{int @var{mpifmt}})
-
-This function is used to get and convert data from a @var{list}. This
-data is assumed to be an MPI stored in the format described by
-@var{mpifmt} and returned as a standard Libgcrypt MPI. The caller must
-release this returned value using @code{gcry_mpi_release}. If there is
-no data at the given index, the index represents a list or the value
-can't be converted to an MPI, @code{NULL} is returned.
-@end deftypefun
-
-
-@c **********************************************************
-@c ******************* MPIs ******** ***********************
-@c **********************************************************
-@node MPI library
-@chapter MPI library
-
-@menu
-* Data types:: MPI related data types.
-* Basic functions:: First steps with MPI numbers.
-* MPI formats:: External representation of MPIs.
-* Calculations:: Performing MPI calculations.
-* Comparisons:: How to compare MPI values.
-* Bit manipulations:: How to access single bits of MPI values.
-* Miscellaneous:: Miscellaneous MPI functions.
-@end menu
-
-Public key cryptography is based on mathematics with large numbers. To
-implement the public key functions, a library for handling these large
-numbers is required. Because of the general usefulness of such a
-library, its interface is exposed by Libgcrypt.
-In the context of Libgcrypt and in most other applications, these large
-numbers are called MPIs (multi-precision-integers).
-
-@node Data types
-@section Data types
-
-@deftp {Data type} {gcry_mpi_t}
-This type represents an object to hold an MPI.
-@end deftp
-
-@node Basic functions
-@section Basic functions
-
-@noindent
-To work with MPIs, storage must be allocated and released for the
-numbers. This can be done with one of these functions:
-
-@deftypefun gcry_mpi_t gcry_mpi_new (@w{unsigned int @var{nbits}})
-
-Allocate a new MPI object, initialize it to 0 and initially allocate
-enough memory for a number of at least @var{nbits}. This pre-allocation is
-only a small performance issue and not actually necessary because
-Libgcrypt automatically re-allocates the required memory.
-@end deftypefun
-
-@deftypefun gcry_mpi_t gcry_mpi_snew (@w{unsigned int @var{nbits}})
-
-This is identical to @code{gcry_mpi_new} but allocates the MPI in the so
-called "secure memory" which in turn will take care that all derived
-values will also be stored in this "secure memory". Use this for highly
-confidential data like private key parameters.
-@end deftypefun
-
-@deftypefun gcry_mpi_t gcry_mpi_copy (@w{const gcry_mpi_t @var{a}})
-
-Create a new MPI as the exact copy of @var{a}.
-@end deftypefun
-
-
-@deftypefun void gcry_mpi_release (@w{gcry_mpi_t @var{a}})
-
-Release the MPI @var{a} and free all associated resources. Passing
-@code{NULL} is allowed and ignored. When a MPI stored in the "secure
-memory" is released, that memory gets wiped out immediately.
-@end deftypefun
-
-@noindent
-The simplest operations are used to assign a new value to an MPI:
-
-@deftypefun gcry_mpi_t gcry_mpi_set (@w{gcry_mpi_t @var{w}}, @w{const gcry_mpi_t @var{u}})
-
-Assign the value of @var{u} to @var{w} and return @var{w}. If
-@code{NULL} is passed for @var{w}, a new MPI is allocated, set to the
-value of @var{u} and returned.
-@end deftypefun
-
-@deftypefun gcry_mpi_t gcry_mpi_set_ui (@w{gcry_mpi_t @var{w}}, @w{unsigned long @var{u}})
-
-Assign the value of @var{u} to @var{w} and return @var{w}. If
-@code{NULL} is passed for @var{w}, a new MPI is allocated, set to the
-value of @var{u} and returned. This function takes an @code{unsigned
-int} as type for @var{u} and thus it is only possible to set @var{w} to
-small values (usually up to the word size of the CPU).
-@end deftypefun
-
-@deftypefun void gcry_mpi_swap (@w{gcry_mpi_t @var{a}}, @w{gcry_mpi_t @var{b}})
-
-Swap the values of @var{a} and @var{b}.
-@end deftypefun
-
-@node MPI formats
-@section MPI formats
-
-@noindent
-The following functions are used to convert between an external
-representation of an MPI and the internal one of Libgcrypt.
-
-@deftypefun gcry_error_t gcry_mpi_scan (@w{gcry_mpi_t *@var{r_mpi}}, @w{enum gcry_mpi_format @var{format}}, @w{const unsigned char *@var{buffer}}, @w{size_t @var{buflen}}, @w{size_t *@var{nscanned}})
-
-Convert the external representation of an integer stored in @var{buffer}
-with a length of @var{buflen} into a newly created MPI returned which
-will be stored at the address of @var{r_mpi}. For certain formats the
-length argument is not required and should be passed as @code{0}. After a
-successful operation the variable @var{nscanned} receives the number of
-bytes actually scanned unless @var{nscanned} was given as
-@code{NULL}. @var{format} describes the format of the MPI as stored in
-@var{buffer}:
-
-@table @code
-@item GCRYMPI_FMT_STD
-2-complement stored without a length header.
-
-@item GCRYMPI_FMT_PGP
-As used by OpenPGP (only defined as unsigned). This is basically
-@code{GCRYMPI_FMT_STD} with a 2 byte big endian length header.
-
-@item GCRYMPI_FMT_SSH
-As used in the Secure Shell protocol. This is @code{GCRYMPI_FMT_STD}
-with a 4 byte big endian header.
-
-@item GCRYMPI_FMT_HEX
-Stored as a C style string with each byte of the MPI encoded as 2 hex
-digits. When using this format, @var{buflen} must be zero.
-
-@item GCRYMPI_FMT_USG
-Simple unsigned integer.
-@end table
-
-@noindent
-Note that all of the above formats store the integer in big-endian
-format (MSB first).
-@end deftypefun
-
-
-@deftypefun gcry_error_t gcry_mpi_print (@w{enum gcry_mpi_format @var{format}}, @w{unsigned char *@var{buffer}}, @w{size_t @var{buflen}}, @w{size_t *@var{nwritten}}, @w{const gcry_mpi_t @var{a}})
-
-Convert the MPI @var{a} into an external representation described by
-@var{format} (see above) and store it in the provided @var{buffer}
-which has a usable length of at least the @var{buflen} bytes. If
-@var{nwritten} is not NULL, it will receive the number of bytes
-actually stored in @var{buffer} after a successful operation.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_mpi_aprint (@w{enum gcry_mpi_format @var{format}}, @w{unsigned char **@var{buffer}}, @w{size_t *@var{nbytes}}, @w{const gcry_mpi_t @var{a}})
-
-Convert the MPI @var{a} into an external representation described by
-@var{format} (see above) and store it in a newly allocated buffer which
-address will be stored in the variable @var{buffer} points to. The
-number of bytes stored in this buffer will be stored in the variable
-@var{nbytes} points to, unless @var{nbytes} is @code{NULL}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_dump (@w{const gcry_mpi_t @var{a}})
-
-Dump the value of @var{a} in a format suitable for debugging to
-Libgcrypt's logging stream. Note that one leading space but no trailing
-space or linefeed will be printed. It is okay to pass @code{NULL} for
-@var{a}.
-@end deftypefun
-
-
-@node Calculations
-@section Calculations
-
-@noindent
-Basic arithmetic operations:
-
-@deftypefun void gcry_mpi_add (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}})
-
-@math{@var{w} = @var{u} + @var{v}}.
-@end deftypefun
-
-
-@deftypefun void gcry_mpi_add_ui (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{unsigned long @var{v}})
-
-@math{@var{w} = @var{u} + @var{v}}. Note that @var{v} is an unsigned integer.
-@end deftypefun
-
-
-@deftypefun void gcry_mpi_addm (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}}, @w{gcry_mpi_t @var{m}})
-
-@math{@var{w} = @var{u} + @var{v} \bmod @var{m}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_sub (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}})
-
-@math{@var{w} = @var{u} - @var{v}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_sub_ui (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{unsigned long @var{v}})
-
-@math{@var{w} = @var{u} - @var{v}}. @var{v} is an unsigned integer.
-@end deftypefun
-
-@deftypefun void gcry_mpi_subm (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}}, @w{gcry_mpi_t @var{m}})
-
-@math{@var{w} = @var{u} - @var{v} \bmod @var{m}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_mul (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}})
-
-@math{@var{w} = @var{u} * @var{v}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_mul_ui (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{unsigned long @var{v}})
-
-@math{@var{w} = @var{u} * @var{v}}. @var{v} is an unsigned integer.
-@end deftypefun
-
-@deftypefun void gcry_mpi_mulm (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{gcry_mpi_t @var{v}}, @w{gcry_mpi_t @var{m}})
-
-@math{@var{w} = @var{u} * @var{v} \bmod @var{m}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_mul_2exp (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}, @w{unsigned long @var{e}})
-
-@c FIXME: I am in need for a real TeX{info} guru:
-@c I don't know why TeX can grok @var{e} here.
-@math{@var{w} = @var{u} * 2^e}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_div (@w{gcry_mpi_t @var{q}}, @w{gcry_mpi_t @var{r}}, @w{gcry_mpi_t @var{dividend}}, @w{gcry_mpi_t @var{divisor}}, @w{int @var{round}})
-
-@math{@var{q} = @var{dividend} / @var{divisor}}, @math{@var{r} =
-@var{dividend} \bmod @var{divisor}}. @var{q} and @var{r} may be passed
-as @code{NULL}. @var{round} should be negative or 0.
-@end deftypefun
-
-@deftypefun void gcry_mpi_mod (@w{gcry_mpi_t @var{r}}, @w{gcry_mpi_t @var{dividend}}, @w{gcry_mpi_t @var{divisor}})
-
-@math{@var{r} = @var{dividend} \bmod @var{divisor}}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_powm (@w{gcry_mpi_t @var{w}}, @w{const gcry_mpi_t @var{b}}, @w{const gcry_mpi_t @var{e}}, @w{const gcry_mpi_t @var{m}})
-
-@c I don't know why TeX can grok @var{e} here.
-@math{@var{w} = @var{b}^e \bmod @var{m}}.
-@end deftypefun
-
-@deftypefun int gcry_mpi_gcd (@w{gcry_mpi_t @var{g}}, @w{gcry_mpi_t @var{a}}, @w{gcry_mpi_t @var{b}})
-
-Set @var{g} to the greatest common divisor of @var{a} and @var{b}.
-Return true if the @var{g} is 1.
-@end deftypefun
-
-@deftypefun int gcry_mpi_invm (@w{gcry_mpi_t @var{x}}, @w{gcry_mpi_t @var{a}}, @w{gcry_mpi_t @var{m}})
-
-Set @var{x} to the multiplicative inverse of @math{@var{a} \bmod @var{m}}.
-Return true if the inverse exists.
-@end deftypefun
-
-
-@node Comparisons
-@section Comparisons
-
-@noindent
-The next 2 functions are used to compare MPIs:
-
-
-@deftypefun int gcry_mpi_cmp (@w{const gcry_mpi_t @var{u}}, @w{const gcry_mpi_t @var{v}})
-
-Compare the multi-precision-integers number @var{u} and @var{v}
-returning 0 for equality, a positive value for @var{u} > @var{v} and a
-negative for @var{u} < @var{v}.
-@end deftypefun
-
-@deftypefun int gcry_mpi_cmp_ui (@w{const gcry_mpi_t @var{u}}, @w{unsigned long @var{v}})
-
-Compare the multi-precision-integers number @var{u} with the unsigned
-integer @var{v} returning 0 for equality, a positive value for @var{u} >
-@var{v} and a negative for @var{u} < @var{v}.
-@end deftypefun
-
-
-@node Bit manipulations
-@section Bit manipulations
-
-@noindent
-There are a couple of functions to get information on arbitrary bits
-in an MPI and to set or clear them:
-
-@deftypefun {unsigned int} gcry_mpi_get_nbits (@w{gcry_mpi_t @var{a}})
-
-Return the number of bits required to represent @var{a}.
-@end deftypefun
-
-@deftypefun int gcry_mpi_test_bit (@w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Return true if bit number @var{n} (counting from 0) is set in @var{a}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_set_bit (@w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Set bit number @var{n} in @var{a}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_clear_bit (@w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Clear bit number @var{n} in @var{a}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_set_highbit (@w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Set bit number @var{n} in @var{a} and clear all bits greater than @var{n}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_clear_highbit (@w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Clear bit number @var{n} in @var{a} and all bits greater than @var{n}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_rshift (@w{gcry_mpi_t @var{x}}, @w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Shift the value of @var{a} by @var{n} bits to the right and store the
-result in @var{x}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_lshift (@w{gcry_mpi_t @var{x}}, @w{gcry_mpi_t @var{a}}, @w{unsigned int @var{n}})
-
-Shift the value of @var{a} by @var{n} bits to the left and store the
-result in @var{x}.
-@end deftypefun
-
-@node Miscellaneous
-@section Miscellaneous
-
-@deftypefun gcry_mpi_t gcry_mpi_set_opaque (@w{gcry_mpi_t @var{a}}, @w{void *@var{p}}, @w{unsigned int @var{nbits}})
-
-Store @var{nbits} of the value @var{p} points to in @var{a} and mark
-@var{a} as an opaque value (i.e. an value that can't be used for any
-math calculation and is only used to store an arbitrary bit pattern in
-@var{a}).
-
-WARNING: Never use an opaque MPI for actual math operations. The only
-valid functions are gcry_mpi_get_opaque and gcry_mpi_release. Use
-gcry_mpi_scan to convert a string of arbitrary bytes into an MPI.
-
-@end deftypefun
-
-@deftypefun {void *} gcry_mpi_get_opaque (@w{gcry_mpi_t @var{a}}, @w{unsigned int *@var{nbits}})
-
-Return a pointer to an opaque value stored in @var{a} and return its
-size in @var{nbits}. Note that the returned pointer is still owned by
-@var{a} and that the function should never be used for an non-opaque
-MPI.
-@end deftypefun
-
-@deftypefun void gcry_mpi_set_flag (@w{gcry_mpi_t @var{a}}, @w{enum gcry_mpi_flag @var{flag}})
-
-Set the @var{flag} for the MPI @var{a}. Currently only the flag
-@code{GCRYMPI_FLAG_SECURE} is allowed to convert @var{a} into an MPI
-stored in "secure memory".
-@end deftypefun
-
-@deftypefun void gcry_mpi_clear_flag (@w{gcry_mpi_t @var{a}}, @w{enum gcry_mpi_flag @var{flag}})
-
-Clear @var{flag} for the multi-precision-integers @var{a}. Note that
-this function is currently useless as no flags are allowed.
-@end deftypefun
-
-@deftypefun int gcry_mpi_get_flag (@w{gcry_mpi_t @var{a}}, @w{enum gcry_mpi_flag @var{flag}})
-
-Return true when the @var{flag} is set for @var{a}.
-@end deftypefun
-
-@deftypefun void gcry_mpi_randomize (@w{gcry_mpi_t @var{w}}, @w{unsigned int @var{nbits}}, @w{enum gcry_random_level @var{level}})
-
-Set the multi-precision-integers @var{w} to a random value of
-@var{nbits}, using random data quality of level @var{level}. In case
-@var{nbits} is not a multiple of a byte, @var{nbits} is rounded up to
-the next byte boundary. When using a @var{level} of
-@code{GCRY_WEAK_RANDOM} this function makes use of
-@code{gcry_create_nonce}.
-@end deftypefun
-
-@c **********************************************************
-@c ******************** Prime numbers ***********************
-@c **********************************************************
-@node Prime numbers
-@chapter Prime numbers
-
-@menu
-* Generation:: Generation of new prime numbers.
-* Checking:: Checking if a given number is prime.
-@end menu
-
-@node Generation
-@section Generation
-
-@deftypefun gcry_error_t gcry_prime_generate (gcry_mpi_t *@var{prime},unsigned int @var{prime_bits}, unsigned int @var{factor_bits}, gcry_mpi_t **@var{factors}, gcry_prime_check_func_t @var{cb_func}, void *@var{cb_arg}, gcry_random_level_t @var{random_level}, unsigned int @var{flags})
-
-Generate a new prime number of @var{prime_bits} bits and store it in
-@var{prime}. If @var{factor_bits} is non-zero, one of the prime factors
-of (@var{prime} - 1) / 2 must be @var{factor_bits} bits long. If
-@var{factors} is non-zero, allocate a new, @code{NULL}-terminated array
-holding the prime factors and store it in @var{factors}. @var{flags}
-might be used to influence the prime number generation process.
-@end deftypefun
-
-@deftypefun gcry_error_t gcry_prime_group_generator (gcry_mpi_t *@var{r_g}, gcry_mpi_t @var{prime}, gcry_mpi_t *@var{factors}, gcry_mpi_t @var{start_g})
-
-Find a generator for @var{prime} where the factorization of
-(@var{prime}-1) is in the @code{NULL} terminated array @var{factors}.
-Return the generator as a newly allocated MPI in @var{r_g}. If
-@var{start_g} is not NULL, use this as the start for the search.
-@end deftypefun
-
-@deftypefun void gcry_prime_release_factors (gcry_mpi_t *@var{factors})
-
-Convenience function to release the @var{factors} array.
-@end deftypefun
-
-@node Checking
-@section Checking
-
-@deftypefun gcry_error_t gcry_prime_check (gcry_mpi_t @var{p}, unsigned int @var{flags})
-
-Check wether the number @var{p} is prime. Returns zero in case @var{p}
-is indeed a prime, returns @code{GPG_ERR_NO_PRIME} in case @var{p} is
-not a prime and a different error code in case something went horribly
-wrong.
-@end deftypefun
-
-@c **********************************************************
-@c ******************** Utilities ***************************
-@c **********************************************************
-@node Utilities
-@chapter Utilities
-
-@menu
-* Memory allocation:: Functions related with memory allocation.
-@end menu
-
-@node Memory allocation
-@section Memory allocation
-
-@deftypefun {void *} gcry_malloc (size_t @var{n})
-
-This function tries to allocate @var{n} bytes of memory. On success
-it returns a pointer to the memory area, in an out-of-core condition,
-it returns NULL.
-@end deftypefun
-
-@deftypefun {void *} gcry_malloc_secure (size_t @var{n})
-Like @code{gcry_malloc}, but uses secure memory.
-@end deftypefun
-
-@deftypefun {void *} gcry_calloc (size_t @var{n}, size_t @var{m})
-
-This function allocates a cleared block of memory (i.e. initialized with
-zero bytes) long enough to contain a vector of @var{n} elements, each of
-size @var{m} bytes. On success it returns a pointer to the memory
-block; in an out-of-core condition, it returns NULL.
-@end deftypefun
-
-@deftypefun {void *} gcry_calloc_secure (size_t @var{n}, size_t @var{m})
-Like @code{gcry_calloc}, but uses secure memory.
-@end deftypefun
-
-@deftypefun {void *} gcry_realloc (void *@var{p}, size_t @var{n})
-
-This function tries to resize the memory area pointed to by @var{p} to
-@var{n} bytes. On success it returns a pointer to the new memory
-area, in an out-of-core condition, it returns NULL. Depending on
-whether the memory pointed to by @var{p} is secure memory or not,
-gcry_realloc tries to use secure memory as well.
-@end deftypefun
-
-@deftypefun void gcry_free (void *@var{p})
-Release the memory area pointed to by @var{p}.
-@end deftypefun
-
-@c **********************************************************
-@c ***************** Architecure Overview *****************
-@c **********************************************************
-@node Architecture
-@chapter Architecture
-
-This chapter describes the internal architecture of Libgcrypt.
-
-Libgcrypt is a function library written in ISO C-90. Any compliant
-compiler should be able to build Libgcrypt as long as the target is
-either a POSIX platform or compatible to the API used by Windows NT.
-Provisions have been take so that the library can be directly used from
-C++ applications; however building with a C++ compiler is not supported.
-
-Building Libgcrypt is done by using the common @code{./configure && make}
-approach. The configure command is included in the source distribution
-and as a portable shell script it works on any Unix-alike system. The
-result of running the configure script are a C header file
-(@file{config.h}), customized Makefiles, the setup of symbolic links and
-a few other things. After that the make tool builds and optionally
-installs the library and the documentation. See the files
-@file{INSTALL} and @file{README} in the source distribution on how to do
-this.
-
-Libgcrypt is developed using a Subversion@footnote{A version control
-system available for many platforms} repository. Although all released
-versions are tagged in this repository, they should not be used to build
-production versions of Libgcrypt. Instead released tarballs should be
-used. These tarballs are available from several places with the master
-copy at @indicateurl{ftp://ftp.gnupg.org/gcrypt/libgcrypt/}.
-Announcements of new releases are posted to the
-@indicateurl{gnupg-announce@@gnupg.org} mailing list@footnote{See
-@url{http://www.gnupg.org/documentation/mailing-lists.en.html} for
-details.}.
-
-
-@float Figure,fig:subsystems
-@caption{Libgcrypt subsystems}
-@center @image{libgcrypt-modules, 150mm,,Libgcrypt subsystems}
-@end float
-
-Libgcrypt consists of several subsystems (@pxref{fig:subsystems}) and
-all these subsystems provide a public API; this includes the helper
-subsystems like the one for S-expressions. The API style depends on the
-subsystem; in general an open-use-close approach is implemented. The
-open returns a handle to a context used for all further operations on
-this handle, several functions may then be used on this handle and a
-final close function releases all resources associated with the handle.
-
-@menu
-* Public-Key Subsystem Architecture:: About public keys.
-* Symmetric Encryption Subsystem Architecture:: About standard ciphers.
-* Hashing and MACing Subsystem Architecture:: About hashing.
-* Multi-Precision-Integer Subsystem Architecture:: About big integers.
-* Prime-Number-Generator Subsystem Architecture:: About prime numbers.
-* Random-Number Subsystem Architecture:: About random stuff.
-@c * Helper Subsystems Architecture:: About other stuff.
-@end menu
-
-
-
-@node Public-Key Subsystem Architecture
-@section Public-Key Architecture
-
-Libgcrypt implements two interfaces for public key cryptography: The
-standard interface is PK interface using functions in the
-@code{gcry_pk_} name space. The AC interface in an alternative one
-which is now deprecated and will not be further described. The AC
-interface is also disabled in FIPS mode.
-
-Because public key cryptography is almost always used to process small
-amounts of data (hash values or session keys), the interface is not
-implemented using the open-use-close paradigm, but with single
-self-contained functions. Due to the wide variety of parameters
-required by different algorithms S-expressions, as flexible way to
-convey these parameters, are used. There is a set of helper functions
-to work with these S-expressions.
-@c see @xref{S-expression Subsystem Architecture}.
-
-Aside of functions to register new algorithms, map algorithms names to
-algorithms identifiers and to lookup properties of a key, the
-following main functions are available:
-
-@table @code
-
-@item gcry_pk_encrypt
-Encrypt data using a public key.
-
-@item gcry_pk_decrypt
-Decrypt data using a private key.
-
-@item gcry_pk_sign
-Sign data using a private key.
-
-@item gcry_pk_verify
-Verify that a signature matches the data.
-
-@item gcry_pk_testkey
-Perform a consistency over a public or private key.
-
-@item gcry_pk_genkey
-Create a new public/private key pair.
-
-@end table
-
-With the help of the module registration system all these functions
-lookup the module implementing the algorithm and pass the actual work
-to that module. The parsing of the S-expression input and the
-construction of S-expression for the return values is done by the high
-level code (@file{cipher/pubkey.c}). Thus the internal interface
-between the algorithm modules and the high level functions passes data
-in a custom format. The interface to the modules is published
-(@file{gcrypt-modules.h}) so that it can used to register external
-implementations of algorithms with Libgcrypt. However, for some
-algorithms this module interface is to limited and thus for the
-internal modules an extra interface is sometimes used to convey more
-information.
-
-By default Libgcrypt uses a blinding technique for RSA decryption to
-mitigate real world timing attacks over a network: Instead of using
-the RSA decryption directly, a blinded value @math{y = x r^{e} \bmod n}
-is decrypted and the unblinded value @math{x' = y' r^{-1} \bmod n}
-returned. The blinding value @math{r} is a random value with the size
-of the modulus @math{n} and generated with @code{GCRY_WEAK_RANDOM}
-random level.
-
-@cindex X9.31
-@cindex FIPS 186
-The algorithm used for RSA and DSA key generation depends on whether
-Libgcrypt is operated in standard or in FIPS mode. In standard mode
-an algorithm based on the Lim-Lee prime number generator is used. In
-FIPS mode RSA keys are generated as specified in ANSI X9.31 (1998) and
-DSA keys as specified in FIPS 186-2.
-
-
-
-@node Symmetric Encryption Subsystem Architecture
-@section Symmetric Encryption Subsystem Architecture
-
-The interface to work with symmetric encryption algorithms is made up
-of functions from the @code{gcry_cipher_} name space. The
-implementation follows the open-use-close paradigm and uses registered
-algorithm modules for the actual work. Unless a module implements
-optimized cipher mode implementations, the high level code
-(@file{cipher/cipher.c}) implements the modes and calls the core
-algorithm functions to process each block.
-
-The most important functions are:
-
-@table @code
-
-@item gcry_cipher_open
-Create a new instance to encrypt or decrypt using a specified
-algorithm and mode.
-
-@item gcry_cipher_close
-Release an instance.
-
-@item gcry_cipher_setkey
-Set a key to be used for encryption or decryption.
-
-@item gcry_cipher_setiv
-Set an initialization vector to be used for encryption or decryption.
-
-@item gcry_cipher_encrypt
-@itemx gcry_cipher_decrypt
-Encrypt or decrypt data. These functions may be called with arbitrary
-amounts of data and as often as needed to encrypt or decrypt all data.
-
-@end table
-
-There are also functions to query properties of algorithms or context,
-like block length, key length, map names or to enable features like
-padding methods.
-
-
-
-@node Hashing and MACing Subsystem Architecture
-@section Hashing and MACing Subsystem Architecture
-
-The interface to work with message digests and CRC algorithms is made
-up of functions from the @code{gcry_md_} name space. The
-implementation follows the open-use-close paradigm and uses registered
-algorithm modules for the actual work. Although CRC algorithms are
-not considered cryptographic hash algorithms, they share enough
-properties so that it makes sense to handle them in the same way.
-It is possible to use several algorithms at once with one context and
-thus compute them all on the same data.
-
-The most important functions are:
-
-@table @code
-@item gcry_md_open
-Create a new message digest instance and optionally enable one
-algorithm. A flag may be used to turn the message digest algorithm
-into a HMAC algorithm.
-
-@item gcry_md_enable
-Enable an additional algorithm for the instance.
-
-@item gcry_md_setkey
-Set the key for the MAC.
-
-@item gcry_md_write
-Pass more data for computing the message digest to an instance.
-
-@item gcry_md_putc
-Buffered version of @code{gcry_md_write} implemented as a macro.
-
-@item gcry_md_read
-Finalize the computation of the message digest or HMAC and return the
-result.
-
-@item gcry_md_close
-Release an instance
-
-@item gcry_md_hash_buffer
-Convenience function to directly compute a message digest over a
-memory buffer without the need to create an instance first.
-
-@end table
-
-There are also functions to query properties of algorithms or the
-instance, like enabled algorithms, digest length, map algorithm names.
-it is also possible to reset an instance or to copy the current state
-of an instance at any time. Debug functions to write the hashed data
-to files are available as well.
-
-
-
-@node Multi-Precision-Integer Subsystem Architecture
-@section Multi-Precision-Integer Subsystem Architecture
-
-The implementation of Libgcrypt's big integer computation code is
-based on an old release of GNU Multi-Precision Library (GMP). The
-decision not to use the GMP library directly was due to stalled
-development at that time and due to security requirements which could
-not be provided by the code in GMP. As GMP does, Libgcrypt provides
-high performance assembler implementations of low level code for
-several CPUS to gain much better performance than with a generic C
-implementation.
-
-@noindent
-Major features of Libgcrypt's multi-precision-integer code compared to
-GMP are:
-
-@itemize
-@item
-Avoidance of stack based allocations to allow protection against
-swapping out of sensitive data and for easy zeroing of sensitive
-intermediate results.
-
-@item
-Optional use of secure memory and tracking of its use so that results
-are also put into secure memory.
-
-@item
-MPIs are identified by a handle (implemented as a pointer) to give
-better control over allocations and to augment them with extra
-properties like opaque data.
-
-@item
-Removal of unnecessary code to reduce complexity.
-
-@item
-Functions specialized for public key cryptography.
-
-@end itemize
-
-
-
-@node Prime-Number-Generator Subsystem Architecture
-@section Prime-Number-Generator Subsystem Architecture
-
-Libgcrypt provides an interface to its prime number generator. These
-functions make use of the internal prime number generator which is
-required for the generation for public key key pairs. The plain prime
-checking function is exported as well.
-
-The generation of random prime numbers is based on the Lim and Lee
-algorithm to create practically save primes.@footnote{Chae Hoon Lim
-and Pil Joong Lee. A key recovery attack on discrete log-based shemes
-using a prime order subgroup. In Burton S. Kaliski Jr., editor,
-Advances in Cryptology: Crypto '97, pages 249­-263, Berlin /
-Heidelberg / New York, 1997. Springer-Verlag. Described on page 260.}
-This algorithm creates a pool of smaller primes, select a few of them
-to create candidate primes of the form @math{2 * p_0 * p_1 * ... * p_n
-+ 1}, tests the candidate for primality and permutates the pool until
-a prime has been found. It is possible to clamp one of the small
-primes to a certain size to help DSA style algorithms. Because most
-of the small primes in the pool are not used for the resulting prime
-number, they are saved for later use (see @code{save_pool_prime} and
-@code{get_pool_prime} in @file{cipher/primegen.c}). The prime
-generator optionally supports the finding of an appropriate generator.
-
-@noindent
-The primality test works in three steps:
-
-@enumerate
-@item
-The standard sieve algorithm using the primes up to 4999 is used as a
-quick first check.
-
-@item
-A Fermat test filters out almost all non-primes.
-
-@item
-A 5 round Rabin-Miller test is finally used. The first round uses a
-witness of 2, whereas the next rounds use a random witness.
-
-@end enumerate
-
-To support the generation of RSA and DSA keys in FIPS mode according
-to X9.31 and FIPS 186-2, Libgcrypt implements two additional prime
-generation functions: @code{_gcry_derive_x931_prime} and
-@code{_gcry_generate_fips186_2_prime}. These functions are internal
-and not available through the public API.
-
-
-
-@node Random-Number Subsystem Architecture
-@section Random-Number Subsystem Architecture
-
-Libgcrypt provides 3 levels or random quality: The level
-@code{GCRY_VERY_STRONG_RANDOM} usually used for key generation, the
-level @code{GCRY_STRONG_RANDOM} for all other strong random
-requirements and the function @code{gcry_create_nonce} which is used
-for weaker usages like nonces. There is also a level
-@code{GCRY_WEAK_RANDOM} which in general maps to
-@code{GCRY_STRONG_RANDOM} except when used with the function
-@code{gcry_mpi_randomize}, where it randomizes an
-multi-precision-integer using the @code{gcry_create_nonce} function.
-
-@noindent
-There are two distinct random generators available:
-
-@itemize
-@item
-The Continuously Seeded Pseudo Random Number Generator (CSPRNG), which
-is based on the classic GnuPG derived big pool implementation.
-Implemented in @code{random/random-csprng.c} and used by default.
-@item
-A FIPS approved ANSI X9.31 PRNG using AES with a 128 bit key. Implemented in
-@code{random/random-fips.c} and used if Libgcrypt is in FIPS mode.
-@end itemize
-
-@noindent
-Both generators make use of so-called entropy gathering modules:
-
-@table @asis
-@item rndlinux
-Uses the operating system provided
-@file{/dev/random} and @file{/dev/urandom} devices.
-
-@item rndunix
-Runs several operating system commands to collect entropy from sources
-like virtual machine and process statistics. It is a kind of
-poor-man's @code{/dev/random} implementation. It is not available in
-FIPS mode.
-
-@item rndegd
-Uses the operating system provided Entropy Gathering Daemon (EGD).
-The EGD basically uses the same algorithms as rndunix does. However
-as a system daemon it keeps on running and thus can serve several
-processes requiring entropy input and does not waste collected entropy
-if the application does not need all the collected entropy. It is not
-available in FIPS mode.
-
-@item rndw32
-Targeted for the Microsoft Windows OS. It uses certain properties of
-that system and is the only gathering module available for that OS.
-
-@item rndhw
-Extra module to collect additional entropy by utilizing a hardware
-random number generator. As of now the only supported hardware RNG is
-the Padlock engine of VIA (Centaur) CPUs. It is not available in FIPS
-mode.
-
-@end table
-
-
-@menu
-* CSPRNG Description:: Description of the CSPRNG.
-* FIPS PRNG Description:: Description of the FIPS X9.31 PRNG.
-@end menu
-
-
-@node CSPRNG Description
-@subsection Description of the CSPRNG
-
-This random number generator is loosely modelled after the one
-described in Peter Gutmann's paper: "Software Generation of
-Practically Strong Random Numbers".@footnote{Also described in chapter
-6 of his book "Cryptographic Security Architecture", New York, 2004,
-ISBN 0-387-95387-6.}
-
-A pool of 600 bytes is used and mixed using the core RIPE-MD160 hash
-transform function. Several extra features are used to make the
-robust against a wide variety of attacks and to protect against
-failures of subsystems. The state of the generator may be saved to a
-file and initially seed form a file.
-
-Depending on how Libgcrypt was build the generator is able to select
-the best working entropy gathering module. It makes use of the slow
-and fast collection methods and requires the pool to initially seeded
-form the slow gatherer or a seed file. An entropy estimation is used
-to mix in enough data from the gather modules before returning the
-actual random output. Process fork detection and protection is
-implemented.
-
-@c FIXME: The design and implementaion needs a more verbose description.
-
-The implementation of the nonce generator (for
-@code{gcry_create_nonce}) is a straightforward repeated hash design: A
-28 byte buffer is initially seeded with the PID and the time in
-seconds in the first 20 bytes and with 8 bytes of random taken from
-the @code{GCRY_STRONG_RANDOM} generator. Random numbers are then
-created by hashing all the 28 bytes with SHA-1 and saving that again
-in the first 20 bytes. The hash is also returned as result.
-
-
-@node FIPS PRNG Description
-@subsection Description of the FIPS X9.31 PRNG
-
-The core of this deterministic random number generator is implemented
-according to the document ``NIST-Recommended Random Number Generator
-Based on ANSI X9.31 Appendix A.2.4 Using the 3-Key Triple DES and AES
-Algorithms'', dated 2005-01-31. This implementation uses the AES
-variant.
-
-The generator is based on contexts to utilize the same core functions
-for all random levels as required by the high-level interface. All
-random generators return their data in 128 bit blocks. If the caller
-requests less bits, the extra bits are not used. The key for each
-generator is only set once at the first time a generator context is
-used. The seed value is set along with the key and again after 1000
-output blocks.
-
-On Unix like systems the @code{GCRY_VERY_STRONG_RANDOM} and
-@code{GCRY_STRONG_RANDOM} generators are keyed and seeded using the
-rndlinux module with the @file{/dev/radnom} device. Thus these
-generators may block until the OS kernel has collected enough entropy.
-When used with Microsoft Windows the rndw32 module is used instead.
-
-The generator used for @code{gcry_create_nonce} is keyed and seeded
-from the @code{GCRY_STRONG_RANDOM} generator. Thus is may also block
-if the @code{GCRY_STRONG_RANDOM} generator has not yet been used
-before and thus gets initialized on the first use by
-@code{gcry_create_nonce}. This special treatment is justified by the
-weaker requirements for a nonce generator and to save precious kernel
-entropy for use by the ``real'' random generators.
-
-A self-test facility uses a separate context to check the
-functionality of the core X9.31 functions using a known answers test.
-During runtime each output block is compared to the previous one to
-detect a stucked generator.
-
-The DT value for the generator is made up of the current time down to
-microseconds (if available) and a free running 64 bit counter. When
-used with the test context the DT value is taken from the context and
-incremented on each use.
-
-@c @node Helper Subsystems Architecture
-@c @section Helper Subsystems Architecture
-@c
-@c There are a few smaller subsystems which are mainly used internally by
-@c Libgcrypt but also available to applications.
-@c
-@c @menu
-@c * S-expression Subsystem Architecture:: Details about the S-expression architecture.
-@c * Memory Subsystem Architecture:: Details about the memory allocation architecture.
-@c * Miscellaneous Subsystems Architecture:: Details about other subsystems.
-@c @end menu
-@c
-@c @node S-expression Subsystem Architecture
-@c @subsection S-expression Subsystem Architecture
-@c
-@c Libgcrypt provides an interface to S-expression to create and parse
-@c them. To use an S-expression with Libgcrypt it needs first be
-@c converted into the internal representation used by Libgcrypt (the type
-@c @code{gcry_sexp_t}). The conversion functions support a large subset
-@c of the S-expression specification and further fature a printf like
-@c function to convert a list of big integers or other binary data into
-@c an S-expression.
-@c
-@c Libgcrypt currently implements S-expressions using a tagged linked
-@c list. However this is not exposed to an application and may be
-@c changed in future releases to reduce overhead when already working
-@c with canonically encoded S-expressions. Secure memory is supported by
-@c this S-expressions implementation.
-@c
-@c @node Memory Subsystem Architecture
-@c @subsection Memory Subsystem Architecture
-@c
-@c TBD.
-@c
-@c
-@c @node Miscellaneous Subsystems Architecture
-@c @subsection Miscellaneous Subsystems Architecture
-@c
-@c TBD.
-@c
-@c
-
-
-
-@c **********************************************************
-@c ******************* Appendices *************************
-@c **********************************************************
-
-@c ********************************************
-@node Self-Tests
-@appendix Description of the Self-Tests
-
-In addition to the build time regression test suite, Libgcrypt
-implements self-tests to be performed at runtime. Which self-tests
-are actually used depends on the mode Libgcrypt is used in. In
-standard mode a limited set of self-tests is run at the time an
-algorithm is first used. Note that not all algorithms feature a
-self-test in standard mode. The @code{GCRYCTL_SELFTEST} control
-command may be used to run all implemented self-tests at any time;
-this will even run more tests than those run in FIPS mode.
-
-If any of the self-tests fails, the library immediately returns an
-error code to the caller. If Libgcrypt is in FIPS mode the self-tests
-will be performed within the ``Self-Test'' state and any failure puts
-the library into the ``Error'' state.
-
-@c --------------------------------
-@section Power-Up Tests
-
-Power-up tests are only performed if Libgcrypt is in FIPS mode.
-
-@subsection Symmetric Cipher Algorithm Power-Up Tests
-
-The following symmetric encryption algorithm tests are run during
-power-up:
-
-@table @asis
-@item 3DES
-To test the 3DES 3-key EDE encryption in ECB mode these tests are
-run:
-@enumerate
-@item
-A known answer test is run on a 64 bit test vector processed by 64
-rounds of Single-DES block encryption and decryption using a key
-changed with each round.
-@item
-A known answer test is run on a 64 bit test vector processed by 16
-rounds of 2-key and 3-key Triple-DES block encryption and decryptions
-using a key changed with each round.
-@item
-10 known answer tests using 3-key Triple-DES EDE encryption, comparing
-the ciphertext to the known value, then running a decryption and
-comparing it to the initial plaintext.
-@end enumerate
-(@code{cipher/des.c:selftest})
-
-@item AES-128
-A known answer tests is run using one test vector and one test
-key with AES in ECB mode. (@code{cipher/rijndael.c:selftest_basic_128})
-
-@item AES-192
-A known answer tests is run using one test vector and one test
-key with AES in ECB mode. (@code{cipher/rijndael.c:selftest_basic_192})
-
-@item AES-256
-A known answer tests is run using one test vector and one test key
-with AES in ECB mode. (@code{cipher/rijndael.c:selftest_basic_256})
-@end table
-
-@subsection Hash Algorithm Power-Up Tests
-
-The following hash algorithm tests are run during power-up:
-
-@table @asis
-@item SHA-1
-A known answer test using the string @code{"abc"} is run.
-(@code{cipher/@/sha1.c:@/selftests_sha1})
-@item SHA-224
-A known answer test using the string @code{"abc"} is run.
-(@code{cipher/@/sha256.c:@/selftests_sha224})
-@item SHA-256
-A known answer test using the string @code{"abc"} is run.
-(@code{cipher/@/sha256.c:@/selftests_sha256})
-@item SHA-384
-A known answer test using the string @code{"abc"} is run.
-(@code{cipher/@/sha512.c:@/selftests_sha384})
-@item SHA-512
-A known answer test using the string @code{"abc"} is run.
-(@code{cipher/@/sha512.c:@/selftests_sha512})
-@end table
-
-@subsection MAC Algorithm Power-Up Tests
-
-The following MAC algorithm tests are run during power-up:
-
-@table @asis
-@item HMAC SHA-1
-A known answer test using 9 byte of data and a 64 byte key is run.
-(@code{cipher/hmac-tests.c:selftests_sha1})
-@item HMAC SHA-224
-A known answer test using 28 byte of data and a 4 byte key is run.
-(@code{cipher/hmac-tests.c:selftests_sha224})
-@item HMAC SHA-256
-A known answer test using 28 byte of data and a 4 byte key is run.
-(@code{cipher/hmac-tests.c:selftests_sha256})
-@item HMAC SHA-384
-A known answer test using 28 byte of data and a 4 byte key is run.
-(@code{cipher/hmac-tests.c:selftests_sha384})
-@item HMAC SHA-512
-A known answer test using 28 byte of data and a 4 byte key is run.
-(@code{cipher/hmac-tests.c:selftests_sha512})
-@end table
-
-@subsection Random Number Power-Up Test
-
-The DRNG is tested during power-up this way:
-
-@enumerate
-@item
-Requesting one block of random using the public interface to check
-general working and the duplicated block detection.
-@item
-3 know answer tests using pre-defined keys, seed and initial DT
-values. For each test 3 blocks of 16 bytes are requested and compared
-to the expected result. The DT value is incremented for each block.
-@end enumerate
-
-@subsection Public Key Algorithm Power-Up Tests
-
-The public key algorithms are tested during power-up:
-
-@table @asis
-@item RSA
-A pre-defined 1024 bit RSA key is used and these tests are run
-in turn:
-@enumerate
-@item
-Conversion of S-expression to internal format.
-(@code{cipher/@/rsa.c:@/selftests_rsa})
-@item
-Private key consistency check.
-(@code{cipher/@/rsa.c:@/selftests_rsa})
-@item
-A pre-defined 20 byte value is signed with PKCS#1 padding for SHA-1.
-The result is verified using the public key against the original data
-and against modified data. (@code{cipher/@/rsa.c:@/selftest_sign_1024})
-@item
-A 1000 bit random value is encrypted and checked that it does not
-match the orginal random value. The encrtypted result is then
-decrypted and checked that it macthes the original random value.
-(@code{cipher/@/rsa.c:@/selftest_encr_1024})
-@end enumerate
-
-@item DSA
-A pre-defined 1024 bit DSA key is used and these tests are run in turn:
-@enumerate
-@item
-Conversion of S-expression to internal format.
-(@code{cipher/@/dsa.c:@/selftests_dsa})
-@item
-Private key consistency check.
-(@code{cipher/@/dsa.c:@/selftests_dsa})
-@item
-A pre-defined 20 byte value is signed with PKCS#1 padding for
-SHA-1. The result is verified using the public key against the
-original data and against modified data.
-(@code{cipher/@/dsa.c:@/selftest_sign_1024})
-@end enumerate
-@end table
-
-@subsection Integrity Power-Up Tests
-
-The integrity of the Libgcrypt is tested during power-up but only if
-checking has been enabled at build time. The check works by computing
-a HMAC SHA-256 checksum over the file used to load Libgcrypt into
-memory. That checksum is compared against a checksum stored in a file
-of the same name but with a single dot as a prefix and a suffix of
-@file{.hmac}.
-
-
-@subsection Critical Functions Power-Up Tests
-
-The 3DES weak key detection is tested during power-up by calling the
-detection function with keys taken from a table listening all weak
-keys. The table itself is protected using a SHA-1 hash.
-(@code{cipher/@/des.c:@/selftest})
-
-
-
-@c --------------------------------
-@section Conditional Tests
-
-The conditional tests are performed if a certain contidion is met.
-This may occur at any time; the library does not necessary enter the
-``Self-Test'' state to run these tests but will transit to the
-``Error'' state if a test failed.
-
-@subsection Key-Pair Generation Tests
-
-After an asymmetric key-pair has been generated, Libgcrypt runs a
-pair-wise consistency tests on the generated key. On failure the
-generated key is not used, an error code is returned and, if in FIPS
-mode, the library is put into the ``Error'' state.
-
-@table @asis
-@item RSA
-The test uses a random number 64 bits less the size of the modulus as
-plaintext and runs an encryption and decryption operation in turn. The
-encrypted value is checked to not match the plaintext and the result
-of the decryption is checked to match the plaintext.
-
-A new random number of the same size is generated, signed and verified
-to test the correctness of the signing operation. As a second signing
-test, the signature is modified by incrementing its value and then
-verified with the expected result that the verification fails.
-(@code{cipher/@/rsa.c:@/test_keys})
-@item DSA
-The test uses a random number of the size of the Q parameter to create
-a signature and then checks that the signature verifies. As a second
-signing test, the data is modified by incrementing its value and then
-verified against the signature with the expected result that the
-verification fails. (@code{cipher/@/dsa.c:@/test_keys})
-@end table
-
-
-@subsection Software Load Tests
-
-Loading of extra modules into libgcrypt is disabled in FIPS mode and
-thus no tests are
-implemented. (@code{cipher/@/cipher.c:@/_gcry_cipher_register},
-@code{cipher/@/md.c:@/_gcry_md_register},
-@code{cipher/@/pubkey.c:@/_gcry_pk_register})
-
-
-@subsection Manual Key Entry Tests
-
-A manual key entry feature is not implemented in Libgcrypt.
-
-
-@subsection Continuous RNG Tests
-
-The continuous random number test is only used in FIPS mode. The RNG
-generates blocks of 128 bit size; the first block generated per
-context is saved in the context and another block is generated to be
-returned to the caller. Each block is compared against the saved
-block and then stored in the context. If a duplicated block is
-detected an error is signaled and the libray is put into the
-``Fatal-Error'' state.
-(@code{random/@/random-fips.c:@/x931_aes_driver})
-
-
-
-@c --------------------------------
-@section Application Requested Tests
-
-The application may requests tests at any time by means of the
-@code{GCRYCTL_SELFTEST} control command. Note that using these tests
-is not FIPS conform: Although Libgcrypt rejects all application
-requests for services while running self-tests, it does not ensure
-that no other operations of Libgcrypt are still being executed. Thus,
-in FIPS mode an application requesting self-tests needs to power-cycle
-Libgcrypt instead.
-
-When self-tests are requested, Libgcrypt runs all the tests it does
-during power-up as well as a few extra checks as described below.
-
-@subsection Symmetric Cipher Algorithm Tests
-
-The following symmetric encryption algorithm tests are run in addition
-to the power-up tests:
-
-@table @asis
-@item AES-128
-A known answer tests with test vectors taken from NIST SP800-38a and
-using the high level functions is run for block modes CFB and OFB.
-
-@end table
-
-@subsection Hash Algorithm Tests
-
-The following hash algorithm tests are run in addition to the
-power-up tests:
-
-@table @asis
-@item SHA-1
-@itemx SHA-224
-@itemx SHA-256
-@enumerate
-@item
-A known answer test using a 56 byte string is run.
-@item
-A known answer test using a string of one million letters "a" is run.
-@end enumerate
-(@code{cipher/@/sha1.c:@/selftests_sha1},
-@code{cipher/@/sha256.c:@/selftests_sha224},
-@code{cipher/@/sha256.c:@/selftests_sha256})
-@item SHA-384
-@item SHA-512
-@enumerate
-@item
-A known answer test using a 112 byte string is run.
-@item
-A known answer test using a string of one million letters "a" is run.
-@end enumerate
-(@code{cipher/@/sha512.c:@/selftests_sha384},
-@code{cipher/@/sha512.c:@/selftests_sha512})
-@end table
-
-@subsection MAC Algorithm Tests
-
-The following MAC algorithm tests are run in addition to the power-up
-tests:
-
-@table @asis
-@item HMAC SHA-1
-@enumerate
-@item
-A known answer test using 9 byte of data and a 20 byte key is run.
-@item
-A known answer test using 9 byte of data and a 100 byte key is run.
-@item
-A known answer test using 9 byte of data and a 49 byte key is run.
-@end enumerate
-(@code{cipher/hmac-tests.c:selftests_sha1})
-@item HMAC SHA-224
-@itemx HMAC SHA-256
-@itemx HMAC SHA-384
-@itemx HMAC SHA-512
-@enumerate
-@item
-A known answer test using 9 byte of data and a 20 byte key is run.
-@item
-A known answer test using 50 byte of data and a 20 byte key is run.
-@item
-A known answer test using 50 byte of data and a 26 byte key is run.
-@item
-A known answer test using 54 byte of data and a 131 byte key is run.
-@item
-A known answer test using 152 byte of data and a 131 byte key is run.
-@end enumerate
-(@code{cipher/@/hmac-tests.c:@/selftests_sha224},
-@code{cipher/@/hmac-tests.c:@/selftests_sha256},
-@code{cipher/@/hmac-tests.c:@/selftests_sha384},
-@code{cipher/@/hmac-tests.c:@/selftests_sha512})
-@end table
-
-
-@c ********************************************
-@node FIPS Mode
-@appendix Description of the FIPS Mode
-
-This appendix gives detailed information pertaining to the FIPS mode.
-In particular, the changes to the standard mode and the finite state
-machine are described. The self-tests required in this mode are
-described in the appendix on self-tests.
-
-@c -------------------------------
-@section Restrictions in FIPS Mode
-
-@noindent
-If Libgcrypt is used in FIPS mode these restrictions are effective:
-
-@itemize
-@item
-The cryptographic algorithms are restricted to this list:
-
-@table @asis
-@item GCRY_CIPHER_3DES
-3 key EDE Triple-DES symmetric encryption.
-@item GCRY_CIPHER_AES128
-AES 128 bit symmetric encryption.
-@item GCRY_CIPHER_AES192
-AES 192 bit symmetric encryption.
-@item GCRY_CIPHER_AES256
-AES 256 bit symmetric encryption.
-@item GCRY_MD_SHA1
-SHA-1 message digest.
-@item GCRY_MD_SHA224
-SHA-224 message digest.
-@item GCRY_MD_SHA256
-SHA-256 message digest.
-@item GCRY_MD_SHA384
-SHA-384 message digest.
-@item GCRY_MD_SHA512
-SHA-512 message digest.
-@item GCRY_MD_SHA1,GCRY_MD_FLAG_HMAC
-HMAC using a SHA-1 message digest.
-@item GCRY_MD_SHA224,GCRY_MD_FLAG_HMAC
-HMAC using a SHA-224 message digest.
-@item GCRY_MD_SHA256,GCRY_MD_FLAG_HMAC
-HMAC using a SHA-256 message digest.
-@item GCRY_MD_SHA384,GCRY_MD_FLAG_HMAC
-HMAC using a SHA-384 message digest.
-@item GCRY_MD_SHA512,GCRY_MD_FLAG_HMAC
-HMAC using a SHA-512 message digest.
-@item GCRY_PK_RSA
-RSA encryption and signing.
-@item GCRY_PK_DSA
-DSA signing.
-@end table
-
-Note that the CRC algorithms are not considered cryptographic algorithms
-and thus are in addition available.
-
-@item
-RSA key generation refuses to create a key with a keysize of
-less than 1024 bits.
-
-@item
-DSA key generation refuses to create a key with a keysize other
-than 1024 bits.
-
-@item
-The @code{transient-key} flag for RSA and DSA key generation is ignored.
-
-@item
-Support for the VIA Padlock engine is disabled.
-
-@item
-FIPS mode may only be used on systems with a /dev/random device.
-Switching into FIPS mode on other systems will fail at runtime.
-
-@item
-Saving and loading a random seed file is ignored.
-
-@item
-An X9.31 style random number generator is used in place of the
-large-pool-CSPRNG generator.
-
-@item
-The command @code{GCRYCTL_ENABLE_QUICK_RANDOM} is ignored.
-
-@item
-The Alternative Public Key Interface (@code{gcry_ac_xxx}) is not
-supported and all API calls return an error.
-
-@item
-Registration of external modules is not supported.
-
-@item
-Message digest debugging is disabled.
-
-@item
-All debug output related to cryptographic data is suppressed.
-
-@item
-On-the-fly self-tests are not performed, instead self-tests are run
-before entering operational state.
-
-@item
-The function @code{gcry_set_allocation_handler} may not be used. If
-it is used Libgcrypt disables FIPS mode unless Enforced FIPS mode is
-enabled, in which case Libgcrypt will enter the error state.
-
-@item
-The digest algorithm MD5 may not be used. If it is used Libgcrypt
-disables FIPS mode unless Enforced FIPS mode is enabled, in which case
-Libgcrypt will enter the error state.
-
-@item
-In Enforced FIPS mode the command @code{GCRYCTL_DISABLE_SECMEM} is
-ignored. In standard FIPS mode it disables FIPS mode.
-
-@item
-A handler set by @code{gcry_set_outofcore_handler} is ignored.
-@item
-A handler set by @code{gcry_set_fatalerror_handler} is ignored.
-
-@end itemize
-
-Note that when we speak about disabling FIPS mode, it merely means
-that the function @code{gcry_fips_mode_active} returns false; it does
-not mean that any non FIPS algorithms are allowed.
-
-@c ********************************************
-@section FIPS Finite State Machine
-
-The FIPS mode of libgcrypt implements a finite state machine (FSM) using
-8 states (@pxref{tbl:fips-states}) and checks at runtime that only valid
-transitions (@pxref{tbl:fips-state-transitions}) may happen.
-
-@float Figure,fig:fips-fsm
-@caption{FIPS mode state diagram}
-@center @image{fips-fsm,150mm,,FIPS FSM Diagram}
-@end float
-
-@float Table,tbl:fips-states
-@caption{FIPS mode states}
-@noindent
-States used by the FIPS FSM:
-@table @asis
-
-@item Power-Off
-Libgcrypt is not runtime linked to another application. This usually
-means that the library is not loaded into main memory. This state is
-documentation only.
-
-@item Power-On
-Libgcrypt is loaded into memory and API calls may be made. Compiler
-introducted constructor functions may be run. Note that Libgcrypt does
-not implement any arbitrary constructor functions to be called by the
-operating system
-
-@item Init
-The Libgcrypt initialization functions are performed and the library has
-not yet run any self-test.
-
-@item Self-Test
-Libgcrypt is performing self-tests.
-
-@item Operational
-Libgcrypt is in the operational state and all interfaces may be used.
-
-@item Error
-Libgrypt is in the error state. When calling any FIPS relevant
-interfaces they either return an error (@code{GPG_ERR_NOT_OPERATIONAL})
-or put Libgcrypt into the Fatal-Error state and won't return.
-
-@item Fatal-Error
-Libgcrypt is in a non-recoverable error state and
-will automatically transit into the Shutdown state.
-
-@item Shutdown
-Libgcrypt is about to be terminated and removed from the memory. The
-application may at this point still runing cleanup handlers.
-
-@end table
-@end float
-
-
-@float Table,tbl:fips-state-transitions
-@caption{FIPS mode state transitions}
-@noindent
-The valid state transitions (@pxref{fig:fips-fsm}) are:
-@table @code
-@item 1
-Power-Off to Power-On is implicitly done by the OS loading Libgcrypt as
-a shared library and having it linked to an application.
-
-@item 2
-Power-On to Init is triggered by the application calling the
-Libgcrypt intialization function @code{gcry_check_version}.
-
-@item 3
-Init to Self-Test is either triggred by a dedicated API call or implicit
-by invoking a libgrypt service conrolled by the FSM.
-
-@item 4
-Self-Test to Operational is triggered after all self-tests passed
-successfully.
-
-@item 5
-Operational to Shutdown is an artifical state without any direct action
-in Libgcrypt. When reaching the Shutdown state the library is
-deinitialized and can't return to any other state again.
-
-@item 6
-Shutdown to Power-off is the process of removing Libgcrypt from the
-computer's memory. For obvious reasons the Power-Off state can't be
-represented within Libgcrypt and thus this transition is for
-documentation only.
-
-@item 7
-Operational to Error is triggered if Libgcrypt detected an application
-error which can't be returned to the caller but still allows Libgcrypt
-to properly run. In the Error state all FIPS relevant interfaces return
-an error code.
-
-@item 8
-Error to Shutdown is similar to the Operational to Shutdown transition
-(5).
-
-@item 9
-Error to Fatal-Error is triggred if Libgrypt detects an fatal error
-while already being in Error state.
-
-@item 10
-Fatal-Error to Shutdown is automatically entered by Libgcrypt
-after having reported the error.
-
-@item 11
-Power-On to Shutdown is an artifical state to document that Libgcrypt
-has not ye been initializaed but the process is about to terminate.
-
-@item 12
-Power-On to Fatal-Error will be triggerd if certain Libgcrypt functions
-are used without having reached the Init state.
-
-@item 13
-Self-Test to Fatal-Error is triggred by severe errors in Libgcrypt while
-running self-tests.
-
-@item 14
-Self-Test to Error is triggred by a failed self-test.
-
-@item 15
-Operational to Fatal-Error is triggered if Libcrypt encountered a
-non-recoverable error.
-
-@item 16
-Operational to Self-Test is triggred if the application requested to run
-the self-tests again.
-
-@item 17
-Error to Self-Test is triggered if the application has requested to run
-self-tests to get to get back into operational state after an error.
-
-@item 18
-Init to Error is triggered by errors in the initialization code.
-
-@item 19
-Init to Fatal-Error is triggered by non-recoverable errors in the
-initialization code.
-
-@item 20
-Error to Error is triggered by errors while already in the Error
-state.
-
-
-@end table
-@end float
-
-@c ********************************************
-@section FIPS Miscellaneous Information
-
-Libgcrypt does not do any key management on itself; the application
-needs to care about it. Keys which are passed to Libgcrypt should be
-allocated in secure memory as available with the functions
-@code{gcry_malloc_secure} and @code{gcry_calloc_secure}. By calling
-@code{gcry_free} on this memory, the memory and thus the keys are
-overwritten with zero bytes before releasing the memory.
-
-For use with the random number generator, Libgcrypt generates 3
-internal keys which are stored in the encryption contexts used by the
-RNG. These keys are stored in secure memory for the lifetime of the
-process. Application are required to use @code{GCRYCTL_TERM_SECMEM}
-before process termination. This will zero out the entire secure
-memory and thus also the encryption contexts with these keys.
-
-
-
-@c **********************************************************
-@c ************* Appendices (license etc.) ****************
-@c **********************************************************
-@include lgpl.texi
-
-@include gpl.texi
-
-@node Figures and Tables
-@unnumbered List of Figures and Tables
-
-@listoffloats Figure
-
-@listoffloats Table
-
-@node Concept Index
-@unnumbered Concept Index
-
-@printindex cp
-
-@node Function and Data Index
-@unnumbered Function and Data Index
-
-@printindex fn
-
-
-
-@bye
-
-GCRYCTL_SET_RANDOM_DAEMON_SOCKET
-GCRYCTL_USE_RANDOM_DAEMON
-The random damon is still a bit experimental, thus we do not document
-them. Note that they should be used during initialization and that
-these functions are not really thread safe.
-
-
-
-
-@c LocalWords: int HD
-
-
-
-
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.aim.txt b/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.aim.txt
deleted file mode 100644
index c7cbd9272d..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.aim.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-~~~
-AIM
-~~~
-the aim of *.vs projects is to provide a well organized
-and not invasive way to build target open source projects
-using visual studio (vs.6 and vs.net)
-
-~~~~~~
-REASON
-~~~~~~
-In many situations I was obliged to use visual studio in
-writing projects, and writing windows software is best suited
-using this ide.
-When I had need to use these great open source projects in
-my applications, I had to use the binaries provided (if) for
-the win32 environment: but, I think, if it can run in win32,
-it could also be built using win32 compiler/linker.
-I know you have to pay for visual studio, but why don't give
-the opportunity to build using this tool too?
-Moreover I think that providing these projects could increment
-the number of coworker programmers.
-So I decided to provide these visual studio projects. \ No newline at end of file
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.architecture.txt b/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.architecture.txt
deleted file mode 100644
index 4a2c2511f9..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpgvs.architecture.txt
+++ /dev/null
@@ -1,108 +0,0 @@
-~~~~~~~~~~~~
-ARCHITECTURE
-~~~~~~~~~~~~
-I admit that architecture meaning is too much for this project,
-but with this document I explain how is built and
-how to use these projects.
-First of all you should respect the directory structure otherwise
-projects will not compile, but obviously you can change it:
-rembember to change vs workspace relativ paths too.
-Regarding workspaces compile flags: I decided to not provide particular
-building flags, so if you have to optimize (or anything else) you
-have to change settings.
-
-
-~~~~~~~~~~~
-DIRECTORIES
-~~~~~~~~~~~
-As said in “aim” document, I do not want to get inside original
-source code, less than it is not forced:
-so the first step is to look at directories structure (not whole)
-
-
-[anywhwere]\
- \libgcrypt-1.2.1\
- \libgcrypt-1.2.1\
- \[...]
- \gpg.vs\bin.vs\
- \inc.vs\
- \libgcrypt-1.2.1.vs\
- \libgpg-error-1.1.vs\custom\
- \libgpg_error_1_1.dsp
- \libgpg_error_1_1.dsw
-
-There is a "root" directory, use whatever you want:
-inside this directory extract the original package, like
-libgcrypt-1.2.1, libgcrypt-1.2.1 and so on.
-Inside the "root" download/extract gpg.vs (otr.vs) project:
-you should have at least the same directories structure just shown.
-Inside you have "[original.package.name].vs" and all tools to be
-able to build original packages with visual studio.
-
-
-~~~~~~
-bin.vs
-~~~~~~
-here we'll go binaries created by visual studio, as
-\bin.vs\libgpg-error-1.1\debug\static\...
-\bin.vs\libgpg-error-1.1\release\static\...
-\bin.vs\libgpg-error-1.1\release\dll\...
-
-
-~~~~~~
-inc.vs
-~~~~~~
-this folder contains include files needed to build original packages
-without changing their code, like empty "socket.h" headers;
-and you will find "hooked" includes (like stddef.h) useful to declare
-definition that visual studio misses (like pid_t)
-
-
-~~~~~~~~~~~~~~~~~
-package.vs.custom
-~~~~~~~~~~~~~~~~~
-here you'll always find package->"config.h" header, made "by hand".
-You will find some others files that under *nix are automatically
-created, and I provide them in a "custom" way
-
-
-~~~~~~~
-EXAMPLE
-~~~~~~~
-You want to compile with vs libgpg-error-1.1.: choose your parent directory,
-in my case “gnu”
-
-\gnu\
-
-download and extract here the libgpg-error-1.1, so now I have
-
-\gnu\libgpg-error-1.1\libgpg-error\[source code]
-
-basically extract always in libgpg-error directory and the
-closest parent is libgpg-error-version, to have
-
-\gnu\libgpg-error-1.0\libgpg-error\[source code]
-\gnu\libgpg-error-1.1\libgpg-error\[source code]
-
-Now download gpg.vs project (or take it from cvs), which includes
-vs project for libgpg-error, and extract it in the directory
-you have choosen (gnu in my case),
-
-\gnu\gpg.vs\
-
-In gpg.vs directory find the libgpg-error-1.1.vs
-(appending .vs at the end of package name is the “standard” for this project)
-
-\gnu\gpg.vs\ libgpg-error-1.1.vs\
-
-And inside find the dsw/dsp of the project
-
-libgpg_error_1_1.dsw
-libgpg_error_1_1.dsp
-
-Note: the little change to names is due to vs limitations.
-You have only to build it.
-The binaries files will be created in
-
-\gnu\gpg.vs\bin.vs\libgpg-error.1.1\debug
-\gnu\gpg.vs\bin.vs\libgpg-error.1.1\release \ No newline at end of file
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpl.texi b/plugins/MirOTR/libgcrypt-1.4.6/doc/gpl.texi
deleted file mode 100644
index d965561869..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/gpl.texi
+++ /dev/null
@@ -1,397 +0,0 @@
-@node Copying
-@unnumbered GNU General Public License
-
-@cindex GPL, GNU General Public License
-@center Version 2, June 1991
-
-@display
-Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@heading Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software---to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
-@iftex
-@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end iftex
-@ifinfo
-@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end ifinfo
-
-@enumerate
-@item
-This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The ``Program'', below,
-refers to any such program or work, and a ``work based on the Program''
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term ``modification''.) Each licensee is addressed as ``you''.
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-@item
-You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-@item
-You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-@enumerate a
-@item
-You must cause the modified files to carry prominent notices
-stating that you changed the files and the date of any change.
-
-@item
-You must cause any work that you distribute or publish, that in
-whole or in part contains or is derived from the Program or any
-part thereof, to be licensed as a whole at no charge to all third
-parties under the terms of this License.
-
-@item
-If the modified program normally reads commands interactively
-when run, you must cause it, when started running for such
-interactive use in the most ordinary way, to print or display an
-announcement including an appropriate copyright notice and a
-notice that there is no warranty (or else, saying that you provide
-a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this
-License. (Exception: if the Program itself is interactive but
-does not normally print such an announcement, your work based on
-the Program is not required to print an announcement.)
-@end enumerate
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-@item
-You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-@enumerate a
-@item
-Accompany it with the complete corresponding machine-readable
-source code, which must be distributed under the terms of Sections
-1 and 2 above on a medium customarily used for software interchange; or,
-
-@item
-Accompany it with a written offer, valid for at least three
-years, to give any third party, for a charge no more than your
-cost of physically performing source distribution, a complete
-machine-readable copy of the corresponding source code, to be
-distributed under the terms of Sections 1 and 2 above on a medium
-customarily used for software interchange; or,
-
-@item
-Accompany it with the information you received as to the offer
-to distribute corresponding source code. (This alternative is
-allowed only for noncommercial distribution and only if you
-received the program in object code or executable form with such
-an offer, in accord with Subsection b above.)
-@end enumerate
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-@item
-You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-@item
-Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-@item
-If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-@item
-If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-@item
-The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and ``any
-later version'', you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-@item
-If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-@iftex
-@heading NO WARRANTY
-@end iftex
-@ifinfo
-@center NO WARRANTY
-@end ifinfo
-
-@item
-BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-@item
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-@end enumerate
-
-@iftex
-@heading END OF TERMS AND CONDITIONS
-@end iftex
-@ifinfo
-@center END OF TERMS AND CONDITIONS
-@end ifinfo
-
-@page
-@heading How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the ``copyright'' line and a pointer to where the full notice is found.
-
-@smallexample
-@var{one line to give the program's name and an idea of what it does.}
-Copyright (C) 19@var{yy} @var{name of author}
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-@end smallexample
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-@smallexample
-Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
-Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-type `show w'. This is free software, and you are welcome
-to redistribute it under certain conditions; type `show c'
-for details.
-@end smallexample
-
-The hypothetical commands @samp{show w} and @samp{show c} should show
-the appropriate parts of the General Public License. Of course, the
-commands you use may be called something other than @samp{show w} and
-@samp{show c}; they could even be mouse-clicks or menu items---whatever
-suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a ``copyright disclaimer'' for the program, if
-necessary. Here is a sample; alter the names:
-
-@smallexample
-@group
-Yoyodyne, Inc., hereby disclaims all copyright
-interest in the program `Gnomovision'
-(which makes passes at compilers) written
-by James Hacker.
-
-@var{signature of Ty Coon}, 1 April 1989
-Ty Coon, President of Vice
-@end group
-@end smallexample
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/lgpl.texi b/plugins/MirOTR/libgcrypt-1.4.6/doc/lgpl.texi
deleted file mode 100644
index a3f83cb353..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/lgpl.texi
+++ /dev/null
@@ -1,565 +0,0 @@
-@node Library Copying
-@unnumbered GNU Lesser General Public License
-
-@cindex LGPL, GNU Lesser General Public License
-@center Version 2.1, February 1999
-
-@display
-Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc.
-59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
-as the successor of the GNU Library Public License, version 2, hence the
-version number 2.1.]
-@end display
-
-@heading Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software---to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software---typically libraries---of the Free
-Software Foundation and other authors who decide to use it. You can use
-it too, but we suggest you first think carefully about whether this
-license or the ordinary General Public License is the better strategy to
-use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of it
-in new free programs; and that you are informed that you can do these
-things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the @dfn{Lesser} General Public License because it
-does @emph{Less} to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-``work based on the library'' and a ``work that uses the library''. The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-@iftex
-@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end iftex
-@ifinfo
-@center GNU LESSER GENERAL PUBLIC LICENSE
-@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end ifinfo
-
-@enumerate 0
-@item
-This License Agreement applies to any software library or other program
-which contains a notice placed by the copyright holder or other
-authorized party saying it may be distributed under the terms of this
-Lesser General Public License (also called ``this License''). Each
-licensee is addressed as ``you''.
-
- A ``library'' means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The ``Library'', below, refers to any such software library or work
-which has been distributed under these terms. A ``work based on the
-Library'' means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term ``modification''.)
-
- ``Source code'' for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-@item
-You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-@item
-You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-@enumerate a
-@item
-The modified work must itself be a software library.
-
-@item
-You must cause the files modified to carry prominent notices
-stating that you changed the files and the date of any change.
-
-@item
-You must cause the whole of the work to be licensed at no
-charge to all third parties under the terms of this License.
-
-@item
-If a facility in the modified Library refers to a function or a
-table of data to be supplied by an application program that uses
-the facility, other than as an argument passed when the facility
-is invoked, then you must make a good faith effort to ensure that,
-in the event an application does not supply such function or
-table, the facility still operates, and performs whatever part of
-its purpose remains meaningful.
-
-(For example, a function in a library to compute square roots has
-a purpose that is entirely well-defined independent of the
-application. Therefore, Subsection 2d requires that any
-application-supplied function or table used by this function must
-be optional: if the application does not supply it, the square
-root function must still compute square roots.)
-@end enumerate
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-@item
-You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-@item
-You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-@item
-A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a ``work that uses the Library''. Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a ``work that uses the Library'' with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a ``work that uses the
-library''. The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a ``work that uses the Library'' uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-@item
-As an exception to the Sections above, you may also combine or
-link a ``work that uses the Library'' with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
-@enumerate a
-@item
-Accompany the work with the complete corresponding
-machine-readable source code for the Library including whatever
-changes were used in the work (which must be distributed under
-Sections 1 and 2 above); and, if the work is an executable linked
-with the Library, with the complete machine-readable ``work that
-uses the Library'', as object code and/or source code, so that the
-user can modify the Library and then relink to produce a modified
-executable containing the modified Library. (It is understood
-that the user who changes the contents of definitions files in the
-Library will not necessarily be able to recompile the application
-to use the modified definitions.)
-
-@item
-Use a suitable shared library mechanism for linking with the Library. A
-suitable mechanism is one that (1) uses at run time a copy of the
-library already present on the user's computer system, rather than
-copying library functions into the executable, and (2) will operate
-properly with a modified version of the library, if the user installs
-one, as long as the modified version is interface-compatible with the
-version that the work was made with.
-
-@item
-Accompany the work with a written offer, valid for at
-least three years, to give the same user the materials
-specified in Subsection 6a, above, for a charge no more
-than the cost of performing this distribution.
-
-@item
-If distribution of the work is made by offering access to copy
-from a designated place, offer equivalent access to copy the above
-specified materials from the same place.
-
-@item
-Verify that the user has already received a copy of these
-materials or that you have already sent this user a copy.
-@end enumerate
-
- For an executable, the required form of the ``work that uses the
-Library'' must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies the
-executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-@item
-You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-@enumerate a
-@item
-Accompany the combined library with a copy of the same work
-based on the Library, uncombined with any other library
-facilities. This must be distributed under the terms of the
-Sections above.
-
-@item
-Give prominent notice with the combined library of the fact
-that part of it is a work based on the Library, and explaining
-where to find the accompanying uncombined form of the same work.
-@end enumerate
-
-@item
-You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-@item
-You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-@item
-Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-@item
-If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-@item
-If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-@item
-The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-``any later version'', you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-@item
-If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-@iftex
-@heading NO WARRANTY
-@end iftex
-@ifinfo
-@center NO WARRANTY
-@end ifinfo
-
-@item
-BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY ``AS IS'' WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-@item
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-@end enumerate
-
-@iftex
-@heading END OF TERMS AND CONDITIONS
-@end iftex
-@ifinfo
-@center END OF TERMS AND CONDITIONS
-@end ifinfo
-
-@page
-@heading How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-``copyright'' line and a pointer to where the full notice is found.
-
-@smallexample
-@var{one line to give the library's name and an idea of what it does.}
-Copyright (C) @var{year} @var{name of author}
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or (at
-your option) any later version.
-
-This library is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
-USA.
-@end smallexample
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a ``copyright disclaimer'' for the library, if
-necessary. Here is a sample; alter the names:
-
-@smallexample
-Yoyodyne, Inc., hereby disclaims all copyright interest in the library
-`Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-@var{signature of Ty Coon}, 1 April 1990
-Ty Coon, President of Vice
-@end smallexample
-
-That's all there is to it!
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.eps b/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.eps
deleted file mode 100644
index a53fdeb673..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.eps
+++ /dev/null
@@ -1,349 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: libgcrypt-modules.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Thu Jul 9 13:24:33 2009
-%%For: wk@vigenere (Werner Koch,,,)
-%%BoundingBox: 0 0 488 300
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-/col32 {0.555 0.555 0.555 srgb} bind def
-/col33 {0.254 0.270 0.254 srgb} bind def
-/col34 {0.750 0.750 0.750 srgb} bind def
-/col35 {0.500 0.500 0.500 srgb} bind def
-/col36 {0.387 0.387 0.387 srgb} bind def
-/col37 {0.801 0.801 0.801 srgb} bind def
-/col38 {0.422 0.422 0.422 srgb} bind def
-/col39 {0.773 0.715 0.590 srgb} bind def
-/col40 {0.934 0.969 0.996 srgb} bind def
-/col41 {0.859 0.793 0.648 srgb} bind def
-/col42 {0.250 0.250 0.250 srgb} bind def
-/col43 {0.875 0.875 0.875 srgb} bind def
-/col44 {0.555 0.559 0.555 srgb} bind def
-/col45 {0.664 0.664 0.664 srgb} bind def
-/col46 {0.332 0.332 0.332 srgb} bind def
-/col47 {0.840 0.840 0.840 srgb} bind def
-/col48 {0.680 0.680 0.680 srgb} bind def
-/col49 {0.742 0.742 0.742 srgb} bind def
-/col50 {0.316 0.316 0.316 srgb} bind def
-/col51 {0.902 0.887 0.902 srgb} bind def
-/col52 {0.000 0.000 0.285 srgb} bind def
-/col53 {0.473 0.473 0.473 srgb} bind def
-/col54 {0.188 0.203 0.188 srgb} bind def
-/col55 {0.254 0.254 0.254 srgb} bind def
-/col56 {0.777 0.711 0.586 srgb} bind def
-/col57 {0.863 0.613 0.574 srgb} bind def
-/col58 {0.941 0.922 0.875 srgb} bind def
-/col59 {0.762 0.762 0.762 srgb} bind def
-/col60 {0.883 0.781 0.656 srgb} bind def
-/col61 {0.879 0.879 0.879 srgb} bind def
-/col62 {0.820 0.820 0.820 srgb} bind def
-/col63 {0.926 0.926 0.926 srgb} bind def
-/col64 {0.852 0.477 0.102 srgb} bind def
-/col65 {0.941 0.891 0.102 srgb} bind def
-/col66 {0.531 0.488 0.758 srgb} bind def
-/col67 {0.836 0.836 0.836 srgb} bind def
-/col68 {0.547 0.547 0.645 srgb} bind def
-/col69 {0.289 0.289 0.289 srgb} bind def
-/col70 {0.547 0.418 0.418 srgb} bind def
-/col71 {0.352 0.352 0.352 srgb} bind def
-/col72 {0.715 0.605 0.449 srgb} bind def
-/col73 {0.254 0.574 0.996 srgb} bind def
-/col74 {0.746 0.438 0.230 srgb} bind def
-/col75 {0.855 0.465 0.000 srgb} bind def
-/col76 {0.852 0.719 0.000 srgb} bind def
-/col77 {0.000 0.391 0.000 srgb} bind def
-/col78 {0.352 0.418 0.230 srgb} bind def
-/col79 {0.824 0.824 0.824 srgb} bind def
-/col80 {0.555 0.555 0.641 srgb} bind def
-/col81 {0.949 0.723 0.363 srgb} bind def
-/col82 {0.535 0.598 0.418 srgb} bind def
-/col83 {0.391 0.391 0.391 srgb} bind def
-/col84 {0.715 0.898 0.996 srgb} bind def
-/col85 {0.523 0.750 0.922 srgb} bind def
-/col86 {0.738 0.738 0.738 srgb} bind def
-/col87 {0.824 0.582 0.320 srgb} bind def
-/col88 {0.594 0.820 0.992 srgb} bind def
-/col89 {0.547 0.609 0.418 srgb} bind def
-/col90 {0.965 0.418 0.000 srgb} bind def
-/col91 {0.352 0.418 0.223 srgb} bind def
-/col92 {0.547 0.609 0.418 srgb} bind def
-/col93 {0.547 0.609 0.480 srgb} bind def
-/col94 {0.094 0.289 0.094 srgb} bind def
-/col95 {0.676 0.676 0.676 srgb} bind def
-/col96 {0.965 0.738 0.352 srgb} bind def
-/col97 {0.387 0.418 0.609 srgb} bind def
-/col98 {0.965 0.965 0.965 srgb} bind def
-/col99 {0.867 0.000 0.000 srgb} bind def
-/col100 {0.676 0.676 0.676 srgb} bind def
-/col101 {0.965 0.738 0.352 srgb} bind def
-/col102 {0.676 0.676 0.676 srgb} bind def
-/col103 {0.965 0.738 0.352 srgb} bind def
-/col104 {0.387 0.418 0.609 srgb} bind def
-/col105 {0.320 0.418 0.160 srgb} bind def
-/col106 {0.578 0.578 0.578 srgb} bind def
-/col107 {0.000 0.387 0.000 srgb} bind def
-/col108 {0.000 0.387 0.289 srgb} bind def
-/col109 {0.480 0.516 0.289 srgb} bind def
-/col110 {0.902 0.738 0.480 srgb} bind def
-/col111 {0.645 0.707 0.773 srgb} bind def
-/col112 {0.418 0.418 0.578 srgb} bind def
-/col113 {0.516 0.418 0.418 srgb} bind def
-/col114 {0.320 0.609 0.289 srgb} bind def
-/col115 {0.836 0.902 0.902 srgb} bind def
-/col116 {0.320 0.387 0.387 srgb} bind def
-/col117 {0.094 0.418 0.289 srgb} bind def
-/col118 {0.609 0.645 0.707 srgb} bind def
-/col119 {0.996 0.578 0.000 srgb} bind def
-/col120 {0.996 0.578 0.000 srgb} bind def
-/col121 {0.000 0.387 0.289 srgb} bind def
-/col122 {0.480 0.516 0.289 srgb} bind def
-/col123 {0.387 0.449 0.480 srgb} bind def
-/col124 {0.902 0.738 0.480 srgb} bind def
-/col125 {0.867 0.867 0.867 srgb} bind def
-/col126 {0.949 0.930 0.824 srgb} bind def
-/col127 {0.957 0.680 0.363 srgb} bind def
-/col128 {0.582 0.805 0.598 srgb} bind def
-/col129 {0.707 0.082 0.488 srgb} bind def
-/col130 {0.930 0.930 0.930 srgb} bind def
-/col131 {0.516 0.516 0.516 srgb} bind def
-/col132 {0.480 0.480 0.480 srgb} bind def
-/col133 {0.000 0.352 0.000 srgb} bind def
-/col134 {0.902 0.449 0.449 srgb} bind def
-/col135 {0.996 0.793 0.191 srgb} bind def
-/col136 {0.160 0.473 0.289 srgb} bind def
-/col137 {0.867 0.156 0.129 srgb} bind def
-/col138 {0.129 0.348 0.773 srgb} bind def
-/col139 {0.969 0.969 0.969 srgb} bind def
-/col140 {0.898 0.898 0.898 srgb} bind def
-/col141 {0.129 0.516 0.352 srgb} bind def
-/col142 {0.785 0.785 0.785 srgb} bind def
-/col143 {0.871 0.844 0.871 srgb} bind def
-/col144 {0.965 0.949 0.965 srgb} bind def
-
-end
-save
-newpath 0 300 moveto 0 0 lineto 488 0 lineto 488 300 lineto closepath clip newpath
--32.6 348.9 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Helvetica /Helvetica-iso isovec ReEncode
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06299 0.06299 sc
-%
-% Fig objects follow
-%
-%
-% here starts figure with depth 50
-/Helvetica-iso ff 300.00 scf sf
-900 1440 m
-gs 1 -1 sc (Public-Key) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-900 1815 m
-gs 1 -1 sc (Encryption) col0 sh gr
-% Polyline
-15.000 slw
-n 645 810 m 540 810 540 2055 105 arcto 4 {pop} repeat
- 540 2160 2685 2160 105 arcto 4 {pop} repeat
- 2790 2160 2790 915 105 arcto 4 {pop} repeat
- 2790 810 645 810 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 300.00 scf sf
-630 3420 m
-gs 1 -1 sc (Multi-Precision-) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-900 3795 m
-gs 1 -1 sc (Integers) col0 sh gr
-% Polyline
-n 645 2790 m 540 2790 540 4035 105 arcto 4 {pop} repeat
- 540 4140 2685 4140 105 arcto 4 {pop} repeat
- 2790 4140 2790 2895 105 arcto 4 {pop} repeat
- 2790 2790 645 2790 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 300.00 scf sf
-3420 3420 m
-gs 1 -1 sc (Prime-Number) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-3420 3795 m
-gs 1 -1 sc (Generator) col0 sh gr
-% Polyline
-n 3345 2790 m 3240 2790 3240 4035 105 arcto 4 {pop} repeat
- 3240 4140 5385 4140 105 arcto 4 {pop} repeat
- 5490 4140 5490 2895 105 arcto 4 {pop} repeat
- 5490 2790 3345 2790 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 300.00 scf sf
-6420 3435 m
-gs 1 -1 sc (Random) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-6420 3810 m
-gs 1 -1 sc (Numbers) col0 sh gr
-% Polyline
-n 6075 2805 m 5970 2805 5970 4050 105 arcto 4 {pop} repeat
- 5970 4155 8115 4155 105 arcto 4 {pop} repeat
- 8220 4155 8220 2910 105 arcto 4 {pop} repeat
- 8220 2805 6075 2805 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 300.00 scf sf
-3600 1440 m
-gs 1 -1 sc (Symmetric) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-3600 1815 m
-gs 1 -1 sc (Encryption) col0 sh gr
-% Polyline
-n 3345 810 m 3240 810 3240 2055 105 arcto 4 {pop} repeat
- 3240 2160 5385 2160 105 arcto 4 {pop} repeat
- 5490 2160 5490 915 105 arcto 4 {pop} repeat
- 5490 810 3345 810 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 300.00 scf sf
-6435 1440 m
-gs 1 -1 sc (Hashing) col0 sh gr
-/Helvetica-iso ff 300.00 scf sf
-6435 1815 m
-gs 1 -1 sc (MACing) col0 sh gr
-% Polyline
-n 6090 810 m 5985 810 5985 2055 105 arcto 4 {pop} repeat
- 5985 2160 8130 2160 105 arcto 4 {pop} repeat
- 8235 2160 8235 915 105 arcto 4 {pop} repeat
- 8235 810 6090 810 105 arcto 4 {pop} repeat
- cp gs col0 s gr
-% Polyline
-n 3513 4563 m 3438 4563 3438 5438 75 arcto 4 {pop} repeat
- 3438 5513 4947 5513 75 arcto 4 {pop} repeat
- 5022 5513 5022 4638 75 arcto 4 {pop} repeat
- 5022 4563 3513 4563 75 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 210.00 scf sf
-3825 5130 m
-gs 1 -1 sc (Memory) col0 sh gr
-% Polyline
-n 5583 4563 m 5508 4563 5508 5438 75 arcto 4 {pop} repeat
- 5508 5513 7017 5513 75 arcto 4 {pop} repeat
- 7092 5513 7092 4638 75 arcto 4 {pop} repeat
- 7092 4563 5583 4563 75 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 210.00 scf sf
-5635 5133 m
-gs 1 -1 sc (Miscelleanous) col0 sh gr
-% Polyline
-n 1443 4567 m 1368 4567 1368 5442 75 arcto 4 {pop} repeat
- 1368 5517 2877 5517 75 arcto 4 {pop} repeat
- 2952 5517 2952 4642 75 arcto 4 {pop} repeat
- 2952 4567 1443 4567 75 arcto 4 {pop} repeat
- cp gs col0 s gr
-/Helvetica-iso ff 210.00 scf sf
-1495 5137 m
-gs 1 -1 sc (S-expressions) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.fig b/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.fig
deleted file mode 100644
index ea3d05372a..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.fig
+++ /dev/null
@@ -1,193 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Metric
-A4
-100.00
-Single
--2
-1200 2
-0 32 #8e8e8e
-0 33 #414541
-0 34 #c0c0c0
-0 35 #808080
-0 36 #636363
-0 37 #cdcdcd
-0 38 #6c6c6c
-0 39 #c6b797
-0 40 #eff8ff
-0 41 #dccba6
-0 42 #404040
-0 43 #e0e0e0
-0 44 #8e8f8e
-0 45 #aaaaaa
-0 46 #555555
-0 47 #d7d7d7
-0 48 #aeaeae
-0 49 #bebebe
-0 50 #515151
-0 51 #e7e3e7
-0 52 #000049
-0 53 #797979
-0 54 #303430
-0 55 #414141
-0 56 #c7b696
-0 57 #dd9d93
-0 58 #f1ece0
-0 59 #c3c3c3
-0 60 #e2c8a8
-0 61 #e1e1e1
-0 62 #d2d2d2
-0 63 #ededed
-0 64 #da7a1a
-0 65 #f1e41a
-0 66 #887dc2
-0 67 #d6d6d6
-0 68 #8c8ca5
-0 69 #4a4a4a
-0 70 #8c6b6b
-0 71 #5a5a5a
-0 72 #b79b73
-0 73 #4193ff
-0 74 #bf703b
-0 75 #db7700
-0 76 #dab800
-0 77 #006400
-0 78 #5a6b3b
-0 79 #d3d3d3
-0 80 #8e8ea4
-0 81 #f3b95d
-0 82 #89996b
-0 83 #646464
-0 84 #b7e6ff
-0 85 #86c0ec
-0 86 #bdbdbd
-0 87 #d39552
-0 88 #98d2fe
-0 89 #8c9c6b
-0 90 #f76b00
-0 91 #5a6b39
-0 92 #8c9c6b
-0 93 #8c9c7b
-0 94 #184a18
-0 95 #adadad
-0 96 #f7bd5a
-0 97 #636b9c
-0 98 #f7f7f7
-0 99 #de0000
-0 100 #adadad
-0 101 #f7bd5a
-0 102 #adadad
-0 103 #f7bd5a
-0 104 #636b9c
-0 105 #526b29
-0 106 #949494
-0 107 #006300
-0 108 #00634a
-0 109 #7b844a
-0 110 #e7bd7b
-0 111 #a5b5c6
-0 112 #6b6b94
-0 113 #846b6b
-0 114 #529c4a
-0 115 #d6e7e7
-0 116 #526363
-0 117 #186b4a
-0 118 #9ca5b5
-0 119 #ff9400
-0 120 #ff9400
-0 121 #00634a
-0 122 #7b844a
-0 123 #63737b
-0 124 #e7bd7b
-0 125 #dedede
-0 126 #f3eed3
-0 127 #f5ae5d
-0 128 #95ce99
-0 129 #b5157d
-0 130 #eeeeee
-0 131 #848484
-0 132 #7b7b7b
-0 133 #005a00
-0 134 #e77373
-0 135 #ffcb31
-0 136 #29794a
-0 137 #de2821
-0 138 #2159c6
-0 139 #f8f8f8
-0 140 #e6e6e6
-0 141 #21845a
-0 142 #c9c9c9
-0 143 #dfd8df
-0 144 #f7f3f7
-6 450 720 8325 5580
-6 450 720 8325 4275
-6 450 720 2880 2250
-6 900 1170 2340 1890
-4 0 0 50 -1 16 20 0.0000 4 300 1410 900 1440 Public-Key\001
-4 0 0 50 -1 16 20 0.0000 4 300 1410 900 1815 Encryption\001
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 2790 2160 2790 810 540 810 540 2160 2790 2160
--6
-6 525 2775 2805 4155
-6 630 3150 2700 3870
-6 630 3150 2700 3870
-4 0 0 50 -1 16 20 0.0000 4 225 2055 630 3420 Multi-Precision-\001
-4 0 0 50 -1 16 20 0.0000 4 300 1095 900 3795 Integers\001
--6
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 2790 4140 2790 2790 540 2790 540 4140 2790 4140
--6
-6 3150 2700 5580 4230
-6 3420 3150 5400 3870
-4 0 0 50 -1 16 20 0.0000 4 225 1965 3420 3420 Prime-Number\001
-4 0 0 50 -1 16 20 0.0000 4 225 1365 3420 3795 Generator\001
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 5490 4140 5490 2790 3240 2790 3240 4140 5490 4140
--6
-6 5880 2715 8310 4245
-6 6420 3165 7680 3885
-4 0 0 50 -1 16 20 0.0000 4 225 1140 6420 3435 Random\001
-4 0 0 50 -1 16 20 0.0000 4 225 1230 6420 3810 Numbers\001
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 8220 4155 8220 2805 5970 2805 5970 4155 8220 4155
--6
-6 3150 720 5580 2250
-6 3600 1170 5040 1890
-4 0 0 50 -1 16 20 0.0000 4 300 1425 3600 1440 Symmetric\001
-4 0 0 50 -1 16 20 0.0000 4 300 1410 3600 1815 Encryption\001
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 5490 2160 5490 810 3240 810 3240 2160 5490 2160
--6
-6 5940 765 8280 2205
-6 6435 1215 7530 1890
-4 0 0 50 -1 16 20 0.0000 4 300 1095 6435 1440 Hashing\001
-4 0 0 50 -1 16 20 0.0000 4 300 1065 6435 1815 MACing\001
--6
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 8235 2160 8235 810 5985 810 5985 2160 8235 2160
--6
--6
-6 1305 4500 7155 5580
-6 3375 4500 5085 5580
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 5 0 0 5
- 5022 5513 5022 4563 3438 4563 3438 5513 5022 5513
-4 0 0 50 -1 16 14 0.0000 4 195 780 3825 5130 Memory\001
--6
-6 5445 4500 7155 5576
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 5 0 0 5
- 7092 5513 7092 4563 5508 4563 5508 5513 7092 5513
-4 0 0 50 -1 16 14 0.0000 4 150 1350 5635 5133 Miscelleanous\001
--6
-6 1305 4504 3015 5580
-2 4 0 2 0 7 50 -1 -1 0.000 0 0 5 0 0 5
- 2952 5517 2952 4567 1368 4567 1368 5517 2952 5517
-4 0 0 50 -1 16 14 0.0000 4 195 1350 1495 5137 S-expressions\001
--6
--6
--6
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.pdf b/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.pdf
deleted file mode 100644
index 23b87a618e..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.pdf
+++ /dev/null
Binary files differ
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.png b/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.png
deleted file mode 100644
index dd194e2dd4..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/libgcrypt-modules.png
+++ /dev/null
Binary files differ
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/mdate-sh b/plugins/MirOTR/libgcrypt-1.4.6/doc/mdate-sh
deleted file mode 100644
index cd916c0a34..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/mdate-sh
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/bin/sh
-# Get modification time of a file or directory and pretty-print it.
-
-scriptversion=2005-06-29.22
-
-# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software
-# Foundation, Inc.
-# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case $1 in
- '')
- echo "$0: No file. Try \`$0 --help' for more information." 1>&2
- exit 1;
- ;;
- -h | --h*)
- cat <<\EOF
-Usage: mdate-sh [--help] [--version] FILE
-
-Pretty-print the modification time of FILE.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
- exit $?
- ;;
- -v | --v*)
- echo "mdate-sh $scriptversion"
- exit $?
- ;;
-esac
-
-# Prevent date giving response in another language.
-LANG=C
-export LANG
-LC_ALL=C
-export LC_ALL
-LC_TIME=C
-export LC_TIME
-
-# GNU ls changes its time format in response to the TIME_STYLE
-# variable. Since we cannot assume `unset' works, revert this
-# variable to its documented default.
-if test "${TIME_STYLE+set}" = set; then
- TIME_STYLE=posix-long-iso
- export TIME_STYLE
-fi
-
-save_arg1=$1
-
-# Find out how to get the extended ls output of a file or directory.
-if ls -L /dev/null 1>/dev/null 2>&1; then
- ls_command='ls -L -l -d'
-else
- ls_command='ls -l -d'
-fi
-
-# A `ls -l' line looks as follows on OS/2.
-# drwxrwx--- 0 Aug 11 2001 foo
-# This differs from Unix, which adds ownership information.
-# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
-#
-# To find the date, we split the line on spaces and iterate on words
-# until we find a month. This cannot work with files whose owner is a
-# user named `Jan', or `Feb', etc. However, it's unlikely that `/'
-# will be owned by a user whose name is a month. So we first look at
-# the extended ls output of the root directory to decide how many
-# words should be skipped to get the date.
-
-# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
-set x`ls -l -d /`
-
-# Find which argument is the month.
-month=
-command=
-until test $month
-do
- shift
- # Add another shift to the command.
- command="$command shift;"
- case $1 in
- Jan) month=January; nummonth=1;;
- Feb) month=February; nummonth=2;;
- Mar) month=March; nummonth=3;;
- Apr) month=April; nummonth=4;;
- May) month=May; nummonth=5;;
- Jun) month=June; nummonth=6;;
- Jul) month=July; nummonth=7;;
- Aug) month=August; nummonth=8;;
- Sep) month=September; nummonth=9;;
- Oct) month=October; nummonth=10;;
- Nov) month=November; nummonth=11;;
- Dec) month=December; nummonth=12;;
- esac
-done
-
-# Get the extended ls output of the file or directory.
-set dummy x`eval "$ls_command \"\$save_arg1\""`
-
-# Remove all preceding arguments
-eval $command
-
-# Because of the dummy argument above, month is in $2.
-#
-# On a POSIX system, we should have
-#
-# $# = 5
-# $1 = file size
-# $2 = month
-# $3 = day
-# $4 = year or time
-# $5 = filename
-#
-# On Darwin 7.7.0 and 7.6.0, we have
-#
-# $# = 4
-# $1 = day
-# $2 = month
-# $3 = year or time
-# $4 = filename
-
-# Get the month.
-case $2 in
- Jan) month=January; nummonth=1;;
- Feb) month=February; nummonth=2;;
- Mar) month=March; nummonth=3;;
- Apr) month=April; nummonth=4;;
- May) month=May; nummonth=5;;
- Jun) month=June; nummonth=6;;
- Jul) month=July; nummonth=7;;
- Aug) month=August; nummonth=8;;
- Sep) month=September; nummonth=9;;
- Oct) month=October; nummonth=10;;
- Nov) month=November; nummonth=11;;
- Dec) month=December; nummonth=12;;
-esac
-
-case $3 in
- ???*) day=$1;;
- *) day=$3; shift;;
-esac
-
-# Here we have to deal with the problem that the ls output gives either
-# the time of day or the year.
-case $3 in
- *:*) set `date`; eval year=\$$#
- case $2 in
- Jan) nummonthtod=1;;
- Feb) nummonthtod=2;;
- Mar) nummonthtod=3;;
- Apr) nummonthtod=4;;
- May) nummonthtod=5;;
- Jun) nummonthtod=6;;
- Jul) nummonthtod=7;;
- Aug) nummonthtod=8;;
- Sep) nummonthtod=9;;
- Oct) nummonthtod=10;;
- Nov) nummonthtod=11;;
- Dec) nummonthtod=12;;
- esac
- # For the first six month of the year the time notation can also
- # be used for files modified in the last year.
- if (expr $nummonth \> $nummonthtod) > /dev/null;
- then
- year=`expr $year - 1`
- fi;;
- *) year=$3;;
-esac
-
-# The result.
-echo $day $month $year
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/readme.txt b/plugins/MirOTR/libgcrypt-1.4.6/doc/readme.txt
deleted file mode 100644
index fd10f94900..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/readme.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-gpgvs
-building gnupg related projects with Visual Studio
-
-for documents check them on sourceforge project site
-
-http://sourceforge.net/projects/gpgvs/ \ No newline at end of file
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/stamp-vti b/plugins/MirOTR/libgcrypt-1.4.6/doc/stamp-vti
deleted file mode 100644
index 294e4abcd0..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/stamp-vti
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 9 July 2009
-@set UPDATED-MONTH July 2009
-@set EDITION 1.4.6
-@set VERSION 1.4.6
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/texinfo.tex b/plugins/MirOTR/libgcrypt-1.4.6/doc/texinfo.tex
deleted file mode 100644
index 8083622350..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/texinfo.tex
+++ /dev/null
@@ -1,7482 +0,0 @@
-% texinfo.tex -- TeX macros to handle Texinfo files.
-%
-% Load plain if necessary, i.e., if running under initex.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-%
-\def\texinfoversion{2006-10-04.17}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
-% Software Foundation, Inc.
-%
-% This texinfo.tex file is free software; you can redistribute it and/or
-% modify it under the terms of the GNU General Public License as
-% published by the Free Software Foundation; either version 2, or (at
-% your option) any later version.
-%
-% This texinfo.tex file is distributed in the hope that it will be
-% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-% General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this texinfo.tex file; see the file COPYING. If not, write
-% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-%
-% As a special exception, when this file is read by TeX when processing
-% a Texinfo source document, you may use the result without
-% restriction. (This has been our intent since Texinfo was invented.)
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
-% ftp://tug.org/tex/texinfo.tex
-% (and all CTAN mirrors, see http://www.ctan.org).
-% The texinfo.tex in any given distribution could well be out
-% of date, so if that's what you're using, please check.
-%
-% Send bug reports to bug-texinfo@gnu.org. Please include including a
-% complete document in each bug report with which we can reproduce the
-% problem. Patches are, of course, greatly appreciated.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution. For a simple
-% manual foo.texi, however, you can get away with this:
-% tex foo.texi
-% texindex foo.??
-% tex foo.texi
-% tex foo.texi
-% dvips foo.dvi -o # or whatever; this makes foo.ps.
-% The extra TeX runs get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-%
-% It is possible to adapt texinfo.tex for other languages, to some
-% extent. You can get the existing language-specific files from the
-% full Texinfo distribution.
-%
-% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
-
-
-\message{Loading texinfo [version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}%
- \catcode`+=\active \catcode`\_=\active}
-
-\message{Basics,}
-\chardef\other=12
-
-% We never want plain's \outer definition of \+ in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-% Save some plain tex macros whose names we will redefine.
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexfootnote=\footnote
-\let\ptexgtr=>
-\let\ptexhat=^
-\let\ptexi=\i
-\let\ptexindent=\indent
-\let\ptexinsert=\insert
-\let\ptexlbrace=\{
-\let\ptexless=<
-\let\ptexnewwrite\newwrite
-\let\ptexnoindent=\noindent
-\let\ptexplus=+
-\let\ptexrbrace=\}
-\let\ptexslash=\/
-\let\ptexstar=\*
-\let\ptext=\t
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
- \let\linenumber = \empty % Pre-3.0.
-\else
- \def\linenumber{l.\the\inputlineno:\space}
-\fi
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
-\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
-\ifx\putwordin\undefined \gdef\putwordin{in}\fi
-\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
-\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
-\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
-\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
-\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
-\ifx\putwordof\undefined \gdef\putwordof{of}\fi
-\ifx\putwordon\undefined \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
-\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
-\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
-%
-\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
-\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
-\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
-\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
-\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
-\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
-\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
-\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
-\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
-\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
-\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
-\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
-%
-\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
-\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
-\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
-\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
-
-% Since the category of space is not known, we have to be careful.
-\chardef\spacecat = 10
-\def\spaceisspace{\catcode`\ =\spacecat}
-
-% sometimes characters are active, so we need control sequences.
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
-\chardef\dashChar = `\-
-\chardef\dotChar = `\.
-\chardef\exclamChar= `\!
-\chardef\lquoteChar= `\`
-\chardef\questChar = `\?
-\chardef\rquoteChar= `\'
-\chardef\semiChar = `\;
-\chardef\underChar = `\_
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-% The following is used inside several \edef's.
-\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
-
-% Hyphenation fixes.
-\hyphenation{
- Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
- ap-pen-dix bit-map bit-maps
- data-base data-bases eshell fall-ing half-way long-est man-u-script
- man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
- par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
- spell-ing spell-ings
- stand-alone strong-est time-stamp time-stamps which-ever white-space
- wide-spread wrap-around
-}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen\bindingoffset
-\newdimen\normaloffset
-\newdimen\pagewidth \newdimen\pageheight
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-% @| inserts a changebar to the left of the current line. It should
-% surround any changed text. This approach does *not* work if the
-% change spans more than two lines of output. To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
- % \vadjust can only be used in horizontal mode.
- \leavevmode
- %
- % Append this vertical mode material after the current line in the output.
- \vadjust{%
- % We want to insert a rule with the height and depth of the current
- % leading; that is exactly what \strutbox is supposed to record.
- \vskip-\baselineskip
- %
- % \vadjust-items are inserted at the left edge of the type. So
- % the \llap here moves out into the left-hand margin.
- \llap{%
- %
- % For a thicker or thinner bar, change the `1pt'.
- \vrule height\baselineskip width1pt
- %
- % This is the space between the bar and the text.
- \hskip 12pt
- }%
- }%
-}
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal. We don't just call \tracingall here,
-% since that produces some useless output on the terminal. We also make
-% some effort to order the tracing commands to reduce output in the log
-% file; cf. trace.sty in LaTeX.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{%
- \tracingstats2
- \tracingpages1
- \tracinglostchars2 % 2 gives us more in etex
- \tracingparagraphs1
- \tracingoutput1
- \tracingmacros2
- \tracingrestores1
- \showboxbreadth\maxdimen \showboxdepth\maxdimen
- \ifx\eTeXversion\undefined\else % etex gives us more logging
- \tracingscantokens1
- \tracingifs1
- \tracinggroups1
- \tracingnesting2
- \tracingassigns1
- \fi
- \tracingcommands3 % 3 gives us more in etex
- \errorcontextlines16
-}%
-
-% add check for \lastpenalty to plain's definitions. If the last thing
-% we did was a \nobreak, we don't want to insert more space.
-%
-\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
- \removelastskip\penalty-50\smallskip\fi\fi}
-\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
- \removelastskip\penalty-100\medskip\fi\fi}
-\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
- \removelastskip\penalty-200\bigskip\fi\fi}
-
-% For @cropmarks command.
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Main output routine.
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument. Note that \pagecontents
-% does insertions, but you have to call it yourself.
-\def\onepageout#1{%
- \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
- %
- \ifodd\pageno \advance\hoffset by \bindingoffset
- \else \advance\hoffset by -\bindingoffset\fi
- %
- % Do this outside of the \shipout so @code etc. will be expanded in
- % the headline as they should be, not taken literally (outputting ''code).
- \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
- \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
- %
- {%
- % Have to do this stuff outside the \shipout because we want it to
- % take effect in \write's, yet the group defined by the \vbox ends
- % before the \shipout runs.
- %
- \indexdummies % don't expand commands in the output.
- \normalturnoffactive % \ in index entries must not stay \, e.g., if
- % the page break happens to be in the middle of an example.
- % We don't want .vr (or whatever) entries like this:
- % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
- % "\acronym" won't work when it's read back in;
- % it needs to be
- % {\code {{\tt \backslashcurfont }acronym}
- \shipout\vbox{%
- % Do this early so pdf references go to the beginning of the page.
- \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
- %
- \ifcropmarks \vbox to \outervsize\bgroup
- \hsize = \outerhsize
- \vskip-\topandbottommargin
- \vtop to0pt{%
- \line{\ewtop\hfil\ewtop}%
- \nointerlineskip
- \line{%
- \vbox{\moveleft\cornerthick\nstop}%
- \hfill
- \vbox{\moveright\cornerthick\nstop}%
- }%
- \vss}%
- \vskip\topandbottommargin
- \line\bgroup
- \hfil % center the page within the outer (page) hsize.
- \ifodd\pageno\hskip\bindingoffset\fi
- \vbox\bgroup
- \fi
- %
- \unvbox\headlinebox
- \pagebody{#1}%
- \ifdim\ht\footlinebox > 0pt
- % Only leave this space if the footline is nonempty.
- % (We lessened \vsize for it in \oddfootingyyy.)
- % The \baselineskip=24pt in plain's \makefootline has no effect.
- \vskip 24pt
- \unvbox\footlinebox
- \fi
- %
- \ifcropmarks
- \egroup % end of \vbox\bgroup
- \hfil\egroup % end of (centering) \line\bgroup
- \vskip\topandbottommargin plus1fill minus1fill
- \boxmaxdepth = \cornerthick
- \vbox to0pt{\vss
- \line{%
- \vbox{\moveleft\cornerthick\nsbot}%
- \hfill
- \vbox{\moveright\cornerthick\nsbot}%
- }%
- \nointerlineskip
- \line{\ewbot\hfil\ewbot}%
- }%
- \egroup % \vbox from first cropmarks clause
- \fi
- }% end of \shipout\vbox
- }% end of group with \indexdummies
- \advancepageno
- \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
- \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1 \unvbox#1
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks. Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
- {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
- {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1. The argument is the rest of
-% the input line (except we remove a trailing comment). #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg{\parseargusing{}}
-\def\parseargusing#1#2{%
- \def\argtorun{#2}%
- \begingroup
- \obeylines
- \spaceisspace
- #1%
- \parseargline\empty% Insert the \empty token, see \finishparsearg below.
-}
-
-{\obeylines %
- \gdef\parseargline#1^^M{%
- \endgroup % End of the group started in \parsearg.
- \argremovecomment #1\comment\ArgTerm%
- }%
-}
-
-% First remove any @comment, then any @c comment.
-\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
-\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
-
-% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
-%
-% \argremovec might leave us with trailing space, e.g.,
-% @end itemize @c foo
-% This space token undergoes the same procedure and is eventually removed
-% by \finishparsearg.
-%
-\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
-\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
-\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
- \def\temp{#3}%
- \ifx\temp\empty
- % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
- \let\temp\finishparsearg
- \else
- \let\temp\argcheckspaces
- \fi
- % Put the space token in:
- \temp#1 #3\ArgTerm
-}
-
-% If a _delimited_ argument is enclosed in braces, they get stripped; so
-% to get _exactly_ the rest of the line, we had to prevent such situation.
-% We prepended an \empty token at the very beginning and we expand it now,
-% just before passing the control to \argtorun.
-% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
-% either the null string, or it ends with \^^M---thus there is no danger
-% that a pair of braces would be stripped.
-%
-% But first, we have to remove the trailing space token.
-%
-\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
-
-% \parseargdef\foo{...}
-% is roughly equivalent to
-% \def\foo{\parsearg\Xfoo}
-% \def\Xfoo#1{...}
-%
-% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
-% favourite TeX trick. --kasal, 16nov03
-
-\def\parseargdef#1{%
- \expandafter \doparseargdef \csname\string#1\endcsname #1%
-}
-\def\doparseargdef#1#2{%
- \def#2{\parsearg#1}%
- \def#1##1%
-}
-
-% Several utility definitions with active space:
-{
- \obeyspaces
- \gdef\obeyedspace{ }
-
- % Make each space character in the input produce a normal interword
- % space in the output. Don't allow a line break at this space, as this
- % is used only in environments like @example, where each line of input
- % should produce a line of output anyway.
- %
- \gdef\sepspaces{\obeyspaces\let =\tie}
-
- % If an index command is used in an @example environment, any spaces
- % therein should become regular spaces in the raw index file, not the
- % expansion of \tie (\leavevmode \penalty \@M \ ).
- \gdef\unsepspaces{\let =\space}
-}
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-% Define the framework for environments in texinfo.tex. It's used like this:
-%
-% \envdef\foo{...}
-% \def\Efoo{...}
-%
-% It's the responsibility of \envdef to insert \begingroup before the
-% actual body; @end closes the group after calling \Efoo. \envdef also
-% defines \thisenv, so the current environment is known; @end checks
-% whether the environment name matches. The \checkenv macro can also be
-% used to check whether the current environment is the one expected.
-%
-% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
-% are not treated as enviroments; they don't open a group. (The
-% implementation of @end takes care not to call \endgroup in this
-% special case.)
-
-
-% At runtime, environments start with this:
-\def\startenvironment#1{\begingroup\def\thisenv{#1}}
-% initialize
-\let\thisenv\empty
-
-% ... but they get defined via ``\envdef\foo{...}'':
-\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
-\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
-
-% Check whether we're in the right environment:
-\def\checkenv#1{%
- \def\temp{#1}%
- \ifx\thisenv\temp
- \else
- \badenverr
- \fi
-}
-
-% Evironment mismatch, #1 expected:
-\def\badenverr{%
- \errhelp = \EMsimple
- \errmessage{This command can appear only \inenvironment\temp,
- not \inenvironment\thisenv}%
-}
-\def\inenvironment#1{%
- \ifx#1\empty
- out of any environment%
- \else
- in environment \expandafter\string#1%
- \fi
-}
-
-% @end foo executes the definition of \Efoo.
-% But first, it executes a specialized version of \checkenv
-%
-\parseargdef\end{%
- \if 1\csname iscond.#1\endcsname
- \else
- % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
- \expandafter\checkenv\csname#1\endcsname
- \csname E#1\endcsname
- \endgroup
- \fi
-}
-
-\newhelp\EMsimple{Press RETURN to continue.}
-
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt\char64}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-\def\mylbrace {{\tt\char123}}
-\def\myrbrace {{\tt\char125}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-\begingroup
- % Definitions to produce \{ and \} commands for indices,
- % and @{ and @} for the aux/toc files.
- \catcode`\{ = \other \catcode`\} = \other
- \catcode`\[ = 1 \catcode`\] = 2
- \catcode`\! = 0 \catcode`\\ = \other
- !gdef!lbracecmd[\{]%
- !gdef!rbracecmd[\}]%
- !gdef!lbraceatcmd[@{]%
- !gdef!rbraceatcmd[@}]%
-!endgroup
-
-% @comma{} to avoid , parsing problems.
-\let\comma = ,
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
-\let\, = \c
-\let\dotaccent = \.
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \t
-\let\ubaraccent = \b
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown @ordf @ordm
-% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
-\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
- \def\temp{#1}%
- \ifx\temp\imacro \ptexi
- \else\ifx\temp\jmacro \j
- \else \errmessage{@dotless can be used only with i or j}%
- \fi\fi
-}
-
-% The \TeX{} logo, as in plain, but resetting the spacing so that a
-% period following counts as ending a sentence. (Idea found in latex.)
-%
-\edef\TeX{\TeX \spacefactor=1000 }
-
-% @LaTeX{} logo. Not quite the same results as the definition in
-% latex.ltx, since we use a different font for the raised A; it's most
-% convenient for us to use an explicitly smaller font, rather than using
-% the \scriptstyle font (since we don't reset \scriptstyle and
-% \scriptscriptstyle).
-%
-\def\LaTeX{%
- L\kern-.36em
- {\setbox0=\hbox{T}%
- \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
- \kern-.15em
- \TeX
-}
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @/ allows a line break.
-\let\/=\allowbreak
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=\endofsentencespacefactor\space}
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=\endofsentencespacefactor\space}
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=\endofsentencespacefactor\space}
-
-% @frenchspacing on|off says whether to put extra space after punctuation.
-%
-\def\onword{on}
-\def\offword{off}
-%
-\parseargdef\frenchspacing{%
- \def\temp{#1}%
- \ifx\temp\onword \plainfrenchspacing
- \else\ifx\temp\offword \plainnonfrenchspacing
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
- \fi\fi
-}
-
-% @w prevents a word break. Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line. According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0). If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-% Another complication is that the group might be very large. This can
-% cause the glue on the previous page to be unduly stretched, because it
-% does not have much material. In this case, it's better to add an
-% explicit \vfill so that the extra space is at the bottom. The
-% threshold for doing this is if the group is more than \vfilllimit
-% percent of a page (\vfilllimit can be changed inside of @tex).
-%
-\newbox\groupbox
-\def\vfilllimit{0.7}
-%
-\envdef\group{%
- \ifnum\catcode`\^^M=\active \else
- \errhelp = \groupinvalidhelp
- \errmessage{@group invalid in context where filling is enabled}%
- \fi
- \startsavinginserts
- %
- \setbox\groupbox = \vtop\bgroup
- % Do @comment since we are called inside an environment such as
- % @example, where each end-of-line in the input causes an
- % end-of-line in the output. We don't want the end-of-line after
- % the `@group' to put extra space in the output. Since @group
- % should appear on a line by itself (according to the Texinfo
- % manual), we don't worry about eating any user text.
- \comment
-}
-%
-% The \vtop produces a box with normal height and large depth; thus, TeX puts
-% \baselineskip glue before it, and (when the next line of text is done)
-% \lineskip glue after it. Thus, space below is not quite equal to space
-% above. But it's pretty close.
-\def\Egroup{%
- % To get correct interline space between the last line of the group
- % and the first line afterwards, we have to propagate \prevdepth.
- \endgraf % Not \par, as it may have been set to \lisppar.
- \global\dimen1 = \prevdepth
- \egroup % End the \vtop.
- % \dimen0 is the vertical size of the group's box.
- \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
- % \dimen2 is how much space is left on the page (more or less).
- \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
- % if the group doesn't fit on the current page, and it's a big big
- % group, force a page break.
- \ifdim \dimen0 > \dimen2
- \ifdim \pagetotal < \vfilllimit\pageheight
- \page
- \fi
- \fi
- \box\groupbox
- \prevdepth = \dimen1
- \checkinserts
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil \mil=0.001in
-
-% Old definition--didn't work.
-%\parseargdef\need{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
-%\prevdepth=-1000pt
-%}}
-
-\parseargdef\need{%
- % Ensure vertical mode, so we don't make a big box in the middle of a
- % paragraph.
- \par
- %
- % If the @need value is less than one line space, it's useless.
- \dimen0 = #1\mil
- \dimen2 = \ht\strutbox
- \advance\dimen2 by \dp\strutbox
- \ifdim\dimen0 > \dimen2
- %
- % Do a \strut just to make the height of this box be normal, so the
- % normal leading is inserted relative to the preceding line.
- % And a page break here is fine.
- \vtop to #1\mil{\strut\vfil}%
- %
- % TeX does not even consider page breaks if a penalty added to the
- % main vertical list is 10000 or more. But in order to see if the
- % empty box we just added fits on the page, we must make it consider
- % page breaks. On the other hand, we don't want to actually break the
- % page after the empty box. So we use a penalty of 9999.
- %
- % There is an extremely small chance that TeX will actually break the
- % page at this \penalty, if there are no other feasible breakpoints in
- % sight. (If the user is using lots of big @group commands, which
- % almost-but-not-quite fill up a page, TeX will have a hard time doing
- % good page breaking, for example.) However, I could not construct an
- % example where a page broke at this \penalty; if it happens in a real
- % document, then we can reconsider our strategy.
- \penalty9999
- %
- % Back up by the size of the box, whether we did a page break or not.
- \kern -#1\mil
- %
- % Do not allow a page break right after this kern.
- \nobreak
- \fi
-}
-
-% @br forces paragraph break (and is undocumented).
-
-\let\br = \par
-
-% @page forces the start of a new page.
-%
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
-
-% This defn is used inside nofill environments such as @example.
-\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
- \leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
-% paragraph. For more general purposes, use the \margin insertion
-% class. WHICH is `l' or `r'.
-%
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-%
-\def\doinmargin#1#2{\strut\vadjust{%
- \nobreak
- \kern-\strutdepth
- \vtop to \strutdepth{%
- \baselineskip=\strutdepth
- \vss
- % if you have multiple lines of stuff to put here, you'll need to
- % make the vbox yourself of the appropriate size.
- \ifx#1l%
- \llap{\ignorespaces #2\hskip\inmarginspacing}%
- \else
- \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
- \fi
- \null
- }%
-}}
-\def\inleftmargin{\doinmargin l}
-\def\inrightmargin{\doinmargin r}
-%
-% @inmargin{TEXT [, RIGHT-TEXT]}
-% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
-% else use TEXT for both).
-%
-\def\inmargin#1{\parseinmargin #1,,\finish}
-\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0 > 0pt
- \def\lefttext{#1}% have both texts
- \def\righttext{#2}%
- \else
- \def\lefttext{#1}% have only one text
- \def\righttext{#1}%
- \fi
- %
- \ifodd\pageno
- \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
- \else
- \def\temp{\inleftmargin\lefttext}%
- \fi
- \temp
-}
-
-% @include file insert text of that file as input.
-%
-\def\include{\parseargusing\filenamecatcodes\includezzz}
-\def\includezzz#1{%
- \pushthisfilestack
- \def\thisfile{#1}%
- {%
- \makevalueexpandable
- \def\temp{\input #1 }%
- \expandafter
- }\temp
- \popthisfilestack
-}
-\def\filenamecatcodes{%
- \catcode`\\=\other
- \catcode`~=\other
- \catcode`^=\other
- \catcode`_=\other
- \catcode`|=\other
- \catcode`<=\other
- \catcode`>=\other
- \catcode`+=\other
- \catcode`-=\other
-}
-
-\def\pushthisfilestack{%
- \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
-}
-\def\pushthisfilestackX{%
- \expandafter\pushthisfilestackY\thisfile\StackTerm
-}
-\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
- \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
-}
-
-\def\popthisfilestack{\errthisfilestackempty}
-\def\errthisfilestackempty{\errmessage{Internal error:
- the stack of filenames is empty.}}
-
-\def\thisfile{}
-
-% @center line
-% outputs that line, centered.
-%
-\parseargdef\center{%
- \ifhmode
- \let\next\centerH
- \else
- \let\next\centerV
- \fi
- \next{\hfil \ignorespaces#1\unskip \hfil}%
-}
-\def\centerH#1{%
- {%
- \hfil\break
- \advance\hsize by -\leftskip
- \advance\hsize by -\rightskip
- \line{#1}%
- \break
- }%
-}
-\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
-
-% @sp n outputs n lines of vertical space
-
-\parseargdef\sp{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore is another way to write a comment
-
-\def\comment{\begingroup \catcode`\^^M=\other%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
-\commentxxx}
-{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
-
-\let\c=\comment
-
-% @paragraphindent NCHARS
-% We'll use ems for NCHARS, close enough.
-% NCHARS can also be the word `asis' or `none'.
-% We cannot feasibly implement @paragraphindent asis, though.
-%
-\def\asisword{asis} % no translation, these are keywords
-\def\noneword{none}
-%
-\parseargdef\paragraphindent{%
- \def\temp{#1}%
- \ifx\temp\asisword
- \else
- \ifx\temp\noneword
- \defaultparindent = 0pt
- \else
- \defaultparindent = #1em
- \fi
- \fi
- \parindent = \defaultparindent
-}
-
-% @exampleindent NCHARS
-% We'll use ems for NCHARS like @paragraphindent.
-% It seems @exampleindent asis isn't necessary, but
-% I preserve it to make it similar to @paragraphindent.
-\parseargdef\exampleindent{%
- \def\temp{#1}%
- \ifx\temp\asisword
- \else
- \ifx\temp\noneword
- \lispnarrowing = 0pt
- \else
- \lispnarrowing = #1em
- \fi
- \fi
-}
-
-% @firstparagraphindent WORD
-% If WORD is `none', then suppress indentation of the first paragraph
-% after a section heading. If WORD is `insert', then do indent at such
-% paragraphs.
-%
-% The paragraph indentation is suppressed or not by calling
-% \suppressfirstparagraphindent, which the sectioning commands do.
-% We switch the definition of this back and forth according to WORD.
-% By default, we suppress indentation.
-%
-\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
-\def\insertword{insert}
-%
-\parseargdef\firstparagraphindent{%
- \def\temp{#1}%
- \ifx\temp\noneword
- \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
- \else\ifx\temp\insertword
- \let\suppressfirstparagraphindent = \relax
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @firstparagraphindent option `\temp'}%
- \fi\fi
-}
-
-% Here is how we actually suppress indentation. Redefine \everypar to
-% \kern backwards by \parindent, and then reset itself to empty.
-%
-% We also make \indent itself not actually do anything until the next
-% paragraph.
-%
-\gdef\dosuppressfirstparagraphindent{%
- \gdef\indent{%
- \restorefirstparagraphindent
- \indent
- }%
- \gdef\noindent{%
- \restorefirstparagraphindent
- \noindent
- }%
- \global\everypar = {%
- \kern -\parindent
- \restorefirstparagraphindent
- }%
-}
-
-\gdef\restorefirstparagraphindent{%
- \global \let \indent = \ptexindent
- \global \let \noindent = \ptexnoindent
- \global \everypar = {}%
-}
-
-
-% @asis just yields its argument. Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math outputs its argument in math mode.
-%
-% One complication: _ usually means subscripts, but it could also mean
-% an actual _ character, as in @math{@var{some_variable} + 1}. So make
-% _ active, and distinguish by seeing if the current family is \slfam,
-% which is what @var uses.
-{
- \catcode`\_ = \active
- \gdef\mathunderscore{%
- \catcode`\_=\active
- \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
- }
-}
-% Another complication: we want \\ (and @\) to output a \ character.
-% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
-% this is not advertised and we don't care. Texinfo does not
-% otherwise define @\.
-%
-% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
-\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
-%
-\def\math{%
- \tex
- \mathunderscore
- \let\\ = \mathbackslash
- \mathactive
- $\finishmath
-}
-\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
-
-% Some active characters (such as <) are spaced differently in math.
-% We have to reset their definitions in case the @math was an argument
-% to a command which sets the catcodes (such as @item or @section).
-%
-{
- \catcode`^ = \active
- \catcode`< = \active
- \catcode`> = \active
- \catcode`+ = \active
- \gdef\mathactive{%
- \let^ = \ptexhat
- \let< = \ptexless
- \let> = \ptexgtr
- \let+ = \ptexplus
- }
-}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{$\ptexbullet$}
-\def\minus{$-$}
-
-% @dots{} outputs an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in the cm
-% typewriter fonts as three actual period characters; on the other hand,
-% in other typewriter fonts three periods are wider than 1.5em. So do
-% whichever is larger.
-%
-\def\dots{%
- \leavevmode
- \setbox0=\hbox{...}% get width of three periods
- \ifdim\wd0 > 1.5em
- \dimen0 = \wd0
- \else
- \dimen0 = 1.5em
- \fi
- \hbox to \dimen0{%
- \hskip 0pt plus.25fil
- .\hskip 0pt plus1fil
- .\hskip 0pt plus1fil
- .\hskip 0pt plus.5fil
- }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
- \dots
- \spacefactor=\endofsentencespacefactor
-}
-
-% @comma{} is so commas can be inserted into text without messing up
-% Texinfo's parsing.
-%
-\let\comma = ,
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate (before @setfilename).
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
- \fixbackslash % Turn off hack to swallow `\input texinfo'.
- \iflinks
- \tryauxfile
- % Open the new aux file. TeX will close it automatically at exit.
- \immediate\openout\auxfile=\jobname.aux
- \fi % \openindices needs to do some work in any case.
- \openindices
- \let\setfilename=\comment % Ignore extra @setfilename cmds.
- %
- % If texinfo.cnf is present on the system, read it.
- % Useful for site-wide @afourpaper, etc.
- \openin 1 texinfo.cnf
- \ifeof 1 \else \input texinfo.cnf \fi
- \closein 1
- %
- \comment % Ignore the actual filename.
-}
-
-% Called from \setfilename.
-%
-\def\openindices{%
- \newindex{cp}%
- \newcodeindex{fn}%
- \newcodeindex{vr}%
- \newcodeindex{tp}%
- \newcodeindex{ky}%
- \newcodeindex{pg}%
-}
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{pdf,}
-% adobe `portable' document format
-\newcount\tempnum
-\newcount\lnkcount
-\newtoks\filename
-\newcount\filenamelength
-\newcount\pgn
-\newtoks\toksA
-\newtoks\toksB
-\newtoks\toksC
-\newtoks\toksD
-\newbox\boxA
-\newcount\countA
-\newif\ifpdf
-\newif\ifpdfmakepagedest
-
-% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
-% can be set). So we test for \relax and 0 as well as \undefined,
-% borrowed from ifpdf.sty.
-\ifx\pdfoutput\undefined
-\else
- \ifx\pdfoutput\relax
- \else
- \ifcase\pdfoutput
- \else
- \pdftrue
- \fi
- \fi
-\fi
-
-% PDF uses PostScript string constants for the names of xref targets,
-% for display in the outlines, and in other places. Thus, we have to
-% double any backslashes. Otherwise, a name like "\node" will be
-% interpreted as a newline (\n), followed by o, d, e. Not good.
-% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
-% (and related messages, the final outcome is that it is up to the TeX
-% user to double the backslashes and otherwise make the string valid, so
-% that's what we do).
-
-% double active backslashes.
-%
-{\catcode`\@=0 \catcode`\\=\active
- @gdef@activebackslashdouble{%
- @catcode`@\=@active
- @let\=@doublebackslash}
-}
-
-% To handle parens, we must adopt a different approach, since parens are
-% not active characters. hyperref.dtx (which has the same problem as
-% us) handles it with this amazing macro to replace tokens. I've
-% tinkered with it a little for texinfo, but it's definitely from there.
-%
-% #1 is the tokens to replace.
-% #2 is the replacement.
-% #3 is the control sequence with the string.
-%
-\def\HyPsdSubst#1#2#3{%
- \def\HyPsdReplace##1#1##2\END{%
- ##1%
- \ifx\\##2\\%
- \else
- #2%
- \HyReturnAfterFi{%
- \HyPsdReplace##2\END
- }%
- \fi
- }%
- \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
-}
-\long\def\HyReturnAfterFi#1\fi{\fi#1}
-
-% #1 is a control sequence in which to do the replacements.
-\def\backslashparens#1{%
- \xdef#1{#1}% redefine it as its expansion; the definition is simply
- % \lastnode when called from \setref -> \pdfmkdest.
- \HyPsdSubst{(}{\realbackslash(}{#1}%
- \HyPsdSubst{)}{\realbackslash)}{#1}%
-}
-
-\ifpdf
- \input pdfcolor
- \pdfcatalog{/PageMode /UseOutlines}%
- % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
- \def\dopdfimage#1#2#3{%
- \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
- \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
- % without \immediate, pdftex seg faults when the same image is
- % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
- \ifnum\pdftexversion < 14
- \immediate\pdfimage
- \else
- \immediate\pdfximage
- \fi
- \ifdim \wd0 >0pt width \imagewidth \fi
- \ifdim \wd2 >0pt height \imageheight \fi
- \ifnum\pdftexversion<13
- #1.pdf%
- \else
- {#1.pdf}%
- \fi
- \ifnum\pdftexversion < 14 \else
- \pdfrefximage \pdflastximage
- \fi}
- \def\pdfmkdest#1{{%
- % We have to set dummies so commands such as @code, and characters
- % such as \, aren't expanded when present in a section title.
- \atdummies
- \activebackslashdouble
- \def\pdfdestname{#1}%
- \backslashparens\pdfdestname
- \pdfdest name{\pdfdestname} xyz%
- }}%
- %
- % used to mark target names; must be expandable.
- \def\pdfmkpgn#1{#1}%
- %
- \let\linkcolor = \Blue % was Cyan, but that seems light?
- \def\endlink{\Black\pdfendlink}
- % Adding outlines to PDF; macros for calculating structure of outlines
- % come from Petr Olsak
- \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
- \else \csname#1\endcsname \fi}
- \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
- \advance\tempnum by 1
- \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
- %
- % #1 is the section text, which is what will be displayed in the
- % outline by the pdf viewer. #2 is the pdf expression for the number
- % of subentries (or empty, for subsubsections). #3 is the node text,
- % which might be empty if this toc entry had no corresponding node.
- % #4 is the page number
- %
- \def\dopdfoutline#1#2#3#4{%
- % Generate a link to the node text if that exists; else, use the
- % page number. We could generate a destination for the section
- % text in the case where a section has no node, but it doesn't
- % seem worth the trouble, since most documents are normally structured.
- \def\pdfoutlinedest{#3}%
- \ifx\pdfoutlinedest\empty
- \def\pdfoutlinedest{#4}%
- \else
- % Doubled backslashes in the name.
- {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
- \backslashparens\pdfoutlinedest}%
- \fi
- %
- % Also double the backslashes in the display string.
- {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
- \backslashparens\pdfoutlinetext}%
- %
- \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
- }
- %
- \def\pdfmakeoutlines{%
- \begingroup
- % Thanh's hack / proper braces in bookmarks
- \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
- \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
- %
- % Read toc silently, to get counts of subentries for \pdfoutline.
- \def\numchapentry##1##2##3##4{%
- \def\thischapnum{##2}%
- \def\thissecnum{0}%
- \def\thissubsecnum{0}%
- }%
- \def\numsecentry##1##2##3##4{%
- \advancenumber{chap\thischapnum}%
- \def\thissecnum{##2}%
- \def\thissubsecnum{0}%
- }%
- \def\numsubsecentry##1##2##3##4{%
- \advancenumber{sec\thissecnum}%
- \def\thissubsecnum{##2}%
- }%
- \def\numsubsubsecentry##1##2##3##4{%
- \advancenumber{subsec\thissubsecnum}%
- }%
- \def\thischapnum{0}%
- \def\thissecnum{0}%
- \def\thissubsecnum{0}%
- %
- % use \def rather than \let here because we redefine \chapentry et
- % al. a second time, below.
- \def\appentry{\numchapentry}%
- \def\appsecentry{\numsecentry}%
- \def\appsubsecentry{\numsubsecentry}%
- \def\appsubsubsecentry{\numsubsubsecentry}%
- \def\unnchapentry{\numchapentry}%
- \def\unnsecentry{\numsecentry}%
- \def\unnsubsecentry{\numsubsecentry}%
- \def\unnsubsubsecentry{\numsubsubsecentry}%
- \readdatafile{toc}%
- %
- % Read toc second time, this time actually producing the outlines.
- % The `-' means take the \expnumber as the absolute number of
- % subentries, which we calculated on our first read of the .toc above.
- %
- % We use the node names as the destinations.
- \def\numchapentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
- \def\numsecentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
- \def\numsubsecentry##1##2##3##4{%
- \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
- \def\numsubsubsecentry##1##2##3##4{% count is always zero
- \dopdfoutline{##1}{}{##3}{##4}}%
- %
- % PDF outlines are displayed using system fonts, instead of
- % document fonts. Therefore we cannot use special characters,
- % since the encoding is unknown. For example, the eogonek from
- % Latin 2 (0xea) gets translated to a | character. Info from
- % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
- %
- % xx to do this right, we have to translate 8-bit characters to
- % their "best" equivalent, based on the @documentencoding. Right
- % now, I guess we'll just let the pdf reader have its way.
- \indexnofonts
- \setupdatafile
- \catcode`\\=\active \otherbackslash
- \input \jobname.toc
- \endgroup
- }
- %
- \def\skipspaces#1{\def\PP{#1}\def\D{|}%
- \ifx\PP\D\let\nextsp\relax
- \else\let\nextsp\skipspaces
- \ifx\p\space\else\addtokens{\filename}{\PP}%
- \advance\filenamelength by 1
- \fi
- \fi
- \nextsp}
- \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
- \ifnum\pdftexversion < 14
- \let \startlink \pdfannotlink
- \else
- \let \startlink \pdfstartlink
- \fi
- % make a live url in pdf output.
- \def\pdfurl#1{%
- \begingroup
- % it seems we really need yet another set of dummies; have not
- % tried to figure out what each command should do in the context
- % of @url. for now, just make @/ a no-op, that's the only one
- % people have actually reported a problem with.
- %
- \normalturnoffactive
- \def\@{@}%
- \let\/=\empty
- \makevalueexpandable
- \leavevmode\Red
- \startlink attr{/Border [0 0 0]}%
- user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
- \endgroup}
- \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
- \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
- \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
- \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
- \def\maketoks{%
- \expandafter\poptoks\the\toksA|ENDTOKS|\relax
- \ifx\first0\adn0
- \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
- \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
- \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
- \else
- \ifnum0=\countA\else\makelink\fi
- \ifx\first.\let\next=\done\else
- \let\next=\maketoks
- \addtokens{\toksB}{\the\toksD}
- \ifx\first,\addtokens{\toksB}{\space}\fi
- \fi
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \next}
- \def\makelink{\addtokens{\toksB}%
- {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
- \def\pdflink#1{%
- \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
- \linkcolor #1\endlink}
- \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\else
- \let\pdfmkdest = \gobble
- \let\pdfurl = \gobble
- \let\endlink = \relax
- \let\linkcolor = \relax
- \let\pdfmakeoutlines = \relax
-\fi % \ifx\pdfoutput
-
-
-\message{fonts,}
-
-% Change the current font style to #1, remembering it in \curfontstyle.
-% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
-% italics, not bold italics.
-%
-\def\setfontstyle#1{%
- \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
- \csname ten#1\endcsname % change the current font
-}
-
-% Select #1 fonts with the current style.
-%
-\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
-
-\def\rm{\fam=0 \setfontstyle{rm}}
-\def\it{\fam=\itfam \setfontstyle{it}}
-\def\sl{\fam=\slfam \setfontstyle{sl}}
-\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
-\def\tt{\fam=\ttfam \setfontstyle{tt}}
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf.
-\newfam\sffam
-\def\sf{\fam=\sffam \setfontstyle{sf}}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this font style.
-\def\ttsl{\setfontstyle{ttsl}}
-
-
-% Default leading.
-\newdimen\textleading \textleading = 13.2pt
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly. There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-\def\setleading#1{%
- \normalbaselineskip = #1\relax
- \normallineskip = \lineskipfactor\normalbaselineskip
- \normalbaselines
- \setbox\strutbox =\hbox{%
- \vrule width0pt height\strutheightpercent\baselineskip
- depth \strutdepthpercent \baselineskip
- }%
-}
-
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-% #3 is the font's design size, #4 is a scale factor
-\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
-
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx} %where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-% Definitions for a main text size of 11pt. This is the default in
-% Texinfo.
-%
-\def\definetextfontsizexi{
-% Text fonts (11.2pt, magstep1).
-\def\textnominalsize{11pt}
-\edef\mainmagstep{\magstephalf}
-\setfont\textrm\rmshape{10}{\mainmagstep}
-\setfont\texttt\ttshape{10}{\mainmagstep}
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstep1}
-\setfont\deftt\ttshape{10}{\magstep1}
-\setfont\defttsl\ttslshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}
-\setfont\smalltt\ttshape{9}{1000}
-\setfont\smallbf\bfshape{10}{900}
-\setfont\smallit\itshape{9}{1000}
-\setfont\smallsl\slshape{9}{1000}
-\setfont\smallsf\sfshape{9}{1000}
-\setfont\smallsc\scshape{10}{900}
-\setfont\smallttsl\ttslshape{10}{900}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}
-\setfont\smallertt\ttshape{8}{1000}
-\setfont\smallerbf\bfshape{10}{800}
-\setfont\smallerit\itshape{8}{1000}
-\setfont\smallersl\slshape{8}{1000}
-\setfont\smallersf\sfshape{8}{1000}
-\setfont\smallersc\scshape{10}{800}
-\setfont\smallerttsl\ttslshape{10}{800}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-\def\authortt{\sectt}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\def\chapnominalsize{17pt}
-\setfont\chaprm\rmbshape{12}{\magstep2}
-\setfont\chapit\itbshape{10}{\magstep3}
-\setfont\chapsl\slbshape{10}{\magstep3}
-\setfont\chaptt\ttbshape{12}{\magstep2}
-\setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{17}{1000}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-% Section fonts (14.4pt).
-\def\secnominalsize{14pt}
-\setfont\secrm\rmbshape{12}{\magstep1}
-\setfont\secit\itbshape{10}{\magstep2}
-\setfont\secsl\slbshape{10}{\magstep2}
-\setfont\sectt\ttbshape{12}{\magstep1}
-\setfont\secttsl\ttslshape{10}{\magstep2}
-\setfont\secsf\sfbshape{12}{\magstep1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% Subsection fonts (13.15pt).
-\def\ssecnominalsize{13pt}
-\setfont\ssecrm\rmbshape{12}{\magstephalf}
-\setfont\ssecit\itbshape{10}{1315}
-\setfont\ssecsl\slbshape{10}{1315}
-\setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{1315}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1315}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-
-% Reduced fonts for @acro in text (10pt).
-\def\reducednominalsize{10pt}
-\setfont\reducedrm\rmshape{10}{1000}
-\setfont\reducedtt\ttshape{10}{1000}
-\setfont\reducedbf\bfshape{10}{1000}
-\setfont\reducedit\itshape{10}{1000}
-\setfont\reducedsl\slshape{10}{1000}
-\setfont\reducedsf\sfshape{10}{1000}
-\setfont\reducedsc\scshape{10}{1000}
-\setfont\reducedttsl\ttslshape{10}{1000}
-\font\reducedi=cmmi10
-\font\reducedsy=cmsy10
-
-% reset the current fonts
-\textfonts
-\rm
-} % end of 11pt text font size definitions
-
-
-% Definitions to make the main text be 10pt Computer Modern, with
-% section, chapter, etc., sizes following suit. This is for the GNU
-% Press printing of the Emacs 22 manual. Maybe other manuals in the
-% future. Used with @smallbook, which sets the leading to 12pt.
-%
-\def\definetextfontsizex{%
-% Text fonts (10pt).
-\def\textnominalsize{10pt}
-\edef\mainmagstep{1000}
-\setfont\textrm\rmshape{10}{\mainmagstep}
-\setfont\texttt\ttshape{10}{\mainmagstep}
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstephalf}
-\setfont\deftt\ttshape{10}{\magstephalf}
-\setfont\defttsl\ttslshape{10}{\magstephalf}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}
-\setfont\smalltt\ttshape{9}{1000}
-\setfont\smallbf\bfshape{10}{900}
-\setfont\smallit\itshape{9}{1000}
-\setfont\smallsl\slshape{9}{1000}
-\setfont\smallsf\sfshape{9}{1000}
-\setfont\smallsc\scshape{10}{900}
-\setfont\smallttsl\ttslshape{10}{900}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}
-\setfont\smallertt\ttshape{8}{1000}
-\setfont\smallerbf\bfshape{10}{800}
-\setfont\smallerit\itshape{8}{1000}
-\setfont\smallersl\slshape{8}{1000}
-\setfont\smallersf\sfshape{8}{1000}
-\setfont\smallersc\scshape{10}{800}
-\setfont\smallerttsl\ttslshape{10}{800}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-\def\authortt{\sectt}
-
-% Chapter fonts (14.4pt).
-\def\chapnominalsize{14pt}
-\setfont\chaprm\rmbshape{12}{\magstep1}
-\setfont\chapit\itbshape{10}{\magstep2}
-\setfont\chapsl\slbshape{10}{\magstep2}
-\setfont\chaptt\ttbshape{12}{\magstep1}
-\setfont\chapttsl\ttslshape{10}{\magstep2}
-\setfont\chapsf\sfbshape{12}{\magstep1}
-\let\chapbf\chaprm
-\setfont\chapsc\scbshape{10}{\magstep2}
-\font\chapi=cmmi12 scaled \magstep1
-\font\chapsy=cmsy10 scaled \magstep2
-
-% Section fonts (12pt).
-\def\secnominalsize{12pt}
-\setfont\secrm\rmbshape{12}{1000}
-\setfont\secit\itbshape{10}{\magstep1}
-\setfont\secsl\slbshape{10}{\magstep1}
-\setfont\sectt\ttbshape{12}{1000}
-\setfont\secttsl\ttslshape{10}{\magstep1}
-\setfont\secsf\sfbshape{12}{1000}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep1}
-\font\seci=cmmi12
-\font\secsy=cmsy10 scaled \magstep1
-
-% Subsection fonts (10pt).
-\def\ssecnominalsize{10pt}
-\setfont\ssecrm\rmbshape{10}{1000}
-\setfont\ssecit\itbshape{10}{1000}
-\setfont\ssecsl\slbshape{10}{1000}
-\setfont\ssectt\ttbshape{10}{1000}
-\setfont\ssecttsl\ttslshape{10}{1000}
-\setfont\ssecsf\sfbshape{10}{1000}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1000}
-\font\sseci=cmmi10
-\font\ssecsy=cmsy10
-
-% Reduced fonts for @acro in text (9pt).
-\def\reducednominalsize{9pt}
-\setfont\reducedrm\rmshape{9}{1000}
-\setfont\reducedtt\ttshape{9}{1000}
-\setfont\reducedbf\bfshape{10}{900}
-\setfont\reducedit\itshape{9}{1000}
-\setfont\reducedsl\slshape{9}{1000}
-\setfont\reducedsf\sfshape{9}{1000}
-\setfont\reducedsc\scshape{10}{900}
-\setfont\reducedttsl\ttslshape{10}{900}
-\font\reducedi=cmmi9
-\font\reducedsy=cmsy9
-
-% reduce space between paragraphs
-\divide\parskip by 2
-
-% reset the current fonts
-\textfonts
-\rm
-} % end of 10pt text font size definitions
-
-
-% We provide the user-level command
-% @fonttextsize 10
-% (or 11) to redefine the text font size. pt is assumed.
-%
-\def\xword{10}
-\def\xiword{11}
-%
-\parseargdef\fonttextsize{%
- \def\textsizearg{#1}%
- \wlog{doing @fonttextsize \textsizearg}%
- %
- % Set \globaldefs so that documents can use this inside @tex, since
- % makeinfo 4.8 does not support it, but we need it nonetheless.
- %
- \begingroup \globaldefs=1
- \ifx\textsizearg\xword \definetextfontsizex
- \else \ifx\textsizearg\xiword \definetextfontsizexi
- \else
- \errhelp=\EMsimple
- \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
- \fi\fi
- \endgroup
-}
-
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families. Since
-% texinfo doesn't allow for producing subscripts and superscripts except
-% in the main text, we don't bother to reset \scriptfont and
-% \scriptscriptfont (which would also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
- \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
- \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
- \textfont\ttfam=\tentt \textfont\sffam=\tensf
-}
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE. We do this because \STYLE needs to also set the
-% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
-% \tenSTYLE to set the current font.
-%
-% Each font-changing command also sets the names \lsize (one size lower)
-% and \lllsize (three sizes lower). These relative commands are used in
-% the LaTeX logo and acronyms.
-%
-% This all needs generalizing, badly.
-%
-\def\textfonts{%
- \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
- \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
- \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
- \let\tenttsl=\textttsl
- \def\curfontsize{text}%
- \def\lsize{reduced}\def\lllsize{smaller}%
- \resetmathfonts \setleading{\textleading}}
-\def\titlefonts{%
- \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
- \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
- \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
- \let\tenttsl=\titlettsl
- \def\curfontsize{title}%
- \def\lsize{chap}\def\lllsize{subsec}%
- \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rm #1}}
-\def\chapfonts{%
- \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
- \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
- \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
- \let\tenttsl=\chapttsl
- \def\curfontsize{chap}%
- \def\lsize{sec}\def\lllsize{text}%
- \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
- \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
- \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
- \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
- \let\tenttsl=\secttsl
- \def\curfontsize{sec}%
- \def\lsize{subsec}\def\lllsize{reduced}%
- \resetmathfonts \setleading{16pt}}
-\def\subsecfonts{%
- \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
- \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
- \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
- \let\tenttsl=\ssecttsl
- \def\curfontsize{ssec}%
- \def\lsize{text}\def\lllsize{small}%
- \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts
-\def\reducedfonts{%
- \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
- \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
- \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
- \let\tenttsl=\reducedttsl
- \def\curfontsize{reduced}%
- \def\lsize{small}\def\lllsize{smaller}%
- \resetmathfonts \setleading{10.5pt}}
-\def\smallfonts{%
- \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
- \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
- \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
- \let\tenttsl=\smallttsl
- \def\curfontsize{small}%
- \def\lsize{smaller}\def\lllsize{smaller}%
- \resetmathfonts \setleading{10.5pt}}
-\def\smallerfonts{%
- \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
- \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
- \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
- \let\tenttsl=\smallerttsl
- \def\curfontsize{smaller}%
- \def\lsize{smaller}\def\lllsize{smaller}%
- \resetmathfonts \setleading{9.5pt}}
-
-% Set the fonts to use with the @small... environments.
-\let\smallexamplefonts = \smallfonts
-
-% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
-% can fit this many characters:
-% 8.5x11=86 smallbook=72 a4=90 a5=69
-% If we use \scriptfonts (8pt), then we can fit this many characters:
-% 8.5x11=90+ smallbook=80 a4=90+ a5=77
-% For me, subjectively, the few extra characters that fit aren't worth
-% the additional smallness of 8pt. So I'm making the default 9pt.
-%
-% By the way, for comparison, here's what fits with @example (10pt):
-% 8.5x11=71 smallbook=60 a4=75 a5=58
-%
-% I wish the USA used A4 paper.
-% --karl, 24jan03.
-
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\definetextfontsizexi
-
-% Define these so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
-\setfont\shortcontsl\slshape{12}{1000}
-\setfont\shortconttt\ttshape{12}{1000}
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
- \ptexslash\fi\fi\fi}
-\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
-
-% like \smartslanted except unconditionally uses \ttsl.
-% @var is set to this for defun arguments.
-\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
-
-% like \smartslanted except unconditionally use \sl. We never want
-% ttsl for book titles, do we?
-\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\slanted=\smartslanted
-\let\var=\smartslanted
-\let\dfn=\smartslanted
-\let\emph=\smartitalic
-
-% @b, explicit bold.
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% @sansserif, explicit sans.
-\def\sansserif#1{{\sf #1}}
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph. Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-% Set sfcode to normal for the chars that usually have another value.
-% Can't use plain's \frenchspacing because it uses the `\x notation, and
-% sometimes \x has an active definition that messes things up.
-%
-\catcode`@=11
- \def\plainfrenchspacing{%
- \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
- \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
- \def\endofsentencespacefactor{1000}% for @. and friends
- }
- \def\plainnonfrenchspacing{%
- \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
- \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
- \def\endofsentencespacefactor{3000}% for @. and friends
- }
-\catcode`@=\other
-\def\endofsentencespacefactor{3000}% default
-
-\def\t#1{%
- {\tt \rawbackslash \plainfrenchspacing #1}%
- \null
-}
-\def\samp#1{`\tclose{#1}'\null}
-\setfont\keyrm\rmshape{8}{1000}
-\font\keysy=cmsy9
-\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
- \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
- \vbox{\hrule\kern-0.4pt
- \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
- \kern-0.4pt\hrule}%
- \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-% The old definition, with no lozenge:
-%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-% @file, @option are the same as @samp.
-\let\file=\samp
-\let\option=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
- {%
- % Change normal interword space to be same as for the current font.
- \spaceskip = \fontdimen2\font
- %
- % Switch to typewriter.
- \tt
- %
- % But `\ ' produces the large typewriter interword space.
- \def\ {{\spaceskip = 0pt{} }}%
- %
- % Turn off hyphenation.
- \nohyphenation
- %
- \rawbackslash
- \plainfrenchspacing
- #1%
- }%
- \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in @code.
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash.
-% -- rms.
-{
- \catcode`\-=\active \catcode`\_=\active
- \catcode`\'=\active \catcode`\`=\active
- %
- \global\def\code{\begingroup
- \catcode\rquoteChar=\active \catcode\lquoteChar=\active
- \let'\codequoteright \let`\codequoteleft
- %
- \catcode\dashChar=\active \catcode\underChar=\active
- \ifallowcodebreaks
- \let-\codedash
- \let_\codeunder
- \else
- \let-\realdash
- \let_\realunder
- \fi
- \codex
- }
-}
-
-\def\realdash{-}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{%
- % this is all so @math{@code{var_name}+1} can work. In math mode, _
- % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
- % will therefore expand the active definition of _, which is us
- % (inside @code that is), therefore an endless loop.
- \ifusingtt{\ifmmode
- \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
- \else\normalunderscore \fi
- \discretionary{}{}{}}%
- {\_}%
-}
-\def\codex #1{\tclose{#1}\endgroup}
-
-% An additional complication: the above will allow breaks after, e.g.,
-% each of the four underscores in __typeof__. This is undesirable in
-% some manuals, especially if they don't have long identifiers in
-% general. @allowcodebreaks provides a way to control this.
-%
-\newif\ifallowcodebreaks \allowcodebreakstrue
-
-\def\keywordtrue{true}
-\def\keywordfalse{false}
-
-\parseargdef\allowcodebreaks{%
- \def\txiarg{#1}%
- \ifx\txiarg\keywordtrue
- \allowcodebreakstrue
- \else\ifx\txiarg\keywordfalse
- \allowcodebreaksfalse
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
- \fi\fi
-}
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-% `example' (@kbd uses ttsl only inside of @example and friends),
-% or `code' (@kbd uses normal tty font always).
-\parseargdef\kbdinputstyle{%
- \def\txiarg{#1}%
- \ifx\txiarg\worddistinct
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
- \else\ifx\txiarg\wordexample
- \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
- \else\ifx\txiarg\wordcode
- \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
- \else
- \errhelp = \EMsimple
- \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
- \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is `distinct.'
-\kbdinputstyle distinct
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else{\tclose{\kbdfont\look}}\fi
-\else{\tclose{\kbdfont\look}}\fi}
-
-% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
-\let\indicateurl=\code
-\let\env=\code
-\let\command=\code
-
-% @uref (abbreviation for `urlref') takes an optional (comma-separated)
-% second argument specifying the text to display and an optional third
-% arg as text to display instead of (rather than in addition to) the url
-% itself. First (mandatory) arg is the url. Perhaps eventually put in
-% a hypertex \special here.
-%
-\def\uref#1{\douref #1,,,\finish}
-\def\douref#1,#2,#3,#4\finish{\begingroup
- \unsepspaces
- \pdfurl{#1}%
- \setbox0 = \hbox{\ignorespaces #3}%
- \ifdim\wd0 > 0pt
- \unhbox0 % third arg given, show only that
- \else
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0 > 0pt
- \ifpdf
- \unhbox0 % PDF: 2nd arg given, show only it
- \else
- \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
- \fi
- \else
- \code{#1}% only url given, so show it
- \fi
- \fi
- \endlink
-\endgroup}
-
-% @url synonym for @uref, since that's how everyone uses it.
-%
-\let\url=\uref
-
-% rms does not like angle brackets --karl, 17may97.
-% So now @email is just like @uref, unless we are pdf.
-%
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\ifpdf
- \def\email#1{\doemail#1,,\finish}
- \def\doemail#1,#2,#3\finish{\begingroup
- \unsepspaces
- \pdfurl{mailto:#1}%
- \setbox0 = \hbox{\ignorespaces #2}%
- \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
- \endlink
- \endgroup}
-\else
- \let\email=\uref
-\fi
-
-% Check if we are currently using a typewriter font. Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
-
-% @l was never documented to mean ``switch to the Lisp font'',
-% and it is not used as such in any manual I can find. We need it for
-% Polish suppressed-l. --karl, 22sep96.
-%\def\l#1{{\li #1}\null}
-
-% Explicit font changes: @r, @sc, undocumented @ii.
-\def\r#1{{\rm #1}} % roman font
-\def\sc#1{{\smallcaps#1}} % smallcaps font
-\def\ii#1{{\it #1}} % italic font
-
-% @acronym for "FBI", "NATO", and the like.
-% We print this one point size smaller, since it's intended for
-% all-uppercase.
-%
-\def\acronym#1{\doacronym #1,,\finish}
-\def\doacronym#1,#2,#3\finish{%
- {\selectfonts\lsize #1}%
- \def\temp{#2}%
- \ifx\temp\empty \else
- \space ({\unsepspaces \ignorespaces \temp \unskip})%
- \fi
-}
-
-% @abbr for "Comput. J." and the like.
-% No font change, but don't do end-of-sentence spacing.
-%
-\def\abbr#1{\doabbr #1,,\finish}
-\def\doabbr#1,#2,#3\finish{%
- {\plainfrenchspacing #1}%
- \def\temp{#2}%
- \ifx\temp\empty \else
- \space ({\unsepspaces \ignorespaces \temp \unskip})%
- \fi
-}
-
-% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
-%
-\def\pounds{{\it\$}}
-
-% @euro{} comes from a separate font, depending on the current style.
-% We use the free feym* fonts from the eurosym package by Henrik
-% Theiling, which support regular, slanted, bold and bold slanted (and
-% "outlined" (blackboard board, sort of) versions, which we don't need).
-% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
-%
-% Although only regular is the truly official Euro symbol, we ignore
-% that. The Euro is designed to be slightly taller than the regular
-% font height.
-%
-% feymr - regular
-% feymo - slanted
-% feybr - bold
-% feybo - bold slanted
-%
-% There is no good (free) typewriter version, to my knowledge.
-% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
-% Hmm.
-%
-% Also doesn't work in math. Do we need to do math with euro symbols?
-% Hope not.
-%
-%
-\def\euro{{\eurofont e}}
-\def\eurofont{%
- % We set the font at each command, rather than predefining it in
- % \textfonts and the other font-switching commands, so that
- % installations which never need the symbol don't have to have the
- % font installed.
- %
- % There is only one designed size (nominal 10pt), so we always scale
- % that to the current nominal size.
- %
- % By the way, simply using "at 1em" works for cmr10 and the like, but
- % does not work for cmbx10 and other extended/shrunken fonts.
- %
- \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
- %
- \ifx\curfontstyle\bfstylename
- % bold:
- \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
- \else
- % regular:
- \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
- \fi
- \thiseurofont
-}
-
-% @registeredsymbol - R in a circle. The font for the R should really
-% be smaller yet, but lllsize is the best we can do for now.
-% Adapted from the plain.tex definition of \copyright.
-%
-\def\registeredsymbol{%
- $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
- \hfil\crcr\Orb}}%
- }$%
-}
-
-% @textdegree - the normal degrees sign.
-%
-\def\textdegree{$^\circ$}
-
-% Laurent Siebenmann reports \Orb undefined with:
-% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
-% so we'll define it if necessary.
-%
-\ifx\Orb\undefined
-\def\Orb{\mathhexbox20D}
-\fi
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page. Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-% Do an implicit @contents or @shortcontents after @end titlepage if the
-% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
-%
-\newif\ifsetcontentsaftertitlepage
- \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
-\newif\ifsetshortcontentsaftertitlepage
- \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
-
-\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
- \endgroup\page\hbox{}\page}
-
-\envdef\titlepage{%
- % Open one extra group, as we want to close it in the middle of \Etitlepage.
- \begingroup
- \parindent=0pt \textfonts
- % Leave some space at the very top of the page.
- \vglue\titlepagetopglue
- % No rule at page bottom unless we print one at the top with @title.
- \finishedtitlepagetrue
- %
- % Most title ``pages'' are actually two pages long, with space
- % at the top of the second. We don't want the ragged left on the second.
- \let\oldpage = \page
- \def\page{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- \let\page = \oldpage
- \page
- \null
- }%
-}
-
-\def\Etitlepage{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- % It is important to do the page break before ending the group,
- % because the headline and footline are only empty inside the group.
- % If we use the new definition of \page, we always get a blank page
- % after the title page, which we certainly don't want.
- \oldpage
- \endgroup
- %
- % Need this before the \...aftertitlepage checks so that if they are
- % in effect the toc pages will come out with page numbers.
- \HEADINGSon
- %
- % If they want short, they certainly want long too.
- \ifsetshortcontentsaftertitlepage
- \shortcontents
- \contents
- \global\let\shortcontents = \relax
- \global\let\contents = \relax
- \fi
- %
- \ifsetcontentsaftertitlepage
- \contents
- \global\let\contents = \relax
- \global\let\shortcontents = \relax
- \fi
-}
-
-\def\finishtitlepage{%
- \vskip4pt \hrule height 2pt width \hsize
- \vskip\titlepagebottomglue
- \finishedtitlepagetrue
-}
-
-%%% Macros to be used within @titlepage:
-
-\let\subtitlerm=\tenrm
-\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
-
-\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
- \let\tt=\authortt}
-
-\parseargdef\title{%
- \checkenv\titlepage
- \leftline{\titlefonts\rm #1}
- % print a rule at the page bottom also.
- \finishedtitlepagefalse
- \vskip4pt \hrule height 4pt width \hsize \vskip4pt
-}
-
-\parseargdef\subtitle{%
- \checkenv\titlepage
- {\subtitlefont \rightline{#1}}%
-}
-
-% @author should come last, but may come many times.
-% It can also be used inside @quotation.
-%
-\parseargdef\author{%
- \def\temp{\quotation}%
- \ifx\thisenv\temp
- \def\quotationauthor{#1}% printed in \Equotation.
- \else
- \checkenv\titlepage
- \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
- {\authorfont \leftline{#1}}%
- \fi
-}
-
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks\evenheadline % headline on even pages
-\newtoks\oddheadline % headline on odd pages
-\newtoks\evenfootline % footline on even pages
-\newtoks\oddfootline % footline on odd pages
-
-% Now make TeX use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
- \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
- \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what @headings on does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
-\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
-\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
-\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
-\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
- \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
- %
- % Leave some space for the footline. Hopefully ok to assume
- % @evenfooting will not be used by itself.
- \global\advance\pageheight by -12pt
- \global\advance\vsize by -12pt
-}
-
-\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-
-
-% @headings double turns headings on for double-sided printing.
-% @headings single turns headings on for single-sided printing.
-% @headings off turns them off.
-% @headings on same as @headings double, retained for compatibility.
-% @headings after turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{%
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% This produces Day Month Year style of output.
-% Only define if not already defined, in case a txi-??.tex file has set
-% up a different format (e.g., txi-cs.tex does this).
-\ifx\today\undefined
-\def\today{%
- \number\day\space
- \ifcase\month
- \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
- \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
- \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
- \fi
- \space\number\year}
-\fi
-
-% @settitle line... specifies the title of the document, for headings.
-% It generates no output of its own.
-\def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg{\gdef\thistitle}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\itemzzz #1{\begingroup %
- \advance\hsize by -\rightskip
- \advance\hsize by -\tableindent
- \setbox0=\hbox{\itemindicate{#1}}%
- \itemindex{#1}%
- \nobreak % This prevents a break before @itemx.
- %
- % If the item text does not fit in the space we have, put it on a line
- % by itself, and do not allow a page break either before or after that
- % line. We do not start a paragraph here because then if the next
- % command is, e.g., @kindex, the whatsit would get put into the
- % horizontal list on a line by itself, resulting in extra blank space.
- \ifdim \wd0>\itemmax
- %
- % Make this a paragraph so we get the \parskip glue and wrapping,
- % but leave it ragged-right.
- \begingroup
- \advance\leftskip by-\tableindent
- \advance\hsize by\tableindent
- \advance\rightskip by0pt plus1fil
- \leavevmode\unhbox0\par
- \endgroup
- %
- % We're going to be starting a paragraph, but we don't want the
- % \parskip glue -- logically it's part of the @item we just started.
- \nobreak \vskip-\parskip
- %
- % Stop a page break at the \parskip glue coming up. However, if
- % what follows is an environment such as @example, there will be no
- % \parskip glue; then the negative vskip we just inserted would
- % cause the example and the item to crash together. So we use this
- % bizarre value of 10001 as a signal to \aboveenvbreak to insert
- % \parskip glue after all. Section titles are handled this way also.
- %
- \penalty 10001
- \endgroup
- \itemxneedsnegativevskipfalse
- \else
- % The item text fits into the space. Start a paragraph, so that the
- % following text (if any) will end up on the same line.
- \noindent
- % Do this with kerns and \unhbox so that if there is a footnote in
- % the item text, it can migrate to the main vertical list and
- % eventually be printed.
- \nobreak\kern-\tableindent
- \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
- \unhbox0
- \nobreak\kern\dimen0
- \endgroup
- \itemxneedsnegativevskiptrue
- \fi
-}
-
-\def\item{\errmessage{@item while not in a list environment}}
-\def\itemx{\errmessage{@itemx while not in a list environment}}
-
-% @table, @ftable, @vtable.
-\envdef\table{%
- \let\itemindex\gobble
- \tablecheck{table}%
-}
-\envdef\ftable{%
- \def\itemindex ##1{\doind {fn}{\code{##1}}}%
- \tablecheck{ftable}%
-}
-\envdef\vtable{%
- \def\itemindex ##1{\doind {vr}{\code{##1}}}%
- \tablecheck{vtable}%
-}
-\def\tablecheck#1{%
- \ifnum \the\catcode`\^^M=\active
- \endgroup
- \errmessage{This command won't work in this context; perhaps the problem is
- that we are \inenvironment\thisenv}%
- \def\next{\doignore{#1}}%
- \else
- \let\next\tablex
- \fi
- \next
-}
-\def\tablex#1{%
- \def\itemindicate{#1}%
- \parsearg\tabley
-}
-\def\tabley#1{%
- {%
- \makevalueexpandable
- \edef\temp{\noexpand\tablez #1\space\space\space}%
- \expandafter
- }\temp \endtablez
-}
-\def\tablez #1 #2 #3 #4\endtablez{%
- \aboveenvbreak
- \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
- \ifnum 0#2>0 \tableindent=#2\mil \fi
- \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
- \itemmax=\tableindent
- \advance \itemmax by -\itemmargin
- \advance \leftskip by \tableindent
- \exdentamount=\tableindent
- \parindent = 0pt
- \parskip = \smallskipamount
- \ifdim \parskip=0pt \parskip=2pt \fi
- \let\item = \internalBitem
- \let\itemx = \internalBitemx
-}
-\def\Etable{\endgraf\afterenvbreak}
-\let\Eftable\Etable
-\let\Evtable\Etable
-\let\Eitemize\Etable
-\let\Eenumerate\Etable
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\envdef\itemize{\parsearg\doitemize}
-
-\def\doitemize#1{%
- \aboveenvbreak
- \itemmax=\itemindent
- \advance\itemmax by -\itemmargin
- \advance\leftskip by \itemindent
- \exdentamount=\itemindent
- \parindent=0pt
- \parskip=\smallskipamount
- \ifdim\parskip=0pt \parskip=2pt \fi
- \def\itemcontents{#1}%
- % @itemize with no arg is equivalent to @itemize @bullet.
- \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
- \let\item=\itemizeitem
-}
-
-% Definition of @item while inside @itemize and @enumerate.
-%
-\def\itemizeitem{%
- \advance\itemno by 1 % for enumerations
- {\let\par=\endgraf \smallbreak}% reasonable place to break
- {%
- % If the document has an @itemize directly after a section title, a
- % \nobreak will be last on the list, and \sectionheading will have
- % done a \vskip-\parskip. In that case, we don't want to zero
- % parskip, or the item text will crash with the heading. On the
- % other hand, when there is normal text preceding the item (as there
- % usually is), we do want to zero parskip, or there would be too much
- % space. In that case, we won't have a \nobreak before. At least
- % that's the theory.
- \ifnum\lastpenalty<10000 \parskip=0in \fi
- \noindent
- \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
- \vadjust{\penalty 1200}}% not good to break after first line of item.
- \flushcr
-}
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list. No
-% argument is the same as `1'.
-%
-\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
- % If we were given no argument, pretend we were given `1'.
- \def\thearg{#1}%
- \ifx\thearg\empty \def\thearg{1}\fi
- %
- % Detect if the argument is a single token. If so, it might be a
- % letter. Otherwise, the only valid thing it can be is a number.
- % (We will always have one token, because of the test we just made.
- % This is a good thing, since \splitoff doesn't work given nothing at
- % all -- the first parameter is undelimited.)
- \expandafter\splitoff\thearg\endmark
- \ifx\rest\empty
- % Only one token in the argument. It could still be anything.
- % A ``lowercase letter'' is one whose \lccode is nonzero.
- % An ``uppercase letter'' is one whose \lccode is both nonzero, and
- % not equal to itself.
- % Otherwise, we assume it's a number.
- %
- % We need the \relax at the end of the \ifnum lines to stop TeX from
- % continuing to look for a <number>.
- %
- \ifnum\lccode\expandafter`\thearg=0\relax
- \numericenumerate % a number (we hope)
- \else
- % It's a letter.
- \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
- \lowercaseenumerate % lowercase letter
- \else
- \uppercaseenumerate % uppercase letter
- \fi
- \fi
- \else
- % Multiple tokens in the argument. We hope it's a number.
- \numericenumerate
- \fi
-}
-
-% An @enumerate whose labels are integers. The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
- \itemno = \thearg
- \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more lowercase letters in @enumerate; get a bigger
- alphabet}%
- \fi
- \char\lccode\itemno
- }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more uppercase letters in @enumerate; get a bigger
- alphabet}
- \fi
- \char\uccode\itemno
- }%
-}
-
-% Call \doitemize, adding a period to the first argument and supplying the
-% common last two arguments. Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
- \advance\itemno by -1
- \doitemize{#1.}\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble. Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-% @multitable @columnfractions .25 .3 .45
-% @item ...
-%
-% Numbers following @columnfractions are the percent of the total
-% current hsize to be used for each column. You may use as many
-% columns as desired.
-
-
-% Or use a template:
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item ...
-% using the widest term desired in each column.
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab do not need to be on their own lines, but it will not hurt
-% if they are.
-
-% Sample multitable:
-
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item first col stuff @tab second col stuff @tab third col
-% @item
-% first col stuff
-% @tab
-% second col stuff
-% @tab
-% third col
-% @item first col stuff @tab second col stuff
-% @tab Many paragraphs of text may be used in any column.
-%
-% They will wrap at the width determined by the template.
-% @item@tab@tab This will be in third column.
-% @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-% to baseline.
-% 0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% #1 is the @columnfraction, usually a decimal number like .5, but might
-% be just 1. We just use it, whatever it is.
-%
-\def\pickupwholefraction#1 {%
- \global\advance\colcount by 1
- \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
- \setuptable
-}
-
-\newcount\colcount
-\def\setuptable#1{%
- \def\firstarg{#1}%
- \ifx\firstarg\xendsetuptable
- \let\go = \relax
- \else
- \ifx\firstarg\xcolumnfractions
- \global\setpercenttrue
- \else
- \ifsetpercent
- \let\go\pickupwholefraction
- \else
- \global\advance\colcount by 1
- \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
- % separator; typically that is always in the input, anyway.
- \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
- \fi
- \fi
- \ifx\go\pickupwholefraction
- % Put the argument back for the \pickupwholefraction call, so
- % we'll always have a period there to be parsed.
- \def\go{\pickupwholefraction#1}%
- \else
- \let\go = \setuptable
- \fi%
- \fi
- \go
-}
-
-% multitable-only commands.
-%
-% @headitem starts a heading row, which we typeset in bold.
-% Assignments have to be global since we are inside the implicit group
-% of an alignment entry. Note that \everycr resets \everytab.
-\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
-%
-% A \tab used to include \hskip1sp. But then the space in a template
-% line is not enough. That is bad. So let's go back to just `&' until
-% we encounter the problem it was intended to solve again.
-% --karl, nathan@acm.org, 20apr99.
-\def\tab{\checkenv\multitable &\the\everytab}%
-
-% @multitable ... @end multitable definitions:
-%
-\newtoks\everytab % insert after every tab.
-%
-\envdef\multitable{%
- \vskip\parskip
- \startsavinginserts
- %
- % @item within a multitable starts a normal row.
- % We use \def instead of \let so that if one of the multitable entries
- % contains an @itemize, we don't choke on the \item (seen as \crcr aka
- % \endtemplate) expanding \doitemize.
- \def\item{\crcr}%
- %
- \tolerance=9500
- \hbadness=9500
- \setmultitablespacing
- \parskip=\multitableparskip
- \parindent=\multitableparindent
- \overfullrule=0pt
- \global\colcount=0
- %
- \everycr = {%
- \noalign{%
- \global\everytab={}%
- \global\colcount=0 % Reset the column counter.
- % Check for saved footnotes, etc.
- \checkinserts
- % Keeps underfull box messages off when table breaks over pages.
- %\filbreak
- % Maybe so, but it also creates really weird page breaks when the
- % table breaks over pages. Wouldn't \vfil be better? Wait until the
- % problem manifests itself, so it can be fixed for real --karl.
- }%
- }%
- %
- \parsearg\domultitable
-}
-\def\domultitable#1{%
- % To parse everything between @multitable and @item:
- \setuptable#1 \endsetuptable
- %
- % This preamble sets up a generic column definition, which will
- % be used as many times as user calls for columns.
- % \vtop will set a single line and will also let text wrap and
- % continue for many paragraphs if desired.
- \halign\bgroup &%
- \global\advance\colcount by 1
- \multistrut
- \vtop{%
- % Use the current \colcount to find the correct column width:
- \hsize=\expandafter\csname col\the\colcount\endcsname
- %
- % In order to keep entries from bumping into each other
- % we will add a \leftskip of \multitablecolspace to all columns after
- % the first one.
- %
- % If a template has been used, we will add \multitablecolspace
- % to the width of each template entry.
- %
- % If the user has set preamble in terms of percent of \hsize we will
- % use that dimension as the width of the column, and the \leftskip
- % will keep entries from bumping into each other. Table will start at
- % left margin and final column will justify at right margin.
- %
- % Make sure we don't inherit \rightskip from the outer environment.
- \rightskip=0pt
- \ifnum\colcount=1
- % The first column will be indented with the surrounding text.
- \advance\hsize by\leftskip
- \else
- \ifsetpercent \else
- % If user has not set preamble in terms of percent of \hsize
- % we will advance \hsize by \multitablecolspace.
- \advance\hsize by \multitablecolspace
- \fi
- % In either case we will make \leftskip=\multitablecolspace:
- \leftskip=\multitablecolspace
- \fi
- % Ignoring space at the beginning and end avoids an occasional spurious
- % blank line, when TeX decides to break the line at the space before the
- % box from the multistrut, so the strut ends up on a line by itself.
- % For example:
- % @multitable @columnfractions .11 .89
- % @item @code{#}
- % @tab Legal holiday which is valid in major parts of the whole country.
- % Is automatically provided with highlighting sequences respectively
- % marking characters.
- \noindent\ignorespaces##\unskip\multistrut
- }\cr
-}
-\def\Emultitable{%
- \crcr
- \egroup % end the \halign
- \global\setpercentfalse
-}
-
-\def\setmultitablespacing{%
- \def\multistrut{\strut}% just use the standard line spacing
- %
- % Compute \multitablelinespace (if not defined by user) for use in
- % \multitableparskip calculation. We used define \multistrut based on
- % this, but (ironically) that caused the spacing to be off.
- % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-\fi
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%% If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
- %% than skip between lines in the table.
-\fi}
-
-
-\message{conditionals,}
-
-% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
-% @ifnotxml always succeed. They currently do nothing; we don't
-% attempt to check whether the conditionals are properly nested. But we
-% have to remember that they are conditionals, so that @end doesn't
-% attempt to close an environment group.
-%
-\def\makecond#1{%
- \expandafter\let\csname #1\endcsname = \relax
- \expandafter\let\csname iscond.#1\endcsname = 1
-}
-\makecond{iftex}
-\makecond{ifnotdocbook}
-\makecond{ifnothtml}
-\makecond{ifnotinfo}
-\makecond{ifnotplaintext}
-\makecond{ifnotxml}
-
-% Ignore @ignore, @ifhtml, @ifinfo, and the like.
-%
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\docbook{\doignore{docbook}}
-\def\html{\doignore{html}}
-\def\ifdocbook{\doignore{ifdocbook}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\ifplaintext{\doignore{ifplaintext}}
-\def\ifxml{\doignore{ifxml}}
-\def\ignore{\doignore{ignore}}
-\def\menu{\doignore{menu}}
-\def\xml{\doignore{xml}}
-
-% Ignore text until a line `@end #1', keeping track of nested conditionals.
-%
-% A count to remember the depth of nesting.
-\newcount\doignorecount
-
-\def\doignore#1{\begingroup
- % Scan in ``verbatim'' mode:
- \obeylines
- \catcode`\@ = \other
- \catcode`\{ = \other
- \catcode`\} = \other
- %
- % Make sure that spaces turn into tokens that match what \doignoretext wants.
- \spaceisspace
- %
- % Count number of #1's that we've seen.
- \doignorecount = 0
- %
- % Swallow text until we reach the matching `@end #1'.
- \dodoignore{#1}%
-}
-
-{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
- \obeylines %
- %
- \gdef\dodoignore#1{%
- % #1 contains the command name as a string, e.g., `ifinfo'.
- %
- % Define a command to find the next `@end #1'.
- \long\def\doignoretext##1^^M@end #1{%
- \doignoretextyyy##1^^M@#1\_STOP_}%
- %
- % And this command to find another #1 command, at the beginning of a
- % line. (Otherwise, we would consider a line `@c @ifset', for
- % example, to count as an @ifset for nesting.)
- \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
- %
- % And now expand that command.
- \doignoretext ^^M%
- }%
-}
-
-\def\doignoreyyy#1{%
- \def\temp{#1}%
- \ifx\temp\empty % Nothing found.
- \let\next\doignoretextzzz
- \else % Found a nested condition, ...
- \advance\doignorecount by 1
- \let\next\doignoretextyyy % ..., look for another.
- % If we're here, #1 ends with ^^M\ifinfo (for example).
- \fi
- \next #1% the token \_STOP_ is present just after this macro.
-}
-
-% We have to swallow the remaining "\_STOP_".
-%
-\def\doignoretextzzz#1{%
- \ifnum\doignorecount = 0 % We have just found the outermost @end.
- \let\next\enddoignore
- \else % Still inside a nested condition.
- \advance\doignorecount by -1
- \let\next\doignoretext % Look for the next @end.
- \fi
- \next
-}
-
-% Finish off ignored text.
-{ \obeylines%
- % Ignore anything after the last `@end #1'; this matters in verbatim
- % environments, where otherwise the newline after an ignored conditional
- % would result in a blank line in the output.
- \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
-}
-
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.
-% We rely on the fact that \parsearg sets \catcode`\ =10.
-%
-\parseargdef\set{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
- {%
- \makevalueexpandable
- \def\temp{#2}%
- \edef\next{\gdef\makecsname{SET#1}}%
- \ifx\temp\empty
- \next{}%
- \else
- \setzzz#2\endsetzzz
- \fi
- }%
-}
-% Remove the trailing space \setxxx inserted.
-\def\setzzz#1 \endsetzzz{\next{#1}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\parseargdef\clear{%
- {%
- \makevalueexpandable
- \global\expandafter\let\csname SET#1\endcsname=\relax
- }%
-}
-
-% @value{foo} gets the text saved in variable foo.
-\def\value{\begingroup\makevalueexpandable\valuexxx}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-{
- \catcode`\- = \active \catcode`\_ = \active
- %
- \gdef\makevalueexpandable{%
- \let\value = \expandablevalue
- % We don't want these characters active, ...
- \catcode`\-=\other \catcode`\_=\other
- % ..., but we might end up with active ones in the argument if
- % we're called from @code, as @code{@value{foo-bar_}}, though.
- % So \let them to their normal equivalents.
- \let-\realdash \let_\normalunderscore
- }
-}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we call \makevalueexpandable in \indexdummies).
-% The command has to be fully expandable (if the variable is set), since
-% the result winds up in the index file. This means that if the
-% variable's value contains other Texinfo commands, it's almost certain
-% it will fail (although perhaps we could fix that with sufficient work
-% to do a one-level expansion on the result, instead of complete).
-%
-\def\expandablevalue#1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- {[No value for ``#1'']}%
- \message{Variable `#1', used in @value, is not set.}%
- \else
- \csname SET#1\endcsname
- \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-% To get special treatment of `@end ifset,' call \makeond and the redefine.
-%
-\makecond{ifset}
-\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
-\def\doifset#1#2{%
- {%
- \makevalueexpandable
- \let\next=\empty
- \expandafter\ifx\csname SET#2\endcsname\relax
- #1% If not set, redefine \next.
- \fi
- \expandafter
- }\next
-}
-\def\ifsetfail{\doignore{ifset}}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-% The `\else' inside the `\doifset' parameter is a trick to reuse the
-% above code: if the variable is not set, do nothing, if it is set,
-% then redefine \next to \ifclearfail.
-%
-\makecond{ifclear}
-\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
-\def\ifclearfail{\doignore{ifclear}}
-
-% @dircategory CATEGORY -- specify a category of the dir file
-% which this file should belong to. Ignore this in TeX.
-\let\dircategory=\comment
-
-% @defininfoenclose.
-\let\definfoenclose=\comment
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within macros and \if's.
-\edef\newwrite{\makecsname{ptexnewwrite}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index. The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
- \fi
- \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
- \noexpand\doindex{#1}}
-}
-
-% @defindex foo == \newindex{foo}
-%
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-%
-\def\defcodeindex{\parsearg\newcodeindex}
-%
-\def\newcodeindex#1{%
- \iflinks
- \expandafter\newwrite \csname#1indfile\endcsname
- \openout \csname#1indfile\endcsname \jobname.#1
- \fi
- \expandafter\xdef\csname#1index\endcsname{%
- \noexpand\docodeindex{#1}}%
-}
-
-
-% @synindex foo bar makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-%
-% @syncodeindex foo bar similar, but put all entries made for index foo
-% inside @code.
-%
-\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
-\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
-
-% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
-% #3 the target index (bar).
-\def\dosynindex#1#2#3{%
- % Only do \closeout if we haven't already done it, else we'll end up
- % closing the target index.
- \expandafter \ifx\csname donesynindex#2\endcsname \undefined
- % The \closeout helps reduce unnecessary open files; the limit on the
- % Acorn RISC OS is a mere 16 files.
- \expandafter\closeout\csname#2indfile\endcsname
- \expandafter\let\csname\donesynindex#2\endcsname = 1
- \fi
- % redefine \fooindfile:
- \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
- \expandafter\let\csname#2indfile\endcsname=\temp
- % redefine \fooindex:
- \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-% and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-% Take care of Texinfo commands that can appear in an index entry.
-% Since there are some commands we want to expand, and others we don't,
-% we have to laboriously prevent expansion for those that we don't.
-%
-\def\indexdummies{%
- \escapechar = `\\ % use backslash in output files.
- \def\@{@}% change to @@ when we switch to @ as escape char in index files.
- \def\ {\realbackslash\space }%
- %
- % Need these in case \tex is in effect and \{ is a \delimiter again.
- % But can't use \lbracecmd and \rbracecmd because texindex assumes
- % braces and backslashes are used only as delimiters.
- \let\{ = \mylbrace
- \let\} = \myrbrace
- %
- % I don't entirely understand this, but when an index entry is
- % generated from a macro call, the \endinput which \scanmacro inserts
- % causes processing to be prematurely terminated. This is,
- % apparently, because \indexsorttmp is fully expanded, and \endinput
- % is an expandable command. The redefinition below makes \endinput
- % disappear altogether for that purpose -- although logging shows that
- % processing continues to some further point. On the other hand, it
- % seems \endinput does not hurt in the printed index arg, since that
- % is still getting written without apparent harm.
- %
- % Sample source (mac-idx3.tex, reported by Graham Percival to
- % help-texinfo, 22may06):
- % @macro funindex {WORD}
- % @findex xyz
- % @end macro
- % ...
- % @funindex commtest
- %
- % The above is not enough to reproduce the bug, but it gives the flavor.
- %
- % Sample whatsit resulting:
- % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
- %
- % So:
- \let\endinput = \empty
- %
- % Do the redefinitions.
- \commondummies
-}
-
-% For the aux and toc files, @ is the escape character. So we want to
-% redefine everything using @ as the escape character (instead of
-% \realbackslash, still used for index files). When everything uses @,
-% this will be simpler.
-%
-\def\atdummies{%
- \def\@{@@}%
- \def\ {@ }%
- \let\{ = \lbraceatcmd
- \let\} = \rbraceatcmd
- %
- % Do the redefinitions.
- \commondummies
- \otherbackslash
-}
-
-% Called from \indexdummies and \atdummies.
-%
-\def\commondummies{%
- %
- % \definedummyword defines \#1 as \string\#1\space, thus effectively
- % preventing its expansion. This is used only for control% words,
- % not control letters, because the \space would be incorrect for
- % control characters, but is needed to separate the control word
- % from whatever follows.
- %
- % For control letters, we have \definedummyletter, which omits the
- % space.
- %
- % These can be used both for control words that take an argument and
- % those that do not. If it is followed by {arg} in the input, then
- % that will dutifully get written to the index (or wherever).
- %
- \def\definedummyword ##1{\def##1{\string##1\space}}%
- \def\definedummyletter##1{\def##1{\string##1}}%
- \let\definedummyaccent\definedummyletter
- %
- \commondummiesnofonts
- %
- \definedummyletter\_%
- %
- % Non-English letters.
- \definedummyword\AA
- \definedummyword\AE
- \definedummyword\L
- \definedummyword\OE
- \definedummyword\O
- \definedummyword\aa
- \definedummyword\ae
- \definedummyword\l
- \definedummyword\oe
- \definedummyword\o
- \definedummyword\ss
- \definedummyword\exclamdown
- \definedummyword\questiondown
- \definedummyword\ordf
- \definedummyword\ordm
- %
- % Although these internal commands shouldn't show up, sometimes they do.
- \definedummyword\bf
- \definedummyword\gtr
- \definedummyword\hat
- \definedummyword\less
- \definedummyword\sf
- \definedummyword\sl
- \definedummyword\tclose
- \definedummyword\tt
- %
- \definedummyword\LaTeX
- \definedummyword\TeX
- %
- % Assorted special characters.
- \definedummyword\bullet
- \definedummyword\comma
- \definedummyword\copyright
- \definedummyword\registeredsymbol
- \definedummyword\dots
- \definedummyword\enddots
- \definedummyword\equiv
- \definedummyword\error
- \definedummyword\euro
- \definedummyword\expansion
- \definedummyword\minus
- \definedummyword\pounds
- \definedummyword\point
- \definedummyword\print
- \definedummyword\result
- \definedummyword\textdegree
- %
- % We want to disable all macros so that they are not expanded by \write.
- \macrolist
- %
- \normalturnoffactive
- %
- % Handle some cases of @value -- where it does not contain any
- % (non-fully-expandable) commands.
- \makevalueexpandable
-}
-
-% \commondummiesnofonts: common to \commondummies and \indexnofonts.
-%
-\def\commondummiesnofonts{%
- % Control letters and accents.
- \definedummyletter\!%
- \definedummyaccent\"%
- \definedummyaccent\'%
- \definedummyletter\*%
- \definedummyaccent\,%
- \definedummyletter\.%
- \definedummyletter\/%
- \definedummyletter\:%
- \definedummyaccent\=%
- \definedummyletter\?%
- \definedummyaccent\^%
- \definedummyaccent\`%
- \definedummyaccent\~%
- \definedummyword\u
- \definedummyword\v
- \definedummyword\H
- \definedummyword\dotaccent
- \definedummyword\ringaccent
- \definedummyword\tieaccent
- \definedummyword\ubaraccent
- \definedummyword\udotaccent
- \definedummyword\dotless
- %
- % Texinfo font commands.
- \definedummyword\b
- \definedummyword\i
- \definedummyword\r
- \definedummyword\sc
- \definedummyword\t
- %
- % Commands that take arguments.
- \definedummyword\acronym
- \definedummyword\cite
- \definedummyword\code
- \definedummyword\command
- \definedummyword\dfn
- \definedummyword\emph
- \definedummyword\env
- \definedummyword\file
- \definedummyword\kbd
- \definedummyword\key
- \definedummyword\math
- \definedummyword\option
- \definedummyword\pxref
- \definedummyword\ref
- \definedummyword\samp
- \definedummyword\strong
- \definedummyword\tie
- \definedummyword\uref
- \definedummyword\url
- \definedummyword\var
- \definedummyword\verb
- \definedummyword\w
- \definedummyword\xref
-}
-
-% \indexnofonts is used when outputting the strings to sort the index
-% by, and when constructing control sequence names. It eliminates all
-% control sequences and just writes whatever the best ASCII sort string
-% would be for a given command (usually its argument).
-%
-\def\indexnofonts{%
- % Accent commands should become @asis.
- \def\definedummyaccent##1{\let##1\asis}%
- % We can just ignore other control letters.
- \def\definedummyletter##1{\let##1\empty}%
- % Hopefully, all control words can become @asis.
- \let\definedummyword\definedummyaccent
- %
- \commondummiesnofonts
- %
- % Don't no-op \tt, since it isn't a user-level command
- % and is used in the definitions of the active chars like <, >, |, etc.
- % Likewise with the other plain tex font commands.
- %\let\tt=\asis
- %
- \def\ { }%
- \def\@{@}%
- % how to handle braces?
- \def\_{\normalunderscore}%
- %
- % Non-English letters.
- \def\AA{AA}%
- \def\AE{AE}%
- \def\L{L}%
- \def\OE{OE}%
- \def\O{O}%
- \def\aa{aa}%
- \def\ae{ae}%
- \def\l{l}%
- \def\oe{oe}%
- \def\o{o}%
- \def\ss{ss}%
- \def\exclamdown{!}%
- \def\questiondown{?}%
- \def\ordf{a}%
- \def\ordm{o}%
- %
- \def\LaTeX{LaTeX}%
- \def\TeX{TeX}%
- %
- % Assorted special characters.
- % (The following {} will end up in the sort string, but that's ok.)
- \def\bullet{bullet}%
- \def\comma{,}%
- \def\copyright{copyright}%
- \def\registeredsymbol{R}%
- \def\dots{...}%
- \def\enddots{...}%
- \def\equiv{==}%
- \def\error{error}%
- \def\euro{euro}%
- \def\expansion{==>}%
- \def\minus{-}%
- \def\pounds{pounds}%
- \def\point{.}%
- \def\print{-|}%
- \def\result{=>}%
- \def\textdegree{degrees}%
- %
- % We need to get rid of all macros, leaving only the arguments (if present).
- % Of course this is not nearly correct, but it is the best we can do for now.
- % makeinfo does not expand macros in the argument to @deffn, which ends up
- % writing an index entry, and texindex isn't prepared for an index sort entry
- % that starts with \.
- %
- % Since macro invocations are followed by braces, we can just redefine them
- % to take a single TeX argument. The case of a macro invocation that
- % goes to end-of-line is not handled.
- %
- \macrolist
-}
-
-\let\indexbackslash=0 %overridden during \printindex.
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% Most index entries go through here, but \dosubind is the general case.
-% #1 is the index name, #2 is the entry text.
-\def\doind#1#2{\dosubind{#1}{#2}{}}
-
-% Workhorse for all \fooindexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% empty if called from \doind, as we usually are (the main exception
-% is with most defuns, which call us directly).
-%
-\def\dosubind#1#2#3{%
- \iflinks
- {%
- % Store the main index entry text (including the third arg).
- \toks0 = {#2}%
- % If third arg is present, precede it with a space.
- \def\thirdarg{#3}%
- \ifx\thirdarg\empty \else
- \toks0 = \expandafter{\the\toks0 \space #3}%
- \fi
- %
- \edef\writeto{\csname#1indfile\endcsname}%
- %
- \ifvmode
- \dosubindsanitize
- \else
- \dosubindwrite
- \fi
- }%
- \fi
-}
-
-% Write the entry in \toks0 to the index file:
-%
-\def\dosubindwrite{%
- % Put the index entry in the margin if desired.
- \ifx\SETmarginindex\relax\else
- \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
- \fi
- %
- % Remember, we are within a group.
- \indexdummies % Must do this here, since \bf, etc expand at this stage
- \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
- % so it will be output as is; and it will print as backslash.
- %
- % Process the index entry with all font commands turned off, to
- % get the string to sort by.
- {\indexnofonts
- \edef\temp{\the\toks0}% need full expansion
- \xdef\indexsorttmp{\temp}%
- }%
- %
- % Set up the complete index entry, with both the sort key and
- % the original text, including any font commands. We write
- % three arguments to \entry to the .?? file (four in the
- % subentry case), texindex reduces to two when writing the .??s
- % sorted result.
- \edef\temp{%
- \write\writeto{%
- \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
- }%
- \temp
-}
-
-% Take care of unwanted page breaks:
-%
-% If a skip is the last thing on the list now, preserve it
-% by backing up by \lastskip, doing the \write, then inserting
-% the skip again. Otherwise, the whatsit generated by the
-% \write will make \lastskip zero. The result is that sequences
-% like this:
-% @end defun
-% @tindex whatever
-% @defun ...
-% will have extra space inserted, because the \medbreak in the
-% start of the @defun won't see the skip inserted by the @end of
-% the previous defun.
-%
-% But don't do any of this if we're not in vertical mode. We
-% don't want to do a \vskip and prematurely end a paragraph.
-%
-% Avoid page breaks due to these extra skips, too.
-%
-% But wait, there is a catch there:
-% We'll have to check whether \lastskip is zero skip. \ifdim is not
-% sufficient for this purpose, as it ignores stretch and shrink parts
-% of the skip. The only way seems to be to check the textual
-% representation of the skip.
-%
-% The following is almost like \def\zeroskipmacro{0.0pt} except that
-% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
-%
-\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
-%
-% ..., ready, GO:
-%
-\def\dosubindsanitize{%
- % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
- \skip0 = \lastskip
- \edef\lastskipmacro{\the\lastskip}%
- \count255 = \lastpenalty
- %
- % If \lastskip is nonzero, that means the last item was a
- % skip. And since a skip is discardable, that means this
- % -\skip0 glue we're inserting is preceded by a
- % non-discardable item, therefore it is not a potential
- % breakpoint, therefore no \nobreak needed.
- \ifx\lastskipmacro\zeroskipmacro
- \else
- \vskip-\skip0
- \fi
- %
- \dosubindwrite
- %
- \ifx\lastskipmacro\zeroskipmacro
- % If \lastskip was zero, perhaps the last item was a penalty, and
- % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
- % to re-insert the same penalty (values >10000 are used for various
- % signals); since we just inserted a non-discardable item, any
- % following glue (such as a \parskip) would be a breakpoint. For example:
- %
- % @deffn deffn-whatever
- % @vindex index-whatever
- % Description.
- % would allow a break between the index-whatever whatsit
- % and the "Description." paragraph.
- \ifnum\count255>9999 \penalty\count255 \fi
- \else
- % On the other hand, if we had a nonzero \lastskip,
- % this make-up glue would be preceded by a non-discardable item
- % (the whatsit from the \write), so we must insert a \nobreak.
- \nobreak\vskip\skip0
- \fi
-}
-
-% The index entry written in the file actually looks like
-% \entry {sortstring}{page}{topic}
-% or
-% \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-% \initial {c}
-% before the first topic whose initial is c
-% \entry {topic}{pagelist}
-% for a topic that is used without subtopics
-% \primary {topic}
-% for the beginning of a topic that is used with subtopics
-% \secondary {subtopic}{pagelist}
-% for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\parseargdef\printindex{\begingroup
- \dobreak \chapheadingskip{10000}%
- %
- \smallfonts \rm
- \tolerance = 9500
- \everypar = {}% don't want the \kern\-parindent from indentation suppression.
- %
- % See if the index file exists and is nonempty.
- % Change catcode of @ here so that if the index file contains
- % \initial {@}
- % as its first line, TeX doesn't complain about mismatched braces
- % (because it thinks @} is a control sequence).
- \catcode`\@ = 11
- \openin 1 \jobname.#1s
- \ifeof 1
- % \enddoublecolumns gets confused if there is no text in the index,
- % and it loses the chapter title and the aux file entries for the
- % index. The easiest way to prevent this problem is to make sure
- % there is some text.
- \putwordIndexNonexistent
- \else
- %
- % If the index file exists but is empty, then \openin leaves \ifeof
- % false. We have to make TeX try to read something from the file, so
- % it can discover if there is anything in it.
- \read 1 to \temp
- \ifeof 1
- \putwordIndexIsEmpty
- \else
- % Index files are almost Texinfo source, but we use \ as the escape
- % character. It would be better to use @, but that's too big a change
- % to make right now.
- \def\indexbackslash{\backslashcurfont}%
- \catcode`\\ = 0
- \escapechar = `\\
- \begindoublecolumns
- \input \jobname.#1s
- \enddoublecolumns
- \fi
- \fi
- \closein 1
-\endgroup}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-\def\initial#1{{%
- % Some minor font changes for the special characters.
- \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
- %
- % Remove any glue we may have, we'll be inserting our own.
- \removelastskip
- %
- % We like breaks before the index initials, so insert a bonus.
- \nobreak
- \vskip 0pt plus 3\baselineskip
- \penalty 0
- \vskip 0pt plus -3\baselineskip
- %
- % Typeset the initial. Making this add up to a whole number of
- % baselineskips increases the chance of the dots lining up from column
- % to column. It still won't often be perfect, because of the stretch
- % we need before each entry, but it's better.
- %
- % No shrink because it confuses \balancecolumns.
- \vskip 1.67\baselineskip plus .5\baselineskip
- \leftline{\secbf #1}%
- % Do our best not to break after the initial.
- \nobreak
- \vskip .33\baselineskip plus .1\baselineskip
-}}
-
-% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
-% then page number (#2) flushed to the right margin. It is used for index
-% and table of contents entries. The paragraph is indented by \leftskip.
-%
-% A straightforward implementation would start like this:
-% \def\entry#1#2{...
-% But this frozes the catcodes in the argument, and can cause problems to
-% @code, which sets - active. This problem was fixed by a kludge---
-% ``-'' was active throughout whole index, but this isn't really right.
-%
-% The right solution is to prevent \entry from swallowing the whole text.
-% --kasal, 21nov03
-\def\entry{%
- \begingroup
- %
- % Start a new paragraph if necessary, so our assignments below can't
- % affect previous text.
- \par
- %
- % Do not fill out the last line with white space.
- \parfillskip = 0in
- %
- % No extra space above this paragraph.
- \parskip = 0in
- %
- % Do not prefer a separate line ending with a hyphen to fewer lines.
- \finalhyphendemerits = 0
- %
- % \hangindent is only relevant when the entry text and page number
- % don't both fit on one line. In that case, bob suggests starting the
- % dots pretty far over on the line. Unfortunately, a large
- % indentation looks wrong when the entry text itself is broken across
- % lines. So we use a small indentation and put up with long leaders.
- %
- % \hangafter is reset to 1 (which is the value we want) at the start
- % of each paragraph, so we need not do anything with that.
- \hangindent = 2em
- %
- % When the entry text needs to be broken, just fill out the first line
- % with blank space.
- \rightskip = 0pt plus1fil
- %
- % A bit of stretch before each entry for the benefit of balancing
- % columns.
- \vskip 0pt plus1pt
- %
- % Swallow the left brace of the text (first parameter):
- \afterassignment\doentry
- \let\temp =
-}
-\def\doentry{%
- \bgroup % Instead of the swallowed brace.
- \noindent
- \aftergroup\finishentry
- % And now comes the text of the entry.
-}
-\def\finishentry#1{%
- % #1 is the page number.
- %
- % The following is kludged to not output a line of dots in the index if
- % there are no page numbers. The next person who breaks this will be
- % cursed by a Unix daemon.
- \def\tempa{{\rm }}%
- \def\tempb{#1}%
- \edef\tempc{\tempa}%
- \edef\tempd{\tempb}%
- \ifx\tempc\tempd
- \ %
- \else
- %
- % If we must, put the page number on a line of its own, and fill out
- % this line with blank space. (The \hfil is overwhelmed with the
- % fill leaders glue in \indexdotfill if the page number does fit.)
- \hfil\penalty50
- \null\nobreak\indexdotfill % Have leaders before the page number.
- %
- % The `\ ' here is removed by the implicit \unskip that TeX does as
- % part of (the primitive) \par. Without it, a spurious underfull
- % \hbox ensues.
- \ifpdf
- \pdfgettoks#1.%
- \ \the\toksA
- \else
- \ #1%
- \fi
- \fi
- \par
- \endgroup
-}
-
-% Like plain.tex's \dotfill, except uses up at least 1 em.
-\def\indexdotfill{\cleaders
- \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-\def\secondary#1#2{{%
- \parfillskip=0in
- \parskip=0in
- \hangindent=1in
- \hangafter=1
- \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
- \ifpdf
- \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
- \else
- #2
- \fi
- \par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
- % Grab any single-column material above us.
- \output = {%
- %
- % Here is a possibility not foreseen in manmac: if we accumulate a
- % whole lot of material, we might end up calling this \output
- % routine twice in a row (see the doublecol-lose test, which is
- % essentially a couple of indexes with @setchapternewpage off). In
- % that case we just ship out what is in \partialpage with the normal
- % output routine. Generally, \partialpage will be empty when this
- % runs and this will be a no-op. See the indexspread.tex test case.
- \ifvoid\partialpage \else
- \onepageout{\pagecontents\partialpage}%
- \fi
- %
- \global\setbox\partialpage = \vbox{%
- % Unvbox the main output page.
- \unvbox\PAGE
- \kern-\topskip \kern\baselineskip
- }%
- }%
- \eject % run that output routine to set \partialpage
- %
- % Use the double-column output routine for subsequent pages.
- \output = {\doublecolumnout}%
- %
- % Change the page size parameters. We could do this once outside this
- % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
- % format, but then we repeat the same computation. Repeating a couple
- % of assignments once per index is clearly meaningless for the
- % execution time, so we may as well do it in one place.
- %
- % First we halve the line length, less a little for the gutter between
- % the columns. We compute the gutter based on the line length, so it
- % changes automatically with the paper format. The magic constant
- % below is chosen so that the gutter has the same value (well, +-<1pt)
- % as it did when we hard-coded it.
- %
- % We put the result in a separate register, \doublecolumhsize, so we
- % can restore it in \pagesofar, after \hsize itself has (potentially)
- % been clobbered.
- %
- \doublecolumnhsize = \hsize
- \advance\doublecolumnhsize by -.04154\hsize
- \divide\doublecolumnhsize by 2
- \hsize = \doublecolumnhsize
- %
- % Double the \vsize as well. (We don't need a separate register here,
- % since nobody clobbers \vsize.)
- \vsize = 2\vsize
-}
-
-% The double-column output routine for all double-column pages except
-% the last.
-%
-\def\doublecolumnout{%
- \splittopskip=\topskip \splitmaxdepth=\maxdepth
- % Get the available space for the double columns -- the normal
- % (undoubled) page height minus any material left over from the
- % previous page.
- \dimen@ = \vsize
- \divide\dimen@ by 2
- \advance\dimen@ by -\ht\partialpage
- %
- % box0 will be the left-hand column, box2 the right.
- \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
- \onepageout\pagesofar
- \unvbox255
- \penalty\outputpenalty
-}
-%
-% Re-output the contents of the output page -- any previous material,
-% followed by the two boxes we just split, in box0 and box2.
-\def\pagesofar{%
- \unvbox\partialpage
- %
- \hsize = \doublecolumnhsize
- \wd0=\hsize \wd2=\hsize
- \hbox to\pagewidth{\box0\hfil\box2}%
-}
-%
-% All done with double columns.
-\def\enddoublecolumns{%
- \output = {%
- % Split the last of the double-column material. Leave it on the
- % current page, no automatic page break.
- \balancecolumns
- %
- % If we end up splitting too much material for the current page,
- % though, there will be another page break right after this \output
- % invocation ends. Having called \balancecolumns once, we do not
- % want to call it again. Therefore, reset \output to its normal
- % definition right away. (We hope \balancecolumns will never be
- % called on to balance too much material, but if it is, this makes
- % the output somewhat more palatable.)
- \global\output = {\onepageout{\pagecontents\PAGE}}%
- }%
- \eject
- \endgroup % started in \begindoublecolumns
- %
- % \pagegoal was set to the doubled \vsize above, since we restarted
- % the current page. We're now back to normal single-column
- % typesetting, so reset \pagegoal to the normal \vsize (after the
- % \endgroup where \vsize got restored).
- \pagegoal = \vsize
-}
-%
-% Called at the end of the double column material.
-\def\balancecolumns{%
- \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
- \dimen@ = \ht0
- \advance\dimen@ by \topskip
- \advance\dimen@ by-\baselineskip
- \divide\dimen@ by 2 % target to split to
- %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
- \splittopskip = \topskip
- % Loop until we get a decent breakpoint.
- {%
- \vbadness = 10000
- \loop
- \global\setbox3 = \copy0
- \global\setbox1 = \vsplit3 to \dimen@
- \ifdim\ht3>\dimen@
- \global\advance\dimen@ by 1pt
- \repeat
- }%
- %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
- \setbox0=\vbox to\dimen@{\unvbox1}%
- \setbox2=\vbox to\dimen@{\unvbox3}%
- %
- \pagesofar
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Chapters, sections, etc.
-
-% \unnumberedno is an oxymoron, of course. But we count the unnumbered
-% sections so that we can refer to them unambiguously in the pdf
-% outlines by their "section number". We avoid collisions with chapter
-% numbers by starting them at 10000. (If a document ever has 10000
-% chapters, we're in trouble anyway, I'm sure.)
-\newcount\unnumberedno \unnumberedno = 10000
-\newcount\chapno
-\newcount\secno \secno=0
-\newcount\subsecno \subsecno=0
-\newcount\subsubsecno \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno \appendixno = `\@
-%
-% \def\appendixletter{\char\the\appendixno}
-% We do the following ugly conditional instead of the above simple
-% construct for the sake of pdftex, which needs the actual
-% letter in the expansion, not just typeset.
-%
-\def\appendixletter{%
- \ifnum\appendixno=`A A%
- \else\ifnum\appendixno=`B B%
- \else\ifnum\appendixno=`C C%
- \else\ifnum\appendixno=`D D%
- \else\ifnum\appendixno=`E E%
- \else\ifnum\appendixno=`F F%
- \else\ifnum\appendixno=`G G%
- \else\ifnum\appendixno=`H H%
- \else\ifnum\appendixno=`I I%
- \else\ifnum\appendixno=`J J%
- \else\ifnum\appendixno=`K K%
- \else\ifnum\appendixno=`L L%
- \else\ifnum\appendixno=`M M%
- \else\ifnum\appendixno=`N N%
- \else\ifnum\appendixno=`O O%
- \else\ifnum\appendixno=`P P%
- \else\ifnum\appendixno=`Q Q%
- \else\ifnum\appendixno=`R R%
- \else\ifnum\appendixno=`S S%
- \else\ifnum\appendixno=`T T%
- \else\ifnum\appendixno=`U U%
- \else\ifnum\appendixno=`V V%
- \else\ifnum\appendixno=`W W%
- \else\ifnum\appendixno=`X X%
- \else\ifnum\appendixno=`Y Y%
- \else\ifnum\appendixno=`Z Z%
- % The \the is necessary, despite appearances, because \appendixletter is
- % expanded while writing the .toc file. \char\appendixno is not
- % expandable, thus it is written literally, thus all appendixes come out
- % with the same letter (or @) in the toc without it.
- \else\char\the\appendixno
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% Each @chapter defines this as the name of the chapter.
-% page headings and footings can use it. @section does likewise.
-% However, they are not reliable, because we don't use marks.
-\def\thischapter{}
-\def\thissection{}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% we only have subsub.
-\chardef\maxseclevel = 3
-%
-% A numbered section within an unnumbered changes to unnumbered too.
-% To achive this, remember the "biggest" unnum. sec. we are currently in:
-\chardef\unmlevel = \maxseclevel
-%
-% Trace whether the current chapter is an appendix or not:
-% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
-\def\chapheadtype{N}
-
-% Choose a heading macro
-% #1 is heading type
-% #2 is heading level
-% #3 is text for heading
-\def\genhead#1#2#3{%
- % Compute the abs. sec. level:
- \absseclevel=#2
- \advance\absseclevel by \secbase
- % Make sure \absseclevel doesn't fall outside the range:
- \ifnum \absseclevel < 0
- \absseclevel = 0
- \else
- \ifnum \absseclevel > 3
- \absseclevel = 3
- \fi
- \fi
- % The heading type:
- \def\headtype{#1}%
- \if \headtype U%
- \ifnum \absseclevel < \unmlevel
- \chardef\unmlevel = \absseclevel
- \fi
- \else
- % Check for appendix sections:
- \ifnum \absseclevel = 0
- \edef\chapheadtype{\headtype}%
- \else
- \if \headtype A\if \chapheadtype N%
- \errmessage{@appendix... within a non-appendix chapter}%
- \fi\fi
- \fi
- % Check for numbered within unnumbered:
- \ifnum \absseclevel > \unmlevel
- \def\headtype{U}%
- \else
- \chardef\unmlevel = 3
- \fi
- \fi
- % Now print the heading:
- \if \headtype U%
- \ifcase\absseclevel
- \unnumberedzzz{#3}%
- \or \unnumberedseczzz{#3}%
- \or \unnumberedsubseczzz{#3}%
- \or \unnumberedsubsubseczzz{#3}%
- \fi
- \else
- \if \headtype A%
- \ifcase\absseclevel
- \appendixzzz{#3}%
- \or \appendixsectionzzz{#3}%
- \or \appendixsubseczzz{#3}%
- \or \appendixsubsubseczzz{#3}%
- \fi
- \else
- \ifcase\absseclevel
- \chapterzzz{#3}%
- \or \seczzz{#3}%
- \or \numberedsubseczzz{#3}%
- \or \numberedsubsubseczzz{#3}%
- \fi
- \fi
- \fi
- \suppressfirstparagraphindent
-}
-
-% an interface:
-\def\numhead{\genhead N}
-\def\apphead{\genhead A}
-\def\unnmhead{\genhead U}
-
-% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
-% all lower-level sectioning counters to zero.
-%
-% Also set \chaplevelprefix, which we prepend to @float sequence numbers
-% (e.g., figures), q.v. By default (before any chapter), that is empty.
-\let\chaplevelprefix = \empty
-%
-\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz#1{%
- % section resetting is \global in case the chapter is in a group, such
- % as an @include file.
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\chapno by 1
- %
- % Used for \float.
- \gdef\chaplevelprefix{\the\chapno.}%
- \resetallfloatnos
- %
- \message{\putwordChapter\space \the\chapno}%
- %
- % Write the actual heading.
- \chapmacro{#1}{Ynumbered}{\the\chapno}%
- %
- % So @section and the like are numbered underneath this chapter.
- \global\let\section = \numberedsec
- \global\let\subsection = \numberedsubsec
- \global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz#1{%
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\appendixno by 1
- \gdef\chaplevelprefix{\appendixletter.}%
- \resetallfloatnos
- %
- \def\appendixnum{\putwordAppendix\space \appendixletter}%
- \message{\appendixnum}%
- %
- \chapmacro{#1}{Yappendix}{\appendixletter}%
- %
- \global\let\section = \appendixsec
- \global\let\subsection = \appendixsubsec
- \global\let\subsubsection = \appendixsubsubsec
-}
-
-\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz#1{%
- \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
- \global\advance\unnumberedno by 1
- %
- % Since an unnumbered has no number, no prefix for figures.
- \global\let\chaplevelprefix = \empty
- \resetallfloatnos
- %
- % This used to be simply \message{#1}, but TeX fully expands the
- % argument to \message. Therefore, if #1 contained @-commands, TeX
- % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
- % expanded @cite (which turns out to cause errors because \cite is meant
- % to be executed, not expanded).
- %
- % Anyway, we don't want the fully-expanded definition of @cite to appear
- % as a result of the \message, we just want `@cite' itself. We use
- % \the<toks register> to achieve this: TeX expands \the<toks> only once,
- % simply yielding the contents of <toks register>. (We also do this for
- % the toc entries.)
- \toks0 = {#1}%
- \message{(\the\toks0)}%
- %
- \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
- %
- \global\let\section = \unnumberedsec
- \global\let\subsection = \unnumberedsubsec
- \global\let\subsubsection = \unnumberedsubsubsec
-}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\parseargdef\centerchap{%
- % Well, we could do the following in a group, but that would break
- % an assumption that \chapmacro is called at the outermost level.
- % Thus we are safer this way: --kasal, 24feb04
- \let\centerparametersmaybe = \centerparameters
- \unnmhead0{#1}%
- \let\centerparametersmaybe = \relax
-}
-
-% @top is like @unnumbered.
-\let\top\unnumbered
-
-% Sections.
-\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
-\def\seczzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
-}
-
-\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
-}
-\let\appendixsec\appendixsection
-
-\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz#1{%
- \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
- \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
-}
-
-% Subsections.
-\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Yappendix}%
- {\appendixletter.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz#1{%
- \global\subsubsecno=0 \global\advance\subsecno by 1
- \sectionheading{#1}{subsec}{Ynothing}%
- {\the\unnumberedno.\the\secno.\the\subsecno}%
-}
-
-% Subsubsections.
-\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Ynumbered}%
- {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Yappendix}%
- {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz#1{%
- \global\advance\subsubsecno by 1
- \sectionheading{#1}{subsubsec}{Ynothing}%
- {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\let\section = \numberedsec
-\let\subsection = \numberedsubsec
-\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and such:
-% 1) We use \vbox rather than the earlier \line to permit
-% overlong headings to fold.
-% 2) \hyphenpenalty is set to 10000 because hyphenation in a
-% heading is obnoxious; this forbids it.
-% 3) Likewise, headings look best if no \parindent is used, and
-% if justification is not attempted. Hence \raggedright.
-
-
-\def\majorheading{%
- {\advance\chapheadingskip by 10pt \chapbreak }%
- \parsearg\chapheadingzzz
-}
-
-\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
-\def\chapheadingzzz#1{%
- {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}%
- \bigskip \par\penalty 200\relax
- \suppressfirstparagraphindent
-}
-
-% @heading, @subheading, @subsubheading.
-\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
- \suppressfirstparagraphindent}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip\chapheadingskip
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{%
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-% Chapter opening.
-%
-% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
-% Yappendix, Yomitfromtoc), #3 the chapter number.
-%
-% To test against our argument.
-\def\Ynothingkeyword{Ynothing}
-\def\Yomitfromtockeyword{Yomitfromtoc}
-\def\Yappendixkeyword{Yappendix}
-%
-\def\chapmacro#1#2#3{%
- \pchapsepmacro
- {%
- \chapfonts \rm
- %
- % Have to define \thissection before calling \donoderef, because the
- % xref code eventually uses it. On the other hand, it has to be called
- % after \pchapsepmacro, or the headline will change too soon.
- \gdef\thissection{#1}%
- \gdef\thischaptername{#1}%
- %
- % Only insert the separating space if we have a chapter/appendix
- % number, and don't print the unnumbered ``number''.
- \def\temptype{#2}%
- \ifx\temptype\Ynothingkeyword
- \setbox0 = \hbox{}%
- \def\toctype{unnchap}%
- \gdef\thischapternum{}%
- \gdef\thischapter{#1}%
- \else\ifx\temptype\Yomitfromtockeyword
- \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
- \def\toctype{omit}%
- \gdef\thischapternum{}%
- \gdef\thischapter{}%
- \else\ifx\temptype\Yappendixkeyword
- \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
- \def\toctype{app}%
- \xdef\thischapternum{\appendixletter}%
- % We don't substitute the actual chapter name into \thischapter
- % because we don't want its macros evaluated now. And we don't
- % use \thissection because that changes with each section.
- %
- \xdef\thischapter{\putwordAppendix{} \appendixletter:
- \noexpand\thischaptername}%
- \else
- \setbox0 = \hbox{#3\enspace}%
- \def\toctype{numchap}%
- \xdef\thischapternum{\the\chapno}%
- \xdef\thischapter{\putwordChapter{} \the\chapno:
- \noexpand\thischaptername}%
- \fi\fi\fi
- %
- % Write the toc entry for this chapter. Must come before the
- % \donoderef, because we include the current node name in the toc
- % entry, and \donoderef resets it to empty.
- \writetocentry{\toctype}{#1}{#3}%
- %
- % For pdftex, we have to write out the node definition (aka, make
- % the pdfdest) after any page break, but before the actual text has
- % been typeset. If the destination for the pdf outline is after the
- % text, then jumping from the outline may wind up with the text not
- % being visible, for instance under high magnification.
- \donoderef{#2}%
- %
- % Typeset the actual heading.
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent=\wd0 \centerparametersmaybe
- \unhbox0 #1\par}%
- }%
- \nobreak\bigskip % no page break after a chapter title
- \nobreak
-}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerparameters{%
- \advance\rightskip by 3\rightskip
- \leftskip = \rightskip
- \parfillskip = 0pt
-}
-
-
-% I don't think this chapter style is supported any more, so I'm not
-% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
-%
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-%
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\nobreak
-}
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-\def\centerchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt
- \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
-}
-\def\CHAPFopen{%
- \global\let\chapmacro=\chfopen
- \global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles. These macros combine the section number parts and
-% call the generic \sectionheading to do the printing.
-%
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
-
-% Subsection titles.
-\newskip\subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
-
-% Subsubsection titles.
-\def\subsubsecheadingskip{\subsecheadingskip}
-\def\subsubsecheadingbreak{\subsecheadingbreak}
-
-
-% Print any size, any type, section title.
-%
-% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
-% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
-% section number.
-%
-\def\sectionheading#1#2#3#4{%
- {%
- % Switch to the right set of fonts.
- \csname #2fonts\endcsname \rm
- %
- % Insert space above the heading.
- \csname #2headingbreak\endcsname
- %
- % Only insert the space after the number if we have a section number.
- \def\sectionlevel{#2}%
- \def\temptype{#3}%
- %
- \ifx\temptype\Ynothingkeyword
- \setbox0 = \hbox{}%
- \def\toctype{unn}%
- \gdef\thissection{#1}%
- \else\ifx\temptype\Yomitfromtockeyword
- % for @headings -- no section number, don't include in toc,
- % and don't redefine \thissection.
- \setbox0 = \hbox{}%
- \def\toctype{omit}%
- \let\sectionlevel=\empty
- \else\ifx\temptype\Yappendixkeyword
- \setbox0 = \hbox{#4\enspace}%
- \def\toctype{app}%
- \gdef\thissection{#1}%
- \else
- \setbox0 = \hbox{#4\enspace}%
- \def\toctype{num}%
- \gdef\thissection{#1}%
- \fi\fi\fi
- %
- % Write the toc entry (before \donoderef). See comments in \chapmacro.
- \writetocentry{\toctype\sectionlevel}{#1}{#4}%
- %
- % Write the node reference (= pdf destination for pdftex).
- % Again, see comments in \chapmacro.
- \donoderef{#3}%
- %
- % Interline glue will be inserted when the vbox is completed.
- % That glue will be a valid breakpoint for the page, since it'll be
- % preceded by a whatsit (usually from the \donoderef, or from the
- % \writetocentry if there was no node). We don't want to allow that
- % break, since then the whatsits could end up on page n while the
- % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
- \nobreak
- %
- % Output the actual section heading.
- \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
- \hangindent=\wd0 % zero if no section number
- \unhbox0 #1}%
- }%
- % Add extra space after the heading -- half of whatever came above it.
- % Don't allow stretch, though.
- \kern .5 \csname #2headingskip\endcsname
- %
- % Do not let the kern be a potential breakpoint, as it would be if it
- % was followed by glue.
- \nobreak
- %
- % We'll almost certainly start a paragraph next, so don't let that
- % glue accumulate. (Not a breakpoint because it's preceded by a
- % discardable item.)
- \vskip-\parskip
- %
- % This is purely so the last item on the list is a known \penalty >
- % 10000. This is so \startdefun can avoid allowing breakpoints after
- % section headings. Otherwise, it would insert a valid breakpoint between:
- %
- % @section sec-whatever
- % @deffn def-whatever
- \penalty 10001
-}
-
-
-\message{toc,}
-% Table of contents.
-\newwrite\tocfile
-
-% Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.
-%
-% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
-% We append the current node name (if any) and page number as additional
-% arguments for the \{chap,sec,...}entry macros which will eventually
-% read this. The node name is used in the pdf outlines as the
-% destination to jump to.
-%
-% We open the .toc file for writing here instead of at @setfilename (or
-% any other fixed time) so that @contents can be anywhere in the document.
-% But if #1 is `omit', then we don't do anything. This is used for the
-% table of contents chapter openings themselves.
-%
-\newif\iftocfileopened
-\def\omitkeyword{omit}%
-%
-\def\writetocentry#1#2#3{%
- \edef\writetoctype{#1}%
- \ifx\writetoctype\omitkeyword \else
- \iftocfileopened\else
- \immediate\openout\tocfile = \jobname.toc
- \global\tocfileopenedtrue
- \fi
- %
- \iflinks
- {\atdummies
- \edef\temp{%
- \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
- \temp
- }%
- \fi
- \fi
- %
- % Tell \shipout to create a pdf destination on each page, if we're
- % writing pdf. These are used in the table of contents. We can't
- % just write one on every page because the title pages are numbered
- % 1 and 2 (the page numbers aren't printed), and so are the first
- % two pages of the document. Thus, we'd have two destinations named
- % `1', and two named `2'.
- \ifpdf \global\pdfmakepagedesttrue \fi
-}
-
-
-% These characters do not print properly in the Computer Modern roman
-% fonts, so we must take special care. This is more or less redundant
-% with the Texinfo input format setup at the end of this file.
-%
-\def\activecatcodes{%
- \catcode`\"=\active
- \catcode`\$=\active
- \catcode`\<=\active
- \catcode`\>=\active
- \catcode`\\=\active
- \catcode`\^=\active
- \catcode`\_=\active
- \catcode`\|=\active
- \catcode`\~=\active
-}
-
-
-% Read the toc file, which is essentially Texinfo input.
-\def\readtocfile{%
- \setupdatafile
- \activecatcodes
- \input \jobname.toc
-}
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\newcount\savepageno
-\newcount\lastnegativepageno \lastnegativepageno = -1
-
-% Prepare to read what we've written to \tocfile.
-%
-\def\startcontents#1{%
- % If @setchapternewpage on, and @headings double, the contents should
- % start on an odd page, unlike chapters. Thus, we maintain
- % \contentsalignmacro in parallel with \pagealignmacro.
- % From: Torbjorn Granlund <tege@matematik.su.se>
- \contentsalignmacro
- \immediate\closeout\tocfile
- %
- % Don't need to put `Contents' or `Short Contents' in the headline.
- % It is abundantly clear what they are.
- \def\thischapter{}%
- \chapmacro{#1}{Yomitfromtoc}{}%
- %
- \savepageno = \pageno
- \begingroup % Set up to handle contents files properly.
- \raggedbottom % Worry more about breakpoints than the bottom.
- \advance\hsize by -\contentsrightmargin % Don't use the full line length.
- %
- % Roman numerals for page numbers.
- \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
-}
-
-
-% Normal (long) toc.
-\def\contents{%
- \startcontents{\putwordTOC}%
- \openin 1 \jobname.toc
- \ifeof 1 \else
- \readtocfile
- \fi
- \vfill \eject
- \contentsalignmacro % in case @setchapternewpage odd is in effect
- \ifeof 1 \else
- \pdfmakeoutlines
- \fi
- \closein 1
- \endgroup
- \lastnegativepageno = \pageno
- \global\pageno = \savepageno
-}
-
-% And just the chapters.
-\def\summarycontents{%
- \startcontents{\putwordShortTOC}%
- %
- \let\numchapentry = \shortchapentry
- \let\appentry = \shortchapentry
- \let\unnchapentry = \shortunnchapentry
- % We want a true roman here for the page numbers.
- \secfonts
- \let\rm=\shortcontrm \let\bf=\shortcontbf
- \let\sl=\shortcontsl \let\tt=\shortconttt
- \rm
- \hyphenpenalty = 10000
- \advance\baselineskip by 1pt % Open it up a little.
- \def\numsecentry##1##2##3##4{}
- \let\appsecentry = \numsecentry
- \let\unnsecentry = \numsecentry
- \let\numsubsecentry = \numsecentry
- \let\appsubsecentry = \numsecentry
- \let\unnsubsecentry = \numsecentry
- \let\numsubsubsecentry = \numsecentry
- \let\appsubsubsecentry = \numsecentry
- \let\unnsubsubsecentry = \numsecentry
- \openin 1 \jobname.toc
- \ifeof 1 \else
- \readtocfile
- \fi
- \closein 1
- \vfill \eject
- \contentsalignmacro % in case @setchapternewpage odd is in effect
- \endgroup
- \lastnegativepageno = \pageno
- \global\pageno = \savepageno
-}
-\let\shortcontents = \summarycontents
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
-%
-\def\shortchaplabel#1{%
- % This space should be enough, since a single number is .5em, and the
- % widest letter (M) is 1em, at least in the Computer Modern fonts.
- % But use \hss just in case.
- % (This space doesn't include the extra space that gets added after
- % the label; that gets put in by \shortchapentry above.)
- %
- % We'd like to right-justify chapter numbers, but that looks strange
- % with appendix letters. And right-justifying numbers and
- % left-justifying letters looks strange when there is less than 10
- % chapters. Have to read the whole toc once to know how many chapters
- % there are before deciding ...
- \hbox to 1em{#1\hss}%
-}
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapters, in the main contents.
-\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
-%
-% Chapters, in the short toc.
-% See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3#4{%
- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
-}
-
-% Appendices, in the main contents.
-% Need the word Appendix, and a fixed-size box.
-%
-\def\appendixbox#1{%
- % We use M since it's probably the widest letter.
- \setbox0 = \hbox{\putwordAppendix{} M}%
- \hbox to \wd0{\putwordAppendix{} #1\hss}}
-%
-\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
-
-% Unnumbered chapters.
-\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
-\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
-
-% Sections.
-\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
-\let\appsecentry=\numsecentry
-\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
-
-% Subsections.
-\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsecentry=\numsubsecentry
-\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
-
-% And subsubsections.
-\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsubsecentry=\numsubsubsecentry
-\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
-
-% This parameter controls the indentation of the various levels.
-% Same as \defaultparindent.
-\newdimen\tocindent \tocindent = 15pt
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
- \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
- \begingroup
- \chapentryfonts
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
- \endgroup
- \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
- \secentryfonts \leftskip=\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
- \subsecentryfonts \leftskip=2\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
- \subsubsecentryfonts \leftskip=3\tocindent
- \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-% We use the same \entry macro as for the index entries.
-\let\tocentry = \entry
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\def\subsecentryfonts{\textfonts}
-\def\subsubsecentryfonts{\textfonts}
-
-
-\message{environments,}
-% @foo ... @end foo.
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-%
-% Since these characters are used in examples, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% The @error{} command.
-% Adapted from the TeXbook's \boxit.
-%
-\newbox\errorbox
-%
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
-%
-\setbox\errorbox=\hbox to \dimen0{\hfil
- \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
- \advance\hsize by -2\dimen2 % Rules.
- \vbox{%
- \hrule height\dimen2
- \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
- \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
- \kern3pt\vrule width\dimen2}% Space to right.
- \hrule height\dimen2}
- \hfil}
-%
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @tex ... @end tex escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\envdef\tex{%
- \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
- \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
- \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
- \catcode `\%=14
- \catcode `\+=\other
- \catcode `\"=\other
- \catcode `\|=\other
- \catcode `\<=\other
- \catcode `\>=\other
- \escapechar=`\\
- %
- \let\b=\ptexb
- \let\bullet=\ptexbullet
- \let\c=\ptexc
- \let\,=\ptexcomma
- \let\.=\ptexdot
- \let\dots=\ptexdots
- \let\equiv=\ptexequiv
- \let\!=\ptexexclam
- \let\i=\ptexi
- \let\indent=\ptexindent
- \let\noindent=\ptexnoindent
- \let\{=\ptexlbrace
- \let\+=\tabalign
- \let\}=\ptexrbrace
- \let\/=\ptexslash
- \let\*=\ptexstar
- \let\t=\ptext
- \let\frenchspacing=\plainfrenchspacing
- %
- \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
- \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
- \def\@{@}%
-}
-% There is no need to define \Etex.
-
-% Define @lisp ... @end lisp.
-% @lisp environment forms a group so it can rebind things,
-% including the definition of @end lisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments. \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical. We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip.
-%
-\def\aboveenvbreak{{%
- % =10000 instead of <10000 because of a special case in \itemzzz and
- % \sectionheading, q.v.
- \ifnum \lastpenalty=10000 \else
- \advance\envskipamount by \parskip
- \endgraf
- \ifdim\lastskip<\envskipamount
- \removelastskip
- % it's not a good place to break if the last penalty was \nobreak
- % or better ...
- \ifnum\lastpenalty<10000 \penalty-50 \fi
- \vskip\envskipamount
- \fi
- \fi
-}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
-% also clear it, so that its embedded environments do the narrowing again.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
- \ctl\leaders\hrule height\circthick\hfil\ctr
- \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
- \cbl\leaders\hrule height\circthick\hfil\cbr
- \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\envdef\cartouche{%
- \ifhmode\par\fi % can't be in the midst of a paragraph.
- \startsavinginserts
- \lskip=\leftskip \rskip=\rightskip
- \leftskip=0pt\rightskip=0pt % we want these *outside*.
- \cartinner=\hsize \advance\cartinner by-\lskip
- \advance\cartinner by-\rskip
- \cartouter=\hsize
- \advance\cartouter by 18.4pt % allow for 3pt kerns on either
- % side, and for 6pt waste from
- % each corner char, and rule thickness
- \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
- % Flag to tell @lisp, etc., not to narrow margin.
- \let\nonarrowing = t%
- \vbox\bgroup
- \baselineskip=0pt\parskip=0pt\lineskip=0pt
- \carttop
- \hbox\bgroup
- \hskip\lskip
- \vrule\kern3pt
- \vbox\bgroup
- \kern3pt
- \hsize=\cartinner
- \baselineskip=\normbskip
- \lineskip=\normlskip
- \parskip=\normpskip
- \vskip -\parskip
- \comment % For explanation, see the end of \def\group.
-}
-\def\Ecartouche{%
- \ifhmode\par\fi
- \kern3pt
- \egroup
- \kern3pt\vrule
- \hskip\rskip
- \egroup
- \cartbot
- \egroup
- \checkinserts
-}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\def\nonfillstart{%
- \aboveenvbreak
- \hfuzz = 12pt % Don't be fussy
- \sepspaces % Make spaces be word-separators rather than space tokens.
- \let\par = \lisppar % don't ignore blank lines
- \obeylines % each line of input is a line of output
- \parskip = 0pt
- \parindent = 0pt
- \emergencystretch = 0pt % don't try to avoid overfull boxes
- \ifx\nonarrowing\relax
- \advance \leftskip by \lispnarrowing
- \exdentamount=\lispnarrowing
- \else
- \let\nonarrowing = \relax
- \fi
- \let\exdent=\nofillexdent
-}
-
-% If you want all examples etc. small: @set dispenvsize small.
-% If you want even small examples the full size: @set dispenvsize nosmall.
-% This affects the following displayed environments:
-% @example, @display, @format, @lisp
-%
-\def\smallword{small}
-\def\nosmallword{nosmall}
-\let\SETdispenvsize\relax
-\def\setnormaldispenv{%
- \ifx\SETdispenvsize\smallword
- \smallexamplefonts \rm
- \fi
-}
-\def\setsmalldispenv{%
- \ifx\SETdispenvsize\nosmallword
- \else
- \smallexamplefonts \rm
- \fi
-}
-
-% We often define two environments, @foo and @smallfoo.
-% Let's do it by one command:
-\def\makedispenv #1#2{
- \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
- \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
- \expandafter\let\csname E#1\endcsname \afterenvbreak
- \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
-}
-
-% Define two synonyms:
-\def\maketwodispenvs #1#2#3{
- \makedispenv{#1}{#3}
- \makedispenv{#2}{#3}
-}
-
-% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
-%
-% @smallexample and @smalllisp: use smaller fonts.
-% Originally contributed by Pavel@xerox.
-%
-\maketwodispenvs {lisp}{example}{%
- \nonfillstart
- \tt\quoteexpand
- \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
- \gobble % eat return
-}
-% @display/@smalldisplay: same as @lisp except keep current font.
-%
-\makedispenv {display}{%
- \nonfillstart
- \gobble
-}
-
-% @format/@smallformat: same as @display except don't narrow margins.
-%
-\makedispenv{format}{%
- \let\nonarrowing = t%
- \nonfillstart
- \gobble
-}
-
-% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
-\envdef\flushleft{%
- \let\nonarrowing = t%
- \nonfillstart
- \gobble
-}
-\let\Eflushleft = \afterenvbreak
-
-% @flushright.
-%
-\envdef\flushright{%
- \let\nonarrowing = t%
- \nonfillstart
- \advance\leftskip by 0pt plus 1fill
- \gobble
-}
-\let\Eflushright = \afterenvbreak
-
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins. We keep \parskip nonzero in general, since
-% we're doing normal filling. So, when using \aboveenvbreak and
-% \afterenvbreak, temporarily make \parskip 0.
-%
-\envdef\quotation{%
- {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
- \parindent=0pt
- %
- % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
- \ifx\nonarrowing\relax
- \advance\leftskip by \lispnarrowing
- \advance\rightskip by \lispnarrowing
- \exdentamount = \lispnarrowing
- \else
- \let\nonarrowing = \relax
- \fi
- \parsearg\quotationlabel
-}
-
-% We have retained a nonzero parskip for the environment, since we're
-% doing normal filling.
-%
-\def\Equotation{%
- \par
- \ifx\quotationauthor\undefined\else
- % indent a bit.
- \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
- \fi
- {\parskip=0pt \afterenvbreak}%
-}
-
-% If we're given an argument, typeset it in bold with a colon after.
-\def\quotationlabel#1{%
- \def\temp{#1}%
- \ifx\temp\empty \else
- {\bf #1: }%
- \fi
-}
-
-
-% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
-% If we want to allow any <char> as delimiter,
-% we need the curly braces so that makeinfo sees the @verb command, eg:
-% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
-%
-% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
-%
-% [Knuth] p.344; only we need to do the other characters Texinfo sets
-% active too. Otherwise, they get lost as the first character on a
-% verbatim line.
-\def\dospecials{%
- \do\ \do\\\do\{\do\}\do\$\do\&%
- \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
- \do\<\do\>\do\|\do\@\do+\do\"%
-}
-%
-% [Knuth] p. 380
-\def\uncatcodespecials{%
- \def\do##1{\catcode`##1=\other}\dospecials}
-%
-% [Knuth] pp. 380,381,391
-% Disable Spanish ligatures ?` and !` of \tt font
-\begingroup
- \catcode`\`=\active\gdef`{\relax\lq}
-\endgroup
-%
-% Setup for the @verb command.
-%
-% Eight spaces for a tab
-\begingroup
- \catcode`\^^I=\active
- \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
-\endgroup
-%
-\def\setupverb{%
- \tt % easiest (and conventionally used) font for verbatim
- \def\par{\leavevmode\endgraf}%
- \catcode`\`=\active
- \tabeightspaces
- % Respect line breaks,
- % print special symbols as themselves, and
- % make each space count
- % must do in this order:
- \obeylines \uncatcodespecials \sepspaces
-}
-
-% Setup for the @verbatim environment
-%
-% Real tab expansion
-\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
-%
-\def\starttabbox{\setbox0=\hbox\bgroup}
-
-% Allow an option to not replace quotes with a regular directed right
-% quote/apostrophe (char 0x27), but instead use the undirected quote
-% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it
-% the default, but it works for pasting with more pdf viewers (at least
-% evince), the lilypond developers report. xpdf does work with the
-% regular 0x27.
-%
-\def\codequoteright{%
- \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
- '%
- \else
- \char'15
- \fi
-}
-%
-% and a similar option for the left quote char vs. a grave accent.
-% Modern fonts display ASCII 0x60 as a grave accent, so some people like
-% the code environments to do likewise.
-%
-\def\codequoteleft{%
- \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
- `%
- \else
- \char'22
- \fi
-}
-%
-\begingroup
- \catcode`\^^I=\active
- \gdef\tabexpand{%
- \catcode`\^^I=\active
- \def^^I{\leavevmode\egroup
- \dimen0=\wd0 % the width so far, or since the previous tab
- \divide\dimen0 by\tabw
- \multiply\dimen0 by\tabw % compute previous multiple of \tabw
- \advance\dimen0 by\tabw % advance to next multiple of \tabw
- \wd0=\dimen0 \box0 \starttabbox
- }%
- }
- \catcode`\'=\active
- \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
- %
- \catcode`\`=\active
- \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
- %
- \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
-\endgroup
-
-% start the verbatim environment.
-\def\setupverbatim{%
- \let\nonarrowing = t%
- \nonfillstart
- % Easiest (and conventionally used) font for verbatim
- \tt
- \def\par{\leavevmode\egroup\box0\endgraf}%
- \catcode`\`=\active
- \tabexpand
- \quoteexpand
- % Respect line breaks,
- % print special symbols as themselves, and
- % make each space count
- % must do in this order:
- \obeylines \uncatcodespecials \sepspaces
- \everypar{\starttabbox}%
-}
-
-% Do the @verb magic: verbatim text is quoted by unique
-% delimiter characters. Before first delimiter expect a
-% right brace, after last delimiter expect closing brace:
-%
-% \def\doverb'{'<char>#1<char>'}'{#1}
-%
-% [Knuth] p. 382; only eat outer {}
-\begingroup
- \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
- \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
-\endgroup
-%
-\def\verb{\begingroup\setupverb\doverb}
-%
-%
-% Do the @verbatim magic: define the macro \doverbatim so that
-% the (first) argument ends when '@end verbatim' is reached, ie:
-%
-% \def\doverbatim#1@end verbatim{#1}
-%
-% For Texinfo it's a lot easier than for LaTeX,
-% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'.
-%
-% Inspired by LaTeX's verbatim command set [latex.ltx]
-%
-\begingroup
- \catcode`\ =\active
- \obeylines %
- % ignore everything up to the first ^^M, that's the newline at the end
- % of the @verbatim input line itself. Otherwise we get an extra blank
- % line in the output.
- \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
- % We really want {...\end verbatim} in the body of the macro, but
- % without the active space; thus we have to use \xdef and \gobble.
-\endgroup
-%
-\envdef\verbatim{%
- \setupverbatim\doverbatim
-}
-\let\Everbatim = \afterenvbreak
-
-
-% @verbatiminclude FILE - insert text of file in verbatim environment.
-%
-\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
-%
-\def\doverbatiminclude#1{%
- {%
- \makevalueexpandable
- \setupverbatim
- \input #1
- \afterenvbreak
- }%
-}
-
-% @copying ... @end copying.
-% Save the text away for @insertcopying later.
-%
-% We save the uninterpreted tokens, rather than creating a box.
-% Saving the text in a box would be much easier, but then all the
-% typesetting commands (@smallbook, font changes, etc.) have to be done
-% beforehand -- and a) we want @copying to be done first in the source
-% file; b) letting users define the frontmatter in as flexible order as
-% possible is very desirable.
-%
-\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
-\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
-%
-\def\insertcopying{%
- \begingroup
- \parindent = 0pt % paragraph indentation looks wrong on title page
- \scanexp\copyingtext
- \endgroup
-}
-
-\message{defuns,}
-% @defun etc.
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-
-% Start the processing of @deffn:
-\def\startdefun{%
- \ifnum\lastpenalty<10000
- \medbreak
- \else
- % If there are two @def commands in a row, we'll have a \nobreak,
- % which is there to keep the function description together with its
- % header. But if there's nothing but headers, we need to allow a
- % break somewhere. Check specifically for penalty 10002, inserted
- % by \defargscommonending, instead of 10000, since the sectioning
- % commands also insert a nobreak penalty, and we don't want to allow
- % a break between a section heading and a defun.
- %
- \ifnum\lastpenalty=10002 \penalty2000 \fi
- %
- % Similarly, after a section heading, do not allow a break.
- % But do insert the glue.
- \medskip % preceded by discardable penalty, so not a breakpoint
- \fi
- %
- \parindent=0in
- \advance\leftskip by \defbodyindent
- \exdentamount=\defbodyindent
-}
-
-\def\dodefunx#1{%
- % First, check whether we are in the right environment:
- \checkenv#1%
- %
- % As above, allow line break if we have multiple x headers in a row.
- % It's not a great place, though.
- \ifnum\lastpenalty=10002 \penalty3000 \fi
- %
- % And now, it's time to reuse the body of the original defun:
- \expandafter\gobbledefun#1%
-}
-\def\gobbledefun#1\startdefun{}
-
-% \printdefunline \deffnheader{text}
-%
-\def\printdefunline#1#2{%
- \begingroup
- % call \deffnheader:
- #1#2 \endheader
- % common ending:
- \interlinepenalty = 10000
- \advance\rightskip by 0pt plus 1fil
- \endgraf
- \nobreak\vskip -\parskip
- \penalty 10002 % signal to \startdefun and \dodefunx
- % Some of the @defun-type tags do not enable magic parentheses,
- % rendering the following check redundant. But we don't optimize.
- \checkparencounts
- \endgroup
-}
-
-\def\Edefun{\endgraf\medbreak}
-
-% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
-% the only thing remainnig is to define \deffnheader.
-%
-\def\makedefun#1{%
- \expandafter\let\csname E#1\endcsname = \Edefun
- \edef\temp{\noexpand\domakedefun
- \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
- \temp
-}
-
-% \domakedefun \deffn \deffnx \deffnheader
-%
-% Define \deffn and \deffnx, without parameters.
-% \deffnheader has to be defined explicitly.
-%
-\def\domakedefun#1#2#3{%
- \envdef#1{%
- \startdefun
- \parseargusing\activeparens{\printdefunline#3}%
- }%
- \def#2{\dodefunx#1}%
- \def#3%
-}
-
-%%% Untyped functions:
-
-% @deffn category name args
-\makedefun{deffn}{\deffngeneral{}}
-
-% @deffn category class name args
-\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
-
-% \defopon {category on}class name args
-\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deffngeneral {subind}category name args
-%
-\def\deffngeneral#1#2 #3 #4\endheader{%
- % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
- \dosubind{fn}{\code{#3}}{#1}%
- \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
-}
-
-%%% Typed functions:
-
-% @deftypefn category type name args
-\makedefun{deftypefn}{\deftypefngeneral{}}
-
-% @deftypeop category class type name args
-\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
-
-% \deftypeopon {category on}class type name args
-\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypefngeneral {subind}category type name args
-%
-\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
- \dosubind{fn}{\code{#4}}{#1}%
- \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Typed variables:
-
-% @deftypevr category type var args
-\makedefun{deftypevr}{\deftypecvgeneral{}}
-
-% @deftypecv category class type var args
-\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
-
-% \deftypecvof {category of}class type var args
-\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypecvgeneral {subind}category type var args
-%
-\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
- \dosubind{vr}{\code{#4}}{#1}%
- \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Untyped variables:
-
-% @defvr category var args
-\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
-
-% @defcv category class var args
-\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
-
-% \defcvof {category of}class var args
-\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
-
-%%% Type:
-% @deftp category name args
-\makedefun{deftp}#1 #2 #3\endheader{%
- \doind{tp}{\code{#2}}%
- \defname{#1}{}{#2}\defunargs{#3\unskip}%
-}
-
-% Remaining @defun-like shortcuts:
-\makedefun{defun}{\deffnheader{\putwordDeffunc} }
-\makedefun{defmac}{\deffnheader{\putwordDefmac} }
-\makedefun{defspec}{\deffnheader{\putwordDefspec} }
-\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
-\makedefun{defvar}{\defvrheader{\putwordDefvar} }
-\makedefun{defopt}{\defvrheader{\putwordDefopt} }
-\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
-\makedefun{defmethod}{\defopon\putwordMethodon}
-\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
-\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
-\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
-
-% \defname, which formats the name of the @def (not the args).
-% #1 is the category, such as "Function".
-% #2 is the return type, if any.
-% #3 is the function name.
-%
-% We are followed by (but not passed) the arguments, if any.
-%
-\def\defname#1#2#3{%
- % Get the values of \leftskip and \rightskip as they were outside the @def...
- \advance\leftskip by -\defbodyindent
- %
- % How we'll format the type name. Putting it in brackets helps
- % distinguish it from the body text that may end up on the next line
- % just below it.
- \def\temp{#1}%
- \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
- %
- % Figure out line sizes for the paragraph shape.
- % The first line needs space for \box0; but if \rightskip is nonzero,
- % we need only space for the part of \box0 which exceeds it:
- \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
- % The continuations:
- \dimen2=\hsize \advance\dimen2 by -\defargsindent
- % (plain.tex says that \dimen1 should be used only as global.)
- \parshape 2 0in \dimen0 \defargsindent \dimen2
- %
- % Put the type name to the right margin.
- \noindent
- \hbox to 0pt{%
- \hfil\box0 \kern-\hsize
- % \hsize has to be shortened this way:
- \kern\leftskip
- % Intentionally do not respect \rightskip, since we need the space.
- }%
- %
- % Allow all lines to be underfull without complaint:
- \tolerance=10000 \hbadness=10000
- \exdentamount=\defbodyindent
- {%
- % defun fonts. We use typewriter by default (used to be bold) because:
- % . we're printing identifiers, they should be in tt in principle.
- % . in languages with many accents, such as Czech or French, it's
- % common to leave accents off identifiers. The result looks ok in
- % tt, but exceedingly strange in rm.
- % . we don't want -- and --- to be treated as ligatures.
- % . this still does not fix the ?` and !` ligatures, but so far no
- % one has made identifiers using them :).
- \df \tt
- \def\temp{#2}% return value type
- \ifx\temp\empty\else \tclose{\temp} \fi
- #3% output function name
- }%
- {\rm\enskip}% hskip 0.5 em of \tenrm
- %
- \boldbrax
- % arguments will be output next, if any.
-}
-
-% Print arguments in slanted roman (not ttsl), inconsistently with using
-% tt for the name. This is because literal text is sometimes needed in
-% the argument list (groff manual), and ttsl and tt are not very
-% distinguishable. Prevent hyphenation at `-' chars.
-%
-\def\defunargs#1{%
- % use sl by default (not ttsl),
- % tt for the names.
- \df \sl \hyphenchar\font=0
- %
- % On the other hand, if an argument has two dashes (for instance), we
- % want a way to get ttsl. Let's try @var for that.
- \let\var=\ttslanted
- #1%
- \sl\hyphenchar\font=45
-}
-
-% We want ()&[] to print specially on the defun line.
-%
-\def\activeparens{%
- \catcode`\(=\active \catcode`\)=\active
- \catcode`\[=\active \catcode`\]=\active
- \catcode`\&=\active
-}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-% Be sure that we always have a definition for `(', etc. For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-{
- \activeparens
- \global\let(=\lparen \global\let)=\rparen
- \global\let[=\lbrack \global\let]=\rbrack
- \global\let& = \&
-
- \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
- \gdef\magicamp{\let&=\amprm}
-}
-
-\newcount\parencount
-
-% If we encounter &foo, then turn on ()-hacking afterwards
-\newif\ifampseen
-\def\amprm#1 {\ampseentrue{\bf\&#1 }}
-
-\def\parenfont{%
- \ifampseen
- % At the first level, print parens in roman,
- % otherwise use the default font.
- \ifnum \parencount=1 \rm \fi
- \else
- % The \sf parens (in \boldbrax) actually are a little bolder than
- % the contained text. This is especially needed for [ and ] .
- \sf
- \fi
-}
-\def\infirstlevel#1{%
- \ifampseen
- \ifnum\parencount=1
- #1%
- \fi
- \fi
-}
-\def\bfafterword#1 {#1 \bf}
-
-\def\opnr{%
- \global\advance\parencount by 1
- {\parenfont(}%
- \infirstlevel \bfafterword
-}
-\def\clnr{%
- {\parenfont)}%
- \infirstlevel \sl
- \global\advance\parencount by -1
-}
-
-\newcount\brackcount
-\def\lbrb{%
- \global\advance\brackcount by 1
- {\bf[}%
-}
-\def\rbrb{%
- {\bf]}%
- \global\advance\brackcount by -1
-}
-
-\def\checkparencounts{%
- \ifnum\parencount=0 \else \badparencount \fi
- \ifnum\brackcount=0 \else \badbrackcount \fi
-}
-\def\badparencount{%
- \errmessage{Unbalanced parentheses in @def}%
- \global\parencount=0
-}
-\def\badbrackcount{%
- \errmessage{Unbalanced square braces in @def}%
- \global\brackcount=0
-}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scantokens#1{%
- \toks0={#1}%
- \immediate\openout\macscribble=\jobname.tmp
- \immediate\write\macscribble{\the\toks0}%
- \immediate\closeout\macscribble
- \input \jobname.tmp
- }
-\fi
-
-\def\scanmacro#1{%
- \begingroup
- \newlinechar`\^^M
- \let\xeatspaces\eatspaces
- % Undo catcode changes of \startcontents and \doprintindex
- % When called from @insertcopying or (short)caption, we need active
- % backslash to get it printed correctly. Previously, we had
- % \catcode`\\=\other instead. We'll see whether a problem appears
- % with macro expansion. --kasal, 19aug04
- \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
- % ... and \example
- \spaceisspace
- %
- % Append \endinput to make sure that TeX does not see the ending newline.
- % I've verified that it is necessary both for e-TeX and for ordinary TeX
- % --kasal, 29nov03
- \scantokens{#1\endinput}%
- \endgroup
-}
-
-\def\scanexp#1{%
- \edef\temp{\noexpand\scanmacro{#1}}%
- \temp
-}
-
-\newcount\paramno % Count of parameters
-\newtoks\macname % Macro name
-\newif\ifrecursive % Is it recursive?
-
-% List of all defined macros in the form
-% \definedummyword\macro1\definedummyword\macro2...
-% Currently is also contains all @aliases; the list can be split
-% if there is a need.
-\def\macrolist{}
-
-% Add the macro to \macrolist
-\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
-\def\addtomacrolistxxx#1{%
- \toks0 = \expandafter{\macrolist\definedummyword#1}%
- \xdef\macrolist{\the\toks0}%
-}
-
-% Utility routines.
-% This does \let #1 = #2, with \csnames; that is,
-% \let \csname#1\endcsname = \csname#2\endcsname
-% (except of course we have to play expansion games).
-%
-\def\cslet#1#2{%
- \expandafter\let
- \csname#1\expandafter\endcsname
- \csname#2\endcsname
-}
-
-% Trim leading and trailing spaces off a string.
-% Concepts from aro-bend problem 15 (see CTAN).
-{\catcode`\@=11
-\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
-\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
-\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
-\def\unbrace#1{#1}
-\unbrace{\gdef\trim@@@ #1 } #2@{#1}
-}
-
-% Trim a single trailing ^^M off a string.
-{\catcode`\^^M=\other \catcode`\Q=3%
-\gdef\eatcr #1{\eatcra #1Q^^MQ}%
-\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
-\gdef\eatcrb#1Q#2Q{#1}%
-}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \.
-
-% It's necessary to have hard CRs when the macro is executed. This is
-% done by making ^^M (\endlinechar) catcode 12 when reading the macro
-% body, and then making it the \newlinechar in \scanmacro.
-
-\def\scanctxt{%
- \catcode`\"=\other
- \catcode`\+=\other
- \catcode`\<=\other
- \catcode`\>=\other
- \catcode`\@=\other
- \catcode`\^=\other
- \catcode`\_=\other
- \catcode`\|=\other
- \catcode`\~=\other
-}
-
-\def\scanargctxt{%
- \scanctxt
- \catcode`\\=\other
- \catcode`\^^M=\other
-}
-
-\def\macrobodyctxt{%
- \scanctxt
- \catcode`\{=\other
- \catcode`\}=\other
- \catcode`\^^M=\other
- \usembodybackslash
-}
-
-\def\macroargctxt{%
- \scanctxt
- \catcode`\\=\other
-}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-
-{\catcode`@=0 @catcode`@\=@active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-\def\macro{\recursivefalse\parsearg\macroxxx}
-\def\rmacro{\recursivetrue\parsearg\macroxxx}
-
-\def\macroxxx#1{%
- \getargs{#1}% now \macname is the macname and \argl the arglist
- \ifx\argl\empty % no arguments
- \paramno=0%
- \else
- \expandafter\parsemargdef \argl;%
- \fi
- \if1\csname ismacro.\the\macname\endcsname
- \message{Warning: redefining \the\macname}%
- \else
- \expandafter\ifx\csname \the\macname\endcsname \relax
- \else \errmessage{Macro name \the\macname\space already defined}\fi
- \global\cslet{macsave.\the\macname}{\the\macname}%
- \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
- \addtomacrolist{\the\macname}%
- \fi
- \begingroup \macrobodyctxt
- \ifrecursive \expandafter\parsermacbody
- \else \expandafter\parsemacbody
- \fi}
-
-\parseargdef\unmacro{%
- \if1\csname ismacro.#1\endcsname
- \global\cslet{#1}{macsave.#1}%
- \global\expandafter\let \csname ismacro.#1\endcsname=0%
- % Remove the macro name from \macrolist:
- \begingroup
- \expandafter\let\csname#1\endcsname \relax
- \let\definedummyword\unmacrodo
- \xdef\macrolist{\macrolist}%
- \endgroup
- \else
- \errmessage{Macro #1 not defined}%
- \fi
-}
-
-% Called by \do from \dounmacro on each macro. The idea is to omit any
-% macro definitions that have been changed to \relax.
-%
-\def\unmacrodo#1{%
- \ifx #1\relax
- % remove this
- \else
- \noexpand\definedummyword \noexpand#1%
- \fi
-}
-
-% This makes use of the obscure feature that if the last token of a
-% <parameter list> is #, then the preceding argument is delimited by
-% an opening brace, and that opening brace is not consumed.
-\def\getargs#1{\getargsxxx#1{}}
-\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
-\def\getmacname #1 #2\relax{\macname={#1}}
-\def\getmacargs#1{\def\argl{#1}}
-
-% Parse the optional {params} list. Set up \paramno and \paramlist
-% so \defmacro knows what to do. Define \macarg.blah for each blah
-% in the params list, to be ##N where N is the position in that list.
-% That gets used by \mbodybackslash (above).
-
-% We need to get `macro parameter char #' into several definitions.
-% The technique used is stolen from LaTeX: let \hash be something
-% unexpandable, insert that wherever you need a #, and then redefine
-% it to # just before using the token list produced.
-%
-% The same technique is used to protect \eatspaces till just before
-% the macro is used.
-
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
- \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
-\def\parsemargdefxxx#1,{%
- \if#1;\let\next=\relax
- \else \let\next=\parsemargdefxxx
- \advance\paramno by 1%
- \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
- {\xeatspaces{\hash\the\paramno}}%
- \edef\paramlist{\paramlist\hash\the\paramno,}%
- \fi\next}
-
-% These two commands read recursive and nonrecursive macro bodies.
-% (They're different since rec and nonrec macros end differently.)
-
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-\long\def\parsermacbody#1@end rmacro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
-% Much magic with \expandafter here.
-% \xdef is used so that macro definitions will survive the file
-% they're defined in; @include reads the file inside a group.
-\def\defmacro{%
- \let\hash=##% convert placeholders to macro parameter chars
- \ifrecursive
- \ifcase\paramno
- % 0
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\scanmacro{\temp}}%
- \or % 1
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname xxx\endcsname}%
- \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
- \egroup\noexpand\scanmacro{\temp}}%
- \else % many
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\csname\the\macname xx\endcsname}%
- \expandafter\xdef\csname\the\macname xx\endcsname##1{%
- \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{\egroup\noexpand\scanmacro{\temp}}%
- \fi
- \else
- \ifcase\paramno
- % 0
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \or % 1
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname xxx\endcsname}%
- \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
- \egroup
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \else % many
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup\noexpand\macroargctxt
- \expandafter\noexpand\csname\the\macname xx\endcsname}%
- \expandafter\xdef\csname\the\macname xx\endcsname##1{%
- \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname xxx\endcsname
- \paramlist{%
- \egroup
- \noexpand\norecurse{\the\macname}%
- \noexpand\scanmacro{\temp}\egroup}%
- \fi
- \fi}
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-% \braceorline decides whether the next nonwhitespace character is a
-% {. If so it reads up to the closing }, if not, it reads the whole
-% line. Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
- \ifx\nchar\bgroup\else
- \expandafter\parsearg
- \fi \macnamexxx}
-
-
-% @alias.
-% We need some trickery to remove the optional spaces around the equal
-% sign. Just make them active and then expand them all to nothing.
-\def\alias{\parseargusing\obeyspaces\aliasxxx}
-\def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{%
- {%
- \expandafter\let\obeyedspace=\empty
- \addtomacrolist{#1}%
- \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
- }%
- \next
-}
-
-
-\message{cross references,}
-
-\newwrite\auxfile
-
-\newif\ifhavexrefs % True if xref values are known.
-\newif\ifwarnedxrefs % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
- node \samp{\ignorespaces#1{}}}
-
-% @node's only job in TeX is to define \lastnode, which is used in
-% cross-references. The @node line might or might not have commas, and
-% might or might not have spaces before the first comma, like:
-% @node foo , bar , ...
-% We don't want such trailing spaces in the node name.
-%
-\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
-%
-% also remove a trailing comma, in case of something like this:
-% @node Help-Cross, , , Cross-refs
-\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
-\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
-
-\let\nwnode=\node
-\let\lastnode=\empty
-
-% Write a cross-reference definition for the current node. #1 is the
-% type (Ynumbered, Yappendix, Ynothing).
-%
-\def\donoderef#1{%
- \ifx\lastnode\empty\else
- \setref{\lastnode}{#1}%
- \global\let\lastnode=\empty
- \fi
-}
-
-% @anchor{NAME} -- define xref target at arbitrary point.
-%
-\newcount\savesfregister
-%
-\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
-% anchor), which consists of three parts:
-% 1) NAME-title - the current sectioning name taken from \thissection,
-% or the anchor name.
-% 2) NAME-snt - section number and type, passed as the SNT arg, or
-% empty for anchors.
-% 3) NAME-pg - the page number.
-%
-% This is called from \donoderef, \anchor, and \dofloat. In the case of
-% floats, there is an additional part, which is not written here:
-% 4) NAME-lof - the text as it should appear in a @listoffloats.
-%
-\def\setref#1#2{%
- \pdfmkdest{#1}%
- \iflinks
- {%
- \atdummies % preserve commands, but don't expand them
- \edef\writexrdef##1##2{%
- \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
- ##1}{##2}}% these are parameters of \writexrdef
- }%
- \toks0 = \expandafter{\thissection}%
- \immediate \writexrdef{title}{\the\toks0 }%
- \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
- \writexrdef{pg}{\folio}% will be written later, during \shipout
- }%
- \fi
-}
-
-% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
-% the node name, #2 the name of the Info cross-reference, #3 the printed
-% node name, #4 the name of the Info file, #5 the name of the printed
-% manual. All but the node name can be omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
- \unsepspaces
- \def\printedmanual{\ignorespaces #5}%
- \def\printedrefname{\ignorespaces #3}%
- \setbox1=\hbox{\printedmanual\unskip}%
- \setbox0=\hbox{\printedrefname\unskip}%
- \ifdim \wd0 = 0pt
- % No printed node name was explicitly given.
- \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
- % Use the node name inside the square brackets.
- \def\printedrefname{\ignorespaces #1}%
- \else
- % Use the actual chapter/section title appear inside
- % the square brackets. Use the real section title if we have it.
- \ifdim \wd1 > 0pt
- % It is in another manual, so we don't have it.
- \def\printedrefname{\ignorespaces #1}%
- \else
- \ifhavexrefs
- % We know the real title if we have the xref values.
- \def\printedrefname{\refx{#1-title}{}}%
- \else
- % Otherwise just copy the Info node name.
- \def\printedrefname{\ignorespaces #1}%
- \fi%
- \fi
- \fi
- \fi
- %
- % Make link in pdf output.
- \ifpdf
- \leavevmode
- \getfilename{#4}%
- {\turnoffactive
- % See comments at \activebackslashdouble.
- {\activebackslashdouble \xdef\pdfxrefdest{#1}%
- \backslashparens\pdfxrefdest}%
- %
- \ifnum\filenamelength>0
- \startlink attr{/Border [0 0 0]}%
- goto file{\the\filename.pdf} name{\pdfxrefdest}%
- \else
- \startlink attr{/Border [0 0 0]}%
- goto name{\pdfmkpgn{\pdfxrefdest}}%
- \fi
- }%
- \linkcolor
- \fi
- %
- % Float references are printed completely differently: "Figure 1.2"
- % instead of "[somenode], p.3". We distinguish them by the
- % LABEL-title being set to a magic string.
- {%
- % Have to otherify everything special to allow the \csname to
- % include an _ in the xref name, etc.
- \indexnofonts
- \turnoffactive
- \expandafter\global\expandafter\let\expandafter\Xthisreftitle
- \csname XR#1-title\endcsname
- }%
- \iffloat\Xthisreftitle
- % If the user specified the print name (third arg) to the ref,
- % print it instead of our usual "Figure 1.2".
- \ifdim\wd0 = 0pt
- \refx{#1-snt}{}%
- \else
- \printedrefname
- \fi
- %
- % if the user also gave the printed manual name (fifth arg), append
- % "in MANUALNAME".
- \ifdim \wd1 > 0pt
- \space \putwordin{} \cite{\printedmanual}%
- \fi
- \else
- % node/anchor (non-float) references.
- %
- % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
- % insert empty discretionaries after hyphens, which means that it will
- % not find a line break at a hyphen in a node names. Since some manuals
- % are best written with fairly long node names, containing hyphens, this
- % is a loss. Therefore, we give the text of the node name again, so it
- % is as if TeX is seeing it for the first time.
- \ifdim \wd1 > 0pt
- \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
- \else
- % _ (for example) has to be the character _ for the purposes of the
- % control sequence corresponding to the node, but it has to expand
- % into the usual \leavevmode...\vrule stuff for purposes of
- % printing. So we \turnoffactive for the \refx-snt, back on for the
- % printing, back off for the \refx-pg.
- {\turnoffactive
- % Only output a following space if the -snt ref is nonempty; for
- % @unnumbered and @anchor, it won't be.
- \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
- \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
- }%
- % output the `[mynode]' via a macro so it can be overridden.
- \xrefprintnodename\printedrefname
- %
- % But we always want a comma and a space:
- ,\space
- %
- % output the `page 3'.
- \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
- \fi
- \fi
- \endlink
-\endgroup}
-
-% This macro is called from \xrefX for the `[nodename]' part of xref
-% output. It's a separate macro only so it can be changed more easily,
-% since square brackets don't work well in some documents. Particularly
-% one that Bob is working on :).
-%
-\def\xrefprintnodename#1{[#1]}
-
-% Things referred to by \setref.
-%
-\def\Ynothing{}
-\def\Yomitfromtoc{}
-\def\Ynumbered{%
- \ifnum\secno=0
- \putwordChapter@tie \the\chapno
- \else \ifnum\subsecno=0
- \putwordSection@tie \the\chapno.\the\secno
- \else \ifnum\subsubsecno=0
- \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
- \else
- \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
- \fi\fi\fi
-}
-\def\Yappendix{%
- \ifnum\secno=0
- \putwordAppendix@tie @char\the\appendixno{}%
- \else \ifnum\subsecno=0
- \putwordSection@tie @char\the\appendixno.\the\secno
- \else \ifnum\subsubsecno=0
- \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
- \else
- \putwordSection@tie
- @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
- \fi\fi\fi
-}
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-%
-\def\refx#1#2{%
- {%
- \indexnofonts
- \otherbackslash
- \expandafter\global\expandafter\let\expandafter\thisrefX
- \csname XR#1\endcsname
- }%
- \ifx\thisrefX\relax
- % If not defined, say something at least.
- \angleleft un\-de\-fined\angleright
- \iflinks
- \ifhavexrefs
- \message{\linenumber Undefined cross reference `#1'.}%
- \else
- \ifwarnedxrefs\else
- \global\warnedxrefstrue
- \message{Cross reference values unknown; you must run TeX again.}%
- \fi
- \fi
- \fi
- \else
- % It's defined, so just use it.
- \thisrefX
- \fi
- #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file. Usually it's
-% just a \def (we prepend XR to the control sequence name to avoid
-% collisions). But if this is a float type, we have more work to do.
-%
-\def\xrdef#1#2{%
- \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
- %
- % Was that xref control sequence that we just defined for a float?
- \expandafter\iffloat\csname XR#1\endcsname
- % it was a float, and we have the (safe) float type in \iffloattype.
- \expandafter\let\expandafter\floatlist
- \csname floatlist\iffloattype\endcsname
- %
- % Is this the first time we've seen this float type?
- \expandafter\ifx\floatlist\relax
- \toks0 = {\do}% yes, so just \do
- \else
- % had it before, so preserve previous elements in list.
- \toks0 = \expandafter{\floatlist\do}%
- \fi
- %
- % Remember this xref in the control sequence \floatlistFLOATTYPE,
- % for later use in \listoffloats.
- \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
- \fi
-}
-
-% Read the last existing aux file, if any. No error if none exists.
-%
-\def\tryauxfile{%
- \openin 1 \jobname.aux
- \ifeof 1 \else
- \readdatafile{aux}%
- \global\havexrefstrue
- \fi
- \closein 1
-}
-
-\def\setupdatafile{%
- \catcode`\^^@=\other
- \catcode`\^^A=\other
- \catcode`\^^B=\other
- \catcode`\^^C=\other
- \catcode`\^^D=\other
- \catcode`\^^E=\other
- \catcode`\^^F=\other
- \catcode`\^^G=\other
- \catcode`\^^H=\other
- \catcode`\^^K=\other
- \catcode`\^^L=\other
- \catcode`\^^N=\other
- \catcode`\^^P=\other
- \catcode`\^^Q=\other
- \catcode`\^^R=\other
- \catcode`\^^S=\other
- \catcode`\^^T=\other
- \catcode`\^^U=\other
- \catcode`\^^V=\other
- \catcode`\^^W=\other
- \catcode`\^^X=\other
- \catcode`\^^Z=\other
- \catcode`\^^[=\other
- \catcode`\^^\=\other
- \catcode`\^^]=\other
- \catcode`\^^^=\other
- \catcode`\^^_=\other
- % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
- % in xref tags, i.e., node names. But since ^^e4 notation isn't
- % supported in the main text, it doesn't seem desirable. Furthermore,
- % that is not enough: for node names that actually contain a ^
- % character, we would end up writing a line like this: 'xrdef {'hat
- % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
- % argument, and \hat is not an expandable control sequence. It could
- % all be worked out, but why? Either we support ^^ or we don't.
- %
- % The other change necessary for this was to define \auxhat:
- % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
- % and then to call \auxhat in \setq.
- %
- \catcode`\^=\other
- %
- % Special characters. Should be turned off anyway, but...
- \catcode`\~=\other
- \catcode`\[=\other
- \catcode`\]=\other
- \catcode`\"=\other
- \catcode`\_=\other
- \catcode`\|=\other
- \catcode`\<=\other
- \catcode`\>=\other
- \catcode`\$=\other
- \catcode`\#=\other
- \catcode`\&=\other
- \catcode`\%=\other
- \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
- %
- % This is to support \ in node names and titles, since the \
- % characters end up in a \csname. It's easier than
- % leaving it active and making its active definition an actual \
- % character. What I don't understand is why it works in the *value*
- % of the xrdef. Seems like it should be a catcode12 \, and that
- % should not typeset properly. But it works, so I'm moving on for
- % now. --karl, 15jan04.
- \catcode`\\=\other
- %
- % Make the characters 128-255 be printing characters.
- {%
- \count1=128
- \def\loop{%
- \catcode\count1=\other
- \advance\count1 by 1
- \ifnum \count1<256 \loop \fi
- }%
- }%
- %
- % @ is our escape character in .aux files, and we need braces.
- \catcode`\{=1
- \catcode`\}=2
- \catcode`\@=0
-}
-
-\def\readdatafile#1{%
-\begingroup
- \setupdatafile
- \input\jobname.#1
-\endgroup}
-
-\message{insertions,}
-% including footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only.
-\let\footnotestyle=\comment
-
-{\catcode `\@=11
-%
-% Auto-number footnotes. Otherwise like plain.
-\gdef\footnote{%
- \let\indent=\ptexindent
- \let\noindent=\ptexnoindent
- \global\advance\footnoteno by \@ne
- \edef\thisfootno{$^{\the\footnoteno}$}%
- %
- % In case the footnote comes at the end of a sentence, preserve the
- % extra spacing after we do the footnote number.
- \let\@sf\empty
- \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
- %
- % Remove inadvertent blank space before typesetting the footnote number.
- \unskip
- \thisfootno\@sf
- \dofootnote
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter. Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset (and anything else that uses
-% \parseargline) fails inside footnotes because the tokens are fixed when
-% the footnote is read. --karl, 16nov96.
-%
-\gdef\dofootnote{%
- \insert\footins\bgroup
- % We want to typeset this text as a normal paragraph, even if the
- % footnote reference occurs in (for example) a display environment.
- % So reset some parameters.
- \hsize=\pagewidth
- \interlinepenalty\interfootnotelinepenalty
- \splittopskip\ht\strutbox % top baseline for broken footnotes
- \splitmaxdepth\dp\strutbox
- \floatingpenalty\@MM
- \leftskip\z@skip
- \rightskip\z@skip
- \spaceskip\z@skip
- \xspaceskip\z@skip
- \parindent\defaultparindent
- %
- \smallfonts \rm
- %
- % Because we use hanging indentation in footnotes, a @noindent appears
- % to exdent this text, so make it be a no-op. makeinfo does not use
- % hanging indentation so @noindent can still be needed within footnote
- % text after an @example or the like (not that this is good style).
- \let\noindent = \relax
- %
- % Hang the footnote text off the number. Use \everypar in case the
- % footnote extends for more than one paragraph.
- \everypar = {\hang}%
- \textindent{\thisfootno}%
- %
- % Don't crash into the line above the footnote text. Since this
- % expands into a box, it must come within the paragraph, lest it
- % provide a place where TeX can split the footnote.
- \footstrut
- \futurelet\next\fo@t
-}
-}%end \catcode `\@=11
-
-% In case a @footnote appears in a vbox, save the footnote text and create
-% the real \insert just after the vbox finished. Otherwise, the insertion
-% would be lost.
-% Similarily, if a @footnote appears inside an alignment, save the footnote
-% text to a box and make the \insert when a row of the table is finished.
-% And the same can be done for other insert classes. --kasal, 16nov03.
-
-% Replace the \insert primitive by a cheating macro.
-% Deeper inside, just make sure that the saved insertions are not spilled
-% out prematurely.
-%
-\def\startsavinginserts{%
- \ifx \insert\ptexinsert
- \let\insert\saveinsert
- \else
- \let\checkinserts\relax
- \fi
-}
-
-% This \insert replacement works for both \insert\footins{foo} and
-% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
-%
-\def\saveinsert#1{%
- \edef\next{\noexpand\savetobox \makeSAVEname#1}%
- \afterassignment\next
- % swallow the left brace
- \let\temp =
-}
-\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
-\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
-
-\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
-
-\def\placesaveins#1{%
- \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
- {\box#1}%
-}
-
-% eat @SAVE -- beware, all of them have catcode \other:
-{
- \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
- \gdef\gobblesave @SAVE{}
-}
-
-% initialization:
-\def\newsaveins #1{%
- \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
- \next
-}
-\def\newsaveinsX #1{%
- \csname newbox\endcsname #1%
- \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
- \checksaveins #1}%
-}
-
-% initialize:
-\let\checkinserts\empty
-\newsaveins\footins
-\newsaveins\margin
-
-
-% @image. We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front. If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
- % Do not bother showing banner with epsf.tex v2.7k (available in
- % doc/epsf.tex and on ctan).
- \def\epsfannounce{\toks0 = }%
- \input epsf.tex
-\fi
-\closein 1
-%
-% We will only complain once about lack of epsf.tex.
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
- work. It is also included in the Texinfo distribution, or you can get
- it from ftp://tug.org/tex/epsf.tex.}
-%
-\def\image#1{%
- \ifx\epsfbox\undefined
- \ifwarnednoepsf \else
- \errhelp = \noepsfhelp
- \errmessage{epsf.tex not found, images will be ignored}%
- \global\warnednoepsftrue
- \fi
- \else
- \imagexxx #1,,,,,\finish
- \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is (ignored optional) html alt text.
-% #5 is (ignored optional) extension.
-% #6 is just the usual extra ignored arg for parsing this stuff.
-\newif\ifimagevmode
-\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
- \catcode`\^^M = 5 % in case we're inside an example
- \normalturnoffactive % allow _ et al. in names
- % If the image is by itself, center it.
- \ifvmode
- \imagevmodetrue
- \nobreak\bigskip
- % Usually we'll have text after the image which will insert
- % \parskip glue, so insert it here too to equalize the space
- % above and below.
- \nobreak\vskip\parskip
- \nobreak
- \line\bgroup
- \fi
- %
- % Output the image.
- \ifpdf
- \dopdfimage{#1}{#2}{#3}%
- \else
- % \epsfbox itself resets \epsf?size at each figure.
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
- \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
- \epsfbox{#1.eps}%
- \fi
- %
- \ifimagevmode \egroup \bigbreak \fi % space after the image
-\endgroup}
-
-
-% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
-% etc. We don't actually implement floating yet, we always include the
-% float "here". But it seemed the best name for the future.
-%
-\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
-
-% There may be a space before second and/or third parameter; delete it.
-\def\eatcommaspace#1, {#1,}
-
-% #1 is the optional FLOATTYPE, the text label for this float, typically
-% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
-% this float will not be numbered and cannot be referred to.
-%
-% #2 is the optional xref label. Also must be present for the float to
-% be referable.
-%
-% #3 is the optional positioning argument; for now, it is ignored. It
-% will somehow specify the positions allowed to float to (here, top, bottom).
-%
-% We keep a separate counter for each FLOATTYPE, which we reset at each
-% chapter-level command.
-\let\resetallfloatnos=\empty
-%
-\def\dofloat#1,#2,#3,#4\finish{%
- \let\thiscaption=\empty
- \let\thisshortcaption=\empty
- %
- % don't lose footnotes inside @float.
- %
- % BEWARE: when the floats start float, we have to issue warning whenever an
- % insert appears inside a float which could possibly float. --kasal, 26may04
- %
- \startsavinginserts
- %
- % We can't be used inside a paragraph.
- \par
- %
- \vtop\bgroup
- \def\floattype{#1}%
- \def\floatlabel{#2}%
- \def\floatloc{#3}% we do nothing with this yet.
- %
- \ifx\floattype\empty
- \let\safefloattype=\empty
- \else
- {%
- % the floattype might have accents or other special characters,
- % but we need to use it in a control sequence name.
- \indexnofonts
- \turnoffactive
- \xdef\safefloattype{\floattype}%
- }%
- \fi
- %
- % If label is given but no type, we handle that as the empty type.
- \ifx\floatlabel\empty \else
- % We want each FLOATTYPE to be numbered separately (Figure 1,
- % Table 1, Figure 2, ...). (And if no label, no number.)
- %
- \expandafter\getfloatno\csname\safefloattype floatno\endcsname
- \global\advance\floatno by 1
- %
- {%
- % This magic value for \thissection is output by \setref as the
- % XREFLABEL-title value. \xrefX uses it to distinguish float
- % labels (which have a completely different output format) from
- % node and anchor labels. And \xrdef uses it to construct the
- % lists of floats.
- %
- \edef\thissection{\floatmagic=\safefloattype}%
- \setref{\floatlabel}{Yfloat}%
- }%
- \fi
- %
- % start with \parskip glue, I guess.
- \vskip\parskip
- %
- % Don't suppress indentation if a float happens to start a section.
- \restorefirstparagraphindent
-}
-
-% we have these possibilities:
-% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
-% @float Foo,lbl & no caption: Foo 1.1
-% @float Foo & @caption{Cap}: Foo: Cap
-% @float Foo & no caption: Foo
-% @float ,lbl & Caption{Cap}: 1.1: Cap
-% @float ,lbl & no caption: 1.1
-% @float & @caption{Cap}: Cap
-% @float & no caption:
-%
-\def\Efloat{%
- \let\floatident = \empty
- %
- % In all cases, if we have a float type, it comes first.
- \ifx\floattype\empty \else \def\floatident{\floattype}\fi
- %
- % If we have an xref label, the number comes next.
- \ifx\floatlabel\empty \else
- \ifx\floattype\empty \else % if also had float type, need tie first.
- \appendtomacro\floatident{\tie}%
- \fi
- % the number.
- \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
- \fi
- %
- % Start the printed caption with what we've constructed in
- % \floatident, but keep it separate; we need \floatident again.
- \let\captionline = \floatident
- %
- \ifx\thiscaption\empty \else
- \ifx\floatident\empty \else
- \appendtomacro\captionline{: }% had ident, so need a colon between
- \fi
- %
- % caption text.
- \appendtomacro\captionline{\scanexp\thiscaption}%
- \fi
- %
- % If we have anything to print, print it, with space before.
- % Eventually this needs to become an \insert.
- \ifx\captionline\empty \else
- \vskip.5\parskip
- \captionline
- %
- % Space below caption.
- \vskip\parskip
- \fi
- %
- % If have an xref label, write the list of floats info. Do this
- % after the caption, to avoid chance of it being a breakpoint.
- \ifx\floatlabel\empty \else
- % Write the text that goes in the lof to the aux file as
- % \floatlabel-lof. Besides \floatident, we include the short
- % caption if specified, else the full caption if specified, else nothing.
- {%
- \atdummies
- %
- % since we read the caption text in the macro world, where ^^M
- % is turned into a normal character, we have to scan it back, so
- % we don't write the literal three characters "^^M" into the aux file.
- \scanexp{%
- \xdef\noexpand\gtemp{%
- \ifx\thisshortcaption\empty
- \thiscaption
- \else
- \thisshortcaption
- \fi
- }%
- }%
- \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
- \ifx\gtemp\empty \else : \gtemp \fi}}%
- }%
- \fi
- \egroup % end of \vtop
- %
- % place the captured inserts
- %
- % BEWARE: when the floats start floating, we have to issue warning
- % whenever an insert appears inside a float which could possibly
- % float. --kasal, 26may04
- %
- \checkinserts
-}
-
-% Append the tokens #2 to the definition of macro #1, not expanding either.
-%
-\def\appendtomacro#1#2{%
- \expandafter\def\expandafter#1\expandafter{#1#2}%
-}
-
-% @caption, @shortcaption
-%
-\def\caption{\docaption\thiscaption}
-\def\shortcaption{\docaption\thisshortcaption}
-\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
-\def\defcaption#1#2{\egroup \def#1{#2}}
-
-% The parameter is the control sequence identifying the counter we are
-% going to use. Create it if it doesn't exist and assign it to \floatno.
-\def\getfloatno#1{%
- \ifx#1\relax
- % Haven't seen this figure type before.
- \csname newcount\endcsname #1%
- %
- % Remember to reset this floatno at the next chap.
- \expandafter\gdef\expandafter\resetallfloatnos
- \expandafter{\resetallfloatnos #1=0 }%
- \fi
- \let\floatno#1%
-}
-
-% \setref calls this to get the XREFLABEL-snt value. We want an @xref
-% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
-% first read the @float command.
-%
-\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
-
-% Magic string used for the XREFLABEL-title value, so \xrefX can
-% distinguish floats from other xref types.
-\def\floatmagic{!!float!!}
-
-% #1 is the control sequence we are passed; we expand into a conditional
-% which is true if #1 represents a float ref. That is, the magic
-% \thissection value which we \setref above.
-%
-\def\iffloat#1{\expandafter\doiffloat#1==\finish}
-%
-% #1 is (maybe) the \floatmagic string. If so, #2 will be the
-% (safe) float type for this float. We set \iffloattype to #2.
-%
-\def\doiffloat#1=#2=#3\finish{%
- \def\temp{#1}%
- \def\iffloattype{#2}%
- \ifx\temp\floatmagic
-}
-
-% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
-%
-\parseargdef\listoffloats{%
- \def\floattype{#1}% floattype
- {%
- % the floattype might have accents or other special characters,
- % but we need to use it in a control sequence name.
- \indexnofonts
- \turnoffactive
- \xdef\safefloattype{\floattype}%
- }%
- %
- % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
- \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
- \ifhavexrefs
- % if the user said @listoffloats foo but never @float foo.
- \message{\linenumber No `\safefloattype' floats to list.}%
- \fi
- \else
- \begingroup
- \leftskip=\tocindent % indent these entries like a toc
- \let\do=\listoffloatsdo
- \csname floatlist\safefloattype\endcsname
- \endgroup
- \fi
-}
-
-% This is called on each entry in a list of floats. We're passed the
-% xref label, in the form LABEL-title, which is how we save it in the
-% aux file. We strip off the -title and look up \XRLABEL-lof, which
-% has the text we're supposed to typeset here.
-%
-% Figures without xref labels will not be included in the list (since
-% they won't appear in the aux file).
-%
-\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
-\def\listoffloatsdoentry#1-title\finish{{%
- % Can't fully expand XR#1-lof because it can contain anything. Just
- % pass the control sequence. On the other hand, XR#1-pg is just the
- % page number, and we want to fully expand that so we can get a link
- % in pdf output.
- \toksA = \expandafter{\csname XR#1-lof\endcsname}%
- %
- % use the same \entry macro we use to generate the TOC and index.
- \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
- \writeentry
-}}
-
-\message{localization,}
-% and i18n.
-
-% @documentlanguage is usually given very early, just after
-% @setfilename. If done too late, it may not override everything
-% properly. Single argument is the language abbreviation.
-% It would be nice if we could set up a hyphenation file here.
-%
-\parseargdef\documentlanguage{%
- \tex % read txi-??.tex file in plain TeX.
- % Read the file if it exists.
- \openin 1 txi-#1.tex
- \ifeof 1
- \errhelp = \nolanghelp
- \errmessage{Cannot read language file txi-#1.tex}%
- \else
- \input txi-#1.tex
- \fi
- \closein 1
- \endgroup
-}
-\newhelp\nolanghelp{The given language definition file cannot be found or
-is empty. Maybe you need to install it? In the current directory
-should work if nowhere else does.}
-
-
-% @documentencoding should change something in TeX eventually, most
-% likely, but for now just recognize it.
-\let\documentencoding = \comment
-
-
-% Page size parameters.
-%
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Don't be so finicky about underfull hboxes, either.
-\hbadness = 2000
-
-% Following George Bush, just get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything. We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize. We call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
- \ifx\emergencystretch\thisisundefined
- % Allow us to assign to \emergencystretch anyway.
- \def\emergencystretch{\dimen0}%
- \else
- \emergencystretch = .15\hsize
- \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth;
-% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
-% 7) physical page height; 8) physical page width.
-%
-% We also call \setleading{\textleading}, so the caller should define
-% \textleading. The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6#7#8{%
- \voffset = #3\relax
- \topskip = #6\relax
- \splittopskip = \topskip
- %
- \vsize = #1\relax
- \advance\vsize by \topskip
- \outervsize = \vsize
- \advance\outervsize by 2\topandbottommargin
- \pageheight = \vsize
- %
- \hsize = #2\relax
- \outerhsize = \hsize
- \advance\outerhsize by 0.5in
- \pagewidth = \hsize
- %
- \normaloffset = #4\relax
- \bindingoffset = #5\relax
- %
- \ifpdf
- \pdfpageheight #7\relax
- \pdfpagewidth #8\relax
- \fi
- %
- \setleading{\textleading}
- %
- \parindent = \defaultparindent
- \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
- \parskip = 3pt plus 2pt minus 1pt
- \textleading = 13.2pt
- %
- % If page is nothing but text, make it come out even.
- \internalpagesizes{46\baselineskip}{6in}%
- {\voffset}{.25in}%
- {\bindingoffset}{36pt}%
- {11in}{8.5in}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.25 trim size.
-\def\smallbook{{\globaldefs = 1
- \parskip = 2pt plus 1pt
- \textleading = 12pt
- %
- \internalpagesizes{7.5in}{5in}%
- {\voffset}{.25in}%
- {\bindingoffset}{16pt}%
- {9.25in}{7in}%
- %
- \lispnarrowing = 0.3in
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \defbodyindent = .5cm
-}}
-
-% Use @smallerbook to reset parameters for 6x9 trim size.
-% (Just testing, parameters still in flux.)
-\def\smallerbook{{\globaldefs = 1
- \parskip = 1.5pt plus 1pt
- \textleading = 12pt
- %
- \internalpagesizes{7.4in}{4.8in}%
- {-.2in}{-.4in}%
- {0pt}{14pt}%
- {9in}{6in}%
- %
- \lispnarrowing = 0.25in
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \defbodyindent = .4cm
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
- \parskip = 3pt plus 2pt minus 1pt
- \textleading = 13.2pt
- %
- % Double-side printing via postscript on Laserjet 4050
- % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
- % To change the settings for a different printer or situation, adjust
- % \normaloffset until the front-side and back-side texts align. Then
- % do the same for \bindingoffset. You can set these for testing in
- % your texinfo source file like this:
- % @tex
- % \global\normaloffset = -6mm
- % \global\bindingoffset = 10mm
- % @end tex
- \internalpagesizes{51\baselineskip}{160mm}
- {\voffset}{\hoffset}%
- {\bindingoffset}{44pt}%
- {297mm}{210mm}%
- %
- \tolerance = 700
- \hfuzz = 1pt
- \contentsrightmargin = 0pt
- \defbodyindent = 5mm
-}}
-
-% Use @afivepaper to print on European A5 paper.
-% From romildo@urano.iceb.ufop.br, 2 July 2000.
-% He also recommends making @example and @lisp be small.
-\def\afivepaper{{\globaldefs = 1
- \parskip = 2pt plus 1pt minus 0.1pt
- \textleading = 12.5pt
- %
- \internalpagesizes{160mm}{120mm}%
- {\voffset}{\hoffset}%
- {\bindingoffset}{8pt}%
- {210mm}{148mm}%
- %
- \lispnarrowing = 0.2in
- \tolerance = 800
- \hfuzz = 1.2pt
- \contentsrightmargin = 0pt
- \defbodyindent = 2mm
- \tableindent = 12mm
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.
-\def\afourlatex{{\globaldefs = 1
- \afourpaper
- \internalpagesizes{237mm}{150mm}%
- {\voffset}{4.6mm}%
- {\bindingoffset}{7mm}%
- {297mm}{210mm}%
- %
- % Must explicitly reset to 0 because we call \afourpaper.
- \globaldefs = 0
-}}
-
-% Use @afourwide to print on A4 paper in landscape format.
-\def\afourwide{{\globaldefs = 1
- \afourpaper
- \internalpagesizes{241mm}{165mm}%
- {\voffset}{-2.95mm}%
- {\bindingoffset}{7mm}%
- {297mm}{210mm}%
- \globaldefs = 0
-}}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
- \globaldefs = 1
- %
- \parskip = 3pt plus 2pt minus 1pt
- \setleading{\textleading}%
- %
- \dimen0 = #1
- \advance\dimen0 by \voffset
- %
- \dimen2 = \hsize
- \advance\dimen2 by \normaloffset
- %
- \internalpagesizes{#1}{\hsize}%
- {\voffset}{\normaloffset}%
- {\bindingoffset}{44pt}%
- {\dimen0}{\dimen2}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-
-\message{and turning on texinfo input format.}
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\catcode`\$=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-\def\normaldollar{$}%$ font-lock fix
-
-% This macro is used to make a character print one way in \tt
-% (where it can probably be output as-is), and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise. Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
-
-% Same as above, but check for italic font. Actually this also catches
-% non-italic slanted fonts since it is impossible to distinguish them from
-% italic fonts. But since this is only used by $ and it uses \sl anyway
-% this is not a problem.
-\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt\char126}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-\let\realunder=_
-% Subroutine for the previous macro.
-\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
-
-\catcode`\|=\active
-\def|{{\tt\char124}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-\catcode`\$=\active
-\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have \everyjob (or @setfilename) turn them on.
-% \otherifyactive is called near the end of this file.
-\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
-
-% Used sometimes to turn off (effectively) the active characters even after
-% parsing them.
-\def\turnoffactive{%
- \normalturnoffactive
- \otherbackslash
-}
-
-\catcode`\@=0
-
-% \backslashcurfont outputs one backslash character in current font,
-% as in \char`\\.
-\global\chardef\backslashcurfont=`\\
-\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
-
-% \realbackslash is an actual character `\' with catcode other, and
-% \doublebackslash is two of them (for the pdf outlines).
-{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
-
-% In texinfo, backslash is an active character; it prints the backslash
-% in fixed width font.
-\catcode`\\=\active
-@def@normalbackslash{{@tt@backslashcurfont}}
-% On startup, @fixbackslash assigns:
-% @let \ = @normalbackslash
-
-% \rawbackslash defines an active \ to do \backslashcurfont.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.
-@gdef@rawbackslash{@let\=@backslashcurfont}
-@gdef@otherbackslash{@let\=@realbackslash}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'.
-%
-@def@normalturnoffactive{%
- @let\=@normalbackslash
- @let"=@normaldoublequote
- @let~=@normaltilde
- @let^=@normalcaret
- @let_=@normalunderscore
- @let|=@normalverticalbar
- @let<=@normalless
- @let>=@normalgreater
- @let+=@normalplus
- @let$=@normaldollar %$ font-lock fix
- @unsepspaces
-}
-
-% Make _ and + \other characters, temporarily.
-% This is canceled by @fixbackslash.
-@otherifyactive
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\' in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-% Also turn back on active characters that might appear in the input
-% file name, in case not using a pre-dumped format.
-%
-@gdef@fixbackslash{%
- @ifx\@eatinput @let\ = @normalbackslash @fi
- @catcode`+=@active
- @catcode`@_=@active
-}
-
-% Say @foo, not \foo, in error messages.
-@escapechar = `@@
-
-% These look ok in all fonts, so just make them not special.
-@catcode`@& = @other
-@catcode`@# = @other
-@catcode`@% = @other
-
-
-@c Local variables:
-@c eval: (add-hook 'write-file-hooks 'time-stamp)
-@c page-delimiter: "^\\\\message"
-@c time-stamp-start: "def\\\\texinfoversion{"
-@c time-stamp-format: "%:y-%02m-%02d.%02H"
-@c time-stamp-end: "}"
-@c End:
-
-@c vim:sw=2:
-
-@ignore
- arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
-@end ignore
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/doc/version.texi b/plugins/MirOTR/libgcrypt-1.4.6/doc/version.texi
deleted file mode 100644
index 294e4abcd0..0000000000
--- a/plugins/MirOTR/libgcrypt-1.4.6/doc/version.texi
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 9 July 2009
-@set UPDATED-MONTH July 2009
-@set EDITION 1.4.6
-@set VERSION 1.4.6