This commit was manufactured by cvs2svn to create branch
authorRepo Admin <nobody@gnupg.org>
Sat, 19 Oct 2002 07:55:27 +0000 (07:55 +0000)
committerRepo Admin <nobody@gnupg.org>
Sat, 19 Oct 2002 07:55:27 +0000 (07:55 +0000)
'GNUPG-1-9-BRANCH'.

563 files changed:
ABOUT-NLS [deleted file]
BUGS [deleted file]
INSTALL [deleted file]
NOTES [deleted file]
OBUGS [deleted file]
PROJECTS [deleted file]
THOUGHTS [deleted file]
agent/ChangeLog [deleted file]
agent/Makefile.am [deleted file]
agent/agent.h [deleted file]
agent/cache.c [deleted file]
agent/call-scd.c [deleted file]
agent/command.c [deleted file]
agent/divert-scd.c [deleted file]
agent/findkey.c [deleted file]
agent/genkey.c [deleted file]
agent/gpg-agent.c [deleted file]
agent/learncard.c [deleted file]
agent/minip12.c [deleted file]
agent/minip12.h [deleted file]
agent/pkdecrypt.c [deleted file]
agent/pksign.c [deleted file]
agent/protect-tool.c [deleted file]
agent/protect.c [deleted file]
agent/query.c [deleted file]
agent/sexp-parse.h [deleted file]
agent/simple-pwquery.c [deleted file]
agent/trustlist.c [deleted file]
assuan/ChangeLog [deleted file]
assuan/Makefile.am [deleted file]
assuan/assuan-buffer.c [deleted file]
assuan/assuan-client.c [deleted file]
assuan/assuan-connect.c [deleted file]
assuan/assuan-defs.h [deleted file]
assuan/assuan-handler.c [deleted file]
assuan/assuan-inquire.c [deleted file]
assuan/assuan-listen.c [deleted file]
assuan/assuan-pipe-connect.c [deleted file]
assuan/assuan-pipe-server.c [deleted file]
assuan/assuan-socket-connect.c [deleted file]
assuan/assuan-socket-server.c [deleted file]
assuan/assuan-util.c [deleted file]
assuan/assuan.h [deleted file]
assuan/mkerrors [deleted file]
checks/ChangeLog [deleted file]
checks/Makefile.am [deleted file]
checks/armdetach.test [deleted file]
checks/armdetachm.test [deleted file]
checks/armencrypt.test [deleted file]
checks/armencryptp.test [deleted file]
checks/armsignencrypt.test [deleted file]
checks/armsigs.test [deleted file]
checks/challenge-1 [deleted file]
checks/clearsig.test [deleted file]
checks/conventional-mdc.test [deleted file]
checks/conventional.test [deleted file]
checks/decrypt-dsa.test [deleted file]
checks/decrypt.test [deleted file]
checks/defs.inc [deleted file]
checks/detach.test [deleted file]
checks/detachm.test [deleted file]
checks/encrypt-dsa.test [deleted file]
checks/encrypt.test [deleted file]
checks/encryptp.test [deleted file]
checks/genkey1024.test [deleted file]
checks/mds.test [deleted file]
checks/mkdemodirs [deleted file]
checks/multisig.test [deleted file]
checks/options.in [deleted file]
checks/pgp263-test.pub.asc [deleted file]
checks/pgp263-test.sec.asc [deleted file]
checks/plain-1-pgp.asc [deleted file]
checks/plain-1.asc [deleted file]
checks/plain-1o.asc [deleted file]
checks/plain-2.asc [deleted file]
checks/plain-2o.asc [deleted file]
checks/plain-3.asc [deleted file]
checks/plain-3o.asc [deleted file]
checks/pubdemo.asc [deleted file]
checks/pubring.asc [deleted file]
checks/pubring.pkr.asc [deleted file]
checks/seat.test [deleted file]
checks/secdemo.asc [deleted file]
checks/secring.asc [deleted file]
checks/secring.skr.asc [deleted file]
checks/signdemokey [deleted file]
checks/signencrypt-dsa.test [deleted file]
checks/signencrypt.test [deleted file]
checks/sigs-dsa.test [deleted file]
checks/sigs.test [deleted file]
checks/version.test [deleted file]
cipher/ChangeLog [deleted file]
cipher/Makefile.am [deleted file]
cipher/algorithms.h [deleted file]
cipher/bithelp.h [deleted file]
cipher/blowfish.c [deleted file]
cipher/cast5.c [deleted file]
cipher/cipher.c [deleted file]
cipher/des.c [deleted file]
cipher/dsa.c [deleted file]
cipher/dsa.h [deleted file]
cipher/dynload.c [deleted file]
cipher/elgamal.c [deleted file]
cipher/elgamal.h [deleted file]
cipher/g10c.c [deleted file]
cipher/gost.c [deleted file]
cipher/gost.h [deleted file]
cipher/idea-stub.c [deleted file]
cipher/md.c [deleted file]
cipher/md5.c [deleted file]
cipher/primegen.c [deleted file]
cipher/pubkey.c [deleted file]
cipher/rand-internal.h [deleted file]
cipher/random.c [deleted file]
cipher/random.h [deleted file]
cipher/rijndael.c [deleted file]
cipher/rmd.h [deleted file]
cipher/rmd160.c [deleted file]
cipher/rmd160test.c [deleted file]
cipher/rndegd.c [deleted file]
cipher/rndlinux.c [deleted file]
cipher/rndriscos.c [deleted file]
cipher/rndunix.c [deleted file]
cipher/rndw32.c [deleted file]
cipher/rsa.c [deleted file]
cipher/rsa.h [deleted file]
cipher/sha1.c [deleted file]
cipher/smallprime.c [deleted file]
cipher/tiger.c [deleted file]
cipher/twofish.c [deleted file]
common/ChangeLog [deleted file]
common/Makefile.am [deleted file]
common/README [deleted file]
common/errors.h [deleted file]
common/gettime.c [deleted file]
common/maperror.c [deleted file]
common/signal.c [deleted file]
common/util.h [deleted file]
contrib/UTF-8-test.txt [deleted file]
contrib/changes-in-2000 [deleted file]
contrib/why-gnupg [deleted file]
debian/README.Debian [deleted file]
debian/changelog [deleted file]
debian/control [deleted file]
debian/copyright [deleted file]
debian/distfiles [deleted file]
debian/lintian.override [deleted file]
debian/preinst [deleted file]
debian/rules [deleted file]
doc/ChangeLog [deleted file]
doc/DETAILS [deleted file]
doc/HACKING [deleted file]
doc/OpenPGP [deleted file]
doc/README.W32 [deleted file]
doc/credits-1.0 [deleted file]
doc/faq.raw [deleted file]
doc/fr/ChangeLog [deleted file]
doc/fr/DETAILS [deleted file]
doc/fr/FAQ [deleted file]
doc/fr/README.fr [deleted file]
doc/gnupg-w32.reg [deleted file]
doc/gnupg.7 [deleted file]
doc/gpg.sgml [deleted file]
doc/gpg.texi [deleted file]
doc/gpgv.sgml [deleted file]
doc/gpgv.texi [deleted file]
doc/gph/ChangeLog [deleted file]
doc/gph/Makefile.am [deleted file]
doc/gph/c1.sgml [deleted file]
doc/gph/c2.sgml [deleted file]
doc/gph/c3.sgml [deleted file]
doc/gph/c4.sgml [deleted file]
doc/gph/c5.sgml [deleted file]
doc/gph/c6.sgml [deleted file]
doc/gph/c7.sgml [deleted file]
doc/gph/manual.sgml [deleted file]
doc/gph/signatures.fig [deleted file]
doc/gph/signatures.jpg.asc [deleted file]
doc/samplekeys.asc [deleted file]
g10/ChangeLog [deleted file]
g10/Makefile.am [deleted file]
g10/armor.c [deleted file]
g10/build-packet.c [deleted file]
g10/cipher.c [deleted file]
g10/compress.c [deleted file]
g10/decrypt.c [deleted file]
g10/delkey.c [deleted file]
g10/encode.c [deleted file]
g10/exec.c [deleted file]
g10/exec.h [deleted file]
g10/export.c [deleted file]
g10/filter.h [deleted file]
g10/free-packet.c [deleted file]
g10/g10.c [deleted file]
g10/getkey.c [deleted file]
g10/gpgv.c [deleted file]
g10/import.c [deleted file]
g10/kbnode.c [deleted file]
g10/keydb.c [deleted file]
g10/keydb.h [deleted file]
g10/keyedit.c [deleted file]
g10/keygen.c [deleted file]
g10/keyid.c [deleted file]
g10/keylist.c [deleted file]
g10/keyring.c [deleted file]
g10/keyring.h [deleted file]
g10/keyserver.c [deleted file]
g10/main.h [deleted file]
g10/mainproc.c [deleted file]
g10/misc.c [deleted file]
g10/openfile.c [deleted file]
g10/options.h [deleted file]
g10/options.skel [deleted file]
g10/packet.h [deleted file]
g10/parse-packet.c [deleted file]
g10/passphrase.c [deleted file]
g10/photoid.c [deleted file]
g10/photoid.h [deleted file]
g10/pkclist.c [deleted file]
g10/plaintext.c [deleted file]
g10/pubkey-enc.c [deleted file]
g10/revoke.c [deleted file]
g10/seckey-cert.c [deleted file]
g10/sig-check.c [deleted file]
g10/sign.c [deleted file]
g10/signal.c [deleted file]
g10/status.c [deleted file]
g10/status.h [deleted file]
g10/tdbio.c [deleted file]
g10/tdbio.h [deleted file]
g10/textfilter.c [deleted file]
g10/trustdb.c [deleted file]
g10/trustdb.h [deleted file]
g10/verify.c [deleted file]
gnupg.txt [deleted file]
include/ChangeLog [deleted file]
include/cipher.h [deleted file]
include/distfiles [deleted file]
include/http.h [deleted file]
include/i18n.h [deleted file]
include/iobuf.h [deleted file]
include/memory.h [deleted file]
include/mpi.h [deleted file]
include/ttyio.h [deleted file]
include/types.h [deleted file]
include/util.h [deleted file]
intl/ChangeLog [deleted file]
intl/Makefile.in [deleted file]
intl/VERSION [deleted file]
intl/bindtextdom.c [deleted file]
intl/config.charset [deleted file]
intl/dcgettext.c [deleted file]
intl/dcigettext.c [deleted file]
intl/dcngettext.c [deleted file]
intl/dgettext.c [deleted file]
intl/dngettext.c [deleted file]
intl/finddomain.c [deleted file]
intl/gettext.c [deleted file]
intl/gettext.h [deleted file]
intl/gettextP.h [deleted file]
intl/hash-string.h [deleted file]
intl/intl-compat.c [deleted file]
intl/l10nflist.c [deleted file]
intl/libgettext.h [deleted file]
intl/loadinfo.h [deleted file]
intl/loadmsgcat.c [deleted file]
intl/localcharset.c [deleted file]
intl/localealias.c [deleted file]
intl/ngettext.c [deleted file]
intl/plural.c [deleted file]
intl/plural.y [deleted file]
intl/textdomain.c [deleted file]
kbx/ChangeLog [deleted file]
kbx/Makefile.am [deleted file]
kbx/kbxutil.c [deleted file]
kbx/keybox-blob.c [deleted file]
kbx/keybox-defs.h [deleted file]
kbx/keybox-dump.c [deleted file]
kbx/keybox-file.c [deleted file]
kbx/keybox-init.c [deleted file]
kbx/keybox-search.c [deleted file]
kbx/keybox-update.c [deleted file]
kbx/keybox.h [deleted file]
keyserver/ChangeLog [deleted file]
keyserver/Makefile.am [deleted file]
keyserver/gpgkeys_hkp.c [deleted file]
keyserver/gpgkeys_ldap.c [deleted file]
keyserver/gpgkeys_mailto.in [deleted file]
keyserver/gpgkeys_test.in [deleted file]
mpi/ChangeLog [deleted file]
mpi/Makefile.am [deleted file]
mpi/alpha/README [deleted file]
mpi/alpha/distfiles [deleted file]
mpi/alpha/mpih-add1.S [deleted file]
mpi/alpha/mpih-lshift.S [deleted file]
mpi/alpha/mpih-mul1.S [deleted file]
mpi/alpha/mpih-mul2.S [deleted file]
mpi/alpha/mpih-mul3.S [deleted file]
mpi/alpha/mpih-rshift.S [deleted file]
mpi/alpha/mpih-sub1.S [deleted file]
mpi/alpha/udiv-qrnnd.S [deleted file]
mpi/config.links [deleted file]
mpi/g10m.c [deleted file]
mpi/generic/distfiles [deleted file]
mpi/generic/mpi-asm-defs.h [deleted file]
mpi/generic/mpih-add1.c [deleted file]
mpi/generic/mpih-lshift.c [deleted file]
mpi/generic/mpih-mul1.c [deleted file]
mpi/generic/mpih-mul2.c [deleted file]
mpi/generic/mpih-mul3.c [deleted file]
mpi/generic/mpih-rshift.c [deleted file]
mpi/generic/mpih-sub1.c [deleted file]
mpi/generic/udiv-w-sdiv.c [deleted file]
mpi/hppa/README [deleted file]
mpi/hppa/distfiles [deleted file]
mpi/hppa/mpih-add1.S [deleted file]
mpi/hppa/mpih-lshift.S [deleted file]
mpi/hppa/mpih-rshift.S [deleted file]
mpi/hppa/mpih-sub1.S [deleted file]
mpi/hppa/udiv-qrnnd.S [deleted file]
mpi/hppa1.1/distfiles [deleted file]
mpi/hppa1.1/mpih-mul1.S [deleted file]
mpi/hppa1.1/mpih-mul2.S [deleted file]
mpi/hppa1.1/mpih-mul3.S [deleted file]
mpi/hppa1.1/udiv-qrnnd.S [deleted file]
mpi/i386-openbsd/README [deleted file]
mpi/i386-openbsd/distfiles [deleted file]
mpi/i386-openbsd/mpih-add1.S [deleted file]
mpi/i386-openbsd/mpih-lshift.S [deleted file]
mpi/i386-openbsd/mpih-mul1.S [deleted file]
mpi/i386-openbsd/mpih-mul2.S [deleted file]
mpi/i386-openbsd/mpih-mul3.S [deleted file]
mpi/i386-openbsd/mpih-rshift.S [deleted file]
mpi/i386-openbsd/mpih-sub1.S [deleted file]
mpi/i386-openbsd/syntax.h [deleted file]
mpi/i386/distfiles [deleted file]
mpi/i386/mpih-add1.S [deleted file]
mpi/i386/mpih-lshift.S [deleted file]
mpi/i386/mpih-mul1.S [deleted file]
mpi/i386/mpih-mul2.S [deleted file]
mpi/i386/mpih-mul3.S [deleted file]
mpi/i386/mpih-rshift.S [deleted file]
mpi/i386/mpih-sub1.S [deleted file]
mpi/i386/syntax.h [deleted file]
mpi/i586/README [deleted file]
mpi/i586/distfiles [deleted file]
mpi/i586/mpih-add1.S [deleted file]
mpi/i586/mpih-lshift.S [deleted file]
mpi/i586/mpih-mul1.S [deleted file]
mpi/i586/mpih-mul2.S [deleted file]
mpi/i586/mpih-mul3.S [deleted file]
mpi/i586/mpih-rshift.S [deleted file]
mpi/i586/mpih-sub1.S [deleted file]
mpi/longlong.h [deleted file]
mpi/m68k/distfiles [deleted file]
mpi/m68k/mc68020/distfiles [deleted file]
mpi/m68k/mc68020/mpih-mul1.S [deleted file]
mpi/m68k/mc68020/mpih-mul2.S [deleted file]
mpi/m68k/mc68020/mpih-mul3.S [deleted file]
mpi/m68k/mpih-add1.S [deleted file]
mpi/m68k/mpih-lshift.S [deleted file]
mpi/m68k/mpih-rshift.S [deleted file]
mpi/m68k/mpih-sub1.S [deleted file]
mpi/m68k/syntax.h [deleted file]
mpi/mips3/README [deleted file]
mpi/mips3/distfiles [deleted file]
mpi/mips3/mpi-asm-defs.h [deleted file]
mpi/mips3/mpih-add1.S [deleted file]
mpi/mips3/mpih-lshift.S [deleted file]
mpi/mips3/mpih-mul1.S [deleted file]
mpi/mips3/mpih-mul2.S [deleted file]
mpi/mips3/mpih-mul3.S [deleted file]
mpi/mips3/mpih-rshift.S [deleted file]
mpi/mips3/mpih-sub1.S [deleted file]
mpi/mpi-add.c [deleted file]
mpi/mpi-bit.c [deleted file]
mpi/mpi-cmp.c [deleted file]
mpi/mpi-div.c [deleted file]
mpi/mpi-gcd.c [deleted file]
mpi/mpi-inline.c [deleted file]
mpi/mpi-inline.h [deleted file]
mpi/mpi-internal.h [deleted file]
mpi/mpi-inv.c [deleted file]
mpi/mpi-mpow.c [deleted file]
mpi/mpi-mul.c [deleted file]
mpi/mpi-pow.c [deleted file]
mpi/mpi-scan.c [deleted file]
mpi/mpicoder.c [deleted file]
mpi/mpih-cmp.c [deleted file]
mpi/mpih-div.c [deleted file]
mpi/mpih-mul.c [deleted file]
mpi/mpiutil.c [deleted file]
mpi/pa7100/distfiles [deleted file]
mpi/pa7100/mpih-lshift.S [deleted file]
mpi/pa7100/mpih-rshift.S [deleted file]
mpi/power/distfiles [deleted file]
mpi/power/mpih-add1.S [deleted file]
mpi/power/mpih-lshift.S [deleted file]
mpi/power/mpih-mul1.S [deleted file]
mpi/power/mpih-mul2.S [deleted file]
mpi/power/mpih-mul3.S [deleted file]
mpi/power/mpih-rshift.S [deleted file]
mpi/power/mpih-sub1.S [deleted file]
mpi/powerpc32/distfiles [deleted file]
mpi/powerpc32/mpih-add1.S [deleted file]
mpi/powerpc32/mpih-lshift.S [deleted file]
mpi/powerpc32/mpih-mul1.S [deleted file]
mpi/powerpc32/mpih-mul2.S [deleted file]
mpi/powerpc32/mpih-mul3.S [deleted file]
mpi/powerpc32/mpih-rshift.S [deleted file]
mpi/powerpc32/mpih-sub1.S [deleted file]
mpi/powerpc32/syntax.h [deleted file]
mpi/powerpc64/distfiles [deleted file]
mpi/sparc32/distfiles [deleted file]
mpi/sparc32/mpih-add1.S [deleted file]
mpi/sparc32/mpih-lshift.S [deleted file]
mpi/sparc32/mpih-rshift.S [deleted file]
mpi/sparc32/udiv.S [deleted file]
mpi/sparc32v8/distfiles [deleted file]
mpi/sparc32v8/mpih-mul1.S [deleted file]
mpi/sparc32v8/mpih-mul2.S [deleted file]
mpi/sparc32v8/mpih-mul3.S [deleted file]
mpi/supersparc/distfiles [deleted file]
mpi/supersparc/udiv.S [deleted file]
po/Makefile.in.in [deleted file]
po/ca.po [deleted file]
po/cs.po [deleted file]
po/da.po [deleted file]
po/de.glo [deleted file]
po/de.po [deleted file]
po/el.po [deleted file]
po/eo.po [deleted file]
po/es.po [deleted file]
po/et.po [deleted file]
po/fr.po [deleted file]
po/gl.po [deleted file]
po/id.po [deleted file]
po/it.po [deleted file]
po/ja.po [deleted file]
po/nl.po [deleted file]
po/pl.po [deleted file]
po/pt.po [deleted file]
po/pt_BR.po [deleted file]
po/sv.po [deleted file]
po/tr.po [deleted file]
scd/ChangeLog [deleted file]
scd/Makefile.am [deleted file]
scd/card-common.h [deleted file]
scd/card-dinsig.c [deleted file]
scd/card-p15.c [deleted file]
scd/card.c [deleted file]
scd/command.c [deleted file]
scd/scdaemon.c [deleted file]
scd/scdaemon.h [deleted file]
scripts/ChangeLog [deleted file]
scripts/autogen.sh [deleted file]
scripts/build-riscos [deleted file]
scripts/build-w32 [deleted file]
scripts/commit [deleted file]
scripts/conf-riscos/Makefile [deleted file]
scripts/conf-riscos/include/config.h [deleted file]
scripts/conf-riscos/include/g10defs.h [deleted file]
scripts/config.guess [deleted file]
scripts/config.sub [deleted file]
scripts/distfiles [deleted file]
scripts/gnupg.spec.in [deleted file]
scripts/gnupgbug [deleted file]
scripts/log_accum [deleted file]
scripts/mail-to-translators [deleted file]
scripts/mk-gpg-texi [deleted file]
scripts/mk-w32-dist [deleted file]
scripts/mkdiff [deleted file]
scripts/mkinstalldirs [deleted file]
scripts/mksnapshot [deleted file]
scripts/mkwebpage [deleted file]
sm/ChangeLog [deleted file]
sm/Makefile.am [deleted file]
sm/base64.c [deleted file]
sm/call-agent.c [deleted file]
sm/call-dirmngr.c [deleted file]
sm/certchain.c [deleted file]
sm/certcheck.c [deleted file]
sm/certdump.c [deleted file]
sm/certlist.c [deleted file]
sm/certreqgen.c [deleted file]
sm/decrypt.c [deleted file]
sm/delete.c [deleted file]
sm/encrypt.c [deleted file]
sm/export.c [deleted file]
sm/fingerprint.c [deleted file]
sm/gpgsm.c [deleted file]
sm/gpgsm.h [deleted file]
sm/import.c [deleted file]
sm/keydb.c [deleted file]
sm/keylist.c [deleted file]
sm/server.c [deleted file]
sm/sign.c [deleted file]
sm/verify.c [deleted file]
stamp-h.in [deleted file]
tests/ChangeLog [deleted file]
tests/Makefile.am [deleted file]
tests/asschk.c [deleted file]
tests/inittests [deleted file]
tools/ChangeLog [deleted file]
tools/Makefile.am [deleted file]
tools/bftest.c [deleted file]
tools/clean-sat.c [deleted file]
tools/crlf.c [deleted file]
tools/gpgsplit.c [deleted file]
tools/lspgpot [deleted file]
tools/mail-signed-keys [deleted file]
tools/mk-tdata.c [deleted file]
tools/mpicalc.c [deleted file]
tools/ring-a-party [deleted file]
tools/shmtest.c [deleted file]
tools/signmany [deleted file]
util/ChangeLog [deleted file]
util/Makefile.am [deleted file]
util/argparse.c [deleted file]
util/dotlock.c [deleted file]
util/errors.c [deleted file]
util/fileutil.c [deleted file]
util/g10u.c [deleted file]
util/http.c [deleted file]
util/iobuf.c [deleted file]
util/logger.c [deleted file]
util/memory.c [deleted file]
util/miscutil.c [deleted file]
util/riscos.c [deleted file]
util/secmem.c [deleted file]
util/simple-gettext.c [deleted file]
util/strgutil.c [deleted file]
util/ttyio.c [deleted file]
util/w32reg.c [deleted file]
zlib/ChangeLog [deleted file]
zlib/Makefile.am [deleted file]
zlib/README [deleted file]
zlib/adler32.c [deleted file]
zlib/algorithm.doc [deleted file]
zlib/compress.c [deleted file]
zlib/crc32.c [deleted file]
zlib/deflate.c [deleted file]
zlib/deflate.h [deleted file]
zlib/example.c [deleted file]
zlib/infblock.c [deleted file]
zlib/infblock.h [deleted file]
zlib/infcodes.c [deleted file]
zlib/infcodes.h [deleted file]
zlib/inffast.c [deleted file]
zlib/inffast.h [deleted file]
zlib/inffixed.h [deleted file]
zlib/inflate.c [deleted file]
zlib/inftrees.c [deleted file]
zlib/inftrees.h [deleted file]
zlib/infutil.c [deleted file]
zlib/infutil.h [deleted file]
zlib/trees.c [deleted file]
zlib/trees.h [deleted file]
zlib/uncompr.c [deleted file]
zlib/zconf.h [deleted file]
zlib/zlib.h [deleted file]
zlib/zutil.c [deleted file]
zlib/zutil.h [deleted file]

diff --git a/ABOUT-NLS b/ABOUT-NLS
deleted file mode 100644 (file)
index 5fde45a..0000000
--- a/ABOUT-NLS
+++ /dev/null
@@ -1,324 +0,0 @@
-Notes on the Free Translation Project
-*************************************
-
-   Free software is going international!  The Free Translation Project
-is a way to get maintainers of free software, translators, and users all
-together, so that will gradually become able to speak many languages.
-A few packages already provide translations for their messages.
-
-   If you found this `ABOUT-NLS' file inside a distribution, you may
-assume that the distributed package does use GNU `gettext' internally,
-itself available at your nearest GNU archive site.  But you do _not_
-need to install GNU `gettext' prior to configuring, installing or using
-this package with messages translated.
-
-   Installers will find here some useful hints.  These notes also
-explain how users should proceed for getting the programs to use the
-available translations.  They tell how people wanting to contribute and
-work at translations should contact the appropriate team.
-
-   When reporting bugs in the `intl/' directory or bugs which may be
-related to internationalization, you should tell about the version of
-`gettext' which is used.  The information can be found in the
-`intl/VERSION' file, in internationalized packages.
-
-Quick configuration advice
-==========================
-
-   If you want to exploit the full power of internationalization, you
-should configure it using
-
-     ./configure --with-included-gettext
-
-to force usage of internationalizing routines provided within this
-package, despite the existence of internationalizing capabilities in the
-operating system where this package is being installed.  So far, only
-the `gettext' implementation in the GNU C library version 2 provides as
-many features (such as locale alias, message inheritance, automatic
-charset conversion or plural form handling) as the implementation here.
-It is also not possible to offer this additional functionality on top
-of a `catgets' implementation.  Future versions of GNU `gettext' will
-very likely convey even more functionality.  So it might be a good idea
-to change to GNU `gettext' as soon as possible.
-
-   So you need _not_ provide this option if you are using GNU libc 2 or
-you have installed a recent copy of the GNU gettext package with the
-included `libintl'.
-
-INSTALL Matters
-===============
-
-   Some packages are "localizable" when properly installed; the
-programs they contain can be made to speak your own native language.
-Most such packages use GNU `gettext'.  Other packages have their own
-ways to internationalization, predating GNU `gettext'.
-
-   By default, this package will be installed to allow translation of
-messages.  It will automatically detect whether the system already
-provides the GNU `gettext' functions.  If not, the GNU `gettext' own
-library will be used.  This library is wholly contained within this
-package, usually in the `intl/' subdirectory, so prior installation of
-the GNU `gettext' package is _not_ required.  Installers may use
-special options at configuration time for changing the default
-behaviour.  The commands:
-
-     ./configure --with-included-gettext
-     ./configure --disable-nls
-
-will respectively bypass any pre-existing `gettext' to use the
-internationalizing routines provided within this package, or else,
-_totally_ disable translation of messages.
-
-   When you already have GNU `gettext' installed on your system and run
-configure without an option for your new package, `configure' will
-probably detect the previously built and installed `libintl.a' file and
-will decide to use this.  This might be not what is desirable.  You
-should use the more recent version of the GNU `gettext' library.  I.e.
-if the file `intl/VERSION' shows that the library which comes with this
-package is more recent, you should use
-
-     ./configure --with-included-gettext
-
-to prevent auto-detection.
-
-   The configuration process will not test for the `catgets' function
-and therefore it will not be used.  The reason is that even an
-emulation of `gettext' on top of `catgets' could not provide all the
-extensions of the GNU `gettext' library.
-
-   Internationalized packages have usually many `po/LL.po' files, where
-LL gives an ISO 639 two-letter code identifying the language.  Unless
-translations have been forbidden at `configure' time by using the
-`--disable-nls' switch, all available translations are installed
-together with the package.  However, the environment variable `LINGUAS'
-may be set, prior to configuration, to limit the installed set.
-`LINGUAS' should then contain a space separated list of two-letter
-codes, stating which languages are allowed.
-
-Using This Package
-==================
-
-   As a user, if your language has been installed for this package, you
-only have to set the `LANG' environment variable to the appropriate
-`LL_CC' combination.  Here `LL' is an ISO 639 two-letter language code,
-and `CC' is an ISO 3166 two-letter country code.  For example, let's
-suppose that you speak German and live in Germany.  At the shell
-prompt, merely execute `setenv LANG de_DE' (in `csh'),
-`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
-This can be done from your `.login' or `.profile' file, once and for
-all.
-
-   You might think that the country code specification is redundant.
-But in fact, some languages have dialects in different countries.  For
-example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
-country code serves to distinguish the dialects.
-
-   Not all programs have translations for all languages.  By default, an
-English message is shown in place of a nonexistent translation.  If you
-understand other languages, you can set up a priority list of languages.
-This is done through a different environment variable, called
-`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
-for the purpose of message handling, but you still need to have `LANG'
-set to the primary language; this is required by other parts of the
-system libraries.  For example, some Swedish users who would rather
-read translations in German than English for when Swedish is not
-available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
-
-   In the `LANGUAGE' environment variable, but not in the `LANG'
-environment variable, `LL_CC' combinations can be abbreviated as `LL'
-to denote the language's main dialect.  For example, `de' is equivalent
-to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
-(Portuguese as spoken in Portugal) in this context.
-
-Translating Teams
-=================
-
-   For the Free Translation Project to be a success, we need interested
-people who like their own language and write it well, and who are also
-able to synergize with other translators speaking the same language.
-Each translation team has its own mailing list.  The up-to-date list of
-teams can be found at the Free Translation Project's homepage,
-`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
-area.
-
-   If you'd like to volunteer to _work_ at translating messages, you
-should become a member of the translating team for your own language.
-The subscribing address is _not_ the same as the list itself, it has
-`-request' appended.  For example, speakers of Swedish can send a
-message to `sv-request@li.org', having this message body:
-
-     subscribe
-
-   Keep in mind that team members are expected to participate
-_actively_ in translations, or at solving translational difficulties,
-rather than merely lurking around.  If your team does not exist yet and
-you want to start one, or if you are unsure about what to do or how to
-get started, please write to `translation@iro.umontreal.ca' to reach the
-coordinator for all translator teams.
-
-   The English team is special.  It works at improving and uniformizing
-the terminology in use.  Proven linguistic skill are praised more than
-programming skill, here.
-
-Available Packages
-==================
-
-   Languages are not equally supported in all packages.  The following
-matrix shows the current state of internationalization, as of September
-2001.  The matrix shows, in regard of each package, for which languages
-PO files have been submitted to translation coordination, with a
-translation percentage of at least 50%.
-
-     Ready PO files    bg cs da de el en eo es et fi fr gl he hr id it ja
-                     +----------------------------------------------------+
-     a2ps            |          []             []    []                   |
-     bash            |          []       [] []       []                   |
-     bfd             |                                                    |
-     binutils        |                               []                   |
-     bison           |          []          [] []    []                [] |
-     clisp           |          []    []    []       []                   |
-     cpio            |       [] []          []       [] []                |
-     diffutils       |       [] []       [] []       [] []       []       |
-     enscript        |          []                   []                   |
-     error           |                      []       []                   |
-     fetchmail       |                                                    |
-     fileutils       |    [] [] [] []       []       [] []             [] |
-     findutils       |       [] []          [] []    [] []       [] []    |
-     flex            |       []             []       []                   |
-     freetype        |                                                    |
-     gas             |                                                    |
-     gawk            |                               []    []             |
-     gcal            |                                                    |
-     gcc             |                                                    |
-     gettext         |    [] [] [] []       []       [] []       [] [] [] |
-     gnupg           |          []       []    []    [] []          [] [] |
-     gprof           |                                                    |
-     grep            |    []    []       [] [] []    [] []          []    |
-     hello           |       [] [] []    [] [] [] [] [] []          [] [] |
-     id-utils        |       [] []                   []                   |
-     indent          |       [] []             []    [] []                |
-     jpilot          |                               []                   |
-     kbd             |                                                    |
-     ld              |                               []                   |
-     libc            |    [] [] [] []       []       [] []             [] |
-     lilypond        |                                                 [] |
-     lynx            |    [] [] []                                     [] |
-     m4              |    [] [] [] []                [] []       []    [] |
-     make            |       [] []          []       [] []             [] |
-     mysecretdiary   |          []                                        |
-     nano            |                      []          []       []       |
-     opcodes         |                                                    |
-     parted          |          []                      []             [] |
-     ptx             |       [] []          [] []    [] []       []       |
-     python          |                                                    |
-     recode          |       [] [] []    [] []       [] [] []       []    |
-     sed             |    [] [] [] []    []    []    [] [] []    [] [] [] |
-     sh-utils        |    [] [] [] []       [] []    [] []          [] [] |
-     sharutils       |    [] [] [] []       []       [] []             [] |
-     sketch          |                                                    |
-     soundtracker    |          []          []          []                |
-     sp              |                                                    |
-     tar             |    [] [] []          [] []    []             [] [] |
-     texinfo         |    [] [] []       []          []                [] |
-     textutils       |    [] [] [] []       []       [] []             [] |
-     util-linux      |    [] []                                           |
-     wdiff           |       [] []             []                         |
-     wget            |    [] [] [] []       [] []    [] [] []          [] |
-                     +----------------------------------------------------+
-                       bg cs da de el en eo es et fi fr gl he hr id it ja
-                        0 14 24 32 11  1  8 23 13  1 33 22  4  0  7  9 18
-     
-                       ko lv nb nl nn no pl pt pt_BR ru sk sl sv tr uk zh
-                     +----------------------------------------------------+
-     a2ps            |          []                   []    []             |  6
-     bash            |                                                    |  4
-     bfd             |                                                    |  0
-     binutils        |                                                    |  1
-     bison           |                               []                   |  6
-     clisp           |          []                                        |  5
-     cpio            | []       []       []     []   []                   | 10
-     diffutils       |                   []          []       [] []       | 11
-     enscript        |          []              []   []                   |  5
-     error           |                                  []       []       |  4
-     fetchmail       |                                                    |  0
-     fileutils       | []       []       []     []   [] [] [] [] []       | 17
-     findutils       | []       []       []     []   []    [] [] []       | 16
-     flex            | []                            []       []          |  6
-     freetype        |                                                    |  0
-     gas             |                                                    |  0
-     gawk            |                                           []       |  3
-     gcal            |                                                    |  0
-     gcc             |                                                    |  0
-     gettext         | []                []     []   []    [] [] []    [] | 18
-     gnupg           |                   []                   [] []       | 10
-     gprof           |                                                    |  0
-     grep            |                   []                [] [] []       | 12
-     hello           | [] [] [] []    [] []          [] []    [] [] []    | 22
-     id-utils        |          []                   []       []          |  6
-     indent          | []       []       []          [] []    [] []       | 12
-     jpilot          |                                                    |  1
-     kbd             |                                           []       |  1
-     ld              |                                                    |  1
-     libc            | []    []       [] []     []      []    [] []       | 16
-     lilypond        |          []                            []          |  3
-     lynx            |          []              []   []       []          |  8
-     m4              |          []       []          []       []          | 12
-     make            | []       []       []     []   []          []       | 12
-     mysecretdiary   |                                                    |  1
-     nano            |                                        []          |  4
-     opcodes         |                                           []       |  1
-     parted          |          []                   []                   |  5
-     ptx             |       [] []    [] [] []       []       [] []       | 15
-     python          |                                                    |  0
-     recode          |                   []          []    [] []          | 13
-     sed             |          []              []   [] [] [] [] []       | 19
-     sh-utils        |       [] []    [] []     []   [] [] [] [] []    [] | 21
-     sharutils       |          []                   []       []          | 11
-     sketch          |                                                    |  0
-     soundtracker    |                                                    |  3
-     sp              |                                                    |  0
-     tar             |       []       [] []     []         [] [] []       | 15
-     texinfo         |                               []                   |  7
-     textutils       |       [] []    [] []     []   [] [] []             | 16
-     util-linux      |                          []               []       |  4
-     wdiff           |                               [] []    [] []       |  7
-     wget            |          []                   [] [] [] [] [] []    | 17
-                     +----------------------------------------------------+
-       33 teams        ko lv nb nl nn no pl pt pt_BR ru sk sl sv tr uk zh
-       53 domains       9  1  6 20  0  6 17  1  13   25 10 11 23 21  2  2  387
-
-   Some counters in the preceding matrix are higher than the number of
-visible blocks let us expect.  This is because a few extra PO files are
-used for implementing regional variants of languages, or language
-dialects.
-
-   For a PO file in the matrix above to be effective, the package to
-which it applies should also have been internationalized and
-distributed as such by its maintainer.  There might be an observable
-lag between the mere existence a PO file and its wide availability in a
-distribution.
-
-   If September 2001 seems to be old, you may fetch a more recent copy
-of this `ABOUT-NLS' file on most GNU archive sites.  The most
-up-to-date matrix with full percentage details can be found at
-`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
-
-Using `gettext' in new packages
-===============================
-
-   If you are writing a freely available program and want to
-internationalize it you are welcome to use GNU `gettext' in your
-package.  Of course you have to respect the GNU Library General Public
-License which covers the use of the GNU `gettext' library.  This means
-in particular that even non-free programs can use `libintl' as a shared
-library, whereas only free software can use `libintl' as a static
-library or use modified versions of `libintl'.
-
-   Once the sources are changed appropriately and the setup can handle
-to use of `gettext' the only thing missing are the translations.  The
-Free Translation Project is also available for packages which are not
-developed inside the GNU project.  Therefore the information given above
-applies also for every other Free Software Project.  Contact
-`translation@iro.umontreal.ca' to make the `.pot' files available to
-the translation teams.
-
diff --git a/BUGS b/BUGS
deleted file mode 100644 (file)
index 9cfdcd9..0000000
--- a/BUGS
+++ /dev/null
@@ -1,12 +0,0 @@
-Please see
-
-    http://www.gnupg.org/buglist.html
-
-for a list of know bugs in GnuPG.  We don't distribute this list anymore
-with the package because a more current one with notes in which version
-the bug is fixed can be found online.
-
-For security related bugs, please contact <security@gnupg.org> which
-directs mails only to the core developers.  If you need to encrypt the
-report you should use the public keys of the maintainer and of 2 or 3
-other active developers (consult the ChangeLog and AUTHORS).
diff --git a/INSTALL b/INSTALL
deleted file mode 100644 (file)
index 62ea076..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,231 +0,0 @@
-Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation,
-Inc.
-
-   This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-   These are generic installation instructions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
-for details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for variables by setting
-them in the environment.  You can do that on the command line like this:
-
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
-   By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of host the package
-will run on.  Usually `configure' can figure that out, but if it prints
-a message saying it cannot guess the host type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the host
-platform (i.e., that on which the generated programs will eventually be
-run) with `--host=TYPE'.  In this case, you should also specify the
-build platform with `--build=TYPE', because, in this case, it may not
-be possible to guess the build platform (it sometimes involves
-compiling and running simple test programs, and this can't be done if
-the compiler is a cross compiler).
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-   Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-will cause the specified gcc to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-`configure' Invocation
-======================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/NOTES b/NOTES
deleted file mode 100644 (file)
index 346dfa9..0000000
--- a/NOTES
+++ /dev/null
@@ -1,46 +0,0 @@
-Checking ElGamal signatures is really slow and the reason for the long 
-running time on parts o my keyring.  Because somekeys are also checked at startup, this is even worser.  I should invalidate my self signature with algo 16 or 20.
-
-
-SCO UnixWare/7.1.0  reported by Allan Clark <allanc@sco.com> for 0.9.8
-
-
-Some other reported cpu-vendor-os strings:
-
-    hppa1.1-hp-hpux10.20
-    mips-sgi-irix6.2
-    sparc-sun-solaris5.4
-    sparc-sun-sunos4.1.2
-    i386-pc-sysv4.2   (USL Unixware v1.1.2)
-    powerpc-ibm-aix4.3.2.0  John Payne <jcapayne@att.com>
-
-gpg 1.0.1 okay with MP-RAS 3.02.01 Edition 5 using gcc 2.95.2 and EGD
- By <CSpeicher@eisi.com>
-
-gpg 1.0.1 okay with 4.0.1 BSDI BSD/OS 4.0 i386
-
-
-rndw32 tested on:
-
-  Windows 98 4.10.1998 mit einem AMD-K6-2-450
-        Michael Engels <angel@dalrin.de>)
-
-  Windows 95 4.00.950a
-
-  Windows NT 4.00.1381
-
-
-
-  
-tried to compile GnuPG on AIX 4.3 on a power CPU based machine. It
-doesn't work out of the box but i found a way to do so:
-
- PowerPC based machines:
- CFLAGS="-g -O2 -mcpu=powerpc" ./configure --disable-asm --disable-dynload
-+--enable-static-rnd=egd
-
- Power1 and Power2 machines:
- CFLAGS="-g -O2 -mcpu=power" ./configure --disable-asm --disable-dynload
-+--enable-static-rnd=egd
-
-
diff --git a/OBUGS b/OBUGS
deleted file mode 100644 (file)
index 226514e..0000000
--- a/OBUGS
+++ /dev/null
@@ -1,102 +0,0 @@
-                  List of fixed bugs
-                 --------------------
-
-(format: severity: [  *] to [***], no, first reported, by, version)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-[  *] #1
-    pgp263in works fine even with a source file with CR,LF but GnuPG
-    and pgp263in has problems if the clearsign has been created by
-    pgp263ia.  The reason for this problem is that pgp2 sometimes
-    converts CR,LF to CR,CR,LF and to fix for this it hashes both
-    versions.  I was able to reproduce such a problem, that PGP263in
-    was not able to verify it's own signature.
-    FIX: 1999-05-19  (Most cases are now handled)
-
-[***] #2  1999-02-21
-    Problem while importing or deleting public keys in 0.9.3 - 0.9.2
-    worked fine.  Error message:
-    gpg:[stdin]: key A6A59DB9: secret key not found: public key not found
-    FIX: 1999-02-22 wk
-
-[  *] #5
-    /home/jam/.gnupg/pubring.gpg: can't open gdbm file: Can't be writer
-    keyblock resource `/home/jam/.gnupg/pubring.gpg': file open error
-    OOPS in close enum_keyblocks - ignored
-    [gdbm is experimental and will be replaced by the new keybox code]
-    FIX: 1999-07-22 (Fixed the second error, there will be no fix for
-    the first one, because GDBM is to be replaced)
-
-[  *] #7 1999-02-22 <dwpalmer@dwpalm.jf.intel.com> 0.9.3
-    Conventional encryption incompatibility:
-     $ gpg -c --cipher-algo cast5 --compress-algo 1 --no-comment secrets.txt
-    Creates a file that gpg can decrypt, but PGP 5.5 has problems with it.
-    PGP decrypts 6416k out of 6424k, then complains with "PGP Warning",
-    "The keyring contains a bad (corrupted) PGP packet".  The resulting
-    file is missing information from the front.
-    FIX: 1999-02-26 temporary fix in encrypt_simple()
-
-
-[  *] #8 1999-02-25 <kazu@iijlab.net> 0.9.3
-    %gpg --encrypt -r kazu@iijlab.net --batch foo
-    gpg: Warning: using insecure memory!
-    gpg: 11C23F61: no info to calculate a trust probability
-    This creates a symmetrically encrypted message WITHOUT a session key
-    encrypted with public cryptographic(i.e. foo.gpg). This is probably
-    FIX: 199-02-26 wk
-
-[ **] #9 1999-02-25
-    Misalignment in md5.c#md5_write.
-    FIX: 1999-02-26 wk
-
-[ **] #10 1999-03-01
-    Armor detection code is broken.  Direct import of keyrings is not possible.
-    FIX: 1999-03-02 wk
-
-[***] #11 1999-02-25
-    "cipher algo 10 not found".
-    FIX: 1999-02-25 wk
-
-[ **] #12 1999-03-10
-    gpg --list-secret-keys --with-colon SEGVs
-    FIX: 1999-03-10
-
-[  *] #13 1999-04-05
-    Trying to generate very large keys fails with a BUG in read_pool()
-    FIX: 1999-04-06
-
-
-[  *] #14 1999-04-05 <anonymous>
-    If you use --s2k-cipher-algo twofish, the the program crashes with
-    a BUG at line 226 of passphrase.c.
-    FIX: 1999-04-06
-
-
-[ **] #15 1999-04-05
-    Hash calculation for subkey bindings is not according to rfc2440 if
-    a 4 byte length header is used for the subkey.
-    FIX: 1999-04-06
-
-[***] #16 1999-03-23 <jafo@tummy.com>
-    Verifying detached signatures with an empty file yields a rc of 0.
-    FIX: 1999-05-06
-
-[ **] #17 1999-05-18 <Bodo_Moeller@public.uni-hamburg.de> 0.9.6
-    Import does not detect identical user IDs.
-    FIX: 1999-05-22
-
-[ **] #19 1999-06-11
-    "trustdb transaction too large" with about 500 signatures on a key
-    FAEBD5FC.
-    FIX: 1999-07-12  (less memory requirement and increased the limit)
-
-[ **] #20 1999-06-16 <jashley@yorktown.designlab.ukans.edu>  0.9.7
-    Using "addkey" in the edit menu with more than 1 subkey leads to
-    "out of secure memory" in some cases.
-    FIX: 1999-06-17  (Twofish uses too much memory and the memory
-    becomes fragmented - workaround is using CAST5 to protect passphrases)
-
-[  *] #21 1999-06-17
-    Ctrl-D does not work correct for messages entered at the tty.
-    FIX: 1999-06-18  (Better EOF detection on terminals)
-
diff --git a/PROJECTS b/PROJECTS
deleted file mode 100644 (file)
index d6725f7..0000000
--- a/PROJECTS
+++ /dev/null
@@ -1,46 +0,0 @@
-
-    * Change the internal representation of keyid into a struct which
-      can also hold the localid and extend the localid to hold information
-      of the subkey number because two subkeys may have the same keyid.
-
-    * Add a way to override the current cipher/md implementations
-      by others (using extensions)
-
-    * Not GnuPG related:  What about option completion in bash?
-      Can "--dump-options" be used for this or should we place the
-      options in an ELF note section?
-
-    * Split key support (n-out-of-m).  Use our own protocol or figure out
-      how PGP does it.
-
-    * add an option to re-create a public key from a secret key; we
-      can do this in trustdb.c:verify_own_keys. (special tool?)
-      Hmmm, we better drop the duplication of the public part and just keep
-      the secrets in the "secring" - this has the additional that we can
-      put those secrets on a hardware token.
-
-    * write a tool to extract selected keys from a file.
-
-    * Change the buffering to a mbuf like scheme?  See Michael's proposal.
-
-    * Keep a list of duplicate, faked or unwanted keyids.
-
-    * The current code has knowledge about the structure of a keyblock.
-      We should add an abstraction layer so that adding support for
-      different certificate structures will become easier.
-
-    * "Michael T. Babcock" <mbabcock@fibrespeed.net> suggested to write
-      an event log so that other software can display a key history or
-      alike with GnuPG results.  This should be connected to the keyrings.
-
-
-
- Copyright 1998, 1999, 2000, 2001 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/THOUGHTS b/THOUGHTS
deleted file mode 100644 (file)
index 25707c4..0000000
--- a/THOUGHTS
+++ /dev/null
@@ -1,275 +0,0 @@
-How often have we to do a key lookup by mailaddress?.
-can this be accomplished by an external program?
-
-
-
-What about using S-Exp to describe the interface to the ciphers instead
-of simply iterating over them. This way we can easy register a name which
-can be used as the "hintstr" for --load-extension.
-
-EGD
-====
-Oh, and on embedding egd into the gpg package: I think if you just unpack it
-into, say, util/egd/* then you can put something like this into configure.in:
-
-AC_CHECK_PROG(perl_present, perl, true, false)
-if $perl_present; then
- AC_PATH_PROG(PERL, perl)
- (cd util/egd; $PERL Makefile.PL FULLPERL=$PERL INSTALLBIN=$sbindir)
-fi
-AM_CONDITIONAL(WITH_EGD, $perl_present)
-
-and add util/egd to the top-level Makefile directory list inside a WITH_EGD
-conditional.
-
-    * What shall we do if we have a valid subkey revocation certificate
-      but no subkey binding?  Is this a valid but revoked key?
-
-    * use a mmaped file for secure memory if mlock does not work and
-      make sure that this file is always wiped out.  Is this really
-      more secure than swapping out to the swap disk?  I don't
-      believe so because if an attacker has access to the physical
-      box (and he needs this to look at the swap area) he can also
-      leave a Trojan horse which is far more easier than to analyze
-      memory dumps.  Question: Is it possible that a Unix pages
-      an old (left over by some other process) swap page in for
-      another process - this should be considered a serious design
-      flow/bug.
-
-Date: Mon, 4 Jan 1999 19:34:29 -0800 (PST)
-From: Matthew Skala <mskala@ansuz.sooke.bc.ca>
-
-- Signing with an expired key doesn't work by default, does work with a
-  special option.
-- Verifying a signature that appears to have been made by an expired key
-  after its expiry date but is otherwise good reports the signature as BAD,
-  preferably with a message indicating that it's a key-expiry problem rather
-  than a cryptographically bad signature.
-- Verifying a signature from a key that is now expired, where the
-  signature was made before the expiry date, reports the signature as
-  GOOD, possibly with a warning that the key has since expired.
-- Encrypting to an expired key doesn't work by default, does work with a
-  special option.
-- Decrypting always works, if you have the appropriate secret key and
-  passphrase.
-
-
-
-==============================
-[ "-->" indicates a comment by me (wk) ]
-
-Hi Werner..
-
-I was looking at some of the PROJECTS items in the recent gpg CVS and wanted
-to comment on one of them:
-
-  * Add a way to override the current cipher/md implementations
-    by others (using extensions)
-
-As you know I've been thinking about how to use a PalmPilot or an iButton in
-some useful way in GPG. The two things that seem reasonable are:
- 1) keep the secret key in the device, only transferring it to the host
-    computer for the duration of the secret-key operation (sign or decrypt).
-    The key is never kept on disk, only in RAM. This removes the chance that
-    casual snooping on your office workstation will reveal your key (it
-    doesn't help against an active attack, but the attacker must leave a
-    tampered version of GPG around or otherwise get their code to run while
-    the key-storage device is attached to attack the key)
- 2) perform the secret-key operation on the device, so the secret key never
-    leaves the confines of that device. There are still attacks possible,
-    based upon talking to the device while it is connected and trying to
-    convince the device (and possibly the user) that it is the real GPG,
-    but in general this protects the key pretty strongly. Any individual
-    message is still vulnerable, but that's a tradeoff of the convenience of
-    composing that message on a full-sized screen+keyboard (plus the added
-    speed of encryption) vs. the security of writing the message on a
-    secure device.
-
-I think there are a variety of ways of implementing these things, but a few
-extension mechanisms in GPG should be enough to try various ways later on.
-
-1) pass an argument string to loadable extension modules (maybe
-    gpg --load-extension foofish=arg1,arg2,arg3 ?)
-    --> could also be achived by S-Exps
-
-2) allow multiple instances of the same extension module (presumably with
-   different arguments)
-   --> set an alias name when loading them
-3) allow extension modules to use stdin/stdout/stderr as normal (probably
-   already in there), for giving feedback to the user, or possibly asking them
-   for a password of some sort
-   --> there should really be some kind of callback mechanism.
-
-4) have an extension to provide secret keys:
-
-   It looks like most of the hooks for this are already in place, it just
-   needs an extension module which can register itself as a keyblock resource.
-
-   I'm thinking of a module for this that is given an external program name as
-   an argument. When the keyblock resource is asked to enumerate its keys, it
-   runs the external program (first with a "0" argument, then a "1", and so on
-   until the program reports that no more keys are available). The external
---> better use a cookie:  This way we are also stateless but have a more
-   general interface.
-
-   program returns one (possibly armored) secret key block each time. The
-   program might have some kind of special protocol to talk to the storage
-   device.  One thing that comes to mind is to simply include a random number
-   in the message sent over the serial port: the program would display this
-   number, the Pilot at the other end would display the number it receives, if
-   the user sees that both are the same they instruct the Pilot to release the
-   key, as basic protection against someone else asking for the key while it
-   is attached. More sophisticated schemes are possible depending upon how
-   much processing power and IO is available on the device. But the same
-   extension module should be able to handle as complex a scheme as one could
-   wish.
-   --> authenticate the session on startup, using DH and the mentioned
-       cookie/screen/keyboard authentication.
-
-   The current keyblock-resource interface would work fine, although it
-   might be more convenient if a resource could be asked for a key by id
-   instead of enumerating all of them and then searching through the resulting
-   list for a match. A module that provided public keys would have to work this
-   way (imagine a module that could automatically do an http fetch for a
-   particular key.. easily-added automatic key fetching). Without that ability
-   to fetch by id (which would require it to fall back to the other keyblock
-   resources if it failed), the user's device might be asked to release the
-   key even though some other secret key was the one needed.
-   --> Right.
-
-
-5) have an extension to perform a secret-key operation without the actual
-   secret key material
-   --> Define a clear interface to do this and in the first step write
-       a daemon which does exactly this.
-
- basically something to indicate that any decrypt or sign operations that
- occur for a specific keyid should call the extension module instead. The
- secret key would not be extracted (it wouldn't be available anyway). The
- module is given the keyid and the MPI of the block it is supposed to sign
- or decrypt.
-
- The module could then run an external program to do the operation. I'm
- imagining a Pilot program which receives the data, asks the user if it can go
- along with the operation (after displaying a hash of the request, which is
- also displayed by the extension module's program to make sure the Pilot is
- being asked to do the right operation), performs the signature or decryption,
- then returns the data. This protocol could be made arbitrarily complex, with
- a D-H key to encrypt the link, and both sides signing requests to
- authenticate one to the other (although this transforms the the problem of
- getting your secret key off your office workstation into the problem of
- your workstation holding a key tells your Pilot that it is allowed to perform
- the secret key operation, and if someone gets a hold of that key they may
- be able to trick your pilot [plugged in somewhere else] to do the same thing
- for them).
-
- This is basically red/black separation, with the Pilot or iButton having the
- perimeter beyond which the red data doesn't pass. Better than the secret-key
- storage device but requires a lot more power on the device (the new iButtons
- with the exponentiator could do it, but it would take way too much code space
- on the old ones, although they would be fine for just carrying the keys).
-
-The signature code might need to be extended to verify the signature you just
-made, since an active intruder pretending to the the Pilot wouldn't be able to
-make a valid signature (but they might sign your message with a different key
-just to be annoying).
-
-Anyway, just wanted to share my thoughts on some possibilities. I've been
-carrying this little Java iButton on my keyring for months now, looking for
-something cool to do with it, and I think that secure storage for my GPG key
-would be just the right application.
-
-cheers,
- -Brian
-
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v0.4.5 (GNU/Linux)
-Comment: For info finger gcrypt@ftp.guug.de
-
-iD8DBQE2c5oZkDmgv9E5zEwRArAwAKDWV5fpTtbGPiMPgl2Bpp0gvhbfQgCgzJuY
-AmIQTk4s62/y2zMAHDdOzK0=
-=jr7m
------END PGP SIGNATURE-----
-
-
-
-About a new Keyserver  (discussion with Allan Clark <allanc@sco.com>):
-=====================
-
-Some ideas:
-
-o  the KS should verify signatures and only accept those
-   which are good.
-
-o  Keep a blacklist of known bad signatures to minimize
-   the time needed to check them
-
-o  Should be fast - I'm currently designing a new storage
-   system called keybox which takes advantage of the fact
-   that the keyID is highly random and can directly be
-   used as a hash value and this keyID is (for v4 keys)
-   part of the fingerprint: So it is possible to use the
-   fingerprint as key but do an lookup by the keyID.
-
-o  To be used as the "public keyring" in a LAN so that there
-   is no need to keep one on every machine.
-
-o  Allow more that one file for key storage.
-
-o  Use the HKS protocol and enhance it in a way that binary
-   keyrings can be transmitted.  (I already wrote some
-   http server and client code which can be used for this)
-   And extend it to allow reuse of a connection.
-
-o  Keep a checksum (hash) of the entire keyblock so that a
-   client can easy check whether this keyblock has changed.
-   (keyblock = the entire key with all certificates etc.)
-   Transmitted in the HEAD info.
-
-o  Allow efficient propagation of new keys and revocation
-   certificates.
-
-
-Probably more things but this keyserver is not a goal for the
-1.0 release. Someone should be able to fix some of the limitations
-of the existing key servers (I think they bail out on some rfc2440
-packet formats).
-
-
-DJGPP
-=====
-Don't use symlinks but try to do the preprocessing in the config-links script.
-DJPGG has problems to distinguish betwen .s and .S becaus the FAT filesystem
-is not case sensitive (Mark Elbrecht).
-Well, it runs only on one architecture and therefor it might be possible
-to add a special case for it, completely bypassing the symlink autselection
-trick.
-
-Special procmail addresses
-==========================
-  * foo+bar@example.net:  Try to match the address without the "+bar".
-    Should be done by the MUA, but maybe we can do this.
-    --> Yep.  Another reason to utilize a directory service or something
-       else for keylookup.
-
-
-
-Suggested things which I will not do:
-=====================================
-  * Let take --help an option to select some topics.
-    Using grep is much easier
-  * Check if an object (a message, detached sign, public key, or whatever)
-    is signed by definite user, i.e. define user
-    (userid, or any other unique identification) on command line.
-    --> Use a script and --status-fd
-
-
- Copyright 1998, 1999, 2000, 2001 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/agent/ChangeLog b/agent/ChangeLog
deleted file mode 100644 (file)
index c19193b..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-2002-09-25  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (handle_signal): Flush cache on SIGHUP.
-       * cache.c (agent_flush_cache): New.
-
-       * gpg-agent.c, agent.h: Add --keep-display and --keep-tty.
-       * query.c (start_pinentry): Implement them.  The option passing
-       needs more thoughts.
-
-2002-09-09  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (create_private_keys_directory)
-       (create_directories): New.
-       (main): Try to create a home directory.
-
-2002-09-04  Neal H. Walfield  <neal@g10code.de>
-
-       * gpg-agent.c (main): Use sigaction, not signal.
-
-2002-09-03  Neal H. Walfield  <neal@g10code.de>
-
-       * findkey.c: Include <fcntl.h>.
-       (agent_write_private_key): Prefer POSIX compatibity, open and
-       fdopen, over the simplicity of GNU extensions, fopen(file, "x").
-
-2002-08-22  Werner Koch  <wk@gnupg.org>
-
-       * query.c (agent_askpin): Provide the default desc text depending
-       on the pininfo.  Do the basic PIN verification only when
-       min_digits is set.
-
-2002-08-21  Werner Koch  <wk@gnupg.org>
-
-       * query.c (agent_askpin): Hack to show the right default prompt.
-       (agent_get_passphrase): Ditto.
-
-       * trans.c: Removed and replaced all usages with standard _()
-
-       * divert-scd.c (getpin_cb): Pass a more descritive text to the
-       pinentry.
-
-       * Makefile.am: Renamed the binary protect-tool to gpg-protect-tool.
-       * protect-tool.c: Removed the note about internal use only.
-
-       * gpg-agent.c (main): New option --daemon so that the program is
-       not accidently started in the background.
-
-2002-08-16  Werner Koch  <wk@gnupg.org>
-
-       * call-scd.c (learn_status_cb): Handle CERTINFO status.
-       (agent_card_learn): Add args for certinfo cb.
-       * learncard.c (release_certinfo,certinfo_cb): New.
-       (send_cert_back): New. With factored out code from ..
-       (agent_handle_learn): here.  Return certinfo stuff.
-
-2002-07-26  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (main): New option --ignore-cache-for-signing.
-       * command.c (option_handler): New server option
-       use-cache-for-signing defaulting to true.
-       (cmd_pksign): handle global and per session option.
-       * findkey.c (agent_key_from_file, unprotect): New arg
-       ignore_cache.  Changed all callers.
-       * pksign.c (agent_pksign): Likewise.
-
-2002-06-29  Werner Koch  <wk@gnupg.org>
-
-       * query.c (start_pinentry): Use GNUPG_DERAULT_PINENTRY.
-       * call-scd.c (start_scd): Use GNUPG_DEFAULT_SCDAEMON.
-
-2002-06-28  Werner Koch  <wk@gnupg.org>
-
-       * protect-tool.c (export_p12_file): New.
-       (main): New command --p12-export.
-       * minip12.c (create_final,p12_build,compute_tag_length): New.
-       (store_tag_length): New.
-
-2002-06-27  Werner Koch  <wk@gnupg.org>
-
-       * minip12.c (crypt_block): Renamed from decrypt_block, add arg to
-       allow encryption.
-
-       * Makefile.am (pkglib_PROGRAMS): Put protect-tool there.
-
-       * findkey.c (agent_write_private_key,agent_key_from_file)
-       (agent_key_available): Use GNUPG_PRIVATE_KEYS_DIR constant.
-       * gpg-agent.c (main): Use GNUPG_DEFAULT_HOMEDIR constant.
-
-       * protect-tool.c (store_private_key): New.
-       (import_p12_file): Store the new file if requested.
-       (main): New options --force and --store.
-
-       * gpg-agent.c (main): Set a global flag when running detached.
-       * query.c (start_pinentry): Pass the list of FD to keep in the
-       child when not running detached.
-       * call-scd.c (start_scd): Ditto.
-
-2002-06-26  Werner Koch  <wk@gnupg.org>
-
-       * command.c (cmd_istrusted, cmd_listtrusted, cmd_marktrusted)
-       (cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_get_passphrase)
-       (cmd_learn): Print an error message for a failed operation.
-
-       * simple-pwquery.c, simple-pwquery.h: New.
-       * protect-tool. (get_passphrase): New, used to get a passphrase
-       from the agent if none was given on the command line.
-
-2002-06-25  Werner Koch  <wk@gnupg.org>
-
-       * protect-tool.c (rsa_key_check): New.
-       (import_p12_file): New.
-       (main): New command --p12-import.
-       * minip12.c, minip12.h: New.
-
-2002-06-24  Werner Koch  <wk@gnupg.org>
-
-       * protect-tool.c (read_file): New.
-       (read_key): Factored most code out to read_file.
-
-2002-06-17  Werner Koch  <wk@gnupg.org>
-
-       * agent.h: Add a callback function to the pin_entry_info structure.
-       * query.c (agent_askpin): Use the callback to check for a correct
-       PIN.  Removed the start_err_text argument because it is not
-       anymore needed; changed callers.
-       * findkey.c (unprotect): Replace our own check loop by a callback.
-       (try_unprotect_cb): New.
-       * genkey.c (reenter_compare_cb): New.
-       (agent_genkey): Use this callback here.  Fixed setting of the pi2
-       variable and a segv in case of an empty PIN.
-
-       * divert-scd.c (getpin_cb): Removed some unused stuff and
-       explained what we still have to change.
-
-2002-06-12  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (main): New option --disable-pth.
-
-2002-06-11  Werner Koch  <wk@gnupg.org>
-
-       * protect-tool.c: Add command --show-keygrip
-       (show_keygrip): New.
-
-2002-05-23  Werner Koch  <wk@gnupg.org>
-
-       * call-scd.c: Seirialized all scdaeom access when using Pth.
-
-       * cache.c: Made the cache Pth-thread-safe.
-       (agent_unlock_cache_entry): New.
-       * findkey.c (unprotect): Unlock the returned cache value.
-       * command.c (cmd_get_passphrase): Ditto.
-
-       * gpg-agent.c (main): Register pth_read/write with Assuan.
-
-2002-05-22  Werner Koch  <wk@gnupg.org>
-
-       * query.c: Serialized all pinentry access when using Pth.
-
-       * gpg-agent.c (handle_signal,start_connection_thread)
-       (handle_connections): New
-       (main): Use the new Pth stuff to allow concurrent connections.
-       * command.c (start_command_handler): Add new arg FD so that the
-       fucntion can also be used for an already connected socket.
-       * Makefile.am: Link with Pth.
-
-2002-05-14  Werner Koch  <wk@gnupg.org>
-
-       * cache.c (housekeeping, agent_put_cache): Use our time() wrapper.
-
-2002-04-26  Werner Koch  <wk@gnupg.org>
-
-       * cache.c (agent_put_cache): Reinitialize the creation time and
-       the ttl when reusing a slot.
-
-       * call-scd.c (start_scd): Print debug messages only with debug
-       flags set.
-       * query.c (start_pinentry): Ditto.
-
-2002-04-25  Marcus Brinkmann  <marcus@g10code.de>
-
-       * agent.h (agent_get_confirmation): Replace paramter prompt with
-       two parameters ok and cancel.
-       * query.c (agent_get_confirmation): Likewise.  Implement this.
-       * trustlist.c (agent_marktrusted): Fix invocation of
-       agent_get_confirmation.
-       * divert-scd.c (ask_for_card): Likewise.
-
-2002-04-24  Marcus Brinkmann  <marcus@g10code.de>
-
-       * agent.h (struct opt): Add members display, ttyname, ttytype,
-       lc_ctype, and lc_messages.
-       * gpg-agent.c (enum cmd_and_opt_values): Add oDisplay, oTTYname,
-       oTTYtype, oLCctype, and LCmessages.
-       (main): Handle these options.
-       * command.c (option_handler): New function.
-       (register_commands): Register option handler.
-       * query.c (start_pinentry): Pass the various display and tty
-       options to the pinentry.
-
-2002-04-05  Werner Koch  <wk@gnupg.org>
-
-       * protect-tool.c (show_file): New.  Used as default action.
-
-2002-03-28  Werner Koch  <wk@gnupg.org>
-
-       * divert-scd.c (encode_md_for_card): Don't do the pkcs-1 padding,
-       the scdaemon should take care of it.
-       (ask_for_card): Hack to not display the trailing zero.
-
-2002-03-11  Werner Koch  <wk@gnupg.org>
-
-       * learncard.c (kpinfo_cb): Remove the content restrictions from
-       the keyID.
-
-2002-03-06  Werner Koch  <wk@gnupg.org>
-
-       * learncard.c: New.
-       * divert-scd.c (ask_for_card): The serial number is binary so
-       convert it to hex here.
-       * findkey.c (agent_write_private_key): New.
-       * genkey.c (store_key): And use it here.
-       
-       * pkdecrypt.c (agent_pkdecrypt): Changed the way the diversion is done.
-       * divert-scd.c (divert_pkdecrypt): Changed interface and
-       implemented it.
-
-2002-03-05  Werner Koch  <wk@gnupg.org>
-
-       * call-scd.c (inq_needpin): New.
-       (agent_card_pksign): Add getpin_cb args.
-       (agent_card_pkdecrypt): New.
-
-2002-03-04  Werner Koch  <wk@gnupg.org>
-
-       * pksign.c (agent_pksign): Changed how the diversion is done.
-       * divert-scd.c (divert_pksign): Changed interface and implemented it.
-       (encode_md_for_card): New.
-       * call-scd.c (agent_card_pksign): New.
-
-2002-02-28  Werner Koch  <wk@gnupg.org>
-
-       * pksign.c (agent_pksign): Detect whether a Smartcard is to be
-       used and divert the operation in this case.
-       * pkdecrypt.c (agent_pkdecrypt): Likewise
-       * findkey.c (agent_key_from_file): Add optional arg shadow_info
-       and have it return information about a shadowed key.
-       * protect.c (agent_get_shadow_info): New.
-
-       * protect.c (snext,sskip,smatch): Moved to
-       * sexp-parse.h: new file.
-       * divert-scd.c: New.
-       
-2002-02-27  Werner Koch  <wk@gnupg.org>
-
-       * protect.c (agent_shadow_key): New.
-
-       * command.c (cmd_learn): New command LEARN.
-       * gpg-agent.c: New option --scdaemon-program.
-       * call-scd.c (start_scd): New. Based on query.c
-       * query.c: Add 2 more arguments to all uses of assuan_transact.
-
-2002-02-18  Werner Koch  <wk@gnupg.org>
-
-       * findkey.c (unprotect): Show an error message for a bad passphrase.
-
-       * command.c (cmd_marktrusted): Implemented.
-       * trustlist.c (agent_marktrusted): New.
-       (open_list): Add APPEND arg.
-
-       * query.c (agent_get_confirmation): New.
-
-2002-02-06  Werner Koch  <wk@gnupg.org>
-
-       * cache.c (housekeeping): Fixed linking in the remove case.
-
-2002-02-01  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c: New option --default-cache-ttl.
-       * cache.c (agent_put_cache): Use it.
-       
-       * cache.c: Add a few debug outputs.
-
-       * protect.c (agent_private_key_type): New.
-       * agent.h: Add PRIVATE_KEY_ enums.
-       * findkey.c (agent_key_from_file): Use it to decide whether we
-       have to unprotect a key.
-       (unprotect): Cache the passphrase.
-       
-       * findkey.c (agent_key_from_file,agent_key_available): The key
-       files do now require a ".key" suffix to make a script's life
-       easier. 
-       * genkey.c (store_key): Ditto.
-
-2002-01-31  Werner Koch  <wk@gnupg.org>
-
-       * genkey.c (store_key): Protect the key.
-       (agent_genkey): Ask for the passphrase.
-       * findkey.c (unprotect): Actually unprotect the key.
-       * query.c (agent_askpin): Add an optional start_err_text. 
-
-2002-01-30  Werner Koch  <wk@gnupg.org>
-
-       * protect.c: New.  
-       (hash_passphrase): Based on the GnuPG 1.0.6 version.
-       * protect-tool.c: New
-
-2002-01-29  Werner Koch  <wk@gnupg.org>
-
-       * findkey.c (agent_key_available): New.
-       * command.c (cmd_havekey): New.
-       (register_commands): And register new command.
-
-2002-01-20  Werner Koch  <wk@gnupg.org>
-
-       * command.c (cmd_get_passphrase): Remove the plus signs.
-
-       * query.c (start_pinentry): Send no-grab option to pinentry
-       * gpg-agent.c (main): Move variable grab as no_grab to agent.h.
-
-2002-01-19  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (main): Disable core dumps.
-
-       * cache.c: New.
-       * command.c (cmd_get_passphrase): Use the cache.
-       (cmd_clear_passphrase): Ditto.
-
-       * gpg-agent.c:  Removed unused cruft and implement the socket
-       based server.
-       (my_strusage): Take bug report address from configure.ac.
-       * command.c (start_command_handler): Add an argument to start as
-       regular server.
-       (start_command_handler): Enable Assuan logging.
-
-2002-01-15  Werner Koch  <wk@gnupg.org>
-
-       * trustlist.c: New.
-       * command.c (cmd_istrusted, cmd_listtrusted, cmd_marktrusted): New.
-
-2002-01-07  Werner Koch  <wk@gnupg.org>
-
-       * genkey.c: Store the secret part and return the public part.
-
-2002-01-03  Werner Koch  <wk@gnupg.org>
-
-       * command.c (cmd_get_passphrase): New.
-       (cmd_clear_passphrase): New.
-       * query.c (agent_get_passphrase): New.
-
-2002-01-02  Werner Koch  <wk@gnupg.org>
-
-       * genkey.c: New.
-       * command.c (cmd_genkey): New.
-
-       * command.c (rc_to_assuan_status): Removed and changed all callers
-       to use map_to_assuan_status.
-       
-2001-12-19  Werner Koch  <wk@gnupg.org>
-
-       * keyformat.txt: New. 
-
-2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
-
-       * query.c (start_pinentry): Add new argument to assuan_pipe_connect.
-
-2001-12-18  Werner Koch  <wk@gnupg.org>
-
-       * Makefile.am: Use LIBGCRYPT macros
-
-2001-12-14  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (main): New option --batch.  New option --debug-wait
-       n, so that it is possible to attach gdb when used in server mode.
-       * query.c (agent_askpin): Don't ask in batch mode.
-
-       * command.c: Removed the conversion macros as they are now in
-       ../common/util.h.
-
-2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
-
-       * query.c (LINELENGTH): Removed.
-       (agent_askpin): Use ASSUAN_LINELENGTH, not LINELENGTH.
-
-2001-11-19  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c: Removed all GUI code, removed code for old
-       protocol.  New code to use the Assuan protocol as a server and
-       also to communicate with a new ask-passphrase utility.
-
-2000-11-22  Werner Koch  <wk@gnupg.org>
-
-       * gpg-agent.c (main): csh support by Dan Winship, new options --sh
-       and --csh and set default by consulting $SHELL.
-
-Mon Aug 21 17:59:17 CEST 2000  Werner Koch  <wk@openit.de>
-
-        * gpg-agent.c (passphrase_dialog): Cleanup the window and added the
-        user supplied text to the window.
-        (main): Fixed segv in gtk_init when used without a command to start.
-
-        * gpg-agent.c: --flush option.
-        (req_flush): New.
-        (req_clear_passphrase): Implemented.
-
-Fri Aug 18 14:27:14 CEST 2000  Werner Koch  <wk@openit.de>
-
-        * gpg-agent.c: New.
-        * Makefile.am: New.
-
-
- Copyright 2001, 2002 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/agent/Makefile.am b/agent/Makefile.am
deleted file mode 100644 (file)
index 89000cf..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright (C) 2001 Free Software Foundation, Inc.
-#
-# This file is part of GnuPG.
-#
-# GnuPG 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.
-# 
-# GnuPG 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
-
-## Process this file with automake to produce Makefile.in
-
-localedir = $(datadir)/locale
-INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"
-
-bin_PROGRAMS = gpg-agent
-pkglib_PROGRAMS = gpg-protect-tool
-
-AM_CPPFLAGS = -I$(top_srcdir)/common $(LIBGCRYPT_CFLAGS) $(PTH_CFLAGS)
-LDFLAGS = @LDFLAGS@ 
-
-gpg_agent_SOURCES = \
-       gpg-agent.c agent.h \
-       command.c \
-       query.c \
-       cache.c \
-       trans.c \
-       findkey.c \
-       pksign.c \
-       pkdecrypt.c \
-       genkey.c \
-       protect.c \
-       trustlist.c \
-       divert-scd.c \
-       call-scd.c \
-       learncard.c \
-       sexp-parse.h
-
-
-gpg_agent_LDADD = ../jnlib/libjnlib.a ../assuan/libassuan.a  \
-               ../common/libcommon.a $(LIBGCRYPT_LIBS) $(PTH_LIBS)
-
-gpg_protect_tool_SOURCES = \
-       protect-tool.c \
-       protect.c \
-       minip12.c minip12.h \
-       simple-pwquery.c simple-pwquery.h
-
-gpg_protect_tool_LDADD = ../jnlib/libjnlib.a \
-                    ../common/libcommon.a $(LIBGCRYPT_LIBS)
-
-
-
-
diff --git a/agent/agent.h b/agent/agent.h
deleted file mode 100644 (file)
index 24267b0..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/* agent.h - Global definitions for the agent
- *     Copyright (C) 2001 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#ifndef AGENT_H
-#define AGENT_H
-
-#include <gcrypt.h>
-#include "../common/util.h"
-#include "../common/errors.h"
-
-#define MAX_DIGEST_LEN 24 
-
-/* A large struct name "opt" to keep global flags */
-struct {
-  unsigned int debug; /* debug flags (DBG_foo_VALUE) */
-  int verbose;      /* verbosity level */
-  int quiet;        /* be as quiet as possible */
-  int dry_run;      /* don't change any persistent data */
-  int batch;        /* batch mode */
-  const char *homedir; /* configuration directory name */
-  const char *pinentry_program; 
-  char *display;
-  char *ttyname;
-  char *ttytype;
-  char *lc_ctype;
-  char *lc_messages;
-  const char *scdaemon_program; 
-  int no_grab;      /* don't let the pinentry grab the keyboard */
-  unsigned long def_cache_ttl;
-
-  int running_detached; /* we are running detached from the tty. */
-
-  int ignore_cache_for_signing;
-  int keep_tty;  /* don't switch the TTY (for pinentry) on request */
-  int keep_display;  /* don't switch the DISPLAY (for pinentry) on request */
-} opt;
-
-
-#define DBG_COMMAND_VALUE 1    /* debug commands i/o */
-#define DBG_MPI_VALUE    2     /* debug mpi details */
-#define DBG_CRYPTO_VALUE  4    /* debug low level crypto */
-#define DBG_MEMORY_VALUE  32   /* debug memory allocation stuff */
-#define DBG_CACHE_VALUE   64   /* debug the caching */
-#define DBG_MEMSTAT_VALUE 128  /* show memory statistics */
-#define DBG_HASHING_VALUE 512  /* debug hashing operations */
-#define DBG_ASSUAN_VALUE 1024   
-
-#define DBG_COMMAND (opt.debug & DBG_COMMAND_VALUE)
-#define DBG_CRYPTO  (opt.debug & DBG_CRYPTO_VALUE)
-#define DBG_MEMORY  (opt.debug & DBG_MEMORY_VALUE)
-#define DBG_CACHE   (opt.debug & DBG_CACHE_VALUE)
-#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE)
-#define DBG_ASSUAN  (opt.debug & DBG_ASSUAN_VALUE)
-
-struct server_local_s;
-
-struct server_control_s {
-  struct server_local_s *server_local;
-  struct {
-    int algo;
-    unsigned char value[MAX_DIGEST_LEN];
-    int valuelen;
-  } digest;
-  char keygrip[20];
-  int have_keygrip;
-
-};
-typedef struct server_control_s *CTRL;
-
-
-struct pin_entry_info_s {
-  int min_digits; /* min. number of digits required or 0 for freeform entry */
-  int max_digits; /* max. number of allowed digits allowed*/
-  int max_tries;
-  int failed_tries;
-  int (*check_cb)(struct pin_entry_info_s *); /* CB used to check the PIN */
-  void *check_cb_arg;  /* optional argument which might be of use in the CB */
-  const char *cb_errtext; /* used by the cb to displaye a specific error */
-  size_t max_length; /* allocated length of the buffer */
-  char pin[1];
-};
-
-
-enum {
-  PRIVATE_KEY_UNKNOWN = 0,
-  PRIVATE_KEY_CLEAR = 1,
-  PRIVATE_KEY_PROTECTED = 2,
-  PRIVATE_KEY_SHADOWED = 3
-};
-
-/*-- gpg-agent.c --*/
-void agent_exit (int rc); /* also implemented in other tools */
-
-/*-- command.c --*/
-void start_command_handler (int, int);
-
-/*-- findkey.c --*/
-int agent_write_private_key (const unsigned char *grip,
-                             const void *buffer, size_t length, int force);
-GCRY_SEXP agent_key_from_file (const unsigned char *grip,
-                               unsigned char **shadow_info, int ignore_cache);
-int agent_key_available (const unsigned char *grip);
-
-/*-- query.c --*/
-int agent_askpin (const char *desc_text, struct pin_entry_info_s *pininfo);
-int agent_get_passphrase (char **retpass,
-                          const char *desc, const char *prompt,
-                          const char *errtext);
-int agent_get_confirmation (const char *desc, const char *ok,
-                           const char *cancel);
-
-/*-- cache.c --*/
-void agent_flush_cache (void);
-int agent_put_cache (const char *key, const char *data, int ttl);
-const char *agent_get_cache (const char *key, void **cache_id);
-void agent_unlock_cache_entry (void **cache_id);
-
-
-/*-- pksign.c --*/
-int agent_pksign (CTRL ctrl, FILE *outfp, int ignore_cache);
-
-/*-- pkdecrypt.c --*/
-int agent_pkdecrypt (CTRL ctrl, const char *ciphertext, size_t ciphertextlen,
-                     FILE *outfp);
-
-/*-- genkey.c --*/
-int agent_genkey (CTRL ctrl,
-                  const char *keyparam, size_t keyparmlen, FILE *outfp);
-
-/*-- protect.c --*/
-int agent_protect (const unsigned char *plainkey, const char *passphrase,
-                   unsigned char **result, size_t *resultlen);
-int agent_unprotect (const unsigned char *protectedkey, const char *passphrase,
-                     unsigned char **result, size_t *resultlen);
-int agent_private_key_type (const unsigned char *privatekey);
-int agent_shadow_key (const unsigned char *pubkey,
-                      const unsigned char *shadow_info,
-                      unsigned char **result);
-int agent_get_shadow_info (const unsigned char *shadowkey,
-                           unsigned char const **shadow_info);
-
-
-/*-- trustlist.c --*/
-int agent_istrusted (const char *fpr);
-int agent_listtrusted (void *assuan_context);
-int agent_marktrusted (const char *name, const char *fpr, int flag);
-
-
-/*-- divert-scd.c --*/
-int divert_pksign (const unsigned char *digest, size_t digestlen, int algo,
-                   const unsigned char *shadow_info, unsigned char **r_sig);
-int divert_pkdecrypt (const unsigned char *cipher,
-                      const unsigned char *shadow_info,
-                      char **r_buf, size_t *r_len);
-
-/*-- call-scd.c --*/
-int agent_card_learn (void (*kpinfo_cb)(void*, const char *),
-                      void *kpinfo_cb_arg,
-                      void (*certinfo_cb)(void*, const char *),
-                      void *certinfo_cb_arg);
-int agent_card_serialno (char **r_serialno);
-int agent_card_pksign (const char *keyid,
-                       int (*getpin_cb)(void *, const char *, char*, size_t),
-                       void *getpin_cb_arg,
-                       const unsigned char *indata, size_t indatalen,
-                       char **r_buf, size_t *r_buflen);
-int agent_card_pkdecrypt (const char *keyid,
-                          int (*getpin_cb)(void *, const char *, char*,size_t),
-                          void *getpin_cb_arg,
-                          const unsigned char *indata, size_t indatalen,
-                          char **r_buf, size_t *r_buflen);
-int agent_card_readcert (const char *id, char **r_buf, size_t *r_buflen);
-int agent_card_readkey (const char *id, unsigned char **r_buf);
-
-
-/*-- learncard.c --*/
-int agent_handle_learn (void *assuan_context);
-
-
-#endif /*AGENT_H*/
diff --git a/agent/cache.c b/agent/cache.c
deleted file mode 100644 (file)
index 8f5bf9d..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-/* cache.c - keep a cache of passphrases
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <assert.h>
-
-#include "agent.h"
-
-struct secret_data_s {
-  int  totallen; /* this includes the padding */
-  int  datalen;  /* actual data length */
-  char data[1];
-};
-
-typedef struct cache_item_s *ITEM;
-struct cache_item_s {
-  ITEM next;
-  time_t created;
-  time_t accessed;
-  int  ttl;  /* max. lifetime given in seonds */
-  int lockcount;
-  struct secret_data_s *pw;
-  char key[1];
-};
-
-
-static ITEM thecache;
-
-
-static void
-release_data (struct secret_data_s *data)
-{
-   xfree (data);
-}
-
-static struct secret_data_s *
-new_data (const void *data, size_t length)
-{
-  struct secret_data_s *d;
-  int total;
-
-  /* we pad the data to 32 bytes so that it get more complicated
-     finding something out by watching allocation patterns.  This is
-     usally not possible but we better assume nothing about our
-     secure storage provider*/
-  total = length + 32 - (length % 32);
-
-  d = gcry_malloc_secure (sizeof d + total - 1);
-  if (d)
-    {
-      d->totallen = total;
-      d->datalen  = length;
-      memcpy (d->data, data, length);
-    }
-  return d;
-}
-
-
-/* check whether there are items to expire */
-static void
-housekeeping (void)
-{
-  ITEM r, rprev;
-  time_t current = gnupg_get_time ();
-
-  /* first expire the actual data */
-  for (r=thecache; r; r = r->next)
-    {
-      if (!r->lockcount && r->pw && r->accessed + r->ttl < current)
-        {
-          if (DBG_CACHE)
-            log_debug ("  expired `%s' (%ds after last access)\n",
-                       r->key, r->ttl);
-          release_data (r->pw);
-          r->pw = NULL;
-          r->accessed = current;
-        }
-    }
-
-  /* second, make sure that we also remove them based on the created stamp so
-     that the user has to enter it from time to time.  We do this every hour */
-  for (r=thecache; r; r = r->next)
-    {
-      if (!r->lockcount && r->pw && r->created + 60*60 < current)
-        {
-          if (DBG_CACHE)
-            log_debug ("  expired `%s' (1h after creation)\n", r->key);
-          release_data (r->pw);
-          r->pw = NULL;
-          r->accessed = current;
-        }
-    }
-
-  /* third, make sure that we don't have too many items in the list.
-     Expire old and unused entries after 30 minutes */
-  for (rprev=NULL, r=thecache; r; )
-    {
-      if (!r->pw && r->accessed + 60*30 < current)
-        {
-          if (r->lockcount)
-            {
-              log_error ("can't remove unused cache entry `%s' due to"
-                         " lockcount=%d\n",
-                         r->key, r->lockcount);
-              r->accessed += 60*10; /* next error message in 10 minutes */
-              rprev = r;
-              r = r->next;
-            }
-          else
-            {
-              ITEM r2 = r->next;
-              if (DBG_CACHE)
-                log_debug ("  removed `%s' (slot not used for 30m)\n", r->key);
-              xfree (r);
-              if (!rprev)
-                thecache = r2;
-              else
-                rprev->next = r2;
-              r = r2;
-            }
-        }
-      else
-        {
-          rprev = r;
-          r = r->next;
-        }
-    }
-}
-
-
-void
-agent_flush_cache (void)
-{
-  ITEM r;
-
-  if (DBG_CACHE)
-    log_debug ("agent_flush_cache\n");
-
-  for (r=thecache; r; r = r->next)
-    {
-      if (!r->lockcount && r->pw)
-        {
-          if (DBG_CACHE)
-            log_debug ("  flushing `%s'\n", r->key);
-          release_data (r->pw);
-          r->pw = NULL;
-          r->accessed = 0;
-        }
-      else if (r->lockcount && r->pw)
-        {
-          if (DBG_CACHE)
-            log_debug ("    marked `%s' for flushing\n", r->key);
-          r->accessed = 0;
-          r->ttl = 0;
-        }
-    }
-}
-
-
-
-/* Store DATA of length DATALEN in the cache under KEY and mark it
-   with a maximum lifetime of TTL seconds.  If there is already data
-   under this key, it will be replaced.  Using a DATA of NULL deletes
-   the entry */
-int
-agent_put_cache (const char *key, const char *data, int ttl)
-{
-  ITEM r;
-
-  if (DBG_CACHE)
-    log_debug ("agent_put_cache `%s'\n", key);
-  housekeeping ();
-
-  if (ttl < 1)
-    ttl = opt.def_cache_ttl;
-  if (!ttl)
-    return 0;
-
-  for (r=thecache; r; r = r->next)
-    {
-      if (!r->lockcount && !strcmp (r->key, key))
-        break;
-    }
-  if (r)
-    { /* replace */
-      if (r->pw)
-        {
-          release_data (r->pw);
-          r->pw = NULL;
-        }
-      if (data)
-        {
-          r->created = r->accessed = gnupg_get_time (); 
-          r->ttl = ttl;
-          r->pw = new_data (data, strlen (data)+1);
-          if (!r->pw)
-            log_error ("out of core while allocating new cache item\n");
-        }
-    }
-  else if (data)
-    { /* simply insert */
-      r = xtrycalloc (1, sizeof *r + strlen (key));
-      if (!r)
-        log_error ("out of core while allocating new cache control\n");
-      else
-        {
-          strcpy (r->key, key);
-          r->created = r->accessed = gnupg_get_time (); 
-          r->ttl = ttl;
-          r->pw = new_data (data, strlen (data)+1);
-          if (!r->pw)
-            {
-              log_error ("out of core while allocating new cache item\n");
-              xfree (r);
-            }
-          else
-            {
-              r->next = thecache;
-              thecache = r;
-            }
-        }
-    }
-  return 0;
-}
-
-
-/* Try to find an item in the cache */
-const char *
-agent_get_cache (const char *key, void **cache_id)
-{
-  ITEM r;
-
-  if (DBG_CACHE)
-    log_debug ("agent_get_cache `%s'...\n", key);
-  housekeeping ();
-
-  /* first try to find one with no locks - this is an updated cache
-     entry: We might have entries with a lockcount and without a
-     lockcount. */
-  for (r=thecache; r; r = r->next)
-    {
-      if (!r->lockcount && r->pw && !strcmp (r->key, key))
-        {
-          /* put_cache does only put strings into the cache, so we
-             don't need the lengths */
-          r->accessed = gnupg_get_time ();
-          if (DBG_CACHE)
-            log_debug ("... hit\n");
-          r->lockcount++;
-          *cache_id = r;
-          return r->pw->data;
-        }
-    }
-  /* again, but this time get even one with a lockcount set */
-  for (r=thecache; r; r = r->next)
-    {
-      if (r->pw && !strcmp (r->key, key))
-        {
-          r->accessed = gnupg_get_time ();
-          if (DBG_CACHE)
-            log_debug ("... hit (locked)\n");
-          r->lockcount++;
-          *cache_id = r;
-          return r->pw->data;
-        }
-    }
-  if (DBG_CACHE)
-    log_debug ("... miss\n");
-
-  *cache_id = NULL;
-  return NULL;
-}
-
-
-void
-agent_unlock_cache_entry (void **cache_id)
-{
-  ITEM r;
-
-  for (r=thecache; r; r = r->next)
-    {
-      if (r == *cache_id)
-        {
-          if (!r->lockcount)
-            log_error ("trying to unlock non-locked cache entry `%s'\n",
-                       r->key);
-          else
-            r->lockcount--;
-          return;
-        }
-    }
-}
diff --git a/agent/call-scd.c b/agent/call-scd.c
deleted file mode 100644 (file)
index a9123da..0000000
+++ /dev/null
@@ -1,592 +0,0 @@
-/* call-scd.c - fork of the scdaemon to do SC operations
- *     Copyright (C) 2001, 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-/* Fixme: For now we have serialized all access to the scdaemon which
-   make sense becuase the scdaemon can't handle concurrent connections
-   right now.  We should however keep a list of connections and lock
-   just that connection - it migth make sense to implemtn parts of
-   this in Assuan.*/
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#ifdef USE_GNU_PTH
-# include <pth.h>
-#endif
-
-#include "agent.h"
-#include "../assuan/assuan.h"
-
-#ifdef _POSIX_OPEN_MAX
-#define MAX_OPEN_FDS _POSIX_OPEN_MAX
-#else
-#define MAX_OPEN_FDS 20
-#endif
-
-static ASSUAN_CONTEXT scd_ctx = NULL;
-#ifdef USE_GNU_PTH
-static pth_mutex_t scd_lock = PTH_MUTEX_INIT;
-#endif
-
-/* callback parameter for learn card */
-struct learn_parm_s {
-  void (*kpinfo_cb)(void*, const char *);
-  void *kpinfo_cb_arg;
-  void (*certinfo_cb)(void*, const char *);
-  void *certinfo_cb_arg;
-};
-
-struct inq_needpin_s {
-  ASSUAN_CONTEXT ctx;
-  int (*getpin_cb)(void *, const char *, char*, size_t);
-  void *getpin_cb_arg;
-};
-
-struct membuf {
-  size_t len;
-  size_t size;
-  char *buf;
-  int out_of_core;
-};
-
-
-\f
-/* A simple implementation of a dynamic buffer.  Use init_membuf() to
-   create a buffer, put_membuf to append bytes and get_membuf to
-   release and return the buffer.  Allocation errors are detected but
-   only returned at the final get_membuf(), this helps not to clutter
-   the code with out of core checks.  */
-
-static void
-init_membuf (struct membuf *mb, int initiallen)
-{
-  mb->len = 0;
-  mb->size = initiallen;
-  mb->out_of_core = 0;
-  mb->buf = xtrymalloc (initiallen);
-  if (!mb->buf)
-      mb->out_of_core = 1;
-}
-
-static void
-put_membuf (struct membuf *mb, const void *buf, size_t len)
-{
-  if (mb->out_of_core)
-    return;
-
-  if (mb->len + len >= mb->size)
-    {
-      char *p;
-      
-      mb->size += len + 1024;
-      p = xtryrealloc (mb->buf, mb->size);
-      if (!p)
-        {
-          mb->out_of_core = 1;
-          return;
-        }
-      mb->buf = p;
-    }
-  memcpy (mb->buf + mb->len, buf, len);
-  mb->len += len;
-}
-
-static void *
-get_membuf (struct membuf *mb, size_t *len)
-{
-  char *p;
-
-  if (mb->out_of_core)
-    {
-      xfree (mb->buf);
-      mb->buf = NULL;
-      return NULL;
-    }
-
-  p = mb->buf;
-  *len = mb->len;
-  mb->buf = NULL;
-  mb->out_of_core = 1; /* don't allow a reuse */
-  return p;
-}
-
-
-
-\f
-static int 
-unlock_scd (int rc)
-{
-#ifdef USE_GNU_PTH
-  if (!pth_mutex_release (&scd_lock))
-    {
-      log_error ("failed to release the SCD lock\n");
-      if (!rc)
-        rc = GNUPG_Internal_Error;
-    }
-#endif
-  return rc;
-}
-
-/* Fork off the SCdaemon if this has not already been done */
-static int
-start_scd (void)
-{
-  int rc;
-  const char *pgmname;
-  ASSUAN_CONTEXT ctx;
-  const char *argv[3];
-  int no_close_list[3];
-  int i;
-
-#ifdef USE_GNU_PTH
-  if (!pth_mutex_acquire (&scd_lock, 0, NULL))
-    {
-      log_error ("failed to acquire the SCD lock\n");
-      return GNUPG_Internal_Error;
-    }
-#endif
-
-  if (scd_ctx)
-    return 0; /* No need to serialize things because the agent is
-                 expected to tun as a single-thread (or may be in
-                 future using libpth) */
-
-  if (opt.verbose)
-    log_info ("no running SCdaemon - starting it\n");
-      
-  if (fflush (NULL))
-    {
-      log_error ("error flushing pending output: %s\n", strerror (errno));
-      return unlock_scd (seterr (Write_Error));
-    }
-
-  if (!opt.scdaemon_program || !*opt.scdaemon_program)
-    opt.scdaemon_program = GNUPG_DEFAULT_SCDAEMON;
-  if ( !(pgmname = strrchr (opt.scdaemon_program, '/')))
-    pgmname = opt.scdaemon_program;
-  else
-    pgmname++;
-
-  argv[0] = pgmname;
-  argv[1] = "--server";
-  argv[2] = NULL;
-
-  i=0;
-  if (!opt.running_detached)
-    {
-      if (log_get_fd () != -1)
-        no_close_list[i++] = log_get_fd ();
-      no_close_list[i++] = fileno (stderr);
-    }
-  no_close_list[i] = -1;
-
-  /* connect to the pinentry and perform initial handshaking */
-  rc = assuan_pipe_connect (&ctx, opt.scdaemon_program, (char**)argv,
-                            no_close_list);
-  if (rc)
-    {
-      log_error ("can't connect to the SCdaemon: %s\n",
-                 assuan_strerror (rc));
-      return unlock_scd (seterr (No_Scdaemon));
-    }
-  scd_ctx = ctx;
-  
-  if (DBG_ASSUAN)
-    log_debug ("connection to SCdaemon established\n");
-  return 0;
-}
-
-
-\f
-static AssuanError
-learn_status_cb (void *opaque, const char *line)
-{
-  struct learn_parm_s *parm = opaque;
-  const char *keyword = line;
-  int keywordlen;
-
-  for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
-    ;
-  while (spacep (line))
-    line++;
-  if (keywordlen == 8 && !memcmp (keyword, "CERTINFO", keywordlen))
-    {
-      parm->certinfo_cb (parm->certinfo_cb_arg, line);
-    }
-  else if (keywordlen == 11 && !memcmp (keyword, "KEYPAIRINFO", keywordlen))
-    {
-      parm->kpinfo_cb (parm->kpinfo_cb_arg, line);
-    }
-  else if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
-    {
-      log_debug ("learn_status_cb: serialno `%s'\n", line);
-    }
-  else
-    log_debug ("learn_status_cb: ignoring `%.*s'\n", keywordlen, keyword);
-  
-  return 0;
-}
-
-/* Perform the learn command and return a list of all private keys
-   stored on the card. */
-int
-agent_card_learn (void (*kpinfo_cb)(void*, const char *),
-                  void *kpinfo_cb_arg,
-                  void (*certinfo_cb)(void*, const char *),
-                  void *certinfo_cb_arg)
-{
-  int rc;
-  struct learn_parm_s parm;
-
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  memset (&parm, 0, sizeof parm);
-  parm.kpinfo_cb = kpinfo_cb;
-  parm.kpinfo_cb_arg = kpinfo_cb_arg;
-  parm.certinfo_cb = certinfo_cb;
-  parm.certinfo_cb_arg = certinfo_cb_arg;
-  rc = assuan_transact (scd_ctx, "LEARN --force",
-                        NULL, NULL, NULL, NULL,
-                        learn_status_cb, &parm);
-  if (rc)
-    return unlock_scd (map_assuan_err (rc));
-
-  return unlock_scd (0);
-}
-
-
-\f
-static AssuanError
-get_serialno_cb (void *opaque, const char *line)
-{
-  char **serialno = opaque;
-  const char *keyword = line;
-  const char *s;
-  int keywordlen, n;
-
-  for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
-    ;
-  while (spacep (line))
-    line++;
-
-  if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
-    {
-      if (*serialno)
-        return ASSUAN_Unexpected_Status;
-      for (n=0,s=line; hexdigitp (s); s++, n++)
-        ;
-      if (!n || (n&1)|| !(spacep (s) || !*s) )
-        return ASSUAN_Invalid_Status;
-      *serialno = xtrymalloc (n+1);
-      if (!*serialno)
-        return ASSUAN_Out_Of_Core;
-      memcpy (*serialno, line, n);
-      (*serialno)[n] = 0;
-    }
-  
-  return 0;
-}
-
-/* Return the serial number of the card or an appropriate error.  The
-   serial number is returned as a hexstring. */
-int
-agent_card_serialno (char **r_serialno)
-{
-  int rc;
-  char *serialno = NULL;
-
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  /* Hmm, do we really need this reset - scddaemon should do this or
-     we can do this if we for some reason figure out that the
-     operation might have failed due to a missing RESET.  Hmmm, I feel
-     this is really SCdaemon's duty */
-  rc = assuan_transact (scd_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL);
-  if (rc)
-    return unlock_scd (map_assuan_err (rc));
-
-  rc = assuan_transact (scd_ctx, "SERIALNO",
-                        NULL, NULL, NULL, NULL,
-                        get_serialno_cb, &serialno);
-  if (rc)
-    {
-      xfree (serialno);
-      return unlock_scd (map_assuan_err (rc));
-    }
-  *r_serialno = serialno;
-  return unlock_scd (0);
-}
-
-\f
-static AssuanError
-membuf_data_cb (void *opaque, const void *buffer, size_t length)
-{
-  struct membuf *data = opaque;
-
-  if (buffer)
-    put_membuf (data, buffer, length);
-  return 0;
-}
-  
-/* Handle the NEEDPIN inquiry. */
-static AssuanError
-inq_needpin (void *opaque, const char *line)
-{
-  struct inq_needpin_s *parm = opaque;
-  char *pin;
-  size_t pinlen;
-  int rc;
-
-  if (!(!strncmp (line, "NEEDPIN", 7) && (line[7] == ' ' || !line[7])))
-    {
-      log_error ("unsupported inquiry `%s'\n", line);
-      return ASSUAN_Inquire_Unknown;
-    }
-  line += 7;
-
-  pinlen = 90;
-  pin = gcry_malloc_secure (pinlen);
-  if (!pin)
-    return ASSUAN_Out_Of_Core;
-
-  rc = parm->getpin_cb (parm->getpin_cb_arg, line, pin, pinlen);
-  if (rc)
-    rc = ASSUAN_Canceled;
-  if (!rc)
-    rc = assuan_send_data (parm->ctx, pin, pinlen);
-  xfree (pin);
-
-  return rc;
-}
-
-
-
-/* Create a signature using the current card */
-int
-agent_card_pksign (const char *keyid,
-                   int (*getpin_cb)(void *, const char *, char*, size_t),
-                   void *getpin_cb_arg,
-                   const unsigned char *indata, size_t indatalen,
-                   char **r_buf, size_t *r_buflen)
-{
-  int rc, i;
-  char *p, line[ASSUAN_LINELENGTH];
-  struct membuf data;
-  struct inq_needpin_s inqparm;
-  size_t len;
-  unsigned char *sigbuf;
-  size_t sigbuflen;
-
-  *r_buf = NULL;
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  if (indatalen*2 + 50 > DIM(line))
-    return unlock_scd (seterr (General_Error));
-
-  sprintf (line, "SETDATA ");
-  p = line + strlen (line);
-  for (i=0; i < indatalen ; i++, p += 2 )
-    sprintf (p, "%02X", indata[i]);
-  rc = assuan_transact (scd_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
-  if (rc)
-    return unlock_scd (map_assuan_err (rc));
-
-  init_membuf (&data, 1024);
-  inqparm.ctx = scd_ctx;
-  inqparm.getpin_cb = getpin_cb;
-  inqparm.getpin_cb_arg = getpin_cb_arg;
-  snprintf (line, DIM(line)-1, "PKSIGN %s", keyid);
-  line[DIM(line)-1] = 0;
-  rc = assuan_transact (scd_ctx, line,
-                        membuf_data_cb, &data,
-                        inq_needpin, &inqparm,
-                        NULL, NULL);
-  if (rc)
-    {
-      xfree (get_membuf (&data, &len));
-      return unlock_scd (map_assuan_err (rc));
-    }
-  sigbuf = get_membuf (&data, &sigbuflen);
-
-  /* create an S-expression from it which is formatted like this:
-     "(7:sig-val(3:rsa(1:sSIGBUFLEN:SIGBUF)))" */
-  *r_buflen = 21 + 11 + sigbuflen + 4;
-  *r_buf = xtrymalloc (*r_buflen);
-  if (!*r_buf)
-    {
-      xfree (*r_buf);
-      return unlock_scd (GNUPG_Out_Of_Core);
-    }
-  p = stpcpy (*r_buf, "(7:sig-val(3:rsa(1:s" );
-  sprintf (p, "%u:", (unsigned int)sigbuflen);
-  p += strlen (p);
-  memcpy (p, sigbuf, sigbuflen);
-  p += sigbuflen;
-  strcpy (p, ")))");
-  xfree (sigbuf);
-
-  assert (gcry_sexp_canon_len (*r_buf, *r_buflen, NULL, NULL));
-  return unlock_scd (0);
-}
-
-/* Decipher INDATA using the current card. Note that the returned value is */
-int
-agent_card_pkdecrypt (const char *keyid,
-                   int (*getpin_cb)(void *, const char *, char*, size_t),
-                   void *getpin_cb_arg,
-                   const unsigned char *indata, size_t indatalen,
-                   char **r_buf, size_t *r_buflen)
-{
-  int rc, i;
-  char *p, line[ASSUAN_LINELENGTH];
-  struct membuf data;
-  struct inq_needpin_s inqparm;
-  size_t len;
-
-  *r_buf = NULL;
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  /* FIXME: use secure memory where appropriate */
-  if (indatalen*2 + 50 > DIM(line))
-    return unlock_scd (seterr (General_Error));
-
-  sprintf (line, "SETDATA ");
-  p = line + strlen (line);
-  for (i=0; i < indatalen ; i++, p += 2 )
-    sprintf (p, "%02X", indata[i]);
-  rc = assuan_transact (scd_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
-  if (rc)
-    return unlock_scd (map_assuan_err (rc));
-
-  init_membuf (&data, 1024);
-  inqparm.ctx = scd_ctx;
-  inqparm.getpin_cb = getpin_cb;
-  inqparm.getpin_cb_arg = getpin_cb_arg;
-  snprintf (line, DIM(line)-1, "PKDECRYPT %s", keyid);
-  line[DIM(line)-1] = 0;
-  rc = assuan_transact (scd_ctx, line,
-                        membuf_data_cb, &data,
-                        inq_needpin, &inqparm,
-                        NULL, NULL);
-  if (rc)
-    {
-      xfree (get_membuf (&data, &len));
-      return unlock_scd (map_assuan_err (rc));
-    }
-  *r_buf = get_membuf (&data, r_buflen);
-  if (!*r_buf)
-    return unlock_scd (GNUPG_Out_Of_Core);
-
-  return unlock_scd (0);
-}
-
-
-\f
-/* Read a certificate with ID into R_BUF and R_BUFLEN. */
-int
-agent_card_readcert (const char *id, char **r_buf, size_t *r_buflen)
-{
-  int rc;
-  char line[ASSUAN_LINELENGTH];
-  struct membuf data;
-  size_t len;
-
-  *r_buf = NULL;
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  init_membuf (&data, 1024);
-  snprintf (line, DIM(line)-1, "READCERT %s", id);
-  line[DIM(line)-1] = 0;
-  rc = assuan_transact (scd_ctx, line,
-                        membuf_data_cb, &data,
-                        NULL, NULL,
-                        NULL, NULL);
-  if (rc)
-    {
-      xfree (get_membuf (&data, &len));
-      return unlock_scd (map_assuan_err (rc));
-    }
-  *r_buf = get_membuf (&data, r_buflen);
-  if (!*r_buf)
-    return unlock_scd (GNUPG_Out_Of_Core);
-
-  return unlock_scd (0);
-}
-
-
-\f
-/* Read a key with ID and return it in an allocate buffer pointed to
-   by r_BUF as a valid S-expression. */
-int
-agent_card_readkey (const char *id, unsigned char **r_buf)
-{
-  int rc;
-  char line[ASSUAN_LINELENGTH];
-  struct membuf data;
-  size_t len, buflen;
-
-  *r_buf = NULL;
-  rc = start_scd ();
-  if (rc)
-    return rc;
-
-  init_membuf (&data, 1024);
-  snprintf (line, DIM(line)-1, "READKEY %s", id);
-  line[DIM(line)-1] = 0;
-  rc = assuan_transact (scd_ctx, line,
-                        membuf_data_cb, &data,
-                        NULL, NULL,
-                        NULL, NULL);
-  if (rc)
-    {
-      xfree (get_membuf (&data, &len));
-      return unlock_scd (map_assuan_err (rc));
-    }
-  *r_buf = get_membuf (&data, &buflen);
-  if (!*r_buf)
-    return unlock_scd (GNUPG_Out_Of_Core);
-
-  if (!gcry_sexp_canon_len (*r_buf, buflen, NULL, NULL))
-    {
-      xfree (*r_buf); *r_buf = NULL;
-      return unlock_scd (GNUPG_Invalid_Value);
-    }
-
-  return unlock_scd (0);
-}
-
-
-
diff --git a/agent/command.c b/agent/command.c
deleted file mode 100644 (file)
index 55ee8b8..0000000
+++ /dev/null
@@ -1,697 +0,0 @@
-/* command.c - gpg-agent command handler
- *     Copyright (C) 2001, 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-/* FIXME: we should not use the default assuan buffering but setup
-   some buffering in secure mempory to protect session keys etc. */
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-
-#include "agent.h"
-#include "../assuan/assuan.h"
-
-/* maximum allowed size of the inquired ciphertext */
-#define MAXLEN_CIPHERTEXT 4096
-/* maximum allowed size of the key parameters */
-#define MAXLEN_KEYPARAM 1024
-
-#define set_error(e,t) assuan_set_error (ctx, ASSUAN_ ## e, (t))
-
-
-#if MAX_DIGEST_LEN < 20
-#error MAX_DIGEST_LEN shorter than keygrip
-#endif
-
-/* Data used to associate an Assuan context with local server data */
-struct server_local_s {
-  ASSUAN_CONTEXT assuan_ctx;
-  int message_fd;
-  int use_cache_for_signing;
-};
-
-
-
-
-\f
-static void
-reset_notify (ASSUAN_CONTEXT ctx)
-{
-  CTRL ctrl = assuan_get_pointer (ctx);
-
-  memset (ctrl->keygrip, 0, 20);
-  ctrl->have_keygrip = 0;
-  ctrl->digest.valuelen = 0;
-}
-
-
-/* Check whether the option NAME appears in LINE */
-static int
-has_option (const char *line, const char *name)
-{
-  const char *s;
-  int n = strlen (name);
-
-  s = strstr (line, name);
-  return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n)));
-}
-
-
-
-
-/* ISTRUSTED <hexstring_with_fingerprint>
-
-   Return OK when we have an entry with this fingerprint in our
-   trustlist */
-static int
-cmd_istrusted (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc, n, i;
-  char *p;
-  char fpr[41];
-
-  /* parse the fingerprint value */
-  for (p=line,n=0; hexdigitp (p); p++, n++)
-    ;
-  if (*p || !(n == 40 || n == 32))
-    return set_error (Parameter_Error, "invalid fingerprint");
-  i = 0;
-  if (n==32)
-    {
-      strcpy (fpr, "00000000");
-      i += 8;
-    }
-  for (p=line; i < 40; p++, i++)
-    fpr[i] = *p >= 'a'? (*p & 0xdf): *p;
-  fpr[i] = 0;
-  rc = agent_istrusted (fpr);
-  if (!rc)
-    return 0;
-  else if (rc == -1)
-    return ASSUAN_Not_Trusted;
-  else
-    {
-      log_error ("command is_trusted failed: %s\n", gnupg_strerror (rc));
-      return map_to_assuan_status (rc);
-    }
-}
-
-/* LISTTRUSTED 
-
-   List all entries from the trustlist */
-static int
-cmd_listtrusted (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc = agent_listtrusted (ctx);
-  if (rc)
-    log_error ("command listtrusted failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-/* MARKTRUSTED <hexstring_with_fingerprint> <flag> <display_name>
-
-   Store a new key in into the trustlist*/
-static int
-cmd_marktrusted (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc, n, i;
-  char *p;
-  char fpr[41];
-  int flag;
-
-  /* parse the fingerprint value */
-  for (p=line,n=0; hexdigitp (p); p++, n++)
-    ;
-  if (!spacep (p) || !(n == 40 || n == 32))
-    return set_error (Parameter_Error, "invalid fingerprint");
-  i = 0;
-  if (n==32)
-    {
-      strcpy (fpr, "00000000");
-      i += 8;
-    }
-  for (p=line; i < 40; p++, i++)
-    fpr[i] = *p >= 'a'? (*p & 0xdf): *p;
-  fpr[i] = 0;
-  
-  while (spacep (p))
-    p++;
-  flag = *p++;
-  if ( (flag != 'S' && flag != 'P') || !spacep (p) )
-    return set_error (Parameter_Error, "invalid flag - must be P or S");
-  while (spacep (p))
-    p++;
-
-  rc = agent_marktrusted (p, fpr, flag);
-  if (rc)
-    log_error ("command marktrusted failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-
-\f
-/* HAVEKEY <hexstring_with_keygrip>
-  
-   Return success when the secret key is available */
-static int
-cmd_havekey (ASSUAN_CONTEXT ctx, char *line)
-{
-  int n;
-  char *p;
-  unsigned char buf[20];
-
-  /* parse the hash value */
-  for (p=line,n=0; hexdigitp (p); p++, n++)
-    ;
-  if (*p)
-    return set_error (Parameter_Error, "invalid hexstring");
-  if ((n&1))
-    return set_error (Parameter_Error, "odd number of digits");
-  n /= 2;
-  if (n != 20)
-    return set_error (Parameter_Error, "invalid length of keygrip");
-
-  for (p=line, n=0; n < 20; p += 2, n++)
-    buf[n] = xtoi_2 (p);
-
-  if (agent_key_available (buf))
-    return ASSUAN_No_Secret_Key;
-
-  return 0;
-}
-
-
-/* SIGKEY <hexstring_with_keygrip>
-   SETKEY <hexstring_with_keygrip>
-  
-   Set the  key used for a sign or decrypt operation */
-static int
-cmd_sigkey (ASSUAN_CONTEXT ctx, char *line)
-{
-  int n;
-  char *p;
-  CTRL ctrl = assuan_get_pointer (ctx);
-  unsigned char *buf;
-
-  /* parse the hash value */
-  for (p=line,n=0; hexdigitp (p); p++, n++)
-    ;
-  if (*p)
-    return set_error (Parameter_Error, "invalid hexstring");
-  if ((n&1))
-    return set_error (Parameter_Error, "odd number of digits");
-  n /= 2;
-  if (n != 20)
-    return set_error (Parameter_Error, "invalid length of keygrip");
-
-  buf = ctrl->keygrip;
-  for (p=line, n=0; n < 20; p += 2, n++)
-    buf[n] = xtoi_2 (p);
-  ctrl->have_keygrip = 1;
-  return 0;
-}
-
-/* SETHASH <algonumber> <hexstring> 
-
-  The client can use this command to tell the server about the data
-  (which usually is a hash) to be signed. */
-static int
-cmd_sethash (ASSUAN_CONTEXT ctx, char *line)
-{
-  int n;
-  char *p;
-  CTRL ctrl = assuan_get_pointer (ctx);
-  unsigned char *buf;
-  char *endp;
-  int algo;
-
-  /* parse the algo number and check it */
-  algo = (int)strtoul (line, &endp, 10);
-  for (line = endp; *line == ' ' || *line == '\t'; line++)
-    ;
-  if (!algo || gcry_md_test_algo (algo))
-    return set_error (Unsupported_Algorithm, NULL);
-  ctrl->digest.algo = algo;
-
-  /* parse the hash value */
-  for (p=line,n=0; hexdigitp (p); p++, n++)
-    ;
-  if (*p)
-    return set_error (Parameter_Error, "invalid hexstring");
-  if ((n&1))
-    return set_error (Parameter_Error, "odd number of digits");
-  n /= 2;
-  if (n != 16 && n != 20 && n != 24 && n != 32)
-    return set_error (Parameter_Error, "unsupported length of hash");
-  if (n > MAX_DIGEST_LEN)
-    return set_error (Parameter_Error, "hash value to long");
-
-  buf = ctrl->digest.value;
-  ctrl->digest.valuelen = n;
-  for (p=line, n=0; n < ctrl->digest.valuelen; p += 2, n++)
-    buf[n] = xtoi_2 (p);
-  for (; n < ctrl->digest.valuelen; n++)
-    buf[n] = 0;
-  return 0;
-}
-
-
-/* PKSIGN <options>
-
-   Perform the actual sign operation. Neither input nor output are
-   sensitive to eavesdropping */
-static int
-cmd_pksign (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc;
-  int ignore_cache = 0;
-  CTRL ctrl = assuan_get_pointer (ctx);
-
-  if (opt.ignore_cache_for_signing)
-    ignore_cache = 1;
-  else if (!ctrl->server_local->use_cache_for_signing)
-    ignore_cache = 1;
-
-  rc = agent_pksign (ctrl, assuan_get_data_fp (ctx), ignore_cache);
-  if (rc)
-    log_error ("command pksign failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-/* PKDECRYPT <options>
-
-   Perform the actual decrypt operation.  Input is not 
-   sensitive to eavesdropping */
-static int
-cmd_pkdecrypt (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc;
-  CTRL ctrl = assuan_get_pointer (ctx);
-  char *value;
-  size_t valuelen;
-
-  /* First inquire the data to decrypt */
-  rc = assuan_inquire (ctx, "CIPHERTEXT",
-                       &value, &valuelen, MAXLEN_CIPHERTEXT);
-  if (rc)
-    return rc;
-
-  rc = agent_pkdecrypt (ctrl, value, valuelen, assuan_get_data_fp (ctx));
-  xfree (value);
-  if (rc)
-    log_error ("command pkdecrypt failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-/* GENKEY
-
-   Generate a new key, store the secret part and return the public
-   part.  Here is an example transaction:
-
-   C: GENKEY
-   S: INQUIRE KEYPARM
-   C: D (genkey (rsa (nbits  1024)))
-   C: END
-   S: D (public-key
-   S: D   (rsa (n 326487324683264) (e 10001)))
-   S  OK key created
-*/
-
-static int
-cmd_genkey (ASSUAN_CONTEXT ctx, char *line)
-{
-  CTRL ctrl = assuan_get_pointer (ctx);
-  int rc;
-  char *value;
-  size_t valuelen;
-
-  /* First inquire the parameters */
-  rc = assuan_inquire (ctx, "KEYPARAM", &value, &valuelen, MAXLEN_KEYPARAM);
-  if (rc)
-    return rc;
-
-  rc = agent_genkey (ctrl, value, valuelen, assuan_get_data_fp (ctx));
-  xfree (value);
-  if (rc)
-    log_error ("command genkey failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-static void
-plus_to_blank (char *s)
-{
-  for (; *s; s++)
-    {
-      if (*s == '+')
-        *s = ' ';
-    }
-}
-
-/* GET_PASSPHRASE <cache_id> [<error_message> <prompt> <description>]
-
-   This function is usually used to ask for a passphrase to be used
-   for conventional encryption, but may also be used by programs which
-   need specal handling of passphrases.  This command uses a syntax
-   which helps clients to use the agent with minimum effort.  The
-   agent either returns with an error or with a OK followed by the hex
-   encoded passphrase.  Note that the length of the strings is
-   implicitly limited by the maximum length of a command.
-*/
-
-static int
-cmd_get_passphrase (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc;
-  const char *pw;
-  char *response;
-  char *cacheid = NULL, *desc = NULL, *prompt = NULL, *errtext = NULL;
-  char *p;
-  void *cache_marker;
-
-  /* parse the stuff */
-  for (p=line; *p == ' '; p++)
-    ;
-  cacheid = p;
-  p = strchr (cacheid, ' ');
-  if (p)
-    {
-      *p++ = 0;
-      while (*p == ' ')
-        p++;
-      errtext = p;
-      p = strchr (errtext, ' ');
-      if (p)
-        {
-          *p++ = 0;
-          while (*p == ' ')
-            p++;
-          prompt = p;
-          p = strchr (prompt, ' ');
-          if (p)
-            {
-              *p++ = 0;
-              while (*p == ' ')
-                p++;
-              desc = p;
-              p = strchr (desc, ' ');
-              if (p)
-                *p = 0; /* ignore garbage */
-            }
-        }
-    }
-  if (!cacheid || !*cacheid || strlen (cacheid) > 50)
-    return set_error (Parameter_Error, "invalid length of cacheID");
-  if (!desc)
-    return set_error (Parameter_Error, "no description given");
-
-  if (!strcmp (cacheid, "X"))
-    cacheid = NULL;
-  if (!strcmp (errtext, "X"))
-    errtext = NULL;
-  if (!strcmp (prompt, "X"))
-    prompt = NULL;
-  if (!strcmp (desc, "X"))
-    desc = NULL;
-
-  /* Note: we store the hexified versions in the cache. */
-  pw = cacheid ? agent_get_cache (cacheid, &cache_marker) : NULL;
-  if (pw)
-    {
-      assuan_begin_confidential (ctx);
-      rc = assuan_set_okay_line (ctx, pw);
-      agent_unlock_cache_entry (&cache_marker);
-    }
-  else
-    {
-      /* Note, that we only need to replace the + characters and
-         should leave the other escaping in place because the escaped
-         string is send verbatim to the pinentry which does the
-         unescaping (but not the + replacing) */
-      if (errtext)
-        plus_to_blank (errtext);
-      if (prompt)
-        plus_to_blank (prompt);
-      if (desc)
-        plus_to_blank (desc);
-
-      rc = agent_get_passphrase (&response, desc, prompt, errtext);
-      if (!rc)
-        {
-          if (cacheid)
-            agent_put_cache (cacheid, response, 0);
-          assuan_begin_confidential (ctx);
-          rc = assuan_set_okay_line (ctx, response);
-          xfree (response);
-        }
-    }
-
-  if (rc)
-    log_error ("command get_passphrase failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-/* CLEAR_PASSPHRASE <cache_id>
-
-   may be used to invalidate the cache entry for a passphrase.  The
-   function returns with OK even when there is no cached passphrase.
-*/
-
-static int
-cmd_clear_passphrase (ASSUAN_CONTEXT ctx, char *line)
-{
-  char *cacheid = NULL;
-  char *p;
-
-  /* parse the stuff */
-  for (p=line; *p == ' '; p++)
-    ;
-  cacheid = p;
-  p = strchr (cacheid, ' ');
-  if (p)
-    *p = 0; /* ignore garbage */
-  if (!cacheid || !*cacheid || strlen (cacheid) > 50)
-    return set_error (Parameter_Error, "invalid length of cacheID");
-
-  agent_put_cache (cacheid, NULL, 0);
-  return 0;
-}
-
-\f
-/* LEARN [--send]
-
-   Learn something about the currently inserted smartcard.  With
-   --send the new certificates are send back.  */
-static int
-cmd_learn (ASSUAN_CONTEXT ctx, char *line)
-{
-  int rc;
-
-  rc = agent_handle_learn (has_option (line, "--send")? ctx : NULL);
-  if (rc)
-    log_error ("command learn failed: %s\n", gnupg_strerror (rc));
-  return map_to_assuan_status (rc);
-}
-
-
-\f
-static int
-option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
-{
-   CTRL ctrl = assuan_get_pointer (ctx);
-
-  /* FIXME: We should not change opt. here.  It is not a problem right
-     now but as soon as we are allowing concurrent connections we mess
-     things up */
-  if (!strcmp (key, "display"))
-    {
-      if (opt.display)
-        free (opt.display);
-      opt.display = strdup (value);
-      if (!opt.display)
-        return ASSUAN_Out_Of_Core;
-    }
-  else if (!strcmp (key, "ttyname"))
-    {
-      if (opt.ttyname)
-        free (opt.ttyname);
-      opt.ttyname = strdup (value);
-      if (!opt.ttyname)
-        return ASSUAN_Out_Of_Core;
-    }
-  else if (!strcmp (key, "ttytype"))
-    {
-      if (opt.ttytype)
-        free (opt.ttytype);
-      opt.ttytype = strdup (value);
-      if (!opt.ttytype)
-        return ASSUAN_Out_Of_Core;
-    }
-  else if (!strcmp (key, "lc-ctype"))
-    {
-      if (opt.lc_ctype)
-        free (opt.lc_ctype);
-      opt.lc_ctype = strdup (value);
-      if (!opt.lc_ctype)
-        return ASSUAN_Out_Of_Core;
-    }
-  else if (!strcmp (key, "lc-messages"))
-    {
-      if (opt.lc_messages)
-        free (opt.lc_messages);
-      opt.lc_messages = strdup (value);
-      if (!opt.lc_messages)
-        return ASSUAN_Out_Of_Core;
-    }
-  else if (!strcmp (key, "use-cache-for-signing"))
-    ctrl->server_local->use_cache_for_signing = *value? atoi (value) : 0;
-  else
-    return ASSUAN_Invalid_Option;
-
-  return 0;
-}
-
-\f
-/* Tell the assuan library about our commands */
-static int
-register_commands (ASSUAN_CONTEXT ctx)
-{
-  static struct {
-    const char *name;
-    int cmd_id;
-    int (*handler)(ASSUAN_CONTEXT, char *line);
-  } table[] = {
-    { "ISTRUSTED",  0,  cmd_istrusted },
-    { "HAVEKEY",    0,  cmd_havekey },
-    { "SIGKEY",     0,  cmd_sigkey },
-    { "SETKEY",     0,  cmd_sigkey },
-    { "SETHASH",    0,  cmd_sethash },
-    { "PKSIGN",     0,  cmd_pksign },
-    { "PKDECRYPT",  0,  cmd_pkdecrypt },
-    { "GENKEY",     0,  cmd_genkey },
-    { "GET_PASSPHRASE",0, cmd_get_passphrase },
-    { "CLEAR_PASSPHRASE",0, cmd_clear_passphrase },
-    { "LISTTRUSTED",  0,  cmd_listtrusted },
-    { "MARKTRUSTED",  0,  cmd_marktrusted },
-    { "LEARN",        0,  cmd_learn },
-    { "",     ASSUAN_CMD_INPUT, NULL }, 
-    { "",     ASSUAN_CMD_OUTPUT, NULL }, 
-    { NULL }
-  };
-  int i, j, rc;
-
-  for (i=j=0; table[i].name; i++)
-    {
-      rc = assuan_register_command (ctx,
-                                    table[i].cmd_id? table[i].cmd_id
-                                                   : (ASSUAN_CMD_USER + j++),
-                                    table[i].name, table[i].handler);
-      if (rc)
-        return rc;
-    } 
-  assuan_register_reset_notify (ctx, reset_notify);
-  assuan_register_option_handler (ctx, option_handler);
-  return 0;
-}
-
-
-/* Startup the server.  If LISTEN_FD and FD is given as -1, this is a simple
-   piper server, otherwise it is a regular server */
-void
-start_command_handler (int listen_fd, int fd)
-{
-  int rc;
-  ASSUAN_CONTEXT ctx;
-  struct server_control_s ctrl;
-
-  memset (&ctrl, 0, sizeof ctrl);
-  
-  if (listen_fd == -1 && fd == -1)
-    {
-      int filedes[2];
-
-      filedes[0] = 0;
-      filedes[1] = 1;
-      rc = assuan_init_pipe_server (&ctx, filedes);
-    }
-  else if (listen_fd != -1)
-    {
-      rc = assuan_init_socket_server (&ctx, listen_fd);
-    }
-  else 
-    {
-      rc = assuan_init_connected_socket_server (&ctx, fd);
-    }
-  if (rc)
-    {
-      log_error ("failed to initialize the server: %s\n",
-                 assuan_strerror(rc));
-      agent_exit (2);
-    }
-  rc = register_commands (ctx);
-  if (rc)
-    {
-      log_error ("failed to register commands with Assuan: %s\n",
-                 assuan_strerror(rc));
-      agent_exit (2);
-    }
-
-  assuan_set_pointer (ctx, &ctrl);
-  ctrl.server_local = xcalloc (1, sizeof *ctrl.server_local);
-  ctrl.server_local->assuan_ctx = ctx;
-  ctrl.server_local->message_fd = -1;
-  ctrl.server_local->use_cache_for_signing = 1;
-
-  if (DBG_ASSUAN)
-    assuan_set_log_stream (ctx, log_get_stream ());
-
-  for (;;)
-    {
-      rc = assuan_accept (ctx);
-      if (rc == -1)
-        {
-          break;
-        }
-      else if (rc)
-        {
-          log_info ("Assuan accept problem: %s\n", assuan_strerror (rc));
-          break;
-        }
-      
-      rc = assuan_process (ctx);
-      if (rc)
-        {
-          log_info ("Assuan processing failed: %s\n", assuan_strerror (rc));
-          continue;
-        }
-    }
-
-
-  assuan_deinit_server (ctx);
-}
-
diff --git a/agent/divert-scd.c b/agent/divert-scd.c
deleted file mode 100644 (file)
index 40b6bcf..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-/* divert-scd.c - divert operations to the scdaemon 
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include "agent.h"
-#include "sexp-parse.h"
-#include "i18n.h"
-
-
-static int
-ask_for_card (const unsigned char *shadow_info, char **r_kid)
-{
-  int rc, i;
-  const unsigned char *s;
-  size_t n;
-  char *serialno;
-  int no_card = 0;
-  char *desc;
-  char *want_sn, *want_kid;
-  int want_sn_displen;
-
-  *r_kid = NULL;
-  s = shadow_info;
-  if (*s != '(')
-    return GNUPG_Invalid_Sexp;
-  s++;
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Invalid_Sexp;
-  want_sn = xtrymalloc (n*2+1);
-  if (!want_sn)
-    return GNUPG_Out_Of_Core;
-  for (i=0; i < n; i++)
-    sprintf (want_sn+2*i, "%02X", s[i]);
-  s += n;
-  /* We assume that a 20 byte serial number is a standard one which
-     seems to have the property to have a zero in the last nibble.  We
-     don't display this '0' because it may confuse the user */
-  want_sn_displen = strlen (want_sn);
-  if (want_sn_displen == 20 && want_sn[19] == '0')
-    want_sn_displen--;
-
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Invalid_Sexp;
-  want_kid = xtrymalloc (n+1);
-  if (!want_kid)
-    {
-      xfree (want_sn);
-      return GNUPG_Out_Of_Core;
-    }
-  memcpy (want_kid, s, n);
-  want_kid[n] = 0;
-
-  for (;;)
-    {
-      rc = agent_card_serialno (&serialno);
-      if (!rc)
-        {
-          log_debug ("detected card with S/N %s\n", serialno);
-          i = strcmp (serialno, want_sn);
-          xfree (serialno);
-          serialno = NULL;
-          if (!i)
-            {
-              xfree (want_sn);
-              *r_kid = want_kid;
-              return 0; /* yes, we have the correct card */
-            }
-        }
-      else if (rc == GNUPG_Card_Not_Present)
-        {
-          log_debug ("no card present\n");
-          rc = 0;
-          no_card = 1;
-        }
-      else
-        {
-          log_error ("error accesing card: %s\n", gnupg_strerror (rc));
-        }
-
-      if (!rc)
-        {
-          if (asprintf (&desc,
-                    "%s:%%0A%%0A"
-                    "  \"%.*s\"",
-                    no_card? "Please insert the card with serial number" 
-                    : "Please remove the current card and "
-                    "insert the one with serial number",
-                    want_sn_displen, want_sn) < 0)
-            {
-              rc = GNUPG_Out_Of_Core;
-            }
-          else
-            {
-              rc = agent_get_confirmation (desc, NULL, NULL);
-              free (desc);
-            }
-        }
-      if (rc)
-        {
-          xfree (want_sn);
-          xfree (want_kid);
-          return rc;
-        }
-    }
-}
-
-
-/* Put the DIGEST into an DER encoded comtainer and return it in R_VAL. */
-static int
-encode_md_for_card (const unsigned char *digest, size_t digestlen, int algo,
-                    unsigned char **r_val, size_t *r_len)
-{
-  byte *frame;
-  byte asn[100];
-  size_t asnlen;
-
-  asnlen = DIM(asn);
-  if (gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen))
-    {
-      log_error ("no object identifier for algo %d\n", algo);
-      return GNUPG_Internal_Error;
-    }
-
-  frame = xtrymalloc (asnlen + digestlen);
-  if (!frame)
-    return GNUPG_Out_Of_Core;
-  memcpy (frame, asn, asnlen);
-  memcpy (frame+asnlen, digest, digestlen);
-  if (DBG_CRYPTO)
-    log_printhex ("encoded hash:", frame, asnlen+digestlen);
-      
-  *r_val = frame;
-  *r_len = asnlen+digestlen;
-  return 0;
-}
-
-
-/* Callback used to ask for the PIN which should be set into BUF.  The
-   buf has been allocated by the caller and is of size MAXBUF which
-   includes the terminating null.  The function should return an UTF-8
-   string with the passphrase, the buffer may optionally be padded
-   with arbitrary characters */
-static int 
-getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf)
-{
-  struct pin_entry_info_s *pi;
-  int rc;
-  char *desc;
-
-  assert (!opaque);
-
-  if (maxbuf < 2)
-    return GNUPG_Invalid_Value;
-
-
-  /* FIXME: keep PI and TRIES in OPAQUE.  Frankly this is a whole
-     mess because we should call the card's verify function from the
-     pinentry check pin CB. */
-  pi = gcry_calloc_secure (1, sizeof (*pi) + 100);
-  pi->max_length = maxbuf-1;
-  pi->min_digits = 0;  /* we want a real passphrase */
-  pi->max_digits = 8;
-  pi->max_tries = 3;
-
-  if ( asprintf (&desc, _("Please enter the PIN%s%s%s to unlock the card"), 
-                 info? " (`":"",
-                 info? info:"",
-                 info? "')":"") < 0)
-    desc = NULL;
-  rc = agent_askpin (desc?desc:info, pi);
-  free (desc);
-  if (!rc)
-    {
-      strncpy (buf, pi->pin, maxbuf-1);
-      buf[maxbuf-1] = 0;
-    }
-  xfree (pi);
-  return rc;
-}
-
-
-
-
-int
-divert_pksign (const unsigned char *digest, size_t digestlen, int algo,
-               const unsigned char *shadow_info, unsigned char **r_sig)
-{
-  int rc;
-  char *kid;
-  size_t siglen;
-  char *sigval;
-  unsigned char *data;
-  size_t ndata;
-
-  rc = ask_for_card (shadow_info, &kid);
-  if (rc)
-    return rc;
-
-  rc = encode_md_for_card (digest, digestlen, algo, 
-                           &data, &ndata);
-  if (rc)
-    return rc;
-
-  rc = agent_card_pksign (kid, getpin_cb, NULL,
-                          data, ndata, &sigval, &siglen);
-  if (!rc)
-    *r_sig = sigval;
-  xfree (data);
-  xfree (kid);
-  
-  return rc;
-}
-
-
-/* Decrypt the the value given asn an S-expression in CIPHER using the
-   key identified by SHADOW_INFO and return the plaintext in an
-   allocated buffer in R_BUF.  */
-int  
-divert_pkdecrypt (const unsigned char *cipher,
-                  const unsigned char *shadow_info,
-                  char **r_buf, size_t *r_len)
-{
-  int rc;
-  char *kid;
-  const unsigned char *s;
-  size_t n;
-  const unsigned char *ciphertext;
-  size_t ciphertextlen;
-  char *plaintext;
-  size_t plaintextlen;
-
-  s = cipher;
-  if (*s != '(')
-    return GNUPG_Invalid_Sexp;
-  s++;
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Invalid_Sexp; 
-  if (!smatch (&s, n, "enc-val"))
-    return GNUPG_Unknown_Sexp; 
-  if (*s != '(')
-    return GNUPG_Unknown_Sexp;
-  s++;
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Invalid_Sexp; 
-  if (!smatch (&s, n, "rsa"))
-    return GNUPG_Unsupported_Algorithm; 
-  if (*s != '(')
-    return GNUPG_Unknown_Sexp;
-  s++;
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Invalid_Sexp; 
-  if (!smatch (&s, n, "a"))
-    return GNUPG_Unknown_Sexp;
-  n = snext (&s);
-  if (!n)
-    return GNUPG_Unknown_Sexp; 
-  ciphertext = s;
-  ciphertextlen = n;
-
-  rc = ask_for_card (shadow_info, &kid);
-  if (rc)
-    return rc;
-
-  rc = agent_card_pkdecrypt (kid, getpin_cb, NULL,
-                             ciphertext, ciphertextlen,
-                             &plaintext, &plaintextlen);
-  if (!rc)
-    {
-      *r_buf = plaintext;
-      *r_len = plaintextlen;
-    }
-  xfree (kid);
-  return rc;
-}
diff --git a/agent/findkey.c b/agent/findkey.c
deleted file mode 100644 (file)
index 8ec230f..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/* findkey.c - locate the secret key
- *     Copyright (C) 2001,02 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <assert.h>
-
-#include "agent.h"
-
-/* Helper to pass data to the check callback of the unprotect function. */
-struct try_unprotect_arg_s {
-  const unsigned char *protected_key;
-  unsigned char *unprotected_key;
-};
-
-
-
-int
-agent_write_private_key (const unsigned char *grip,
-                         const void *buffer, size_t length, int force)
-{
-  int i;
-  char *fname;
-  FILE *fp;
-  char hexgrip[40+4+1];
-  
-  for (i=0; i < 20; i++)
-    sprintf (hexgrip+2*i, "%02X", grip[i]);
-  strcpy (hexgrip+40, ".key");
-
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
-  if (force)
-    fp = fopen (fname, "wb");
-  else
-    {
-      int fd;
-
-      if (!access (fname, F_OK))
-      {
-        log_error ("secret key file `%s' already exists\n", fname);
-        xfree (fname);
-        return seterr (General_Error);
-      }
-
-      /* We would like to create FNAME but only if it does not already
-        exist.  We cannot make this guarantee just using POSIX (GNU
-        provides the "x" opentype for fopen, however, this is not
-        portable).  Thus, we use the more flexible open function and
-        then use fdopen to obtain a stream.
-
-        The mode parameter to open is what fopen uses.  It will be
-        combined with the process' umask automatically.  */
-      fd = open (fname, O_CREAT | O_EXCL | O_RDWR,
-                S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
-      if (fd < 0)
-       fp = 0;
-      else
-       {
-         fp = fdopen (fd, "wb");
-         if (! fp)
-           close (fd);
-       }
-    }
-
-  if (!fp) 
-    { 
-      log_error ("can't create `%s': %s\n", fname, strerror (errno));
-      xfree (fname);
-      return seterr (File_Create_Error);
-    }
-
-  if (fwrite (buffer, length, 1, fp) != 1)
-    {
-      log_error ("error writing `%s': %s\n", fname, strerror (errno));
-      fclose (fp);
-      remove (fname);
-      xfree (fname);
-      return seterr (File_Create_Error);
-    }
-  if ( fclose (fp) )
-    {
-      log_error ("error closing `%s': %s\n", fname, strerror (errno));
-      remove (fname);
-      xfree (fname);
-      return seterr (File_Create_Error);
-    }
-
-  xfree (fname);
-  return 0;
-}
-
-
-/* Callback function to try the unprotection from the passpharse query
-   code. */
-static int
-try_unprotect_cb (struct pin_entry_info_s *pi)
-{
-  struct try_unprotect_arg_s *arg = pi->check_cb_arg;
-  size_t dummy;
-
-  assert (!arg->unprotected_key);
-  return agent_unprotect (arg->protected_key, pi->pin,
-                          &arg->unprotected_key, &dummy);
-}
-
-
-/* Unprotect the canconical encoded S-expression key in KEYBUF.  GRIP
-   should be the hex encoded keygrip of that key to be used with the
-   cahing mechanism. */
-static int
-unprotect (unsigned char **keybuf, const unsigned char *grip, int ignore_cache)
-{
-  struct pin_entry_info_s *pi;
-  struct try_unprotect_arg_s arg;
-  int rc, i;
-  unsigned char *result;
-  size_t resultlen;
-  char hexgrip[40+1];
-  
-  for (i=0; i < 20; i++)
-    sprintf (hexgrip+2*i, "%02X", grip[i]);
-  hexgrip[40] = 0;
-
-  /* first try to get it from the cache - if there is none or we can't
-     unprotect it, we fall back to ask the user */
-  if (!ignore_cache)
-    {
-      void *cache_marker;
-      const char *pw = agent_get_cache (hexgrip, &cache_marker);
-      if (pw)
-        {
-          rc = agent_unprotect (*keybuf, pw, &result, &resultlen);
-          agent_unlock_cache_entry (&cache_marker);
-          if (!rc)
-            {
-              xfree (*keybuf);
-              *keybuf = result;
-              return 0;
-            }
-          rc  = 0;
-        }
-    }
-  
-  pi = gcry_calloc_secure (1, sizeof (*pi) + 100);
-  pi->max_length = 100;
-  pi->min_digits = 0;  /* we want a real passphrase */
-  pi->max_digits = 8;
-  pi->max_tries = 3;
-  pi->check_cb = try_unprotect_cb;
-  arg.protected_key = *keybuf;
-  arg.unprotected_key = NULL;
-  pi->check_cb_arg = &arg;
-
-  rc = agent_askpin (NULL, pi);
-  if (!rc)
-    {
-      assert (arg.unprotected_key);
-      agent_put_cache (hexgrip, pi->pin, 0);
-      xfree (*keybuf);
-      *keybuf = arg.unprotected_key;
-    }
-  xfree (pi);
-  return rc;
-}
-
-
-
-/* Return the secret key as an S-Exp after locating it using the grip.
-   Returns NULL if key is not available or the operation should be
-   diverted to a token.  In the latter case shadow_info will point to
-   an allocated S-Expression with the shadow_info part from the file.
-   With IGNORE_CACHE passed as true the passphrase is not taken from
-   the cache.*/
-GCRY_SEXP
-agent_key_from_file (const unsigned char *grip, unsigned char **shadow_info,
-                     int ignore_cache)
-{
-  int i, rc;
-  char *fname;
-  FILE *fp;
-  struct stat st;
-  unsigned char *buf;
-  size_t len, buflen, erroff;
-  GCRY_SEXP s_skey;
-  char hexgrip[40+4+1];
-  
-  if (shadow_info)
-      *shadow_info = NULL;
-
-  for (i=0; i < 20; i++)
-    sprintf (hexgrip+2*i, "%02X", grip[i]);
-  strcpy (hexgrip+40, ".key");
-
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
-  fp = fopen (fname, "rb");
-  if (!fp)
-    {
-      log_error ("can't open `%s': %s\n", fname, strerror (errno));
-      xfree (fname);
-      return NULL;
-    }
-  
-  if (fstat (fileno(fp), &st))
-    {
-      log_error ("can't stat `%s': %s\n", fname, strerror (errno));
-      xfree (fname);
-      fclose (fp);
-      return NULL;
-    }
-
-  buflen = st.st_size;
-  buf = xmalloc (buflen+1);
-  if (fread (buf, buflen, 1, fp) != 1)
-    {
-      log_error ("error reading `%s': %s\n", fname, strerror (errno));
-      xfree (fname);
-      fclose (fp);
-      xfree (buf);
-      return NULL;
-    }
-
-  rc = gcry_sexp_sscan (&s_skey, &erroff, buf, buflen);
-  xfree (fname);
-  fclose (fp);
-  xfree (buf);
-  if (rc)
-    {
-      log_error ("failed to build S-Exp (off=%u): %s\n",
-                 (unsigned int)erroff, gcry_strerror (rc));
-      return NULL;
-    }
-  len = gcry_sexp_sprint (s_skey, GCRYSEXP_FMT_CANON, NULL, 0);
-  assert (len);
-  buf = xtrymalloc (len);
-  if (!buf)
-    {
-      gcry_sexp_release (s_skey);
-      return NULL;
-    }
-  len = gcry_sexp_sprint (s_skey, GCRYSEXP_FMT_CANON, buf, len);
-  assert (len);
-  gcry_sexp_release (s_skey);
-
-  switch (agent_private_key_type (buf))
-    {
-    case PRIVATE_KEY_CLEAR:
-      break; /* no unprotection needed */
-    case PRIVATE_KEY_PROTECTED:
-      rc = unprotect (&buf, grip, ignore_cache);
-      if (rc)
-        log_error ("failed to unprotect the secret key: %s\n",
-                   gnupg_strerror (rc));
-      break;
-    case PRIVATE_KEY_SHADOWED:
-      if (shadow_info)
-        {
-          const unsigned char *s;
-          size_t n;
-
-          rc = agent_get_shadow_info (buf, &s);
-          if (!rc)
-            {
-              n = gcry_sexp_canon_len (s, 0, NULL,NULL);
-              assert (n);
-              *shadow_info = xtrymalloc (n);
-              if (!*shadow_info)
-                rc = GNUPG_Out_Of_Core;
-              else
-                {
-                  memcpy (*shadow_info, s, n);
-                  rc = 0;
-                }
-            }
-          if (rc)
-            log_error ("get_shadow_info failed: %s\n", gnupg_strerror (rc));
-        }
-      rc = -1; /* ugly interface: we return an error but keep a value
-                  in shadow_info.  */
-      break;
-    default:
-      log_error ("invalid private key format\n");
-      rc = GNUPG_Bad_Secret_Key;
-      break;
-    }
-  if (rc)
-    {
-      xfree (buf);
-      return NULL;
-    }
-
-  /* arggg FIXME: does scan support secure memory? */
-  rc = gcry_sexp_sscan (&s_skey, &erroff,
-                        buf, gcry_sexp_canon_len (buf, 0, NULL, NULL));
-  xfree (buf);
-  if (rc)
-    {
-      log_error ("failed to build S-Exp (off=%u): %s\n",
-                 (unsigned int)erroff, gcry_strerror (rc));
-      return NULL;
-    }
-
-  return s_skey;
-}
-
-/* Return the secret key as an S-Exp after locating it using the grip.
-   Returns NULL if key is not available. 0 = key is available */
-int
-agent_key_available (const unsigned char *grip)
-{
-  int i;
-  char *fname;
-  char hexgrip[40+4+1];
-  
-  for (i=0; i < 20; i++)
-    sprintf (hexgrip+2*i, "%02X", grip[i]);
-  strcpy (hexgrip+40, ".key");
-
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
-  i = !access (fname, R_OK)? 0 : -1;
-  xfree (fname);
-  return i;
-}
-
-
-
diff --git a/agent/genkey.c b/agent/genkey.c
deleted file mode 100644 (file)
index dccac94..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/* pksign.c - Generate a keypair
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-
-#include "agent.h"
-#include "i18n.h"
-
-static int
-store_key (GCRY_SEXP private, const char *passphrase)
-{
-  int rc;
-  char *buf;
-  size_t len;
-  unsigned char grip[20];
-  
-  if ( !gcry_pk_get_keygrip (private, grip) )
-    {
-      log_error ("can't calculate keygrip\n");
-      return seterr (General_Error);
-    }
-
-  len = gcry_sexp_sprint (private, GCRYSEXP_FMT_CANON, NULL, 0);
-  assert (len);
-  buf = gcry_malloc_secure (len);
-  if (!buf)
-      return seterr (Out_Of_Core);
-  len = gcry_sexp_sprint (private, GCRYSEXP_FMT_CANON, buf, len);
-  assert (len);
-
-  if (passphrase)
-    {
-      unsigned char *p;
-
-      rc = agent_protect (buf, passphrase, &p, &len);
-      if (rc)
-        {
-          xfree (buf);
-          return rc;
-        }
-      xfree (buf);
-      buf = p;
-    }
-
-  rc = agent_write_private_key (grip, buf, len, 0);
-  xfree (buf);
-  return rc;
-}
-
-/* Callback function to compare the first entered PIN with the one
-   currently beeing entered. */
-static int
-reenter_compare_cb (struct pin_entry_info_s *pi)
-{
-  const char *pin1 = pi->check_cb_arg;
-
-  if (!strcmp (pin1, pi->pin))
-    return 0; /* okay */
-  pi->cb_errtext = _("does not match - try again");
-  return -1;
-}
-
-
-
-/* Generate a new keypair according to the parameters given in
-   KEYPARAM */
-int
-agent_genkey (CTRL ctrl, const char *keyparam, size_t keyparamlen,
-              FILE *outfp) 
-{
-  GCRY_SEXP s_keyparam, s_key, s_private, s_public;
-  struct pin_entry_info_s *pi, *pi2;
-  int rc;
-  size_t len;
-  char *buf;
-
-  rc = gcry_sexp_sscan (&s_keyparam, NULL, keyparam, keyparamlen);
-  if (rc)
-    {
-      log_error ("failed to convert keyparam: %s\n", gcry_strerror (rc));
-      return seterr (Invalid_Data);
-    }
-
-  /* Get the passphrase now, cause key generation may take a while. */
-  {
-    const char *text1 = _("Please enter the passphrase to%0A"
-                               "to protect your new key");
-    const char *text2 = _("Please re-enter this passphrase");
-
-    pi = gcry_calloc_secure (2, sizeof (*pi) + 100);
-    pi2 = pi + (sizeof *pi + 100);
-    pi->max_length = 100;
-    pi->max_tries = 3;
-    pi2->max_length = 100;
-    pi2->max_tries = 3;
-    pi2->check_cb = reenter_compare_cb;
-    pi2->check_cb_arg = pi->pin;
-
-    rc = agent_askpin (text1, pi);
-    if (!rc)
-      rc = agent_askpin (text2, pi2);
-    if (rc)
-      return rc;
-    if (!*pi->pin)
-      {
-        xfree (pi);
-        pi = NULL; /* User does not want a passphrase. */
-      }
-  }
-
-  rc = gcry_pk_genkey (&s_key, s_keyparam );
-  gcry_sexp_release (s_keyparam);
-  if (rc)
-    {
-      log_error ("key generation failed: %s\n", gcry_strerror (rc));
-      xfree (pi);
-      return map_gcry_err (rc);
-    }
-
-  /* break out the parts */
-  s_private = gcry_sexp_find_token (s_key, "private-key", 0);
-  if (!s_private)
-    {
-      log_error ("key generation failed: invalid return value\n");
-      gcry_sexp_release (s_key);
-      xfree (pi);
-      return seterr (Invalid_Data);
-    }
-  s_public = gcry_sexp_find_token (s_key, "public-key", 0);
-  if (!s_public)
-    {
-      log_error ("key generation failed: invalid return value\n");
-      gcry_sexp_release (s_private);
-      gcry_sexp_release (s_key);
-      xfree (pi);
-      return seterr (Invalid_Data);
-    }
-  gcry_sexp_release (s_key); s_key = NULL;
-  
-  /* store the secret key */
-  log_debug ("storing private key\n");
-  rc = store_key (s_private, pi? pi->pin:NULL);
-  xfree (pi); pi = NULL;
-  gcry_sexp_release (s_private);
-  if (rc)
-    {
-      gcry_sexp_release (s_public);
-      return rc;
-    }
-
-  /* return the public key */
-  log_debug ("returning public key\n");
-  len = gcry_sexp_sprint (s_public, GCRYSEXP_FMT_CANON, NULL, 0);
-  assert (len);
-  buf = xmalloc (len);
-  if (!buf)
-    {
-      gcry_sexp_release (s_private);
-      gcry_sexp_release (s_public);
-      return seterr (Out_Of_Core);
-    }
-  len = gcry_sexp_sprint (s_public, GCRYSEXP_FMT_CANON, buf, len);
-  assert (len);
-  if (fwrite (buf, len, 1, outfp) != 1)
-    {
-      log_error ("error writing public key: %s\n", strerror (errno));
-      gcry_sexp_release (s_private);
-      gcry_sexp_release (s_public);
-      xfree (buf);
-      return seterr (File_Create_Error);
-    }
-  gcry_sexp_release (s_public);
-  xfree (buf);
-
-  return 0;
-}
-
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
deleted file mode 100644 (file)
index 3c823e5..0000000
+++ /dev/null
@@ -1,916 +0,0 @@
-/* gpg-agent.c  -  The GnuPG Agent
- *     Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <time.h>
-#include <fcntl.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <signal.h>
-#ifdef USE_GNU_PTH
-# include <pth.h>
-#endif
-
-#include <gcrypt.h>
-
-#define JNLIB_NEED_LOG_LOGV
-#include "agent.h"
-#include "../assuan/assuan.h" /* malloc hooks */
-
-#include "i18n.h"
-#include "sysutils.h"
-
-
-enum cmd_and_opt_values 
-{ aNull = 0,
-  oCsh           = 'c',
-  oQuiet         = 'q',
-  oSh            = 's',
-  oVerbose       = 'v',
-  
-  oNoVerbose = 500,
-  oOptions,
-  oDebug,
-  oDebugAll,
-  oDebugWait,
-  oNoGreeting,
-  oNoOptions,
-  oHomedir,
-  oNoDetach,
-  oNoGrab,
-  oLogFile,
-  oServer,
-  oDaemon,
-  oBatch,
-
-  oPinentryProgram,
-  oDisplay,
-  oTTYname,
-  oTTYtype,
-  oLCctype,
-  oLCmessages,
-  oScdaemonProgram,
-  oDefCacheTTL,
-  oDisablePth,
-
-  oIgnoreCacheForSigning,
-  oKeepTTY,
-  oKeepDISPLAY,
-
-aTest };
-
-
-
-static ARGPARSE_OPTS opts[] = {
-  
-  { 301, NULL, 0, N_("@Options:\n ") },
-
-  { oServer,   "server",     0, N_("run in server mode (foreground)") },
-  { oDaemon,   "daemon",     0, N_("run in daemon mode (background)") },
-  { oVerbose, "verbose",     0, N_("verbose") },
-  { oQuiet,    "quiet",     0, N_("be somewhat more quiet") },
-  { oSh,       "sh",        0, N_("sh-style command output") },
-  { oCsh,      "csh",       0, N_("csh-style command output") },
-  { oOptions, "options"  , 2, N_("read options from file")},
-  { oDebug,    "debug"     ,4|16, N_("set debugging flags")},
-  { oDebugAll, "debug-all" ,0, N_("enable full debugging")},
-  { oDebugWait,"debug-wait",1, "@"},
-  { oNoDetach, "no-detach" ,0, N_("do not detach from the console")},
-  { oNoGrab, "no-grab"     ,0, N_("do not grab keyboard and mouse")},
-  { oLogFile, "log-file"   ,2, N_("use a log file for the server")},
-  { oDisablePth, "disable-pth", 0, N_("do not allow multiple connections")},
-
-  { oPinentryProgram, "pinentry-program", 2 , "path to PIN Entry program" },
-  { oDisplay,    "display",     2, "set the display" },
-  { oTTYname,    "ttyname",     2, "set the tty terminal node name" },
-  { oTTYtype,    "ttytype",     2, "set the tty terminal type" },
-  { oLCctype,    "lc-ctype",    2, "set the tty LC_CTYPE value" },
-  { oLCmessages, "lc-messages", 2, "set the tty LC_MESSAGES value" },
-
-  { oScdaemonProgram, "scdaemon-program", 2 , "path to SCdaemon program" },
-  { oDefCacheTTL, "default-cache-ttl", 4,
-                                 "|N|expire cached PINs after N seconds"},
-  { oIgnoreCacheForSigning, "ignore-cache-for-signing", 0,
-                                 "do not use the PIN cache when signing"},
-  { oKeepTTY, "keep-tty", 0,  N_("ignore requests to change the TTY")},
-  { oKeepDISPLAY, "keep-display",
-                          0, N_("ignore requests to change the X display")},
-  {0}
-};
-
-
-static volatile int caught_fatal_sig = 0;
-
-/* flag to indicate that a shutdown was requested */
-static int shutdown_pending;
-
-
-/* It is possible that we are currently running under setuid permissions */
-static int maybe_setuid = 1;
-
-/* Name of the communication socket */
-static char socket_name[128];
-
-static void create_directories (void);
-#ifdef USE_GNU_PTH
-static void handle_connections (int listen_fd);
-#endif
-
-
-
-static const char *
-my_strusage (int level)
-{
-  const char *p;
-  switch (level)
-    {
-    case 11: p = "gpg-agent (GnuPG)";
-      break;
-    case 13: p = VERSION; break;
-    case 17: p = PRINTABLE_OS_NAME; break;
-    case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
-      break;
-    case 1:
-    case 40: p =  _("Usage: gpg-agent [options] (-h for help)");
-      break;
-    case 41: p =  _("Syntax: gpg-agent [options] [command [args]]\n"
-                    "Secret key management for GnuPG\n");
-    break;
-    
-    default: p = NULL;
-    }
-  return p;
-}
-
-
-
-static void
-i18n_init (void)
-{
-#ifdef USE_SIMPLE_GETTEXT
-    set_gettext_file( PACKAGE );
-#else
-#ifdef ENABLE_NLS
-    setlocale (LC_ALL, "");
-    bindtextdomain (PACKAGE, LOCALEDIR);
-    textdomain (PACKAGE);
-#endif
-#endif
-}
-
-
-
-/* Used by gcry for logging */
-static void
-my_gcry_logger (void *dummy, int level, const char *fmt, va_list arg_ptr)
-{
-  /* translate the log levels */
-  switch (level)
-    {
-    case GCRY_LOG_CONT: level = JNLIB_LOG_CONT; break;
-    case GCRY_LOG_INFO: level = JNLIB_LOG_INFO; break;
-    case GCRY_LOG_WARN: level = JNLIB_LOG_WARN; break;
-    case GCRY_LOG_ERROR:level = JNLIB_LOG_ERROR; break;
-    case GCRY_LOG_FATAL:level = JNLIB_LOG_FATAL; break;
-    case GCRY_LOG_BUG:  level = JNLIB_LOG_BUG; break;
-    case GCRY_LOG_DEBUG:level = JNLIB_LOG_DEBUG; break;
-    default:            level = JNLIB_LOG_ERROR; break;  
-    }
-  log_logv (level, fmt, arg_ptr);
-}
-
-
-static void
-cleanup (void)
-{
-  if (*socket_name)
-    {
-      char *p;
-
-      remove (socket_name);
-      p = strrchr (socket_name, '/');
-      if (p)
-        {
-          *p = 0;
-          rmdir (socket_name);
-          *p = '/';
-        }
-      *socket_name = 0;
-    }
-}
-
-
-static RETSIGTYPE
-cleanup_sh (int sig)
-{
-  if (caught_fatal_sig)
-    raise (sig);
-  caught_fatal_sig = 1;
-
-  /* gcry_control( GCRYCTL_TERM_SECMEM );*/
-  cleanup ();
-
-#ifndef HAVE_DOSISH_SYSTEM
-  {    /* reset action to default action and raise signal again */
-    struct sigaction nact;
-    nact.sa_handler = SIG_DFL;
-    sigemptyset( &nact.sa_mask );
-    nact.sa_flags = 0;
-    sigaction( sig, &nact, NULL);
-  }
-#endif
-  raise( sig );
-}
-
-int
-main (int argc, char **argv )
-{
-  ARGPARSE_ARGS pargs;
-  int orig_argc;
-  int may_coredump;
-  char **orig_argv;
-  FILE *configfp = NULL;
-  char *configname = NULL;
-  const char *shell;
-  unsigned configlineno;
-  int parse_debug = 0;
-  int default_config =1;
-  int greeting = 0;
-  int nogreeting = 0;
-  int pipe_server = 0;
-  int is_daemon = 0;
-  int nodetach = 0;
-  int csh_style = 0;
-  char *logfile = NULL;
-  int debug_wait = 0;
-  int disable_pth = 0;
-
-  set_strusage (my_strusage);
-  gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
-  /* Please note that we may running SUID(ROOT), so be very CAREFUL
-     when adding any stuff between here and the call to INIT_SECMEM()
-     somewhere after the option parsing */
-  log_set_prefix ("gpg-agent", 1|4); 
-  i18n_init ();
-
-  /* check that the libraries are suitable.  Do it here because
-     the option parsing may need services of the library */
-  if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
-    {
-      log_fatal( _("libgcrypt is too old (need %s, have %s)\n"),
-                 NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
-    }
-
-  assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free);
-#ifdef USE_GNU_PTH
-  assuan_set_io_func (pth_read, pth_write);
-#endif
-
-  gcry_set_log_handler (my_gcry_logger, NULL);
-  gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
-
-  may_coredump = disable_core_dumps ();
-
-  shell = getenv ("SHELL");
-  if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") )
-    csh_style = 1;
-  
-  opt.homedir = getenv("GNUPGHOME");
-  if (!opt.homedir || !*opt.homedir)
-    opt.homedir = GNUPG_DEFAULT_HOMEDIR;
-  opt.def_cache_ttl = 10*60; /* default to 10 minutes */
-
-
-  /* check whether we have a config file on the commandline */
-  orig_argc = argc;
-  orig_argv = argv;
-  pargs.argc = &argc;
-  pargs.argv = &argv;
-  pargs.flags= 1|(1<<6);  /* do not remove the args, ignore version */
-  while (arg_parse( &pargs, opts))
-    {
-      if (pargs.r_opt == oDebug || pargs.r_opt == oDebugAll)
-        parse_debug++;
-      else if (pargs.r_opt == oOptions)
-        { /* yes there is one, so we do not try the default one, but
-            read the option file when it is encountered at the
-            commandline */
-          default_config = 0;
-       }
-       else if (pargs.r_opt == oNoOptions)
-          default_config = 0; /* --no-options */
-       else if (pargs.r_opt == oHomedir)
-          opt.homedir = pargs.r.ret_str;
-    }
-
-  /* initialize the secure memory. */
-  gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
-  maybe_setuid = 0;
-
-  /* 
-     Now we are now working under our real uid 
-  */
-
-
-  if (default_config)
-    configname = make_filename (opt.homedir, "gpg-agent.conf", NULL );
-  
-  argc = orig_argc;
-  argv = orig_argv;
-  pargs.argc = &argc;
-  pargs.argv = &argv;
-  pargs.flags=  1;  /* do not remove the args */
- next_pass:
-  if (configname)
-    {
-      configlineno = 0;
-      configfp = fopen (configname, "r");
-      if (!configfp)
-        {
-          if (default_config)
-            {
-              if( parse_debug )
-                log_info (_("NOTE: no default option file `%s'\n"),
-                          configname );
-           }
-          else
-            {
-              log_error (_("option file `%s': %s\n"),
-                         configname, strerror(errno) );
-              exit(2);
-           }
-          xfree (configname); 
-          configname = NULL;
-       }
-      if (parse_debug && configname )
-        log_info (_("reading options from `%s'\n"), configname );
-      default_config = 0;
-    }
-
-  while (optfile_parse( configfp, configname, &configlineno, &pargs, opts) )
-    {
-      switch (pargs.r_opt)
-        {
-        case oQuiet: opt.quiet = 1; break;
-        case oVerbose: opt.verbose++; break;
-        case oBatch: opt.batch=1; break;
-
-        case oDebug: opt.debug |= pargs.r.ret_ulong; break;
-        case oDebugAll: opt.debug = ~0; break;
-        case oDebugWait: debug_wait = pargs.r.ret_int; break;
-
-        case oOptions:
-          /* config files may not be nested (silently ignore them) */
-          if (!configfp)
-            {
-               xfree(configname);
-               configname = xstrdup(pargs.r.ret_str);
-               goto next_pass;
-           }
-          break;
-        case oNoGreeting: nogreeting = 1; break;
-        case oNoVerbose: opt.verbose = 0; break;
-        case oNoOptions: break; /* no-options */
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
-        case oNoDetach: nodetach = 1; break;
-        case oNoGrab: opt.no_grab = 1; break;
-        case oLogFile: logfile = pargs.r.ret_str; break;
-        case oCsh: csh_style = 1; break;
-        case oSh: csh_style = 0; break;
-        case oServer: pipe_server = 1; break;
-        case oDaemon: is_daemon = 1; break;
-        case oDisablePth: disable_pth = 1; break;
-
-        case oPinentryProgram: opt.pinentry_program = pargs.r.ret_str; break;
-        case oDisplay: opt.display = xstrdup (pargs.r.ret_str); break;
-        case oTTYname: opt.ttyname = xstrdup (pargs.r.ret_str); break;
-        case oTTYtype: opt.ttytype = xstrdup (pargs.r.ret_str); break;
-        case oLCctype: opt.lc_ctype = xstrdup (pargs.r.ret_str); break;
-        case oLCmessages: opt.lc_messages = xstrdup (pargs.r.ret_str); break;
-        case oScdaemonProgram: opt.scdaemon_program = pargs.r.ret_str; break;
-        case oDefCacheTTL: opt.def_cache_ttl = pargs.r.ret_ulong; break;
-
-        case oIgnoreCacheForSigning: opt.ignore_cache_for_signing = 1; break;
-        case oKeepTTY: opt.keep_tty = 1; break;
-        case oKeepDISPLAY: opt.keep_display = 1; break;
-
-        default : pargs.err = configfp? 1:2; break;
-       }
-    }
-  if (configfp)
-    {
-      fclose( configfp );
-      configfp = NULL;
-      xfree(configname);
-      configname = NULL;
-      goto next_pass;
-    }
-  xfree (configname);
-  configname = NULL;
-  if (log_get_errorcount(0))
-    exit(2);
-  if (nogreeting )
-    greeting = 0;
-
-  if (greeting)
-    {
-      fprintf (stderr, "%s %s; %s\n",
-                 strusage(11), strusage(13), strusage(14) );
-      fprintf (stderr, "%s\n", strusage(15) );
-    }
-#ifdef IS_DEVELOPMENT_VERSION
-  log_info ("NOTE: this is a development version!\n");
-#endif
-
-  
-  if (atexit (cleanup))
-    {
-      log_error ("atexit failed\n");
-      cleanup ();
-      exit (1);
-    }
-
-  create_directories ();
-
-  if (debug_wait && pipe_server)
-    {
-      log_debug ("waiting for debugger - my pid is %u .....\n",
-                 (unsigned int)getpid());
-      sleep (debug_wait);
-      log_debug ("... okay\n");
-    }
-  
-  /* now start with logging to a file if this is desired */
-  if (logfile)
-    {
-      log_set_file (logfile);
-      log_set_prefix (NULL, 1|2|4);
-    }
-
-
-  if (pipe_server)
-    { /* this is the simple pipe based server */
-      start_command_handler (-1, -1);
-    }
-  else if (!is_daemon)
-    {
-      log_info (_("please use the option `--daemon'"
-                  " to run the program in the background\n"));
-    }
-  else
-    { /* regular server mode */
-      int fd;
-      pid_t pid;
-      int len;
-      struct sockaddr_un serv_addr;
-      char *p;
-
-      *socket_name = 0;
-      snprintf (socket_name, DIM(socket_name)-1,
-                "/tmp/gpg-XXXXXX/S.gpg-agent");
-      socket_name[DIM(socket_name)-1] = 0;
-      p = strrchr (socket_name, '/');
-      if (!p)
-        BUG ();
-      *p = 0;;
-      if (!mkdtemp(socket_name))
-        {
-          log_error ("can't create directory `%s': %s\n",
-                    socket_name, strerror(errno) );
-          exit (1);
-        }
-      *p = '/';
-
-      if (strchr (socket_name, ':') )
-        {
-          log_error ("colons are not allowed in the socket name\n");
-          exit (1);
-        }
-      if (strlen (socket_name)+1 >= sizeof serv_addr.sun_path ) 
-        {
-          log_error ("name of socket too long\n");
-          exit (1);
-        }
-   
-
-      fd = socket (AF_UNIX, SOCK_STREAM, 0);
-      if (fd == -1)
-        {
-          log_error ("can't create socket: %s\n", strerror(errno) );
-          exit (1);
-        }
-
-      memset (&serv_addr, 0, sizeof serv_addr);
-      serv_addr.sun_family = AF_UNIX;
-      strcpy (serv_addr.sun_path, socket_name);
-      len = (offsetof (struct sockaddr_un, sun_path)
-             + strlen(serv_addr.sun_path) + 1);
-
-      if (bind (fd, (struct sockaddr*)&serv_addr, len) == -1)
-        {
-          log_error ("error binding socket to `%s': %s\n",
-                     serv_addr.sun_path, strerror (errno) );
-          close (fd);
-          exit (1);
-        }
-  
-      if (listen (fd, 5 ) == -1)
-        {
-          log_error ("listen() failed: %s\n", strerror (errno));
-          close (fd);
-          exit (1);
-        }
-
-      if (opt.verbose)
-        log_info ("listening on socket `%s'\n", socket_name );
-
-
-      fflush (NULL);
-      pid = fork ();
-      if (pid == (pid_t)-1) 
-        {
-          log_fatal ("fork failed: %s\n", strerror (errno) );
-          exit (1);
-        }
-      else if (pid) 
-        { /* we are the parent */
-          char *infostr;
-          
-          close (fd);
-          
-          /* create the info string: <name>:<pid>:<protocol_version> */
-          if (asprintf (&infostr, "GPG_AGENT_INFO=%s:%lu:1",
-                        socket_name, (ulong)pid ) < 0)
-            {
-              log_error ("out of core\n");
-              kill (pid, SIGTERM);
-              exit (1);
-            }
-          *socket_name = 0; /* don't let cleanup() remove the socket -
-                               the child should do this from now on */
-          if (argc) 
-            { /* run the program given on the commandline */
-              if (putenv (infostr))
-                {
-                  log_error ("failed to set environment: %s\n",
-                             strerror (errno) );
-                  kill (pid, SIGTERM );
-                  exit (1);
-                }
-              execvp (argv[0], argv);
-              log_error ("failed to run the command: %s\n", strerror (errno));
-              kill (pid, SIGTERM);
-              exit (1);
-            }
-          else
-            {
-              /* print the environment string, so that the caller can use
-                 shell's eval to set it */
-              if (csh_style)
-                {
-                  *strchr (infostr, '=') = ' ';
-                  printf ( "setenv %s\n", infostr);
-                }
-              else
-                {
-                  printf ( "%s; export GPG_AGENT_INFO;\n", infostr);
-                }
-              free (infostr);
-              exit (0); 
-            }
-          /*NEVER REACHED*/
-        } /* end parent */
-      
-
-      /* this is the child */
-
-      /* detach from tty and put process into a new session */
-      if (!nodetach )
-        { 
-          int i;
-
-          /* close stdin, stdout and stderr unless it is the log stream */
-          for (i=0; i <= 2; i++) 
-            {
-              if ( log_get_fd () != i)
-                close (i);
-            }
-          if (setsid() == -1)
-            {
-              log_error ("setsid() failed: %s\n", strerror(errno) );
-              cleanup ();
-              exit (1);
-            }
-          opt.running_detached = 1;
-        }
-
-      if (chdir("/"))
-        {
-          log_error ("chdir to / failed: %s\n", strerror (errno));
-          exit (1);
-        }
-
-
-#ifdef USE_GNU_PTH
-      if (!disable_pth)
-        {
-         struct sigaction sa;
-
-          if (!pth_init ())
-            {
-              log_error ("failed to initialize the Pth library\n");
-              exit (1);
-            }
-
-         sa.sa_handler = SIG_IGN;
-         sigemptyset (&sa.sa_mask);
-         sa.sa_flags = 0;
-         sigaction (SIGPIPE, &sa, NULL);
-          handle_connections (fd);
-        }
-      else
-#endif /*!USE_GNU_PTH*/
-      /* setup signals */
-        {
-          struct sigaction oact, nact;
-          
-          nact.sa_handler = cleanup_sh;
-          sigemptyset (&nact.sa_mask);
-          nact.sa_flags = 0;
-          
-          sigaction (SIGHUP, NULL, &oact);
-          if (oact.sa_handler != SIG_IGN)
-            sigaction (SIGHUP, &nact, NULL);
-          sigaction( SIGTERM, NULL, &oact );
-          if (oact.sa_handler != SIG_IGN)
-            sigaction (SIGTERM, &nact, NULL);
-          nact.sa_handler = SIG_IGN;
-          sigaction (SIGPIPE, &nact, NULL);
-          sigaction (SIGINT, &nact, NULL);
-
-          start_command_handler (fd, -1);
-        }
-      close (fd);
-    }
-  
-  return 0;
-}
-
-void
-agent_exit (int rc)
-{
-  /*FIXME: update_random_seed_file();*/
-#if 1
-  /* at this time a bit annoying */
-  if (opt.debug & DBG_MEMSTAT_VALUE)
-    {
-      gcry_control( GCRYCTL_DUMP_MEMORY_STATS );
-      gcry_control( GCRYCTL_DUMP_RANDOM_STATS );
-    }
-  if (opt.debug)
-    gcry_control (GCRYCTL_DUMP_SECMEM_STATS );
-#endif
-  gcry_control (GCRYCTL_TERM_SECMEM );
-  rc = rc? rc : log_get_errorcount(0)? 2 : 0;
-  exit (rc);
-}
-
-
-static void
-reread_configuration (void)
-{
-  /* FIXME: Move parts of the option parsing to here. */
-}
-
-
-static void
-create_private_keys_directory (const char *home)
-{
-  char *fname;
-  struct stat statbuf;
-
-  fname = make_filename (home, GNUPG_PRIVATE_KEYS_DIR, NULL);
-  if (stat (fname, &statbuf) && errno == ENOENT)
-    {
-      if (mkdir (fname, S_IRUSR|S_IWUSR|S_IXUSR ))
-        log_error (_("can't create directory `%s': %s\n"),
-                   fname,      strerror(errno) );
-      else if (!opt.quiet)
-        log_info (_("directory `%s' created\n"), fname);
-    }
-  xfree (fname);
-}
-
-/* Create the directory only if the supplied directory name is the
-   same as the default one.  This way we avoid to create arbitrary
-   directories when a non-default home directory is used.  To cope
-   with HOME, we compare only the suffix if we see that the default
-   homedir does start with a tilde.  We don't stop here in case of
-   problems because other functions will throw an error anyway.*/
-static void
-create_directories (void)
-{
-  struct stat statbuf;
-  const char *defhome = GNUPG_DEFAULT_HOMEDIR;
-  char *home;
-
-  home  = make_filename (opt.homedir, NULL);
-  if ( stat (home, &statbuf) )
-    {
-      if (errno == ENOENT)
-        {
-          if ( (*defhome == '~'
-                && (strlen (home) >= strlen (defhome+1)
-                    && !strcmp (home + strlen(home)
-                                - strlen (defhome+1), defhome+1)))
-               || (*defhome != '~' && !strcmp (home, defhome) )
-               )
-            {
-              if (mkdir (home, S_IRUSR|S_IWUSR|S_IXUSR ))
-                log_error (_("can't create directory `%s': %s\n"),
-                           home, strerror(errno) );
-              else 
-                {
-                  if (!opt.quiet)
-                    log_info (_("directory `%s' created\n"), home);
-                  create_private_keys_directory (home);
-                }
-            }
-        }
-      else
-        log_error ("error stat-ing `%s': %s\n", home, strerror (errno));
-    }
-  else if ( !S_ISDIR(statbuf.st_mode))
-    {
-      log_error ("can't use `%s' as home directory\n", home);
-    }
-  else /* exists and is a directory. */
-    {
-      create_private_keys_directory (home);
-    }
-  xfree (home);
-}
-
-
-
-#ifdef USE_GNU_PTH
-static void
-handle_signal (int signo)
-{
-  switch (signo)
-    {
-    case SIGHUP:
-      log_info ("SIGHUP received - "
-                "re-reading configuration and flushing cache\n");
-      agent_flush_cache ();
-      reread_configuration ();
-      break;
-      
-    case SIGUSR1:
-      if (opt.verbose < 5)
-        opt.verbose++;
-      log_info ("SIGUSR1 received - verbosity set to %d\n", opt.verbose);
-      break;
-
-    case SIGUSR2:
-      if (opt.verbose)
-        opt.verbose--;
-      log_info ("SIGUSR2 received - verbosity set to %d\n", opt.verbose );
-      break;
-
-    case SIGTERM:
-      if (!shutdown_pending)
-        log_info ("SIGTERM received - shutting down ...\n");
-      else
-        log_info ("SIGTERM received - still %ld running threads\n",
-                  pth_ctrl( PTH_CTRL_GETTHREADS ));
-      shutdown_pending++;
-      if (shutdown_pending > 2)
-        {
-          log_info ("shutdown forced\n");
-          log_info ("%s %s stopped\n", strusage(11), strusage(13) );
-          cleanup ();
-          agent_exit (0);
-       }
-      break;
-        
-    case SIGINT:
-      log_info ("SIGINT received - immediate shutdown\n");
-      log_info( "%s %s stopped\n", strusage(11), strusage(13));
-      cleanup ();
-      agent_exit (0);
-      break;
-
-    default:
-      log_info ("signal %d received - no action defined\n", signo);
-    }
-}
-
-
-static void *
-start_connection_thread (void *arg)
-{
-  int fd = (int)arg;
-
-  if (opt.verbose)
-    log_info ("handler for fd %d started\n", fd);
-  start_command_handler (-1, fd);
-  if (opt.verbose)
-    log_info ("handler for fd %d terminated\n", fd);
-  
-  return NULL;
-}
-
-
-static void
-handle_connections (int listen_fd)
-{
-  pth_attr_t tattr;
-  pth_event_t ev;
-  sigset_t sigs;
-  int signo;
-  struct sockaddr_un paddr;
-  socklen_t plen = sizeof( paddr );
-  int fd;
-
-  tattr = pth_attr_new();
-  pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0);
-  pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 32*1024);
-  pth_attr_set (tattr, PTH_ATTR_NAME, "gpg-agent");
-
-  sigemptyset (&sigs );
-  sigaddset (&sigs, SIGHUP);
-  sigaddset (&sigs, SIGUSR1);
-  sigaddset (&sigs, SIGUSR2);
-  sigaddset (&sigs, SIGINT);
-  sigaddset (&sigs, SIGTERM);
-  ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo);
-
-  for (;;)
-    {
-      if (shutdown_pending)
-        {
-          if (pth_ctrl (PTH_CTRL_GETTHREADS) == 1)
-            break; /* ready */
-
-          /* Do not accept anymore connections and wait for existing
-             connections to terminate */
-          signo = 0;
-          pth_wait (ev);
-          if (pth_event_occurred (ev) && signo)
-            handle_signal (signo);
-          continue;
-       }
-
-      fd = pth_accept_ev (listen_fd, (struct sockaddr *)&paddr, &plen, ev);
-      if (fd == -1)
-        {
-          if (pth_event_occurred (ev))
-            {
-              handle_signal (signo);
-              continue;
-           }
-          log_error ("accept failed: %s - waiting 1s\n", strerror (errno));
-          pth_sleep(1);
-          continue;
-       }
-
-      if (!pth_spawn (tattr, start_connection_thread, (void*)fd))
-        {
-          log_error ("error spawning connection handler: %s\n",
-                     strerror (errno) );
-          close (fd);
-       }
-    }
-
-  pth_event_free (ev, PTH_FREE_ALL);
-  cleanup ();
-  log_info ("%s %s stopped\n", strusage(11), strusage(13));
-}
-#endif /*USE_GNU_PTH*/
diff --git a/agent/learncard.c b/agent/learncard.c
deleted file mode 100644 (file)
index 93229f4..0000000
+++ /dev/null
@@ -1,380 +0,0 @@
-/* learncard.c - Handle the LEARN command
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#include <config.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include "agent.h"
-#include "../assuan/assuan.h"
-
-struct keypair_info_s {
-  struct keypair_info_s *next;
-  int no_cert;
-  char *id;  /* points into grip */
-  char hexgrip[1];
-};
-typedef struct keypair_info_s *KEYPAIR_INFO;
-
-struct kpinfo_cb_parm_s {
-  int error;
-  KEYPAIR_INFO info;
-};
-
-
-struct certinfo_s {
-  struct certinfo_s *next;
-  int type;  
-  int done;
-  char id[1];
-};
-typedef struct certinfo_s *CERTINFO;
-
-struct certinfo_cb_parm_s {
-  int error;
-  CERTINFO info;
-};
-
-
-static void
-release_keypair_info (KEYPAIR_INFO info)
-{
-  while (info)
-    {
-      KEYPAIR_INFO tmp = info->next;
-      xfree (info);
-      info = tmp;
-    }
-}
-
-static void
-release_certinfo (CERTINFO info)
-{
-  while (info)
-    {
-      CERTINFO tmp = info->next;
-      xfree (info);
-      info = tmp;
-    }
-}
-
-
-
-/* This callback is used by agent_card_leanr and passed the content of
-   all KEYPAIRINFO lines.  It merely stores this data away */
-static void
-kpinfo_cb (void *opaque, const char *line)
-{
-  struct kpinfo_cb_parm_s *parm = opaque;
-  KEYPAIR_INFO item;
-  char *p;
-
-  if (parm->error)
-    return; /* no need to gather data after an error coccured */
-  item = xtrycalloc (1, sizeof *item + strlen (line));
-  if (!item)
-    {
-      parm->error = GNUPG_Out_Of_Core;
-      return;
-    }
-  strcpy (item->hexgrip, line);
-  for (p = item->hexgrip; hexdigitp (p); p++)
-    ;
-  if (p == item->hexgrip && *p == 'X' && spacep (p+1))
-    {
-      item->no_cert = 1;
-      p++;
-    }
-  else if ((p - item->hexgrip) != 40 || !spacep (p))
-    { /* not a 20 byte hex keygrip or not followed by a space */
-      parm->error = GNUPG_Invalid_Response;
-      xfree (item);
-      return;
-    }
-  *p++ = 0;
-  while (spacep (p))
-    p++;
-  item->id = p;
-  while (*p && !spacep (p))
-    p++;
-  if (p == item->id)
-    { /* invalid ID string */
-      parm->error = GNUPG_Invalid_Response;
-      xfree (item);
-      return;
-    }
-  *p = 0; /* ignore trailing stuff */
-  
-  /* store it */
-  item->next = parm->info;
-  parm->info = item;
-}
-
-
-/* This callback is used by agent_card_leanr and passed the content of
-   all CERTINFO lines.  It merely stores this data away */
-static void
-certinfo_cb (void *opaque, const char *line)
-{
-  struct certinfo_cb_parm_s *parm = opaque;
-  CERTINFO item;
-  int type;
-  char *p, *pend;
-
-  if (parm->error)
-    return; /* no need to gather data after an error coccured */
-
-  type = strtol (line, &p, 10);
-  while (spacep (p))
-    p++;
-  for (pend = p; *pend && !spacep (pend); pend++)
-    ;
-  if (p == pend || !*p)
-    { 
-      parm->error = GNUPG_Invalid_Response;
-      return;
-    }
-  *pend = 0; /* ignore trailing stuff */
-
-  item = xtrycalloc (1, sizeof *item + strlen (p));
-  if (!item)
-    {
-      parm->error = GNUPG_Out_Of_Core;
-      return;
-    }
-  item->type = type;
-  strcpy (item->id, p);
-  /* store it */
-  item->next = parm->info;
-  parm->info = item;
-}
-
-
-/* Create an S-expression with the shadow info.  */
-static unsigned char *
-make_shadow_info (const char *serialno, const char *idstring)
-{
-  const char *s;
-  unsigned char *info, *p;
-  char numbuf[21];
-  int n;
-
-  for (s=serialno, n=0; *s && s[1]; s += 2)
-    n++;
-
-  info = p = xtrymalloc (1 + 21 + n
-                           + 21 + strlen (idstring) + 1 + 1);
-  *p++ = '(';
-  sprintf (numbuf, "%d:", n);
-  p = stpcpy (p, numbuf);
-  for (s=serialno; *s && s[1]; s += 2)
-    *p++ = xtoi_2 (s);
-  sprintf (numbuf, "%d:", strlen (idstring));
-  p = stpcpy (p, numbuf);
-  p = stpcpy (p, idstring);
-  *p++ = ')';
-  *p = 0;
-  return info;
-}
-
-static int
-send_cert_back (const char *id, void *assuan_context)
-{
-  int rc;
-  char *derbuf;
-  size_t derbuflen;
-  
-  rc = agent_card_readcert (id, &derbuf, &derbuflen);
-  if (rc)
-    {
-      log_error ("error reading certificate: %s\n",
-                 gnupg_strerror (rc));
-      return rc;
-    }
-
-  rc = assuan_send_data (assuan_context, derbuf, derbuflen);
-  xfree (derbuf);
-  if (!rc)
-    rc = assuan_send_data (assuan_context, NULL, 0);
-  if (!rc)
-    rc = assuan_write_line (assuan_context, "END");
-  if (rc)
-    {
-      log_error ("sending certificate failed: %s\n",
-                 assuan_strerror (rc));
-      return map_assuan_err (rc);
-    }
-  return 0;
-}
-
-/* Perform the learn operation.  If ASSUAN_CONTEXT is not NULL all new
-   certificates are send via Assuan */
-int
-agent_handle_learn (void *assuan_context)
-{
-  int rc;
-  struct kpinfo_cb_parm_s parm;
-  struct certinfo_cb_parm_s cparm;
-  char *serialno = NULL;
-  KEYPAIR_INFO item;
-  unsigned char grip[20];
-  char *p;
-  int i;
-  static int certtype_list[] = { 
-    101, /* trusted */
-    102, /* useful */
-    100, /* regular */
-    -1 /* end of list */
-  };
-
-
-  memset (&parm, 0, sizeof parm);
-  memset (&cparm, 0, sizeof cparm);
-
-  /* Check whether a card is present and get the serial number */
-  rc = agent_card_serialno (&serialno);
-  if (rc)
-    goto leave;
-
-  /* now gather all the availabe info */
-  rc = agent_card_learn (kpinfo_cb, &parm, certinfo_cb, &cparm);
-  if (!rc && (parm.error || cparm.error))
-    rc = parm.error? parm.error : cparm.error;
-  if (rc)
-    {
-      log_debug ("agent_card_learn failed: %s\n", gnupg_strerror (rc));
-      goto leave;
-    }
-  
-  log_info ("card has S/N: %s\n", serialno);
-
-  /* Write out the certificates in a standard order. */
-  for (i=0; certtype_list[i] != -1; i++)
-    {
-      CERTINFO citem;
-      for (citem = cparm.info; citem; citem = citem->next)
-        {
-          if (certtype_list[i] != citem->type)
-            continue;
-
-          if (opt.verbose)
-            log_info ("          id: %s    (type=%d)\n",
-                      citem->id, citem->type);
-          
-          if (assuan_context)
-            {
-              rc = send_cert_back (citem->id, assuan_context);
-              if (rc)
-                goto leave;
-              citem->done = 1;
-            }
-        }
-    }
-  
-  for (item = parm.info; item; item = item->next)
-    {
-      unsigned char *pubkey, *shdkey;
-      size_t n;
-
-      if (opt.verbose)
-        log_info ("          id: %s    (grip=%s)\n", item->id, item->hexgrip);
-
-      if (item->no_cert)
-        continue; /* no public key yet available */
-
-      for (p=item->hexgrip, i=0; i < 20; p += 2, i++)
-        grip[i] = xtoi_2 (p);
-      
-      if (!agent_key_available (grip))
-        continue;
-      
-      /* unknown - store it */
-      rc = agent_card_readkey (item->id, &pubkey);
-      if (rc)
-        {
-          log_debug ("agent_card_readkey failed: %s\n", gnupg_strerror (rc));
-          goto leave;
-        }
-
-      {
-        unsigned char *shadow_info = make_shadow_info (serialno, item->id);
-        if (!shadow_info)
-          {
-            rc = GNUPG_Out_Of_Core;
-            xfree (pubkey);
-            goto leave;
-          }
-        rc = agent_shadow_key (pubkey, shadow_info, &shdkey);
-        xfree (shadow_info);
-      }
-      xfree (pubkey);
-      if (rc)
-        {
-          log_error ("shadowing the key failed: %s\n", gnupg_strerror (rc));
-          goto leave;
-        }
-      n = gcry_sexp_canon_len (shdkey, 0, NULL, NULL);
-      assert (n);
-
-      rc = agent_write_private_key (grip, shdkey, n, 0);
-      xfree (shdkey);
-      if (rc)
-        {
-          log_error ("error writing key: %s\n", gnupg_strerror (rc));
-          goto leave;
-        }
-
-      if (opt.verbose)
-        log_info ("stored\n");
-      
-      if (assuan_context)
-        {
-          CERTINFO citem;
-          
-          /* only send the certificate if we have not done so before */
-          for (citem = cparm.info; citem; citem = citem->next)
-            {
-              if (!strcmp (citem->id, item->id))
-                break;
-            }
-          if (!citem)
-            {
-              rc = send_cert_back (item->id, assuan_context);
-              if (rc)
-                goto leave;
-            }
-        }
-    }
-
-  
- leave:
-  xfree (serialno);
-  release_keypair_info (parm.info);
-  release_certinfo (cparm.info);
-  return rc;
-}
-
-
diff --git a/agent/minip12.c b/agent/minip12.c
deleted file mode 100644 (file)
index d8d4733..0000000
+++ /dev/null
@@ -1,1146 +0,0 @@
-/* minip12.c - A minilam pkcs-12 implementation.
- *     Copyright (C) 2002 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG 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.
- *
- * GnuPG 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
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <gcrypt.h>
-
-#undef TEST 
-
-#ifdef TEST
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#endif
-
-#include "../jnlib/logging.h"
-#include "minip12.h"
-
-#ifndef DIM
-#define DIM(v)              (sizeof(v)/sizeof((v)[0]))
-#endif
-
-enum
-{
-  UNIVERSAL = 0,
-  APPLICATION = 1,
-  CONTEXT = 2,
-  PRIVATE = 3
-};
-
-
-enum
-{
-  TAG_NONE = 0,
-  TAG_BOOLEAN = 1,
-  TAG_INTEGER = 2,
-  TAG_BIT_STRING = 3,
-  TAG_OCTET_STRING = 4,
-  TAG_NULL = 5,
-  TAG_OBJECT_ID = 6,
-  TAG_OBJECT_DESCRIPTOR = 7,
-  TAG_EXTERNAL = 8,
-  TAG_REAL = 9,
-  TAG_ENUMERATED = 10,
-  TAG_EMBEDDED_PDV = 11,
-  TAG_UTF8_STRING = 12,
-  TAG_REALTIVE_OID = 13,
-  TAG_SEQUENCE = 16,
-  TAG_SET = 17,
-  TAG_NUMERIC_STRING = 18,
-  TAG_PRINTABLE_STRING = 19,
-  TAG_TELETEX_STRING = 20,
-  TAG_VIDEOTEX_STRING = 21,
-  TAG_IA5_STRING = 22,
-  TAG_UTC_TIME = 23,
-  TAG_GENERALIZED_TIME = 24,
-  TAG_GRAPHIC_STRING = 25,
-  TAG_VISIBLE_STRING = 26,
-  TAG_GENERAL_STRING = 27,
-  TAG_UNIVERSAL_STRING = 28,
-  TAG_CHARACTER_STRING = 29,
-  TAG_BMP_STRING = 30
-};
-
-
-static unsigned char const oid_data[9] = {
-  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01 };
-static unsigned char const oid_encryptedData[9] = {
-  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x06 };
-static unsigned char const oid_pkcs_12_pkcs_8ShroudedKeyBag[11] = {
-  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x02 };
-static unsigned char const oid_pbeWithSHAAnd3_KeyTripleDES_CBC[10] = {
-  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03 };
-
-static unsigned char const oid_rsaEncryption[9] = {
-  0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 };
-
-
-static unsigned char const data_3desiter1024[30] = {
-  0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86,
-  0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30, 0x0E, 
-  0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0x02, 0x02, 0x04, 0x00 };
-#define DATA_3DESITER1024_SALT_OFF  18
-
-
-struct buffer_s 
-{
-  unsigned char *buffer;
-  size_t length;
-};  
-
-
-struct tag_info 
-{
-  int class;
-  int is_constructed;
-  unsigned long tag;
-  unsigned long length;  /* length part of the TLV */
-  int nhdr;
-  int ndef;              /* It is an indefinite length */
-};
-
-
-/* Parse the buffer at the address BUFFER which is of SIZE and return
-   the tag and the length part from the TLV triplet.  Update BUFFER
-   and SIZE on success. */
-static int 
-parse_tag (unsigned char const **buffer, size_t *size, struct tag_info *ti)
-{
-  int c;
-  unsigned long tag;
-  const unsigned char *buf = *buffer;
-  size_t length = *size;
-
-  ti->length = 0;
-  ti->ndef = 0;
-  ti->nhdr = 0;
-
-  /* Get the tag */
-  if (!length)
-    return -1; /* premature eof */
-  c = *buf++; length--;
-  ti->nhdr++;
-
-  ti->class = (c & 0xc0) >> 6;
-  ti->is_constructed = !!(c & 0x20);
-  tag = c & 0x1f;
-
-  if (tag == 0x1f)
-    {
-      tag = 0;
-      do
-        {
-          tag <<= 7;
-          if (!length)
-            return -1; /* premature eof */
-          c = *buf++; length--;
-          ti->nhdr++;
-          tag |= c & 0x7f;
-        }
-      while (c & 0x80);
-    }
-  ti->tag = tag;
-
-  /* Get the length */
-  if (!length)
-    return -1; /* prematureeof */
-  c = *buf++; length--;
-  ti->nhdr++;
-
-  if ( !(c & 0x80) )
-    ti->length = c;
-  else if (c == 0x80)
-    ti->ndef = 1;
-  else if (c == 0xff)
-    return -1; /* forbidden length value */
-  else
-    {
-      unsigned long len = 0;
-      int count = c & 0x7f;
-
-      for (; count; count--)
-        {
-          len <<= 8;
-          if (!length)
-            return -1; /* premature_eof */
-          c = *buf++; length--;
-          ti->nhdr++;
-          len |= c & 0xff;
-        }
-      ti->length = len;
-    }
-  
-  if (ti->class == UNIVERSAL && !ti->tag)
-    ti->length = 0;
-
-  if (ti->length > length)
-    return -1; /* data larger than buffer. */
-  
-  *buffer = buf;
-  *size = length;
-  return 0;
-}
-
-
-static int 
-string_to_key (int id, char *salt, int iter, const char *pw,
-               int req_keylen, unsigned char *keybuf)
-{
-  int rc, i, j;
-  GcryMDHd md;
-  GcryMPI num_b1 = NULL;
-  int pwlen;
-  unsigned char hash[20], buf_b[64], buf_i[128], *p;
-  size_t cur_keylen;
-  size_t n;
-
-  cur_keylen = 0;
-  pwlen = strlen (pw);
-  if (pwlen > 63/2)
-    {
-      log_error ("password too long\n");
-      return -1;
-    }
-
-  /* Store salt and password in BUF_I */
-  p = buf_i;
-  for(i=0; i < 64; i++)
-    *p++ = salt [i%8];
-  for(i=j=0; i < 64; i += 2)
-    {
-      *p++ = 0;
-      *p++ = pw[j];
-      if (++j > pwlen) /* Note, that we include the trailing zero */
-        j = 0;
-    }
-
-  for (;;)
-    {
-      md = gcry_md_open (GCRY_MD_SHA1, 0);
-      if (!md)
-        {
-          log_error ( "gcry_md_open failed: %s\n", gcry_strerror (-1));
-          return -1;
-        }
-      for(i=0; i < 64; i++)
-        gcry_md_putc (md, id);
-      gcry_md_write (md, buf_i, 128);
-      memcpy (hash, gcry_md_read (md, 0), 20);
-      gcry_md_close (md);
-      for (i=1; i < iter; i++)
-        gcry_md_hash_buffer (GCRY_MD_SHA1, hash, hash, 20);
-
-      for (i=0; i < 20 && cur_keylen < req_keylen; i++)
-        keybuf[cur_keylen++] = hash[i];
-      if (cur_keylen == req_keylen)
-        {
-          gcry_mpi_release (num_b1);
-          return 0; /* ready */
-        }
-      
-      /* need more bytes. */
-      for(i=0; i < 64; i++)
-        buf_b[i] = hash[i % 20];
-      n = 64;
-      rc = gcry_mpi_scan (&num_b1, GCRYMPI_FMT_USG, buf_b, &n);
-      if (rc)
-        {
-          log_error ( "gcry_mpi_scan failed: %s\n", gcry_strerror (rc));
-          return -1;
-        }
-      gcry_mpi_add_ui (num_b1, num_b1, 1);
-      for (i=0; i < 128; i += 64)
-        {
-          GcryMPI num_ij;
-
-          n = 64;
-          rc = gcry_mpi_scan (&num_ij, GCRYMPI_FMT_USG, buf_i + i, &n);
-          if (rc)
-            {
-              log_error ( "gcry_mpi_scan failed: %s\n",
-                       gcry_strerror (rc));
-              return -1;
-            }
-          gcry_mpi_add (num_ij, num_ij, num_b1);
-          gcry_mpi_clear_highbit (num_ij, 64*8);
-          n = 64;
-          rc = gcry_mpi_print (GCRYMPI_FMT_USG, buf_i + i, &n, num_ij);
-          if (rc)
-            {
-              log_error ( "gcry_mpi_print failed: %s\n",
-                       gcry_strerror (rc));
-              return -1;
-            }
-          gcry_mpi_release (num_ij);
-        }
-    }
-}
-
-
-static int 
-set_key_iv (GcryCipherHd chd, char *salt, int iter, const char *pw)
-{
-  unsigned char keybuf[24];
-  int rc;
-
-  if (string_to_key (1, salt, iter, pw, 24, keybuf))
-    return -1;
-  rc = gcry_cipher_setkey (chd, keybuf, 24);
-  if (rc)
-    {
-      log_error ( "gcry_cipher_setkey failed: %s\n", gcry_strerror (rc));
-      return -1;
-    }
-
-  if (string_to_key (2, salt, iter, pw, 8, keybuf))
-    return -1;
-  rc = gcry_cipher_setiv (chd, keybuf, 8);
-  if (rc)
-    {
-      log_error ("gcry_cipher_setiv failed: %s\n", gcry_strerror (rc));
-      return -1;
-    }
-  return 0;
-}
-
-
-static void
-crypt_block (unsigned char *buffer, size_t length, char *salt, int iter,
-             const char *pw, int encrypt)
-{
-  GcryCipherHd chd;
-  int rc;
-
-  chd = gcry_cipher_open (GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, 0);
-  if (!chd)
-    {
-      log_error ( "gcry_cipher_open failed: %s\n", gcry_strerror(-1));
-      return;
-    }
-  if (set_key_iv (chd, salt, iter, pw))
-    goto leave;
-
-  rc = encrypt? gcry_cipher_encrypt (chd, buffer, length, NULL, 0)
-              : gcry_cipher_decrypt (chd, buffer, length, NULL, 0);
-
-  if (rc)
-    {
-      log_error ( "en/de-crytion failed: %s\n", gcry_strerror (rc));
-      goto leave;
-    }
-
-/*    { */
-/*      FILE *fp = fopen("inner.der", "wb"); */
-/*      fwrite (buffer, 1, length, fp); */
-/*      fclose (fp); */
-/*    } */
-
- leave:
-  gcry_cipher_close (chd);
-}
-  
-
-
-
-static int
-parse_bag_encrypted_data (const unsigned char *buffer, size_t length,
-                          int startoffset)
-{
-  struct tag_info ti;
-  const unsigned char *p = buffer;
-  size_t n = length;
-  const char *where;
-
-  where = "start";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != CONTEXT || ti.tag)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_SEQUENCE)
-    goto bailout;
-
-  where = "bag.encryptedData.version";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_INTEGER || ti.length != 1 || *p != 0)
-    goto bailout;
-  p++; n--;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_SEQUENCE)
-    goto bailout;
-
-  where = "bag.encryptedData.data";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_OBJECT_ID || ti.length != DIM(oid_data)
-      || memcmp (p, oid_data, DIM(oid_data)))
-    goto bailout;
-  p += DIM(oid_data);
-  n -= DIM(oid_data);
-
-  /* fixme: continue parsing */
-
-  return 0;
- bailout:
-  log_error ("encrptedData error at \"%s\", offset %u\n",
-             where, (p - buffer)+startoffset);
-  return -1;
-}
-
-static GcryMPI *
-parse_bag_data (const unsigned char *buffer, size_t length, int startoffset,
-                const char *pw)
-{
-  int rc;
-  struct tag_info ti;
-  const unsigned char *p = buffer;
-  size_t n = length;
-  const char *where;
-  char salt[8];
-  unsigned int iter;
-  int len;
-  unsigned char *plain = NULL;
-  GcryMPI *result = NULL;
-  int result_count, i;
-
-  where = "start";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != CONTEXT || ti.tag)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_OCTET_STRING)
-    goto bailout;
-
-  where = "data.outerseqs";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-
-  where = "data.objectidentifier";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_OBJECT_ID
-      || ti.length != DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag)
-      || memcmp (p, oid_pkcs_12_pkcs_8ShroudedKeyBag,
-                 DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag)))
-    goto bailout;
-  p += DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag);
-  n -= DIM(oid_pkcs_12_pkcs_8ShroudedKeyBag);
-
-  where = "shrouded,outerseqs";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != CONTEXT || ti.tag)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_OBJECT_ID
-      || ti.length != DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC)
-      || memcmp (p, oid_pbeWithSHAAnd3_KeyTripleDES_CBC,
-                 DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC)))
-    goto bailout;
-  p += DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC);
-  n -= DIM(oid_pbeWithSHAAnd3_KeyTripleDES_CBC);
-
-  where = "3des-params";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_OCTET_STRING || ti.length != 8 )
-    goto bailout;
-  memcpy (salt, p, 8);
-  p += 8;
-  n -= 8;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_INTEGER || !ti.length )
-    goto bailout;
-  for (iter=0; ti.length; ti.length--)
-    {
-      iter <<= 8;
-      iter |= (*p++) & 0xff; 
-      n--;
-    }
-  
-  where = "3des-ciphertext";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class || ti.tag != TAG_OCTET_STRING || !ti.length )
-    goto bailout;
-  
-  log_info ("%lu bytes of 3DES encrypted text\n", ti.length);
-  
-  plain = gcry_malloc_secure (ti.length);
-  if (!plain)
-    {
-      log_error ("error allocating decryption buffer\n");
-      goto bailout;
-    }
-  memcpy (plain, p, ti.length);
-  crypt_block (plain, ti.length, salt, iter, pw, 0);
-  n = ti.length;
-  startoffset = 0;
-  buffer = p = plain;
-
-  where = "decrypted-text";
-  if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_INTEGER
-      || ti.length != 1 || *p)
-    goto bailout;
-  p++; n--;
-  if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  len = ti.length;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (len < ti.nhdr)
-    goto bailout;
-  len -= ti.nhdr;
-  if (ti.class || ti.tag != TAG_OBJECT_ID
-      || ti.length != DIM(oid_rsaEncryption)
-      || memcmp (p, oid_rsaEncryption,
-                 DIM(oid_rsaEncryption)))
-    goto bailout;
-  p += DIM (oid_rsaEncryption);
-  n -= DIM (oid_rsaEncryption);
-  if (len < ti.length)
-    goto bailout;
-  len -= ti.length;
-  if (n < len)
-    goto bailout;
-  p += len;
-  n -= len;
-  if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_OCTET_STRING)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  len = ti.length;
-
-  result = gcry_calloc (10, sizeof *result);
-  if (!result)
-    {
-      log_error ( "error allocating result array\n");
-      goto bailout;
-    }
-  result_count = 0;
-
-  where = "reading.key-parameters";
-  for (result_count=0; len && result_count < 9;)
-    {
-      int dummy_n;
-
-      if (parse_tag (&p, &n, &ti) || ti.class || ti.tag != TAG_INTEGER)
-        goto bailout;
-      if (len < ti.nhdr)
-        goto bailout;
-      len -= ti.nhdr;
-      if (len < ti.length)
-        goto bailout;
-      len -= ti.length;
-      dummy_n = ti.length;
-      if (!result_count && ti.length == 1 && !*p)
-        ; /* ignore the very first one if it is a 0 */
-      else 
-        {
-          rc = gcry_mpi_scan (result+result_count, GCRYMPI_FMT_USG, p,
-                              &dummy_n);
-          if (rc)
-            {
-              log_error ("error parsing key parameter: %s\n",
-                         gcry_strerror (rc));
-              goto bailout;
-            }
-          result_count++;
-        }
-      p += ti.length;
-      n -= ti.length;
-    }
-  if (len)
-    goto bailout;
-
-  return result;
-
- bailout:
-  gcry_free (plain);
-  if (result)
-    {
-      for (i=0; result[i]; i++)
-        gcry_mpi_release (result[i]);
-      gcry_free (result);
-    }
-  log_error ( "data error at \"%s\", offset %u\n",
-              where, (p - buffer) + startoffset);
-  return NULL;
-}
-
-
-/* Parse a PKCS12 object and return an array of MPI representing the
-   secret key parameters.  This is a very limited inplementation in
-   that it is only able to look for 3DES encoded enctyptedData and
-   tries to extract the first private key object it finds.  In case of
-   an error NULL is returned. */
-GcryMPI *
-p12_parse (const unsigned char *buffer, size_t length, const char *pw)
-{
-  struct tag_info ti;
-  const unsigned char *p = buffer;
-  size_t n = length;
-  const char *where;
-  int bagseqlength, len;
-
-  where = "pfx";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_SEQUENCE)
-    goto bailout;
-
-  where = "pfxVersion";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_INTEGER || ti.length != 1 || *p != 3)
-    goto bailout;
-  p++; n--;
-  
-  where = "authSave";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.tag != TAG_OBJECT_ID || ti.length != DIM(oid_data)
-      || memcmp (p, oid_data, DIM(oid_data)))
-    goto bailout;
-  p += DIM(oid_data);
-  n -= DIM(oid_data);
-
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != CONTEXT || ti.tag)
-    goto bailout;
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != UNIVERSAL || ti.tag != TAG_OCTET_STRING)
-    goto bailout;
-
-  where = "bags";
-  if (parse_tag (&p, &n, &ti))
-    goto bailout;
-  if (ti.class != UNIVERSAL || ti.tag != TAG_SEQUENCE)
-    goto bailout;
-  bagseqlength = ti.length;
-  while (bagseqlength)
-    {
-      /*log_debug ( "at offset %u\n", (p - buffer));*/
-      where = "bag-sequence";
-      if (parse_tag (&p, &n, &ti))
-        goto bailout;
-      if (ti.class != UNIVERSAL || ti.tag != TAG_SEQUENCE)
-        goto bailout;
-
-      if (bagseqlength < ti.nhdr)
-        goto bailout;
-      bagseqlength -= ti.nhdr;
-      if (bagseqlength < ti.length)
-        goto bailout;
-      bagseqlength -= ti.length;
-      len = ti.length;
-
-      if (parse_tag (&p, &n, &ti))
-        goto bailout;
-      len -= ti.nhdr;
-      if (ti.tag == TAG_OBJECT_ID && ti.length == DIM(oid_encryptedData)
-          && !memcmp (p, oid_encryptedData, DIM(oid_encryptedData)))
-        {
-          p += DIM(oid_encryptedData);
-          n -= DIM(oid_encryptedData);
-          len -= DIM(oid_encryptedData);
-          where = "bag.encryptedData";
-          if (parse_bag_encrypted_data (p, n, (p - buffer)))
-            goto bailout;
-        }
-      else if (ti.tag == TAG_OBJECT_ID && ti.length == DIM(oid_data)
-          && !memcmp (p, oid_data, DIM(oid_data)))
-        {
-          p += DIM(oid_data);
-          n -= DIM(oid_data);
-          len -= DIM(oid_data);
-          return parse_bag_data (p, n, (p-buffer), pw);
-        }
-      else
-        log_info ( "unknown bag type - skipped\n");
-
-      if (len < 0 || len > n)
-        goto bailout;
-      p += len;
-      n -= len;
-    }
-  
-  return NULL;
- bailout:
-  log_error ("error at \"%s\", offset %u\n", where, (p - buffer));
-  return NULL;
-}
-
-
-\f
-static size_t
-compute_tag_length (size_t n)
-{     
-  int needed = 0;
-
-  if (n < 128)
-    needed += 2; /* tag and one length byte */
-  else if (n < 256)
-    needed += 3; /* tag, number of length bytes, 1 length byte */
-  else if (n < 65536)
-    needed += 4; /* tag, number of length bytes, 2 length bytes */
-  else
-    {
-      log_error ("object too larger to encode\n");
-      return 0;
-    }
-  return needed;
-}
-
-static unsigned char *
-store_tag_length (unsigned char *p, int tag, size_t n)
-{     
-  if (tag == TAG_SEQUENCE)
-    tag |= 0x20; /* constructed */
-
-  *p++ = tag;
-  if (n < 128)
-    *p++ = n;
-  else if (n < 256)
-    {
-      *p++ = 0x81;
-      *p++ = n;
-    }
-  else if (n < 65536)
-    {
-      *p++ = 0x82;
-      *p++ = n >> 8;
-      *p++ = n;
-    }
-
-  return p;
-}
-
-
-/* Create the final PKCS-12 object from the sequences contained in
-   SEQLIST.  That array is terminated with an NULL object */
-static unsigned char *
-create_final (struct buffer_s *sequences, size_t *r_length)
-{
-  int i;
-  size_t needed = 0;
-  size_t n, outseqlen, notsooutseqlen, out0taglen, octstrlen, inseqlen;
-  unsigned char *result, *p;
-  size_t resultlen;
-
-  for (i=0; sequences[i].buffer; i++)
-    needed += sequences[i].length;
-  /* This goes into a sequences. */
-  inseqlen = needed;
-  n = compute_tag_length (needed);
-  needed += n;
-  /* And encapsulate all in an octet string. */
-  octstrlen = needed;
-  n = compute_tag_length (needed);
-  needed += n;
-  /* And tag it with [0]. */
-  out0taglen = needed;
-  n = compute_tag_length (needed);
-  needed += n;
-  /* Prepend an data OID. */
-  needed += 2 + DIM (oid_data);
-  /* This all into a sequences. */
-  notsooutseqlen = needed;
-  n = compute_tag_length (needed);
-  needed += n;
-  /* Prepend the version integer 3. */
-  needed += 3;
-  /* And the final sequence. */
-  outseqlen = needed;
-  n = compute_tag_length (needed);
-  needed += n;
-
-  result = gcry_malloc (needed);
-  if (!result)
-    {
-      log_error ("error allocating buffer\n");
-      return NULL;
-    }
-  p = result;
-
-  /* Store the very outer sequence. */
-  p = store_tag_length (p, TAG_SEQUENCE, outseqlen);
-  /* Store the version integer 3. */
-  *p++ = TAG_INTEGER;
-  *p++ = 1; 
-  *p++ = 3; 
-  /* Store another sequence. */
-  p = store_tag_length (p, TAG_SEQUENCE, notsooutseqlen);
-  /* Store the data OID. */
-  p = store_tag_length (p, TAG_OBJECT_ID, DIM (oid_data));
-  memcpy (p, oid_data, DIM (oid_data)); 
-  p += DIM (oid_data); 
-  /* Next comes a context tag. */
-  p = store_tag_length (p, 0xa0, out0taglen);
-  /* And an octet string. */
-  p = store_tag_length (p, TAG_OCTET_STRING, octstrlen);
-  /* And the inner sequence. */
-  p = store_tag_length (p, TAG_SEQUENCE, inseqlen);
-  /* And append all the buffers. */
-  for (i=0; sequences[i].buffer; i++)
-    {
-      memcpy (p, sequences[i].buffer, sequences[i].length);
-      p += sequences[i].length;
-    }
-
-  /* Ready. */
-  resultlen = p - result;
-  if (needed != resultlen)
-    log_debug ("length mismatch: %u, %u\n", needed, resultlen);
-
-  *r_length = resultlen;
-  return result;
-}
-
-
-/* Expect the RSA key parameters in KPARMS and a password in
-   PW. Create a PKCS structure from it and return it as well as the
-   length in R_LENGTH; return NULL in case of an error. */
-unsigned char * 
-p12_build (GcryMPI *kparms, const char *pw, size_t *r_length)
-{
-  int rc, i;
-  size_t needed, n;
- &