aboutsummaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
Diffstat (limited to 'g10')
-rw-r--r--g10/Makefile.am27
-rw-r--r--g10/Makefile.in329
-rw-r--r--g10/g10.c176
-rw-r--r--g10/g10maint.c624
-rw-r--r--g10/parse-packet.c17
-rw-r--r--g10/seckey-cert.c4
-rw-r--r--g10/trustdb.c74
-rw-r--r--g10/trustdb.h4
8 files changed, 926 insertions, 329 deletions
diff --git a/g10/Makefile.am b/g10/Makefile.am
index e83e63ad2..b0a2e9293 100644
--- a/g10/Makefile.am
+++ b/g10/Makefile.am
@@ -1,15 +1,14 @@
## Process this file with automake to produce Makefile.in
-INCLUDES = -I$(top_srcdir)/include
+INCLUDES = -I.. -I$(top_srcdir)/include
EXTRA_DIST = OPTIONS
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
-bin_PROGRAMS = g10
+bin_PROGRAMS = g10 g10maint
-g10_SOURCES = g10.c \
+common_source = \
build-packet.c \
compress.c \
- encode.c \
- encr-data.c \
filter.h \
free-packet.c \
getkey.c \
@@ -18,7 +17,6 @@ g10_SOURCES = g10.c \
skclist.c \
ringedit.c \
kbnode.c \
- keygen.c \
main.h \
mainproc.c \
armor.c \
@@ -35,22 +33,29 @@ g10_SOURCES = g10.c \
packet.h \
parse-packet.c \
passphrase.c \
- plaintext.c \
pubkey-enc.c \
seckey-cert.c \
seskey.c \
- sign.c \
import.c \
export.c \
comment.c \
status.c \
status.h \
+ sign.c \
+ plaintext.c \
+ encr-data.c \
+ encode.c \
sig-check.c
+g10_SOURCES = g10.c \
+ $(common_source) \
+ keygen.c
+
-LDADD = -L ../cipher -L ../mpi -L ../util \
- -lcipher -lmpi -lutil
+g10maint_SOURCES = g10maint.c \
+ $(common_source)
+LDADD = $(needed_libs)
-$(PROGRAMS): ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
+$(PROGRAMS): $(needed_libs)
diff --git a/g10/Makefile.in b/g10/Makefile.in
index d8b06727a..68c10cba3 100644
--- a/g10/Makefile.in
+++ b/g10/Makefile.in
@@ -1,8 +1,14 @@
-# Makefile.in generated automatically by automake 1.0 from Makefile.am
+# Makefile.in generated automatically by automake 1.2d from Makefile.am
-# Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
SHELL = /bin/sh
@@ -32,22 +38,62 @@ pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
transform = @program_transform_name@
-INCLUDES = -I$(top_srcdir)/include
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@
+CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@
+CPP = @CPP@
+DATADIRNAME = @DATADIRNAME@
+G10_LOCALEDIR = @G10_LOCALEDIR@
+GENCAT = @GENCAT@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+INSTOBJEXT = @INSTOBJEXT@
+INTLDEPS = @INTLDEPS@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTLSUB = @INTLSUB@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MSGFMT = @MSGFMT@
+PACKAGE = @PACKAGE@
+POFILES = @POFILES@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+
+INCLUDES = -I.. -I$(top_srcdir)/include
EXTRA_DIST = OPTIONS
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
-bin_PROGRAMS = g10
+bin_PROGRAMS = g10 g10maint
-g10_SOURCES = g10.c \
+common_source = \
build-packet.c \
compress.c \
- encode.c \
- encr-data.c \
filter.h \
free-packet.c \
getkey.c \
@@ -56,7 +102,6 @@ g10_SOURCES = g10.c \
skclist.c \
ringedit.c \
kbnode.c \
- keygen.c \
main.h \
mainproc.c \
armor.c \
@@ -73,228 +118,259 @@ g10_SOURCES = g10.c \
packet.h \
parse-packet.c \
passphrase.c \
- plaintext.c \
pubkey-enc.c \
seckey-cert.c \
seskey.c \
- sign.c \
import.c \
export.c \
comment.c \
status.c \
status.h \
+ sign.c \
+ plaintext.c \
+ encr-data.c \
+ encode.c \
sig-check.c
-LDADD = -L ../cipher -L ../mpi -L ../util \
- -lcipher -lmpi -lutil
-mkinstalldirs = $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../config.h
-PROGRAMS = $(bin_PROGRAMS)
+g10_SOURCES = g10.c \
+ $(common_source) \
+ keygen.c
+g10maint_SOURCES = g10maint.c \
+ $(common_source)
+
+LDADD = $(needed_libs)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+PROGRAMS = $(bin_PROGRAMS)
-CC = @CC@
-LEX = @LEX@
-YACC = @YACC@
DEFS = @DEFS@ -I. -I$(srcdir) -I..
CPPFLAGS = @CPPFLAGS@
-CFLAGS = @CFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
-LINK = $(CC) $(LDFLAGS) -o $@
-g10_OBJECTS = g10.o build-packet.o compress.o encode.o encr-data.o \
-free-packet.o getkey.o pkclist.o skclist.o ringedit.o kbnode.o keygen.o \
-mainproc.o armor.o mdfilter.o textfilter.o cipher.o elg.o rsa.o \
-openfile.o keyid.o trustdb.o parse-packet.o passphrase.o plaintext.o \
-pubkey-enc.o seckey-cert.o seskey.o sign.o import.o export.o comment.o \
-status.o sig-check.o
-EXTRA_g10_SOURCES =
+g10_OBJECTS = g10.o build-packet.o compress.o free-packet.o getkey.o \
+pkclist.o skclist.o ringedit.o kbnode.o mainproc.o armor.o mdfilter.o \
+textfilter.o cipher.o elg.o rsa.o openfile.o keyid.o trustdb.o \
+parse-packet.o passphrase.o pubkey-enc.o seckey-cert.o seskey.o \
+import.o export.o comment.o status.o sign.o plaintext.o encr-data.o \
+encode.o sig-check.o keygen.o
g10_LDADD = $(LDADD)
-DIST_COMMON = Makefile.am Makefile.in
+g10_DEPENDENCIES = ../cipher/libcipher.a ../mpi/libmpi.a \
+../util/libutil.a
+g10_LDFLAGS =
+g10maint_OBJECTS = g10maint.o build-packet.o compress.o free-packet.o \
+getkey.o pkclist.o skclist.o ringedit.o kbnode.o mainproc.o armor.o \
+mdfilter.o textfilter.o cipher.o elg.o rsa.o openfile.o keyid.o \
+trustdb.o parse-packet.o passphrase.o pubkey-enc.o seckey-cert.o \
+seskey.o import.o export.o comment.o status.o sign.o plaintext.o \
+encr-data.o encode.o sig-check.o
+g10maint_LDADD = $(LDADD)
+g10maint_DEPENDENCIES = ../cipher/libcipher.a ../mpi/libmpi.a \
+../util/libutil.a
+g10maint_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
-PACKAGE = @PACKAGE@
-VERSION = @VERSION@
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(BUILT_SOURCES) $(HEADERS) \
- $(TEXINFOS) $(INFOS) $(MANS) $(EXTRA_DIST) $(DATA)
-DEP_DISTFILES = $(DIST_COMMON) $(SOURCES) $(BUILT_SOURCES) $(HEADERS) \
- $(TEXINFOS) $(INFO_DEPS) $(MANS) $(EXTRA_DIST) $(DATA)
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
-DEP_FILES = $(srcdir)/.deps/armor.P $(srcdir)/.deps/build-packet.P \
-$(srcdir)/.deps/cipher.P $(srcdir)/.deps/comment.P \
-$(srcdir)/.deps/compress.P $(srcdir)/.deps/elg.P \
-$(srcdir)/.deps/encode.P $(srcdir)/.deps/encr-data.P \
-$(srcdir)/.deps/export.P $(srcdir)/.deps/free-packet.P \
-$(srcdir)/.deps/g10.P $(srcdir)/.deps/getkey.P $(srcdir)/.deps/import.P \
-$(srcdir)/.deps/kbnode.P $(srcdir)/.deps/keygen.P \
-$(srcdir)/.deps/keyid.P $(srcdir)/.deps/mainproc.P \
-$(srcdir)/.deps/mdfilter.P $(srcdir)/.deps/openfile.P \
-$(srcdir)/.deps/parse-packet.P $(srcdir)/.deps/passphrase.P \
-$(srcdir)/.deps/pkclist.P $(srcdir)/.deps/plaintext.P \
-$(srcdir)/.deps/pubkey-enc.P $(srcdir)/.deps/ringedit.P \
-$(srcdir)/.deps/rsa.P $(srcdir)/.deps/seckey-cert.P \
-$(srcdir)/.deps/seskey.P $(srcdir)/.deps/sig-check.P \
-$(srcdir)/.deps/sign.P $(srcdir)/.deps/skclist.P \
-$(srcdir)/.deps/status.P $(srcdir)/.deps/textfilter.P \
-$(srcdir)/.deps/trustdb.P
-SOURCES = $(g10_SOURCES)
-OBJECTS = $(g10_OBJECTS)
+GZIP = --best
+DEP_FILES = .deps/armor.P .deps/build-packet.P .deps/cipher.P \
+.deps/comment.P .deps/compress.P .deps/elg.P .deps/encode.P \
+.deps/encr-data.P .deps/export.P .deps/free-packet.P .deps/g10.P \
+.deps/g10maint.P .deps/getkey.P .deps/import.P .deps/kbnode.P \
+.deps/keygen.P .deps/keyid.P .deps/mainproc.P .deps/mdfilter.P \
+.deps/openfile.P .deps/parse-packet.P .deps/passphrase.P \
+.deps/pkclist.P .deps/plaintext.P .deps/pubkey-enc.P .deps/ringedit.P \
+.deps/rsa.P .deps/seckey-cert.P .deps/seskey.P .deps/sig-check.P \
+.deps/sign.P .deps/skclist.P .deps/status.P .deps/textfilter.P \
+.deps/trustdb.P
+SOURCES = $(g10_SOURCES) $(g10maint_SOURCES)
+OBJECTS = $(g10_OBJECTS) $(g10maint_OBJECTS)
default: all
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu g10/Makefile
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in
- cd $(top_srcdir) && automake $(subdir)/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-Makefile: $(top_builddir)/config.status Makefile.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
mostlyclean-binPROGRAMS:
clean-binPROGRAMS:
- rm -f $(bin_PROGRAMS)
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
distclean-binPROGRAMS:
maintainer-clean-binPROGRAMS:
install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
$(mkinstalldirs) $(bindir)
- list="$(bin_PROGRAMS)"; for p in $$list; do \
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
if test -f $$p; then \
- $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed '$(transform)'`; \
+ echo " $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed '$(transform)'`"; \
+ $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed '$(transform)'`; \
else :; fi; \
done
uninstall-binPROGRAMS:
- list="$(bin_PROGRAMS)"; for p in $$list; do \
+ $(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
rm -f $(bindir)/`echo $$p|sed '$(transform)'`; \
done
.c.o:
- $(COMPILE) $<
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
mostlyclean-compile:
- rm -f *.o core
+ -rm -f *.o core
clean-compile:
distclean-compile:
- rm -f *.tab.c
+ -rm -f *.tab.c
maintainer-clean-compile:
-$(g10_OBJECTS): ../config.h
g10: $(g10_OBJECTS) $(g10_DEPENDENCIES)
- $(LINK) $(g10_OBJECTS) $(g10_LDADD) $(LIBS)
+ @rm -f g10
+ $(LINK) $(g10_LDFLAGS) $(g10_OBJECTS) $(g10_LDADD) $(LIBS)
-ID: $(HEADERS) $(SOURCES)
- here=`pwd` && cd $(srcdir) && mkid -f$$here/ID $(SOURCES) $(HEADERS)
+g10maint: $(g10maint_OBJECTS) $(g10maint_DEPENDENCIES)
+ @rm -f g10maint
+ $(LINK) $(g10maint_LDFLAGS) $(g10maint_OBJECTS) $(g10maint_LDADD) $(LIBS)
tags: TAGS
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES)
- here=`pwd` && cd $(srcdir) && etags $(ETAGS_ARGS) $(SOURCES) $(HEADERS) -o $$here/TAGS
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ test -z "$(ETAGS_ARGS)$(SOURCES)$(HEADERS)$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $(SOURCES) $(HEADERS) $(LISP) -o $$here/TAGS)
mostlyclean-tags:
clean-tags:
distclean-tags:
- rm -f TAGS ID
+ -rm -f TAGS ID
maintainer-clean-tags:
-subdir = g10
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-distdir: $(DEP_DISTFILES)
- @for file in `cd $(srcdir) && echo $(DISTFILES)`; do \
+
+subdir = g10
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu g10/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
test -f $(distdir)/$$file \
- || ln $(srcdir)/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $(srcdir)/$$file $(distdir)/$$file; \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file; \
done
-# This fragment is probably only useful for maintainers. It relies on
-# GNU make and gcc. It is only included in the generated Makefile.in
-# if `automake' is not passed the `--include-deps' flag.
-
-MKDEP = gcc -MM $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+MKDEP = $(CC) -M $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
--include $(srcdir)/.deps/.P
-$(srcdir)/.deps/.P: $(BUILT_SOURCES)
- cd $(srcdir) && test -d .deps || mkdir .deps
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+-include .deps/.P
+.deps/.P: $(BUILT_SOURCES)
echo > $@
-include $(DEP_FILES)
-$(DEP_FILES): $(srcdir)/.deps/.P
-
-$(srcdir)/.deps/%.P: $(srcdir)/%.c
- @echo "mkdeps $< > $@"
- @re=`echo 's,^$(srcdir)//*,,g;s, $(srcdir)//*, ,g' | sed 's,\.,\\\\.,g'`; \
- $(MKDEP) $< | sed "$$re" > $@-tmp
- @if test -n "$o"; then \
- sed 's/\.o:/$$o:/' $@-tmp > $@; \
- rm $@-tmp; \
- else \
- mv $@-tmp $@; \
- fi
-
-# End of maintainer-only section
-info:
-dvi:
+mostlyclean-depend:
-check: all
+clean-depend:
-installcheck:
+distclean-depend:
+
+maintainer-clean-depend:
+ -rm -rf .deps
+.deps/%.P: %.c
+ @echo "Computing dependencies for $<..."
+ @o='o'; \
+ test -n "$o" && o='$$o'; \
+ $(MKDEP) $< >[email protected] \
+ && sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," < [email protected] > $@ \
+info:
+dvi:
+check: all
+ $(MAKE)
+installcheck:
install-exec: install-binPROGRAMS
+ @$(NORMAL_INSTALL)
install-data:
+ @$(NORMAL_INSTALL)
install: install-exec install-data all
@:
uninstall: uninstall-binPROGRAMS
-all: $(PROGRAMS) Makefile
+all: Makefile $(PROGRAMS)
install-strip:
- $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
installdirs:
$(mkinstalldirs) $(bindir)
mostlyclean-generic:
- test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
- test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- rm -f Makefile $(DISTCLEANFILES)
- rm -f config.cache config.log $(CONFIG_HEADER) stamp-h
+ -rm -f Makefile $(DISTCLEANFILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
- test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
- test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean: mostlyclean-binPROGRAMS mostlyclean-compile \
- mostlyclean-tags mostlyclean-generic
+ mostlyclean-tags mostlyclean-depend mostlyclean-generic
-clean: clean-binPROGRAMS clean-compile clean-tags clean-generic \
- mostlyclean
+clean: clean-binPROGRAMS clean-compile clean-tags clean-depend \
+ clean-generic mostlyclean
distclean: distclean-binPROGRAMS distclean-compile distclean-tags \
- distclean-generic clean
- rm -f config.status
+ distclean-depend distclean-generic clean
+ -rm -f config.status
maintainer-clean: maintainer-clean-binPROGRAMS maintainer-clean-compile \
- maintainer-clean-tags maintainer-clean-generic \
- distclean
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
@@ -302,15 +378,14 @@ maintainer-clean: maintainer-clean-binPROGRAMS maintainer-clean-compile \
clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \
install-binPROGRAMS mostlyclean-compile distclean-compile clean-compile \
maintainer-clean-compile tags mostlyclean-tags distclean-tags \
-clean-tags maintainer-clean-tags distdir info dvi check installcheck \
-install-exec install-data install uninstall all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
+clean-tags maintainer-clean-tags distdir mostlyclean-depend \
+distclean-depend clean-depend maintainer-clean-depend info dvi \
+installcheck install-exec install-data install uninstall all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-$(PROGRAMS): ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
-.SUFFIXES:
-.SUFFIXES: .c .o
+$(PROGRAMS): $(needed_libs)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/g10/g10.c b/g10/g10.c
index 9b593e027..16ec5c277 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -42,18 +42,15 @@
enum cmd_values { aNull = 0,
- aSym, aStore, aEncr, aPrimegen, aKeygen, aSign, aSignEncr,
- aPrintMDs, aSignKey, aClearsig, aListPackets, aEditSig,
- aKMode, aKModeC, aChangePass, aImport, aListTrustDB,
- aListTrustPath, aExport,
+ aSym, aStore, aEncr, aKeygen, aSign, aSignEncr,
+ aSignKey, aClearsig, aListPackets, aEditSig,
+ aKMode, aKModeC, aChangePass, aImport,
+ aExport,
aTest };
static void set_cmd( enum cmd_values *ret_cmd,
enum cmd_values new_cmd );
-static void print_hex( byte *p, size_t n );
-static void print_mds( const char *fname );
-static void do_test(int);
const char *
strusage( int level )
@@ -104,7 +101,7 @@ strusage( int level )
static void
i18n_init(void)
{
- #ifdef HAVE_LIBINTL
+ #ifdef ENABLE_NLS
setlocale( LC_MESSAGES, "" );
bindtextdomain( PACKAGE, G10_LOCALEDIR );
textdomain( PACKAGE );
@@ -189,10 +186,7 @@ main( int argc, char **argv )
{ 510, "debug" ,4|16, N_("set debugging flags")},
{ 511, "debug-all" ,0, N_("enable full debugging")},
{ 512, "status-fd" ,1, N_("write status info to this fd") },
- { 513, "gen-prime" , 0, "\r" },
- { 514, "test" , 0, "\r" },
{ 515, "fingerprint", 0, N_("show the fingerprints")},
- { 516, "print-mds" , 0, N_("print all message digests")},
{ 517, "secret-keyring" ,2, N_("add this secret keyring to the list")},
{ 518, "options" , 2, N_("read options from file")},
{ 519, "no-armor", 0, "\r"},
@@ -207,13 +201,12 @@ main( int argc, char **argv )
{ 528, "pubkey-algo", 2 , N_("select default puplic key algorithm")},
{ 529, "digest-algo", 2 , N_("select default message digest algorithm")},
{ 530, "import", 0 , N_("put public keys into the trustdb")},
- { 531, "list-trustdb",0 , "\r"},
{ 532, "quick-random", 0, "\r"},
- { 533, "list-trust-path",0, "\r"},
{ 534, "no-comment", 0, N_("do not write comment packets")},
{ 535, "completes-needed", 1, N_("(default is 1)")},
{ 536, "marginals-needed", 1, N_("(default is 3)")},
{ 537, "export", 0, N_("export all or the given keys") },
+ { 538, "trustdb-name", 2, "\r" },
{0} };
ARGPARSE_ARGS pargs;
@@ -236,6 +229,7 @@ main( int argc, char **argv )
int default_keyring = 1;
int greeting = 1;
enum cmd_values cmd = 0;
+ const char *trustdb_name = NULL;
secmem_init( 16384 );
@@ -331,10 +325,7 @@ main( int argc, char **argv )
case 510: opt.debug |= pargs.r.ret_ulong; break;
case 511: opt.debug = ~0; break;
case 512: set_status_fd( pargs.r.ret_int ); break;
- case 513: set_cmd( &cmd, aPrimegen); break;
- case 514: set_cmd( &cmd, aTest); break;
case 515: opt.fingerprint = 1; break;
- case 516: set_cmd( &cmd, aPrintMDs); break;
case 517: add_secret_keyring(pargs.r.ret_str); sec_nrings++; break;
case 518:
/* config files may not be nested (silently ignore them) */
@@ -362,13 +353,12 @@ main( int argc, char **argv )
opt.def_digest_algo = string_to_digest_algo(pargs.r.ret_str);
break;
case 530: set_cmd( &cmd, aImport); break;
- case 531: set_cmd( &cmd, aListTrustDB); break;
case 532: quick_random_gen(1); break;
- case 533: set_cmd( &cmd, aListTrustPath); break;
case 534: opt.no_comment=1; break;
case 535: opt.completes_needed = pargs.r.ret_int; break;
case 536: opt.marginals_needed = pargs.r.ret_int; break;
case 537: set_cmd( &cmd, aExport); break;
+ case 538: trustdb_name = pargs.r.ret_str; break;
default : errors++; pargs.err = configfp? 1:2; break;
}
}
@@ -453,13 +443,7 @@ main( int argc, char **argv )
}
}
- switch( cmd ) {
- case aPrimegen:
- case aPrintMDs:
- break;
- case aListTrustDB: rc = init_trustdb( argc? 1:0 ); break;
- default: rc = init_trustdb(1); break;
- }
+ rc = init_trustdb(1, trustdb_name );
if( rc )
log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
@@ -578,46 +562,12 @@ main( int argc, char **argv )
usage(1);
break;
- case aPrimegen:
- if( argc == 1 ) {
- mpi_print( stdout, generate_public_prime( atoi(argv[0]) ), 1);
- putchar('\n');
- }
- else if( argc == 2 ) {
- mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
- atoi(argv[1]), NULL ), 1);
- putchar('\n');
- }
- else if( argc == 3 ) {
- MPI g = mpi_alloc(1);
- mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
- atoi(argv[1]), g ), 1);
- printf("\nGenerator: ");
- mpi_print( stdout, g, 1 );
- putchar('\n');
- mpi_free(g);
- }
- else
- usage(1);
- break;
-
- case aPrintMDs:
- if( !argc )
- print_mds(NULL);
- else {
- for(; argc; argc--, argv++ )
- print_mds(*argv);
- }
- break;
-
case aKeygen: /* generate a key (interactive) */
if( argc )
usage(1);
generate_keypair();
break;
- case aTest: do_test( argc? atoi(*argv): 0 ); break;
-
case aImport:
if( !argc )
usage(1);
@@ -637,22 +587,6 @@ main( int argc, char **argv )
free_strlist(sl);
break;
-
- case aListTrustDB:
- if( !argc )
- list_trustdb(NULL);
- else {
- for( ; argc; argc--, argv++ )
- list_trustdb( *argv );
- }
- break;
-
- case aListTrustPath:
- if( argc != 2 )
- wrong_args("--list-trust-path [-- -]<maxdepth> <username>");
- list_trust_path( atoi(*argv), argv[1] );
- break;
-
case aListPackets:
opt.list_packets=1;
default:
@@ -693,95 +627,3 @@ g10_exit( int rc )
}
-static void
-print_hex( byte *p, size_t n )
-{
- int i;
-
- if( n == 20 ) {
- for(i=0; i < n ; i++, i++, p += 2 ) {
- if( i == 10 )
- putchar(' ');
- printf(" %02X%02X", *p, p[1] );
- }
- }
- else {
- for(i=0; i < n ; i++, p++ ) {
- if( i && !(i%8) )
- putchar(' ');
- printf(" %02X", *p );
- }
- }
-}
-
-static void
-print_mds( const char *fname )
-{
- FILE *fp;
- char buf[1024];
- size_t n;
- MD_HANDLE md;
-
- if( !fname ) {
- fp = stdin;
- fname = "[stdin]";
- }
- else
- fp = fopen( fname, "rb" );
- if( !fp ) {
- log_error("%s: %s\n", fname, strerror(errno) );
- return;
- }
-
- md = md_open( DIGEST_ALGO_MD5, 0 );
- md_enable( md, DIGEST_ALGO_RMD160 );
- md_enable( md, DIGEST_ALGO_SHA1 );
-
- while( (n=fread( buf, 1, DIM(buf), fp )) )
- md_write( md, buf, n );
- if( ferror(fp) )
- log_error("%s: %s\n", fname, strerror(errno) );
- else {
- md_final(md);
- printf( "%s: MD5 =", fname ); print_hex(md_read(md, DIGEST_ALGO_MD5), 16 );
- printf("\n%s: RMD160 =", fname ); print_hex(md_read(md, DIGEST_ALGO_RMD160), 20 );
- printf("\n%s: SHA1 =", fname ); print_hex(md_read(md, DIGEST_ALGO_SHA1), 20 );
- putchar('\n');
- }
-
-
- md_close(md);
-
- if( fp != stdin )
- fclose(fp);
-}
-
-
-
-static void
-do_test(int times)
-{
- #if 0
- MPI t = mpi_alloc( 50 );
- MPI m = mpi_alloc( 50 );
- MPI a = mpi_alloc( 50 );
- MPI b = mpi_alloc( 50 );
- MPI p = mpi_alloc( 50 );
- MPI x = mpi_alloc( 50 );
-
- /* output = b/(a^x) mod p */
- log_debug("invm %d times ", times);
- for( ; times > 0; times -- ) {
- mpi_fromstr(a, "0xef45678343589854354a4545545454554545455"
- "aaaaaaaaaaaaa44444fffdecb33434343443331" );
- mpi_fromstr(b, "0x8765765589854354a4545545454554545455"
- "aaaaaaa466577778decb36666343443331" );
- mpi_invm( t, a, b );
- fputc('.', stderr); fflush(stderr);
- }
-
-
- m_check(NULL);
- #endif
-}
-
diff --git a/g10/g10maint.c b/g10/g10maint.c
new file mode 100644
index 000000000..f02bb11e7
--- /dev/null
+++ b/g10/g10maint.c
@@ -0,0 +1,624 @@
+/* g10maint.c - The G10 maintenance utility
+ * Copyright (c) 1997 by Werner Koch (dd9jn)
+ *
+ * This file is part of G10.
+ *
+ * G10 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.
+ *
+ * G10 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 <unistd.h>
+
+#include "packet.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "options.h"
+#include "keydb.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "filter.h"
+#include "trustdb.h"
+#include "ttyio.h"
+#include "i18n.h"
+#include "status.h"
+
+
+enum cmd_values { aNull = 0,
+ aPrimegen, aPrintMDs, aListPackets, aKMode, aKModeC,
+ aListTrustDB, aListTrustPath,
+aTest };
+
+
+static void set_cmd( enum cmd_values *ret_cmd,
+ enum cmd_values new_cmd );
+static void print_hex( byte *p, size_t n );
+static void print_mds( const char *fname );
+static void do_test(int);
+
+const char *
+strusage( int level )
+{
+ const char *p;
+ switch( level ) {
+ case 10:
+ case 0: p = "g10maint - v" VERSION "; "
+ "Copyright 1997 Werner Koch (dd9jn)\n" ; break;
+ case 13: p = "g10"; break;
+ case 14: p = VERSION; break;
+ case 1:
+ case 11: p = "Usage: g10main [options] (-h for help)";
+ break;
+ case 2:
+ case 12: p =
+ _("Syntax: g10maint [options]\n"
+ "The G10 maintenace utility\n"); break;
+
+ case 26:
+ p = _("Please report bugs to <[email protected]>.\n");
+ break;
+
+ #if !defined(HAVE_ZLIB_H) && defined(HAVE_RSA_CIPHER)
+ case 30: p = _(
+ " NOTE: This version is compiled without ZLIB support;\n"
+ " you are not able to process compresssed data!\n"
+ "WARNING: This version has RSA support! Your are not allowed to\n"
+ " use it inside the Unites States before Sep 30, 2000!\n" );
+ #elif !defined(HAVE_ZLIB_H)
+ case 30: p = _(
+ " NOTE: This version is compiled without ZLIB support;\n"
+ " you are not able to process compresssed data!\n");
+ #elif defined(HAVE_RSA_CIPHER)
+ case 30: p = _(
+ "WARNING: This version has RSA support! Your are not allowed to\n"
+ " use it inside the Unites States before Sep 30, 2000!\n" );
+ #else
+ case 30: p = "";
+ #endif
+ break;
+ default: p = default_strusage(level);
+ }
+ return p;
+}
+
+static void
+i18n_init(void)
+{
+ #ifdef ENABLE_NLS
+ setlocale( LC_MESSAGES, "" );
+ bindtextdomain( PACKAGE, G10_LOCALEDIR );
+ textdomain( PACKAGE );
+ #endif
+}
+
+static void
+wrong_args( const char *text)
+{
+ fputs(_("Usage: g10maint [options] "),stderr);
+ fputs(text,stderr);
+ putc('\n',stderr);
+ g10_exit(2);
+}
+
+static void
+set_debug(void)
+{
+ if( opt.debug & DBG_MEMORY_VALUE )
+ memory_debug_mode = 1;
+ if( opt.debug & DBG_MEMSTAT_VALUE )
+ memory_stat_debug_mode = 1;
+ if( opt.debug & DBG_MPI_VALUE )
+ mpi_debug_mode = 1;
+ if( opt.debug & DBG_CIPHER_VALUE )
+ cipher_debug_mode = 1;
+ if( opt.debug & DBG_IOBUF_VALUE )
+ iobuf_debug_mode = 1;
+}
+
+
+static void
+set_cmd( enum cmd_values *ret_cmd, enum cmd_values new_cmd )
+{
+ enum cmd_values cmd = *ret_cmd;
+
+ if( !cmd || cmd == new_cmd )
+ cmd = new_cmd;
+ else if( cmd == aKMode && new_cmd == aKModeC )
+ cmd = aKModeC;
+ else {
+ log_error(_("conflicting commands\n"));
+ g10_exit(2);
+ }
+
+ *ret_cmd = cmd;
+}
+
+
+void
+main( int argc, char **argv )
+{
+ static ARGPARSE_OPTS opts[] = {
+ { 'v', "verbose", 0, N_("verbose") },
+ { 'n', "dry-run", 0, N_("don't make any changes") },
+ { 'o', "output", 2, N_("use as output file")},
+ { 'c', NULL , 0, N_("check signatures")},
+ { 500, "batch", 0, N_("batch mode: never ask")},
+ { 501, "yes", 0, N_("assume yes on most questions")},
+ { 502, "no", 0, N_("assume no on most questions")},
+ { 509, "keyring" ,2, N_("add this keyring to the list of keyrings")},
+ { 'k', NULL , 0, N_("list keys")},
+ { 510, "debug" ,4|16, N_("set debugging flags")},
+ { 511, "debug-all" ,0, N_("enable full debugging")},
+ { 512, "status-fd" ,1, N_("write status info to this fd") },
+ { 513, "gen-prime" , 0, "\r" },
+ { 514, "test" , 0, "\r" },
+ { 516, "print-mds" , 0, N_("print all message digests")},
+ { 517, "secret-keyring" ,2, N_("add this secret keyring to the list")},
+ { 518, "options" , 2, N_("read options from file")},
+ { 519, "no-armor", 0, "\r"},
+ { 520, "no-default-keyring", 0, "\r" },
+ { 521, "list-packets",0,N_("list only the sequence of packets")},
+ { 522, "no-greeting", 0, "\r" },
+ { 526, "no-verbose", 0, "\r"},
+ { 531, "list-trustdb",0 , "\r"},
+ { 533, "list-trust-path",0, "\r"},
+ { 534, "no-comment", 0, N_("do not write comment packets")},
+ { 535, "completes-needed", 1, N_("(default is 1)")},
+ { 536, "marginals-needed", 1, N_("(default is 3)")},
+ { 538, "trustdb-name", 2, "\r" },
+
+ {0} };
+ ARGPARSE_ARGS pargs;
+ IOBUF a;
+ int rc=0;
+ int orig_argc;
+ char **orig_argv;
+ const char *fname, *fname_print;
+ STRLIST remusr= NULL, locusr=NULL;
+ int nrings=0, sec_nrings=0;
+ armor_filter_context_t afx;
+ const char *s;
+ FILE *configfp = NULL;
+ char *configname = NULL;
+ unsigned configlineno;
+ int parse_verbose = 0;
+ int default_config =1;
+ int errors=0;
+ int default_keyring = 1;
+ int greeting = 1;
+ enum cmd_values cmd = 0;
+ const char *trustdb_name = NULL;
+
+
+ secmem_init( 0 ); /* disable use of secmem */
+
+ i18n_init();
+ opt.compress = -1; /* defaults to standard compress level */
+ opt.def_cipher_algo = CIPHER_ALGO_BLOWFISH;
+ opt.def_pubkey_algo = PUBKEY_ALGO_ELGAMAL;
+ opt.def_digest_algo = DIGEST_ALGO_RMD160;
+ opt.completes_needed = 1;
+ opt.marginals_needed = 3;
+
+ /* check wether we have a config file on the commandline */
+ orig_argc = argc;
+ orig_argv = argv;
+ pargs.argc = &argc;
+ pargs.argv = &argv;
+ pargs.flags= 1; /* do not remove the args */
+ while( arg_parse( &pargs, opts) ) {
+ if( pargs.r_opt == 'v' )
+ parse_verbose++;
+ else if( pargs.r_opt == 518 ) {
+ /* 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;
+ }
+ }
+
+ if( default_config )
+ configname = make_filename("~/.g10", "options", 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_verbose > 1 )
+ log_info(_("note: no default option file '%s'\n"), configname );
+ }
+ else
+ log_fatal(_("option file '%s': %s\n"),
+ configname, strerror(errno) );
+ m_free(configname); configname = NULL;
+ }
+ if( parse_verbose > 1 )
+ log_info(_("reading options from '%s'\n"), configname );
+ default_config = 0;
+ }
+
+ while( optfile_parse( configfp, configname, &configlineno,
+ &pargs, opts) ) {
+ switch( pargs.r_opt ) {
+ case 'v': opt.verbose++;
+ opt.list_sigs=1;
+ break;
+ case 'o': opt.outfile = pargs.r.ret_str; break;
+ case 'k': set_cmd( &cmd, aKMode ); break;
+ case 'c': set_cmd( &cmd, aKModeC ); break;
+ case 500: opt.batch = 1; greeting = 0; break;
+ case 501: opt.answer_yes = 1; break;
+ case 502: opt.answer_no = 1; break;
+ case 508: opt.check_sigs = 1; opt.list_sigs = 1; break;
+ case 509: add_keyring(pargs.r.ret_str); nrings++; break;
+ case 510: opt.debug |= pargs.r.ret_ulong; break;
+ case 511: opt.debug = ~0; break;
+ case 512: set_status_fd( pargs.r.ret_int ); break;
+ case 513: set_cmd( &cmd, aPrimegen); break;
+ case 514: set_cmd( &cmd, aTest); break;
+ case 515: opt.fingerprint = 1; break;
+ case 516: set_cmd( &cmd, aPrintMDs); break;
+ case 517: add_secret_keyring(pargs.r.ret_str); sec_nrings++; break;
+ case 518:
+ /* config files may not be nested (silently ignore them) */
+ if( !configfp ) {
+ m_free(configname);
+ configname = m_strdup(pargs.r.ret_str);
+ goto next_pass;
+ }
+ break;
+ case 519: opt.no_armor=1; opt.armor=0; break;
+ case 520: default_keyring = 0; break;
+ case 521: set_cmd( &cmd, aListPackets); break;
+ case 522: greeting = 0; break;
+ case 523: set_passphrase_fd( pargs.r.ret_int ); break;
+ case 526: opt.verbose = 0; opt.list_sigs=0; break;
+ case 527:
+ opt.def_cipher_algo = string_to_cipher_algo(pargs.r.ret_str);
+ break;
+ case 528:
+ opt.def_pubkey_algo = string_to_pubkey_algo(pargs.r.ret_str);
+ break;
+ case 529:
+ opt.def_digest_algo = string_to_digest_algo(pargs.r.ret_str);
+ break;
+ case 531: set_cmd( &cmd, aListTrustDB); break;
+ case 532: quick_random_gen(1); break;
+ case 533: set_cmd( &cmd, aListTrustPath); break;
+ case 534: opt.no_comment=1; break;
+ case 535: opt.completes_needed = pargs.r.ret_int; break;
+ case 536: opt.marginals_needed = pargs.r.ret_int; break;
+ case 538: trustdb_name = pargs.r.ret_str; break;
+ default : errors++; pargs.err = configfp? 1:2; break;
+ }
+ }
+ if( configfp ) {
+ fclose( configfp );
+ configfp = NULL;
+ m_free(configname); configname = NULL;
+ goto next_pass;
+ }
+ m_free( configname ); configname = NULL;
+ if( !opt.def_cipher_algo || check_cipher_algo(opt.def_cipher_algo) ) {
+ log_error(_("selected cipher algorithm is invalid\n"));
+ errors++;
+ }
+ if( !opt.def_pubkey_algo || check_pubkey_algo(opt.def_pubkey_algo) ) {
+ log_error(_("selected pubkey algorithm is invalid\n"));
+ errors++;
+ }
+ if( !opt.def_digest_algo || check_digest_algo(opt.def_digest_algo) ) {
+ log_error(_("selected digest algorithm is invalid\n"));
+ errors++;
+ }
+ if( opt.completes_needed < 1 ) {
+ log_error(_("completes-needed must be greater than 0\n"));
+ errors++;
+ }
+ if( opt.marginals_needed < 2 ) {
+ log_error(_("marginals-needed must be greater than 1\n"));
+ errors++;
+ }
+ if( errors )
+ g10_exit(2);
+
+ write_status( STATUS_ENTER );
+
+ set_debug();
+ if( cmd == aKMode || cmd == aKModeC ) { /* kludge to be compatible to pgp */
+ if( cmd == aKModeC ) {
+ opt.fingerprint = 1;
+ cmd = aKMode;
+ }
+ opt.list_sigs = 0;
+ if( opt.verbose > 2 )
+ opt.check_sigs++;
+ if( opt.verbose > 1 )
+ opt.list_sigs++;
+
+ opt.verbose = opt.verbose > 1;
+ }
+ if( opt.verbose > 1 )
+ set_packet_list_mode(1);
+ if( greeting ) {
+ if( *(s=strusage(10)) )
+ tty_printf("%s", s);
+ if( *(s=strusage(30)) )
+ tty_printf("%s", s);
+ }
+
+ if( !sec_nrings || default_keyring ) { /* add default secret rings */
+ char *p = make_filename("~/.g10", "secring.g10", NULL );
+ add_secret_keyring(p);
+ m_free(p);
+ }
+ if( !nrings || default_keyring ) { /* add default ring */
+ char *p = make_filename("~/.g10", "pubring.g10", NULL );
+ add_keyring(p);
+ m_free(p);
+ }
+
+ if( argc ) {
+ fname_print = fname = *argv;
+ }
+ else {
+ fname_print = "[stdin]";
+ fname = NULL;
+ if( get_passphrase_fd() == 0 ) {
+ /* reading data and passphrase form stdin:
+ * we assume the first line is the passphrase, so
+ * we read it now
+ */
+ /* FIXME: doit */
+ }
+ }
+
+ switch( cmd ) {
+ case aPrimegen:
+ case aPrintMDs:
+ break;
+ case aListTrustDB: rc = init_trustdb( argc? 1:0, trustdb_name ); break;
+ default: rc = init_trustdb(1, trustdb_name ); break;
+ }
+ if( rc )
+ log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
+
+
+ switch( cmd ) {
+ case aKMode: /* list keyring */
+ if( !argc ) { /* list the default public keyrings */
+ int i, seq=0;
+ const char *s;
+
+ while( (s=get_keyring(seq++)) ) {
+ if( !(a = iobuf_open(s)) ) {
+ log_error(_("can't open '%s'\n"), s);
+ continue;
+ }
+ if( seq > 1 )
+ putchar('\n');
+ printf("%s\n", s );
+ for(i=strlen(s); i; i-- )
+ putchar('-');
+ putchar('\n');
+
+ proc_packets( a );
+ iobuf_close(a);
+ }
+
+ }
+ else if( argc == 1) { /* list the given keyring */
+ if( !(a = iobuf_open(fname)) )
+ log_fatal(_("can't open '%s'\n"), fname_print);
+ proc_packets( a );
+ iobuf_close(a);
+ }
+ else
+ usage(1);
+ break;
+
+ case aPrimegen:
+ if( argc == 1 ) {
+ mpi_print( stdout, generate_public_prime( atoi(argv[0]) ), 1);
+ putchar('\n');
+ }
+ else if( argc == 2 ) {
+ mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
+ atoi(argv[1]), NULL ), 1);
+ putchar('\n');
+ }
+ else if( argc == 3 ) {
+ MPI g = mpi_alloc(1);
+ mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
+ atoi(argv[1]), g ), 1);
+ printf("\nGenerator: ");
+ mpi_print( stdout, g, 1 );
+ putchar('\n');
+ mpi_free(g);
+ }
+ else
+ usage(1);
+ break;
+
+ case aPrintMDs:
+ if( !argc )
+ print_mds(NULL);
+ else {
+ for(; argc; argc--, argv++ )
+ print_mds(*argv);
+ }
+ break;
+
+ case aTest: do_test( argc? atoi(*argv): 0 ); break;
+
+ case aListTrustDB:
+ if( !argc )
+ list_trustdb(NULL);
+ else {
+ for( ; argc; argc--, argv++ )
+ list_trustdb( *argv );
+ }
+ break;
+
+ case aListTrustPath:
+ if( argc != 2 )
+ wrong_args("--list-trust-path [-- -]<maxdepth> <username>");
+ list_trust_path( atoi(*argv), argv[1] );
+ break;
+
+ case aListPackets:
+ opt.list_packets=1;
+ default: /* do regular maintenace tasks */
+ if( argc > 1 )
+ usage(1);
+ if( !(a = iobuf_open(fname)) )
+ log_fatal(_("can't open '%s'\n"), fname_print);
+ if( !opt.no_armor ) {
+ /* push the armor filter, so it can peek at the input data */
+ memset( &afx, 0, sizeof afx);
+ iobuf_push_filter( a, armor_filter, &afx );
+ }
+ if( cmd == aListPackets ) {
+ set_packet_list_mode(1);
+ opt.list_packets=1;
+ }
+ proc_packets( a );
+ iobuf_close(a);
+ break;
+ }
+
+ /* cleanup */
+ FREE_STRLIST(remusr);
+ FREE_STRLIST(locusr);
+ g10_exit(0);
+}
+
+
+void
+g10_exit( int rc )
+{
+ if( opt.verbose )
+ secmem_dump_stats();
+ secmem_term();
+ rc = rc? rc : log_get_errorcount(0)? 2:0;
+ write_status( STATUS_LEAVE );
+ exit(rc );
+}
+
+
+static void
+print_hex( byte *p, size_t n )
+{
+ int i;
+
+ if( n == 20 ) {
+ for(i=0; i < n ; i++, i++, p += 2 ) {
+ if( i == 10 )
+ putchar(' ');
+ printf(" %02X%02X", *p, p[1] );
+ }
+ }
+ else {
+ for(i=0; i < n ; i++, p++ ) {
+ if( i && !(i%8) )
+ putchar(' ');
+ printf(" %02X", *p );
+ }
+ }
+}
+
+static void
+print_mds( const char *fname )
+{
+ FILE *fp;
+ char buf[1024];
+ size_t n;
+ MD_HANDLE md;
+
+ if( !fname ) {
+ fp = stdin;
+ fname = "[stdin]";
+ }
+ else
+ fp = fopen( fname, "rb" );
+ if( !fp ) {
+ log_error("%s: %s\n", fname, strerror(errno) );
+ return;
+ }
+
+ md = md_open( DIGEST_ALGO_MD5, 0 );
+ md_enable( md, DIGEST_ALGO_RMD160 );
+ md_enable( md, DIGEST_ALGO_SHA1 );
+
+ while( (n=fread( buf, 1, DIM(buf), fp )) )
+ md_write( md, buf, n );
+ if( ferror(fp) )
+ log_error("%s: %s\n", fname, strerror(errno) );
+ else {
+ md_final(md);
+ printf( "%s: MD5 =", fname ); print_hex(md_read(md, DIGEST_ALGO_MD5), 16 );
+ printf("\n%s: RMD160 =", fname ); print_hex(md_read(md, DIGEST_ALGO_RMD160), 20 );
+ printf("\n%s: SHA1 =", fname ); print_hex(md_read(md, DIGEST_ALGO_SHA1), 20 );
+ putchar('\n');
+ }
+
+
+ md_close(md);
+
+ if( fp != stdin )
+ fclose(fp);
+}
+
+
+
+static void
+do_test(int times)
+{
+ #if 0
+ MPI t = mpi_alloc( 50 );
+ MPI m = mpi_alloc( 50 );
+ MPI a = mpi_alloc( 50 );
+ MPI b = mpi_alloc( 50 );
+ MPI p = mpi_alloc( 50 );
+ MPI x = mpi_alloc( 50 );
+
+ /* output = b/(a^x) mod p */
+ log_debug("invm %d times ", times);
+ for( ; times > 0; times -- ) {
+ mpi_fromstr(a, "0xef45678343589854354a4545545454554545455"
+ "aaaaaaaaaaaaa44444fffdecb33434343443331" );
+ mpi_fromstr(b, "0x8765765589854354a4545545454554545455"
+ "aaaaaaa466577778decb36666343443331" );
+ mpi_invm( t, a, b );
+ fputc('.', stderr); fflush(stderr);
+ }
+
+
+ m_check(NULL);
+ #endif
+}
+
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 5d967564e..1a11ec467 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -592,8 +592,11 @@ parse_certificate( IOBUF inp, int pkttype, unsigned long pktlen,
}
else
cert->d.elg.is_protected = 0;
-
- n = pktlen; cert->d.elg.x = mpi_read(inp, &n, 1 ); pktlen -=n;
+ /* It does not make sense to read it into secure memory.
+ * If the user is so careless, not to protect his secret key,
+ * we can assume, that he operates an open system :=(.
+ * So we put the key into secure memory when we unprotect him. */
+ n = pktlen; cert->d.elg.x = mpi_read(inp, &n, 0 ); pktlen -=n;
cert->d.elg.csum = read_16(inp); pktlen -= 2;
if( list_mode ) {
@@ -646,11 +649,11 @@ parse_certificate( IOBUF inp, int pkttype, unsigned long pktlen,
}
else
cert->d.rsa.is_protected = 0;
-
- n = pktlen; cert->d.rsa.rsa_d = mpi_read(inp, &n, 1 ); pktlen -=n;
- n = pktlen; cert->d.rsa.rsa_p = mpi_read(inp, &n, 1 ); pktlen -=n;
- n = pktlen; cert->d.rsa.rsa_q = mpi_read(inp, &n, 1 ); pktlen -=n;
- n = pktlen; cert->d.rsa.rsa_u = mpi_read(inp, &n, 1 ); pktlen -=n;
+ /* (See comments at the code for elg keys) */
+ n = pktlen; cert->d.rsa.rsa_d = mpi_read(inp, &n, 0 ); pktlen -=n;
+ n = pktlen; cert->d.rsa.rsa_p = mpi_read(inp, &n, 0 ); pktlen -=n;
+ n = pktlen; cert->d.rsa.rsa_q = mpi_read(inp, &n, 0 ); pktlen -=n;
+ n = pktlen; cert->d.rsa.rsa_u = mpi_read(inp, &n, 0 ); pktlen -=n;
cert->d.rsa.csum = read_16(inp); pktlen -= 2;
if( list_mode ) {
diff --git a/g10/seckey-cert.c b/g10/seckey-cert.c
index ab1034051..0fa297914 100644
--- a/g10/seckey-cert.c
+++ b/g10/seckey-cert.c
@@ -85,6 +85,9 @@ check_elg( PKT_secret_cert *cert )
blowfish_decode_cfb( blowfish_ctx,
cert->d.elg.protect.blowfish.iv,
cert->d.elg.protect.blowfish.iv, 8 );
+ mpi_set_secure(cert->d.elg.x );
+ /*fixme: maybe it is better to set the buger secure with a
+ * new get_buffer_secure() function */
buffer = mpi_get_buffer( cert->d.elg.x, &nbytes, NULL );
csum = checksum_u16( nbytes*8 );
blowfish_decode_cfb( blowfish_ctx, buffer, buffer, nbytes );
@@ -196,6 +199,7 @@ check_rsa( PKT_secret_cert *cert )
cert->d.rsa.protect.blowfish.iv, 8 );
csum = 0;
#define X(a) do { \
+ mpi_set_secure(cert->d.rsa.rsa_##a); \
buffer = mpi_get_buffer( cert->d.rsa.rsa_##a, &nbytes, NULL );\
csum += checksum_u16( nbytes*8 ); \
blowfish_decode_cfb( blowfish_ctx, buffer, buffer, nbytes ); \
diff --git a/g10/trustdb.c b/g10/trustdb.c
index 9e2c5be74..116d2679f 100644
--- a/g10/trustdb.c
+++ b/g10/trustdb.c
@@ -371,10 +371,16 @@ dump_record( ulong rnum, TRUSTREC *rec, FILE *fp )
case RECTYPE_VER: fprintf(fp, "version\n");
break;
case RECTYPE_DIR:
- fprintf(fp, "dir keyid=%08lx, key=%lu, ctl=%lu, sig=%lu%s\n",
+ fprintf(fp, "dir keyid=%08lx, key=%lu, ctl=%lu, sig=%lu",
rec->r.dir.keyid[1],
- rec->r.dir.keyrec, rec->r.dir.ctlrec, rec->r.dir.sigrec,
- rec->r.dir.no_sigs?" (inv sigs)":"");
+ rec->r.dir.keyrec, rec->r.dir.ctlrec, rec->r.dir.sigrec );
+ if( rec->r.dir.no_sigs == 1 )
+ fputs(", (none)", fp );
+ else if( rec->r.dir.no_sigs == 2 )
+ fputs(", (invalid)", fp );
+ else if( rec->r.dir.no_sigs )
+ fputs(", (revoked)", fp );
+ putc('\n', fp);
break;
case RECTYPE_KEY: fprintf(fp, "key keyid=%08lx, own=%lu, ownertrust=%02x\n",
rec->r.key.keyid[1],
@@ -643,7 +649,7 @@ search_record( PKT_public_cert *pkc, TRUSTREC *rec )
TRUSTREC keyrec;
if( read_record( rec->r.dir.keyrec, &keyrec, RECTYPE_KEY ) ) {
- log_error("%lu: ooops: invalid dir record\n", recnum );
+ log_error("%lu: ooops: invalid key record\n", recnum );
break;
}
if( keyrec.r.key.pubkey_algo == pkc->pubkey_algo
@@ -748,6 +754,8 @@ walk_sigrecs( SIGREC_CONTEXT *c, int create )
if( !c->sigrec && create && !r->r.dir.no_sigs ) {
rc = build_sigrecs( c->local_id );
if( rc ) {
+ if( rc == G10ERR_BAD_CERT )
+ rc = -1; /* maybe no selcficnature */
if( rc != -1 )
log_info("%lu: error building sigs on the fly: %s\n",
c->local_id, g10_errstr(rc) );
@@ -1088,6 +1096,10 @@ check_sigs( KBNODE keyblock, int *selfsig_okay )
int selfsig;
rc = check_key_signature( keyblock, node, &selfsig );
if( !rc ) {
+ rc = set_signature_packets_local_id( node->pkt->pkt.signature );
+ if( rc )
+ log_fatal("set_signature_packets_local_id failed: %s\n",
+ g10_errstr(rc));
if( selfsig ) {
node->flag |= 2; /* mark signature valid */
*selfsig_okay = 1;
@@ -1101,9 +1113,10 @@ check_sigs( KBNODE keyblock, int *selfsig_okay )
node->flag |= 4; /* mark as duplicate */
}
if( DBG_TRUST )
- log_debug("trustdb: sig from %08lX: %s\n",
+ log_debug("trustdb: sig from %08lX(%lu): %s%s\n",
(ulong)node->pkt->pkt.signature->keyid[1],
- g10_errstr(rc) );
+ node->pkt->pkt.signature->local_id,
+ g10_errstr(rc), (node->flag&4)?" (dup)":"" );
}
}
if( dups )
@@ -1128,6 +1141,7 @@ build_sigrecs( ulong pubkeyid )
int rc=0;
int i, selfsig;
ulong rnum, rnum2;
+ ulong first_sigrec = 0;
if( DBG_TRUST )
log_debug("trustdb: build_sigrecs for pubkey %lu\n", (ulong)pubkeyid );
@@ -1164,11 +1178,11 @@ build_sigrecs( ulong pubkeyid )
}
if( !selfsig ) {
log_error("build_sigrecs: self-certificate missing\n" );
- update_no_sigs( pubkeyid, 1 );
+ update_no_sigs( pubkeyid, 2 );
rc = G10ERR_BAD_CERT;
goto leave;
}
- update_no_sigs( pubkeyid, 0 );
+ update_no_sigs( pubkeyid, 0 ); /* assume we have sigs */
/* valid key signatures are now marked; we can now build the
* sigrecs */
@@ -1203,6 +1217,8 @@ build_sigrecs( ulong pubkeyid )
log_error("build_sigrecs: write_record failed\n" );
goto leave;
}
+ if( !first_sigrec )
+ first_sigrec = rnum2;
}
rec2 = rec;
rnum2 = rnum;
@@ -1226,6 +1242,8 @@ build_sigrecs( ulong pubkeyid )
log_error("build_sigrecs: write_record failed\n" );
goto leave;
}
+ if( !first_sigrec )
+ first_sigrec = rnum2;
}
if( i ) { /* write the pending record */
rec.r.sig.owner = pubkeyid;
@@ -1235,8 +1253,24 @@ build_sigrecs( ulong pubkeyid )
log_error("build_sigrecs: write_record failed\n" );
goto leave;
}
+ if( !first_sigrec )
+ first_sigrec = rnum;
+ }
+ }
+ if( first_sigrec ) {
+ /* update the dir record */
+ if( (rc =read_record( pubkeyid, &rec, RECTYPE_DIR )) ) {
+ log_error("update_dir_record: read failed\n");
+ goto leave;
+ }
+ rec.r.dir.sigrec = first_sigrec;
+ if( (rc=write_record( pubkeyid, &rec )) ) {
+ log_error("update_dir_record: write failed\n");
+ goto leave;
}
}
+ else
+ update_no_sigs( pubkeyid, 1 ); /* no signatures */
leave:
m_free( finfo );
@@ -1309,7 +1343,7 @@ static int
propagate_trust( TRUST_SEG_LIST tslist )
{
int i, rc;
- unsigned trust;
+ unsigned trust, tr;
TRUST_SEG_LIST tsl;
for(tsl = tslist; tsl; tsl = tsl->next ) {
@@ -1325,9 +1359,11 @@ propagate_trust( TRUST_SEG_LIST tslist )
tsl->seg[i].trust = trust;
if( i > 0 ) {
/* get the trust of this pubkey */
- rc = get_ownertrust( tsl->seg[i].lid, &trust );
+ rc = get_ownertrust( tsl->seg[i].lid, &tr );
if( rc )
return rc;
+ if( tr < trust )
+ trust = tr;
}
}
}
@@ -1362,8 +1398,15 @@ do_check( ulong pubkeyid, TRUSTREC *dr, unsigned *trustlevel )
if( !rc ) /* and read again */
rc = read_record( pubkeyid, dr, RECTYPE_DIR );
}
- if( !rc && !dr->r.dir.sigrec )
- rc = -1;
+ if( !rc && !dr->r.dir.sigrec ) {
+ /* See wether this is our own key */
+ if( !qry_lid_table_flag( ultikey_table, pubkeyid, NULL ) ) {
+ *trustlevel = TRUST_ULTIMATE;
+ return 0;
+ }
+ else
+ rc = -1;
+ }
if( rc )
return rc; /* error while looking for sigrec or building sigrecs */
@@ -1435,7 +1478,7 @@ do_check( ulong pubkeyid, TRUSTREC *dr, unsigned *trustlevel )
* 1: used for initial program startup
*/
int
-init_trustdb( int level )
+init_trustdb( int level, const char *dbname )
{
int rc=0;
@@ -1443,7 +1486,8 @@ init_trustdb( int level )
ultikey_table = new_lid_table();
if( !level || level==1 ) {
- char *fname = make_filename("~/.g10", "trustdb.g10", NULL );
+ char *fname = dbname? m_strdup( dbname )
+ : make_filename("~/.g10", "trustdb.g10", NULL );
if( access( fname, R_OK ) ) {
if( errno != ENOENT ) {
log_error("can't access %s: %s\n", fname, strerror(errno) );
@@ -1883,7 +1927,7 @@ update_no_sigs( ulong lid, int no_sigs )
return G10ERR_TRUSTDB;
}
- rec.r.dir.no_sigs = !!no_sigs;
+ rec.r.dir.no_sigs = no_sigs;
if( write_record( lid, &rec ) ) {
log_error("update_no_sigs: write failed\n");
return G10ERR_TRUSTDB;
diff --git a/g10/trustdb.h b/g10/trustdb.h
index ee604de1a..5eb52c9a2 100644
--- a/g10/trustdb.h
+++ b/g10/trustdb.h
@@ -22,7 +22,7 @@
#define G10_TRUSTDB_H
-
+/* Trust values mus be sorted in ascending order */
#define TRUST_UNKNOWN 0 /* not yet calculated */
#define TRUST_EXPIRED 1 /* calculation may be invalid */
#define TRUST_UNDEFINED 2 /* not enough informations for calculation */
@@ -35,7 +35,7 @@
/*-- trustdb.c --*/
void list_trustdb(const char *username);
void list_trust_path( int max_depth, const char *username );
-int init_trustdb( int level );
+int init_trustdb( int level, const char *dbname );
int check_trust( PKT_public_cert *pkc, unsigned *r_trustlevel );
int enum_trust_web( void **context, ulong *lid );
int get_ownertrust( ulong lid, unsigned *r_otrust );