initial commit

This commit is contained in:
TLINDEN
2013-10-28 22:50:05 +01:00
parent 92c0dcbebf
commit 2d7babae35
113 changed files with 61619 additions and 4 deletions

17
tests/Makefile.am Normal file
View File

@@ -0,0 +1,17 @@
AM_CFLAGS = -I../libpcp -Wall -g
check_PROGRAMS = col invalidkeys
col_LDADD = ../libpcp/.libs/libpcp1.a
col_SOURCES = collisions.c
invalidkeys_LDADD = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
invalidkeys_SOURCES = invalidkeys.c
AM_CPPFLAGS = -I$(top_builddir)/src
test: check
./unittests.pl unittests.cfg
stresstest: check
./unittests.pl stresstests.cfg

529
tests/Makefile.in Normal file
View File

@@ -0,0 +1,529 @@
# Makefile.in generated by automake 1.12.4 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2012 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
am__make_dryrun = \
{ \
am__dry=no; \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
*) \
for am__flg in $$MAKEFLAGS; do \
case $$am__flg in \
*=*|--*) ;; \
*n*) am__dry=yes; break;; \
esac; \
done;; \
esac; \
test $$am__dry = yes; \
}
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
check_PROGRAMS = col$(EXEEXT) invalidkeys$(EXEEXT)
subdir = tests
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/config/depcomp
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/config/libtool.m4 \
$(top_srcdir)/config/ltoptions.m4 \
$(top_srcdir)/config/ltsugar.m4 \
$(top_srcdir)/config/ltversion.m4 \
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/libpcp/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am_col_OBJECTS = collisions.$(OBJEXT)
col_OBJECTS = $(am_col_OBJECTS)
col_DEPENDENCIES = ../libpcp/.libs/libpcp1.a
am_invalidkeys_OBJECTS = invalidkeys.$(OBJEXT)
invalidkeys_OBJECTS = $(am_invalidkeys_OBJECTS)
invalidkeys_DEPENDENCIES = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libpcp
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(col_SOURCES) $(invalidkeys_SOURCES)
DIST_SOURCES = $(col_SOURCES) $(invalidkeys_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AM_CFLAGS = -I../libpcp -Wall -g
col_LDADD = ../libpcp/.libs/libpcp1.a
col_SOURCES = collisions.c
invalidkeys_LDADD = ../libpcp/.libs/libpcp1.a ../src/keyprint.o
invalidkeys_SOURCES = invalidkeys.c
AM_CPPFLAGS = -I$(top_builddir)/src
all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --gnu tests/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
clean-checkPROGRAMS:
@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
echo " rm -f" $$list; \
rm -f $$list || exit $$?; \
test -n "$(EXEEXT)" || exit 0; \
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
col$(EXEEXT): $(col_OBJECTS) $(col_DEPENDENCIES) $(EXTRA_col_DEPENDENCIES)
@rm -f col$(EXEEXT)
$(LINK) $(col_OBJECTS) $(col_LDADD) $(LIBS)
invalidkeys$(EXEEXT): $(invalidkeys_OBJECTS) $(invalidkeys_DEPENDENCIES) $(EXTRA_invalidkeys_DEPENDENCIES)
@rm -f invalidkeys$(EXEEXT)
$(LINK) $(invalidkeys_OBJECTS) $(invalidkeys_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collisions.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalidkeys.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: $(HEADERS) $(SOURCES) $(LISP)
list='$(SOURCES) $(HEADERS) $(LISP)'; \
case "$(srcdir)" in \
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
*) sdir=$(subdir)/$(srcdir) ;; \
esac; \
for i in $$list; do \
if test -f "$$i"; then \
echo "$(subdir)/$$i"; \
else \
echo "$$sdir/$$i"; \
fi; \
done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
html-am:
info: info-am
info-am:
install-data-am:
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am:
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man:
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am:
.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean \
clean-checkPROGRAMS clean-generic clean-libtool cscopelist \
ctags distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dvi install-dvi-am install-exec \
install-exec-am install-html install-html-am install-info \
install-info-am install-man install-pdf install-pdf-am \
install-ps install-ps-am install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags uninstall uninstall-am
test: check
./unittests.pl unittests.cfg
stresstest: check
./unittests.pl stresstests.cfg
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

7
tests/README Normal file
View File

@@ -0,0 +1,7 @@
Unittests fpr PCP.
Execute 'make test' here or from the top level directory
to run the unit tests. Usually all tests shall succeed.
Execute 'make stresstest' to run a longer stresstest. It
generates lots of keys and takes some time.

36
tests/bart.pub Normal file
View File

@@ -0,0 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Bart Simpson
Mail: bart@springfield.com
Key-ID: 0x0E4512BE47CE0215
Public-Key: 1aHE2mHljT-}lCf(GM(ln.9(?}t9H+[c{$q!@$oEz#Y>r
Creation Time: 2013-10-26T13:37:27
Checksum: BA:10:B7:CC:79:C0:69:8E:F0:A8:4D:55:12:C2:E5:7E
47:62:7D:C2:02:9C:3D:48:04:1B:5D:7D:5D:32:F4:7F
Serial Number: 0xEE894128
Key Version: 0x00000001
Random Art ID: +----------------+
| .....+. |
| . . . ..o |
| = . .. |
| . . . |
| . . |
| . . |
| . . |
| . |
+----------------+
1aHE2mHljT-}lCf(GM(ln.9(?}t9H+[c{$q!@$oEA6^#NBrBH@ze:Mmzufpo4k$0>0tKr<c
ml<>NX[qmVTCVdi{Oj?f?+29S.w#wHF%}n{&GkBA/lw=8yME/LjO^XMUJDv=I(6a.%-r*X-
nVZS)=f1GiY1V.hvq5?tBcAiYKH#*pp546$pyhduq2JhXQ#k{Mmev}tUBwGyx/MI1pq=W)w
Cfij1g&pb+I98{>Y)72o6jtL0MDI27TeNgbiN6w+!=nBEx=?AL$.ZsyYkIa.2L*zPrShDR@
?BZtx>qfH{ixW!)Sv0A-inF}(Y:^n>hp+G:gD&=G37x2]*xw)[SEK-a(olso31TnwYEC3a[
Ss[wvvQTq0kYZ)+x(mM}x>q9>e[n*p0o9!*Pm8krDv@GqlEix{bt>?K.A!r(MY4CgvkVcT9
asOUmVLwwPdupK}HBUY=uU5P>53ncmJ+QsH8Uy#gkI}vlm#0HIC+J2pM&4.B%^!FV?UoRnL
EMA}1QbPI/ju0S3V$uJz^?$ugF?PEDvtPbK)!SfA$?.1Sa2T.&:.^va>^hnVya0Gz%4{7f:
Zmst}k&sL.7@]blr*deC[lst2ayum}V-z+6PaM1soAVxbisyY/!w(AF:Z7*vzjI5nKwtPW0
-Xm&ovi4NDTe/sCvT&jISh>UtWeB?8$C)S]>fhSrnmkM>Rgd1z^h:Z1/gbgS^RGY1PqucW%
0096104pc&)GiZV)[2M%DD:?sR{-Um:2%<GqJKWnh<HzAViL)5A3VyH1v1M:[m++wfOUH.a
q}SXc(EQlWd[?K1$t4gf8$$L
------ END PCP PUBLICKEY ------

32
tests/check-collisions.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/sh
rounds=$1
if test -z "$rounds"; then
rounds=10
fi
make check
log="collisions.log"
name=""
echo "Checking collisions for hash algorithms with ${rounds} rounds:" > $log
for hash in c o f d s; do
case $hash in
o) name="OAT";;
c) name="CRC";;
s) name="SAX";;
d) name="DJB";;
f) name="FNV";;
esac
echo -n "Running ${rounds} x ${name} hash ... "
echo -n "Collisions for ${name}: " >> $log
./col -l ${rounds} -${hash} \
| sort | uniq -c | sort | grep -v "1 " | wc -l \
>> $log
echo "done."
done
echo
echo "Review $log for the results."

247
tests/collisions.c Normal file
View File

@@ -0,0 +1,247 @@
/*
Run:
./col -l 1000000 | sort | uniq -c | sort | grep -v "1 " | wc -l
This generates the hashes and shows the number of collisions.
Hash algorithm can be selected by commandline options, see col -h.
Algorithms from:
http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sodium.h>
#include <limits.h>
// lib
#include "mem.h"
#include "defines.h"
#include "digital_crc32.h"
#define ROUNDS 10
unsigned djb_hash ( void *key, int len ) {
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ )
h = 33 * h ^ p[i];
return h;
}
unsigned fnv_hash ( void *key, int len ) {
unsigned char *p = key;
unsigned h = 2166136261;
int i;
for ( i = 0; i < len; i++ )
h = ( h * 16777619 ) ^ p[i];
return h;
}
unsigned sax_hash ( void *key, int len ) {
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ )
h ^= ( h << 5 ) + ( h >> 2 ) + p[i];
return h;
}
unsigned oat_hash ( void *key, int len ) {
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ ) {
h += p[i];
h += ( h << 10 );
h ^= ( h >> 6 );
}
h += ( h << 3 );
h ^= ( h >> 11 );
h += ( h << 15 );
return h;
}
//#define jen_hashsize(n) ( 1U << (n) )
//#define jen_hashmask(n) ( jen_hashsize ( n ) - 1 )
#define jen_mix(a,b,c) \
{ \
a -= b; a -= c; a ^= ( c >> 13 ); \
b -= c; b -= a; b ^= ( a << 8 ); \
c -= a; c -= b; c ^= ( b >> 13 ); \
a -= b; a -= c; a ^= ( c >> 12 ); \
b -= c; b -= a; b ^= ( a << 16 ); \
c -= a; c -= b; c ^= ( b >> 5 ); \
a -= b; a -= c; a ^= ( c >> 3 ); \
b -= c; b -= a; b ^= ( a << 10 ); \
c -= a; c -= b; c ^= ( b >> 15 ); \
}
unsigned jen_hash ( unsigned char *k, unsigned length, unsigned initval ) {
unsigned a, b;
unsigned c = initval;
unsigned len = length;
a = b = 0x9e3779b9;
while ( len >= 12 ) {
a += ( k[0] + ( (unsigned)k[1] << 8 )
+ ( (unsigned)k[2] << 16 )
+ ( (unsigned)k[3] << 24 ) );
b += ( k[4] + ( (unsigned)k[5] << 8 )
+ ( (unsigned)k[6] << 16 )
+ ( (unsigned)k[7] << 24 ) );
c += ( k[8] + ( (unsigned)k[9] << 8 )
+ ( (unsigned)k[10] << 16 )
+ ( (unsigned)k[11] << 24 ) );
jen_mix ( a, b, c );
k += 12;
len -= 12;
}
c += length;
switch ( len ) {
case 11: c += ( (unsigned)k[10] << 24 );
case 10: c += ( (unsigned)k[9] << 16 );
case 9 : c += ( (unsigned)k[8] << 8 );
/* First byte of c reserved for length */
case 8 : b += ( (unsigned)k[7] << 24 );
case 7 : b += ( (unsigned)k[6] << 16 );
case 6 : b += ( (unsigned)k[5] << 8 );
case 5 : b += k[4];
case 4 : a += ( (unsigned)k[3] << 24 );
case 3 : a += ( (unsigned)k[2] << 16 );
case 2 : a += ( (unsigned)k[1] << 8 );
case 1 : a += k[0];
}
jen_mix ( a, b, c );
return c;
}
char *keyid(int h, char *id, byte *pub, byte *sec) {
uint32_t s, p;
p = s = 0;
switch (h) {
case 1:
p = oat_hash(pub, 32);
s = oat_hash(sec, 32);
break;
case 2:
p = digital_crc32(pub, 32);
s = digital_crc32(sec, 32);
break;
case 3:
p = djb_hash(pub, 32);
s = djb_hash(sec, 32);
break;
case 4:
p = fnv_hash(pub, 32);
s = fnv_hash(sec, 32);
break;
case 5:
p = sax_hash(pub, 32);
s = sax_hash(sec, 32);
break;
case 6:
p = jen_hash(pub, 32, 0xd4a1);
s = jen_hash(sec, 32, 0xe8c0);
break;
}
snprintf(id, 17, "%08X%08X", p, s);
return id;
}
void usage () {
fprintf(stderr, "Options:\n");
fprintf(stderr, " -o use Jenkins OAT hashing\n");
fprintf(stderr, " -c use CRC32 checksums\n");
fprintf(stderr, " -d use DJB hash\n");
fprintf(stderr, " -s use SAX hash\n");
fprintf(stderr, " -f use FNV hash \n");
fprintf(stderr, " -j use Jenkins hash \n");
fprintf(stderr, " -l <rounds> specify rounds, default: 10\n");
fprintf(stderr, " -h print this help message\n");
fprintf(stderr, "When complete, check the output for collisions:\n");
fprintf(stderr, "cat hashfile | sort | uniq -c | sort | grep -v \"1 \" | wc -l\n");
exit(1);
}
int main(int argc, char **argv) {
byte public[32] = { 0 };
byte secret[32] = { 0 };
char *id = ucmalloc(17);
int i;
int opt;
int h = 1;
long long rounds = ROUNDS;
while (1) {
opt = getopt(argc, argv, "jsfdochl:");
if(opt == -1) {
break;
}
switch (opt) {
case 'o':
h = 1;
break;
case 'c':
h = 2;
break;
case 'd':
h = 3;
break;
case 'f':
h = 4;
break;
case 's':
h = 5;
break;
case 'j':
h = 6;
break;
case 'l':
rounds = strtoll(optarg, NULL, 10);
break;
case 'h':
usage();
}
}
for(i=0; i<rounds; i++) {
crypto_box_keypair (public, secret);
id = keyid(h, id, public, secret);
printf("%s\n", id);
}
return 0;
}

14
tests/exportmasspubs.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
outdir=$1
pcp=$2
vault=$3
if test -s "$vault"; then
# exports public keys
rm -f $outdir/0x*
$pcp -V $vault -l | grep 0x | awk '{print $1}' | while read id; do
$pcp -V $vault -p -i $id 2> /dev/null | egrep -v "^ " \
| egrep -v '^$' > $outdir/$id
done
fi

30
tests/genmasskeys.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/sh
outdir=$1
number=$2
pcp=$3
vault=$4
mkdir -p $outdir
if test -s $vault; then
has=`$pcp -V $vault -l 2>/dev/null | grep 0x | wc -l | awk '{print $1}'`
if test $has -eq $number; then
exit
fi
rm -f $vault
fi
# generates $number secret keys
jot $number | while read x; do
count=`jot -r 1 10 127`
name=`openssl rand -hex $count`
mail=`openssl rand -hex $count`
(echo $name; echo $mail;) | $pcp -V $vault -k -x xxx > /dev/null 2>&1
done
# exports public keys
$pcp -V $vault -l | grep 0x | awk '{print $1}' | while read id; do
$pcp -V $vault -p -i $id 2> /dev/null | egrep -v "^ " | \
egrep -v '^$' > $outdir/$id
done

14
tests/importmasspubs.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
outdir=$1
pcp=$2
vault=$3
if test -s "$vault"; then
# imports public keys
rm -f $vault
fi
ls -1 $outdir/0x* | while read id; do
$pcp -V $vault -P -I $id
done

171
tests/invalidkeys.c Normal file
View File

@@ -0,0 +1,171 @@
#include "invalidkeys.h"
int main() {
char *pw =ucmalloc(8);
char *pw2 =ucmalloc(8);
char *o = ucmalloc(8);
char *m = ucmalloc(8);
strcpy(pw, "xxxx");
strcpy(pw2, "xxxx");
strcpy(o, "xxxx");
strcpy(m, "xxxx");
pcp_key_t *k = pcpkey_new ();
memcpy(k->owner, o, 8);
memcpy(k->mail, m, 8);
pcp_key_t *key = pcpkey_encrypt(k, pw);
int i;
for(i=0; i<5; i++)
mkinv(key, i);
pcp_pubkey_t *pub = pcpkey_pub_from_secret(key);
for(i=0; i<4; i++)
mkinvp(pub, i);
mkinvv("testvault-invalidheader", 0);
mkinvv("testvault-invalidversion", 1);
mkinvv("testvault-invaliditemsize", 2);
mkinvv("testvault-invaliditemtype", 3);
mkinvv("testvault-invalidkeytype", 4);
return 0;
}
void pr(char *t, unsigned char *b, size_t s) {
int i;
printf("%s:\n", t);
for(i=0; i<s; ++i)
printf("%02x", (unsigned int) b[i]);
printf("\n");
}
void mkinvv(const char *name, int type) {
unlink(name);
vault_t *v = pcpvault_new((char *)name, 0);
vault_item_header_t *item = ucmalloc(sizeof(vault_item_header_t));
vault_header_t *header = ucmalloc(sizeof(vault_header_t));
header->fileid = PCP_VAULT_ID;
header->version = PCP_VAULT_VERSION;
bzero(header->checksum, 32);
item->version = PCP_KEY_VERSION;
item->type = PCP_KEY_TYPE_SECRET;
item->size = sizeof(pcp_key_t);
unsigned char *blah = ucmalloc(30);
unsigned char *blub = ucmalloc(sizeof(pcp_pubkey_t));
fseek(v->fd, 0, SEEK_SET);
switch (type) {
case 0:
header->fileid = 0;
vh2be(header);
fwrite(header, sizeof(vault_header_t), 1, v->fd);
break;
case 1:
header->version = 0;
vh2be(header);
fwrite(header, sizeof(vault_header_t), 1, v->fd);
break;
case 2:
vh2be(header);
fwrite(header, sizeof(vault_header_t), 1, v->fd);
item->size = 8;
ih2be(item);
fwrite(item, sizeof(vault_item_header_t), 1, v->fd);
break;
case 3:
vh2be(header);
fwrite(header, sizeof(vault_header_t), 1, v->fd);
item->type = 0x08;
ih2be(item);
fwrite(item, sizeof(vault_item_header_t), 1, v->fd);
fwrite(blub, sizeof(pcp_pubkey_t), 1, v->fd);
break;
case 4:
vh2be(header);
fwrite(header, sizeof(vault_header_t), 1, v->fd);
fwrite(blah, 30, 1, v->fd);
break;
}
fclose(v->fd);
}
void mkinvp(pcp_pubkey_t *k, int type) {
pcp_pubkey_t *key = ucmalloc(sizeof(pcp_pubkey_t));
memcpy(key, k, sizeof(pcp_pubkey_t));
switch(type) {
case 0:
key->type = 0;
pcppubkey_print(key, F("testpubkey-wrong-type"));
break;
case 1:
key->version = 0;
pcppubkey_print(key, F("testpubkey-wrong-version"));
break;
case 2:
key->serial = 0;
pcppubkey_print(key, F("testpubkey-wrong-serial"));
break;
case 3:
key->id[16] = 0x3e;
pcppubkey_print(key, F("testpubkey-invalid-id"));
break;
case 4:
key->ctime = 0;
pcppubkey_print(key, F("testpubkey-invalid-ctime"));
break;
}
}
void mkinv(pcp_key_t *k, int type) {
pcp_key_t *key = ucmalloc(sizeof(pcp_key_t));
memcpy(key, k, sizeof(pcp_key_t));
switch(type) {
case 0:
key->encrypted[0] = 0;
pcpkey_print(key, F("testkey-not-encrypted"));
break;
case 1:
key->type = 0;
pcpkey_print(key, F("testkey-wrong-type"));
break;
case 2:
key->version = 0;
pcpkey_print(key, F("testkey-wrong-version"));
break;
case 3:
key->serial = 0;
pcpkey_print(key, F("testkey-wrong-serial"));
break;
case 4:
key->id[16] = 0x1;
pcpkey_print(key, F("testkey-invalid-id"));
break;
case 5:
key->ctime = 0;
pcpkey_print(key, F("testkey-invalid-ctime"));
break;
}
}
FILE *F(char *filename) {
FILE *f;
if((f = fopen(filename, "wb+")) == NULL) {
fprintf(stderr, "Could not open output file %s\n", filename);
exit(1);
}
return f;
}

19
tests/invalidkeys.h Normal file
View File

@@ -0,0 +1,19 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sodium.h>
#include <limits.h>
#include "mem.h"
#include "defines.h"
#include "keyprint.h"
#include "key.h"
#include "vault.h"
void mkinv(pcp_key_t *k, int type);
void mkinvp(pcp_pubkey_t *k, int type);
void mkinvv(const char *name, int type);
FILE *F(char *filename);
void pr(char *t, unsigned char *b, size_t s);

36
tests/key-alicia-pub Normal file
View File

@@ -0,0 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Alicia
Mail: alicia@local
Key-ID: 0xE2942C2B6C96F6CC
Public-Key: 1mZ?-e4^0JA&[}#=t1$/&aI<i:eM^bA/uIJ0O.iRBn#pv
Creation Time: 2013-10-28T18:43:53
Checksum: 1D:33:59:F1:B2:2F:21:73:3A:F6:5E:0D:63:47:76:42
93:3B:EF:36:D3:20:8E:43:F5:4D:A9:39:9F:09:43:69
Serial Number: 0x90C7B055
Key Version: 0x00000001
Random Art ID: +----------------+
| |
| |
| . |
| o |
| . . |
| .... |
| ..o...= . |
| .+ o.+..|
+----------------+
1mZ?-e4^0JA&[}#=t1$/&aI<i:eM^bA/uIJ0O.iRBu%.Sv}/uK[e:!VVu[(jqvxj3QIzoG<
/@!Wi0UUCA}6NMwWT$%=Om%gAzYhPvNTZ$mm%*l5YCA>s8fWoUI)[[l?@](l[bY3wzfJg8$
+RsBj5+]c/(!ZwWu-lDPCkCGb.GJM$HLPU@np=ZQTh-1[#RaNGdOWb(]ZY=K]fSdMfU4q)Z
T7dmxE:Cmst2o73w4RJ*A%?1idZ2&a^:kXsxnrxCXc5zt>n{QOQY{99oj&^!WH%6b&8@r]o
OLEzsx9t]B1/vjj:SUBt3*enaKb?.>2eZdMKvFLQ?7DeedmCz-0FGzc!t#o)&Tg%:jV$8iH
Iq.#9vqGT/x<<nyz!0i(0i&$kp^ylwen6]g:ytRVULL%s>UF39qu9sT6xka@S9F&fyO%Vgo
AtD^cLtsGtT.DiNQ5&dSeOe2Oa:ETxg&Z[fB+I7uU-Z9OstL?nWLq@O&)a+:vtW1NUrt>4(
ZaW2D^?xt:CzJ=ARPhD2P6AW5t(E@MD?rpY5MlYFhYv*VU7%6bZ>#hU:<Gv5FX0OCR#PiK}
UMFAiwkJ)laaDw53N>kW2r9nA8y5>OCb!u.i3dQ8NK3.<>A62Jy[^p}rzi:f*R-]cll:p!D
hB:kv7pVUjpj*-.5Bg8NBT:HpC:nA*X3)]<eSQP)Qgc4fDlOZ$^lPE4]hBx?i9:bjPqucW%
0096109cnzKomKzJcU^k?C=*@OGUI&18tAgfFq^Wi8!R6ac}Deld[lkk0OYPaf}2{5Arw$e
Kg$$@/G+8v$i*m)d@U?H5.hN
------ END PCP PUBLICKEY ------

23
tests/key-alicia-sec Normal file
View File

@@ -0,0 +1,23 @@
----- BEGIN PCP SECRET KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Key-ID: 0xE2942C2B6C96F6CC
Creation Time: 2013-10-28T18:43:53
Serial Number: 0x3271452A
Key Version: 0x00000001
1mZ?-e4^0JA&[}#=t1$/&aI<i:eM^bA/uIJ0O.iRBo2&m=rz<?V@H>0Z2d1[B(z6I[xE%-a
+sp@mrOlA&rK9gRP1pk=Hnr=sCxjb?Sj51ISMR.YA&:ZT23?J.Nx!{ZHobd9(QUR)FPmjti
gT//!hkQNum.a9NC[LW>UetZSh%D>rS]#v}/uK[e:!VVu[(jqvxj3QIzoG</@!Wi0UUCA}6
NMwWT$%=Om%gAzYhPvNTZ$mm%*l5YCA>s8fWoUI)[[l?@](l[bY3wzfJg8$+RsBj5+]c/(!
ZwWu-lDPCkCGb.GJM$HLPU@np=ZQTh-1[#RaNGdOWb(]ZY=K]fSdMfU4q)ZT7dmxE:Cmst2
o73w4RJ*A%?1idZ2&a^:kXsxnrxCXc5zt>n{QOQY{99oj&^!WH%6b&8@r]oOLEzsx9t]B1/
vjj:SUBt3*enaKb?.>2eZdMKvFLQ?7DeedmCz-0FGzc!t#o)&Tg%:jV$8iHIq.#9vqGT/x<
<nyz!0i(0i&$kp^ylwen6]g:ytRVULL%s>UF39qu9sT6xka@S9F&fyO%VgoAtD^cLtsGtT.
DiNQ5&dSeOe2Oa:ETxg&Z[fB+I7uU-Z9OstL?nWLq@O&)a+:vtW1NUrt>4(ZaW2D^?xt:Cz
J=ARPhD2P6AW5t(E@MD?rpY5MlYFhYv*VU7%6bZ>#hU:<Gv5FX0OCR#PiK}UMFAiwkJ)laa
Dw53N>kW2r9nA8y5>OCb!u.i3dQ8NK3.<>A62Jy[^p}rzi:f*R-]cll:p!DhB:kv7pVUjpj
*-.5Bg8NBT:HpC:nA*X3)]<eSQP)Qgc4fDlOZ$^lPE4]hBx?i.=-ZKqucW%0096104HASg6
4S/xxvy{tr<r40seV900000000000000000000000000000000000000000eu+e0seV901Y
bg0kqxS9@(ov
------ END PCP SECRET KEY ------

23
tests/key-alicia-secret Normal file
View File

@@ -0,0 +1,23 @@
----- BEGIN PCP SECRET KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Key-ID: 0xE2942C2B6C96F6CC
Creation Time: 2013-10-28T18:43:53
Serial Number: 0x3271452A
Key Version: 0x00000001
1mZ?-e4^0JA&[}#=t1$/&aI<i:eM^bA/uIJ0O.iRBo2&m=rz<?V@H>0Z2d1[B(z6I[xE%-a
+sp@mrOlA&rK9gRP1pk=Hnr=sCxjb?Sj51ISMR.YA&:ZT23?J.Nx!{ZHobd9(QUR)FPmjti
gT//!hkQNum.a9NC[LW>UetZSh%D>rS]#v}/uK[e:!VVu[(jqvxj3QIzoG</@!Wi0UUCA}6
NMwWT$%=Om%gAzYhPvNTZ$mm%*l5YCA>s8fWoUI)[[l?@](l[bY3wzfJg8$+RsBj5+]c/(!
ZwWu-lDPCkCGb.GJM$HLPU@np=ZQTh-1[#RaNGdOWb(]ZY=K]fSdMfU4q)ZT7dmxE:Cmst2
o73w4RJ*A%?1idZ2&a^:kXsxnrxCXc5zt>n{QOQY{99oj&^!WH%6b&8@r]oOLEzsx9t]B1/
vjj:SUBt3*enaKb?.>2eZdMKvFLQ?7DeedmCz-0FGzc!t#o)&Tg%:jV$8iHIq.#9vqGT/x<
<nyz!0i(0i&$kp^ylwen6]g:ytRVULL%s>UF39qu9sT6xka@S9F&fyO%VgoAtD^cLtsGtT.
DiNQ5&dSeOe2Oa:ETxg&Z[fB+I7uU-Z9OstL?nWLq@O&)a+:vtW1NUrt>4(ZaW2D^?xt:Cz
J=ARPhD2P6AW5t(E@MD?rpY5MlYFhYv*VU7%6bZ>#hU:<Gv5FX0OCR#PiK}UMFAiwkJ)laa
Dw53N>kW2r9nA8y5>OCb!u.i3dQ8NK3.<>A62Jy[^p}rzi:f*R-]cll:p!DhB:kv7pVUjpj
*-.5Bg8NBT:HpC:nA*X3)]<eSQP)Qgc4fDlOZ$^lPE4]hBx?i.=-ZKqucW%0096104HASg6
4S/xxvy{tr<r40seV900000000000000000000000000000000000000000eu+e0seV901Y
bg0kqxS9@(ov
------ END PCP SECRET KEY ------

36
tests/key-bobby-pub Normal file
View File

@@ -0,0 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Bobby
Mail: bobby@<40>local
Key-ID: 0x68832D215AFB2440
Public-Key: 1m9SHw3}sw<Ro82?hQ&J[byDA]z(g1.6X$MweEJ95Dz!h
Creation Time: 2013-10-28T18:48:11
Checksum: A8:32:16:EF:9D:38:9A:3C:7D:99:F2:81:D4:42:B3:2D
28:13:A9:43:1B:22:C3:71:A8:38:38:10:E3:A3:B9:82
Serial Number: 0x61FDA3CE
Key Version: 0x00000001
Random Art ID: +----------------+
| |
| |
| |
| |
| o . |
| o o . |
| . Bo.. |
| +o==. |
+----------------+
1m9SHw3}sw<Ro82?hQ&J[byDA]z(g1.6X$MweEJ95KHzBvTd%QWcl:NlJtTyRdZ>sTc3J1e
nQ<!<c@^1<(%aF6ks+&}eE%8}zc<Ny@#5&O%GN6ep49slxWhkSe*jox/(JrkVP[zWJ0.wQ8
RqvuRolF*/(wJ&{+Qpd1dyx&=ERL1c$%bg($]4Fe23!410z/HctdobTD=bs#@]sT[[%d7Z&
/k:d4>jeJey}hI*S7Pl^8O:i#]wd4}WNR7UYw(=}pBKsHbm^XeFqg^(CtjZG!K4oMPT=bJU
df/X2F]5iq-bYp:EC82YBJ<[NP*BDW?r-L..!As*CWddicuvsp^AQ20O-$+a@K<}6OPd*Hb
jex#UvSbZ+C%Gt+z!0i(0j#I6?xftr.eqpicnf]DWfiqE:*?/%(slD9QQU[7t4{J>hyLRkC
s=uT0HwrFIz6f9C!&=Nf$(jE*(3RFhA>SM5MiFq&8TqUn:^2xzxa70=]T*J[g}vVl8:-Zqq
N%{=qe7rScb.M4{Ld4j[HDIV(YZZWZ4}At*x.NT5E[/5p/3{SbNK7wjj[1yA2d]ZlE[I4-Z
11m*e^vcdRz+(xlU=:cXwV2<E1jGb5N/rmsW}O*DM/lG^lEi*+ahIvln>A+463^RQHyN77/
>fdtrPLE^lGYGTc(=FosgPggLZmqU)FTG6g.][KFAi5&YHl]3FOk$jf@g=c(^t3E+tqucW%
009610m4wrvfsIuoY5m{QWy!7fuih0^e@NMCINT@TYUeV/h:L8WNE3YBh]kQ{UG3qf*4Ql9
}&1i2de}$URN7GD6yTb/8L^J
------ END PCP PUBLICKEY ------

23
tests/key-bobby-sec Normal file
View File

@@ -0,0 +1,23 @@
----- BEGIN PCP SECRET KEY -----
Generated by: Pretty Curved Privacy Version 0.0.1
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Key-ID: 0x68832D215AFB2440
Creation Time: 2013-10-28T18:48:11
Serial Number: 0xECD29916
Key Version: 0x00000001
1m9SHw3}sw<Ro82?hQ&J[byDA]z(g1.6X$MweEJ95DAzC&hpY67^g3^L>d4K/JF>>JbqkC-
ENik9(Oa&k6L^6(cq5O?r}Yx2C5&kgv$qs(-bttGrEtiKwvSQhD6&VdwYg)Fg%dqgVLX#FK
+DcAIb@!A-ql$kqlYXd71ciD-Gs+p^P8fvTd%QWcl:NlJtTyRdZ>sTc3J1enQ<!<c@^1<(%
aF6ks+&}eE%8}zc<Ny@#5&O%GN6ep49slxWhkSe*jox/(JrkVP[zWJ0.wQ8RqvuRolF*/(w
J&{+Qpd1dyx&=ERL1c$%bg($]4Fe23!410z/HctdobTD=bs#@]sT[[%d7Z&/k:d4>jeJey}
hI*S7Pl^8O:i#]wd4}WNR7UYw(=}pBKsHbm^XeFqg^(CtjZG!K4oMPT=bJUdf/X2F]5iq-b
Yp:EC82YBJ<[NP*BDW?r-L..!As*CWddicuvsp^AQ20O-$+a@K<}6OPd*Hbjex#UvSbZ+C%
Gt+z!0i(0j#I6?xftr.eqpicnf]DWfiqE:*?/%(slD9QQU[7t4{J>hyLRkCs=uT0HwrFIz6
f9C!&=Nf$(jE*(3RFhA>SM5MiFq&8TqUn:^2xzxa70=]T*J[g}vVl8:-ZqqN%{=qe7rScb.
M4{Ld4j[HDIV(YZZWZ4}At*x.NT5E[/5p/3{SbNK7wjj[1yA2d]ZlE[I4-Z11m*e^vcdRz+
(xlU=:cXwV2<E1jGb5N/rmsW}O*DM/lG^lEi*+ahIvln>A+463^RQHyN77/>fdtrPLE^lGY
GTc(=FosgPggLZmqU)FTG6g.][KFAi5&YHl]3FOk$jf@g=c(^-9o0OqucW%0096102z0J(&
Aly(LQ/JMoWb{0seV900000000000000000000000000000000000000000evsu0seV901Y
bg08Qd7i@/lX
------ END PCP SECRET KEY ------

31
tests/stresstests.cfg Normal file
View File

@@ -0,0 +1,31 @@
#
# stress tests
confirm = Stress tests will take some time, continue?
pcp = ../src/pcp1
outdir = stresstest
vault = $outdir/stresstestin
pvault = $outdir/stresstestout
numkeys = 100
verbose = 1
<test check-bulk-tests>
prepare = ./genmasskeys.sh $outdir $numkeys $pcp $vault
<test check-bulk-generate-keys>
cmd = $pcp -V $vault -l | grep 0x | wc -l
expect = $numkeys
</test>
<test check-bulk-vault-export-publics>
prepare = ./exportmasspubs.sh $outdir $pcp $vault
cmd = ls -1 $outdir/0x* | wc -l
expect = $numkeys
</test>
<test check-bulk-import-publics>
prepare = ./importmasspubs.sh $outdir $pcp $pvault
cmd = $pcp -V $pvault -l | grep 0x | wc -l
expect $numkeys
</test>
</test>

13
tests/unittests-bulk.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
pcp=$1
vault=$2
log=$3
count=$4
rm -f $vault
jot $count | while read x; do
(echo x; echo y;) | $pcp -V $vault -k -x bbb
done > $log 2>&1

323
tests/unittests.cfg Normal file
View File

@@ -0,0 +1,323 @@
# -*-html-*-
pcp = ../src/pcp1
vault = v1
passwd = xxx
<test check-show-help>
cmd = $pcp -h
expect = /export/
</test>
<test check-if-fail-without-vault>
prepare = rm -f $vault
cmd = $pcp -V $vault -l
expect = /doesn't contain any keys so far/
</test>
<test check-generate-secret-key>
cmd = $pcp -V $vault -k -x $passwd
input = <<EOF
Dexter Morgan
dxmorg@florida.cops.gov
EOF
expect = /Generated new secret key/
</test>
<test check-if-vault-contains-secret>
cmd = $pcp -V $vault -l
expect = /Dexter Morgan/
</test>
<test check-secret-key-info>
cmd = $pcp -V $vault -l | tail -1 | cut -d ' ' -f 1 | xargs $pcp -V $vault -t -i
expect = /BEGIN PCP SECRET KEY/
</test>
<test check-export-public-key>
cmd = $pcp -V $vault -l | tail -1 | cut -d ' ' -f 1 | xargs $pcp -V $vault -p -i
expect = /BEGIN PCP PUBLIC KEY/
</test>
<test check-export-public-key-tofile>
cmd = $pcp -V $vault -l | tail -1 | cut -d ' ' -f 1 | xargs $pcp -V $vault -p -O testkey-self -i
expect-file = testkey-self
</test>
<test check-export-public-key-filecontent>
cmd = /usr/bin/true # file is already there
expect-file-contains = testkey-self Dexter
</test>
<test check-import-public-key>
cmd = $pcp -V $vault -P -I bart.pub
expect = /key 0x0E4512BE47CE0215 added/
</test>
<test check-imported-public-key-info>
cmd = $pcp -V $vault -t -i 0x0E4512BE47CE0215
expect = /Serial Number: 0xEE894128/
</test>
<test check-if-delete-public-key-works>
cmd = $pcp -V $vault -r -i 0x0E4512BE47CE0215
expect = /Public key deleted/
</test>
<test check-if-vault-still-valid>
cmd = $pcp -V $vault -t
expect = /Vault version: 00000001/
</test>
<test check-if-deleted-public-key-is-away>
cmd = $pcp -V $vault -t
expect = /Public keys: 0/
</test>
#
# encryption tests
idbobby = 0x68832D215AFB2440
idalicia = 0xE2942C2B6C96F6CC
md5msg = 66b8c4ca9e5d2a7e3c0559c3cdea3d50
<test check-crypto-alicia-init>
prepare = echo ${md5msg} > testmessage
<test check-crypto-alicia-import-secret>
cmd = $pcp -V va -S -I key-alicia-sec -x a
expect = /${idalicia}/
</test>
<test check-crypto-alicia-import-bobbys-key>
cmd = $pcp -V va -P -I key-bobby-pub
expect = /${idbobby}/
</test>
<test check-crypto-alicia-encrypt>
cmd = $pcp -V va -e -i ${idbobby} -I testmessage -O testencrypted -x a
expect = /for ${idbobby} successfully/
</test>
<test check-crypto-alicia-encrypted-file>
cmd = cat testencrypted
expect = /END PCP ENCRYPTED FILE/
</test>
</test>
<test check-crypto-bobby-init>
<test check-crypto-bobby-import-secret>
cmd = $pcp -V vb -S -I key-bobby-sec -x b
expect = /${idbobby}/
</test>
<test check-crypto-alicia-import-alicias-key>
cmd = $pcp -V vb -P -I key-alicia-pub
expect = /${idalicia}/
</test>
<test check-crypto-bobby-decrypt>
cmd = $pcp -V vb -d -O testdecrypted -I testencrypted -x b
expect = /from ${idalicia} successfully/
</test>
<test check-crypto-alicia-encrypted-file>
cmd = cat testdecrypted
expect = /${md5msg}/
</test>
</test>
#
# negative tests, check for error handling
<test check-if-catch-conflicting-params>
cmd = $pcp -S -P
expect = /invalid combinatin of commandline parameters/
</test>
<test check-infile-error>
cmd = $pcp -V $vault -I nonexist -P
expect = /Could not open input file nonexist/
</test>
<test check-import-without-id-error>
cmd = $pcp -V $vault -r
expect = /You need to specify a key id/
</test>
<test check-catch-invalid-short-keyid>
cmd = $pcp -V $vault -r -i 0x1
expect = /is too short/
</test>
<test check-catch-invalid-long-keyid>
cmd = $pcp -V $vault -r -i 0x1111111111111111111111111
expect = /is too long/
</test>
<test check-catch-invalid-long-keyid-without-0x>
cmd = $pcp -V $vault -r -i 11111111111111111
expect = /is too long/
</test>
<test check-catch-delete-nonexist>
cmd = $pcp -V $vault -r -i 0x0101010101010101
expect = /No key with id 0x010101/
</test>
<test check-if-export-secret-catch-nonexistent-keyid>
cmd = $pcp -V $vault -s -i 0x0101010101010101
expect = /Could not find a secret key with id 0x010101/
</test>
<test check-if-export-secret-catch-no-primary>
prepare = $pcp -V v2 -l # so we've got just an empty vault
cmd = $pcp -V v2 -s
expect = /no primary secret key in the vault/
</test>
<test check-if-export-secret-catch-outfile-error>
cmd = $pcp -V $vault -l | grep primary |cut -d ' ' -f 1 \
| xargs $pcp -V $vault -s -O nonexistentdir/keyfile -i
expect = /Could not create output file nonexistentdir/
</test>
<test check-if-export-public-catch-nonexistent-keyid>
cmd = $pcp -V $vault -p -i 0x0101010101010101
expect = /Could not find a public key with id 0x010101/
</test>
<test check-if-export-public-catch-no-primary>
prepare = $pcp -V v3 -l # so we've got just an empty vault
cmd = $pcp -V v3 -p
expect = /no primary secret key in the vault/
</test>
<test check-if-export-public-catch-outfile-error>
prepare = $pcp -V $vault -P -I bart.pub
cmd = $pcp -V $vault -l | grep public | cut -d ' ' -f 1 \
| tail -1 | xargs $pcp -V $vault -p -O nonexistentdir/keyfile
expect = /Could not create output file nonexistentdir/
</test>
<test check-if-catch-empty-input>
prepare = echo -n > testfile-empty
cmd = $pcp -V $vault -P -I testfile-empty
expect = /file is empty/
</test>
<test check-if-catch-missing-newlines>
prepare = jot 5000 | while read ignore; do echo -n X; done > testfile-toolong
cmd = $pcp -V $vault -P -I testfile-toolong
expect = /line is too long/
</test>
/*
* Currently disabled, because ZeroMQ's zmq_z85_decode() doesn't really
* catch invalid z85, it only checks the input length and not the actual
* encoding. Re-enable, once that bug is fixed.
<test check-if-catch-invalid-z85>
prepare = jot 30 | while read ignore; do \
echo XXXXXXXXXXXXXXXXXX; done > testfile-noz85
cmd = $pcp -V $vault -P -I testfile-noz85
expect = /could not decode input/
</test>
*/
<test check-if-catch-nokey-behind-z85>
prepare = jot 30 | while read ignore; do echo XXXXX; done \
| $pcp -z > testfile-nokey
cmd = $pcp -V $vault -P -I testfile-nokey
expect = /result to a proper sized key/
</test>
<test check-if-sanity-catch-nosecret>
cmd = $pcp -V $vault -S -I bart.pub
expect = /result to a proper sized key/
</test>
<test check-if-sanity-catch-keyexists>
cmd = $pcp -V $vault -P -I bart.pub
expect = /there already exists a key/
</test>
<test check-if-catch-nokeys>
prepare = $pcp -V v3 -l
cmd = $pcp -V v3 -l
expect = /contain any keys so far/
</test>
<test check-testkey-invalid-id>
prepare = ./invalidkeys
cmd = $pcp -V $vault -S -I testkey-invalid-id
expect /invalid key id/
</test>
<test check-testkey-not-encrypted>
cmd = $pcp -V $vault -S -I testkey-not-encrypted
expect = /secret key contained in key seems to be empty/
</test>
<test check-testkey-wrong-serial>
cmd = $pcp -V $vault -S -I testkey-wrong-serial
# sometimes the created key is invalid in another way
expect = /(invalid serial number|could not decode input)/
</test>
<test check-testkey-wrong-type>
cmd = $pcp -V $vault -S -I testkey-wrong-type
expect = /key type is not SECRET/
</test>
<test check-testkey-wrong-version>
cmd = $pcp -V $vault -S -I testkey-wrong-version
expect = /unknown key version/
</test>
<test check-testpubkey-invalid-id>
prepare = ./invalidkeys
cmd = $pcp -V $vault -P -I testpubkey-invalid-id
expect = /nvalid key id/
</test>
<test check-testpubkey-wrong-serial>
cmd = $pcp -V $vault -P -I testpubkey-wrong-serial
expect = /invalid serial number/
</test>
<test check-testpubkey-wrong-type>
cmd = $pcp -V $vault -P -I testpubkey-wrong-type
expect = /key type is not PUBLIC/
</test>
<test check-testpubkey-wrong-version>
cmd = $pcp -V $vault -P -I testpubkey-wrong-version
expect = /unknown key version/
</test>
<test check-vault-invalid-header>
cmd = $pcp -V testvault-invalidheader -l
expect = /Unexpected vault file format/
</test>
<test check-vault-invalid-version>
cmd = $pcp -V testvault-invalidversion -l
expect = /Unexpected vault file format/
</test>
/*
<test check-vault-invalid-itemsize>
cmd = $pcp -V testvault-invaliditemsize -l
expect = /invalid key item header size/
</test>
*/
<test check-vault-invalid-itemtype>
cmd = $pcp -V testvault-invaliditemtype -l
expect = /invalid key type/
</test>
<test check-vault-invalid-keytype>
cmd = $pcp -V testvault-invalidkeytype -l
expect = /contain any keys so far./
</test>

241
tests/unittests.pl Executable file
View File

@@ -0,0 +1,241 @@
#!/usr/bin/perl
use Test::More;
use IPC::Open3;
use IO::Select;
use FileHandle;
use Config::General qw(ParseConfig);
use Tie::IxHash;
use Data::Dumper;
sub run;
sub execute;
my $config = shift @ARGV || die "usage: $0 <config>\n";
my %cfg = ParseConfig(-ConfigFile => $config,
-InterPolateVars => 1,
-Tie => "Tie::IxHash" );
my $verbose = $cfg{verbose};
if (exists $cfg{confirm}) {
print "$cfg{confirm} [CTRL-C to abort, <ENTER> to continue] ";
my $cont = <STDIN>;
}
foreach my $test (keys %{$cfg{test}}) {
my $name = "$test ($cfg{test}->{$test}->{cmd})";
&runtest($cfg{test}->{$test}, $name);
}
sub runtest {
my($cfg, $name) = @_;
my($in, $out, $error, $timeout);
if (exists $cfg->{prepare}) {
print STDERR " executing prepare command: $cfg->{prepare}\n" if ($verbose);
if ($cfg->{prepare} =~ />/) {
system("$cfg->{prepare}");
}
else {
system("$cfg->{prepare} > /dev/null 2>&1");
}
}
if (exists $cfg->{test}) {
foreach my $test (keys %{$cfg->{test}}) {
my $name = "$test ($cfg->{test}->{$test}->{cmd})";
&runtest($cfg->{test}->{$test}, $name);
}
return;
}
my $ret = run($cfg->{cmd},
$cfg->{input},
\$out, \$error, 5, 0, undef);
my $output = $out . $error;
$output =~ s/^\s*//;
$output =~ s/\s*$//;
if (exists $cfg->{expect}) {
if ($cfg->{expect} =~ /^\//) {
like($output, $cfg->{expect}, "$name") or last;
}
else {
is($output, $cfg->{expect}, "$name") or last;
}
}
elsif (exists $cfg->{"expect-file"}) {
my $e = 0;
if (-s $cfg->{"expect-file"}) {
$e = 1;
}
is($e, 1, "$name") or last;
}
elsif (exists $cfg->{"expect-file-contains"}) {
my($file, $expext) = split /\s\s*/, $cfg->{"expect-file-contains"};
my $e = 0;
if (-s $file) {
$e = 1;
}
is($e, 1, "$name") or last;
if (open F, "<$file") {
my $content = join '', <F>;
close F;
like($content, qr/$expect/s, "$name") or last;
}
else {
fail($test);
last;
}
}
elsif (exists $cfg->{exit}) {
is($ret, $cfg->{exit}, "$name") or last;
}
else {
diag("invalid test spec for $test") or last;
fail($test);
}
}
done_testing;
sub run {
# open3 wrapper. catch stderr, stdout, errno; add timeout and kill
my($cmd, $input, $output, $error, $timeout, $debug, $monitorfile) = @_;
my ($stdin, $stderr, $stdout) = ('', '', '');
my $child = 0;
my $cmdline = join " ", @{$cmd};
$timeout = $timeout ? $timeout : 10;
$SIG{CHLD} = &reaper;
REENTRY:
eval {
local $SIG{ALRM} = sub { die "timeout" };
alarm $timeout;
if ($child && kill 0, $child) {
;
}
else {
$child = open3($stdin, $stdout, $stderr, $cmd);
$childs++;
if ($input) {
print $stdin $input;
}
$stdin->close();
}
my $sel = new IO::Select;
$sel->add($stdout, $stderr);
while(my @ready = $sel->can_read) {
foreach my $fh (@ready) {
my $line;
my $len = sysread $fh, $line, 4096;
if(not defined $len){
die "Error from child: $!\n";
}
elsif ($len == 0){
$sel->remove($fh);
next;
}
else {
if(fileno($fh) == fileno($stdout)) {
$$output .= $line;
}
elsif(fileno($fh) == fileno($stderr)) {
$$error .= $line;
}
else {
die "Unknown filehandle returned!\n";
}
}
}
}
alarm 0;
close $stderr;
close $stdout;
};
TRY:
my($exitcode, $killsignal, $coredumped);
if ($@ !~ /timeout at/) {
my ($alert);
while ($childs > 0 || kill(0, $child)) {
if ((time - $alert) >= 60) {
$alert = time;
}
}
$childs = 0;
$CHILD_ERROR = $childerror{$child};
$killsignal = $CHILD_ERROR & 127;
$coredumped = $CHILD_ERROR & 127;
}
$exitcode = $CHILD_ERROR >> 8;
if ($@ || ($exitcode != 0)) {
chomp $@;
if ($@ =~ /timeout/) {
if (kill 0, $child) {
# whoe it's still running
if ($monitorfile) {
my $size = -s $monitorfile;
sleep $timeout;
my $nsize = -s $monitorfile;
if ($size != $nsize and kill 0, $child) {
# well, file still growing, so the process seems still to work
# go back to the eval{} block and enter select() again
goto REENTRY;
}
else {
# process no more running
# reset $@ and go back to returncode check
$@ = "";
goto TRY;
}
}
else {
# get rid of it
$$error .= "Timed out after $timeout seconds!\n";
kill TERM => $child;
}
}
}
else {
$$error .= $@;
}
return $exitcode;
}
else {
return $exitcode;
}
}
sub reaper {
my $pid;
while (1) {
my $pid = waitpid(-1,WNOHANG);
if ($pid) {
$childs-- if $pid > 0;
$childerror{$pid} = $CHILD_ERROR;
last;
}
}
$SIG{CHLD} = \&reaper;
}