diff options
Diffstat (limited to 'src')
43 files changed, 5974 insertions, 3527 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 7e3f06b..0eedae7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,14 +18,18 @@ ## Process this file with automake to produce Makefile.in +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = ksba.pc + asn1_modules = tmttv2.asn cms.asn buildtool_src = asn1-gentables.c gen-help.c gen-help.h -EXTRA_DIST = ksba-config.in $(asn1_modules) ksba.m4 libksba.vers libksba.def \ - asn1-parse.c asn1-tables.c $(buildtool_src) +EXTRA_DIST = ksba.h.in ksba-config.in $(asn1_modules) ksba.m4 \ + libksba.vers libksba.def \ + asn1-parse.c asn1-tables.c $(buildtool_src) ksba.pc.in BUILT_SOURCES = asn1-parse.c asn1-tables.c bin_SCRIPTS = ksba-config -include_HEADERS = ksba.h +nodist_include_HEADERS = ksba.h lib_LTLIBRARIES = libksba.la noinst_PROGRAMS = ber-dump @@ -36,7 +40,7 @@ CLEANFILES = asn1-gentables DISTCLEANFILES = asn1-tables.c AM_CPPFLAGS = -I$(top_builddir)/gl -I$(top_srcdir)/gl -AM_CFLAGS = $(GPG_ERROR_CFLAGS) +AM_CFLAGS = $(GPG_ERROR_CFLAGS) $(COVERAGE_CFLAGS) if HAVE_LD_VERSION_SCRIPT @@ -82,7 +86,8 @@ endif !HAVE_W32_SYSTEM libksba_la_LDFLAGS = $(no_undefined) $(export_symbols) $(extra_ltoptions) \ $(libksba_version_script_cmd) -version-info \ - @LIBKSBA_LT_CURRENT@:@LIBKSBA_LT_REVISION@:@LIBKSBA_LT_AGE@ + @LIBKSBA_LT_CURRENT@:@LIBKSBA_LT_REVISION@:@LIBKSBA_LT_AGE@ \ + $(COVERAGE_LDFLAGS) libksba_la_INCLUDES = -I$(top_srcdir)/lib libksba_la_DEPENDENCIES = $(srcdir)/libksba.vers $(ksba_deps) libksba_la_LIBADD = $(ksba_res) @LTLIBOBJS@ @GPG_ERROR_LIBS@ @@ -94,31 +99,33 @@ libksba_la_SOURCES = \ reader.c reader.h \ writer.c writer.h \ asn1-parse.y \ - asn1-func.c asn1-func2.c asn1-func.h \ + asn1-func.c asn1-func2.c asn1-func.h asn1-constants.h \ ber-help.c ber-help.h \ ber-decoder.c ber-decoder.h \ der-encoder.c der-encoder.h \ + der-builder.c der-builder.h \ cert.c cert.h \ cms.c cms.h cms-parser.c \ crl.c crl.h \ certreq.c certreq.h \ ocsp.c ocsp.h \ keyinfo.c keyinfo.h \ - oid.c name.c dn.c time.c convert.h \ + oid.c name.c dn.c time.c convert.h stringbuf.h \ version.c util.c util.h shared.h \ sexp-parse.h \ asn1-tables.c ber_dump_SOURCES = ber-dump.c \ ber-decoder.c ber-help.c reader.c writer.c asn1-parse.c \ - asn1-func.c oid.c util.c + asn1-func.c oid.c time.c util.c ber_dump_LDADD = $(GPG_ERROR_LIBS) ../gl/libgnu.la ber_dump_CFLAGS = $(AM_CFLAGS) asn1-parse.c : asn1-func.h gen-help.h asn1-gentables: asn1-gentables.c asn1-parse.c asn1-func.c gen-help.c gen-help.h - $(CC_FOR_BUILD) -I$(srcdir) -DBUILD_GENTOOLS -o $@ \ + $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) \ + $(CPPFLAGS_FOR_BUILD) -I$(srcdir) -DBUILD_GENTOOLS -o $@ \ $(srcdir)/asn1-gentables.c \ `test -f 'asn1-parse.c' || echo '$(srcdir)/'`asn1-parse.c \ $(srcdir)/asn1-func.c \ diff --git a/src/Makefile.in b/src/Makefile.in index c97b83f..99899ee 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -37,7 +37,17 @@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -102,15 +112,12 @@ build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = ber-dump$(EXEEXT) subdir = src -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(srcdir)/ksba-config.in $(srcdir)/versioninfo.rc.in \ - asn1-parse.c $(top_srcdir)/build-aux/depcomp \ - $(top_srcdir)/build-aux/ylwrap $(include_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/gl/m4/gnulib.m4 \ $(top_srcdir)/gl/m4/valgrind-tests.m4 \ $(top_srcdir)/m4/autobuild.m4 \ + $(top_srcdir)/m4/ax_prog_bison.m4 $(top_srcdir)/m4/gcov.m4 \ $(top_srcdir)/m4/gnupg-typedef.m4 \ $(top_srcdir)/m4/gpg-error.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ @@ -118,10 +125,12 @@ am__aclocal_m4_deps = $(top_srcdir)/gl/m4/alloca.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = ksba-config versioninfo.rc +CONFIG_CLEAN_FILES = ksba.h ksba-config ksba.pc versioninfo.rc CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -150,14 +159,15 @@ am__uninstall_files_from_dir = { \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)" + "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) @HAVE_W32_SYSTEM_TRUE@am__DEPENDENCIES_1 = versioninfo.lo am_libksba_la_OBJECTS = visibility.lo reader.lo writer.lo \ asn1-parse.lo asn1-func.lo asn1-func2.lo ber-help.lo \ - ber-decoder.lo der-encoder.lo cert.lo cms.lo cms-parser.lo \ - crl.lo certreq.lo ocsp.lo keyinfo.lo oid.lo name.lo dn.lo \ - time.lo version.lo util.lo asn1-tables.lo + ber-decoder.lo der-encoder.lo der-builder.lo cert.lo cms.lo \ + cms-parser.lo crl.lo certreq.lo ocsp.lo keyinfo.lo oid.lo \ + name.lo dn.lo time.lo version.lo util.lo asn1-tables.lo libksba_la_OBJECTS = $(am_libksba_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -166,12 +176,12 @@ am__v_lt_1 = libksba_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libksba_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(noinst_PROGRAMS) am_ber_dump_OBJECTS = ber_dump-ber-dump.$(OBJEXT) \ ber_dump-ber-decoder.$(OBJEXT) ber_dump-ber-help.$(OBJEXT) \ ber_dump-reader.$(OBJEXT) ber_dump-writer.$(OBJEXT) \ ber_dump-asn1-parse.$(OBJEXT) ber_dump-asn1-func.$(OBJEXT) \ - ber_dump-oid.$(OBJEXT) ber_dump-util.$(OBJEXT) + ber_dump-oid.$(OBJEXT) ber_dump-time.$(OBJEXT) \ + ber_dump-util.$(OBJEXT) ber_dump_OBJECTS = $(am_ber_dump_OBJECTS) am__DEPENDENCIES_2 = ber_dump_DEPENDENCIES = $(am__DEPENDENCIES_2) ../gl/libgnu.la @@ -193,7 +203,26 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/asn1-func.Plo \ + ./$(DEPDIR)/asn1-func2.Plo ./$(DEPDIR)/asn1-parse.Plo \ + ./$(DEPDIR)/asn1-tables.Plo ./$(DEPDIR)/ber-decoder.Plo \ + ./$(DEPDIR)/ber-help.Plo ./$(DEPDIR)/ber_dump-asn1-func.Po \ + ./$(DEPDIR)/ber_dump-asn1-parse.Po \ + ./$(DEPDIR)/ber_dump-ber-decoder.Po \ + ./$(DEPDIR)/ber_dump-ber-dump.Po \ + ./$(DEPDIR)/ber_dump-ber-help.Po ./$(DEPDIR)/ber_dump-oid.Po \ + ./$(DEPDIR)/ber_dump-reader.Po ./$(DEPDIR)/ber_dump-time.Po \ + ./$(DEPDIR)/ber_dump-util.Po ./$(DEPDIR)/ber_dump-writer.Po \ + ./$(DEPDIR)/cert.Plo ./$(DEPDIR)/certreq.Plo \ + ./$(DEPDIR)/cms-parser.Plo ./$(DEPDIR)/cms.Plo \ + ./$(DEPDIR)/crl.Plo ./$(DEPDIR)/der-builder.Plo \ + ./$(DEPDIR)/der-encoder.Plo ./$(DEPDIR)/dn.Plo \ + ./$(DEPDIR)/keyinfo.Plo ./$(DEPDIR)/name.Plo \ + ./$(DEPDIR)/ocsp.Plo ./$(DEPDIR)/oid.Plo \ + ./$(DEPDIR)/reader.Plo ./$(DEPDIR)/time.Plo \ + ./$(DEPDIR)/util.Plo ./$(DEPDIR)/version.Plo \ + ./$(DEPDIR)/visibility.Plo ./$(DEPDIR)/writer.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -231,8 +260,8 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -DATA = $(m4data_DATA) -HEADERS = $(include_HEADERS) +DATA = $(m4data_DATA) $(pkgconfig_DATA) +HEADERS = $(nodist_include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -252,6 +281,10 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ksba-config.in \ + $(srcdir)/ksba.h.in $(srcdir)/ksba.pc.in \ + $(srcdir)/versioninfo.rc.in $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/ylwrap asn1-parse.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ @@ -271,6 +304,8 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ +COVERAGE_CFLAGS = @COVERAGE_CFLAGS@ +COVERAGE_LDFLAGS = @COVERAGE_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ @@ -285,6 +320,9 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +GCOV = @GCOV@ +GENHTML = @GENHTML@ +GPGRT_CONFIG = @GPGRT_CONFIG@ GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@ GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@ GPG_ERROR_LIBS = @GPG_ERROR_LIBS@ @@ -300,7 +338,9 @@ KSBA_CONFIG_API_VERSION = @KSBA_CONFIG_API_VERSION@ KSBA_CONFIG_CFLAGS = @KSBA_CONFIG_CFLAGS@ KSBA_CONFIG_HOST = @KSBA_CONFIG_HOST@ KSBA_CONFIG_LIBS = @KSBA_CONFIG_LIBS@ +LCOV = @LCOV@ LD = @LD@ +LDADD_FOR_TESTS_KLUDGE = @LDADD_FOR_TESTS_KLUDGE@ LDFLAGS = @LDFLAGS@ LIBKSBA_LT_AGE = @LIBKSBA_LT_AGE@ LIBKSBA_LT_CURRENT = @LIBKSBA_LT_CURRENT@ @@ -335,9 +375,11 @@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ +SHTOOL = @SHTOOL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ +VERSION_NUMBER = @VERSION_NUMBER@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -392,21 +434,24 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = ksba.pc asn1_modules = tmttv2.asn cms.asn buildtool_src = asn1-gentables.c gen-help.c gen-help.h -EXTRA_DIST = ksba-config.in $(asn1_modules) ksba.m4 libksba.vers libksba.def \ - asn1-parse.c asn1-tables.c $(buildtool_src) +EXTRA_DIST = ksba.h.in ksba-config.in $(asn1_modules) ksba.m4 \ + libksba.vers libksba.def \ + asn1-parse.c asn1-tables.c $(buildtool_src) ksba.pc.in BUILT_SOURCES = asn1-parse.c asn1-tables.c bin_SCRIPTS = ksba-config -include_HEADERS = ksba.h +nodist_include_HEADERS = ksba.h lib_LTLIBRARIES = libksba.la m4datadir = $(datadir)/aclocal m4data_DATA = ksba.m4 CLEANFILES = asn1-gentables DISTCLEANFILES = asn1-tables.c AM_CPPFLAGS = -I$(top_builddir)/gl -I$(top_srcdir)/gl -AM_CFLAGS = $(GPG_ERROR_CFLAGS) +AM_CFLAGS = $(GPG_ERROR_CFLAGS) $(COVERAGE_CFLAGS) @HAVE_LD_VERSION_SCRIPT_FALSE@libksba_version_script_cmd = @HAVE_LD_VERSION_SCRIPT_TRUE@libksba_version_script_cmd = -Wl,--version-script=$(srcdir)/libksba.vers @HAVE_W32_SYSTEM_TRUE@RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ @@ -426,7 +471,8 @@ AM_CFLAGS = $(GPG_ERROR_CFLAGS) @HAVE_W32_SYSTEM_TRUE@ksba_deps = $(ksba_res) libksba.def libksba_la_LDFLAGS = $(no_undefined) $(export_symbols) $(extra_ltoptions) \ $(libksba_version_script_cmd) -version-info \ - @LIBKSBA_LT_CURRENT@:@LIBKSBA_LT_REVISION@:@LIBKSBA_LT_AGE@ + @LIBKSBA_LT_CURRENT@:@LIBKSBA_LT_REVISION@:@LIBKSBA_LT_AGE@ \ + $(COVERAGE_LDFLAGS) libksba_la_INCLUDES = -I$(top_srcdir)/lib libksba_la_DEPENDENCIES = $(srcdir)/libksba.vers $(ksba_deps) @@ -437,24 +483,25 @@ libksba_la_SOURCES = \ reader.c reader.h \ writer.c writer.h \ asn1-parse.y \ - asn1-func.c asn1-func2.c asn1-func.h \ + asn1-func.c asn1-func2.c asn1-func.h asn1-constants.h \ ber-help.c ber-help.h \ ber-decoder.c ber-decoder.h \ der-encoder.c der-encoder.h \ + der-builder.c der-builder.h \ cert.c cert.h \ cms.c cms.h cms-parser.c \ crl.c crl.h \ certreq.c certreq.h \ ocsp.c ocsp.h \ keyinfo.c keyinfo.h \ - oid.c name.c dn.c time.c convert.h \ + oid.c name.c dn.c time.c convert.h stringbuf.h \ version.c util.c util.h shared.h \ sexp-parse.h \ asn1-tables.c ber_dump_SOURCES = ber-dump.c \ ber-decoder.c ber-help.c reader.c writer.c asn1-parse.c \ - asn1-func.c oid.c util.c + asn1-func.c oid.c time.c util.c ber_dump_LDADD = $(GPG_ERROR_LIBS) ../gl/libgnu.la ber_dump_CFLAGS = $(AM_CFLAGS) @@ -475,14 +522,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -493,11 +539,24 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): +ksba.h: $(top_builddir)/config.status $(srcdir)/ksba.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ ksba-config: $(top_builddir)/config.status $(srcdir)/ksba-config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +ksba.pc: $(top_builddir)/config.status $(srcdir)/ksba.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ versioninfo.rc: $(top_builddir)/config.status $(srcdir)/versioninfo.rc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +clean-noinstPROGRAMS: + @list='$(noinst_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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ @@ -536,15 +595,6 @@ clean-libLTLIBRARIES: libksba.la: $(libksba_la_OBJECTS) $(libksba_la_DEPENDENCIES) $(EXTRA_libksba_la_DEPENDENCIES) $(AM_V_CCLD)$(libksba_la_LINK) -rpath $(libdir) $(libksba_la_OBJECTS) $(libksba_la_LIBADD) $(LIBS) -clean-noinstPROGRAMS: - @list='$(noinst_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 - ber-dump$(EXEEXT): $(ber_dump_OBJECTS) $(ber_dump_DEPENDENCIES) $(EXTRA_ber_dump_DEPENDENCIES) @rm -f ber-dump$(EXEEXT) $(AM_V_CCLD)$(ber_dump_LINK) $(ber_dump_OBJECTS) $(ber_dump_LDADD) $(LIBS) @@ -590,38 +640,46 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-func.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-func2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-parse.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-tables.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber-decoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber-help.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-asn1-func.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-asn1-parse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-decoder.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-dump.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-help.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-oid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-reader.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-writer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cert.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certreq.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-parser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der-encoder.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ocsp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visibility.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-func.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-func2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1-tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber-decoder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber-help.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-asn1-func.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-asn1-parse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-decoder.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-ber-help.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-oid.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-time.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-util.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ber_dump-writer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cert.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certreq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-parser.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der-builder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der-encoder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ocsp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visibility.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writer.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -756,6 +814,20 @@ ber_dump-oid.obj: oid.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -c -o ber_dump-oid.obj `if test -f 'oid.c'; then $(CYGPATH_W) 'oid.c'; else $(CYGPATH_W) '$(srcdir)/oid.c'; fi` +ber_dump-time.o: time.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -MT ber_dump-time.o -MD -MP -MF $(DEPDIR)/ber_dump-time.Tpo -c -o ber_dump-time.o `test -f 'time.c' || echo '$(srcdir)/'`time.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ber_dump-time.Tpo $(DEPDIR)/ber_dump-time.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='time.c' object='ber_dump-time.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -c -o ber_dump-time.o `test -f 'time.c' || echo '$(srcdir)/'`time.c + +ber_dump-time.obj: time.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -MT ber_dump-time.obj -MD -MP -MF $(DEPDIR)/ber_dump-time.Tpo -c -o ber_dump-time.obj `if test -f 'time.c'; then $(CYGPATH_W) 'time.c'; else $(CYGPATH_W) '$(srcdir)/time.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ber_dump-time.Tpo $(DEPDIR)/ber_dump-time.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='time.c' object='ber_dump-time.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -c -o ber_dump-time.obj `if test -f 'time.c'; then $(CYGPATH_W) 'time.c'; else $(CYGPATH_W) '$(srcdir)/time.c'; fi` + ber_dump-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ber_dump_CFLAGS) $(CFLAGS) -MT ber_dump-util.o -MD -MP -MF $(DEPDIR)/ber_dump-util.Tpo -c -o ber_dump-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ber_dump-util.Tpo $(DEPDIR)/ber_dump-util.Po @@ -799,9 +871,30 @@ uninstall-m4dataDATA: @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir) -install-includeHEADERS: $(include_HEADERS) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ @@ -815,9 +908,9 @@ install-includeHEADERS: $(include_HEADERS) $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done -uninstall-includeHEADERS: +uninstall-nodist_includeHEADERS: @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) @@ -873,7 +966,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -906,10 +1002,10 @@ distdir: $(DISTFILES) check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(DATA) \ $(HEADERS) installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) @@ -953,7 +1049,40 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1-func.Plo + -rm -f ./$(DEPDIR)/asn1-func2.Plo + -rm -f ./$(DEPDIR)/asn1-parse.Plo + -rm -f ./$(DEPDIR)/asn1-tables.Plo + -rm -f ./$(DEPDIR)/ber-decoder.Plo + -rm -f ./$(DEPDIR)/ber-help.Plo + -rm -f ./$(DEPDIR)/ber_dump-asn1-func.Po + -rm -f ./$(DEPDIR)/ber_dump-asn1-parse.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-decoder.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-dump.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-help.Po + -rm -f ./$(DEPDIR)/ber_dump-oid.Po + -rm -f ./$(DEPDIR)/ber_dump-reader.Po + -rm -f ./$(DEPDIR)/ber_dump-time.Po + -rm -f ./$(DEPDIR)/ber_dump-util.Po + -rm -f ./$(DEPDIR)/ber_dump-writer.Po + -rm -f ./$(DEPDIR)/cert.Plo + -rm -f ./$(DEPDIR)/certreq.Plo + -rm -f ./$(DEPDIR)/cms-parser.Plo + -rm -f ./$(DEPDIR)/cms.Plo + -rm -f ./$(DEPDIR)/crl.Plo + -rm -f ./$(DEPDIR)/der-builder.Plo + -rm -f ./$(DEPDIR)/der-encoder.Plo + -rm -f ./$(DEPDIR)/dn.Plo + -rm -f ./$(DEPDIR)/keyinfo.Plo + -rm -f ./$(DEPDIR)/name.Plo + -rm -f ./$(DEPDIR)/ocsp.Plo + -rm -f ./$(DEPDIR)/oid.Plo + -rm -f ./$(DEPDIR)/reader.Plo + -rm -f ./$(DEPDIR)/time.Plo + -rm -f ./$(DEPDIR)/util.Plo + -rm -f ./$(DEPDIR)/version.Plo + -rm -f ./$(DEPDIR)/visibility.Plo + -rm -f ./$(DEPDIR)/writer.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -970,8 +1099,8 @@ info: info-am info-am: -install-data-am: install-data-local install-includeHEADERS \ - install-m4dataDATA +install-data-am: install-data-local install-m4dataDATA \ + install-nodist_includeHEADERS install-pkgconfigDATA install-dvi: install-dvi-am @@ -1000,7 +1129,40 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1-func.Plo + -rm -f ./$(DEPDIR)/asn1-func2.Plo + -rm -f ./$(DEPDIR)/asn1-parse.Plo + -rm -f ./$(DEPDIR)/asn1-tables.Plo + -rm -f ./$(DEPDIR)/ber-decoder.Plo + -rm -f ./$(DEPDIR)/ber-help.Plo + -rm -f ./$(DEPDIR)/ber_dump-asn1-func.Po + -rm -f ./$(DEPDIR)/ber_dump-asn1-parse.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-decoder.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-dump.Po + -rm -f ./$(DEPDIR)/ber_dump-ber-help.Po + -rm -f ./$(DEPDIR)/ber_dump-oid.Po + -rm -f ./$(DEPDIR)/ber_dump-reader.Po + -rm -f ./$(DEPDIR)/ber_dump-time.Po + -rm -f ./$(DEPDIR)/ber_dump-util.Po + -rm -f ./$(DEPDIR)/ber_dump-writer.Po + -rm -f ./$(DEPDIR)/cert.Plo + -rm -f ./$(DEPDIR)/certreq.Plo + -rm -f ./$(DEPDIR)/cms-parser.Plo + -rm -f ./$(DEPDIR)/cms.Plo + -rm -f ./$(DEPDIR)/crl.Plo + -rm -f ./$(DEPDIR)/der-builder.Plo + -rm -f ./$(DEPDIR)/der-encoder.Plo + -rm -f ./$(DEPDIR)/dn.Plo + -rm -f ./$(DEPDIR)/keyinfo.Plo + -rm -f ./$(DEPDIR)/name.Plo + -rm -f ./$(DEPDIR)/ocsp.Plo + -rm -f ./$(DEPDIR)/oid.Plo + -rm -f ./$(DEPDIR)/reader.Plo + -rm -f ./$(DEPDIR)/time.Plo + -rm -f ./$(DEPDIR)/util.Plo + -rm -f ./$(DEPDIR)/version.Plo + -rm -f ./$(DEPDIR)/visibility.Plo + -rm -f ./$(DEPDIR)/writer.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1017,28 +1179,32 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES uninstall-local uninstall-m4dataDATA +uninstall-am: uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ + uninstall-local uninstall-m4dataDATA \ + uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA .MAKE: all check install install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ - cscopelist-am ctags ctags-am distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binSCRIPTS install-data install-data-am \ - install-data-local install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am \ - install-includeHEADERS install-info install-info-am \ - install-libLTLIBRARIES install-m4dataDATA 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 tags-am uninstall uninstall-am \ - uninstall-binSCRIPTS uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES uninstall-local uninstall-m4dataDATA +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-m4dataDATA install-man install-nodist_includeHEADERS \ + install-pdf install-pdf-am install-pkgconfigDATA 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 tags-am uninstall \ + uninstall-am uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ + uninstall-local uninstall-m4dataDATA \ + uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA + +.PRECIOUS: Makefile @HAVE_W32_SYSTEM_TRUE@.rc.lo: @@ -1055,7 +1221,8 @@ uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \ asn1-parse.c : asn1-func.h gen-help.h asn1-gentables: asn1-gentables.c asn1-parse.c asn1-func.c gen-help.c gen-help.h - $(CC_FOR_BUILD) -I$(srcdir) -DBUILD_GENTOOLS -o $@ \ + $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) \ + $(CPPFLAGS_FOR_BUILD) -I$(srcdir) -DBUILD_GENTOOLS -o $@ \ $(srcdir)/asn1-gentables.c \ `test -f 'asn1-parse.c' || echo '$(srcdir)/'`asn1-parse.c \ $(srcdir)/asn1-func.c \ diff --git a/src/asn1-constants.h b/src/asn1-constants.h new file mode 100644 index 0000000..ed819fb --- /dev/null +++ b/src/asn1-constants.h @@ -0,0 +1,66 @@ +/* asn1-constants.h + * Copyright (C) 2020 g10 Code GmbH + * + * This file is free software; the authors give unlimited permission + * to copy, distribute and modify it. + * + * SPDX-License-Identifier: FSFUL + */ + +#ifndef ASN1_CONSTANTS_H +#define ASN1_CONSTANTS_H + +typedef enum { + TYPE_NONE = 0, + TYPE_BOOLEAN = 1, + TYPE_INTEGER = 2, + TYPE_BIT_STRING = 3, + TYPE_OCTET_STRING = 4, + TYPE_NULL = 5, + TYPE_OBJECT_ID = 6, + TYPE_OBJECT_DESCRIPTOR = 7, + TYPE_EXTERNAL = 8, + TYPE_REAL = 9, + TYPE_ENUMERATED = 10, + TYPE_EMBEDDED_PDV = 11, + TYPE_UTF8_STRING = 12, + TYPE_REALTIVE_OID = 13, + TYPE_SEQUENCE = 16, + TYPE_SET = 17, + TYPE_NUMERIC_STRING = 18, + TYPE_PRINTABLE_STRING = 19, + TYPE_TELETEX_STRING = 20, + TYPE_VIDEOTEX_STRING = 21, + TYPE_IA5_STRING = 22, + TYPE_UTC_TIME = 23, + TYPE_GENERALIZED_TIME = 24, + TYPE_GRAPHIC_STRING = 25, + TYPE_VISIBLE_STRING = 26, + TYPE_GENERAL_STRING = 27, + TYPE_UNIVERSAL_STRING = 28, + TYPE_CHARACTER_STRING = 29, + TYPE_BMP_STRING = 30, + /* the following values do not correspond to an Universal tag */ + TYPE_CONSTANT = 128, + TYPE_IDENTIFIER, + TYPE_TAG, + TYPE_DEFAULT, + TYPE_SIZE, + TYPE_SEQUENCE_OF, + TYPE_ANY, + TYPE_SET_OF, + TYPE_DEFINITIONS, + TYPE_CHOICE, + TYPE_IMPORTS, + TYPE_PRE_SEQUENCE /* premanufactured Seqences as used by the DER encoder. */ +} node_type_t; + + +enum tag_class { + CLASS_UNIVERSAL = 0, + CLASS_APPLICATION = 1, + CLASS_CONTEXT = 2, + CLASS_PRIVATE =3 +}; + +#endif /*ASN1_CONSTANTS_H*/ diff --git a/src/asn1-func.c b/src/asn1-func.c index f93300b..e64c479 100755 --- a/src/asn1-func.c +++ b/src/asn1-func.c @@ -47,6 +47,10 @@ #include "asn1-func.h" +#ifdef BUILD_GENTOOLS +#define gpgrt_log_debug(...) /**/ +#endif + static AsnNode resolve_identifier (AsnNode root, AsnNode node, int nestlevel); @@ -289,7 +293,8 @@ _ksba_asn_remove_node (AsnNode node) /* find the node with the given name. A name part of "?LAST" matches - the last element of a set of */ + the last element of a SET_OF. A "+" matches the CHOICE with values + set. */ static AsnNode find_node (AsnNode root, const char *name, int resolve) { @@ -301,6 +306,7 @@ find_node (AsnNode root, const char *name, int resolve) if (!name || !name[0]) return NULL; + /* gpgrt_log_debug ("%s: looking for '%s'\n", __func__, name); */ /* find the first part */ s = name; for (i=0; *s && *s != '.' && i < DIM(buf)-1; s++) @@ -331,6 +337,7 @@ find_node (AsnNode root, const char *name, int resolve) /* a double dot can be used to get over an unnamed sequence in a set - Actually a hack to workaround a bug. We should rethink the entire node naming issue */ + /* gpgrt_log_debug ("%s: .. to '%s'\n", __func__, p?p->name:""); */ } else if (!strcmp (buf, "?LAST")) { @@ -339,10 +346,19 @@ find_node (AsnNode root, const char *name, int resolve) while (p->right) p = p->right; } + else if (*buf == '+' && !buf[1]) + { + for (; p ; p = p->right) + if (p->off != -1) + break; + /* gpgrt_log_debug ("%s: + to '%s'\n", __func__, p?p->name:""); */ + } else { for (; p ; p = p->right) { + /* gpgrt_log_debug ("%s: '%s' to '%s'\n", */ + /* __func__, buf, p?p->name:""); */ if (p->name && !strcmp (p->name, buf)) break; if (resolve && p->name && p->type == TYPE_IDENTIFIER) diff --git a/src/asn1-func.h b/src/asn1-func.h index cc34736..fa7b7ee 100755 --- a/src/asn1-func.h +++ b/src/asn1-func.h @@ -33,58 +33,7 @@ #ifndef ASN1_FUNC_H #define ASN1_FUNC_H -typedef enum { - TYPE_NONE = 0, - TYPE_BOOLEAN = 1, - TYPE_INTEGER = 2, - TYPE_BIT_STRING = 3, - TYPE_OCTET_STRING = 4, - TYPE_NULL = 5, - TYPE_OBJECT_ID = 6, - TYPE_OBJECT_DESCRIPTOR = 7, - TYPE_EXTERNAL = 8, - TYPE_REAL = 9, - TYPE_ENUMERATED = 10, - TYPE_EMBEDDED_PDV = 11, - TYPE_UTF8_STRING = 12, - TYPE_REALTIVE_OID = 13, - TYPE_SEQUENCE = 16, - TYPE_SET = 17, - TYPE_NUMERIC_STRING = 18, - TYPE_PRINTABLE_STRING = 19, - TYPE_TELETEX_STRING = 20, - TYPE_VIDEOTEX_STRING = 21, - TYPE_IA5_STRING = 22, - TYPE_UTC_TIME = 23, - TYPE_GENERALIZED_TIME = 24, - TYPE_GRAPHIC_STRING = 25, - TYPE_VISIBLE_STRING = 26, - TYPE_GENERAL_STRING = 27, - TYPE_UNIVERSAL_STRING = 28, - TYPE_CHARACTER_STRING = 29, - TYPE_BMP_STRING = 30, - /* the following values do not correspond to an Universal tag */ - TYPE_CONSTANT = 128, - TYPE_IDENTIFIER, - TYPE_TAG, - TYPE_DEFAULT, - TYPE_SIZE, - TYPE_SEQUENCE_OF, - TYPE_ANY, - TYPE_SET_OF, - TYPE_DEFINITIONS, - TYPE_CHOICE, - TYPE_IMPORTS, - TYPE_PRE_SEQUENCE /* premanufactured Seqences as used by the DER encoder. */ -} node_type_t; - - -enum tag_class { - CLASS_UNIVERSAL = 0, - CLASS_APPLICATION = 1, - CLASS_CONTEXT = 2, - CLASS_PRIVATE =3 -}; +#include "asn1-constants.h" /* Important: this must match the code in asn1-gentables.c */ struct node_flag_s { diff --git a/src/asn1-gentables.c b/src/asn1-gentables.c index c418fe1..aba642c 100644 --- a/src/asn1-gentables.c +++ b/src/asn1-gentables.c @@ -109,10 +109,17 @@ insert_string (const char *name) static int cmp_string (const void *aptr, const void *bptr) { - const struct name_list_s **a = (const struct name_list_s **)aptr; - const struct name_list_s **b = (const struct name_list_s **)bptr; + const char *a = (*(const struct name_list_s **)aptr)->name; + const char *b = (*(const struct name_list_s **)bptr)->name; - return strlen ((*a)->name) < strlen ((*b)->name); + const size_t len_a = strlen(a); + const size_t len_b = strlen(b); + + if (len_a < len_b) + return -1; + if (len_a > len_b) + return +1; + return strcmp(a, b); } static void diff --git a/src/asn1-parse.c b/src/asn1-parse.c index 36e0103..29bf4d6 100644 --- a/src/asn1-parse.c +++ b/src/asn1-parse.c @@ -189,51 +189,6 @@ extern int yydebug; BMPSTRING = 301 }; #endif -/* Tokens. */ -#define ASSIG 258 -#define NUM 259 -#define IDENTIFIER 260 -#define OPTIONAL 261 -#define INTEGER 262 -#define SIZE 263 -#define OCTET 264 -#define STRING 265 -#define SEQUENCE 266 -#define BIT 267 -#define UNIVERSAL 268 -#define PRIVATE 269 -#define DEFAULT 270 -#define CHOICE 271 -#define OF 272 -#define OBJECT 273 -#define STR_IDENTIFIER 274 -#define ksba_BOOLEAN 275 -#define ksba_TRUE 276 -#define ksba_FALSE 277 -#define APPLICATION 278 -#define ANY 279 -#define DEFINED 280 -#define SET 281 -#define BY 282 -#define EXPLICIT 283 -#define IMPLICIT 284 -#define DEFINITIONS 285 -#define TAGS 286 -#define ksba_BEGIN 287 -#define ksba_END 288 -#define UTCTime 289 -#define GeneralizedTime 290 -#define FROM 291 -#define IMPORTS 292 -#define TOKEN_NULL 293 -#define ENUMERATED 294 -#define UTF8STRING 295 -#define NUMERICSTRING 296 -#define PRINTABLESTRING 297 -#define TELETEXSTRING 298 -#define IA5STRING 299 -#define UNIVERSALSTRING 300 -#define BMPSTRING 301 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -246,7 +201,7 @@ union YYSTYPE char str[MAX_STRING_LENGTH]; AsnNode node; -#line 250 "asn1-parse.c" /* yacc.c:355 */ +#line 205 "asn1-parse.c" /* yacc.c:355 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 @@ -274,7 +229,7 @@ static void set_down (AsnNode node, AsnNode down); static int yylex (YYSTYPE *lvalp, void *parm); static void yyerror (void *parm, const char *s); -#line 278 "asn1-parse.c" /* yacc.c:358 */ +#line 233 "asn1-parse.c" /* yacc.c:358 */ #ifdef short # undef short @@ -516,16 +471,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 202 +#define YYLAST 195 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 57 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 52 +#define YYNNTS 51 /* YYNRULES -- Number of rules. */ -#define YYNRULES 119 +#define YYNRULES 116 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 210 +#define YYNSTATES 203 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -577,17 +532,17 @@ static const yytype_uint8 yytranslate[] = static const yytype_uint16 yyrline[] = { 0, 184, 184, 185, 188, 189, 192, 199, 200, 203, - 204, 207, 208, 211, 216, 224, 225, 232, 237, 248, - 253, 261, 263, 270, 271, 272, 275, 281, 289, 291, - 296, 303, 308, 313, 320, 324, 330, 341, 347, 351, - 357, 363, 372, 376, 382, 386, 394, 395, 402, 403, - 410, 412, 419, 421, 428, 429, 436, 438, 445, 446, - 455, 456, 457, 458, 459, 460, 461, 467, 475, 479, - 486, 490, 498, 506, 512, 517, 524, 525, 526, 527, - 528, 529, 530, 531, 532, 533, 534, 535, 536, 542, - 546, 557, 561, 568, 575, 582, 584, 591, 596, 601, - 610, 615, 620, 629, 636, 640, 652, 659, 666, 675, - 684, 685, 688, 690, 697, 706, 707, 720, 721, 724 + 204, 207, 208, 211, 216, 224, 225, 250, 255, 263, + 265, 272, 273, 274, 277, 283, 291, 293, 298, 305, + 310, 315, 322, 326, 332, 343, 349, 353, 359, 365, + 374, 378, 384, 388, 396, 397, 404, 405, 412, 414, + 421, 423, 430, 431, 438, 440, 447, 448, 457, 458, + 459, 460, 461, 462, 463, 469, 477, 481, 488, 492, + 500, 508, 514, 519, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 544, 548, 559, + 563, 570, 577, 584, 586, 593, 598, 603, 612, 617, + 622, 631, 638, 642, 654, 661, 668, 677, 686, 687, + 690, 692, 699, 708, 724, 725, 728 }; #endif @@ -609,13 +564,13 @@ static const char *const yytname[] = "\"BMPString\"", "'+'", "'-'", "'('", "')'", "','", "'['", "']'", "'{'", "'}'", "'.'", "$accept", "input", "pos_num", "neg_num", "pos_neg_num", "num_identifier", "pos_neg_identifier", "constant", "constant_list", - "identifier_list", "obj_constant", "obj_constant_list", "class", - "tag_type", "tag", "default", "integer_def", "boolean_def", "Time", - "size_def2", "size_def", "octet_string_def", "utf8_string_def", - "numeric_string_def", "printable_string_def", "teletex_string_def", - "ia5_string_def", "universal_string_def", "bmp_string_def", "string_def", - "bit_element", "bit_element_list", "bit_string_def", "enumerated_def", - "object_def", "type_assig_right", "type_assig_right_tag", + "obj_constant", "obj_constant_list", "class", "tag_type", "tag", + "default", "integer_def", "boolean_def", "Time", "size_def2", "size_def", + "octet_string_def", "utf8_string_def", "numeric_string_def", + "printable_string_def", "teletex_string_def", "ia5_string_def", + "universal_string_def", "bmp_string_def", "string_def", "bit_element", + "bit_element_list", "bit_string_def", "enumerated_def", "object_def", + "type_assig_right", "type_assig_right_tag", "type_assig_right_tag_default", "type_assig", "type_assig_list", "sequence_def", "set_def", "choise_def", "any_def", "type_def", "constant_def", "type_constant", "type_constant_list", "definitions_id", @@ -637,10 +592,10 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -120 +#define YYPACT_NINF -137 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-120))) + (!!((Yystate) == (-137))) #define YYTABLE_NINF -1 @@ -651,27 +606,27 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - -120, 26, -120, -31, 7, -120, 42, 67, -120, 31, - -120, -120, 1, -120, -120, 54, 105, -120, -120, 49, - 70, 93, -120, 90, 124, 126, -120, 22, 100, -120, - -120, -120, 38, -120, 130, 48, 134, 136, 125, -120, - -120, 42, 24, 89, 135, 13, 138, 95, 140, -120, - 137, 16, -120, -120, -120, 106, 24, 24, 24, 24, - 24, 24, 24, 25, 83, 112, 114, -120, -120, -120, - -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, - -120, -120, -120, -120, -120, -120, -120, 107, 160, 162, - 42, 117, 159, -120, -120, 20, 24, 112, 163, 153, - 118, 163, -120, 144, 112, 163, 156, 169, -120, -120, - -120, -120, -120, -120, -120, 122, -120, -120, -120, 172, - -120, -120, -120, 129, 42, -120, 123, 129, 128, 131, - 3, -120, -15, -120, -120, 48, -120, -6, 112, 169, - 46, 174, -120, 51, 112, 132, -120, 53, -120, 133, - -120, 127, 6, 42, -28, -120, 3, -120, 178, 180, - -120, -120, 139, 20, -120, 29, -120, 163, -120, -120, - 59, -120, -120, -120, -120, 181, 169, -120, -120, 141, - -120, 8, -120, 142, 143, -120, -120, -120, -120, -120, - 94, -120, -120, -120, 145, -120, 129, -120, 129, -120, - -120, -120, -120, -120, -120, -120, 146, 149, -120, -120 + -137, 33, -137, -39, 0, -137, 76, 115, -137, 4, + -137, -137, -1, -137, -137, 15, 63, -137, -137, 59, + 77, 86, -137, -137, 105, 24, -137, -137, -137, 18, + 52, 126, 129, 128, -137, -137, 16, 94, 139, 17, + 140, 97, 133, -137, 130, 20, -137, -137, -137, 99, + 16, 16, 16, 16, 16, 16, 16, 22, 117, 96, + 107, -137, -137, -137, -137, -137, -137, -137, -137, -137, + -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, + -137, 100, 153, 155, 110, 152, -137, -137, 7, 16, + 96, 156, 146, 111, 156, -137, 137, 96, 156, 149, + 162, -137, -137, -137, -137, -137, -137, -137, 116, -137, + -137, -137, 164, -137, -137, -137, 84, 76, -137, 118, + 84, 120, 122, 37, -137, -3, -137, -137, 52, -137, + 51, 96, 162, 58, 168, -137, 60, 96, 125, -137, + 66, -137, 123, -137, 119, 3, 76, -6, -137, 37, + -137, 173, 174, -137, -137, 131, 7, -137, 34, -137, + 156, -137, -137, 68, -137, -137, -137, -137, 175, 162, + -137, -137, 124, -137, 5, -137, 127, 132, -137, -137, + -137, -137, -137, 78, -137, -137, -137, 134, -137, 84, + -137, 84, -137, -137, -137, -137, -137, -137, -137, 135, + 136, -137, -137 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -680,48 +635,48 @@ static const yytype_int16 yypact[] = static const yytype_uint8 yydefact[] = { 2, 0, 1, 0, 0, 3, 0, 0, 9, 10, - 19, 21, 0, 117, 118, 0, 0, 114, 22, 0, - 0, 0, 20, 115, 0, 0, 17, 0, 0, 110, - 111, 112, 0, 18, 0, 0, 0, 0, 0, 119, - 113, 0, 74, 34, 0, 0, 0, 0, 0, 37, - 104, 0, 38, 39, 88, 0, 46, 48, 50, 52, - 54, 56, 58, 0, 28, 0, 76, 78, 80, 81, - 60, 61, 62, 63, 64, 65, 66, 79, 82, 77, - 84, 89, 106, 83, 87, 85, 86, 0, 0, 0, - 0, 0, 0, 42, 75, 0, 44, 0, 0, 0, - 70, 0, 73, 0, 0, 0, 0, 0, 47, 49, - 51, 53, 55, 57, 59, 0, 23, 24, 25, 0, - 29, 30, 90, 0, 0, 109, 0, 0, 0, 0, - 0, 15, 0, 45, 98, 0, 95, 0, 0, 0, - 0, 0, 101, 0, 0, 0, 68, 0, 26, 0, - 10, 0, 0, 0, 0, 43, 0, 4, 0, 0, - 7, 8, 0, 0, 35, 91, 94, 0, 97, 99, - 0, 103, 105, 100, 102, 0, 0, 72, 27, 0, - 108, 0, 40, 0, 0, 5, 6, 13, 16, 93, - 0, 92, 96, 71, 0, 69, 0, 107, 0, 14, - 12, 32, 33, 11, 31, 67, 0, 0, 36, 41 + 17, 19, 0, 114, 115, 0, 0, 112, 20, 0, + 0, 0, 18, 113, 0, 0, 108, 109, 110, 0, + 0, 0, 0, 0, 116, 111, 72, 32, 0, 0, + 0, 0, 0, 35, 102, 0, 36, 37, 86, 0, + 44, 46, 48, 50, 52, 54, 56, 0, 26, 0, + 74, 76, 78, 79, 58, 59, 60, 61, 62, 63, + 64, 77, 80, 75, 82, 87, 104, 81, 85, 83, + 84, 0, 0, 0, 0, 0, 40, 73, 0, 42, + 0, 0, 0, 68, 0, 71, 0, 0, 0, 0, + 0, 45, 47, 49, 51, 53, 55, 57, 0, 21, + 22, 23, 0, 27, 28, 88, 0, 0, 107, 0, + 0, 0, 0, 0, 15, 0, 43, 96, 0, 93, + 0, 0, 0, 0, 0, 99, 0, 0, 0, 66, + 0, 24, 0, 10, 0, 0, 0, 0, 41, 0, + 4, 0, 0, 7, 8, 0, 0, 33, 89, 92, + 0, 95, 97, 0, 101, 103, 98, 100, 0, 0, + 70, 25, 0, 106, 0, 38, 0, 0, 5, 6, + 13, 16, 91, 0, 90, 94, 69, 0, 67, 0, + 105, 0, 14, 12, 30, 31, 11, 29, 65, 0, + 0, 34, 39 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -120, -120, -120, -120, -114, -119, -120, 27, -120, -120, - -12, -40, -120, -120, -120, -120, -120, -120, -120, 96, - -42, -120, -120, -120, -120, -120, -120, -120, -120, -120, - 11, 52, -120, -120, -120, -63, 57, -120, 33, 21, - -120, -120, -120, -120, -120, -120, 170, -120, -120, -120, - -120, -120 + -137, -137, -137, -137, -136, -114, -137, 31, -137, -12, + -103, -137, -137, -137, -137, -137, -137, -137, 103, -34, + -137, -137, -137, -137, -137, -137, -137, -137, -137, 21, + 57, -137, -137, -137, -58, 64, -137, 35, 30, -137, + -137, -137, -137, -137, -137, 165, -137, -137, -137, -137, + -137 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 160, 161, 162, 10, 204, 131, 132, 27, - 11, 12, 119, 64, 65, 191, 66, 67, 68, 93, - 94, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 146, 147, 78, 79, 80, 81, 82, 166, 136, 137, - 83, 84, 85, 86, 29, 30, 31, 32, 4, 25, - 15, 5 + -1, 1, 153, 154, 155, 10, 197, 124, 125, 11, + 12, 112, 58, 59, 184, 60, 61, 62, 86, 87, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 139, + 140, 72, 73, 74, 75, 76, 159, 129, 130, 77, + 78, 79, 80, 26, 27, 28, 29, 4, 24, 15, + 5 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -729,79 +684,77 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { - 18, 90, 122, 99, 151, 8, 9, 157, 154, 106, - 8, 9, 8, 9, 108, 109, 110, 111, 112, 113, - 114, 91, 182, 6, 91, 129, 2, 33, 183, 115, - 97, 3, 91, 104, 134, 189, 163, 7, 116, 117, - 164, 142, 184, 28, 190, 167, 8, 9, 118, 168, - 158, 159, 21, 42, 133, 43, 17, 44, 34, 45, - 46, 180, 92, 197, 47, 92, 48, 98, 49, 130, - 105, 39, 50, 92, 51, 169, 203, 206, 18, 207, - 16, 174, 52, 53, 152, 19, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 13, 14, 167, 157, 200, - 63, 171, 167, 35, 176, 36, 173, 37, 177, 20, - 176, 120, 121, 181, 193, 201, 202, 42, 38, 43, - 22, 44, 140, 45, 46, 23, 143, 24, 47, 26, - 48, 28, 49, 8, 150, 41, 50, 87, 51, 88, - 18, 158, 159, 95, 89, 96, 52, 53, 100, 101, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 102, - 107, 124, 103, 123, 125, 126, 127, 91, 135, 18, - 138, 141, 139, 144, 145, 148, 149, 153, 155, 172, - 156, 175, 185, 179, 186, 194, 178, 195, 128, 187, - 188, 170, 165, 199, 0, 205, 208, 196, 198, 209, - 192, 0, 40 + 18, 115, 144, 8, 9, 92, 147, 8, 9, 8, + 9, 99, 122, 177, 145, 6, 101, 102, 103, 104, + 105, 106, 107, 25, 84, 84, 108, 30, 84, 31, + 7, 32, 127, 2, 90, 109, 110, 97, 3, 135, + 182, 150, 33, 174, 175, 111, 19, 196, 156, 183, + 176, 34, 157, 16, 17, 126, 123, 36, 173, 37, + 190, 38, 21, 39, 40, 85, 85, 20, 41, 85, + 42, 91, 43, 162, 98, 199, 44, 200, 45, 167, + 8, 9, 150, 193, 151, 152, 46, 47, 8, 143, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 194, + 195, 36, 160, 37, 57, 38, 161, 39, 40, 160, + 25, 160, 41, 164, 42, 166, 43, 169, 23, 169, + 44, 170, 45, 186, 133, 151, 152, 22, 136, 81, + 46, 47, 82, 18, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 13, 14, 113, 114, 83, 88, 89, + 93, 94, 95, 100, 117, 96, 116, 118, 119, 120, + 84, 128, 18, 131, 134, 132, 137, 138, 142, 141, + 148, 149, 146, 165, 168, 172, 171, 178, 179, 187, + 189, 180, 192, 191, 198, 201, 202, 181, 121, 163, + 188, 0, 158, 0, 35, 185 }; static const yytype_int16 yycheck[] = { - 12, 41, 65, 45, 123, 4, 5, 4, 127, 51, - 4, 5, 4, 5, 56, 57, 58, 59, 60, 61, - 62, 8, 50, 54, 8, 5, 0, 5, 56, 4, - 17, 5, 8, 17, 97, 6, 51, 30, 13, 14, - 55, 104, 156, 5, 15, 51, 4, 5, 23, 55, - 47, 48, 3, 5, 96, 7, 55, 9, 36, 11, - 12, 55, 49, 55, 16, 49, 18, 54, 20, 49, - 54, 33, 24, 49, 26, 138, 190, 196, 90, 198, - 49, 144, 34, 35, 124, 31, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 28, 29, 51, 4, 5, - 52, 55, 51, 3, 51, 5, 55, 7, 55, 4, - 51, 28, 29, 153, 55, 21, 22, 5, 18, 7, - 50, 9, 101, 11, 12, 32, 105, 37, 16, 5, - 18, 5, 20, 4, 5, 5, 24, 3, 26, 3, - 152, 47, 48, 54, 19, 10, 34, 35, 10, 54, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 19, - 54, 54, 25, 49, 4, 3, 49, 8, 5, 181, - 17, 27, 54, 17, 5, 53, 4, 54, 50, 5, - 49, 49, 4, 56, 4, 4, 53, 176, 92, 50, - 163, 139, 135, 50, -1, 50, 50, 56, 56, 50, - 167, -1, 32 + 12, 59, 116, 4, 5, 39, 120, 4, 5, 4, + 5, 45, 5, 149, 117, 54, 50, 51, 52, 53, + 54, 55, 56, 5, 8, 8, 4, 3, 8, 5, + 30, 7, 90, 0, 17, 13, 14, 17, 5, 97, + 6, 4, 18, 146, 50, 23, 31, 183, 51, 15, + 56, 33, 55, 49, 55, 89, 49, 5, 55, 7, + 55, 9, 3, 11, 12, 49, 49, 4, 16, 49, + 18, 54, 20, 131, 54, 189, 24, 191, 26, 137, + 4, 5, 4, 5, 47, 48, 34, 35, 4, 5, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 21, + 22, 5, 51, 7, 52, 9, 55, 11, 12, 51, + 5, 51, 16, 55, 18, 55, 20, 51, 32, 51, + 24, 55, 26, 55, 94, 47, 48, 50, 98, 3, + 34, 35, 3, 145, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 28, 29, 28, 29, 19, 54, 10, + 10, 54, 19, 54, 54, 25, 49, 4, 3, 49, + 8, 5, 174, 17, 27, 54, 17, 5, 4, 53, + 50, 49, 54, 5, 49, 56, 53, 4, 4, 4, + 56, 50, 50, 56, 50, 50, 50, 156, 85, 132, + 169, -1, 128, -1, 29, 160 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 58, 0, 5, 105, 108, 54, 30, 4, 5, - 62, 67, 68, 28, 29, 107, 49, 55, 67, 31, - 4, 3, 50, 32, 37, 106, 5, 66, 5, 101, - 102, 103, 104, 5, 36, 3, 5, 7, 18, 33, - 103, 5, 5, 7, 9, 11, 12, 16, 18, 20, - 24, 26, 34, 35, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 52, 70, 71, 73, 74, 75, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 89, 90, - 91, 92, 93, 97, 98, 99, 100, 3, 3, 19, - 68, 8, 49, 76, 77, 54, 10, 17, 54, 77, - 10, 54, 19, 25, 17, 54, 77, 54, 77, 77, - 77, 77, 77, 77, 77, 4, 13, 14, 23, 69, - 28, 29, 92, 49, 54, 4, 3, 49, 76, 5, - 49, 64, 65, 77, 92, 5, 95, 96, 17, 54, - 96, 27, 92, 96, 17, 5, 87, 88, 53, 4, - 5, 62, 68, 54, 62, 50, 49, 4, 47, 48, - 59, 60, 61, 51, 55, 93, 94, 51, 55, 92, - 88, 55, 5, 55, 92, 49, 51, 55, 53, 56, - 55, 68, 50, 56, 61, 4, 4, 50, 64, 6, - 15, 72, 95, 55, 4, 87, 56, 55, 56, 50, - 5, 21, 22, 61, 63, 50, 62, 62, 50, 50 + 0, 58, 0, 5, 104, 107, 54, 30, 4, 5, + 62, 66, 67, 28, 29, 106, 49, 55, 66, 31, + 4, 3, 50, 32, 105, 5, 100, 101, 102, 103, + 3, 5, 7, 18, 33, 102, 5, 7, 9, 11, + 12, 16, 18, 20, 24, 26, 34, 35, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 52, 69, 70, + 72, 73, 74, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 88, 89, 90, 91, 92, 96, 97, 98, + 99, 3, 3, 19, 8, 49, 75, 76, 54, 10, + 17, 54, 76, 10, 54, 19, 25, 17, 54, 76, + 54, 76, 76, 76, 76, 76, 76, 76, 4, 13, + 14, 23, 68, 28, 29, 91, 49, 54, 4, 3, + 49, 75, 5, 49, 64, 65, 76, 91, 5, 94, + 95, 17, 54, 95, 27, 91, 95, 17, 5, 86, + 87, 53, 4, 5, 62, 67, 54, 62, 50, 49, + 4, 47, 48, 59, 60, 61, 51, 55, 92, 93, + 51, 55, 91, 87, 55, 5, 55, 91, 49, 51, + 55, 53, 56, 55, 67, 50, 56, 61, 4, 4, + 50, 64, 6, 15, 71, 94, 55, 4, 86, 56, + 55, 56, 50, 5, 21, 22, 61, 63, 50, 62, + 62, 50, 50 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -809,33 +762,33 @@ static const yytype_uint8 yyr1[] = { 0, 57, 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, - 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, - 71, 72, 72, 72, 73, 73, 73, 74, 75, 75, + 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, + 71, 71, 72, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, - 86, 86, 86, 86, 86, 86, 86, 87, 88, 88, - 89, 89, 90, 91, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, - 93, 94, 94, 94, 95, 96, 96, 97, 97, 97, - 98, 98, 98, 99, 100, 100, 101, 102, 102, 102, - 103, 103, 104, 104, 105, 106, 106, 107, 107, 108 + 85, 85, 85, 85, 85, 86, 87, 87, 88, 88, + 89, 90, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 92, 92, 93, + 93, 93, 94, 95, 95, 96, 96, 96, 97, 97, + 97, 98, 99, 99, 100, 101, 101, 101, 102, 102, + 103, 103, 104, 105, 106, 106, 107 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 1, 2, 2, 1, 1, 1, - 1, 1, 1, 3, 4, 1, 3, 1, 2, 1, - 4, 1, 2, 1, 1, 1, 3, 4, 1, 2, - 2, 2, 2, 2, 1, 4, 7, 1, 1, 1, - 4, 7, 1, 3, 2, 3, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 4, 1, 3, - 2, 5, 4, 2, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 2, 2, 2, 1, 3, 4, 3, 4, - 4, 3, 4, 4, 1, 4, 3, 7, 6, 4, - 1, 1, 1, 2, 4, 0, 5, 1, 1, 9 + 1, 1, 1, 3, 4, 1, 3, 1, 4, 1, + 2, 1, 1, 1, 3, 4, 1, 2, 2, 2, + 2, 2, 1, 4, 7, 1, 1, 1, 4, 7, + 1, 3, 2, 3, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 4, 1, 3, 2, 5, + 4, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 2, 2, 2, 1, 3, 4, 3, 4, 4, 3, + 4, 4, 1, 4, 3, 7, 6, 4, 1, 1, + 1, 2, 4, 0, 1, 1, 9 }; @@ -1520,13 +1473,13 @@ yyreduce: case 4: #line 188 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { strcpy((yyval.str),(yyvsp[0].str)); } -#line 1524 "asn1-parse.c" /* yacc.c:1646 */ +#line 1477 "asn1-parse.c" /* yacc.c:1646 */ break; case 5: #line 189 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { strcpy((yyval.str),(yyvsp[0].str)); } -#line 1530 "asn1-parse.c" /* yacc.c:1646 */ +#line 1483 "asn1-parse.c" /* yacc.c:1646 */ break; case 6: @@ -1535,43 +1488,43 @@ yyreduce: strcpy((yyval.str),"-"); strcat((yyval.str),(yyvsp[0].str)); } -#line 1539 "asn1-parse.c" /* yacc.c:1646 */ +#line 1492 "asn1-parse.c" /* yacc.c:1646 */ break; case 7: #line 199 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { strcpy((yyval.str),(yyvsp[0].str)); } -#line 1545 "asn1-parse.c" /* yacc.c:1646 */ +#line 1498 "asn1-parse.c" /* yacc.c:1646 */ break; case 8: #line 200 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { strcpy((yyval.str),(yyvsp[0].str)); } -#line 1551 "asn1-parse.c" /* yacc.c:1646 */ +#line 1504 "asn1-parse.c" /* yacc.c:1646 */ break; case 9: #line 203 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {strcpy((yyval.str),(yyvsp[0].str));} -#line 1557 "asn1-parse.c" /* yacc.c:1646 */ +#line 1510 "asn1-parse.c" /* yacc.c:1646 */ break; case 10: #line 204 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {strcpy((yyval.str),(yyvsp[0].str));} -#line 1563 "asn1-parse.c" /* yacc.c:1646 */ +#line 1516 "asn1-parse.c" /* yacc.c:1646 */ break; case 11: #line 207 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {strcpy((yyval.str),(yyvsp[0].str));} -#line 1569 "asn1-parse.c" /* yacc.c:1646 */ +#line 1522 "asn1-parse.c" /* yacc.c:1646 */ break; case 12: #line 208 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {strcpy((yyval.str),(yyvsp[0].str));} -#line 1575 "asn1-parse.c" /* yacc.c:1646 */ +#line 1528 "asn1-parse.c" /* yacc.c:1646 */ break; case 13: @@ -1580,7 +1533,7 @@ yyreduce: (yyval.node) = NEW_NODE (TYPE_CONSTANT); set_str_value ((yyval.node), (yyvsp[-1].str)); } -#line 1584 "asn1-parse.c" /* yacc.c:1646 */ +#line 1537 "asn1-parse.c" /* yacc.c:1646 */ break; case 14: @@ -1590,13 +1543,13 @@ yyreduce: set_name ((yyval.node), (yyvsp[-3].str)); set_str_value ((yyval.node), (yyvsp[-1].str)); } -#line 1594 "asn1-parse.c" /* yacc.c:1646 */ +#line 1547 "asn1-parse.c" /* yacc.c:1646 */ break; case 15: #line 224 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[0].node); } -#line 1600 "asn1-parse.c" /* yacc.c:1646 */ +#line 1553 "asn1-parse.c" /* yacc.c:1646 */ break; case 16: @@ -1605,174 +1558,152 @@ yyreduce: (yyval.node) = (yyvsp[-2].node); append_right ((yyvsp[-2].node), (yyvsp[0].node)); } -#line 1609 "asn1-parse.c" /* yacc.c:1646 */ +#line 1562 "asn1-parse.c" /* yacc.c:1646 */ break; case 17: -#line 233 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - { - (yyval.node) = NEW_NODE (TYPE_IDENTIFIER); - set_name((yyval.node),(yyvsp[0].str)); - } -#line 1618 "asn1-parse.c" /* yacc.c:1646 */ - break; - - case 18: -#line 238 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - { - AsnNode node; - - (yyval.node)=(yyvsp[-1].node); - node = NEW_NODE (TYPE_IDENTIFIER); - set_name (node, (yyvsp[0].str)); - append_right ((yyval.node), node); - } -#line 1631 "asn1-parse.c" /* yacc.c:1646 */ - break; - - case 19: -#line 249 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ +#line 251 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_CONSTANT); set_str_value ((yyval.node), (yyvsp[0].str)); } -#line 1640 "asn1-parse.c" /* yacc.c:1646 */ +#line 1571 "asn1-parse.c" /* yacc.c:1646 */ break; - case 20: -#line 254 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 18: +#line 256 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_CONSTANT); set_name ((yyval.node), (yyvsp[-3].str)); set_str_value ((yyval.node), (yyvsp[-1].str)); } -#line 1650 "asn1-parse.c" /* yacc.c:1646 */ +#line 1581 "asn1-parse.c" /* yacc.c:1646 */ break; - case 21: -#line 262 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 19: +#line 264 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[0].node);} -#line 1656 "asn1-parse.c" /* yacc.c:1646 */ +#line 1587 "asn1-parse.c" /* yacc.c:1646 */ break; - case 22: -#line 264 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 20: +#line 266 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[-1].node); append_right ((yyval.node), (yyvsp[0].node)); } -#line 1665 "asn1-parse.c" /* yacc.c:1646 */ +#line 1596 "asn1-parse.c" /* yacc.c:1646 */ break; - case 23: -#line 270 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 21: +#line 272 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.constant) = CLASS_UNIVERSAL; } -#line 1671 "asn1-parse.c" /* yacc.c:1646 */ +#line 1602 "asn1-parse.c" /* yacc.c:1646 */ break; - case 24: -#line 271 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 22: +#line 273 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.constant) = CLASS_PRIVATE; } -#line 1677 "asn1-parse.c" /* yacc.c:1646 */ +#line 1608 "asn1-parse.c" /* yacc.c:1646 */ break; - case 25: -#line 272 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 23: +#line 274 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.constant) = CLASS_APPLICATION; } -#line 1683 "asn1-parse.c" /* yacc.c:1646 */ +#line 1614 "asn1-parse.c" /* yacc.c:1646 */ break; - case 26: -#line 276 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 24: +#line 278 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_TAG); (yyval.node)->flags.class = CLASS_CONTEXT; set_ulong_value ((yyval.node), (yyvsp[-1].str)); } -#line 1693 "asn1-parse.c" /* yacc.c:1646 */ +#line 1624 "asn1-parse.c" /* yacc.c:1646 */ break; - case 27: -#line 282 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 25: +#line 284 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_TAG); (yyval.node)->flags.class = (yyvsp[-2].constant); set_ulong_value ((yyval.node), (yyvsp[-1].str)); } -#line 1703 "asn1-parse.c" /* yacc.c:1646 */ +#line 1634 "asn1-parse.c" /* yacc.c:1646 */ break; - case 28: -#line 290 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 26: +#line 292 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 1709 "asn1-parse.c" /* yacc.c:1646 */ +#line 1640 "asn1-parse.c" /* yacc.c:1646 */ break; - case 29: -#line 292 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 27: +#line 294 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-1].node); (yyval.node)->flags.explicit = 1; } -#line 1718 "asn1-parse.c" /* yacc.c:1646 */ +#line 1649 "asn1-parse.c" /* yacc.c:1646 */ break; - case 30: -#line 297 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 28: +#line 299 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-1].node); (yyval.node)->flags.implicit = 1; } -#line 1727 "asn1-parse.c" /* yacc.c:1646 */ +#line 1658 "asn1-parse.c" /* yacc.c:1646 */ break; - case 31: -#line 304 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 29: +#line 306 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_DEFAULT); set_str_value ((yyval.node), (yyvsp[0].str)); } -#line 1736 "asn1-parse.c" /* yacc.c:1646 */ +#line 1667 "asn1-parse.c" /* yacc.c:1646 */ break; - case 32: -#line 309 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 30: +#line 311 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_DEFAULT); (yyval.node)->flags.is_true = 1; } -#line 1745 "asn1-parse.c" /* yacc.c:1646 */ +#line 1676 "asn1-parse.c" /* yacc.c:1646 */ break; - case 33: -#line 314 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 31: +#line 316 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_DEFAULT); (yyval.node)->flags.is_false = 1; } -#line 1754 "asn1-parse.c" /* yacc.c:1646 */ +#line 1685 "asn1-parse.c" /* yacc.c:1646 */ break; - case 34: -#line 321 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 32: +#line 323 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_INTEGER); } -#line 1762 "asn1-parse.c" /* yacc.c:1646 */ +#line 1693 "asn1-parse.c" /* yacc.c:1646 */ break; - case 35: -#line 325 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 33: +#line 327 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_INTEGER); (yyval.node)->flags.has_list = 1; set_down ((yyval.node), (yyvsp[-1].node)); } -#line 1772 "asn1-parse.c" /* yacc.c:1646 */ +#line 1703 "asn1-parse.c" /* yacc.c:1646 */ break; - case 36: -#line 331 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 34: +#line 333 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_INTEGER); (yyval.node)->flags.has_min_max = 1; @@ -1781,367 +1712,367 @@ yyreduce: set_str_value ((yyval.node)->down, (yyvsp[-1].str)); set_name ((yyval.node)->down, (yyvsp[-4].str)); } -#line 1785 "asn1-parse.c" /* yacc.c:1646 */ +#line 1716 "asn1-parse.c" /* yacc.c:1646 */ break; - case 37: -#line 342 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 35: +#line 344 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_BOOLEAN); } -#line 1793 "asn1-parse.c" /* yacc.c:1646 */ +#line 1724 "asn1-parse.c" /* yacc.c:1646 */ break; - case 38: -#line 348 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 36: +#line 350 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_UTC_TIME); } -#line 1801 "asn1-parse.c" /* yacc.c:1646 */ +#line 1732 "asn1-parse.c" /* yacc.c:1646 */ break; - case 39: -#line 352 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 37: +#line 354 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_GENERALIZED_TIME); } -#line 1809 "asn1-parse.c" /* yacc.c:1646 */ +#line 1740 "asn1-parse.c" /* yacc.c:1646 */ break; - case 40: -#line 358 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 38: +#line 360 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SIZE); (yyval.node)->flags.one_param = 1; set_str_value ((yyval.node), (yyvsp[-1].str)); } -#line 1819 "asn1-parse.c" /* yacc.c:1646 */ +#line 1750 "asn1-parse.c" /* yacc.c:1646 */ break; - case 41: -#line 364 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 39: +#line 366 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SIZE); (yyval.node)->flags.has_min_max = 1; set_str_value ((yyval.node), (yyvsp[-4].str)); set_name ((yyval.node), (yyvsp[-1].str)); } -#line 1830 "asn1-parse.c" /* yacc.c:1646 */ +#line 1761 "asn1-parse.c" /* yacc.c:1646 */ break; - case 42: -#line 373 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 40: +#line 375 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[0].node); } -#line 1838 "asn1-parse.c" /* yacc.c:1646 */ +#line 1769 "asn1-parse.c" /* yacc.c:1646 */ break; - case 43: -#line 377 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 41: +#line 379 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[-1].node); } -#line 1846 "asn1-parse.c" /* yacc.c:1646 */ +#line 1777 "asn1-parse.c" /* yacc.c:1646 */ break; - case 44: -#line 383 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 42: +#line 385 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OCTET_STRING); } -#line 1854 "asn1-parse.c" /* yacc.c:1646 */ +#line 1785 "asn1-parse.c" /* yacc.c:1646 */ break; - case 45: -#line 387 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 43: +#line 389 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OCTET_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1864 "asn1-parse.c" /* yacc.c:1646 */ +#line 1795 "asn1-parse.c" /* yacc.c:1646 */ break; - case 46: -#line 394 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 44: +#line 396 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_UTF8_STRING); } -#line 1870 "asn1-parse.c" /* yacc.c:1646 */ +#line 1801 "asn1-parse.c" /* yacc.c:1646 */ break; - case 47: -#line 396 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 45: +#line 398 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_UTF8_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1880 "asn1-parse.c" /* yacc.c:1646 */ +#line 1811 "asn1-parse.c" /* yacc.c:1646 */ break; - case 48: -#line 402 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 46: +#line 404 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_NUMERIC_STRING); } -#line 1886 "asn1-parse.c" /* yacc.c:1646 */ +#line 1817 "asn1-parse.c" /* yacc.c:1646 */ break; - case 49: -#line 404 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 47: +#line 406 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_NUMERIC_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1896 "asn1-parse.c" /* yacc.c:1646 */ +#line 1827 "asn1-parse.c" /* yacc.c:1646 */ break; - case 50: -#line 411 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 48: +#line 413 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_PRINTABLE_STRING); } -#line 1902 "asn1-parse.c" /* yacc.c:1646 */ +#line 1833 "asn1-parse.c" /* yacc.c:1646 */ break; - case 51: -#line 413 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 49: +#line 415 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_PRINTABLE_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1912 "asn1-parse.c" /* yacc.c:1646 */ +#line 1843 "asn1-parse.c" /* yacc.c:1646 */ break; - case 52: -#line 420 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 50: +#line 422 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_TELETEX_STRING); } -#line 1918 "asn1-parse.c" /* yacc.c:1646 */ +#line 1849 "asn1-parse.c" /* yacc.c:1646 */ break; - case 53: -#line 422 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 51: +#line 424 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_TELETEX_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1928 "asn1-parse.c" /* yacc.c:1646 */ +#line 1859 "asn1-parse.c" /* yacc.c:1646 */ break; - case 54: -#line 428 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 52: +#line 430 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_IA5_STRING); } -#line 1934 "asn1-parse.c" /* yacc.c:1646 */ +#line 1865 "asn1-parse.c" /* yacc.c:1646 */ break; - case 55: -#line 430 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 53: +#line 432 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_IA5_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1944 "asn1-parse.c" /* yacc.c:1646 */ +#line 1875 "asn1-parse.c" /* yacc.c:1646 */ break; - case 56: -#line 437 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 54: +#line 439 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_UNIVERSAL_STRING); } -#line 1950 "asn1-parse.c" /* yacc.c:1646 */ +#line 1881 "asn1-parse.c" /* yacc.c:1646 */ break; - case 57: -#line 439 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 55: +#line 441 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_UNIVERSAL_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1960 "asn1-parse.c" /* yacc.c:1646 */ +#line 1891 "asn1-parse.c" /* yacc.c:1646 */ break; - case 58: -#line 445 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 56: +#line 447 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_BMP_STRING); } -#line 1966 "asn1-parse.c" /* yacc.c:1646 */ +#line 1897 "asn1-parse.c" /* yacc.c:1646 */ break; - case 59: -#line 447 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 57: +#line 449 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_BMP_STRING); (yyval.node)->flags.has_size = 1; set_down ((yyval.node),(yyvsp[0].node)); } -#line 1976 "asn1-parse.c" /* yacc.c:1646 */ +#line 1907 "asn1-parse.c" /* yacc.c:1646 */ break; - case 67: -#line 468 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 65: +#line 470 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_CONSTANT); set_name ((yyval.node), (yyvsp[-3].str)); set_str_value ((yyval.node), (yyvsp[-1].str)); } -#line 1986 "asn1-parse.c" /* yacc.c:1646 */ +#line 1917 "asn1-parse.c" /* yacc.c:1646 */ break; - case 68: -#line 476 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 66: +#line 478 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[0].node); } -#line 1994 "asn1-parse.c" /* yacc.c:1646 */ +#line 1925 "asn1-parse.c" /* yacc.c:1646 */ break; - case 69: -#line 480 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 67: +#line 482 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[-2].node); append_right ((yyval.node), (yyvsp[0].node)); } -#line 2003 "asn1-parse.c" /* yacc.c:1646 */ +#line 1934 "asn1-parse.c" /* yacc.c:1646 */ break; - case 70: -#line 487 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 68: +#line 489 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_BIT_STRING); } -#line 2011 "asn1-parse.c" /* yacc.c:1646 */ +#line 1942 "asn1-parse.c" /* yacc.c:1646 */ break; - case 71: -#line 491 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 69: +#line 493 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_BIT_STRING); (yyval.node)->flags.has_list = 1; set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2021 "asn1-parse.c" /* yacc.c:1646 */ +#line 1952 "asn1-parse.c" /* yacc.c:1646 */ break; - case 72: -#line 499 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 70: +#line 501 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_ENUMERATED); (yyval.node)->flags.has_list = 1; set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2031 "asn1-parse.c" /* yacc.c:1646 */ +#line 1962 "asn1-parse.c" /* yacc.c:1646 */ break; - case 73: -#line 507 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 71: +#line 509 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OBJECT_ID); } -#line 2039 "asn1-parse.c" /* yacc.c:1646 */ +#line 1970 "asn1-parse.c" /* yacc.c:1646 */ break; - case 74: -#line 513 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 72: +#line 515 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_IDENTIFIER); set_str_value ((yyval.node), (yyvsp[0].str)); } -#line 2048 "asn1-parse.c" /* yacc.c:1646 */ +#line 1979 "asn1-parse.c" /* yacc.c:1646 */ break; - case 75: -#line 518 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 73: +#line 520 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_IDENTIFIER); (yyval.node)->flags.has_size = 1; set_str_value ((yyval.node), (yyvsp[-1].str)); set_down ((yyval.node), (yyvsp[0].node)); } -#line 2059 "asn1-parse.c" /* yacc.c:1646 */ +#line 1990 "asn1-parse.c" /* yacc.c:1646 */ break; - case 76: -#line 524 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - {(yyval.node)=(yyvsp[0].node);} -#line 2065 "asn1-parse.c" /* yacc.c:1646 */ - break; - - case 77: -#line 525 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - {(yyval.node)=(yyvsp[0].node);} -#line 2071 "asn1-parse.c" /* yacc.c:1646 */ - break; - - case 78: + case 74: #line 526 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2077 "asn1-parse.c" /* yacc.c:1646 */ +#line 1996 "asn1-parse.c" /* yacc.c:1646 */ break; - case 79: + case 75: #line 527 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2083 "asn1-parse.c" /* yacc.c:1646 */ +#line 2002 "asn1-parse.c" /* yacc.c:1646 */ break; - case 81: -#line 529 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 76: +#line 528 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2089 "asn1-parse.c" /* yacc.c:1646 */ +#line 2008 "asn1-parse.c" /* yacc.c:1646 */ break; - case 82: -#line 530 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 77: +#line 529 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2095 "asn1-parse.c" /* yacc.c:1646 */ +#line 2014 "asn1-parse.c" /* yacc.c:1646 */ break; - case 83: + case 79: #line 531 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2101 "asn1-parse.c" /* yacc.c:1646 */ +#line 2020 "asn1-parse.c" /* yacc.c:1646 */ break; - case 84: + case 80: #line 532 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2107 "asn1-parse.c" /* yacc.c:1646 */ +#line 2026 "asn1-parse.c" /* yacc.c:1646 */ break; - case 85: + case 81: #line 533 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2113 "asn1-parse.c" /* yacc.c:1646 */ +#line 2032 "asn1-parse.c" /* yacc.c:1646 */ break; - case 86: + case 82: #line 534 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2119 "asn1-parse.c" /* yacc.c:1646 */ +#line 2038 "asn1-parse.c" /* yacc.c:1646 */ break; - case 87: + case 83: #line 535 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ {(yyval.node)=(yyvsp[0].node);} -#line 2125 "asn1-parse.c" /* yacc.c:1646 */ +#line 2044 "asn1-parse.c" /* yacc.c:1646 */ break; - case 88: + case 84: +#line 536 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + {(yyval.node)=(yyvsp[0].node);} +#line 2050 "asn1-parse.c" /* yacc.c:1646 */ + break; + + case 85: #line 537 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + {(yyval.node)=(yyvsp[0].node);} +#line 2056 "asn1-parse.c" /* yacc.c:1646 */ + break; + + case 86: +#line 539 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE(TYPE_NULL); } -#line 2133 "asn1-parse.c" /* yacc.c:1646 */ +#line 2064 "asn1-parse.c" /* yacc.c:1646 */ break; - case 89: -#line 543 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 87: +#line 545 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 2141 "asn1-parse.c" /* yacc.c:1646 */ +#line 2072 "asn1-parse.c" /* yacc.c:1646 */ break; - case 90: -#line 547 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 88: +#line 549 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { /* $2->flags.has_tag = 1; */ /* $$ = $2; */ @@ -2150,138 +2081,138 @@ yyreduce: (yyval.node) = (yyvsp[-1].node); set_down ((yyval.node), (yyvsp[0].node)); } -#line 2154 "asn1-parse.c" /* yacc.c:1646 */ +#line 2085 "asn1-parse.c" /* yacc.c:1646 */ break; - case 91: -#line 558 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 89: +#line 560 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 2162 "asn1-parse.c" /* yacc.c:1646 */ +#line 2093 "asn1-parse.c" /* yacc.c:1646 */ break; - case 92: -#line 562 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 90: +#line 564 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyvsp[-1].node)->flags.has_default = 1; (yyval.node) = (yyvsp[-1].node); set_right ((yyvsp[0].node), (yyval.node)->down); set_down ((yyval.node), (yyvsp[0].node)); } -#line 2173 "asn1-parse.c" /* yacc.c:1646 */ +#line 2104 "asn1-parse.c" /* yacc.c:1646 */ break; - case 93: -#line 569 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 91: +#line 571 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyvsp[-1].node)->flags.is_optional = 1; (yyval.node) = (yyvsp[-1].node); } -#line 2182 "asn1-parse.c" /* yacc.c:1646 */ +#line 2113 "asn1-parse.c" /* yacc.c:1646 */ break; - case 94: -#line 576 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 92: +#line 578 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { set_name ((yyvsp[0].node), (yyvsp[-1].str)); (yyval.node) = (yyvsp[0].node); } -#line 2191 "asn1-parse.c" /* yacc.c:1646 */ +#line 2122 "asn1-parse.c" /* yacc.c:1646 */ break; - case 95: -#line 583 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 93: +#line 585 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[0].node); } -#line 2197 "asn1-parse.c" /* yacc.c:1646 */ +#line 2128 "asn1-parse.c" /* yacc.c:1646 */ break; - case 96: -#line 585 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 94: +#line 587 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node)=(yyvsp[-2].node); append_right ((yyval.node), (yyvsp[0].node)); } -#line 2206 "asn1-parse.c" /* yacc.c:1646 */ +#line 2137 "asn1-parse.c" /* yacc.c:1646 */ break; - case 97: -#line 592 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 95: +#line 594 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SEQUENCE); set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2215 "asn1-parse.c" /* yacc.c:1646 */ +#line 2146 "asn1-parse.c" /* yacc.c:1646 */ break; - case 98: -#line 597 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 96: +#line 599 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SEQUENCE_OF); set_down ((yyval.node), (yyvsp[0].node)); } -#line 2224 "asn1-parse.c" /* yacc.c:1646 */ +#line 2155 "asn1-parse.c" /* yacc.c:1646 */ break; - case 99: -#line 602 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 97: +#line 604 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SEQUENCE_OF); (yyval.node)->flags.has_size = 1; set_right ((yyvsp[-2].node),(yyvsp[0].node)); set_down ((yyval.node),(yyvsp[-2].node)); } -#line 2235 "asn1-parse.c" /* yacc.c:1646 */ +#line 2166 "asn1-parse.c" /* yacc.c:1646 */ break; - case 100: -#line 611 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 98: +#line 613 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SET); set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2244 "asn1-parse.c" /* yacc.c:1646 */ +#line 2175 "asn1-parse.c" /* yacc.c:1646 */ break; - case 101: -#line 616 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 99: +#line 618 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SET_OF); set_down ((yyval.node), (yyvsp[0].node)); } -#line 2253 "asn1-parse.c" /* yacc.c:1646 */ +#line 2184 "asn1-parse.c" /* yacc.c:1646 */ break; - case 102: -#line 621 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 100: +#line 623 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_SET_OF); (yyval.node)->flags.has_size = 1; set_right ((yyvsp[-2].node), (yyvsp[0].node)); set_down ((yyval.node), (yyvsp[-2].node)); } -#line 2264 "asn1-parse.c" /* yacc.c:1646 */ +#line 2195 "asn1-parse.c" /* yacc.c:1646 */ break; - case 103: -#line 630 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 101: +#line 632 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_CHOICE); set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2273 "asn1-parse.c" /* yacc.c:1646 */ +#line 2204 "asn1-parse.c" /* yacc.c:1646 */ break; - case 104: -#line 637 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 102: +#line 639 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_ANY); } -#line 2281 "asn1-parse.c" /* yacc.c:1646 */ +#line 2212 "asn1-parse.c" /* yacc.c:1646 */ break; - case 105: -#line 641 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 103: +#line 643 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { AsnNode node; @@ -2291,31 +2222,31 @@ yyreduce: set_name (node, (yyvsp[0].str)); set_down((yyval.node), node); } -#line 2295 "asn1-parse.c" /* yacc.c:1646 */ +#line 2226 "asn1-parse.c" /* yacc.c:1646 */ break; - case 106: -#line 653 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 104: +#line 655 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { set_name ((yyvsp[0].node), (yyvsp[-2].str)); (yyval.node) = (yyvsp[0].node); } -#line 2304 "asn1-parse.c" /* yacc.c:1646 */ +#line 2235 "asn1-parse.c" /* yacc.c:1646 */ break; - case 107: -#line 660 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 105: +#line 662 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OBJECT_ID); (yyval.node)->flags.assignment = 1; set_name ((yyval.node), (yyvsp[-6].str)); set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2315 "asn1-parse.c" /* yacc.c:1646 */ +#line 2246 "asn1-parse.c" /* yacc.c:1646 */ break; - case 108: -#line 667 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 106: +#line 669 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OBJECT_ID); (yyval.node)->flags.assignment = 1; @@ -2324,92 +2255,77 @@ yyreduce: set_str_value ((yyval.node), (yyvsp[-4].str)); set_down ((yyval.node), (yyvsp[-1].node)); } -#line 2328 "asn1-parse.c" /* yacc.c:1646 */ +#line 2259 "asn1-parse.c" /* yacc.c:1646 */ break; - case 109: -#line 676 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 107: +#line 678 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_INTEGER); (yyval.node)->flags.assignment = 1; set_name ((yyval.node), (yyvsp[-3].str)); set_str_value ((yyval.node), (yyvsp[0].str)); } -#line 2339 "asn1-parse.c" /* yacc.c:1646 */ +#line 2270 "asn1-parse.c" /* yacc.c:1646 */ break; - case 110: -#line 684 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 108: +#line 686 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 2345 "asn1-parse.c" /* yacc.c:1646 */ +#line 2276 "asn1-parse.c" /* yacc.c:1646 */ break; - case 111: -#line 685 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 109: +#line 687 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 2351 "asn1-parse.c" /* yacc.c:1646 */ +#line 2282 "asn1-parse.c" /* yacc.c:1646 */ break; - case 112: -#line 689 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 110: +#line 691 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } -#line 2357 "asn1-parse.c" /* yacc.c:1646 */ +#line 2288 "asn1-parse.c" /* yacc.c:1646 */ break; - case 113: -#line 691 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 111: +#line 693 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-1].node); append_right ((yyval.node), (yyvsp[0].node)); } -#line 2366 "asn1-parse.c" /* yacc.c:1646 */ +#line 2297 "asn1-parse.c" /* yacc.c:1646 */ break; - case 114: -#line 698 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 112: +#line 700 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.node) = NEW_NODE (TYPE_OBJECT_ID); set_down ((yyval.node), (yyvsp[-1].node)); set_name ((yyval.node), (yyvsp[-3].str)); } -#line 2376 "asn1-parse.c" /* yacc.c:1646 */ - break; - - case 115: -#line 706 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - { (yyval.node)=NULL;} -#line 2382 "asn1-parse.c" /* yacc.c:1646 */ +#line 2307 "asn1-parse.c" /* yacc.c:1646 */ break; - case 116: + case 113: #line 708 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ - { - AsnNode node; - - (yyval.node) = NEW_NODE (TYPE_IMPORTS); - node = NEW_NODE (TYPE_OBJECT_ID); - set_name (node, (yyvsp[-1].str)); - set_down (node, (yyvsp[0].node)); - set_down ((yyval.node), node); - set_right ((yyval.node), (yyvsp[-3].node)); - } -#line 2397 "asn1-parse.c" /* yacc.c:1646 */ + { (yyval.node)=NULL;} +#line 2313 "asn1-parse.c" /* yacc.c:1646 */ break; - case 117: -#line 720 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 114: +#line 724 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.constant) = CONST_EXPLICIT; } -#line 2403 "asn1-parse.c" /* yacc.c:1646 */ +#line 2319 "asn1-parse.c" /* yacc.c:1646 */ break; - case 118: -#line 721 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 115: +#line 725 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { (yyval.constant) = CONST_IMPLICIT; } -#line 2409 "asn1-parse.c" /* yacc.c:1646 */ +#line 2325 "asn1-parse.c" /* yacc.c:1646 */ break; - case 119: -#line 727 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ + case 116: +#line 731 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1646 */ { AsnNode node; @@ -2441,11 +2357,11 @@ yyreduce: PARSECTL->result_parse = _ksba_asn_check_identifier((yyval.node)); PARSECTL->parse_tree=(yyval.node); } -#line 2445 "asn1-parse.c" /* yacc.c:1646 */ +#line 2361 "asn1-parse.c" /* yacc.c:1646 */ break; -#line 2449 "asn1-parse.c" /* yacc.c:1646 */ +#line 2365 "asn1-parse.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2673,7 +2589,7 @@ yyreturn: #endif return yyresult; } -#line 760 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1906 */ +#line 764 "/home/wk/s/libksba/src/asn1-parse.y" /* yacc.c:1906 */ diff --git a/src/asn1-parse.y b/src/asn1-parse.y index 3336c43..5bff15c 100755 --- a/src/asn1-parse.y +++ b/src/asn1-parse.y @@ -92,7 +92,7 @@ struct parser_control_s { %param {void *parm} %define api.pure full %define parse.error verbose -%expect 1 + //%expect 1 %union { unsigned int constant; @@ -170,7 +170,7 @@ static void yyerror (void *parm, const char *s); %type <node> boolean_def any_def size_def2 obj_constant obj_constant_list %type <node> constant_def type_constant type_constant_list definitions %type <node> definitions_id Time bit_element bit_element_list set_def -%type <node> identifier_list imports_def tag_type tag type_assig_right_tag +%type <node> /* identifier_list */ imports_def tag_type tag type_assig_right_tag %type <node> type_assig_right_tag_default enumerated_def string_def %type <node> utf8_string_def numeric_string_def printable_string_def %type <node> teletex_string_def ia5_string_def universal_string_def @@ -229,6 +229,7 @@ constant_list: constant { $$=$1; } } ; +/* identifier_list : IDENTIFIER { $$ = NEW_NODE (TYPE_IDENTIFIER); @@ -244,6 +245,7 @@ identifier_list : IDENTIFIER append_right ($$, node); } ; +*/ obj_constant: num_identifier { @@ -704,7 +706,8 @@ definitions_id : IDENTIFIER '{' obj_constant_list '}' imports_def : /* empty */ { $$=NULL;} - | IMPORTS identifier_list FROM IDENTIFIER obj_constant_list +/* + | IMPORTS identifier_list FROM IDENTIFIER { AsnNode node; @@ -715,6 +718,7 @@ imports_def : /* empty */ set_down ($$, node); set_right ($$, $2); } +*/ ; explicit_implicit : EXPLICIT { $$ = CONST_EXPLICIT; } diff --git a/src/asn1-tables.c b/src/asn1-tables.c index f589f25..17b9fc9 100644 --- a/src/asn1-tables.c +++ b/src/asn1-tables.c @@ -6,1299 +6,1335 @@ #include "asn1-func.h" static const static_asn tmttv2_asn1_tab[] = { - {5339,136, {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {246,136, {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, {0,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {1182,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {5536,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5488}, - {5104,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5113,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {4750,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {4904,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5540,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5584}, - {5430,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3412,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5587,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5590}, - {2397,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3668,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3683}, - {2509,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {2499,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {99,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4914,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4761,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, - {4914,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {3683,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},5482}, - {0,131, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5593}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2461}, - {4250,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1206}, - {2499,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {5346,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},792}, - {5122,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5131}, - {5211,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},792}, - {1917,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1938}, - {3698,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2970}, - {3428,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2970}, - {4772,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5597}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2574}, - {2461,2, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5593,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {5343,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5596,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5092}, - {1206,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {792,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4510,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},4522}, - {4522,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},771}, - {771,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1631}, - {370,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1177,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3998}, - {5353,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3713}, - {277,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {1631,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1177,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3998}, - {947,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3713}, - {3998,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3713,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, - {3444,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3460,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {5219,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4012,20, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {5219,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4783,12, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {5219,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4924,30, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {5219,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {3476,28, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, - {5219,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {5131,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4934,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3993}, - {5140,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3993}, - {3993,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5227,23, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},0}, - {4534,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},0}, - {1938,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4914,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {2987,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2574,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4944}, - {4944,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5360,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {5149,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {4641,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {73,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},11}, + {537,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {555,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {902,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {793,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {77,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},21}, + {172,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2300,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {36,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},27}, + {990,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2157,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1992}, + {3311,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {783,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {3349,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {633,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {935,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, + {633,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {1992,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},1}, + {0,131, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},48}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},330}, + {1563,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4449}, + {783,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {267,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},109}, + {564,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},483}, + {434,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},109}, + {3960,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3792}, + {2067,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2598}, + {2380,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2598}, + {880,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},825}, + {330,2, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {48,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {250,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {51,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},251}, + {4449,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {109,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1218,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},1050}, + {1050,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4990}, + {4990,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4002}, + {573,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {144,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1576}, + {323,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1842}, + {803,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {4002,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {144,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1576}, + {220,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1842}, + {1576,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1842,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, + {2188,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2364,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {378,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {1800,20, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {378,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {979,12, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {378,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {653,30, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {378,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {2396,28, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, + {378,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {483,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {723,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},114}, + {546,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},114}, + {114,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {458,23, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},0}, + {1146,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},0}, + {3792,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {633,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {2836,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {825,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},593}, + {593,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {260,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {501,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},0}, {0,131, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},0}, - {4954,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2970,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {1470,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4026,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1479}, - {2169,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4263}, - {797,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1206}, - {1479,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {5158,3, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3004,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {3728,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {3492,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {3021,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {4276,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5612}, - {4546,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {5235,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5488}, - {4289,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {4302,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5626}, - {2189,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2718}, - {2718,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3038,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4315}, - {3055,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2209}, - {4315,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {2209,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2736,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2754}, - {2075,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, - {2736,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2754,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {1959,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, + {683,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {2598,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {4288,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1730,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3778}, + {3529,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1368}, + {5016,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4449}, + {3778,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {474,3, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {2082,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {2316,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {2615,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {1511,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},7}, + {1182,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {338,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},11}, + {1485,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {1433,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},13}, + {3389,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2942}, + {2942,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2802,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1316}, + {2819,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3469}, + {1316,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {3469,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {3104,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2960}, + {773,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, + {3104,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {2960,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {3750,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, {0,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0},0}, - {2528,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4315}, - {2229,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4315}, - {3743,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4263}, - {4263,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4558}, - {4558,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4964,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4974}, - {4794,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},3308}, + {3292,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1316}, + {3689,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1316}, + {1977,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1368}, + {1368,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1038}, + {1038,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {733,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},613}, + {946,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},3}, {0,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},0}, - {5243,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5092}, + {354,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},251}, {0,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},0}, - {4570,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5597}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4984}, - {4040,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5612}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},792}, - {4328,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5578}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4341}, - {823,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5488}, + {1278,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},603}, + {1688,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},7}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},109}, + {1472,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},9}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1342}, + {5146,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},11}, {0,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},0}, - {4994,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5476}, + {703,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},22}, {0,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},0}, - {4354,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5626}, + {1550,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},13}, {0,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},0}, - {4974,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5251,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {947,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},5482}, + {613,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {450,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {220,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},1}, {0,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, - {5251,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {4341,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4367,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3444}, - {5004,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3444}, - {609,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {4054,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {450,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {1342,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1537,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2188}, + {743,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2188}, + {5253,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {1590,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, {0,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0},0}, - {5367,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {947,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, - {5367,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {3072,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5599,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},0}, + {309,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {220,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, + {309,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {2428,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {33,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},0}, {0,131, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},0}, - {2772,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0},0}, - {5482,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5544}, - {3508,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2790,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3524}, - {3089,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3524}, - {3524,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3758}, - {3758,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5502,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4558}, - {5259,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},5482}, - {0,131, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4380}, - {5267,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4380}, - {4380,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5482,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5544}, - {1230,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, + {3068,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0},0}, + {1,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},61}, + {2220,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {3086,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2204}, + {2717,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2204}, + {2204,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1887}, + {1887,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {119,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1038}, + {394,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},1}, + {0,131, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1290}, + {386,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1290}, + {1290,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},61}, + {4545,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, {0,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0},0}, - {1653,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},5014}, - {1980,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},5014}, - {5014,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5482,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5544}, - {2249,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},391}, - {391,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2808,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1675}, - {5275,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4582}, - {5024,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4263}, - {1675,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5167,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4263}, - {1254,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},771}, - {4582,3, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5374,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {4068,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4393,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {2547,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {4805,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5612}, - {2001,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {3540,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5488}, - {525,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {380,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {1278,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3773,12, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3556,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4594,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4606}, - {2509,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {3788,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {4606,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},2461}, - {2499,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {5346,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},792}, - {4816,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3993}, - {4827,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},3993}, - {2269,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},0}, + {4222,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},623}, + {3897,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},623}, + {623,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},61}, + {3369,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2906}, + {2906,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2996,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4024}, + {426,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1062}, + {663,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1368}, + {4024,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {519,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1368}, + {4665,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4990}, + {1062,3, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {316,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {1716,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1394,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {3235,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {957,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},7}, + {3813,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {2252,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},11}, + {5334,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {5447,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {4569,22, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2007,12, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2172,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1254,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1098}, + {3311,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {2142,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {1098,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},330}, + {783,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {267,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},109}, + {968,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},114}, + {913,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},114}, + {3669,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},0}, {0,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0},0}, - {3572,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1206}, - {3803,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3993}, - {2566,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2574}, - {4082,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2574}, - {5034,10, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4618,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {4068,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4393,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {2547,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {4805,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5612}, - {2001,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {3540,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5488}, - {4096,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5626}, - {3818,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {2826,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4263}, - {5044,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3308,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5544}, - {1057,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2808,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1675}, - {1697,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},3308}, + {2412,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4449}, + {2127,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},114}, + {3254,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},825}, + {1674,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},825}, + {583,10, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1266,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {1716,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1394,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {3235,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {957,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},7}, + {3813,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {2252,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},11}, + {1772,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},13}, + {1902,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2888,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1368}, + {673,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {3,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},61}, + {4861,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {2996,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4024}, + {4200,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},3}, {0,131, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1},0}, {0,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2289,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},5092}, + {3609,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},251}, {0,131, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1},0}, {0,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {3588,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5597}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4582}, - {4630,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0},5612}, + {2348,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1062}, + {1170,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0},7}, {0,131, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1},0}, {0,1, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {1082,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1107,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2461}, - {5211,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},792}, - {1917,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1938}, - {143,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},277}, - {4984,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {409,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},849}, - {119,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},257}, - {1377,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2309}, - {849,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4406,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},4642}, - {636,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},1132}, - {3604,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3833}, - {2329,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2585}, - {2349,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2844}, - {2862,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5597}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3106}, - {1302,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5612}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1719}, - {4110,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5578}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4419}, - {875,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5488}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1326}, - {4642,130, {1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},3308}, + {4786,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4811,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},330}, + {434,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},109}, + {3960,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3792}, + {869,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},803}, + {603,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5476,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4886}, + {5754,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},5593}, + {3855,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},3429}, + {4886,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1420,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},1026}, + {5280,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},4761}, + {2332,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1917}, + {3709,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3178}, + {3629,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2978}, + {3050,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2513}, + {4689,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},7}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4112}, + {1758,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},9}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1381}, + {5068,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},11}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4521}, + {1026,130, {1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},3}, {0,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {4124,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {0,132, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},288}, - {2022,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, - {0,132, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},438}, - {1132,130, {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},5092}, + {1828,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {0,132, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5624}, + {3918,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, + {0,132, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5505}, + {4761,130, {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},251}, {0,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {5283,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {1741,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},5482}, - {5054,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, - {1741,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},5482}, - {3833,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4654}, - {4654,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1493,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {2585,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1763,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {2844,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5283,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, - {1741,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {5054,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, - {1741,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {3106,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {553,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {1719,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {901,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4419,17, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5291,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},5482}, + {410,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {4244,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},1}, + {753,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, + {4244,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},1}, + {1917,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1110}, + {1110,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4426,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {3178,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4266,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {2978,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {410,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},0}, + {4244,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {753,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},0}, + {4244,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {2513,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5390,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {4112,18, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5094,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {1381,17, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {442,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},1}, {0,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0},0}, - {2880,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4838,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, + {3122,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {891,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, {0,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0},0}, - {2043,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {5176,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5092}, + {3981,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {528,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},251}, {0,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0},0}, - {2604,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {2064,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5597}, + {3330,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {3876,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5}, {0,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0},0}, - {319,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {1326,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1350,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1516}, - {1516,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {154,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {257,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {467,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},350}, - {350,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1177,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {42,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {947,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {1,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {2309,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1374,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2623}, - {2623,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {1157,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},5482}, + {5655,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {4521,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4737,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4311}, + {4311,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5789,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {5593,133, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5534,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},5563}, + {5563,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {144,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {5861,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {220,19, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {5901,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {3429,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4713,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3159}, + {3159,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {4836,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},1}, {0,2, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {5482,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1374}, - {927,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},3308}, + {1,132, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4713}, + {5042,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},3}, {0,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, - {1157,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {4836,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, {0,0} }; static const static_asn cms_asn1_tab[] = { - {663,136, {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {5199,136, {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, {0,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5299,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {5552,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {1410,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3971,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4446}, - {5307,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},5482}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {402,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {69,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {1002,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1134,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1014}, + {346,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},1}, {0,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0},0}, - {3971,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {4446,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4849,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {3123,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},690}, - {3140,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1398}, - {4432,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3848}, - {5512,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},717}, - {4678,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4690}, - {690,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},953}, - {4690,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4871}, - {1398,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4445,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4446}, - {5185,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5482}, + {1134,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {1014,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {836,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {2649,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5226}, + {2683,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4473}, + {1407,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1872}, + {124,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},5172}, + {1242,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1074}, + {5226,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4912}, + {1074,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},847}, + {4473,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1459,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1014}, + {510,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},1}, {0,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {4871,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {5556,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3157}, - {3620,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},953}, - {4140,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3174}, - {2509,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},496}, - {2499,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3863}, - {4138,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2642}, - {3157,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1785,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},1807}, - {2085,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2106}, - {3174,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {2642,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {370,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5194,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4882,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3713}, - {3713,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, - {3863,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4152,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {3878,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3893}, - {3908,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3923}, - {2127,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2148}, - {3191,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1829}, - {3893,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5442,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3848}, - {5512,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},717}, - {3923,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1859}, - {2148,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {3971,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4446}, - {744,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},82}, - {3208,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3225}, - {3225,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {1829,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {1859,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5517,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},1851}, - {5522,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1873}, - {5448,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3242}, - {1904,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {1851,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {5560,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},589}, - {1539,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},224}, - {4458,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1904}, - {589,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1785,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},1807}, - {2085,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2106}, - {1873,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {4893,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},979}, - {5564,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2661}, - {1539,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},224}, - {1562,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1585}, - {979,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1785,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},1807}, - {2085,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2106}, - {4166,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2369}, - {2369,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4914,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {5064,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {1585,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1895}, - {1895,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5560,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},581}, - {4458,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1904}, - {581,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1785,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},1807}, - {5402,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1608}, - {1608,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2085,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2106}, - {4822,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},0}, - {5454,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2898}, - {2106,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3242,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {5460,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4180}, - {1539,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},224}, - {4458,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1904}, - {4180,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4026,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4822,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},0}, - {5454,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2898}, - {4471,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {3620,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},953}, - {3140,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1398}, - {5409,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3405}, - {3405,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4194,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {2127,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2148}, - {3191,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1829}, - {2916,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {3878,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3893}, - {3908,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3923}, - {4484,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},189}, - {3620,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},953}, - {3140,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1398}, - {1033,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},5092}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3938}, - {5568,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1005}, - {1031,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5597}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3259}, - {3938,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {3259,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5544,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3308}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},370}, - {1005,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {953,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {496,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {224,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {82,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {189,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {717,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3556}, - {2680,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4702,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},2397}, - {2389,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},5482}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2409}, - {3848,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2680}, - {1807,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5346,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},792}, - {4250,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1206}, - {4860,2, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5608,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5482}, - {5593,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5343,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5596,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {5611,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5612}, - {2661,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {2898,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5074,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {5315,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, - {5074,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {4208,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4714,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3993}, - {3993,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5227,23, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},0}, - {4534,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},0}, - {3276,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4871}, - {5466,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {1182,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {5572,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5614}, - {5416,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {4914,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5617}, - {5576,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {3620,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5578}, - {3293,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5472,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5478}, - {5527,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5612}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5597}, - {4222,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5423,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {3310,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5084,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5484}, - {4726,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4738,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5580,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5578}, - {2699,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5580,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5488}, - {2934,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5580,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5476}, - {4497,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {2429,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5476}, - {5323,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {2429,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5092}, - {5094,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {1182,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5597}, - {5536,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5488}, - {5104,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5113,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {4750,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5578}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5626}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5092}, - {3327,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},99}, - {3344,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2449}, - {2449,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3639,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5620}, - {5620,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3636,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {2469,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {5623,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2952,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5216,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5488}, - {5331,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5490,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3308}, - {4236,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5490,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5092}, - {3361,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5490,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5597}, - {3652,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5490,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5578}, - {3378,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5490,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5476}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5488}, - {3953,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5395,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {5436,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5605}, - {5216,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5092}, - {3968,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5496,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5597}, - {3395,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5496,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5612}, - {3983,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5496,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5578}, - {2489,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5532,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {4666,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5092}, - {5602,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5548}, - {5381,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5388}, - {5507,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3308}, - {5496,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5393}, - {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5488}, - {2409,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1422,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1446}, - {2509,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},496}, - {2499,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3011}, - {1446,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {5203,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4860}, - {4702,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2397}, - {143,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3259}, - {3011,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {792,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4510,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},4522}, - {4522,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},771}, - {771,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1631}, - {1631,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {1177,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3998}, - {947,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3713}, - {3998,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {3713,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, - {99,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, - {4914,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, - {4761,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, - {4914,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, - {2397,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, - {3556,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, - {1206,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {847,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {101,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},2564}, + {2268,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4912}, + {1230,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2547}, + {3311,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5418}, + {783,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1962}, + {1814,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3197}, + {2564,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4178,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},4046}, + {3939,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3771}, + {2547,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {3197,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {573,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {492,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {858,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1842}, + {1842,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, + {1962,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1618,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {2097,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1932}, + {2112,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1947}, + {3834,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3729}, + {2853,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4156}, + {1932,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {166,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1872}, + {124,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},5172}, + {1947,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},1660}, + {3729,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1134,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1014}, + {5307,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5824}, + {2700,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2462}, + {2462,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {4156,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {1660,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {134,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},4090}, + {129,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4068}, + {184,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2479}, + {1355,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {4090,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {97,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3509}, + {4380,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5686}, + {1498,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1355}, + {3509,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4178,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},4046}, + {3939,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3771}, + {4068,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {924,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4964}, + {105,130, {2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3216}, + {4380,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5686}, + {4403,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4334}, + {4964,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4178,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},4046}, + {3939,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3771}, + {1744,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3449}, + {3449,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {633,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {763,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {4334,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4134}, + {4134,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {97,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5362}, + {1498,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1355}, + {5362,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4178,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},4046}, + {288,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4357}, + {4357,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {3939,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3771}, + {919,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},0}, + {190,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2924}, + {3771,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2479,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {178,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1632}, + {4380,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5686}, + {1498,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1355}, + {1632,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1730,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {919,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},0}, + {190,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},2924}, + {1329,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {2268,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4912}, + {2683,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4473}, + {253,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},239}, + {239,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1604,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {3834,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3729}, + {2853,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4156}, + {2870,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {2097,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1932}, + {2112,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1947}, + {1524,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5719}, + {2268,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},4912}, + {2683,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4473}, + {4593,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1},251}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},1857}, + {85,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4938}, + {5120,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0},5}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},2581}, + {1857,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {2581,135, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {61,132, {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1},3}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},573}, + {4938,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {4912,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {5418,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {5686,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {5824,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {5719,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {5172,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},2172}, + {3140,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1122,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},990}, + {3569,130, {2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0},1}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},3409}, + {1872,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},3140}, + {4046,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {267,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},109}, + {1563,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},4449}, + {814,2, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {45,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1}, + {48,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {250,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {51,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {54,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},7}, + {3216,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2924,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {713,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {370,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, + {713,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {1646,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1086,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},114}, + {114,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {458,23, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1},0}, + {1146,24, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},0}, + {2445,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},847}, + {208,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {4641,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {93,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},15}, + {302,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {633,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},24}, + {89,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {2268,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},9}, + {2734,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {226,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},154}, + {149,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},7}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5}, + {1786,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {274,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {2632,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {643,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},160}, + {1206,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {1158,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {65,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},9}, + {3273,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {65,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},11}, + {3014,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {65,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},22}, + {1446,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {3549,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},22}, + {418,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {3549,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},251}, + {693,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {4641,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5}, + {73,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},11}, + {537,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {555,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {902,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},9}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},13}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},251}, + {2496,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3349}, + {2530,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3489}, + {3489,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1303,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},30}, + {30,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {2236,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {3649,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {39,4, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {3032,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {439,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},11}, + {362,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {196,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},3}, + {1702,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {196,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},251}, + {2768,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {196,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5}, + {2284,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {196,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},9}, + {2751,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {196,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},22}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},11}, + {2037,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {281,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {214,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},18}, + {439,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},251}, + {2022,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {202,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},5}, + {2785,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {202,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},7}, + {2052,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {202,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},9}, + {3589,6, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {81,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {1194,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},251}, + {42,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},57}, + {295,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},232}, + {139,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},3}, + {202,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},28}, + {0,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},11}, + {3409,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {4617,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},4497}, + {3311,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},5418}, + {783,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2673}, + {4497,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {466,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},814}, + {1122,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},990}, + {869,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},2581}, + {2673,3, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {109,137, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {1218,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},1050}, + {1050,133, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4990}, + {4990,135, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {0,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},4002}, + {4002,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {144,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1576}, + {220,129, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1842}, + {1576,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {1842,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, + {3349,16, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},0}, + {633,6, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0}, + {935,134, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0},0}, + {633,128, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, + {990,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, + {2172,134, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1},0}, + {4449,2, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},0}, {0,0} }; static const char string_table[] = { '\0', - 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', - 'd','-','a','t','t','r','i','b','u','t','e','-','v','a','l','u', - 'e','-','l','e','n','g','t','h','\0', - 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', - 'd','-','a','t','t','r','i','b','u','t','e','-','t','y','p','e', - '-','l','e','n','g','t','h','\0', - 'C','o','n','t','e','n','t','E','n','c','r','y','p','t','i','o', - 'n','A','l','g','o','r','i','t','h','m','I','d','e','n','t','i', - 'f','i','e','r','\0', - 'b','u','i','l','t','-','i','n','-','d','o','m','a','i','n','-', - 'd','e','f','i','n','e','d','-','a','t','t','r','i','b','u','t', + '0','\0', + '1','\0', + '3','\0', + '4','\0', + '5','\0', + '6','\0', + '8','\0', + '1','4','\0', + '1','6','\0', + '1','7','\0', + '2','6','\0', + '2','9','\0', + 'I','V','\0', + 'c','A','\0', + 'd','s','\0', + 'i','v','\0', + 'u','s','\0', + 'v','0','\0', + 'v','1','\0', + 'v','3','\0', + 'v','4','\0', + '8','4','0','\0', + 'M','A','X','\0', + 'a','l','g','\0', + 'c','m','s','\0', + 'd','o','d','\0', + 'f','o','o','\0', + 'i','s','o','\0', + 'm','a','c','\0', + 'm','d','5','\0', + 'o','i','w','\0', + 'r','i','d','\0', + 's','i','d','\0', + 'u','k','m','\0', + 'N','a','m','e','\0', + 'T','i','m','e','\0', + 'b','a','s','e','\0', + 'c','r','l','s','\0', + 'k','a','r','i','\0', + 'k','t','r','i','\0', + 'p','k','c','s','\0', + 't','y','p','e','\0', + 'x','9','c','m','\0', + '1','0','0','4','0','\0', + '1','0','0','4','6','\0', + 'c','e','r','t','s','\0', + 'i','d','-','c','e','\0', + 'k','e','k','i','d','\0', + 'k','e','k','r','i','\0', + 'o','t','h','e','r','\0', + 'p','k','c','s','7','\0', + 'p','k','c','s','9','\0', + 's','h','a','-','1','\0', + 's','m','i','m','e','\0', + 'v','a','l','u','e','\0', + 'x','9','-','5','7','\0', + '1','1','3','5','4','9','\0', + 'D','i','g','e','s','t','\0', + 'T','M','T','T','v','2','\0', + 'd','i','g','e','s','t','\0', + 'e','x','t','n','I','D','\0', + 'i','s','s','u','e','r','\0', + 'p','k','c','s','-','1','\0', + 'p','k','c','s','-','9','\0', + 'r','K','e','y','I','d','\0', + 'r','s','a','d','s','i','\0', + 's','e','c','s','i','g','\0', + 't','y','p','e','I','d','\0', + 'u','n','u','s','e','d','\0', + 'v','a','l','u','e','s','\0', + 'V','e','r','s','i','o','n','\0', + 'c','R','L','S','i','g','n','\0', + 'c','o','n','t','e','n','t','\0', + 'd','N','S','N','a','m','e','\0', + 'i','d','-','d','a','t','a','\0', + 'k','e','y','A','t','t','r','\0', + 'm','a','x','S','i','z','e','\0', + 'm','a','x','i','m','u','m','\0', + 'm','i','n','i','m','u','m','\0', + 'm','o','d','u','l','e','s','\0', + 'n','u','m','e','r','i','c','\0', + 'r','c','2','-','c','b','c','\0', + 'r','e','a','s','o','n','s','\0', + 's','u','b','j','e','c','t','\0', + 's','u','r','n','a','m','e','\0', + 't','y','p','e','-','i','d','\0', + 'u','t','c','T','i','m','e','\0', + 'v','e','r','s','i','o','n','\0', + 'K','e','y','U','s','a','g','e','\0', + 'V','a','l','i','d','i','t','y','\0', + 'a','t','t','r','T','y','p','e','\0', + 'c','r','i','t','i','c','a','l','\0', + 'e','C','o','n','t','e','n','t','\0', + 'f','u','l','l','N','a','m','e','\0', + 'i','n','i','t','i','a','l','s','\0', + 'i','n','t','e','r','n','e','t','\0', + 'n','o','t','A','f','t','e','r','\0', + 's','e','c','u','r','i','t','y','\0', + 'v','a','l','i','d','i','t','y','\0', + 'A','t','t','r','i','b','u','t','e','\0', + 'C','R','L','R','e','a','s','o','n','\0', + 'E','x','t','e','n','s','i','o','n','\0', + 'O','R','A','d','d','r','e','s','s','\0', + 'O','t','h','e','r','N','a','m','e','\0', + 'S','k','i','p','C','e','r','t','s','\0', + 'a','l','g','o','r','i','t','h','m','\0', + 'a','n','s','i','-','x','9','4','2','\0', + 'b','m','p','S','t','r','i','n','g','\0', + 'c','R','L','I','s','s','u','e','r','\0', + 'c','R','L','N','u','m','b','e','r','\0', + 'e','x','t','n','V','a','l','u','e','\0', + 'h','M','A','C','-','S','H','A','1','\0', + 'i','P','A','d','d','r','e','s','s','\0', + 'k','e','y','A','t','t','r','I','d','\0', + 'n','o','t','B','e','f','o','r','e','\0', + 'o','t','h','e','r','N','a','m','e','\0', + 'p','a','r','t','y','N','a','m','e','\0', + 'p','r','i','n','t','a','b','l','e','\0', + 'p','u','b','l','i','c','K','e','y','\0', + 'q','u','a','l','i','f','i','e','r','\0', + 's','i','g','n','a','t','u','r','e','\0', + 't','e','l','e','t','r','u','s','t','\0', + 'A','t','t','r','i','b','u','t','e','s','\0', + 'C','M','S','V','e','r','s','i','o','n','\0', + 'E','x','t','e','n','s','i','o','n','s','\0', + 'S','i','g','n','e','d','D','a','t','a','\0', + 'S','i','g','n','e','r','I','n','f','o','\0', + 'a','t','t','r','V','a','l','u','e','s','\0', + 'a','t','t','r','i','b','u','t','e','s','\0', + 'e','x','t','e','n','s','i','o','n','s','\0', + 'g','i','v','e','n','-','n','a','m','e','\0', + 'm','e','c','h','a','n','i','s','m','s','\0', + 'n','e','x','t','U','p','d','a','t','e','\0', + 'o','r','i','g','i','n','a','t','o','r','\0', + 'p','a','r','a','m','e','t','e','r','s','\0', + 'r','f','c','8','2','2','N','a','m','e','\0', + 's','u','p','e','r','s','e','d','e','d','\0', + 't','h','i','s','U','p','d','a','t','e','\0', + 'u','t','f','8','S','t','r','i','n','g','\0', + 'C','e','r','t','i','f','i','c','a','t','e','\0', + 'C','o','n','t','e','n','t','I','n','f','o','\0', + 'C','o','n','t','e','n','t','T','y','p','e','\0', + 'C','o','u','n','t','r','y','N','a','m','e','\0', + 'G','e','n','e','r','a','l','N','a','m','e','\0', + 'R','D','N','S','e','q','u','e','n','c','e','\0', + 'R','e','a','s','o','n','F','l','a','g','s','\0', + 'S','i','g','n','e','r','I','n','f','o','s','\0', + 'S','i','g','n','i','n','g','T','i','m','e','\0', + 'T','B','S','C','e','r','t','L','i','s','t','\0', + 'X','1','2','1','A','d','d','r','e','s','s','\0', + 'c','e','r','t','i','f','i','c','a','t','e','\0', + 'c','o','n','t','e','n','t','T','y','p','e','\0', + 'g','e','n','e','r','a','l','T','i','m','e','\0', + 'i','d','-','a','l','g','-','E','S','D','H','\0', + 'i','n','d','i','r','e','c','t','C','R','L','\0', + 'k','e','y','C','e','r','t','S','i','g','n','\0', + 'm','e','m','b','e','r','-','b','o','d','y','\0', + 'n','u','m','b','e','r','-','t','y','p','e','\0', + 'r','d','n','S','e','q','u','e','n','c','e','\0', + 's','i','g','n','e','d','A','t','t','r','s','\0', + 's','i','g','n','e','r','I','n','f','o','s','\0', + 't','b','s','C','e','r','t','L','i','s','t','\0', + 'u','n','s','p','e','c','i','f','i','e','d','\0', + 'x','4','0','0','A','d','d','r','e','s','s','\0', + 'B','a','s','e','D','i','s','t','a','n','c','e','\0', + 'C','B','C','P','a','r','a','m','e','t','e','r','\0', + 'C','e','r','t','P','o','l','i','c','y','I','d','\0', + 'D','i','g','e','s','t','e','d','D','a','t','a','\0', + 'E','D','I','P','a','r','t','y','N','a','m','e','\0', + 'E','n','c','r','y','p','t','e','d','K','e','y','\0', + 'G','e','n','e','r','a','l','N','a','m','e','s','\0', + 'P','e','r','s','o','n','a','l','N','a','m','e','\0', + 'c','A','C','o','m','p','r','o','m','i','s','e','\0', + 'c','e','r','t','i','f','i','c','a','t','e','s','\0', + 'c','o','u','n','t','r','y','-','n','a','m','e','\0', + 'd','e','c','i','p','h','e','r','O','n','l','y','\0', + 'd','e','s','-','e','d','e','3','-','c','b','c','\0', + 'e','C','o','n','t','e','n','t','T','y','p','e','\0', + 'e','d','i','P','a','r','t','y','N','a','m','e','\0', + 'e','n','c','i','p','h','e','r','O','n','l','y','\0', + 'e','n','c','r','y','p','t','e','d','K','e','y','\0', + 'k','e','y','A','g','r','e','e','m','e','n','t','\0', + 'm','a','c','A','l','g','o','r','i','t','h','m','\0', + 'n','a','m','e','A','s','s','i','g','n','e','r','\0', + 'r','e','g','i','s','t','e','r','e','d','I','D','\0', + 's','e','r','i','a','l','N','u','m','b','e','r','\0', + 'A','t','t','r','i','b','u','t','e','T','y','p','e','\0', + 'B','i','o','m','e','t','r','i','c','D','a','t','a','\0', + 'E','n','c','r','y','p','t','e','d','D','a','t','a','\0', + 'E','n','v','e','l','o','p','e','d','D','a','t','a','\0', + 'K','E','K','I','d','e','n','t','i','f','i','e','r','\0', + 'M','e','s','s','a','g','e','D','i','g','e','s','t','\0', + 'R','e','c','i','p','i','e','n','t','I','n','f','o','\0', + 'c','r','l','E','x','t','e','n','s','i','o','n','s','\0', + 'd','i','r','e','c','t','o','r','y','N','a','m','e','\0', + 'i','d','-','s','i','g','n','e','d','D','a','t','a','\0', + 'k','e','y','C','o','m','p','r','o','m','i','s','e','\0', + 'k','e','y','I','d','e','n','t','i','f','i','e','r','\0', + 'o','r','i','g','i','n','a','t','o','r','K','e','y','\0', + 'p','e','r','s','o','n','a','l','-','n','a','m','e','\0', + 'r','e','m','o','v','e','F','r','o','m','C','R','L','\0', + 'r','s','a','E','n','c','r','y','p','t','i','o','n','\0', + 't','e','l','e','t','e','x','S','t','r','i','n','g','\0', + 'u','n','s','i','g','n','e','d','A','t','t','r','s','\0', + 'x','1','2','1','-','d','c','c','-','c','o','d','e','\0', + 'A','t','t','r','i','b','u','t','e','V','a','l','u','e','\0', + 'A','u','t','h','A','t','t','r','i','b','u','t','e','s','\0', + 'C','e','r','t','i','f','i','c','a','t','e','S','e','t','\0', + 'G','e','n','e','r','a','l','S','u','b','t','r','e','e','\0', + 'I','n','v','a','l','i','d','i','t','y','D','a','t','e','\0', + 'N','e','t','w','o','r','k','A','d','d','r','e','s','s','\0', + 'O','r','i','g','i','n','a','t','o','r','I','n','f','o','\0', + 'R','e','c','i','p','i','e','n','t','I','n','f','o','s','\0', + 'S','i','g','n','a','t','u','r','e','V','a','l','u','e','\0', + 'S','u','b','j','e','c','t','A','l','t','N','a','m','e','\0', + 'T','B','S','C','e','r','t','i','f','i','c','a','t','e','\0', + 'T','e','s','t','I','d','e','n','t','i','f','i','e','r','\0', + 'i','d','-','c','o','n','t','e','n','t','T','y','p','e','\0', + 'i','d','-','c','t','-','a','u','t','h','D','a','t','a','\0', + 'i','d','-','s','i','g','n','i','n','g','T','i','m','e','\0', + 'i','s','s','u','e','r','U','n','i','q','u','e','I','D','\0', + 'n','o','n','R','e','p','u','d','i','a','t','i','o','n','\0', + 'o','r','i','g','i','n','a','t','o','r','I','n','f','o','\0', + 'r','e','c','i','p','i','e','n','t','I','n','f','o','s','\0', + 'r','e','v','o','c','a','t','i','o','n','D','a','t','e','\0', + 's','i','g','n','a','t','u','r','e','V','a','l','u','e','\0', + 't','b','s','C','e','r','t','i','f','i','c','a','t','e','\0', + 'C','e','r','t','i','f','i','c','a','t','e','L','i','s','t','\0', + 'D','i','r','e','c','t','o','r','y','S','t','r','i','n','g','\0', + 'G','e','n','e','r','a','l','S','u','b','t','r','e','e','s','\0', + 'N','a','m','e','C','o','n','s','t','r','a','i','n','t','s','\0', + 'R','C','2','C','B','C','P','a','r','a','m','e','t','e','r','\0', + 'c','e','r','t','i','f','i','c','a','t','e','H','o','l','d','\0', + 'd','i','g','e','s','t','A','l','g','o','r','i','t','h','m','\0', + 'i','d','-','d','i','g','e','s','t','e','d','D','a','t','a','\0', + 'j','o','i','n','t','-','i','s','o','-','c','c','i','t','t','\0', + 'k','e','y','E','n','c','i','p','h','e','r','m','e','n','t','\0', + 'n','e','t','w','o','r','k','-','a','d','d','r','e','s','s','\0', + 'o','n','l','y','S','o','m','e','R','e','a','s','o','n','s','\0', + 'p','r','i','n','t','a','b','l','e','S','t','r','i','n','g','\0', + 's','u','b','j','e','c','t','U','n','i','q','u','e','I','D','\0', + 'u','n','i','v','e','r','s','a','l','S','t','r','i','n','g','\0', + 'u','s','e','r','C','e','r','t','i','f','i','c','a','t','e','\0', + 'B','a','s','i','c','C','o','n','s','t','r','a','i','n','t','s','\0', + 'C','o','u','n','t','e','r','s','i','g','n','a','t','u','r','e','\0', + 'E','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t','\0', + 'K','E','K','R','e','c','i','p','i','e','n','t','I','n','f','o','\0', + 'K','e','y','W','r','a','p','A','l','g','o','r','i','t','h','m','\0', + 'O','r','g','a','n','i','z','a','t','i','o','n','N','a','m','e','\0', + 'R','C','2','w','r','a','p','P','a','r','a','m','e','t','e','r','\0', + 'S','i','g','n','e','d','A','t','t','r','i','b','u','t','e','s','\0', + 'S','i','g','n','e','r','I','d','e','n','t','i','f','i','e','r','\0', + 'U','n','a','u','t','h','A','t','t','r','i','b','u','t','e','s','\0', + 'U','n','i','q','u','e','I','d','e','n','t','i','f','i','e','r','\0', + 'd','a','t','a','E','n','c','i','p','h','e','r','m','e','n','t','\0', + 'd','h','-','p','u','b','l','i','c','-','n','u','m','b','e','r','\0', + 'd','i','g','e','s','t','A','l','g','o','r','i','t','h','m','s','\0', + 'd','i','g','i','t','a','l','S','i','g','n','a','t','u','r','e','\0', + 'e','n','c','a','p','C','o','n','t','e','n','t','I','n','f','o','\0', + 'e','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t','\0', + 'e','x','c','l','u','d','e','d','S','u','b','t','r','e','e','s','\0', + 'i','d','-','d','s','a','-','w','i','t','h','-','s','h','a','1','\0', + 'i','d','-','e','n','c','r','y','p','t','e','d','D','a','t','a','\0', + 'i','d','-','e','n','v','e','l','o','p','e','d','D','a','t','a','\0', + 'i','d','-','m','e','s','s','a','g','e','D','i','g','e','s','t','\0', + 'p','o','l','i','c','y','I','d','e','n','t','i','f','i','e','r','\0', + 'p','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','s','\0', + 's','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y','\0', + 'u','n','p','r','o','t','e','c','t','e','d','A','t','t','r','s','\0', + 'A','u','t','h','e','n','t','i','c','a','t','e','d','D','a','t', + 'a','\0', + 'C','e','r','t','i','f','i','c','a','t','e','I','s','s','u','e', + 'r','\0', + 'D','i','s','t','r','i','b','u','t','i','o','n','P','o','i','n', + 't','\0', + 'O','t','h','e','r','K','e','y','A','t','t','r','i','b','u','t', + 'e','\0', + 'P','o','l','i','c','y','I','n','f','o','r','m','a','t','i','o', + 'n','\0', + 'P','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', + 'd','\0', + 'P','r','i','v','a','t','e','D','o','m','a','i','n','N','a','m', + 'e','\0', + 'd','i','s','t','r','i','b','u','t','i','o','n','P','o','i','n', + 't','\0', + 'i','d','-','a','l','g','-','C','M','S','R','C','2','w','r','a', + 'p','\0', + 'i','d','-','c','t','-','c','o','n','t','e','n','t','I','n','f', + 'o','\0', + 'o','r','g','a','n','i','z','a','t','i','o','n','-','n','a','m', + 'e','\0', + 'p','a','t','h','L','e','n','C','o','n','s','t','r','a','i','n', + 't','\0', + 'p','e','r','m','i','t','t','e','d','S','u','b','t','r','e','e', + 's','\0', + 'p','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', + 'd','\0', + 'u','b','-','s','u','r','n','a','m','e','-','l','e','n','g','t', + 'h','\0', + 'C','e','r','t','i','f','i','c','a','t','e','C','h','o','i','c', 'e','s','\0', - 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','a', - 'l','-','u','n','i','t','-','n','a','m','e','-','l','e','n','g', - 't','h','\0', - 'M','e','s','s','a','g','e','A','u','t','h','e','n','t','i','c', - 'a','t','i','o','n','C','o','d','e','A','l','g','o','r','i','t', + 'E','x','t','e','n','s','i','o','n','A','t','t','r','i','b','u', + 't','e','\0', + 'T','e','r','m','i','n','a','l','I','d','e','n','t','i','f','i', + 'e','r','\0', + 'U','n','s','i','g','n','e','d','A','t','t','r','i','b','u','t', + 'e','s','\0', + 'U','s','e','r','K','e','y','i','n','g','M','a','t','e','r','i', + 'a','l','\0', + 'a','f','f','i','l','i','a','t','i','o','n','C','h','a','n','g', + 'e','d','\0', + 'c','r','l','E','n','t','r','y','E','x','t','e','n','s','i','o', + 'n','s','\0', + 'i','d','-','a','l','g','-','C','M','S','3','D','E','S','w','r', + 'a','p','\0', + 'i','s','s','u','e','r','D','o','m','a','i','n','P','o','l','i', + 'c','y','\0', + 's','i','g','n','a','t','u','r','e','A','l','g','o','r','i','t', 'h','m','\0', - 'K','e','y','E','n','c','r','y','p','t','i','o','n','A','l','g', - 'o','r','i','t','h','m','I','d','e','n','t','i','f','i','e','r','\0', - 'B','u','i','l','t','I','n','D','o','m','a','i','n','D','e','f', - 'i','n','e','d','A','t','t','r','i','b','u','t','e','s','\0', - 'u','b','-','c','o','u','n','t','r','y','-','n','a','m','e','-', - 'n','u','m','e','r','i','c','-','l','e','n','g','t','h','\0', - 'u','b','-','g','e','n','e','r','a','t','i','o','n','-','q','u', - 'a','l','i','f','i','e','r','-','l','e','n','g','t','h','\0', - 'B','u','i','l','t','I','n','D','o','m','a','i','n','D','e','f', - 'i','n','e','d','A','t','t','r','i','b','u','t','e','\0', - 'S','u','b','j','e','c','t','C','e','r','t','D','i','s','t','r', - 'i','b','u','t','i','o','n','P','o','i','n','t','\0', - 'b','u','i','l','t','-','i','n','-','s','t','a','n','d','a','r', - 'd','-','a','t','t','r','i','b','u','t','e','s','\0', - 'u','b','-','c','o','u','n','t','r','y','-','n','a','m','e','-', - 'a','l','p','h','a','-','l','e','n','g','t','h','\0', - 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', - 'd','-','a','t','t','r','i','b','u','t','e','s','\0', - 'S','i','g','n','a','t','u','r','e','A','l','g','o','r','i','t', - 'h','m','I','d','e','n','t','i','f','i','e','r','\0', - 'I','s','s','u','e','r','C','e','r','t','D','i','s','t','r','i', - 'b','u','t','i','o','n','P','o','i','n','t','\0', - 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','-', - 'n','a','m','e','-','l','e','n','g','t','h','\0', - 'K','e','y','A','g','r','e','e','R','e','c','i','p','i','e','n', - 't','I','d','e','n','t','i','f','i','e','r','\0', - 'S','u','b','j','e','c','t','D','i','r','e','c','t','o','r','y', - 'A','t','t','r','i','b','u','t','e','s','\0', - 'a','d','m','i','n','i','s','t','r','a','t','i','o','n','-','d', - 'o','m','a','i','n','-','n','a','m','e','\0', - 'C','r','y','p','t','o','g','r','a','p','h','i','c','M','e','s', - 's','a','g','e','S','y','n','t','a','x','\0', - 'D','i','g','e','s','t','A','l','g','o','r','i','t','h','m','I', - 'd','e','n','t','i','f','i','e','r','s','\0', - 'C','e','r','t','i','f','i','c','a','t','e','R','e','v','o','c', - 'a','t','i','o','n','L','i','s','t','s','\0', - 'c','o','n','t','e','n','t','E','n','c','r','y','p','t','i','o', - 'n','A','l','g','o','r','i','t','h','m','\0', - 'R','e','l','a','t','i','v','e','D','i','s','t','i','n','g','u', - 'i','s','h','e','d','N','a','m','e','\0', - 'a','u','t','h','o','r','i','t','y','C','e','r','t','S','e','r', - 'i','a','l','N','u','m','b','e','r','\0', - 'u','n','i','f','o','r','m','R','e','s','o','u','r','c','e','I', - 'd','e','n','t','i','f','i','e','r','\0', - 'B','u','i','l','t','I','n','S','t','a','n','d','a','r','d','A', - 't','t','r','i','b','u','t','e','s','\0', - 'o','r','g','a','n','i','z','a','t','i','o','n','a','l','-','u', - 'n','i','t','-','n','a','m','e','s','\0', - 'u','b','-','n','u','m','e','r','i','c','-','u','s','e','r','-', - 'i','d','-','l','e','n','g','t','h','\0', - 'e','x','t','e','n','s','i','o','n','-','a','t','t','r','i','b', - 'u','t','e','-','v','a','l','u','e','\0', - 'D','i','g','e','s','t','A','l','g','o','r','i','t','h','m','I', - 'd','e','n','t','i','f','i','e','r','\0', - 'O','r','i','g','i','n','a','t','o','r','I','d','e','n','t','i', - 'f','i','e','r','O','r','K','e','y','\0', - 'M','e','s','s','a','g','e','A','u','t','h','e','n','t','i','c', - 'a','t','i','o','n','C','o','d','e','\0', - 'u','n','a','u','t','h','e','n','t','i','c','a','t','e','d','A', - 't','t','r','i','b','u','t','e','s','\0', - 'i','s','s','u','i','n','g','D','i','s','t','r','i','b','u','t', - 'i','o','n','P','o','i','n','t','\0', - 'C','e','r','t','i','f','i','c','a','t','i','o','n','R','e','q', - 'u','e','s','t','I','n','f','o','\0', - 'c','e','r','t','i','f','i','c','a','t','i','o','n','R','e','q', - 'u','e','s','t','I','n','f','o','\0', - 'A','d','m','i','n','i','s','t','r','a','t','i','o','n','D','o', - 'm','a','i','n','N','a','m','e','\0', - 'e','x','t','e','n','s','i','o','n','-','a','t','t','r','i','b', - 'u','t','e','-','t','y','p','e','\0', - 'i','d','e','n','t','i','f','i','e','d','-','o','r','g','a','n', - 'i','z','a','t','i','o','n','\0', - 'C','e','r','t','i','f','i','c','a','t','e','S','e','r','i','a', - 'l','N','u','m','b','e','r','\0', - 'P','o','l','i','c','y','C','o','n','s','t','r','a','i','n','t', - 's','S','y','n','t','a','x','\0', - 'n','a','m','e','R','e','l','a','t','i','v','e','T','o','C','R', - 'L','I','s','s','u','e','r','\0', - 'P','o','l','i','c','y','D','i','s','t','r','i','b','u','t','i', - 'o','n','P','o','i','n','t','\0', - 'n','u','m','e','r','i','c','-','u','s','e','r','-','i','d','e', - 'n','t','i','f','i','e','r','\0', - 'O','r','g','a','n','i','z','a','t','i','o','n','a','l','U','n', - 'i','t','N','a','m','e','s','\0', - 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','a', - 'l','-','u','n','i','t','s','\0', - 'u','b','-','e','x','t','e','n','s','i','o','n','-','a','t','t', - 'r','i','b','u','t','e','s','\0', - 'E','n','c','a','p','s','u','l','a','t','e','d','C','o','n','t', - 'e','n','t','I','n','f','o','\0', - 'e','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', - 'a','t','e','I','n','f','o','\0', + 'u','b','-','i','n','i','t','i','a','l','s','-','l','e','n','g', + 't','h','\0', + 'A','l','g','o','r','i','t','h','m','I','d','e','n','t','i','f', + 'i','e','r','\0', + 'C','R','L','D','i','s','t','P','o','i','n','t','s','S','y','n', + 't','a','x','\0', + 'C','e','r','t','i','f','i','c','a','t','e','P','o','l','i','c', + 'i','e','s','\0', 'E','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', - 'a','t','e','I','n','f','o','\0', - 'A','u','t','h','o','r','i','t','y','K','e','y','I','d','e','n', - 't','i','f','i','e','r','\0', - 'u','b','-','x','1','2','1','-','a','d','d','r','e','s','s','-', - 'l','e','n','g','t','h','\0', - 'O','r','g','a','n','i','z','a','t','i','o','n','a','l','U','n', - 'i','t','N','a','m','e','\0', - 'k','e','y','E','n','c','r','y','p','t','i','o','n','A','l','g', - 'o','r','i','t','h','m','\0', - 'r','e','c','i','p','i','e','n','t','E','n','c','r','y','p','t', - 'e','d','K','e','y','s','\0', - 'R','e','c','i','p','i','e','n','t','E','n','c','r','y','p','t', - 'e','d','K','e','y','s','\0', - 'R','e','c','i','p','i','e','n','t','K','e','y','I','d','e','n', - 't','i','f','i','e','r','\0', + 'a','t','e','\0', + 'E','x','t','e','n','s','i','o','n','A','t','t','r','i','b','u', + 't','e','s','\0', + 'O','r','i','g','i','n','a','t','o','r','P','u','b','l','i','c', + 'K','e','y','\0', + 'P','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', + 'n','f','o','\0', + 'R','C','2','P','a','r','a','m','e','t','e','r','V','e','r','s', + 'i','o','n','\0', + 'R','e','c','i','p','i','e','n','t','I','d','e','n','t','i','f', + 'i','e','r','\0', + 'a','u','t','h','o','r','i','t','y','C','e','r','t','I','s','s', + 'u','e','r','\0', + 'e','n','c','r','y','p','t','i','o','n','A','l','g','o','r','i', + 't','h','m','\0', + 'e','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', + 'a','t','e','\0', + 'i','d','-','c','o','u','n','t','e','r','s','i','g','n','a','t', + 'u','r','e','\0', + 'o','n','l','y','C','o','n','t','a','i','n','s','C','A','C','e', + 'r','t','s','\0', + 'p','r','i','v','a','t','e','-','d','o','m','a','i','n','-','n', + 'a','m','e','\0', + 'r','c','2','P','a','r','a','m','e','t','e','r','V','e','r','s', + 'i','o','n','\0', + 'r','e','v','o','k','e','d','C','e','r','t','i','f','i','c','a', + 't','e','s','\0', + 's','u','b','j','e','c','t','D','o','m','a','i','n','P','o','l', + 'i','c','y','\0', + 't','e','r','m','i','n','a','l','-','i','d','e','n','t','i','f', + 'i','e','r','\0', + 'E','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t', + 'I','n','f','o','\0', + 'P','o','l','i','c','y','M','a','p','p','i','n','g','s','S','y', + 'n','t','a','x','\0', + 'S','u','b','j','e','c','t','K','e','y','I','d','e','n','t','i', + 'f','i','e','r','\0', + 'S','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y', + 'I','n','f','o','\0', + 'c','e','s','s','a','t','i','o','n','O','f','O','p','e','r','a', + 't','i','o','n','\0', + 'e','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t', + 'I','n','f','o','\0', + 'e','x','t','e','n','s','i','o','n','-','a','t','t','r','i','b', + 'u','t','e','s','\0', + 'g','e','n','e','r','a','t','i','o','n','-','q','u','a','l','i', + 'f','i','e','r','\0', + 'i','n','h','i','b','i','t','P','o','l','i','c','y','M','a','p', + 'p','i','n','g','\0', + 'i','s','o','-','3','1','6','6','-','a','l','p','h','a','2','-', + 'c','o','d','e','\0', + 's','u','b','j','e','c','t','K','e','y','I','d','e','n','t','i', + 'f','i','e','r','\0', + 's','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y', + 'I','n','f','o','\0', + 'u','b','-','g','i','v','e','n','-','n','a','m','e','-','l','e', + 'n','g','t','h','\0', 'A','t','t','r','i','b','u','t','e','T','y','p','e','A','n','d', 'V','a','l','u','e','\0', - 'r','e','q','u','i','r','e','E','x','p','l','i','c','i','t','P', - 'o','l','i','c','y','\0', 'D','i','s','t','r','i','b','u','t','i','o','n','P','o','i','n', 't','N','a','m','e','\0', - 'o','n','l','y','C','o','n','t','a','i','n','s','U','s','e','r', - 'C','e','r','t','s','\0', + 'I','s','s','u','e','r','A','n','d','S','e','r','i','a','l','N', + 'u','m','b','e','r','\0', + 'K','e','y','A','g','r','e','e','R','e','c','i','p','i','e','n', + 't','I','n','f','o','\0', + 'K','e','y','T','r','a','n','s','R','e','c','i','p','i','e','n', + 't','I','n','f','o','\0', 'N','u','m','e','r','i','c','U','s','e','r','I','d','e','n','t', 'i','f','i','e','r','\0', + 'R','e','c','i','p','i','e','n','t','E','n','c','r','y','p','t', + 'e','d','K','e','y','\0', + 'U','n','p','r','o','t','e','c','t','e','d','A','t','t','r','i', + 'b','u','t','e','s','\0', + 'i','s','s','u','e','r','A','n','d','S','e','r','i','a','l','N', + 'u','m','b','e','r','\0', + 'o','n','l','y','C','o','n','t','a','i','n','s','U','s','e','r', + 'C','e','r','t','s','\0', + 'r','e','q','u','i','r','e','E','x','p','l','i','c','i','t','P', + 'o','l','i','c','y','\0', 'u','b','-','d','o','m','a','i','n','-','n','a','m','e','-','l', 'e','n','g','t','h','\0', 'u','b','-','t','e','r','m','i','n','a','l','-','i','d','-','l', 'e','n','g','t','h','\0', - 'i','s','s','u','e','r','A','n','d','S','e','r','i','a','l','N', - 'u','m','b','e','r','\0', - 'I','s','s','u','e','r','A','n','d','S','e','r','i','a','l','N', - 'u','m','b','e','r','\0', - 'U','n','p','r','o','t','e','c','t','e','d','A','t','t','r','i', - 'b','u','t','e','s','\0', - 'K','e','y','T','r','a','n','s','R','e','c','i','p','i','e','n', - 't','I','n','f','o','\0', - 'K','e','y','A','g','r','e','e','R','e','c','i','p','i','e','n', - 't','I','n','f','o','\0', + 'A','u','t','h','o','r','i','t','y','K','e','y','I','d','e','n', + 't','i','f','i','e','r','\0', + 'O','r','g','a','n','i','z','a','t','i','o','n','a','l','U','n', + 'i','t','N','a','m','e','\0', 'R','e','c','i','p','i','e','n','t','E','n','c','r','y','p','t', - 'e','d','K','e','y','\0', - 's','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y', - 'I','n','f','o','\0', - 'S','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y', - 'I','n','f','o','\0', - 'P','o','l','i','c','y','M','a','p','p','i','n','g','s','S','y', - 'n','t','a','x','\0', - 'i','n','h','i','b','i','t','P','o','l','i','c','y','M','a','p', - 'p','i','n','g','\0', - 'c','e','s','s','a','t','i','o','n','O','f','O','p','e','r','a', - 't','i','o','n','\0', - 'i','s','o','-','3','1','6','6','-','a','l','p','h','a','2','-', - 'c','o','d','e','\0', - 'u','b','-','g','i','v','e','n','-','n','a','m','e','-','l','e', - 'n','g','t','h','\0', - 'g','e','n','e','r','a','t','i','o','n','-','q','u','a','l','i', - 'f','i','e','r','\0', - 's','u','b','j','e','c','t','K','e','y','I','d','e','n','t','i', - 'f','i','e','r','\0', - 'S','u','b','j','e','c','t','K','e','y','I','d','e','n','t','i', - 'f','i','e','r','\0', - 'e','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t', - 'I','n','f','o','\0', - 'E','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t', - 'I','n','f','o','\0', - 'a','u','t','h','o','r','i','t','y','C','e','r','t','I','s','s', - 'u','e','r','\0', - 'C','e','r','t','i','f','i','c','a','t','e','P','o','l','i','c', - 'i','e','s','\0', - 'P','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', - 'n','f','o','\0', - 's','u','b','j','e','c','t','D','o','m','a','i','n','P','o','l', - 'i','c','y','\0', - 'C','R','L','D','i','s','t','P','o','i','n','t','s','S','y','n', - 't','a','x','\0', - 'r','e','v','o','k','e','d','C','e','r','t','i','f','i','c','a', - 't','e','s','\0', - 'o','n','l','y','C','o','n','t','a','i','n','s','C','A','C','e', - 'r','t','s','\0', - 'E','x','t','e','n','s','i','o','n','A','t','t','r','i','b','u', - 't','e','s','\0', - 't','e','r','m','i','n','a','l','-','i','d','e','n','t','i','f', - 'i','e','r','\0', - 'p','r','i','v','a','t','e','-','d','o','m','a','i','n','-','n', - 'a','m','e','\0', - 'O','r','i','g','i','n','a','t','o','r','P','u','b','l','i','c', - 'K','e','y','\0', - 'e','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', - 'a','t','e','\0', + 'e','d','K','e','y','s','\0', + 'R','e','c','i','p','i','e','n','t','K','e','y','I','d','e','n', + 't','i','f','i','e','r','\0', + 'k','e','y','E','n','c','r','y','p','t','i','o','n','A','l','g', + 'o','r','i','t','h','m','\0', + 'r','e','c','i','p','i','e','n','t','E','n','c','r','y','p','t', + 'e','d','K','e','y','s','\0', + 'u','b','-','x','1','2','1','-','a','d','d','r','e','s','s','-', + 'l','e','n','g','t','h','\0', + 'C','e','r','t','i','f','i','c','a','t','e','S','e','r','i','a', + 'l','N','u','m','b','e','r','\0', + 'E','n','c','a','p','s','u','l','a','t','e','d','C','o','n','t', + 'e','n','t','I','n','f','o','\0', 'E','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', - 'a','t','e','\0', - 'e','n','c','r','y','p','t','i','o','n','A','l','g','o','r','i', - 't','h','m','\0', - 'R','C','2','P','a','r','a','m','e','t','e','r','V','e','r','s', - 'i','o','n','\0', - 'r','c','2','P','a','r','a','m','e','t','e','r','V','e','r','s', - 'i','o','n','\0', - 'i','d','-','c','o','u','n','t','e','r','s','i','g','n','a','t', - 'u','r','e','\0', - 's','i','g','n','a','t','u','r','e','A','l','g','o','r','i','t', + 'a','t','e','I','n','f','o','\0', + 'O','r','g','a','n','i','z','a','t','i','o','n','a','l','U','n', + 'i','t','N','a','m','e','s','\0', + 'P','o','l','i','c','y','C','o','n','s','t','r','a','i','n','t', + 's','S','y','n','t','a','x','\0', + 'P','o','l','i','c','y','D','i','s','t','r','i','b','u','t','i', + 'o','n','P','o','i','n','t','\0', + 'a','u','t','h','e','n','t','i','c','a','t','e','d','A','t','t', + 'r','i','b','u','t','e','s','\0', + 'e','x','t','e','n','d','e','d','C','e','r','t','i','f','i','c', + 'a','t','e','I','n','f','o','\0', + 'i','d','e','n','t','i','f','i','e','d','-','o','r','g','a','n', + 'i','z','a','t','i','o','n','\0', + 'n','a','m','e','R','e','l','a','t','i','v','e','T','o','C','R', + 'L','I','s','s','u','e','r','\0', + 'n','u','m','e','r','i','c','-','u','s','e','r','-','i','d','e', + 'n','t','i','f','i','e','r','\0', + 'u','b','-','e','x','t','e','n','s','i','o','n','-','a','t','t', + 'r','i','b','u','t','e','s','\0', + 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','a', + 'l','-','u','n','i','t','s','\0', + 'A','d','m','i','n','i','s','t','r','a','t','i','o','n','D','o', + 'm','a','i','n','N','a','m','e','\0', + 'C','e','r','t','i','f','i','c','a','t','i','o','n','R','e','q', + 'u','e','s','t','I','n','f','o','\0', + 'c','e','r','t','i','f','i','c','a','t','i','o','n','R','e','q', + 'u','e','s','t','I','n','f','o','\0', + 'e','x','t','e','n','s','i','o','n','-','a','t','t','r','i','b', + 'u','t','e','-','t','y','p','e','\0', + 'i','s','s','u','i','n','g','D','i','s','t','r','i','b','u','t', + 'i','o','n','P','o','i','n','t','\0', + 'B','u','i','l','t','I','n','S','t','a','n','d','a','r','d','A', + 't','t','r','i','b','u','t','e','s','\0', + 'D','i','g','e','s','t','A','l','g','o','r','i','t','h','m','I', + 'd','e','n','t','i','f','i','e','r','\0', + 'M','e','s','s','a','g','e','A','u','t','h','e','n','t','i','c', + 'a','t','i','o','n','C','o','d','e','\0', + 'O','r','i','g','i','n','a','t','o','r','I','d','e','n','t','i', + 'f','i','e','r','O','r','K','e','y','\0', + 'R','e','l','a','t','i','v','e','D','i','s','t','i','n','g','u', + 'i','s','h','e','d','N','a','m','e','\0', + 'a','u','t','h','o','r','i','t','y','C','e','r','t','S','e','r', + 'i','a','l','N','u','m','b','e','r','\0', + 'e','x','t','e','n','s','i','o','n','-','a','t','t','r','i','b', + 'u','t','e','-','v','a','l','u','e','\0', + 'o','r','g','a','n','i','z','a','t','i','o','n','a','l','-','u', + 'n','i','t','-','n','a','m','e','s','\0', + 'u','b','-','n','u','m','e','r','i','c','-','u','s','e','r','-', + 'i','d','-','l','e','n','g','t','h','\0', + 'u','n','a','u','t','h','e','n','t','i','c','a','t','e','d','A', + 't','t','r','i','b','u','t','e','s','\0', + 'u','n','i','f','o','r','m','R','e','s','o','u','r','c','e','I', + 'd','e','n','t','i','f','i','e','r','\0', + 'C','e','r','t','i','f','i','c','a','t','e','R','e','v','o','c', + 'a','t','i','o','n','L','i','s','t','s','\0', + 'C','r','y','p','t','o','g','r','a','p','h','i','c','M','e','s', + 's','a','g','e','S','y','n','t','a','x','\0', + 'D','i','g','e','s','t','A','l','g','o','r','i','t','h','m','I', + 'd','e','n','t','i','f','i','e','r','s','\0', + 'S','u','b','j','e','c','t','D','i','r','e','c','t','o','r','y', + 'A','t','t','r','i','b','u','t','e','s','\0', + 'a','d','m','i','n','i','s','t','r','a','t','i','o','n','-','d', + 'o','m','a','i','n','-','n','a','m','e','\0', + 'c','o','n','t','e','n','t','E','n','c','r','y','p','t','i','o', + 'n','A','l','g','o','r','i','t','h','m','\0', + 'I','s','s','u','e','r','C','e','r','t','D','i','s','t','r','i', + 'b','u','t','i','o','n','P','o','i','n','t','\0', + 'K','e','y','A','g','r','e','e','R','e','c','i','p','i','e','n', + 't','I','d','e','n','t','i','f','i','e','r','\0', + 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','-', + 'n','a','m','e','-','l','e','n','g','t','h','\0', + 'S','i','g','n','a','t','u','r','e','A','l','g','o','r','i','t', + 'h','m','I','d','e','n','t','i','f','i','e','r','\0', + 'S','u','b','j','e','c','t','C','e','r','t','D','i','s','t','r', + 'i','b','u','t','i','o','n','P','o','i','n','t','\0', + 'b','u','i','l','t','-','i','n','-','s','t','a','n','d','a','r', + 'd','-','a','t','t','r','i','b','u','t','e','s','\0', + 'u','b','-','c','o','u','n','t','r','y','-','n','a','m','e','-', + 'a','l','p','h','a','-','l','e','n','g','t','h','\0', + 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', + 'd','-','a','t','t','r','i','b','u','t','e','s','\0', + 'B','u','i','l','t','I','n','D','o','m','a','i','n','D','e','f', + 'i','n','e','d','A','t','t','r','i','b','u','t','e','\0', + 'B','u','i','l','t','I','n','D','o','m','a','i','n','D','e','f', + 'i','n','e','d','A','t','t','r','i','b','u','t','e','s','\0', + 'u','b','-','c','o','u','n','t','r','y','-','n','a','m','e','-', + 'n','u','m','e','r','i','c','-','l','e','n','g','t','h','\0', + 'u','b','-','g','e','n','e','r','a','t','i','o','n','-','q','u', + 'a','l','i','f','i','e','r','-','l','e','n','g','t','h','\0', + 'K','e','y','E','n','c','r','y','p','t','i','o','n','A','l','g', + 'o','r','i','t','h','m','I','d','e','n','t','i','f','i','e','r','\0', + 'M','e','s','s','a','g','e','A','u','t','h','e','n','t','i','c', + 'a','t','i','o','n','C','o','d','e','A','l','g','o','r','i','t', 'h','m','\0', - 'i','s','s','u','e','r','D','o','m','a','i','n','P','o','l','i', - 'c','y','\0', - 'a','f','f','i','l','i','a','t','i','o','n','C','h','a','n','g', - 'e','d','\0', - 'c','r','l','E','n','t','r','y','E','x','t','e','n','s','i','o', - 'n','s','\0', - 'T','e','r','m','i','n','a','l','I','d','e','n','t','i','f','i', - 'e','r','\0', - 'u','b','-','i','n','i','t','i','a','l','s','-','l','e','n','g', - 't','h','\0', - 'E','x','t','e','n','s','i','o','n','A','t','t','r','i','b','u', - 't','e','\0', - 'U','n','s','i','g','n','e','d','A','t','t','r','i','b','u','t', - 'e','s','\0', - 'U','s','e','r','K','e','y','i','n','g','M','a','t','e','r','i', - 'a','l','\0', - 'C','e','r','t','i','f','i','c','a','t','e','C','h','o','i','c', + 'b','u','i','l','t','-','i','n','-','d','o','m','a','i','n','-', + 'd','e','f','i','n','e','d','-','a','t','t','r','i','b','u','t', 'e','s','\0', - 'i','d','-','a','l','g','-','C','M','S','3','D','E','S','w','r', - 'a','p','\0', - 'P','o','l','i','c','y','I','n','f','o','r','m','a','t','i','o', - 'n','\0', - 'p','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', - 'd','\0', - 'P','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','I', - 'd','\0', - 'p','a','t','h','L','e','n','C','o','n','s','t','r','a','i','n', - 't','\0', - 'p','e','r','m','i','t','t','e','d','S','u','b','t','r','e','e', - 's','\0', - 'd','i','s','t','r','i','b','u','t','i','o','n','P','o','i','n', - 't','\0', - 'C','e','r','t','i','f','i','c','a','t','e','I','s','s','u','e', - 'r','\0', - 'P','r','i','v','a','t','e','D','o','m','a','i','n','N','a','m', - 'e','\0', - 'o','r','g','a','n','i','z','a','t','i','o','n','-','n','a','m', - 'e','\0', - 'u','b','-','s','u','r','n','a','m','e','-','l','e','n','g','t', - 'h','\0', - 'O','t','h','e','r','K','e','y','A','t','t','r','i','b','u','t', - 'e','\0', - 'A','u','t','h','e','n','t','i','c','a','t','e','d','D','a','t', - 'a','\0', - 'i','d','-','a','l','g','-','C','M','S','R','C','2','w','r','a', - 'p','\0', - 'i','d','-','c','t','-','c','o','n','t','e','n','t','I','n','f', - 'o','\0', - 'U','n','i','q','u','e','I','d','e','n','t','i','f','i','e','r','\0', - 's','u','b','j','e','c','t','P','u','b','l','i','c','K','e','y','\0', - 'd','i','g','i','t','a','l','S','i','g','n','a','t','u','r','e','\0', - 'd','a','t','a','E','n','c','i','p','h','e','r','m','e','n','t','\0', - 'p','o','l','i','c','y','I','d','e','n','t','i','f','i','e','r','\0', - 'p','o','l','i','c','y','Q','u','a','l','i','f','i','e','r','s','\0', - 'B','a','s','i','c','C','o','n','s','t','r','a','i','n','t','s','\0', - 'e','x','c','l','u','d','e','d','S','u','b','t','r','e','e','s','\0', - 'O','r','g','a','n','i','z','a','t','i','o','n','N','a','m','e','\0', - 'd','i','g','e','s','t','A','l','g','o','r','i','t','h','m','s','\0', - 'e','n','c','a','p','C','o','n','t','e','n','t','I','n','f','o','\0', - 'S','i','g','n','e','r','I','d','e','n','t','i','f','i','e','r','\0', - 'S','i','g','n','e','d','A','t','t','r','i','b','u','t','e','s','\0', - 'u','n','p','r','o','t','e','c','t','e','d','A','t','t','r','s','\0', - 'e','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t','\0', - 'E','n','c','r','y','p','t','e','d','C','o','n','t','e','n','t','\0', - 'K','E','K','R','e','c','i','p','i','e','n','t','I','n','f','o','\0', - 'U','n','a','u','t','h','A','t','t','r','i','b','u','t','e','s','\0', - 'C','o','u','n','t','e','r','s','i','g','n','a','t','u','r','e','\0', - 'i','d','-','d','s','a','-','w','i','t','h','-','s','h','a','1','\0', - 'd','h','-','p','u','b','l','i','c','-','n','u','m','b','e','r','\0', - 'K','e','y','W','r','a','p','A','l','g','o','r','i','t','h','m','\0', - 'R','C','2','w','r','a','p','P','a','r','a','m','e','t','e','r','\0', - 'i','d','-','e','n','v','e','l','o','p','e','d','D','a','t','a','\0', - 'i','d','-','e','n','c','r','y','p','t','e','d','D','a','t','a','\0', - 'i','d','-','m','e','s','s','a','g','e','D','i','g','e','s','t','\0', - 'j','o','i','n','t','-','i','s','o','-','c','c','i','t','t','\0', - 's','u','b','j','e','c','t','U','n','i','q','u','e','I','D','\0', - 'D','i','r','e','c','t','o','r','y','S','t','r','i','n','g','\0', - 'p','r','i','n','t','a','b','l','e','S','t','r','i','n','g','\0', - 'u','n','i','v','e','r','s','a','l','S','t','r','i','n','g','\0', - 'k','e','y','E','n','c','i','p','h','e','r','m','e','n','t','\0', - 'N','a','m','e','C','o','n','s','t','r','a','i','n','t','s','\0', - 'G','e','n','e','r','a','l','S','u','b','t','r','e','e','s','\0', - 'c','e','r','t','i','f','i','c','a','t','e','H','o','l','d','\0', - 'C','e','r','t','i','f','i','c','a','t','e','L','i','s','t','\0', - 'u','s','e','r','C','e','r','t','i','f','i','c','a','t','e','\0', - 'o','n','l','y','S','o','m','e','R','e','a','s','o','n','s','\0', - 'n','e','t','w','o','r','k','-','a','d','d','r','e','s','s','\0', - 'd','i','g','e','s','t','A','l','g','o','r','i','t','h','m','\0', - 'R','C','2','C','B','C','P','a','r','a','m','e','t','e','r','\0', - 'i','d','-','d','i','g','e','s','t','e','d','D','a','t','a','\0', - 't','b','s','C','e','r','t','i','f','i','c','a','t','e','\0', - 'T','B','S','C','e','r','t','i','f','i','c','a','t','e','\0', - 'i','s','s','u','e','r','U','n','i','q','u','e','I','D','\0', - 'A','t','t','r','i','b','u','t','e','V','a','l','u','e','\0', - 'n','o','n','R','e','p','u','d','i','a','t','i','o','n','\0', - 'S','u','b','j','e','c','t','A','l','t','N','a','m','e','\0', - 'G','e','n','e','r','a','l','S','u','b','t','r','e','e','\0', - 'T','e','s','t','I','d','e','n','t','i','f','i','e','r','\0', - 's','i','g','n','a','t','u','r','e','V','a','l','u','e','\0', - 'r','e','v','o','c','a','t','i','o','n','D','a','t','e','\0', - 'I','n','v','a','l','i','d','i','t','y','D','a','t','e','\0', - 'N','e','t','w','o','r','k','A','d','d','r','e','s','s','\0', - 'C','e','r','t','i','f','i','c','a','t','e','S','e','t','\0', - 'S','i','g','n','a','t','u','r','e','V','a','l','u','e','\0', - 'o','r','i','g','i','n','a','t','o','r','I','n','f','o','\0', - 'O','r','i','g','i','n','a','t','o','r','I','n','f','o','\0', - 'r','e','c','i','p','i','e','n','t','I','n','f','o','s','\0', - 'R','e','c','i','p','i','e','n','t','I','n','f','o','s','\0', - 'A','u','t','h','A','t','t','r','i','b','u','t','e','s','\0', - 'i','d','-','c','t','-','a','u','t','h','D','a','t','a','\0', - 'i','d','-','c','o','n','t','e','n','t','T','y','p','e','\0', - 'i','d','-','s','i','g','n','i','n','g','T','i','m','e','\0', - 'A','t','t','r','i','b','u','t','e','T','y','p','e','\0', - 't','e','l','e','t','e','x','S','t','r','i','n','g','\0', - 'k','e','y','I','d','e','n','t','i','f','i','e','r','\0', - 'd','i','r','e','c','t','o','r','y','N','a','m','e','\0', - 'B','i','o','m','e','t','r','i','c','D','a','t','a','\0', - 'k','e','y','C','o','m','p','r','o','m','i','s','e','\0', - 'c','r','l','E','x','t','e','n','s','i','o','n','s','\0', - 'r','e','m','o','v','e','F','r','o','m','C','R','L','\0', - 'p','e','r','s','o','n','a','l','-','n','a','m','e','\0', - 'x','1','2','1','-','d','c','c','-','c','o','d','e','\0', - 'u','n','s','i','g','n','e','d','A','t','t','r','s','\0', - 'E','n','v','e','l','o','p','e','d','D','a','t','a','\0', - 'o','r','i','g','i','n','a','t','o','r','K','e','y','\0', - 'K','E','K','I','d','e','n','t','i','f','i','e','r','\0', - 'E','n','c','r','y','p','t','e','d','D','a','t','a','\0', - 'M','e','s','s','a','g','e','D','i','g','e','s','t','\0', - 'r','s','a','E','n','c','r','y','p','t','i','o','n','\0', - 'i','d','-','s','i','g','n','e','d','D','a','t','a','\0', - 's','e','r','i','a','l','N','u','m','b','e','r','\0', - 'G','e','n','e','r','a','l','N','a','m','e','s','\0', - 'k','e','y','A','g','r','e','e','m','e','n','t','\0', - 'e','n','c','i','p','h','e','r','O','n','l','y','\0', - 'd','e','c','i','p','h','e','r','O','n','l','y','\0', - 'C','e','r','t','P','o','l','i','c','y','I','d','\0', - 'e','d','i','P','a','r','t','y','N','a','m','e','\0', - 'E','D','I','P','a','r','t','y','N','a','m','e','\0', - 'r','e','g','i','s','t','e','r','e','d','I','D','\0', - 'n','a','m','e','A','s','s','i','g','n','e','r','\0', - 'B','a','s','e','D','i','s','t','a','n','c','e','\0', - 'c','A','C','o','m','p','r','o','m','i','s','e','\0', - 'c','o','u','n','t','r','y','-','n','a','m','e','\0', - 'P','e','r','s','o','n','a','l','N','a','m','e','\0', - 'c','e','r','t','i','f','i','c','a','t','e','s','\0', - 'e','C','o','n','t','e','n','t','T','y','p','e','\0', - 'e','n','c','r','y','p','t','e','d','K','e','y','\0', - 'D','i','g','e','s','t','e','d','D','a','t','a','\0', - 'm','a','c','A','l','g','o','r','i','t','h','m','\0', - 'd','e','s','-','e','d','e','3','-','c','b','c','\0', - 'r','d','n','S','e','q','u','e','n','c','e','\0', - 'R','D','N','S','e','q','u','e','n','c','e','\0', - 'g','e','n','e','r','a','l','T','i','m','e','\0', - 'k','e','y','C','e','r','t','S','i','g','n','\0', - 'G','e','n','e','r','a','l','N','a','m','e','\0', - 'x','4','0','0','A','d','d','r','e','s','s','\0', - 'R','e','a','s','o','n','F','l','a','g','s','\0', - 't','b','s','C','e','r','t','L','i','s','t','\0', - 'T','B','S','C','e','r','t','L','i','s','t','\0', - 'u','n','s','p','e','c','i','f','i','e','d','\0', - 'i','n','d','i','r','e','c','t','C','R','L','\0', - 'C','o','u','n','t','r','y','N','a','m','e','\0', - 'X','1','2','1','A','d','d','r','e','s','s','\0', - 'm','e','m','b','e','r','-','b','o','d','y','\0', - 's','i','g','n','e','r','I','n','f','o','s','\0', - 'S','i','g','n','e','r','I','n','f','o','s','\0', - 'c','e','r','t','i','f','i','c','a','t','e','\0', - 'S','i','g','n','i','n','g','T','i','m','e','\0', - 'n','u','m','b','e','r','-','t','y','p','e','\0', - 'i','d','-','a','l','g','-','E','S','D','H','\0', - 'm','e','c','h','a','n','i','s','m','s','\0', - 'p','a','r','a','m','e','t','e','r','s','\0', - 'e','x','t','e','n','s','i','o','n','s','\0', - 'u','t','f','8','S','t','r','i','n','g','\0', - 'r','f','c','8','2','2','N','a','m','e','\0', - 's','u','p','e','r','s','e','d','e','d','\0', - 't','h','i','s','U','p','d','a','t','e','\0', - 'n','e','x','t','U','p','d','a','t','e','\0', - 'g','i','v','e','n','-','n','a','m','e','\0', - 'S','i','g','n','e','d','D','a','t','a','\0', - 'C','M','S','V','e','r','s','i','o','n','\0', - 'S','i','g','n','e','r','I','n','f','o','\0', - 'a','t','t','r','V','a','l','u','e','s','\0', - 'o','r','i','g','i','n','a','t','o','r','\0', - 't','e','l','e','t','r','u','s','t','\0', - 'a','l','g','o','r','i','t','h','m','\0', - 'b','m','p','S','t','r','i','n','g','\0', - 'n','o','t','B','e','f','o','r','e','\0', - 'E','x','t','e','n','s','i','o','n','\0', - 'e','x','t','n','V','a','l','u','e','\0', - 'o','t','h','e','r','N','a','m','e','\0', - 'O','t','h','e','r','N','a','m','e','\0', - 'O','R','A','d','d','r','e','s','s','\0', - 'i','P','A','d','d','r','e','s','s','\0', - 'p','a','r','t','y','N','a','m','e','\0', - 'S','k','i','p','C','e','r','t','s','\0', - 'c','R','L','I','s','s','u','e','r','\0', - 'C','R','L','R','e','a','s','o','n','\0', - 'c','R','L','N','u','m','b','e','r','\0', - 'p','r','i','n','t','a','b','l','e','\0', - 'p','u','b','l','i','c','K','e','y','\0', - 'k','e','y','A','t','t','r','I','d','\0', - 'a','n','s','i','-','x','9','4','2','\0', - 'h','M','A','C','-','S','H','A','1','\0', - 'i','n','t','e','r','n','e','t','\0', - 's','e','c','u','r','i','t','y','\0', - 'v','a','l','i','d','i','t','y','\0', - 'V','a','l','i','d','i','t','y','\0', - 'n','o','t','A','f','t','e','r','\0', - 'c','r','i','t','i','c','a','l','\0', - 'K','e','y','U','s','a','g','e','\0', - 'f','u','l','l','N','a','m','e','\0', - 'i','n','i','t','i','a','l','s','\0', - 'e','C','o','n','t','e','n','t','\0', - 'a','t','t','r','T','y','p','e','\0', - 'v','e','r','s','i','o','n','\0', - 's','u','b','j','e','c','t','\0', - 'm','a','x','S','i','z','e','\0', - 'u','t','c','T','i','m','e','\0', - 'c','R','L','S','i','g','n','\0', - 'd','N','S','N','a','m','e','\0', - 't','y','p','e','-','i','d','\0', - 'm','i','n','i','m','u','m','\0', - 'm','a','x','i','m','u','m','\0', - 'r','e','a','s','o','n','s','\0', - 'n','u','m','e','r','i','c','\0', - 's','u','r','n','a','m','e','\0', - 'm','o','d','u','l','e','s','\0', - 'c','o','n','t','e','n','t','\0', - 'k','e','y','A','t','t','r','\0', - 'r','c','2','-','c','b','c','\0', - 'i','d','-','d','a','t','a','\0', - 'T','M','T','T','v','2','\0', - 'i','s','s','u','e','r','\0', - 'v','a','l','u','e','s','\0', - 'e','x','t','n','I','D','\0', - 't','y','p','e','I','d','\0', - 'u','n','u','s','e','d','\0', - 'r','s','a','d','s','i','\0', - '1','1','3','5','4','9','\0', - 'p','k','c','s','-','9','\0', - 'r','K','e','y','I','d','\0', - 'd','i','g','e','s','t','\0', - 's','e','c','s','i','g','\0', - 'p','k','c','s','-','1','\0', - 'i','d','-','c','e','\0', - 's','m','i','m','e','\0', - 'c','e','r','t','s','\0', - 'k','e','k','r','i','\0', - 'o','t','h','e','r','\0', - 'k','e','k','i','d','\0', - 's','h','a','-','1','\0', - 'x','9','-','5','7','\0', - '1','0','0','4','0','\0', - '1','0','0','4','6','\0', - 'p','k','c','s','7','\0', - 'p','k','c','s','9','\0', - 'b','a','s','e','\0', - 'p','k','c','s','\0', - 'c','r','l','s','\0', - 'k','t','r','i','\0', - 'k','a','r','i','\0', - 'x','9','c','m','\0', - 'i','s','o','\0', - 'd','o','d','\0', - 'f','o','o','\0', - 'M','A','X','\0', - '8','4','0','\0', - 'c','m','s','\0', - 's','i','d','\0', - 'r','i','d','\0', - 'u','k','m','\0', - 'm','a','c','\0', - 'o','i','w','\0', - 'm','d','5','\0', - 'a','l','g','\0', - '1','7','\0', - 'd','s','\0', - '2','9','\0', - 'v','1','\0', - 'v','3','\0', - 'c','A','\0', - 'u','s','\0', - '1','6','\0', - 'v','0','\0', - 'v','4','\0', - '1','4','\0', - '2','6','\0', - 'I','V','\0', - 'i','v','\0', - '8','\0', + 'u','b','-','o','r','g','a','n','i','z','a','t','i','o','n','a', + 'l','-','u','n','i','t','-','n','a','m','e','-','l','e','n','g', + 't','h','\0', + 'C','o','n','t','e','n','t','E','n','c','r','y','p','t','i','o', + 'n','A','l','g','o','r','i','t','h','m','I','d','e','n','t','i', + 'f','i','e','r','\0', + 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', + 'd','-','a','t','t','r','i','b','u','t','e','-','t','y','p','e', + '-','l','e','n','g','t','h','\0', + 'u','b','-','d','o','m','a','i','n','-','d','e','f','i','n','e', + 'd','-','a','t','t','r','i','b','u','t','e','-','v','a','l','u', + 'e','-','l','e','n','g','t','h','\0', '\0' }; -/* (371 strings) */ +/* (402 strings) */ const static_asn * diff --git a/src/ber-decoder.c b/src/ber-decoder.c index 20a91b1..755c1d7 100644 --- a/src/ber-decoder.c +++ b/src/ber-decoder.c @@ -483,12 +483,26 @@ static AsnNode find_anchor_node (AsnNode root, const struct tag_info *ti) { AsnNode node = root; + AsnNode n; while (node) { - if (cmp_tag (node, ti)) + if (node->type == TYPE_CHOICE) { - return node; /* found */ + for (n = node->down; n; n = n->right) + { + if (cmp_tag (n, ti)) + { + return n; /* found */ + } + } + } + else + { + if (cmp_tag (node, ti)) + { + return node; /* found */ + } } if (node->down) @@ -854,6 +868,9 @@ decoder_next (BerDecoder d) d->first_tag_seen = 1; if (ti.tag == TYPE_SEQUENCE && ti.length && !ti.ndef) d->outer_sequence_length = ti.length; + else if (ti.class == CLASS_CONTEXT && ti.is_constructed + && ti.length && !ti.ndef) + d->outer_sequence_length = ti.length; } /* Store stuff in the image buffer. */ @@ -933,6 +950,7 @@ decoder_next (BerDecoder d) if (debug) fprintf (stderr, " ANY"); ds->cur.in_any = 1; + /* FALLTHROUGH */ case 3: /* match */ case 5: /* end tag */ if (debug) diff --git a/src/ber-help.c b/src/ber-help.c index 87109f3..1b72bf0 100644 --- a/src/ber-help.c +++ b/src/ber-help.c @@ -36,6 +36,7 @@ #include "util.h" #include "asn1-func.h" /* need some constants */ +#include "convert.h" #include "ber-help.h" /* Fixme: The parser functions should check that primitive types don't @@ -59,7 +60,7 @@ read_byte (ksba_reader_t reader) static int premature_eof (struct tag_info *ti) { - /* Note: We do an strcmp on this string at othyer places. */ + /* Note: We do an strcmp on this string at other places. */ ti->err_string = "premature EOF"; return gpg_error (GPG_ERR_BAD_BER); } @@ -188,10 +189,13 @@ _ksba_ber_read_tl (ksba_reader_t reader, struct tag_info *ti) return 0; } -/* - Parse the buffer at the address BUFFER which of SIZE and return - the tag and the length part from the TLV triplet. Update BUFFER - and SIZE on success. */ + +/* Parse the buffer at the address BUFFER which of SIZE and return the + * tag and the length part from the TLV triplet. Update BUFFER and + * SIZE on success. Note that this function will never return + * GPG_ERR_INV_OBJ so that this error code can be used by the parse_foo + * functions below to return an error for unexpected tags and the + * caller is able to backoff in that case. */ gpg_error_t _ksba_ber_parse_tl (unsigned char const **buffer, size_t *size, struct tag_info *ti) @@ -475,3 +479,234 @@ _ksba_ber_count_tl (unsigned long tag, return buflen; } + + +gpg_error_t +_ksba_parse_sequence (unsigned char const **buf, size_t *len, + struct tag_info *ti) +{ + gpg_error_t err; + + err = _ksba_ber_parse_tl (buf, len, ti); + if (err) + ; + else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_SEQUENCE + && ti->is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (ti->length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + return err; +} + + +/* Note that this function returns GPG_ERR_FALSE if the TLV is valid + * but the tag does not match. The caller may thus check for this + * error code and compare against other tag values. */ +gpg_error_t +_ksba_parse_context_tag (unsigned char const **buf, size_t *len, + struct tag_info *ti, int tag) +{ + gpg_error_t err; + + err = _ksba_ber_parse_tl (buf, len, ti); + if (err) + ; + else if (!(ti->class == CLASS_CONTEXT && ti->is_constructed)) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (ti->length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + else if (ti->tag != tag) + err = gpg_error (GPG_ERR_FALSE); + + return err; +} + + +gpg_error_t +_ksba_parse_enumerated (unsigned char const **buf, size_t *len, + struct tag_info *ti, size_t maxlen) +{ + gpg_error_t err; + + err = _ksba_ber_parse_tl (buf, len, ti); + if (err) + ; + else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_ENUMERATED + && !ti->is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (!ti->length) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (maxlen && ti->length > maxlen) + err = gpg_error (GPG_ERR_TOO_LARGE); + else if (ti->length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + + return err; +} + + +gpg_error_t +_ksba_parse_integer (unsigned char const **buf, size_t *len, + struct tag_info *ti) +{ + gpg_error_t err; + + err = _ksba_ber_parse_tl (buf, len, ti); + if (err) + ; + else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_INTEGER + && !ti->is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (!ti->length) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (ti->length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + + return err; +} + + +gpg_error_t +_ksba_parse_octet_string (unsigned char const **buf, size_t *len, + struct tag_info *ti) +{ + gpg_error_t err; + + err= _ksba_ber_parse_tl (buf, len, ti); + if (err) + ; + else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_OCTET_STRING + && !ti->is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (!ti->length) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (ti->length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + + return err; +} + + +/* Note that R_BOOL will only be set if a value has been given. Thus + the caller should set it to the default value prior to calling this + function. Obviously no call to parse_skip is required after + calling this function. */ +gpg_error_t +_ksba_parse_optional_boolean (unsigned char const **buf, size_t *len, + int *r_bool) +{ + gpg_error_t err; + struct tag_info ti; + + err = _ksba_ber_parse_tl (buf, len, &ti); + if (err) + ; + else if (!ti.length) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (ti.length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + else if (ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_BOOLEAN + && !ti.is_constructed) + { + if (ti.length != 1) + err = gpg_error (GPG_ERR_BAD_BER); + *r_bool = !!**buf; + parse_skip (buf, len, &ti); + } + else + { /* Undo the read. */ + *buf -= ti.nhdr; + *len += ti.nhdr; + } + + return err; +} + + +/* Parse an optional Null tag. Ir R_SEEN is not NULL it is set to + * true if a NULL tag was encountered. */ +gpg_error_t +_ksba_parse_optional_null (unsigned char const **buf, size_t *len, + int *r_seen) +{ + gpg_error_t err; + struct tag_info ti; + + if (r_seen) + *r_seen = 0; + err = _ksba_ber_parse_tl (buf, len, &ti); + if (err) + ; + else if (ti.length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + else if (ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_NULL + && !ti.is_constructed) + { + if (ti.length) + err = gpg_error (GPG_ERR_BAD_BER); + if (r_seen) + *r_seen = 1; + parse_skip (buf, len, &ti); + } + else + { /* Undo the read. */ + *buf -= ti.nhdr; + *len += ti.nhdr; + } + + return err; +} + + + +gpg_error_t +_ksba_parse_object_id_into_str (unsigned char const **buf, size_t *len, + char **oid) +{ + struct tag_info ti; + gpg_error_t err; + + *oid = NULL; + err = _ksba_ber_parse_tl (buf, len, &ti); + if (err) + ; + else if (!(ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_OBJECT_ID + && !ti.is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (!ti.length) + err = gpg_error (GPG_ERR_TOO_SHORT); + else if (ti.length > *len) + err = gpg_error (GPG_ERR_BAD_BER); + else if (!(*oid = ksba_oid_to_str (*buf, ti.length))) + err = gpg_error_from_syserror (); + else + { + *buf += ti.length; + *len -= ti.length; + } + return err; +} + + +gpg_error_t +_ksba_parse_asntime_into_isotime (unsigned char const **buf, size_t *len, + ksba_isotime_t isotime) +{ + struct tag_info ti; + gpg_error_t err; + + err = _ksba_ber_parse_tl (buf, len, &ti); + if (err) + ; + else if ( !(ti.class == CLASS_UNIVERSAL + && (ti.tag == TYPE_UTC_TIME || ti.tag == TYPE_GENERALIZED_TIME) + && !ti.is_constructed) ) + err = gpg_error (GPG_ERR_INV_OBJ); + else if (ti.length > *len) + err = gpg_error (GPG_ERR_INV_BER); + else if (!(err = _ksba_asntime_to_iso (*buf, ti.length, + ti.tag == TYPE_UTC_TIME, isotime))) + parse_skip (buf, len, &ti); + + return err; +} diff --git a/src/ber-help.h b/src/ber-help.h index 286347d..8223a90 100644 --- a/src/ber-help.h +++ b/src/ber-help.h @@ -64,4 +64,64 @@ size_t _ksba_ber_count_tl (unsigned long tag, unsigned long length); +static inline void +parse_skip (unsigned char const **buf, size_t *len, struct tag_info *ti) +{ + if (ti->length) + { + assert (ti->length <= *len); + *len -= ti->length; + *buf += ti->length; + } +} + +gpg_error_t _ksba_parse_sequence (unsigned char const **buf, size_t *len, + struct tag_info *ti); +#define parse_sequence(buf,len,ti) \ + _ksba_parse_sequence ((buf),(len),(ti)) + +gpg_error_t _ksba_parse_context_tag (unsigned char const **buf, size_t *len, + struct tag_info *ti, int tag); +#define parse_context_tag(buf,len,ti,tag) \ + _ksba_parse_context_tag ((buf),(len),(ti),(tag)) + +gpg_error_t _ksba_parse_enumerated (unsigned char const **buf, size_t *len, + struct tag_info *ti, size_t maxlen); +#define parse_enumerated(buf,len,ti,maxlen) \ + _ksba_parse_enumerated ((buf),(len),(ti),(maxlen)) + +gpg_error_t _ksba_parse_integer (unsigned char const **buf, size_t *len, + struct tag_info *ti); +#define parse_integer(buf,len,ti) \ + _ksba_parse_integer ((buf),(len),(ti)) + +gpg_error_t _ksba_parse_octet_string (unsigned char const **buf, size_t *len, + struct tag_info *ti); +#define parse_octet_string(buf,len,ti) \ + _ksba_parse_octet_string ((buf),(len),(ti)) + +gpg_error_t _ksba_parse_optional_boolean (unsigned char const **buf, + size_t *len, int *r_bool); +#define parse_optional_boolean(buf,len,r_bool) \ + _ksba_parse_optional_boolean ((buf),(len),(r_bool)) + +gpg_error_t _ksba_parse_optional_null (unsigned char const **buf, size_t *len, + int *r_seen); +#define parse_optional_null(buf,len,r_seen) \ + _ksba_parse_optional_null ((buf),(len),(r_seen)) + +gpg_error_t _ksba_parse_object_id_into_str (unsigned char const **buf, + size_t *len, char **oid); +#define parse_object_id_into_str(buf,len,r_oid) \ + _ksba_parse_object_id_into_str ((buf),(len),(r_oid)) + + +gpg_error_t _ksba_parse_asntime_into_isotime (unsigned char const **buf, + size_t *len, + ksba_isotime_t isotime); +#define parse_asntime_into_isotime(buf,len,isotime) \ + _ksba_parse_asntime_into_isotime ((buf),(len),(isotime)) + + + #endif /*BER_HELP_H*/ @@ -426,8 +426,11 @@ ksba_cert_hash (ksba_cert_t cert, int what, * ksba_cert_get_digest_algo: * @cert: Initialized certificate object * - * Figure out the the digest algorithm used for the signature and - * return its OID + * Figure out the digest algorithm used for the signature and return + * its OID. Note that in the case of rsaPSS the returned value is the + * OID of rsaPSS (1.2.840.113549.1.1.10) and not the hash algorithm to + * use. The hash algorithm needs to be extracted from the S-expression + * returned by ksba_cert_get_sig_val. * * This function is intended as a helper for the ksba_cert_hash(). * @@ -543,8 +546,32 @@ _ksba_cert_get_serial_ptr (ksba_cert_t cert, if (!n || n->off == -1) return gpg_error (GPG_ERR_NO_VALUE); - *ptr = cert->image + n->off + n->nhdr; - *length = n->len; + *ptr = cert->image + n->off; + *length = n->nhdr + n->len; + return 0; +} + + + +/* Return a pointer to the DER encoding of the issuer's DN in CERT in + PTR and the length of that object in LENGTH. */ +gpg_error_t +_ksba_cert_get_issuer_dn_ptr (ksba_cert_t cert, + unsigned char const **ptr, size_t *length) +{ + asn_node_t n; + + if (!cert || !cert->initialized || !ptr || !length) + return gpg_error (GPG_ERR_INV_VALUE); + + n = _ksba_asn_find_node (cert->root, "Certificate.tbsCertificate.issuer"); + if (!n || !n->down) + return gpg_error (GPG_ERR_NO_VALUE); /* oops - should be there */ + n = n->down; /* dereference the choice node */ + if (n->off == -1) + return gpg_error (GPG_ERR_NO_VALUE); + *ptr = cert->image + n->off; + *length = n->nhdr + n->len; return 0; } @@ -1999,7 +2026,7 @@ get_simple_octet_string_ext (ksba_cert_t cert, const char *oid, /* Return the subjectKeyIdentifier extension as a simple allocated S-expression at the address of R_KEYID. 0 is returned on success, GPG_ERR_NO_DATA if no such extension is available or any other - error code. If R_CRIT is not passed as NULL, the criticla flag of + error code. If R_CRIT is not passed as NULL, the critical flag of this is extension is stored there. */ gpg_error_t ksba_cert_get_subj_key_id (ksba_cert_t cert, int *r_crit, ksba_sexp_t *r_keyid) @@ -2141,7 +2168,7 @@ get_info_access (ksba_cert_t cert, int idx, int mode, R_METHOD and R_LOCATION must be released by the caller unless the function returned an error; the function will however make sure that R_METHOD and R_LOCATION will point to NULL if the function - returns an error. See RFC 2459, section 4.2.2.1 */ + returns an error. See RFC 5280, section 4.2.2.1 */ gpg_error_t ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx, char **r_method, ksba_name_t *r_location) @@ -2151,6 +2178,7 @@ ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx, return get_info_access (cert, idx, 0, r_method, r_location); } + /* Return the subjectInfoAccess attributes. IDX should be iterated starting from 0 until the function returns GPG_ERR_EOF. R_METHOD returns an allocated string with the OID of one item and R_LOCATION @@ -2158,7 +2186,7 @@ ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx, R_METHOD and R_LOCATION must be released by the caller unless the function returned an error; the function will however make sure that R_METHOD and R_LOCATION will point to NULL if the function - returns an error. See RFC 2459, section 4.2.2.2 */ + returns an error. See RFC 5280, section 4.2.2.2 */ gpg_error_t ksba_cert_get_subject_info_access (ksba_cert_t cert, int idx, char **r_method, ksba_name_t *r_location) @@ -111,6 +111,9 @@ int _ksba_cert_cmp (ksba_cert_t a, ksba_cert_t b); gpg_error_t _ksba_cert_get_serial_ptr (ksba_cert_t cert, unsigned char const **ptr, size_t *length); +gpg_error_t _ksba_cert_get_issuer_dn_ptr (ksba_cert_t cert, + unsigned char const **ptr, + size_t *length); gpg_error_t _ksba_cert_get_subject_dn_ptr (ksba_cert_t cert, unsigned char const **ptr, size_t *length); diff --git a/src/certreq.c b/src/certreq.c index 46fca44..9fba0c8 100644 --- a/src/certreq.c +++ b/src/certreq.c @@ -42,11 +42,81 @@ #include "keyinfo.h" #include "der-encoder.h" #include "ber-help.h" +#include "sexp-parse.h" #include "certreq.h" static const char oidstr_subjectAltName[] = "2.5.29.17"; static const char oidstr_extensionReq[] = "1.2.840.113549.1.9.14"; +#if 0 /* Set to 1 to use this debug helper. */ +static void +log_sexp (const char *text, ksba_const_sexp_t p) +{ + int level = 0; + + gpgrt_log_debug ("%s: ", text); + if (!p) + gpgrt_log_printf ("[none]"); + else + { + for (;;) + { + if (*p == '(') + { + gpgrt_log_printf ("%c", *p); + p++; + level++; + } + else if (*p == ')') + { + gpgrt_log_printf ("%c", *p); + p++; + if (--level <= 0 ) + return; + } + else if (!digitp (p)) + { + gpgrt_log_printf ("[invalid s-exp]"); + return; + } + else + { + char *endp; + const unsigned char *s; + unsigned long len, n; + + len = strtoul (p, &endp, 10); + p = endp; + if (*p != ':') + { + gpgrt_log_printf ("[invalid s-exp]"); + return; + } + p++; + for (s=p,n=0; n < len; n++, s++) + if ( !((*s >= 'a' && *s <= 'z') + || (*s >= 'A' && *s <= 'Z') + || (*s >= '0' && *s <= '9') + || *s == '-' || *s == '.')) + break; + if (n < len) + { + gpgrt_log_printf ("#"); + for (n=0; n < len; n++, p++) + gpgrt_log_printf ("%02X", *p); + gpgrt_log_printf ("#"); + } + else + { + for (n=0; n < len; n++, p++) + gpgrt_log_printf ("%c", *p); + } + } + } + } + gpgrt_log_printf ("\n"); +} +#endif /* debug helper */ /** @@ -215,8 +285,8 @@ ksba_certreq_set_siginfo (ksba_certreq_t cr, ksba_const_sexp_t siginfo) xfree (cr->x509.siginfo.der); cr->x509.siginfo.der = NULL; - return _ksba_algoinfo_from_sexp (siginfo, &cr->x509.siginfo.der, - &cr->x509.siginfo.derlen); + return _ksba_keyinfo_from_sexp (siginfo, 1, &cr->x509.siginfo.der, + &cr->x509.siginfo.derlen); } @@ -350,9 +420,10 @@ ksba_certreq_set_public_key (ksba_certreq_t cr, ksba_const_sexp_t key) { if (!cr) return gpg_error (GPG_ERR_INV_VALUE); + xfree (cr->key.der); cr->key.der = NULL; - return _ksba_keyinfo_from_sexp (key, &cr->key.der, &cr->key.derlen); + return _ksba_keyinfo_from_sexp (key, 0, &cr->key.der, &cr->key.derlen); } @@ -406,8 +477,10 @@ ksba_certreq_add_extension (ksba_certreq_t cr, gpg_error_t ksba_certreq_set_sig_val (ksba_certreq_t cr, ksba_const_sexp_t sigval) { - const char *s, *endp; - unsigned long n; + const unsigned char *s, *saved; + char *buf = NULL; + unsigned long n, len; + int pass, nparam; if (!cr) return gpg_error (GPG_ERR_INV_VALUE); @@ -417,24 +490,17 @@ ksba_certreq_set_sig_val (ksba_certreq_t cr, ksba_const_sexp_t sigval) return gpg_error (GPG_ERR_INV_SEXP); s++; - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s!=':') - return gpg_error (GPG_ERR_INV_SEXP); /* we don't allow empty lengths */ - s++; - if (n != 7 || memcmp (s, "sig-val", 7)) + if (!(n = snext (&s))) + return gpg_error (GPG_ERR_INV_SEXP); + if (!smatch (&s, 7, "sig-val")) return gpg_error (GPG_ERR_UNKNOWN_SEXP); - s += 7; if (*s != '(') return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); s++; /* break out the algorithm ID */ - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); /* we don't allow empty lengths */ - s++; + if (!(n = snext (&s))) + return gpg_error (GPG_ERR_INV_SEXP); xfree (cr->sig_val.algo); if (n==3 && s[0] == 'r' && s[1] == 's' && s[2] == 'a') { /* kludge to allow "rsa" to be passed as algorithm name */ @@ -449,45 +515,111 @@ ksba_certreq_set_sig_val (ksba_certreq_t cr, ksba_const_sexp_t sigval) return gpg_error (GPG_ERR_ENOMEM); memcpy (cr->sig_val.algo, s, n); cr->sig_val.algo[n] = 0; + if (!memcmp (s, "eddsa", 5)) + cr->sig_val.is_ecc = 2; } s += n; - /* And now the values - FIXME: For now we only support one */ - /* fixme: start loop */ - if (*s != '(') - return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); - s++; - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - s += n; /* ignore the name of the parameter */ + if (cr->sig_val.is_ecc == 2 + || !strcmp (cr->sig_val.algo, "1.3.101.112") /* Ed25519 */ + || !strcmp (cr->sig_val.algo, "1.3.101.113")) /* Ed448 */ + cr->sig_val.is_ecc = 2; + else if (!strcmp (cr->sig_val.algo, "1.2.840.10045.4.1") /* with-sha1 */ + || !strcmp (cr->sig_val.algo, "1.2.840.10045.4.3.1") /* with-sha224 */ + || !strcmp (cr->sig_val.algo, "1.2.840.10045.4.3.2") /* with-sha256 */ + || !strcmp (cr->sig_val.algo, "1.2.840.10045.4.3.3") /* with-sha384 */ + || !strcmp (cr->sig_val.algo, "1.2.840.10045.4.3.4"))/* with-sha512 */ + cr->sig_val.is_ecc = 1; + else + cr->sig_val.is_ecc = 0; + + /* And now the values. + * + * If there is only one value, the signature is simply + * that value. Otherwise, the signature is a DER-encoded + * SEQUENCE of INTEGERs representing the different values. + * + * We need three passes over the values: + * - first pass is to get the number of values (nparam); + * - second pass is to compute the total length (len); + * - third pass is to build the final signature. */ + for (pass = 1, nparam = len = 0, saved = s; pass < 4; pass++) + { + s = saved; - if (!digitp(s)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* but may also be an invalid one */ - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - if (n > 1 && !*s) - { /* We might have a leading zero due to the way we encode - MPIs - this zero should not go into the BIT STRING. */ - s++; - n--; + if (pass == 3) + { + size_t needed = len; + if (cr->sig_val.is_ecc != 2 && nparam > 1) + needed += _ksba_ber_count_tl (TYPE_SEQUENCE, CLASS_UNIVERSAL, + 1, len); + + xfree (cr->sig_val.value); + cr->sig_val.value = xtrymalloc (needed); + if (!cr->sig_val.value) + return gpg_error (GPG_ERR_ENOMEM); + cr->sig_val.valuelen = needed; + buf = cr->sig_val.value; + + if (cr->sig_val.is_ecc != 2 && nparam > 1) + buf += _ksba_ber_encode_tl (buf, TYPE_SEQUENCE, + CLASS_UNIVERSAL, 1, len); + } + + while (*s != ')') + { + if (*s != '(') + return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); + s++; + if (!(n = snext (&s))) + return gpg_error (GPG_ERR_INV_SEXP); + s += n; /* Ignore the name of the parameter. */ + + if (!digitp (s)) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + if (!(n = snext (&s))) + return gpg_error (GPG_ERR_INV_SEXP); + + if (pass == 1) + nparam++; + else if (pass == 2) + { + if (cr->sig_val.is_ecc == 2 || nparam == 1) + len += n; + else + len += _ksba_ber_count_tl (TYPE_INTEGER, CLASS_UNIVERSAL, 0, + *s >= 0x80? n + 1 : n) + + (*s >= 0x80? n + 1 : n); + } + else if (pass == 3) + { + if (cr->sig_val.is_ecc == 2 || nparam == 1) + { + memcpy (buf, s, n); + buf += n; + } + else + { + if (*s >= 0x80) + { /* Add leading zero byte. */ + buf += _ksba_ber_encode_tl (buf, TYPE_INTEGER, + CLASS_UNIVERSAL, 0, n + 1); + *buf++ = 0; + } + else + buf += _ksba_ber_encode_tl (buf, TYPE_INTEGER, + CLASS_UNIVERSAL, 0, n); + memcpy (buf, s, n); + buf += n; + } + } + + s += n; + if (*s != ')') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); + s++; + } } - xfree (cr->sig_val.value); - cr->sig_val.value = xtrymalloc (n); - if (!cr->sig_val.value) - return gpg_error (GPG_ERR_ENOMEM); - memcpy (cr->sig_val.value, s, n); - cr->sig_val.valuelen = n; - s += n; - if ( *s != ')') - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* but may also be an invalid one */ - s++; - /* fixme: end loop over parameters */ /* we need 2 closing parenthesis */ if ( *s != ')' || s[1] != ')') @@ -915,83 +1047,63 @@ static gpg_error_t sign_and_write (ksba_certreq_t cr) { gpg_error_t err; - ksba_writer_t writer; - void *value = NULL; + ksba_der_t dbld; + unsigned char *value = NULL; size_t valuelen; - err = ksba_writer_new (&writer); - if (err) - goto leave; - err = ksba_writer_set_mem (writer, 2048); - if (err) - goto leave; + dbld = _ksba_der_builder_new (0); + if (!dbld) + { + err = gpg_error_from_syserror (); + goto leave; + } + + /* Start outer sequence. */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); - /* store the cri */ + /* Store the cri */ if (!cr->cri.der) { err = gpg_error (GPG_ERR_MISSING_VALUE); goto leave; } - err = ksba_writer_write (writer, cr->cri.der, cr->cri.derlen); - if (err) - goto leave; + _ksba_der_add_der (dbld, cr->cri.der, cr->cri.derlen); - /* store the signatureAlgorithm */ + /* Store the signatureAlgorithm */ if (!cr->sig_val.algo) return gpg_error (GPG_ERR_MISSING_VALUE); - err = _ksba_der_write_algorithm_identifier (writer, - cr->sig_val.algo, NULL, 0); - if (err) - goto leave; + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + _ksba_der_add_oid (dbld, cr->sig_val.algo); + if (!cr->sig_val.is_ecc) + _ksba_der_add_ptr (dbld, 0, TYPE_NULL, NULL, 0); + _ksba_der_add_end (dbld); - /* write the signature */ - err = _ksba_ber_write_tl (writer, TYPE_BIT_STRING, CLASS_UNIVERSAL, 0, - 1 + cr->sig_val.valuelen); - if (!err) - err = ksba_writer_write (writer, "", 1); - if (!err) - err = ksba_writer_write (writer, cr->sig_val.value, cr->sig_val.valuelen); - if (err) - goto leave; + /* Write the signature */ + _ksba_der_add_bts (dbld, cr->sig_val.value, cr->sig_val.valuelen, 0); - /* pack it into the outer sequence */ - value = ksba_writer_snatch_mem (writer, &valuelen); - if (!value) - { - err = gpg_error (GPG_ERR_ENOMEM); - goto leave; - } - err = ksba_writer_set_mem (writer, valuelen+10); - if (err) - goto leave; - /* write outer sequence */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, - 1, valuelen); - if (!err) - err = ksba_writer_write (writer, value, valuelen); + /* End outer sequence. */ + _ksba_der_add_end (dbld); + + /* and finally write the result */ + err = _ksba_der_builder_get (dbld, &value, &valuelen); if (err) goto leave; - /* and finally write the result */ - xfree (value); - value = ksba_writer_snatch_mem (writer, &valuelen); - if (!value) - err = gpg_error (GPG_ERR_ENOMEM); - else if (!cr->writer) + if (!cr->writer) err = gpg_error (GPG_ERR_MISSING_ACTION); else err = ksba_writer_write (cr->writer, value, valuelen); leave: - ksba_writer_release (writer); + ksba_der_release (dbld); xfree (value); return err; } -/* The main function to build a certificate request. It used used in - a loop so allow for interaction between the function and the caller */ +/* The main function to build a certificate request. It is used in a + * loop to allow for interaction between the function and the caller */ gpg_error_t ksba_certreq_build (ksba_certreq_t cr, ksba_stop_reason_t *r_stopreason) { diff --git a/src/certreq.h b/src/certreq.h index 43388b6..2a9503c 100644 --- a/src/certreq.h +++ b/src/certreq.h @@ -111,6 +111,7 @@ struct ksba_certreq_s struct { char *algo; + int is_ecc; /* 1 = plain ecc, 2 = EdDSA */ unsigned char *value; size_t valuelen; } sig_val; diff --git a/src/cms-parser.c b/src/cms-parser.c index e4da08c..b0ba8ee 100644 --- a/src/cms-parser.c +++ b/src/cms-parser.c @@ -823,14 +823,14 @@ _ksba_cms_parse_enveloped_data_part_1 (ksba_cms_t cms) gpg_error_t err; int env_data_ndef; unsigned long env_data_len; - int encr_cont_ndef; - unsigned long encr_cont_len; - int has_content; + int encr_cont_ndef = 0; + unsigned long encr_cont_len = 0; + int has_content = 0; unsigned long off, len; char *cont_oid = NULL; char *algo_oid = NULL; char *algo_parm = NULL; - size_t algo_parmlen; + size_t algo_parmlen = 0; struct value_tree_s *vt, **vtend; /* get the version */ @@ -851,11 +851,17 @@ _ksba_cms_parse_enveloped_data_part_1 (ksba_cms_t cms) return gpg_error (GPG_ERR_UNSUPPORTED_CMS_OBJ); } - /* Next one is the SET OF recipientInfos */ + /* Next one is the SET OF RecipientInfo: + * RecipientInfo ::= CHOICE { + * ktri KeyTransRecipientInfo, + * kari [1] KeyAgreeRecipientInfo, + * kekri [2] KEKRecipientInfo + * } */ if ( !(ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_SET && ti.is_constructed)) return gpg_error (GPG_ERR_INV_CMS_OBJ); + vtend = &cms->recp_info; if (ti.ndef) { @@ -881,7 +887,7 @@ _ksba_cms_parse_enveloped_data_part_1 (ksba_cms_t cms) err = create_and_run_decoder (cms->reader, - "CryptographicMessageSyntax.KeyTransRecipientInfo", + "CryptographicMessageSyntax.RecipientInfo", BER_DECODER_FLAG_FAST_STOP, &vt->root, &vt->image, &vt->imagelen); if (err) @@ -907,8 +913,8 @@ _ksba_cms_parse_enveloped_data_part_1 (ksba_cms_t cms) err = create_and_run_decoder (cms->reader, - "CryptographicMessageSyntax.KeyTransRecipientInfo", - 0, + "CryptographicMessageSyntax.RecipientInfo", + BER_DECODER_FLAG_FAST_STOP, &vt->root, &vt->image, &vt->imagelen); if (err) { @@ -1,5 +1,5 @@ /* cms.c - cryptographic message syntax main functions - * Copyright (C) 2001, 2003, 2004, 2008, 2012 g10 Code GmbH + * Copyright (C) 2001, 2003, 2004, 2008, 2012, 2020 g10 Code GmbH * * This file is part of KSBA. * @@ -28,6 +28,13 @@ * if not, see <http://www.gnu.org/licenses/>. */ +/* References: + * RFC-5652 := Cryptographic Message Syntax (CMS) (aka STD0070) + * SPHINX := CMS profile developed by the German BSI. + * (see also https://lwn.net/2001/1011/a/german-smime.php3) + * PKCS#7 := Original specification of CMS + */ + #include <config.h> #include <stdio.h> #include <stdlib.h> @@ -43,7 +50,9 @@ #include "der-encoder.h" #include "ber-help.h" #include "sexp-parse.h" -#include "cert.h" /* need to access cert->root and cert->image */ +#include "cert.h" +#include "der-builder.h" + static gpg_error_t ct_parse_data (ksba_cms_t cms); static gpg_error_t ct_parse_signed_data (ksba_cms_t cms); @@ -73,6 +82,8 @@ static struct { { "1.2.840.113549.1.7.6", KSBA_CT_ENCRYPTED_DATA, ct_parse_encrypted_data, ct_build_encrypted_data }, { "1.2.840.113549.1.9.16.1.2", KSBA_CT_AUTH_DATA }, + { "1.3.6.1.4.1.311.2.1.4", KSBA_CT_SPC_IND_DATA_CTX, + ct_parse_data , ct_build_data }, { NULL } }; @@ -87,7 +98,78 @@ static const char oid_signingTime[9] = "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x05"; static const char oidstr_smimeCapabilities[] = "1.2.840.113549.1.9.15"; + +#if 0 /* Set to 1 to use this debug helper. */ +static void +log_sexp (const char *text, ksba_const_sexp_t p) +{ + int level = 0; + + gpgrt_log_debug ("%s: ", text); + if (!p) + gpgrt_log_printf ("[none]"); + else + { + for (;;) + { + if (*p == '(') + { + gpgrt_log_printf ("%c", *p); + p++; + level++; + } + else if (*p == ')') + { + gpgrt_log_printf ("%c", *p); + p++; + if (--level <= 0 ) + return; + } + else if (!digitp (p)) + { + gpgrt_log_printf ("[invalid s-exp]"); + return; + } + else + { + char *endp; + const unsigned char *s; + unsigned long len, n; + + len = strtoul (p, &endp, 10); + p = endp; + if (*p != ':') + { + gpgrt_log_printf ("[invalid s-exp]"); + return; + } + p++; + for (s=p,n=0; n < len; n++, s++) + if ( !((*s >= 'a' && *s <= 'z') + || (*s >= 'A' && *s <= 'Z') + || (*s >= '0' && *s <= '9') + || *s == '-' || *s == '.')) + break; + if (n < len) + { + gpgrt_log_printf ("#"); + for (n=0; n < len; n++, p++) + gpgrt_log_printf ("%02X", *p); + gpgrt_log_printf ("#"); + } + else + { + for (n=0; n < len; n++, p++) + gpgrt_log_printf ("%c", *p); + } + } + } + } + gpgrt_log_printf ("\n"); +} +#endif /* debug helper */ + /* Helper for read_and_hash_cont(). */ static gpg_error_t @@ -435,6 +517,7 @@ ksba_cms_identify (ksba_reader_t reader) if (!strcmp (content_handlers[i].oid, oid)) break; } + ksba_free(oid); if (!content_handlers[i].oid) return KSBA_CT_NONE; /* unknown */ if (maybe_p12 && (content_handlers[i].ct == KSBA_CT_DATA @@ -500,6 +583,9 @@ ksba_cms_release (ksba_cms_t cms) ksba_cert_release (cms->cert_list->cert); xfree (cms->cert_list->enc_val.algo); xfree (cms->cert_list->enc_val.value); + xfree (cms->cert_list->enc_val.ecdh.e); + xfree (cms->cert_list->enc_val.ecdh.wrap_algo); + xfree (cms->cert_list->enc_val.ecdh.encr_algo); xfree (cms->cert_list); cms->cert_list = cl; } @@ -531,6 +617,7 @@ ksba_cms_release (ksba_cms_t cms) struct sig_val_s *tmp = cms->sig_val->next; xfree (cms->sig_val->algo); xfree (cms->sig_val->value); + xfree (cms->sig_val->ecc.r); xfree (cms->sig_val); cms->sig_val = tmp; } @@ -765,8 +852,6 @@ ksba_cms_get_issuer_serial (ksba_cms_t cms, int idx, if (!si) return -1; - issuer_path = "SignerInfo.sid.issuerAndSerialNumber.issuer"; - serial_path = "SignerInfo.sid.issuerAndSerialNumber.serialNumber"; root = si->root; image = si->image; } @@ -774,8 +859,6 @@ ksba_cms_get_issuer_serial (ksba_cms_t cms, int idx, { struct value_tree_s *tmp; - issuer_path = "KeyTransRecipientInfo.rid.issuerAndSerialNumber.issuer"; - serial_path = "KeyTransRecipientInfo.rid.issuerAndSerialNumber.serialNumber"; for (tmp=cms->recp_info; tmp && idx; tmp=tmp->next, idx-- ) ; if (!tmp) @@ -786,6 +869,38 @@ ksba_cms_get_issuer_serial (ksba_cms_t cms, int idx, else return gpg_error (GPG_ERR_NO_DATA); + + if (cms->signer_info) + { + issuer_path = "SignerInfo.sid.issuerAndSerialNumber.issuer"; + serial_path = "SignerInfo.sid.issuerAndSerialNumber.serialNumber"; + } + else if (cms->recp_info) + { + /* Find the choice to use. */ + n = _ksba_asn_find_node (root, "RecipientInfo.+"); + if (!n || !n->name) + return gpg_error (GPG_ERR_NO_VALUE); + + if (!strcmp (n->name, "ktri")) + { + issuer_path = "ktri.rid.issuerAndSerialNumber.issuer"; + serial_path = "ktri.rid.issuerAndSerialNumber.serialNumber"; + } + else if (!strcmp (n->name, "kari")) + { + issuer_path = ("kari..recipientEncryptedKeys" + "..rid.issuerAndSerialNumber.issuer"); + serial_path = ("kari..recipientEncryptedKeys" + "..rid.issuerAndSerialNumber.serialNumber"); + } + else if (!strcmp (n->name, "kekri")) + return gpg_error (GPG_ERR_UNSUPPORTED_CMS_OBJ); + else + return gpg_error (GPG_ERR_INV_CMS_OBJ); + root = n; + } + if (r_issuer) { n = _ksba_asn_find_node (root, issuer_path); @@ -1175,6 +1290,81 @@ ksba_cms_get_sig_val (ksba_cms_t cms, int idx) } +/* Helper to dump a S-expression. */ +#if 0 +static void +dbg_print_sexp (ksba_const_sexp_t p) +{ + int level = 0; + + if (!p) + fputs ("[none]", stdout); + else + { + for (;;) + { + if (*p == '(') + { + putchar (*p); + p++; + level++; + } + else if (*p == ')') + { + putchar (*p); + p++; + if (--level <= 0 ) + { + putchar ('\n'); + return; + } + } + else if (!digitp (p)) + { + fputs ("[invalid s-exp]\n", stdout); + return; + } + else + { + const unsigned char *s; + char *endp; + unsigned long len, n; + + len = strtoul (p, &endp, 10); + p = endp; + if (*p != ':') + { + fputs ("[invalid s-exp]\n", stdout); + return; + } + p++; + for (s=p,n=0; n < len; n++, s++) + if ( !((*s >= 'a' && *s <= 'z') + || (*s >= 'A' && *s <= 'Z') + || (*s >= '0' && *s <= '9') + || *s == '-' || *s == '.')) + break; + if (n < len) + { + putchar('#'); + for (n=0; n < len; n++, p++) + printf ("%02X", *p); + putchar('#'); + } + else + { + for (n=0; n < len; n++, p++) + putchar (*p); + } + } + } + } + putchar ('\n'); +} +#endif /* 0 */ + + + /** * ksba_cms_get_enc_val: * @cms: CMS object @@ -1189,10 +1379,17 @@ ksba_cms_get_sig_val (ksba_cms_t cms, int idx) ksba_sexp_t ksba_cms_get_enc_val (ksba_cms_t cms, int idx) { - AsnNode n, n2; + AsnNode root, n, n2; gpg_error_t err; ksba_sexp_t string; struct value_tree_s *vt; + char *keyencralgo = NULL; /* Key encryption algo. */ + char *parm = NULL; /* Helper to get the parms of kencralgo. */ + size_t parmlen; + char *keywrapalgo = NULL; /* Key wrap algo. */ + struct tag_info ti; + const unsigned char *der; + size_t derlen; if (!cms) return NULL; @@ -1206,25 +1403,97 @@ ksba_cms_get_enc_val (ksba_cms_t cms, int idx) if (!vt) return NULL; /* No value at this IDX */ + /* Find the choice to use. */ + root = _ksba_asn_find_node (vt->root, "RecipientInfo.+"); + if (!root || !root->name) + return NULL; - n = _ksba_asn_find_node (vt->root, - "KeyTransRecipientInfo.keyEncryptionAlgorithm"); - if (!n) - return NULL; - if (n->off == -1) + if (!strcmp (root->name, "ktri")) { -/* fputs ("ksba_cms_get_enc_val problem at node:\n", stderr); */ -/* _ksba_asn_node_dump_all (n, stderr); */ - return NULL; + n = _ksba_asn_find_node (root, "ktri.keyEncryptionAlgorithm"); + if (!n || n->off == -1) + return NULL; + n2 = n->right; /* point to the actual value */ + err = _ksba_encval_to_sexp + (vt->image + n->off, + n->nhdr + n->len + ((!n2||n2->off == -1)? 0:(n2->nhdr+n2->len)), + &string); } + else if (!strcmp (root->name, "kari")) + { + /* _ksba_asn_node_dump_all (root, stderr); */ - n2 = n->right; /* point to the actual value */ - err = _ksba_encval_to_sexp (vt->image + n->off, - n->nhdr + n->len - + ((!n2||n2->off == -1)? 0:(n2->nhdr+n2->len)), - &string); + /* Get the encrypted key. Result is in (DER,DERLEN) */ + n = _ksba_asn_find_node (root, ("kari..recipientEncryptedKeys" + "..encryptedKey")); + if (!n || n->off == -1) + { + err = gpg_error (GPG_ERR_INV_KEYINFO); + goto leave; + } + + der = vt->image + n->off; + derlen = n->nhdr + n->len; + err = parse_octet_string (&der, &derlen, &ti); + if (err) + goto leave; + derlen = ti.length; + /* gpgrt_log_printhex (der, derlen, "%s: encryptedKey", __func__); */ + + /* Get the KEK algos. */ + n = _ksba_asn_find_node (root, "kari..keyEncryptionAlgorithm"); + if (!n || n->off == -1) + { + err = gpg_error (GPG_ERR_INV_KEYINFO); + goto leave; + } + err = _ksba_parse_algorithm_identifier2 (vt->image + n->off, + n->nhdr + n->len, NULL, + &keyencralgo, &parm, &parmlen); + if (err) + goto leave; + if (!parm) + { + err = gpg_error (GPG_ERR_INV_KEYINFO); + goto leave; + } + err = _ksba_parse_algorithm_identifier (parm, parmlen,NULL, &keywrapalgo); + if (err) + goto leave; + + /* gpgrt_log_debug ("%s: keyencralgo='%s'\n", __func__, keyencralgo); */ + /* gpgrt_log_debug ("%s: keywrapalgo='%s'\n", __func__, keywrapalgo); */ + + /* Get the ephemeral public key. */ + n = _ksba_asn_find_node (root, "kari..originator..originatorKey"); + if (!n || n->off == -1) + { + err = gpg_error (GPG_ERR_INV_KEYINFO); + goto leave; + } + err = _ksba_encval_kari_to_sexp (vt->image + n->off, n->nhdr + n->len, + keyencralgo, keywrapalgo, der, derlen, + &string); + if (err) + goto leave; + + /* gpgrt_log_debug ("%s: encryptedKey:\n", __func__); */ + /* dbg_print_sexp (string); */ + } + else if (!strcmp (n->name, "kekri")) + return NULL; /*GPG_ERR_UNSUPPORTED_CMS_OBJ*/ + else + return NULL; /*GPG_ERR_INV_CMS_OBJ*/ + + leave: + xfree (keyencralgo); + xfree (keywrapalgo); + xfree (parm); if (err) + { + /* gpgrt_log_debug ("%s: error: %s\n", __func__, gpg_strerror (err)); */ return NULL; + } return string; } @@ -1288,7 +1557,7 @@ ksba_cms_hash_signed_attrs (ksba_cms_t cms, int idx) * ksba_cms_set_content_type: * @cms: A CMS object * @what: 0 for content type, 1 for inner content type - * @type: Tyep constant + * @type: Type constant * * Set the content type used for build operations. This should be the * first operation before starting to create a CMS message. @@ -1568,25 +1837,29 @@ ksba_cms_set_signing_time (ksba_cms_t cms, int idx, const ksba_isotime_t sigtime } -/* - r_sig = (sig-val - (<algo> - (<param_name1> <mpi>) - ... - (<param_namen> <mpi>) - )) - The sexp must be in canonical form. - Note the <algo> must be given as a stringified OID or the special - string "rsa". - - Note that IDX is only used for consistency checks. +/* Set the signature value as a canonical encoded s-expression. + * + * r_sig = (sig-val + * (<algo> + * (<param_name1> <mpi>) + * ... + * (<param_namen> <mpi>) + * )) + * + * <algo> must be given as a stringified OID or the special string + * "rsa". For ECC <algo> must either be "ecdsa" or the OID matching the used + * hash algorithm; the expected parameters are "r" and "s". + * + * Note that IDX is only used for consistency checks. */ gpg_error_t ksba_cms_set_sig_val (ksba_cms_t cms, int idx, ksba_const_sexp_t sigval) { - const unsigned char *s; - unsigned long n; + gpg_error_t err; + unsigned long n, namelen; struct sig_val_s *sv, **sv_tail; + const unsigned char *s, *endp, *name; + int ecc; /* True for ECC algos. */ int i; if (!cms) @@ -1594,6 +1867,7 @@ ksba_cms_set_sig_val (ksba_cms_t cms, int idx, ksba_const_sexp_t sigval) if (idx < 0) return gpg_error (GPG_ERR_INV_INDEX); /* only one signer for now */ + /* log_sexp ("sigval:", sigval); */ s = sigval; if (*s != '(') return gpg_error (GPG_ERR_INV_SEXP); @@ -1619,9 +1893,20 @@ ksba_cms_set_sig_val (ksba_cms_t cms, int idx, ksba_const_sexp_t sigval) sv = xtrycalloc (1, sizeof *sv); if (!sv) return gpg_error (GPG_ERR_ENOMEM); + if (n==3 && s[0] == 'r' && s[1] == 's' && s[2] == 'a') - { /* kludge to allow "rsa" to be passed as algorithm name */ - sv->algo = xtrystrdup ("1.2.840.113549.1.1.1"); + { + sv->algo = xtrystrdup ("1.2.840.113549.1.1.1"); /* rsa */ + if (!sv->algo) + { + xfree (sv); + return gpg_error (GPG_ERR_ENOMEM); + } + } + else if (n==5 && !memcmp (s, "ecdsa", 5)) + { + /* Use a placeholder for later fixup. */ + sv->algo = xtrystrdup ("ecdsa"); if (!sv->algo) { xfree (sv); @@ -1641,76 +1926,114 @@ ksba_cms_set_sig_val (ksba_cms_t cms, int idx, ksba_const_sexp_t sigval) } s += n; - /* And now the values - FIXME: For now we only support one */ - /* fixme: start loop */ - if (*s != '(') - { - xfree (sv->algo); - xfree (sv); - return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); - } - s++; + ecc = (!strcmp (sv->algo, "ecdsa") /* placeholder */ + || !strcmp (sv->algo, "1.2.840.10045.4.3.2") /* ecdsa-with-SHA256 */ + || !strcmp (sv->algo, "1.2.840.10045.4.3.3") /* ecdsa-with-SHA384 */ + || !strcmp (sv->algo, "1.2.840.10045.4.3.4") /* ecdsa-with-SHA512 */ + ); - if (!(n = snext (&s))) - { - xfree (sv->algo); - xfree (sv); - return gpg_error (GPG_ERR_INV_SEXP); - } - s += n; /* ignore the name of the parameter */ + xfree (sv->value); sv->value = NULL; + xfree (sv->ecc.r); sv->ecc.r = NULL; - if (!digitp(s)) + while (*s == '(') { - xfree (sv->algo); - xfree (sv); - /* May also be an invalid S-EXP. */ - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - } + s++; + n = strtoul (s, (char**)&endp, 10); + s = endp; + if (!n || *s != ':') + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; + } + s++; + name = s; + namelen = n; + s += n; - if (!(n = snext (&s))) - { - xfree (sv->algo); - xfree (sv); - return gpg_error (GPG_ERR_INV_SEXP); - } + if (!digitp(s)) + { + err = gpg_error (GPG_ERR_UNKNOWN_SEXP); /* or invalid sexp */ + goto leave; + } + n = strtoul (s, (char**)&endp, 10); + s = endp; + if (!n || *s != ':') + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; + } + s++; + + if (namelen == 1 && *name == 's') + { + /* Store the "main" parameter into value. */ + xfree (sv->value); + sv->value = xtrymalloc (n); + if (!sv->value) + { + err = gpg_error_from_syserror (); + goto leave; + } + memcpy (sv->value, s, n); + sv->valuelen = n; + } + else if (ecc && namelen == 1 && *name == 'r') + { + xfree (sv->ecc.r); + sv->ecc.r = xtrymalloc (n); + if (!sv->ecc.r) + { + err = gpg_error_from_syserror (); + goto leave; + } + memcpy (sv->ecc.r, s, n); + sv->ecc.rlen = n; + } + /* (We ignore all other parameter of the (key value) form.) */ - if (n > 1 && !*s) - { /* We might have a leading zero due to the way we encode - MPIs - this zero should not go into the OCTECT STRING. */ + s += n; + if ( *s != ')') + { + err = gpg_error (GPG_ERR_UNKNOWN_SEXP); /* or invalid sexp */ + goto leave; + } s++; - n--; } - sv->value = xtrymalloc (n); - if (!sv->value) + + /* Expect two closing parenthesis. */ + if (*s != ')') { - xfree (sv->algo); - xfree (sv); - return gpg_error (GPG_ERR_ENOMEM); + err = gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); + goto leave; } - memcpy (sv->value, s, n); - sv->valuelen = n; - s += n; + s++; if ( *s != ')') { - xfree (sv->value); - xfree (sv->algo); - xfree (sv); - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* but may also be an invalid one */ + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; } - s++; - /* fixme: end loop over parameters */ - /* we need 2 closing parenthesis */ - if ( *s != ')' || s[1] != ')') + /* Check that we have all required data. */ + if (!sv->value) + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; + } + if (ecc && (!sv->ecc.r || !sv->ecc.rlen)) { - xfree (sv->value); - xfree (sv->algo); - xfree (sv); - return gpg_error (GPG_ERR_INV_SEXP); + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; } *sv_tail = sv; - return 0; + return 0; /* Success. */ + + leave: /* Note: This is an error-only label. */ + xfree (sv->value); + xfree (sv->algo); + xfree (sv->ecc.r); + xfree (sv); + return err; } @@ -1751,17 +2074,24 @@ ksba_cms_set_content_enc_algo (ksba_cms_t cms, * (<param_name1> <mpi>) * ... * (<param_namen> <mpi>) + * (encr-algo <oid>) + * (wrap-algo <oid>) * )) * * Note the <algo> must be given as a stringified OID or the special - * string "rsa" */ + * string "rsa". For RSA there is just one parameter named "a"; + * encr-algo and wrap-algo are also not used. For ECC <algo> must be + * "ecdh", the parameter "s" gives the encrypted key, "e" specified + * the ephemeral public key, and wrap-algo algo and encr-algo are the + * stringified OIDs for the ECDH algorithm parameters. */ gpg_error_t ksba_cms_set_enc_val (ksba_cms_t cms, int idx, ksba_const_sexp_t encval) { /*FIXME: This shares most code with ...set_sig_val */ struct certlist_s *cl; - const char *s, *endp; - unsigned long n; + const char *s, *endp, *name; + unsigned long n, namelen; + int ecdh = 0; /* We expect ECC parameters. */ if (!cms) return gpg_error (GPG_ERR_INV_VALUE); @@ -1770,8 +2100,9 @@ ksba_cms_set_enc_val (ksba_cms_t cms, int idx, ksba_const_sexp_t encval) for (cl=cms->cert_list; cl && idx; cl = cl->next, idx--) ; if (!cl) - return gpg_error (GPG_ERR_INV_INDEX); /* no certificate to store the value */ + return gpg_error (GPG_ERR_INV_INDEX); /* No cert to store the value. */ + /* log_sexp ("encval", encval); */ s = encval; if (*s != '(') return gpg_error (GPG_ERR_INV_SEXP); @@ -1796,12 +2127,18 @@ ksba_cms_set_enc_val (ksba_cms_t cms, int idx, ksba_const_sexp_t encval) return gpg_error (GPG_ERR_INV_SEXP); /* we don't allow empty lengths */ s++; xfree (cl->enc_val.algo); - if (n==3 && s[0] == 'r' && s[1] == 's' && s[2] == 'a') + if (n==3 && !memcmp (s, "rsa", 3)) { /* kludge to allow "rsa" to be passed as algorithm name */ cl->enc_val.algo = xtrystrdup ("1.2.840.113549.1.1.1"); if (!cl->enc_val.algo) return gpg_error (GPG_ERR_ENOMEM); } + else if (n==4 && !memcmp (s, "ecdh", 4)) + { + cl->enc_val.algo = xtrystrdup ("1.2.840.10045.2.1"); /* ecPublicKey */ + if (!cl->enc_val.algo) + return gpg_error (GPG_ERR_ENOMEM); + } else { cl->enc_val.algo = xtrymalloc (n+1); @@ -1812,47 +2149,96 @@ ksba_cms_set_enc_val (ksba_cms_t cms, int idx, ksba_const_sexp_t encval) } s += n; - /* And now the values - FIXME: For now we only support one */ - /* fixme: start loop */ - if (*s != '(') - return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); - s++; - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - s += n; /* ignore the name of the parameter */ + ecdh = !strcmp (cl->enc_val.algo, "1.2.840.10045.2.1"); - if (!digitp(s)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* but may also be an invalid one */ - n = strtoul (s, (char**)&endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - if (n > 1 && !*s) - { /* We might have a leading zero due to the way we encode - MPIs - this zero should not go into the OCTECT STRING. */ + xfree (cl->enc_val.value); cl->enc_val.value = NULL; + xfree (cl->enc_val.ecdh.e); cl->enc_val.ecdh.e = NULL; + xfree (cl->enc_val.ecdh.encr_algo); cl->enc_val.ecdh.encr_algo = NULL; + xfree (cl->enc_val.ecdh.wrap_algo); cl->enc_val.ecdh.wrap_algo = NULL; + + while (*s == '(') + { + s++; + n = strtoul (s, (char**)&endp, 10); + s = endp; + if (!n || *s != ':') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + name = s; + namelen = n; + s += n; + + if (!digitp(s)) + return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* or invalid sexp */ + n = strtoul (s, (char**)&endp, 10); + s = endp; + if (!n || *s != ':') + return gpg_error (GPG_ERR_INV_SEXP); + s++; + + if (namelen == 1 && ((!ecdh && *name == 'a') || (ecdh && *name == 's'))) + { + /* Store the "main" parameter into value. */ + xfree (cl->enc_val.value); + cl->enc_val.value = xtrymalloc (n); + if (!cl->enc_val.value) + return gpg_error (GPG_ERR_ENOMEM); + memcpy (cl->enc_val.value, s, n); + cl->enc_val.valuelen = n; + } + else if (!ecdh) + ; /* Ignore all other parameters for RSA. */ + else if (namelen == 1 && *name == 'e') + { + xfree (cl->enc_val.ecdh.e); + cl->enc_val.ecdh.e = xtrymalloc (n); + if (!cl->enc_val.ecdh.e) + return gpg_error (GPG_ERR_ENOMEM); + memcpy (cl->enc_val.ecdh.e, s, n); + cl->enc_val.ecdh.elen = n; + } + else if (namelen == 9 && !memcmp (name, "encr-algo", 9)) + { + xfree (cl->enc_val.ecdh.encr_algo); + cl->enc_val.ecdh.encr_algo = xtrymalloc (n+1); + if (!cl->enc_val.ecdh.encr_algo) + return gpg_error (GPG_ERR_ENOMEM); + memcpy (cl->enc_val.ecdh.encr_algo, s, n); + cl->enc_val.ecdh.encr_algo[n] = 0; + } + else if (namelen == 9 && !memcmp (name, "wrap-algo", 9)) + { + xfree (cl->enc_val.ecdh.wrap_algo); + cl->enc_val.ecdh.wrap_algo = xtrymalloc (n+1); + if (!cl->enc_val.ecdh.wrap_algo) + return gpg_error (GPG_ERR_ENOMEM); + memcpy (cl->enc_val.ecdh.wrap_algo, s, n); + cl->enc_val.ecdh.wrap_algo[n] = 0; + } + /* (We ignore all other parameter of the (key value) form.) */ + + s += n; + if ( *s != ')') + return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* or invalid sexp */ s++; - n--; } - xfree (cl->enc_val.value); - cl->enc_val.value = xtrymalloc (n); - if (!cl->enc_val.value) - return gpg_error (GPG_ERR_ENOMEM); - memcpy (cl->enc_val.value, s, n); - cl->enc_val.valuelen = n; - s += n; - if ( *s != ')') - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* but may also be an invalid one */ + /* Expect two closing parenthesis. */ + if (*s != ')') + return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); s++; - /* fixme: end loop over parameters */ + if ( *s != ')') + return gpg_error (GPG_ERR_INV_SEXP); - /* we need 2 closing parenthesis */ - if ( *s != ')' || s[1] != ')') + /* Check that we have all required data. */ + if (!cl->enc_val.value) + return gpg_error (GPG_ERR_INV_SEXP); + if (ecdh && (!cl->enc_val.ecdh.e + || !cl->enc_val.ecdh.elen + || !cl->enc_val.ecdh.encr_algo + || !cl->enc_val.ecdh.wrap_algo)) return gpg_error (GPG_ERR_INV_SEXP); + return 0; } @@ -2509,7 +2895,7 @@ build_signed_data_attributes (ksba_cms_t cms) attridx++; /* Include the signing time */ - if (certlist->signing_time) + if (*certlist->signing_time) { attr = _ksba_asn_expand_tree (cms_tree->parse_tree, "CryptographicMessageSyntax.Attribute"); @@ -2673,6 +3059,7 @@ build_signed_data_rest (ksba_cms_t cms) struct sig_val_s *sv; ksba_writer_t tmpwrt = NULL; AsnNode root = NULL; + ksba_der_t dbld = NULL; /* Now we can really write the signer info */ err = ksba_asn_create_tree ("cms", &cms_tree); @@ -2708,6 +3095,7 @@ build_signed_data_rest (ksba_cms_t cms) AsnNode n, n2; unsigned char *image; size_t imagelen; + const char *oid; if (!digestlist || !si || !sv) { @@ -2776,7 +3164,7 @@ build_signed_data_rest (ksba_cms_t cms) assert (si->root); assert (si->image); n2 = _ksba_asn_find_node (si->root, "SignerInfo.signedAttrs"); - if (!n2 || !n->down) + if (!n2 || !n2->down) { err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); goto leave; @@ -2799,7 +3187,26 @@ build_signed_data_rest (ksba_cms_t cms) err = gpg_error (GPG_ERR_MISSING_VALUE); goto leave; } - err = _ksba_der_store_oid (n, sv->algo); + + if (!strcmp (sv->algo, "ecdsa")) + { + /* Look at the digest algorithm and replace accordingly. */ + if (!strcmp (digestlist->oid, "2.16.840.1.101.3.4.2.1")) + oid = "1.2.840.10045.4.3.2"; /* ecdsa-with-SHA256 */ + else if (!strcmp (digestlist->oid, "2.16.840.1.101.3.4.2.2")) + oid = "1.2.840.10045.4.3.3"; /* ecdsa-with-SHA384 */ + else if (!strcmp (digestlist->oid, "2.16.840.1.101.3.4.2.3")) + oid = "1.2.840.10045.4.3.4"; /* ecdsa-with-SHA512 */ + else + { + err = gpg_error (GPG_ERR_DIGEST_ALGO); + goto leave; + } + } + else + oid = sv->algo; + + err = _ksba_der_store_oid (n, oid); if (err) goto leave; n = _ksba_asn_find_node (root, @@ -2825,9 +3232,38 @@ build_signed_data_rest (ksba_cms_t cms) err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); goto leave; } - err = _ksba_der_store_octet_string (n, sv->value, sv->valuelen); - if (err) - goto leave; + + if (sv->ecc.r) /* ECDSA */ + { + unsigned char *tmpder; + size_t tmpderlen; + + _ksba_der_release (dbld); + dbld = _ksba_der_builder_new (0); + if (!dbld) + { + err = gpg_error_from_syserror (); + goto leave; + } + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + _ksba_der_add_int (dbld, sv->ecc.r, sv->ecc.rlen, 1); + _ksba_der_add_int (dbld, sv->value, sv->valuelen, 1); + _ksba_der_add_end (dbld); + + err = _ksba_der_builder_get (dbld, &tmpder, &tmpderlen); + if (err) + goto leave; + err = _ksba_der_store_octet_string (n, tmpder, tmpderlen); + xfree (tmpder); + if (err) + goto leave; + } + else /* RSA */ + { + err = _ksba_der_store_octet_string (n, sv->value, sv->valuelen); + if (err) + goto leave; + } /* Make the DER encoding and write it out. */ err = _ksba_der_encode_tree (root, &image, &imagelen); @@ -2871,7 +3307,7 @@ build_signed_data_rest (ksba_cms_t cms) ksba_asn_tree_release (cms_tree); _ksba_asn_release_nodes (root); ksba_writer_release (tmpwrt); - + _ksba_der_release (dbld); return err; } @@ -2969,12 +3405,20 @@ build_enveloped_data_header (ksba_cms_t cms) { gpg_error_t err; int recpno; - ksba_asn_tree_t cms_tree = NULL; struct certlist_s *certlist; unsigned char *buf; const char *s; size_t len; - ksba_writer_t tmpwrt = NULL; + ksba_der_t dbld = NULL; + int any_ecdh = 0; + + /* See whether we have any ECDH recipients. */ + for (certlist = cms->cert_list; certlist; certlist = certlist->next) + if (certlist->enc_val.ecdh.e) + { + any_ecdh = 1; + break; + } /* Write the outer contentInfo */ /* fixme: code is shared with signed_data_header */ @@ -3012,7 +3456,9 @@ build_enveloped_data_header (ksba_cms_t cms) For SPHINX the version number must be 0. */ - s = "\x00"; + + + s = any_ecdh? "\x02" :"\x00"; err = _ksba_ber_write_tl (cms->writer, TYPE_INTEGER, CLASS_UNIVERSAL, 0, 1); if (err) return err; @@ -3023,11 +3469,6 @@ build_enveloped_data_header (ksba_cms_t cms) /* Note: originatorInfo is not yet implemented and must not be used for SPHINX */ - /* Now we write the recipientInfo */ - err = ksba_asn_create_tree ("cms", &cms_tree); - if (err) - return err; - certlist = cms->cert_list; if (!certlist) { @@ -3035,19 +3476,19 @@ build_enveloped_data_header (ksba_cms_t cms) goto leave; } - /* To construct the set we use a temporary writer object */ - err = ksba_writer_new (&tmpwrt); - if (err) - goto leave; - err = ksba_writer_set_mem (tmpwrt, 2048); - if (err) - goto leave; + dbld = _ksba_der_builder_new (0); + if (!dbld) + { + err = gpg_error_from_syserror (); + goto leave; + } + + _ksba_der_add_tag (dbld, 0, TYPE_SET); for (recpno=0; certlist; recpno++, certlist = certlist->next) { - AsnNode root, n; - unsigned char *image; - size_t imagelen; + const unsigned char *der; + size_t derlen; if (!certlist->cert) { @@ -3055,141 +3496,140 @@ build_enveloped_data_header (ksba_cms_t cms) goto leave; } - root = _ksba_asn_expand_tree (cms_tree->parse_tree, - "CryptographicMessageSyntax.RecipientInfo"); - - /* We store a version of 0 because we are only allowed to use - the issuerAndSerialNumber for SPHINX */ - n = _ksba_asn_find_node (root, "RecipientInfo.ktri.version"); - if (!n) - { - err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); - goto leave; - } - err = _ksba_der_store_integer (n, "\x00\x00\x00\x01\x00"); - if (err) - goto leave; - - /* Store the rid */ - n = _ksba_asn_find_node (root, "RecipientInfo.ktri.rid"); - if (!n) + if (!certlist->enc_val.ecdh.e) /* RSA (ktri) */ { - err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); - goto leave; - } - - err = set_issuer_serial (n, certlist->cert, 1); - if (err) - goto leave; - - /* store the keyEncryptionAlgorithm */ - if (!certlist->enc_val.algo || !certlist->enc_val.value) - return gpg_error (GPG_ERR_MISSING_VALUE); - n = _ksba_asn_find_node (root, - "RecipientInfo.ktri.keyEncryptionAlgorithm.algorithm"); - if (!n) - { - err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); - goto leave; - } - err = _ksba_der_store_oid (n, certlist->enc_val.algo); - if (err) - goto leave; - n = _ksba_asn_find_node (root, - "RecipientInfo.ktri.keyEncryptionAlgorithm.parameters"); - if (!n) - { - err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); - goto leave; - } - - /* Now store NULL for the optional parameters. From Peter - * Gutmann's X.509 style guide: - * - * Another pitfall to be aware of is that algorithms which - * have no parameters have this specified as a NULL value - * rather than omitting the parameters field entirely. The - * reason for this is that when the 1988 syntax for - * AlgorithmIdentifier was translated into the 1997 syntax, - * the OPTIONAL associated with the AlgorithmIdentifier - * parameters got lost. Later it was recovered via a defect - * report, but by then everyone thought that algorithm - * parameters were mandatory. Because of this the algorithm - * parameters should be specified as NULL, regardless of what - * you read elsewhere. - * - * The trouble is that things *never* get better, they just - * stay the same, only more so - * -- Terry Pratchett, "Eric" - * - * Although this is about signing, we always do it. Versions of - * Libksba before 1.0.6 had a bug writing out the NULL tag here, - * thus in reality we used to be correct according to the - * standards despite we didn't intended so. - */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + /* We store a version of 0 because we are only allowed to + * use the issuerAndSerialNumber for SPHINX */ + _ksba_der_add_ptr (dbld, 0, TYPE_INTEGER, "", 1); + /* rid.issuerAndSerialNumber */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + /* rid.issuerAndSerialNumber.issuer */ + err = _ksba_cert_get_issuer_dn_ptr (certlist->cert, &der, &derlen); + if (err) + goto leave; + _ksba_der_add_der (dbld, der, derlen); + /* rid.issuerAndSerialNumber.serialNumber */ + err = _ksba_cert_get_serial_ptr (certlist->cert, &der, &derlen); + if (err) + goto leave; + _ksba_der_add_der (dbld, der, derlen); + _ksba_der_add_end (dbld); - err = _ksba_der_store_null (n); - if (err) - goto leave; + /* Store the keyEncryptionAlgorithm */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + if (!certlist->enc_val.algo || !certlist->enc_val.value) + { + err = gpg_error (GPG_ERR_MISSING_VALUE); + goto leave; + } + _ksba_der_add_oid (dbld, certlist->enc_val.algo); + /* Now store NULL for the optional parameters. From Peter + * Gutmann's X.509 style guide: + * + * Another pitfall to be aware of is that algorithms which + * have no parameters have this specified as a NULL value + * rather than omitting the parameters field entirely. The + * reason for this is that when the 1988 syntax for + * AlgorithmIdentifier was translated into the 1997 syntax, + * the OPTIONAL associated with the AlgorithmIdentifier + * parameters got lost. Later it was recovered via a defect + * report, but by then everyone thought that algorithm + * parameters were mandatory. Because of this the algorithm + * parameters should be specified as NULL, regardless of what + * you read elsewhere. + * + * The trouble is that things *never* get better, they just + * stay the same, only more so + * -- Terry Pratchett, "Eric" + * + * Although this is about signing, we always do it. Versions of + * Libksba before 1.0.6 had a bug writing out the NULL tag here, + * thus in reality we used to be correct according to the + * standards despite we didn't intended so. + */ + _ksba_der_add_ptr (dbld, 0, TYPE_NULL, NULL, 0); + _ksba_der_add_end (dbld); + + /* Store the encryptedKey */ + if (!certlist->enc_val.value) + { + err = gpg_error (GPG_ERR_MISSING_VALUE); + goto leave; + } + _ksba_der_add_ptr (dbld, 0, TYPE_OCTET_STRING, + certlist->enc_val.value, + certlist->enc_val.valuelen); - /* store the encryptedKey */ - if (!certlist->enc_val.value) - { - err = gpg_error (GPG_ERR_MISSING_VALUE); - goto leave; } - n = _ksba_asn_find_node (root, "RecipientInfo.ktri.encryptedKey"); - if (!n) + else /* ECDH */ { - err = gpg_error (GPG_ERR_ELEMENT_NOT_FOUND); - goto leave; - } - err = _ksba_der_store_octet_string (n, - certlist->enc_val.value, - certlist->enc_val.valuelen); - if (err) - goto leave; - + _ksba_der_add_tag (dbld, CLASS_CONTEXT, 1); /* kari */ + _ksba_der_add_ptr (dbld, 0, TYPE_INTEGER, "\x03", 1); + + _ksba_der_add_tag (dbld, CLASS_CONTEXT, 0); /* originator */ + _ksba_der_add_tag (dbld, CLASS_CONTEXT, 1); /* originatorKey */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); /* algorithm */ + _ksba_der_add_oid (dbld, certlist->enc_val.algo); + _ksba_der_add_end (dbld); + _ksba_der_add_bts (dbld, certlist->enc_val.ecdh.e, + certlist->enc_val.ecdh.elen, 0); + _ksba_der_add_end (dbld); /* end originatorKey */ + _ksba_der_add_end (dbld); /* end originator */ + + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); /* keyEncrAlgo */ + _ksba_der_add_oid (dbld, certlist->enc_val.ecdh.encr_algo); + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + _ksba_der_add_oid (dbld, certlist->enc_val.ecdh.wrap_algo); + _ksba_der_add_end (dbld); + _ksba_der_add_end (dbld); /* end keyEncrAlgo */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); /* recpEncrKeys */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); /* recpEncrKey */ + + /* rid.issuerAndSerialNumber */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + err = _ksba_cert_get_issuer_dn_ptr (certlist->cert, &der, &derlen); + if (err) + goto leave; + _ksba_der_add_der (dbld, der, derlen); + err = _ksba_cert_get_serial_ptr (certlist->cert, &der, &derlen); + if (err) + goto leave; + _ksba_der_add_der (dbld, der, derlen); + _ksba_der_add_end (dbld); - /* Make the DER encoding and write it out */ - err = _ksba_der_encode_tree (root, &image, &imagelen); - if (err) - goto leave; + /* encryptedKey */ + if (!certlist->enc_val.value) + { + err = gpg_error (GPG_ERR_MISSING_VALUE); + goto leave; + } + _ksba_der_add_ptr (dbld, 0, TYPE_OCTET_STRING, + certlist->enc_val.value, + certlist->enc_val.valuelen); - err = ksba_writer_write (tmpwrt, image, imagelen); - if (err) - goto leave; + _ksba_der_add_end (dbld); /* end recpEncrKey */ + _ksba_der_add_end (dbld); /* end recpEncrKeys */ + } - xfree (image); - _ksba_asn_release_nodes (root); + _ksba_der_add_end (dbld); /* End SEQUENCE (ktri or kari) */ } - - ksba_asn_tree_release (cms_tree); - cms_tree = NULL; + _ksba_der_add_end (dbld); /* End SET */ /* Write out the SET filled with all recipient infos */ { - unsigned char *value; - size_t valuelen; + unsigned char *image; + size_t imagelen; - value = ksba_writer_snatch_mem (tmpwrt, &valuelen); - if (!value) - { - err = gpg_error (GPG_ERR_ENOMEM); - goto leave; - } - ksba_writer_release (tmpwrt); - tmpwrt = NULL; - err = _ksba_ber_write_tl (cms->writer, TYPE_SET, CLASS_UNIVERSAL, - 1, valuelen); - if (!err) - err = ksba_writer_write (cms->writer, value, valuelen); - xfree (value); + err = _ksba_der_builder_get (dbld, &image, &imagelen); + if (err) + goto leave; + err = ksba_writer_write (cms->writer, image, imagelen); + xfree (image); if (err) goto leave; } - /* Write the (inner) encryptedContentInfo */ err = _ksba_ber_write_tl (cms->writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, 0); if (err) @@ -3222,8 +3662,7 @@ build_enveloped_data_header (ksba_cms_t cms) /* Now the encrypted data should be written */ leave: - ksba_writer_release (tmpwrt); - ksba_asn_tree_release (cms_tree); + _ksba_der_release (dbld); return err; } @@ -50,8 +50,14 @@ struct value_tree_s { struct enc_val_s { char *algo; - unsigned char *value; + unsigned char *value; /* RSA's "a" or ECDH's "s". (malloced) */ size_t valuelen; + struct { + unsigned char *e; /* Malloced buffer. */ + size_t elen; /* Length of E. */ + char *encr_algo; /* Malloced OID string. */ + char *wrap_algo; /* Malloced OID string. */ + } ecdh; }; @@ -96,10 +102,15 @@ struct signer_info_s { struct sig_val_s { struct sig_val_s *next; char *algo; - unsigned char *value; - size_t valuelen; + unsigned char *value; /* Malloced buffer for parameter "s". */ + size_t valuelen; /* Used length of VALUE. */ + struct { + unsigned char *r; /* Malloced buffer for parameter "r". */ + size_t rlen; /* Length of R. */ + } ecc; }; + struct ksba_cms_s { gpg_error_t last_error; @@ -43,11 +43,14 @@ #include "ber-help.h" #include "ber-decoder.h" #include "crl.h" +#include "stringbuf.h" static const char oidstr_crlNumber[] = "2.5.29.20"; static const char oidstr_crlReason[] = "2.5.29.21"; +#if 0 static const char oidstr_issuingDistributionPoint[] = "2.5.29.28"; +#endif static const char oidstr_certificateIssuer[] = "2.5.29.29"; static const char oidstr_authorityKeyIdentifier[] = "2.5.29.35"; @@ -78,101 +81,6 @@ do_hash (ksba_crl_t crl, const void *buffer, size_t length) #define HASH(a,b) do_hash (crl, (a), (b)) - -static void -parse_skip (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - if (ti->length) - { - assert (ti->length <= *len); - *len -= ti->length; - *buf += ti->length; - } -} - -static gpg_error_t -parse_sequence (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_SEQUENCE - && ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - return err; -} - -static gpg_error_t -parse_integer (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_INTEGER - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - -static gpg_error_t -parse_octet_string (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err= _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_OCTET_STRING - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - -static gpg_error_t -parse_object_id_into_str (unsigned char const **buf, size_t *len, char **oid) -{ - struct tag_info ti; - gpg_error_t err; - - *oid = NULL; - err = _ksba_ber_parse_tl (buf, len, &ti); - if (err) - ; - else if (!(ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_OBJECT_ID - && !ti.is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti.length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti.length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - else if (!(*oid = ksba_oid_to_str (*buf, ti.length))) - err = gpg_error_from_errno (errno); - else - { - *buf += ti.length; - *len -= ti.length; - } - return err; -} - - - /** * ksba_crl_new: @@ -631,7 +539,17 @@ ksba_crl_get_item (ksba_crl_t crl, ksba_sexp_t *r_serial, * * Return the actual signature in a format suitable to be used as * input to Libgcrypt's verification function. The caller must free - * the returned string. + * the returned string. For a rsaPSS signed CRLs this function may + * also be called right after rsaPSS has been detected using + * ksba_crl_get_digest_algo and before the the signature value can be + * retrieved. In this case an S-expression of the form + * + * (sig-val (hash-algo OID)(salt-length N)) + * + * is returned. The caller should extract the actual to be used hash + * algorithm from that S-expression. Note that after the actual + * signature as been seen, a similar S-expression is returned but in + * this case also with the (rsa(s XXX)) list. * * Return value: NULL or a string with an S-Exp. **/ @@ -643,6 +561,28 @@ ksba_crl_get_sig_val (ksba_crl_t crl) if (!crl) return NULL; + if (!crl->sigval + && crl->algo.oid && !strcmp (crl->algo.oid, "1.2.840.113549.1.1.10") + && crl->algo.parm && crl->algo.parmlen) + { + char *pss_hash; + unsigned int salt_length; + struct stringbuf sb; + + if (_ksba_keyinfo_get_pss_info (crl->algo.parm, crl->algo.parmlen, + &pss_hash, &salt_length)) + return NULL; + + init_stringbuf (&sb, 100); + put_stringbuf (&sb,"(7:sig-val(5:flags3:pss)(9:hash-algo"); + put_stringbuf_sexp (&sb, pss_hash); + put_stringbuf (&sb, ")(11:salt-length"); + put_stringbuf_uint (&sb, salt_length); + put_stringbuf (&sb, "))"); + + return get_stringbuf (&sb); + } + if (!crl->sigval) return NULL; @@ -1076,33 +1016,8 @@ parse_to_next_update (ksba_crl_t crl) return 0; } - -/* Parse an enumerated value. Note that this code is duplication of - the one at ocsp.c. */ -static gpg_error_t -parse_enumerated (unsigned char const **buf, size_t *len, struct tag_info *ti, - size_t maxlen) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_ENUMERATED - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (maxlen && ti->length > maxlen) - err = gpg_error (GPG_ERR_TOO_LARGE); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - - + /* Store an entry extension into the current item. */ static gpg_error_t store_one_entry_extension (ksba_crl_t crl, diff --git a/src/der-builder.c b/src/der-builder.c new file mode 100644 index 0000000..e7f52cc --- /dev/null +++ b/src/der-builder.c @@ -0,0 +1,667 @@ +/* der-builder.c - Straightforward DER object builder + * Copyright (C) 2020 g10 Code GmbH + * + * This file is part of KSBA. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +/* This is a new way in KSBA to build DER objects without the need and + * overhead of using an ASN.1 module. It further avoids a lot of error + * checking because the error checking is delayed to the last call. + * + * For an example on how to use it see cms.c + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "util.h" +#include "asn1-constants.h" +#include "convert.h" +#include "ber-help.h" +#include "der-builder.h" + + + +struct item_s +{ + unsigned int tag; + unsigned int class:2; + unsigned int hdrlen:10; /* Computed size of tag+length field. */ + unsigned int is_constructed:1; /* This is a constructed element. */ + unsigned int encapsulate:1; /* This encapsulates other objects. */ + unsigned int verbatim:1; /* Copy the value verbatim. */ + unsigned int is_stop:1; /* This is a STOP item. */ + const void *value; + size_t valuelen; + char *buffer; /* Malloced space or NULL. */ +}; + + +/* Our DER context object; it may eventually be extended to also + * feature a parser. */ +struct ksba_der_s +{ + gpg_error_t error; /* Last error. */ + size_t nallocateditems; /* Number of allocated items. */ + size_t nitems; /* Number of used items. */ + struct item_s *items; /* Array of items. */ + int laststop; /* Used as return value of compute_length. */ + unsigned int finished:1;/* The object has been constructed. */ +}; + + +/* Release a DER object. */ +void +_ksba_der_release (ksba_der_t d) +{ + int idx; + + if (!d) + return; + + for (idx=0; idx < d->nitems; idx++) + xfree (d->items[idx].buffer); + xfree (d->items); + xfree (d); +} + + +/* Allocate a new DER builder instance. Returns NULL on error. + * NITEMS can be used to tell the number of DER items needed so to + * reduce the number of automatic reallocations. */ +ksba_der_t +_ksba_der_builder_new (unsigned int nitems) +{ + ksba_der_t d; + + d = xtrycalloc (1, sizeof *d); + if (!d) + return NULL; + if (nitems) + { + d->nallocateditems = nitems; + d->items = xtrycalloc (d->nallocateditems, sizeof *d->items); + if (!d->items) + { + xfree (d); + return NULL; + } + } + + return d; +} + + +/* Reset a DER build context so that a new sequence can be build. */ +void +_ksba_der_builder_reset (ksba_der_t d) +{ + int idx; + + if (!d) + return; /* Oops. */ + for (idx=0; idx < d->nitems; idx++) + { + if (d->items[idx].buffer) + { + xfree (d->items[idx].buffer); + d->items[idx].buffer = NULL; + } + d->items[idx].hdrlen = 0; + d->items[idx].is_constructed = 0; + d->items[idx].encapsulate = 0; + d->items[idx].verbatim = 0; + d->items[idx].is_stop = 0; + d->items[idx].value = NULL; + } + d->nitems = 0; + d->finished = 0; + d->error = 0; +} + + +/* Make sure the array of items is large enough for one new item. + * Records any error in D and returns true in that case. True is also + * returned if D is in finished state. */ +static int +ensure_space (ksba_der_t d) +{ + struct item_s *newitems; + + if (!d || d->error || d->finished) + return 1; + + if (d->nitems == d->nallocateditems) + { + d->nallocateditems += 32; + newitems = _ksba_reallocarray (d->items, d->nitems, + d->nallocateditems, sizeof *newitems); + if (!newitems) + d->error = gpg_error_from_syserror (); + else + d->items = newitems; + } + return !!d->error; +} + + +/* Add a new primitive element to the builder instance D. The element + * is described by CLASS, TAG, VALUE, and VALUELEN. CLASS and TAG + * must describe a primitive element and (VALUE,VALUELEN) specify its + * value. The value is a pointer and its object must not be changed + * as long as the instance D exists. For a TYPE_NULL tag no value is + * expected. Errors are not returned but recorded for later + * retrieval. */ +void +_ksba_der_add_ptr (ksba_der_t d, int class, int tag, + void *value, size_t valuelen) +{ + if (ensure_space (d)) + return; + d->items[d->nitems].class = class & 0x03; + d->items[d->nitems].tag = tag; + d->items[d->nitems].value = value; + d->items[d->nitems].valuelen = valuelen; + d->nitems++; +} + + +/* This is a low level function which assumes that D has been + * validated, VALUE is not NULL and enough space for a new item is + * available. It takes ownership of VALUE. VERBATIM is usually + * passed as false */ +static void +add_val_core (ksba_der_t d, int class, int tag, void *value, size_t valuelen, + int verbatim) +{ + d->items[d->nitems].buffer = value; + d->items[d->nitems].class = class & 0x03; + d->items[d->nitems].tag = tag; + d->items[d->nitems].value = value; + d->items[d->nitems].valuelen = valuelen; + d->items[d->nitems].verbatim = !!verbatim; + d->nitems++; +} + + +/* This is the same as ksba_der_add_ptr but it takes a copy of the + * value and thus the caller does not need to care about keeping the + * value. */ +void +_ksba_der_add_val (ksba_der_t d, int class, int tag, + const void *value, size_t valuelen) +{ + void *p; + + if (ensure_space (d)) + return; + if (!value || !valuelen) + { + d->error = gpg_error (GPG_ERR_INV_VALUE); + return; + } + p = xtrymalloc (valuelen); + if (!p) + { + d->error = gpg_error_from_syserror (); + return; + } + memcpy (p, value, valuelen); + add_val_core (d, class, tag, p, valuelen, 0); +} + + +/* Add an OBJECT ID element to D. The OID is given in decimal dotted + * format as OIDSTR. */ +void +_ksba_der_add_oid (ksba_der_t d, const char *oidstr) +{ + gpg_error_t err; + unsigned char *buf; + size_t len; + + if (ensure_space (d)) + return; + + err = ksba_oid_from_str (oidstr, &buf, &len); + if (err) + d->error = err; + else + add_val_core (d, 0, TYPE_OBJECT_ID, buf, len, 0); +} + + +/* Add a BIT STRING to D. Using a separate function allows to easily + * pass the number of unused bits. */ +void +_ksba_der_add_bts (ksba_der_t d, const void *value, size_t valuelen, + unsigned int unusedbits) +{ + unsigned char *p; + + if (ensure_space (d)) + return; + if (!value || !valuelen || unusedbits > 7) + { + d->error = gpg_error (GPG_ERR_INV_VALUE); + return; + } + p = xtrymalloc (1+valuelen); + if (!p) + { + d->error = gpg_error_from_syserror (); + return; + } + p[0] = unusedbits; + memcpy (p+1, value, valuelen); + add_val_core (d, 0, TYPE_BIT_STRING, p, 1+valuelen, 0); +} + + +/* Add (VALUE, VALUELEN) as an INTEGER to D. If FORCE_POSITIVE iset + * set a 0 or positive number is stored regardless of what is in + * (VALUE, VALUELEN). */ +void +_ksba_der_add_int (ksba_der_t d, const void *value, size_t valuelen, + int force_positive) +{ + unsigned char *p; + int need_extra; + + if (ensure_space (d)) + return; + if (!value || !valuelen) + need_extra = 1; /* Assume the integer value 0 was meant. */ + else + need_extra = (force_positive && (*(const unsigned char*)value & 0x80)); + + p = xtrymalloc (need_extra+valuelen); + if (!p) + { + d->error = gpg_error_from_syserror (); + return; + } + if (need_extra) + p[0] = 0; + if (valuelen) + memcpy (p+need_extra, value, valuelen); + add_val_core (d, 0, TYPE_INTEGER, p, need_extra+valuelen, 0); +} + + +/* This function allows to add a pre-constructed DER object to the + * builder. It should be a valid DER object but its values is not + * further checked and copied verbatim to the final DER object + * constructed for the handle D. */ +void +_ksba_der_add_der (ksba_der_t d, const void *der, size_t derlen) +{ + void *p; + + if (ensure_space (d)) + return; + if (!der || !derlen) + { + d->error = gpg_error (GPG_ERR_INV_VALUE); + return; + } + p = xtrymalloc (derlen); + if (!p) + { + d->error = gpg_error_from_syserror (); + return; + } + memcpy (p, der, derlen); + add_val_core (d, 0, 0, p, derlen, 1); +} + + +/* Add a new constructed object to the builder instance D. The object + * is described by CLASS and TAG which must describe a constructed + * object. The elements of the constructed objects are added with + * more call using the add functions. To close a constructed element + * a call to tlv_builer_add_end is required. Errors are not returned + * but recorded for later retrieval. */ +void +_ksba_der_add_tag (ksba_der_t d, int class, int tag) +{ + if (ensure_space (d)) + return; + d->items[d->nitems].class = class & 0x03; + d->items[d->nitems].tag = tag; + d->items[d->nitems].is_constructed = 1; + d->items[d->nitems].encapsulate = !!(class & 0x80); + d->nitems++; +} + + +/* A call to this function closes a constructed element. This must be + * called even for an empty constructed element. */ +void +_ksba_der_add_end (ksba_der_t d) +{ + if (ensure_space (d)) + return; + d->items[d->nitems].is_stop = 1; + d->nitems++; +} + + +/* Return the length of the TL header of a to be constructed TLV. + * LENGTH gives the length of the value, if it is 0 indefinite length + * is assumed. LENGTH is ignored for the NULL tag. On error 0 is + * returned. Note that this function is similar to _ksba_ber_count_tl + * but we want our own copy here. */ +static unsigned int +count_tl (int class, int tag, size_t length) +{ + unsigned int hdrlen = 0; + int i, t; + + if (tag < 0x1f) + hdrlen++; + else + { + hdrlen++; + + for (i = 0, t = tag; t > 0; i++) + t >>= 7; + hdrlen += i; + } + + if (!tag && !class) + hdrlen++; /* end tag */ + else if (tag == TYPE_NULL && !class) + hdrlen++; /* NULL tag */ + else if (!length) + hdrlen++; /* indefinite length */ + else if (length < 128) + hdrlen++; + else + { + i = (length <= 0xff ? 1: + length <= 0xffff ? 2: + length <= 0xffffff ? 3: 4); + + hdrlen++; + if (i > 3) + hdrlen++; + if (i > 2) + hdrlen++; + if (i > 1) + hdrlen++; + hdrlen++; + } + + return hdrlen; +} + + +/* Write TAG of CLASS to BUFFER. CONSTRUCTED is a flag telling + * whether the value is constructed. LENGTH gives the length of the + * value, if it is 0 undefinite length is assumed. LENGTH is ignored + * for the NULL tag. TAG must be less that 0x1f. The caller must + * make sure that the written TL field does not overflow the + * buffer. */ +static void +write_tl (unsigned char *buffer, int class, int tag, + int constructed, size_t length) +{ + int i, savei, t; + + if (tag < 0x1f) + { + *buffer = (class << 6) | tag; + if (constructed) + *buffer |= 0x20; + buffer++; + } + else + { + *buffer = (class << 6) | 0x1f; + if (constructed) + *buffer |= 0x20; + buffer++; + + for (i = 0, t = tag; t > 0; i++) + t >>= 7; + savei = i; + t = tag; + while (i-- > 0) + { + buffer[i] = t & 0x7f; + if (i != savei - 1) + buffer[i] |= 0x80; + t >>= 7; + } + buffer += savei; + } + + if (!tag && !class) + *buffer++ = 0; /* end tag */ + else if (tag == TYPE_NULL && !class) + *buffer++ = 0; /* NULL tag */ + else if (!length) + *buffer++ = 0x80; /* indefinite length */ + else if (length < 128) + *buffer++ = length; + else + { + /* If we know the sizeof a size_t we could support larger + * objects - however this is pretty ridiculous */ + i = (length <= 0xff ? 1: + length <= 0xffff ? 2: + length <= 0xffffff ? 3: 4); + + *buffer++ = (0x80 | i); + if (i > 3) + *buffer++ = length >> 24; + if (i > 2) + *buffer++ = length >> 16; + if (i > 1) + *buffer++ = length >> 8; + *buffer++ = length; + } +} + + +/* Compute and set the length of all constructed elements in the item + * array of D starting at IDX up to the corresponding stop item. On + * error d->error is set. */ +static size_t +compute_lengths (ksba_der_t d, int idx) +{ + size_t total = 0; + + if (d->error) + return 0; + + for (; idx < d->nitems; idx++) + { + if (d->items[idx].is_stop) + { + d->laststop = idx; + break; + } + if (d->items[idx].verbatim) + { + total += d->items[idx].valuelen; + continue; + } + if (d->items[idx].is_constructed) + { + d->items[idx].valuelen = compute_lengths (d, idx+1); + if (d->error) + return 0; + /* Note: The last processed IDX is stored at d->LASTSTOP. */ + } + d->items[idx].hdrlen = count_tl (d->items[idx].class, + d->items[idx].tag, + d->items[idx].valuelen); + if (!d->items[idx].hdrlen) + { + if (d->error) + d->error = gpg_error (GPG_ERR_ENCODING_PROBLEM); + return 0; /* Error. */ + } + + total += d->items[idx].hdrlen + d->items[idx].valuelen; + if (d->items[idx].is_constructed) + { + if (d->items[idx].encapsulate && d->items[idx].tag == TYPE_BIT_STRING) + total++; /* Account for the unused bits octet. */ + idx = d->laststop; + } + } + return total; +} + + +/* Return the constructed DER object at D. On success the object is + * stored at R_OBJ and its length at R_OBJLEN. The caller needs to + * release that memory. On error NULL is stored at R_OBJ and an error + * code is returned. Further the number of successful calls prior to + * the error are stored at R_OBJLEN. Note than an error may stem from + * any of the previous call made to this object or from constructing + * the DER object. If this function is called with NULL for R_OBJ + * only the current error state is returned and no further processing + * is done. This can be used to figure which of the add calls induced + * the error. + */ +gpg_error_t +_ksba_der_builder_get (ksba_der_t d, unsigned char **r_obj, size_t *r_objlen) +{ + gpg_error_t err; + int idx; + unsigned char *buffer = NULL; + unsigned char *p; + size_t bufsize, buflen; + int encap_bts; + + *r_obj = NULL; + *r_objlen = 0; + + if (!d) + return gpg_error (GPG_ERR_INV_ARG); + if (d->error) + { + err = d->error; + if (r_objlen) + *r_objlen = d->nitems; + goto leave; + } + if (!r_obj) + return 0; + + if (!d->finished) + { + if (d->nitems == 1) + ; /* Single item does not need an end tag. */ + else if (!d->nitems || !d->items[d->nitems-1].is_stop) + { + err = gpg_error (GPG_ERR_NO_OBJ); + goto leave; + } + + compute_lengths (d, 0); + err = d->error; + if (err) + goto leave; + + d->finished = 1; + } + + /* If the first element is a primitive element we rightly assume no + * other elements follow. It is the user's duty to build a valid + * ASN.1 object. */ + bufsize = d->items[0].hdrlen + d->items[0].valuelen; + + /* for (idx=0; idx < d->nitems; idx++) */ + /* gpgrt_log_debug ("DERB[%2d]: c=%d t=%2d %s p=%p h=%u l=%zu\n", */ + /* idx, */ + /* d->items[idx].class, */ + /* d->items[idx].tag, */ + /* d->items[idx].verbatim? "verbatim": */ + /* d->items[idx].is_stop? "stop": */ + /* d->items[idx].is_constructed? "cons":"prim", */ + /* d->items[idx].value, */ + /* d->items[idx].hdrlen, */ + /* d->items[idx].valuelen); */ + + buffer = xtrymalloc (bufsize); + if (!buffer) + { + err = gpg_error_from_syserror (); + goto leave; + } + buflen = 0; + p = buffer; + + for (idx=0; idx < d->nitems; idx++) + { + if (d->items[idx].is_stop) + continue; + if (!d->items[idx].verbatim) + { + /* For data encapsulated in a bit string we need to adjust + * for the unused bits octet. */ + encap_bts = (d->items[idx].encapsulate && !d->items[idx].class + && d->items[idx].tag == TYPE_BIT_STRING); + + if (buflen + d->items[idx].hdrlen + encap_bts > bufsize) + { + err = gpg_error (GPG_ERR_BUG); + goto leave; + } + write_tl (p, d->items[idx].class, d->items[idx].tag, + (d->items[idx].is_constructed + && !d->items[idx].encapsulate), + d->items[idx].valuelen + encap_bts); + p += d->items[idx].hdrlen; + buflen += d->items[idx].hdrlen; + if (encap_bts) + { + *p++ = 0; + buflen++; + } + } + if (d->items[idx].value) + { + if (buflen + d->items[idx].valuelen > bufsize) + { + err = gpg_error (GPG_ERR_BUG); + goto leave; + } + memcpy (p, d->items[idx].value, d->items[idx].valuelen); + p += d->items[idx].valuelen; + buflen += d->items[idx].valuelen; + } + } + assert (buflen == bufsize); + + *r_obj = buffer; + *r_objlen = buflen; + buffer = NULL; + + leave: + xfree (buffer); + return err; +} diff --git a/src/der-builder.h b/src/der-builder.h new file mode 100644 index 0000000..faff4ce --- /dev/null +++ b/src/der-builder.h @@ -0,0 +1,51 @@ +/* der-builder.h - Straightforward DER object builder + * Copyright (C) 2020 g10 Code GmbH + * + * This file is part of KSBA. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef DER_BUILDER_H +#define DER_BUILDER_H 1 + +/* A generic release function. If we add a DER parser we will use the + * same object and then it does not make sense to have several release + * functions. */ +void _ksba_der_release (ksba_der_t hd); + +/* Create a new builder context. */ +ksba_der_t _ksba_der_builder_new (unsigned int nitems); +/* Reset a builder context. */ +void _ksba_der_builder_reset (ksba_der_t d); + +void _ksba_der_add_ptr (ksba_der_t d, int class, int tag, + void *value, size_t valuelen); +void _ksba_der_add_val (ksba_der_t d, int class, int tag, + const void *value, size_t valuelen); +void _ksba_der_add_oid (ksba_der_t d, const char *oidstr); +void _ksba_der_add_bts (ksba_der_t d, const void *value, size_t valuelen, + unsigned int unusedbits); +void _ksba_der_add_int (ksba_der_t d, const void *value, size_t valuelen, + int force_positive); +void _ksba_der_add_der (ksba_der_t d, const void *der, size_t derlen); +void _ksba_der_add_tag (ksba_der_t d, int class, int tag); +void _ksba_der_add_end (ksba_der_t d); + +gpg_error_t _ksba_der_builder_get (ksba_der_t d, + unsigned char **r_obj, size_t *r_objlen); + + +#endif /*DER_BUILDER_H*/ @@ -40,6 +40,8 @@ #include "asn1-func.h" #include "ber-help.h" #include "ber-decoder.h" +#include "stringbuf.h" + static const struct { const char *name; @@ -95,139 +97,6 @@ static unsigned char charclasses[128] = { #undef N #undef P -struct stringbuf { - size_t len; - size_t size; - char *buf; - int out_of_core; -}; - - - -static void -init_stringbuf (struct stringbuf *sb, int initiallen) -{ - sb->len = 0; - sb->size = initiallen; - sb->out_of_core = 0; - /* allocate one more, so that get_stringbuf can append a nul */ - sb->buf = xtrymalloc (initiallen+1); - if (!sb->buf) - sb->out_of_core = 1; -} - -static void -deinit_stringbuf (struct stringbuf *sb) -{ - xfree (sb->buf); - sb->buf = NULL; - sb->out_of_core = 1; /* make sure the caller does an init before reuse */ -} - - -static void -put_stringbuf (struct stringbuf *sb, const char *text) -{ - size_t n = strlen (text); - - if (sb->out_of_core) - return; - - if (sb->len + n >= sb->size) - { - char *p; - - sb->size += n + 100; - p = xtryrealloc (sb->buf, sb->size); - if ( !p) - { - sb->out_of_core = 1; - return; - } - sb->buf = p; - } - memcpy (sb->buf+sb->len, text, n); - sb->len += n; -} - -static void -put_stringbuf_mem (struct stringbuf *sb, const char *text, size_t n) -{ - if (sb->out_of_core) - return; - - if (sb->len + n >= sb->size) - { - char *p; - - sb->size += n + 100; - p = xtryrealloc (sb->buf, sb->size); - if ( !p) - { - sb->out_of_core = 1; - return; - } - sb->buf = p; - } - memcpy (sb->buf+sb->len, text, n); - sb->len += n; -} - -static void -put_stringbuf_mem_skip (struct stringbuf *sb, const char *text, size_t n, - int skip) -{ - char *p; - - if (!skip) - { - put_stringbuf_mem (sb, text, n); - return; - } - if (sb->out_of_core) - return; - - if (sb->len + n >= sb->size) - { - /* Note: we allocate too much here, but we don't care. */ - sb->size += n + 100; - p = xtryrealloc (sb->buf, sb->size); - if ( !p) - { - sb->out_of_core = 1; - return; - } - sb->buf = p; - } - p = sb->buf+sb->len; - while (n > skip) - { - text += skip; - n -= skip; - *p++ = *text++; - n--; - sb->len++; - } -} - -static char * -get_stringbuf (struct stringbuf *sb) -{ - char *p; - - if (sb->out_of_core) - { - xfree (sb->buf); sb->buf = NULL; - return NULL; - } - - sb->buf[sb->len] = 0; - p = sb->buf; - sb->buf = NULL; - sb->out_of_core = 1; /* make sure the caller does an init before reuse */ - return p; -} - /* This function is used for 1 byte encodings to insert any required quoting. It does not do the quoting for a space or hash mark at diff --git a/src/gen-help.h b/src/gen-help.h index c0a3776..05641f9 100644 --- a/src/gen-help.h +++ b/src/gen-help.h @@ -90,6 +90,8 @@ const char *gpg_strerror (int err); /* Duplicated type definitions from ksba.h. */ typedef struct ksba_asn_tree_s *ksba_asn_tree_t; - +int ksba_asn_parse_file (const char *filename, ksba_asn_tree_t *result, + int debug); +void ksba_asn_tree_dump (ksba_asn_tree_t tree, const char *name, FILE *fp); #endif /*GEN_HELP_H*/ diff --git a/src/keyinfo.c b/src/keyinfo.c index 265b475..666726f 100644 --- a/src/keyinfo.c +++ b/src/keyinfo.c @@ -1,5 +1,5 @@ /* keyinfo.c - Parse and build a keyInfo structure - * Copyright (C) 2001, 2002, 2007, 2008, 2012 g10 Code GmbH + * Copyright (C) 2001, 2002, 2007, 2008, 2012, 2020 g10 Code GmbH * * This file is part of KSBA. * @@ -44,14 +44,21 @@ #include "shared.h" #include "convert.h" #include "ber-help.h" - +#include "sexp-parse.h" +#include "stringbuf.h" +#include "der-builder.h" /* Constants used for the public key algorithms. */ typedef enum { + PKALGO_NONE, PKALGO_RSA, PKALGO_DSA, - PKALGO_ECC + PKALGO_ECC, + PKALGO_X25519, + PKALGO_X448, + PKALGO_ED25519, + PKALGO_ED448 } pkalgo_t; @@ -60,7 +67,7 @@ struct algo_table_s { const char *oidstring; const unsigned char *oid; /* NULL indicattes end of table */ int oidlen; - int supported; + int supported; /* Values > 1 are also used to indicate hacks. */ pkalgo_t pkalgo; const char *algo_string; const char *elem_string; /* parameter name or '-' */ @@ -70,6 +77,8 @@ struct algo_table_s { const char *digest_string; /* The digest algo if included in the OID. */ }; +/* Special values for the supported field. */ +#define SUPPORTED_RSAPSS 2 static const struct algo_table_s pk_algo_table[] = { @@ -82,7 +91,12 @@ static const struct algo_table_s pk_algo_table[] = { { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.7 */ "1.2.840.113549.1.1.7", /* RSAES-OAEP */ "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x07", 9, - 0, PKALGO_RSA, "rsa", "-ne", "\x30\x02\x02"}, /* (patent problems) */ + 0, PKALGO_RSA, "rsa", "-ne", "\x30\x02\x02"}, + + { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.10 */ + "1.2.840.113549.1.1.10", /* rsaPSS */ + "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0a", 9, + SUPPORTED_RSAPSS, PKALGO_RSA, "rsa", "-ne", "\x30\x02\x02"}, { /* */ "2.5.8.1.1", /* rsa (ambiguous due to missing padding rules)*/ @@ -99,6 +113,26 @@ static const struct algo_table_s pk_algo_table[] = { "\x2a\x86\x48\xce\x3d\x02\x01", 7, 1, PKALGO_ECC, "ecc", "q", "\x80" }, + { /* iso.identified-organization.thawte.110 */ + "1.3.101.110", /* X25519 */ + "\x2b\x65\x6e", 3, + 1, PKALGO_X25519, "ecc", "q", "\x80" }, + + { /* iso.identified-organization.thawte.111 */ + "1.3.101.111", /* X448 */ + "\x2b\x65\x6f", 3, + 1, PKALGO_X448, "ecc", "q", "\x80" }, + + { /* iso.identified-organization.thawte.112 */ + "1.3.101.112", /* Ed25519 */ + "\x2b\x65\x70", 3, + 1, PKALGO_ED25519, "ecc", "q", "\x80" }, + + { /* iso.identified-organization.thawte.113 */ + "1.3.101.113", /* Ed448 */ + "\x2b\x65\x71", 3, + 1, PKALGO_ED448, "ecc", "q", "\x80" }, + {NULL} }; @@ -203,6 +237,11 @@ static const struct algo_table_s sig_algo_table[] = { "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0d", 9, 1, PKALGO_RSA, "rsa", "s", "\x82", NULL, NULL, "sha512" }, + { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.10 */ + "1.2.840.113549.1.1.10", /* rsaPSS */ + "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0a", 9, + SUPPORTED_RSAPSS, PKALGO_RSA, "rsa", "s", "\x82", NULL, NULL, NULL}, + { /* TeleTrust signature scheme with RSA signature and DSI according to ISO/IEC 9796-2 with random number and RIPEMD-160. I am not sure for what this is good; thus disabled. */ @@ -210,28 +249,47 @@ static const struct algo_table_s sig_algo_table[] = { "\x2B\x24\x03\x04\x03\x02\x02", 7, 0, PKALGO_RSA, "rsa", "s", "\x82", NULL, NULL, "rmd160" }, + + { /* iso.identified-organization.thawte.112 */ + "1.3.101.112", /* Ed25519 */ + "\x2b\x65\x70", 3, + 1, PKALGO_ED25519, "eddsa", "", "", NULL, NULL, NULL }, + { /* iso.identified-organization.thawte.113 */ + "1.3.101.113", /* Ed448 */ + "\x2b\x65\x71", 3, + 1, PKALGO_ED448, "eddsa", "", "", NULL, NULL, NULL }, + {NULL} }; static const struct algo_table_s enc_algo_table[] = { - { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.1 */ - "1.2.840.113549.1.1.1", /* rsaEncryption (RSAES-PKCA1-v1.5) */ - "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01", 9, - 1, PKALGO_RSA, "rsa", "a", "\x82" }, + {/* iso.member-body.us.rsadsi.pkcs.pkcs-1.1 */ + "1.2.840.113549.1.1.1", /* rsaEncryption (RSAES-PKCA1-v1.5) */ + "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01", 9, + 1, PKALGO_RSA, "rsa", "a", "\x82" }, + {/* iso.member-body.us.ansi-x9-62.2.1 */ + "1.2.840.10045.2.1", /* ecPublicKey */ + "\x2a\x86\x48\xce\x3d\x02\x01", 7, + 1, PKALGO_ECC, "ecdh", "e", "\x80" }, {NULL} }; /* This tables maps names of ECC curves names to OIDs. A similar - table is used by lib gcrypt. */ + table is used by Libgcrypt. */ static const struct { const char *oid; const char *name; + unsigned char pkalgo; /* If not 0 force the use of ALGO. */ } curve_names[] = { - { "1.3.6.1.4.1.3029.1.5.1", "Curve25519" }, - { "1.3.6.1.4.1.11591.15.1", "Ed25519" }, + { "1.3.101.112", "Ed25519", PKALGO_ED25519}, + { "1.3.101.110", "Curve25519", PKALGO_X25519}, + { "1.3.101.110", "X25519", PKALGO_X25519}, + + { "1.3.101.113", "Ed448", PKALGO_ED448 }, + { "1.3.101.111", "X448", PKALGO_X448 }, { "1.2.840.10045.3.1.1", "NIST P-192" }, { "1.2.840.10045.3.1.1", "nistp192" }, @@ -277,16 +335,6 @@ static const struct - - -struct stringbuf { - size_t len; - size_t size; - char *buf; - int out_of_core; -}; - - #define TLV_LENGTH(prefix) do { \ if (!prefix ## len) \ return gpg_error (GPG_ERR_INV_KEYINFO); \ @@ -316,13 +364,16 @@ struct stringbuf { } while (0) -/* Given a string BUF of length BUFLEN with either the name of an ECC - curve or its OID in dotted form return the DER encoding of the OID. - The caller must free the result. On error NULL is returned. */ -static unsigned char * -get_ecc_curve_oid (const unsigned char *buf, size_t buflen, size_t *r_oidlen) +/* Given a string BUF of length BUFLEN with either a curve name or its + * OID in dotted form return a string in dotted form of the name. The + * caller must free the result. On error NULL is returned. If a + * curve requires the use of a certain algorithm, that algorithm is + * stored at R_PKALGO. */ +static char * +get_ecc_curve_oid (const unsigned char *buf, size_t buflen, pkalgo_t *r_pkalgo) { - unsigned char *der_oid; + unsigned char *result; + int i, find_pkalgo; /* Skip an optional "oid." prefix. */ if (buflen > 4 && buf[3] == '.' && digitp (buf+4) @@ -336,8 +387,6 @@ get_ecc_curve_oid (const unsigned char *buf, size_t buflen, size_t *r_oidlen) /* If it does not look like an OID - map it through the table. */ if (buflen && !digitp (buf)) { - int i; - for (i=0; curve_names[i].oid; i++) if (buflen == strlen (curve_names[i].name) && !memcmp (buf, curve_names[i].name, buflen)) @@ -346,11 +395,30 @@ get_ecc_curve_oid (const unsigned char *buf, size_t buflen, size_t *r_oidlen) return NULL; /* Not found. */ buf = curve_names[i].oid; buflen = strlen (curve_names[i].oid); + *r_pkalgo = curve_names[i].pkalgo; + find_pkalgo = 0; } + else + find_pkalgo = 1; - if (_ksba_oid_from_buf (buf, buflen, &der_oid, r_oidlen)) - return NULL; - return der_oid; + result = xtrymalloc (buflen + 1); + if (!result) + return NULL; /* Ooops */ + memcpy (result, buf, buflen); + result[buflen] = 0; + + if (find_pkalgo) + { + /* We still need to check whether the OID requires a certain ALGO. */ + for (i=0; curve_names[i].oid; i++) + if (!strcmp (curve_names[i].oid, result)) + { + *r_pkalgo = curve_names[i].pkalgo; + break; + } + } + + return result; } @@ -401,11 +469,6 @@ get_algorithm (int mode, const unsigned char *der, size_t derlen, /* der does now point to an oid of length LEN */ *r_pos = der - start; *r_len = len; -/* { */ -/* char *p = ksba_oid_to_str (der, len); */ -/* printf ("algorithm: %s\n", p); */ -/* xfree (p); */ -/* } */ der += len; derlen -= len; seqlen -= der - startseq;; @@ -420,7 +483,7 @@ get_algorithm (int mode, const unsigned char *der, size_t derlen, c = *der++; derlen--; if ( c == 0x05 ) { - /*printf ("parameter: NULL \n"); the usual case */ + /* gpgrt_log_debug ("%s: parameter: NULL \n", __func__); */ if (!derlen) return gpg_error (GPG_ERR_INV_KEYINFO); c = *der++; derlen--; @@ -512,6 +575,8 @@ _ksba_parse_algorithm_identifier (const unsigned char *der, size_t derlen, r_nread, r_oid, NULL, NULL); } + +/* Note that R_NREAD, R_PARM, and R_PARMLEN are optional. */ gpg_error_t _ksba_parse_algorithm_identifier2 (const unsigned char *der, size_t derlen, size_t *r_nread, char **r_oid, @@ -525,13 +590,15 @@ _ksba_parse_algorithm_identifier2 (const unsigned char *der, size_t derlen, /* fixme: get_algorithm might return the error invalid keyinfo - this should be invalid algorithm identifier */ *r_oid = NULL; - *r_nread = 0; + if (r_nread) + *r_nread = 0; off2 = len2 = 0; err = get_algorithm (0, der, derlen, &nread, &off, &len, &is_bitstr, &off2, &len2, &parm_type); if (err) return err; - *r_nread = nread; + if (r_nread) + *r_nread = nread; *r_oid = ksba_oid_to_str (der+off, len); if (!*r_oid) return gpg_error (GPG_ERR_ENOMEM); @@ -547,13 +614,15 @@ _ksba_parse_algorithm_identifier2 (const unsigned char *der, size_t derlen, NULL, NULL, NULL); if (err) { - *r_nread = 0; + if (r_nread) + *r_nread = 0; return err; } *r_oid = ksba_oid_to_str (der+off2+off, len); if (!*r_oid) { - *r_nread = 0; + if (r_nread) + *r_nread = 0; return gpg_error (GPG_ERR_ENOMEM); } @@ -585,84 +654,8 @@ _ksba_parse_algorithm_identifier2 (const unsigned char *der, size_t derlen, -static void -init_stringbuf (struct stringbuf *sb, int initiallen) -{ - sb->len = 0; - sb->size = initiallen; - sb->out_of_core = 0; - /* allocate one more, so that get_stringbuf can append a nul */ - sb->buf = xtrymalloc (initiallen+1); - if (!sb->buf) - sb->out_of_core = 1; -} - -static void -put_stringbuf_mem (struct stringbuf *sb, const char *text, size_t n) -{ - if (sb->out_of_core) - return; - - if (sb->len + n >= sb->size) - { - char *p; - - sb->size += n + 100; - p = xtryrealloc (sb->buf, sb->size); - if ( !p) - { - sb->out_of_core = 1; - return; - } - sb->buf = p; - } - memcpy (sb->buf+sb->len, text, n); - sb->len += n; -} - -static void -put_stringbuf (struct stringbuf *sb, const char *text) -{ - put_stringbuf_mem (sb, text,strlen (text)); -} - -static void -put_stringbuf_mem_sexp (struct stringbuf *sb, const char *text, size_t length) -{ - char buf[20]; - sprintf (buf,"%u:", (unsigned int)length); - put_stringbuf (sb, buf); - put_stringbuf_mem (sb, text, length); -} - -static void -put_stringbuf_sexp (struct stringbuf *sb, const char *text) -{ - put_stringbuf_mem_sexp (sb, text, strlen (text)); -} - - -static char * -get_stringbuf (struct stringbuf *sb) -{ - char *p; - - if (sb->out_of_core) - { - xfree (sb->buf); sb->buf = NULL; - return NULL; - } - - sb->buf[sb->len] = 0; - p = sb->buf; - sb->buf = NULL; - sb->out_of_core = 1; /* make sure the caller does an init before reuse */ - return p; -} - - /* Assume that der is a buffer of length DERLEN with a DER encoded - Asn.1 structure like this: + ASN.1 structure like this: keyInfo ::= SEQUENCE { SEQUENCE { @@ -763,6 +756,16 @@ _ksba_keyinfo_to_sexp (const unsigned char *der, size_t derlen, put_stringbuf_sexp (&sb, parm_oid); put_stringbuf (&sb, ")"); } + else if (pk_algo_table[algoidx].pkalgo == PKALGO_ED25519 + || pk_algo_table[algoidx].pkalgo == PKALGO_ED448 + || pk_algo_table[algoidx].pkalgo == PKALGO_X25519 + || pk_algo_table[algoidx].pkalgo == PKALGO_X448) + { + put_stringbuf (&sb, "("); + put_stringbuf_sexp (&sb, "curve"); + put_stringbuf_sexp (&sb, pk_algo_table[algoidx].oidstring); + put_stringbuf (&sb, ")"); + } /* If parameters are given and we have a description for them, parse them. */ @@ -869,11 +872,11 @@ _ksba_keyinfo_to_sexp (const unsigned char *der, size_t derlen, /* Match the algorithm string given in BUF which is of length BUFLEN - with the known algorithms from our table and returns the table - entries for the DER encoded OID. If WITH_SIG is true, the table of - signature algorithms is consulted first. */ -static const unsigned char * -oid_from_buffer (const unsigned char *buf, int buflen, int *oidlen, + * with the known algorithms from our table and return the table + * entriy with the OID string. If WITH_SIG is true, the table of + * signature algorithms is consulted first. */ +static const char * +oid_from_buffer (const unsigned char *buf, unsigned int buflen, pkalgo_t *r_pkalgo, int with_sig) { int i; @@ -904,8 +907,7 @@ oid_from_buffer (const unsigned char *buf, int buflen, int *oidlen, if (sig_algo_table[i].oid) { *r_pkalgo = sig_algo_table[i].pkalgo; - *oidlen = sig_algo_table[i].oidlen; - return sig_algo_table[i].oid; + return sig_algo_table[i].oidstring; } } @@ -925,26 +927,26 @@ oid_from_buffer (const unsigned char *buf, int buflen, int *oidlen, return NULL; *r_pkalgo = pk_algo_table[i].pkalgo; - *oidlen = pk_algo_table[i].oidlen; - return pk_algo_table[i].oid; + return pk_algo_table[i].oidstring; } -/* Take a public-key S-Exp and convert it into a DER encoded - publicKeyInfo */ +/* If ALGOINFOMODE is false: Take the "public-key" s-expression SEXP + * and convert it into a DER encoded publicKeyInfo. + * + * If ALGOINFOMODE is true: Take the "sig-val" s-expression SEXP and + * convert it into a DER encoded algorithmInfo. */ gpg_error_t -_ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, +_ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, int algoinfomode, unsigned char **r_der, size_t *r_derlen) { gpg_error_t err; const unsigned char *s; char *endp; - unsigned long n, n1; - const unsigned char *oid; - int oidlen; - unsigned char *curve_oid = NULL; - size_t curve_oidlen; - pkalgo_t pkalgo; + unsigned long n; + const char *algo_oid; + char *curve_oid = NULL; + pkalgo_t pkalgo, force_pkalgo; int i; struct { const char *name; @@ -953,14 +955,11 @@ _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, int valuelen; } parm[10]; int parmidx; - int idxtbl[10]; - int idxtbllen; const char *parmdesc, *algoparmdesc; - ksba_writer_t writer = NULL; - void *algoparmseq_value = NULL; - size_t algoparmseq_len; - void *bitstr_value = NULL; - size_t bitstr_len; + ksba_der_t dbld = NULL; + ksba_der_t dbld2 = NULL; + unsigned char *tmpder; + size_t tmpderlen; if (!sexp) return gpg_error (GPG_ERR_INV_VALUE); @@ -973,11 +972,16 @@ _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, n = strtoul (s, &endp, 10); s = endp; if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); /* we don't allow empty lengths */ + return gpg_error (GPG_ERR_INV_SEXP); /* We don't allow empty lengths. */ s++; - if (n != 10 || memcmp (s, "public-key", 10)) + + if (algoinfomode && n == 7 && !memcmp (s, "sig-val", 7)) + s += 7; + else if (n == 10 || !memcmp (s, "public-key", 10)) + s += 10; + else return gpg_error (GPG_ERR_UNKNOWN_SEXP); - s += 10; + if (*s != '(') return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); s++; @@ -986,31 +990,45 @@ _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, n = strtoul (s, &endp, 10); s = endp; if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); /* we don't allow empty lengths */ + return gpg_error (GPG_ERR_INV_SEXP); /* We don't allow empty lengths. */ s++; - oid = oid_from_buffer (s, n, &oidlen, &pkalgo, 0); - if (!oid) + + algo_oid = oid_from_buffer (s, n, &pkalgo, algoinfomode); + if (!algo_oid) return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); s += n; - /* Collect all the values */ + /* Collect all the values. */ + force_pkalgo = 0; for (parmidx = 0; *s != ')' ; parmidx++) { if (parmidx >= DIM(parm)) - return gpg_error (GPG_ERR_GENERAL); + { + err = gpg_error (GPG_ERR_GENERAL); + goto leave; + } if (*s != '(') - return gpg_error (digitp(s)? GPG_ERR_UNKNOWN_SEXP:GPG_ERR_INV_SEXP); + { + err = gpg_error (digitp(s)? GPG_ERR_UNKNOWN_SEXP:GPG_ERR_INV_SEXP); + goto leave; + } s++; n = strtoul (s, &endp, 10); s = endp; if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); + { + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; + } s++; parm[parmidx].name = s; parm[parmidx].namelen = n; s += n; if (!digitp(s)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ + { + err = gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ + goto leave; + } n = strtoul (s, &endp, 10); s = endp; @@ -1021,580 +1039,318 @@ _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, parm[parmidx].valuelen = n; s += n; if ( *s != ')') - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ + { + err = gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ + goto leave; + } s++; + + if (parm[parmidx].namelen == 5 + && !memcmp (parm[parmidx].name, "curve", 5) + && !curve_oid) + { + curve_oid = get_ecc_curve_oid (parm[parmidx].value, + parm[parmidx].valuelen, &force_pkalgo); + parmidx--; /* No need to store this parameter. */ + } } s++; + /* Allow for optional elements. */ + if (*s == '(') + { + int depth = 1; + err = sskip (&s, &depth); + if (err) + goto leave; + } /* We need another closing parenthesis. */ if ( *s != ')' ) - return gpg_error (GPG_ERR_INV_SEXP); - - /* Describe the parameters in the order we want them and construct - IDXTBL to access them. For DSA wie also set algoparmdesc so - that we can later build the parameters for the - algorithmIdentifier. */ - algoparmdesc = NULL; - switch (pkalgo) { - case PKALGO_RSA: parmdesc = "ne"; break; - case PKALGO_DSA: parmdesc = "y" ; algoparmdesc = "pqg"; break; - case PKALGO_ECC: parmdesc = "Cq"; break; - default: return gpg_error (GPG_ERR_UNKNOWN_ALGORITHM); + err = gpg_error (GPG_ERR_INV_SEXP); + goto leave; } - idxtbllen = 0; - for (s = parmdesc; *s; s++) + if (force_pkalgo) + pkalgo = force_pkalgo; + + /* Describe the parameters in the order we want them. For DSA wie + * also set algoparmdesc so that we can later build the parameters + * for the algorithmIdentifier. */ + algoparmdesc = NULL; + switch (pkalgo) { - for (i=0; i < parmidx; i++) - { - assert (idxtbllen < DIM (idxtbl)); - switch (*s) - { - case 'C': /* Magic value for "curve". */ - if (parm[i].namelen == 5 && !memcmp (parm[i].name, "curve", 5)) - { - idxtbl[idxtbllen++] = i; - i = parmidx; /* Break inner loop. */ - } - break; - default: - if (parm[i].namelen == 1 && parm[i].name[0] == *s) - { - idxtbl[idxtbllen++] = i; - i = parmidx; /* Break inner loop. */ - } - break; - } - } + case PKALGO_RSA: + parmdesc = algoinfomode? "" : "ne"; + break; + case PKALGO_DSA: + parmdesc = algoinfomode? "" : "y"; + algoparmdesc = "pqg"; + break; + case PKALGO_ECC: + parmdesc = algoinfomode? "" : "q"; + break; + case PKALGO_ED25519: + case PKALGO_X25519: + case PKALGO_ED448: + case PKALGO_X448: + parmdesc = algoinfomode? "" : "q"; + if (curve_oid) + algo_oid = curve_oid; + break; + default: + err = gpg_error (GPG_ERR_UNKNOWN_ALGORITHM); + goto leave; } - if (idxtbllen != strlen (parmdesc)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - if (pkalgo == PKALGO_ECC) + /* Create a builder. */ + dbld = _ksba_der_builder_new (0); + if (!dbld) { - curve_oid = get_ecc_curve_oid (parm[idxtbl[0]].value, - parm[idxtbl[0]].valuelen, - &curve_oidlen); - if (!curve_oid) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); + err = gpg_error_from_syserror (); + goto leave; } + /* The outer sequence. */ + if (!algoinfomode) + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + /* The sequence. */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + /* The object id. */ + _ksba_der_add_oid (dbld, algo_oid); - /* Create write object. */ - err = ksba_writer_new (&writer); - if (err) - goto leave; - err = ksba_writer_set_mem (writer, 1024); - if (err) - goto leave; - - /* We create the keyinfo in 2 steps: - - 1. We build the inner one and encapsulate it in a bit string. - - 2. We create the outer sequence include the algorithm identifier - and the bit string from step 1. - */ - if (pkalgo == PKALGO_ECC) + /* The parameter. */ + if (algoparmdesc) { - /* Write the bit string header and the number of unused bits. */ - err = _ksba_ber_write_tl (writer, TYPE_BIT_STRING, CLASS_UNIVERSAL, - 0, parm[idxtbl[1]].valuelen + 1); - if (!err) - err = ksba_writer_write (writer, "", 1); - /* And the actual raw value. */ - if (!err) - err = ksba_writer_write (writer, parm[idxtbl[1]].value, - parm[idxtbl[1]].valuelen); - if (err) - goto leave; - + /* Write the sequence tag followed by the integers. */ + _ksba_der_add_tag (dbld, 0, TYPE_SEQUENCE); + for (s = algoparmdesc; *s; s++) + for (i=0; i < parmidx; i++) + if (parm[i].namelen == 1 && parm[i].name[0] == *s) + { + _ksba_der_add_int (dbld, parm[i].value, parm[i].valuelen, 1); + break; /* inner loop */ + } + _ksba_der_add_end (dbld); } - else /* RSA and DSA */ + else if (pkalgo == PKALGO_ECC && !algoinfomode) { - /* Calculate the size of the sequence value and the size of the - bit string value. NOt ethat in case there is only one - integer to write, no sequence is used. */ - for (n=0, i=0; i < idxtbllen; i++ ) - { - n += _ksba_ber_count_tl (TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - n += parm[idxtbl[i]].valuelen; - } - - n1 = 1; /* # of unused bits. */ - if (idxtbllen > 1) - n1 += _ksba_ber_count_tl (TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - n1 += n; - - /* Write the bit string header and the number of unused bits. */ - err = _ksba_ber_write_tl (writer, TYPE_BIT_STRING, CLASS_UNIVERSAL, - 0, n1); - if (!err) - err = ksba_writer_write (writer, "", 1); - if (err) - goto leave; - - /* Write the sequence tag and the integers. */ - if (idxtbllen > 1) - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1,n); - if (err) - goto leave; - for (i=0; i < idxtbllen; i++) + /* We only support the namedCurve choice for ECC parameters. */ + if (!curve_oid) { - /* fixme: we should make sure that the integer conforms to the - ASN.1 encoding rules. */ - err = _ksba_ber_write_tl (writer, TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - if (!err) - err = ksba_writer_write (writer, parm[idxtbl[i]].value, - parm[idxtbl[i]].valuelen); - if (err) - goto leave; + err = gpg_error (GPG_ERR_UNKNOWN_CURVE); + goto leave; } + _ksba_der_add_oid (dbld, curve_oid); } - - /* Get the encoded bit string. */ - bitstr_value = ksba_writer_snatch_mem (writer, &bitstr_len); - if (!bitstr_value) + else if (pkalgo == PKALGO_RSA) { - err = gpg_error (GPG_ERR_ENOMEM); - goto leave; + _ksba_der_add_ptr (dbld, 0, TYPE_NULL, NULL, 0); } - /* If the algorithmIdentifier requires a sequence with parameters, - build them now. We can reuse the IDXTBL for that. */ - if (algoparmdesc) + _ksba_der_add_end (dbld); /* sequence. */ + + /* Add the bit string if we are not in algoinfomode. */ + if (!algoinfomode) { - idxtbllen = 0; - for (s = algoparmdesc; *s; s++) + if (*parmdesc == 'q' && !parmdesc[1]) { + /* This is ECC - Q is directly written as a bit string. */ for (i=0; i < parmidx; i++) + if (parm[i].namelen == 1 && parm[i].name[0] == 'q') + { + if ((parm[i].valuelen & 1) && parm[i].valuelen > 32 + && (parm[i].value[0] == 0x40 + || parm[i].value[0] == 0x41 + || parm[i].value[0] == 0x42)) + { + /* Odd length and prefixed with 0x40 - this is the + * rfc4880bis indicator octet for extended point + * formats - we may not emit that octet here. */ + _ksba_der_add_bts (dbld, parm[i].value+1, + parm[i].valuelen-1, 0); + } + else + _ksba_der_add_bts (dbld, parm[i].value, parm[i].valuelen, 0); + break; + } + } + else /* Non-ECC - embed the values. */ + { + dbld2 = _ksba_der_builder_new (10); + if (!dbld2) { - assert (idxtbllen < DIM (idxtbl)); + err = gpg_error_from_syserror (); + goto leave; + } + + /* Note that no sequence is used if only one integer is written. */ + if (parmdesc[0] && parmdesc[1]) + _ksba_der_add_tag (dbld2, 0, TYPE_SEQUENCE); + + for (s = parmdesc; *s; s++) + for (i=0; i < parmidx; i++) if (parm[i].namelen == 1 && parm[i].name[0] == *s) { - idxtbl[idxtbllen++] = i; - break; + _ksba_der_add_int (dbld2, parm[i].value, parm[i].valuelen, 1); + break; /* inner loop */ } - } - } - if (idxtbllen != strlen (algoparmdesc)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - - err = ksba_writer_set_mem (writer, 1024); - if (err) - goto leave; - /* Calculate the size of the sequence. */ - for (n=0, i=0; i < idxtbllen; i++ ) - { - n += _ksba_ber_count_tl (TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - n += parm[idxtbl[i]].valuelen; - } - /* n += _ksba_ber_count_tl (TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); */ + if (parmdesc[0] && parmdesc[1]) + _ksba_der_add_end (dbld2); - /* Write the sequence tag followed by the integers. */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - if (err) - goto leave; - for (i=0; i < idxtbllen; i++) - { - err = _ksba_ber_write_tl (writer, TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - if (!err) - err = ksba_writer_write (writer, parm[idxtbl[i]].value, - parm[idxtbl[i]].valuelen); + err = _ksba_der_builder_get (dbld2, &tmpder, &tmpderlen); if (err) goto leave; + _ksba_der_add_bts (dbld, tmpder, tmpderlen, 0); + xfree (tmpder); } - /* Get the encoded sequence. */ - algoparmseq_value = ksba_writer_snatch_mem (writer, &algoparmseq_len); - if (!algoparmseq_value) - { - err = gpg_error (GPG_ERR_ENOMEM); - goto leave; - } - } - else - algoparmseq_len = 0; - - /* Reinitialize the buffer to create the outer sequence. */ - err = ksba_writer_set_mem (writer, 1024); - if (err) - goto leave; - - /* Calulate lengths. */ - n = _ksba_ber_count_tl (TYPE_OBJECT_ID, CLASS_UNIVERSAL, 0, oidlen); - n += oidlen; - if (algoparmseq_len) - { - n += algoparmseq_len; - } - else if (pkalgo == PKALGO_ECC) - { - n += _ksba_ber_count_tl (TYPE_OBJECT_ID, CLASS_UNIVERSAL, - 0, curve_oidlen); - n += curve_oidlen; - } - else if (pkalgo == PKALGO_RSA) - { - n += _ksba_ber_count_tl (TYPE_NULL, CLASS_UNIVERSAL, 0, 0); - } - - n1 = n; - n1 += _ksba_ber_count_tl (TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - n1 += bitstr_len; - - /* The outer sequence. */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n1); - if (err) - goto leave; - - /* The sequence. */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - if (err) - goto leave; - - /* The object id. */ - err = _ksba_ber_write_tl (writer, TYPE_OBJECT_ID,CLASS_UNIVERSAL, 0, oidlen); - if (!err) - err = ksba_writer_write (writer, oid, oidlen); - if (err) - goto leave; - - /* The parameter. */ - if (algoparmseq_len) - { - err = ksba_writer_write (writer, algoparmseq_value, algoparmseq_len); - } - else if (pkalgo == PKALGO_ECC) - { - err = _ksba_ber_write_tl (writer, TYPE_OBJECT_ID, CLASS_UNIVERSAL, - 0, curve_oidlen); - if (!err) - err = ksba_writer_write (writer, curve_oid, curve_oidlen); - } - else if (pkalgo == PKALGO_RSA) - { - err = _ksba_ber_write_tl (writer, TYPE_NULL, CLASS_UNIVERSAL, 0, 0); + _ksba_der_add_end (dbld); /* Outer sequence. */ } - if (err) - goto leave; - - /* Append the pre-constructed bit string. */ - err = ksba_writer_write (writer, bitstr_value, bitstr_len); - if (err) - goto leave; /* Get the result. */ - *r_der = ksba_writer_snatch_mem (writer, r_derlen); - if (!*r_der) - err = gpg_error (GPG_ERR_ENOMEM); + err = _ksba_der_builder_get (dbld, r_der, r_derlen); leave: - ksba_writer_release (writer); - xfree (bitstr_value); + _ksba_der_release (dbld2); + _ksba_der_release (dbld); xfree (curve_oid); return err; } -/* Take a sig-val s-expression and convert it into a DER encoded - algorithmInfo. Unfortunately this function clones a lot of code - from _ksba_keyinfo_from_sexp. */ +/* Helper function to parse the parameters used for rsaPSS. + * Given this sample DER object in (DER,DERLEN): + * + * SEQUENCE { + * [0] { + * SEQUENCE { + * OBJECT IDENTIFIER sha-512 (2 16 840 1 101 3 4 2 3) + * } + * } + * [1] { + * SEQUENCE { + * OBJECT IDENTIFIER pkcs1-MGF (1 2 840 113549 1 1 8) + * SEQUENCE { + * OBJECT IDENTIFIER sha-512 (2 16 840 1 101 3 4 2 3) + * } + * } + * } + * [2] { + * INTEGER 64 + * } + * } + * + * The function returns the first OID at R_PSSHASH and the salt length + * at R_SALTLEN. If the salt length is missing its default value is + * returned. In case object does not resemble a the expected rsaPSS + * parameters GPG_ERR_INV_OBJ is returned; other errors are returned + * for an syntatically invalid object. On error NULL is stored at + * R_PSSHASH. + */ gpg_error_t -_ksba_algoinfo_from_sexp (ksba_const_sexp_t sexp, - unsigned char **r_der, size_t *r_derlen) +_ksba_keyinfo_get_pss_info (const unsigned char *der, size_t derlen, + char **r_psshash, unsigned int *r_saltlen) { gpg_error_t err; - const unsigned char *s; - char *endp; - unsigned long n; - const unsigned char *oid; - int oidlen; - unsigned char *curve_oid = NULL; - size_t curve_oidlen; - pkalgo_t pkalgo; - int i; - struct { - const char *name; - int namelen; - const unsigned char *value; - int valuelen; - } parm[10]; - int parmidx; - int idxtbl[10]; - int idxtbllen; - const char *parmdesc, *algoparmdesc; - ksba_writer_t writer = NULL; - void *algoparmseq_value = NULL; - size_t algoparmseq_len; - - if (!sexp) - return gpg_error (GPG_ERR_INV_VALUE); - - s = sexp; - if (*s != '(') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - - n = strtoul (s, &endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); /* We don't allow empty lengths. */ - s++; - if (n == 7 && !memcmp (s, "sig-val", 7)) - s += 7; - else if (n == 10 && !memcmp (s, "public-key", 10)) - s += 10; - else - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - - if (*s != '(') - return gpg_error (digitp (s)? GPG_ERR_UNKNOWN_SEXP : GPG_ERR_INV_SEXP); - s++; - - /* Break out the algorithm ID */ - n = strtoul (s, &endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); /* We don't allow empty lengths. */ - s++; - oid = oid_from_buffer (s, n, &oidlen, &pkalgo, 1); - if (!oid) - return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); - s += n; - - /* Collect all the values */ - for (parmidx = 0; *s != ')' ; parmidx++) - { - if (parmidx >= DIM(parm)) - return gpg_error (GPG_ERR_GENERAL); - if (*s != '(') - return gpg_error (digitp(s)? GPG_ERR_UNKNOWN_SEXP:GPG_ERR_INV_SEXP); - s++; - n = strtoul (s, &endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - parm[parmidx].name = s; - parm[parmidx].namelen = n; - s += n; - if (!digitp(s)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ - - n = strtoul (s, &endp, 10); - s = endp; - if (!n || *s != ':') - return gpg_error (GPG_ERR_INV_SEXP); - s++; - parm[parmidx].value = s; - parm[parmidx].valuelen = n; - s += n; - if ( *s != ')') - return gpg_error (GPG_ERR_UNKNOWN_SEXP); /* ... or invalid S-Exp. */ - s++; - } - s++; - /* We need another closing parenthesis. */ - if ( *s != ')' ) - return gpg_error (GPG_ERR_INV_SEXP); + struct tag_info ti; + char *psshash = NULL; + char *tmpoid = NULL; + unsigned int saltlen; - /* Describe the parameters in the order we want them and construct - IDXTBL to access them. For DSA wie also set algoparmdesc so - that we can later build the parameters for the - algorithmIdentifier. */ - algoparmdesc = NULL; - switch (pkalgo) - { - case PKALGO_RSA: parmdesc = ""; break; - case PKALGO_DSA: parmdesc = "" ; algoparmdesc = "pqg"; break; - case PKALGO_ECC: parmdesc = "C"; break; - default: return gpg_error (GPG_ERR_UNKNOWN_ALGORITHM); - } - - idxtbllen = 0; - for (s = parmdesc; *s; s++) - { - for (i=0; i < parmidx; i++) - { - assert (idxtbllen < DIM (idxtbl)); - switch (*s) - { - case 'C': /* Magic value for "curve". */ - if (parm[i].namelen == 5 && !memcmp (parm[i].name, "curve", 5)) - { - idxtbl[idxtbllen++] = i; - i = parmidx; /* Break inner loop. */ - } - break; - default: - if (parm[i].namelen == 1 && parm[i].name[0] == *s) - { - idxtbl[idxtbllen++] = i; - i = parmidx; /* Break inner loop. */ - } - break; - } - } - } - if (idxtbllen != strlen (parmdesc)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); + *r_psshash = NULL; + *r_saltlen = 0; - if (pkalgo == PKALGO_ECC) - { - curve_oid = get_ecc_curve_oid (parm[idxtbl[0]].value, - parm[idxtbl[0]].valuelen, - &curve_oidlen); - if (!curve_oid) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - } + err = parse_sequence (&der, &derlen, &ti); + if (err) + goto leave; + /* Get the hash algo. */ + err = parse_context_tag (&der, &derlen, &ti, 0); + if (err) + goto unknown_parms; + err = parse_sequence (&der, &derlen, &ti); + if (err) + goto unknown_parms; + err = parse_object_id_into_str (&der, &derlen, &psshash); + if (err) + goto unknown_parms; + err = parse_optional_null (&der, &derlen, NULL); + if (err) + goto unknown_parms; - /* Create write object. */ - err = ksba_writer_new (&writer); + /* Check the MGF OID and that its hash algo matches. */ + err = parse_context_tag (&der, &derlen, &ti, 1); + if (err) + goto unknown_parms; + err = parse_sequence (&der, &derlen, &ti); if (err) goto leave; - err = ksba_writer_set_mem (writer, 1024); + err = parse_object_id_into_str (&der, &derlen, &tmpoid); + if (err) + goto unknown_parms; + if (strcmp (tmpoid, "1.2.840.113549.1.1.8")) /* MGF1 */ + goto unknown_parms; + err = parse_sequence (&der, &derlen, &ti); if (err) goto leave; - - /* Create the sequence of the algorithm identifier. */ - - /* If the algorithmIdentifier requires a sequence with parameters, - build them now. We can reuse the IDXTBL for that. */ - if (algoparmdesc) + xfree (tmpoid); + err = parse_object_id_into_str (&der, &derlen, &tmpoid); + if (err) + goto unknown_parms; + if (strcmp (tmpoid, psshash)) + goto unknown_parms; + err = parse_optional_null (&der, &derlen, NULL); + if (err) + goto unknown_parms; + + /* Get the optional saltLength. */ + err = parse_context_tag (&der, &derlen, &ti, 2); + if (gpg_err_code (err) == GPG_ERR_INV_OBJ + || gpg_err_code (err) == GPG_ERR_FALSE) + saltlen = 20; /* Optional element - use default value */ + else if (err) + goto unknown_parms; + else { - idxtbllen = 0; - for (s = algoparmdesc; *s; s++) - { - for (i=0; i < parmidx; i++) - { - assert (idxtbllen < DIM (idxtbl)); - if (parm[i].namelen == 1 && parm[i].name[0] == *s) - { - idxtbl[idxtbllen++] = i; - break; - } - } - } - if (idxtbllen != strlen (algoparmdesc)) - return gpg_error (GPG_ERR_UNKNOWN_SEXP); - - err = ksba_writer_set_mem (writer, 1024); + err = parse_integer (&der, &derlen, &ti); if (err) goto leave; - - /* Calculate the size of the sequence. */ - for (n=0, i=0; i < idxtbllen; i++ ) - { - n += _ksba_ber_count_tl (TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - n += parm[idxtbl[i]].valuelen; - } - - /* Write the sequence tag followed by the integers. */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - if (err) - goto leave; - for (i=0; i < idxtbllen; i++) - { - err = _ksba_ber_write_tl (writer, TYPE_INTEGER, CLASS_UNIVERSAL, 0, - parm[idxtbl[i]].valuelen); - if (!err) - err = ksba_writer_write (writer, parm[idxtbl[i]].value, - parm[idxtbl[i]].valuelen); - if (err) - goto leave; - } - - /* Get the encoded sequence. */ - algoparmseq_value = ksba_writer_snatch_mem (writer, &algoparmseq_len); - if (!algoparmseq_value) + for (saltlen=0; ti.length; ti.length--) { - err = gpg_error (GPG_ERR_ENOMEM); - goto leave; + saltlen <<= 8; + saltlen |= (*der++) & 0xff; + derlen--; } } - else - algoparmseq_len = 0; - - /* Reinitialize the buffer to create the sequence. */ - err = ksba_writer_set_mem (writer, 1024); - if (err) - goto leave; - - /* Calulate lengths. */ - n = _ksba_ber_count_tl (TYPE_OBJECT_ID, CLASS_UNIVERSAL, 0, oidlen); - n += oidlen; - if (algoparmseq_len) - { - n += algoparmseq_len; - } - else if (pkalgo == PKALGO_ECC) - { - n += _ksba_ber_count_tl (TYPE_OBJECT_ID, CLASS_UNIVERSAL, - 0, curve_oidlen); - n += curve_oidlen; - } - else if (pkalgo == PKALGO_RSA) - { - n += _ksba_ber_count_tl (TYPE_NULL, CLASS_UNIVERSAL, 0, 0); - } - - /* Write the sequence. */ - err = _ksba_ber_write_tl (writer, TYPE_SEQUENCE, CLASS_UNIVERSAL, 1, n); - if (err) - goto leave; - - /* Write the object id. */ - err = _ksba_ber_write_tl (writer, TYPE_OBJECT_ID, CLASS_UNIVERSAL, 0, oidlen); - if (!err) - err = ksba_writer_write (writer, oid, oidlen); - if (err) - goto leave; - /* Write the parameters. */ - if (algoparmseq_len) - { - err = ksba_writer_write (writer, algoparmseq_value, algoparmseq_len); - } - else if (pkalgo == PKALGO_ECC) - { - /* We only support the namedCuve choice for ECC parameters. */ - err = _ksba_ber_write_tl (writer, TYPE_OBJECT_ID, CLASS_UNIVERSAL, - 0, curve_oidlen); - if (!err) - err = ksba_writer_write (writer, curve_oid, curve_oidlen); - } - else if (pkalgo == PKALGO_RSA) - { - err = _ksba_ber_write_tl (writer, TYPE_NULL, CLASS_UNIVERSAL, 0, 0); - } - if (err) - goto leave; + /* All fine. */ + *r_psshash = psshash; + psshash = NULL; + *r_saltlen = saltlen; + err = 0; + goto leave; - /* Get the result. */ - *r_der = ksba_writer_snatch_mem (writer, r_derlen); - if (!*r_der) - err = gpg_error (GPG_ERR_ENOMEM); + unknown_parms: + err = gpg_error (GPG_ERR_INV_OBJ); leave: - ksba_writer_release (writer); - xfree (curve_oid); + xfree (psshash); + xfree (tmpoid); return err; } - /* Mode 0: work as described under _ksba_sigval_to_sexp - mode 1: work as described under _ksba_encval_to_sexp */ + * mode 1: work as described under _ksba_encval_to_sexp + * mode 2: same as mode 1 but for ECDH; in this mode + * KEYENCRYALO, KEYWRAPALGO, ENCRKEY, ENCRYKLEYLEN + * are also required. + */ static gpg_error_t cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, + const char *keyencralgo, const char *keywrapalgo, + const void *encrkey, size_t encrkeylen, ksba_sexp_t *r_string) { gpg_error_t err; @@ -1606,6 +1362,10 @@ cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, const unsigned char *ctrl; const char *elem; struct stringbuf sb; + size_t parm_off, parm_len; + int parm_type; + char *pss_hash = NULL; + unsigned int salt_length = 0; /* FIXME: The entire function is very similar to keyinfo_to_sexp */ *r_string = NULL; @@ -1615,9 +1375,8 @@ cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, else algo_table = enc_algo_table; - err = get_algorithm (1, der, derlen, &nread, &off, &len, &is_bitstr, - NULL, NULL, NULL); + &parm_off, &parm_len, &parm_type); if (err) return err; @@ -1628,11 +1387,27 @@ cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, && !memcmp (der+off, algo_table[algoidx].oid, len)) break; } + if (!algo_table[algoidx].oid) return gpg_error (GPG_ERR_UNKNOWN_ALGORITHM); if (!algo_table[algoidx].supported) return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM); + if (parm_type == TYPE_SEQUENCE + && algo_table[algoidx].supported == SUPPORTED_RSAPSS) + { + /* This is rsaPSS and we collect the parameters. We simplify + * this by assuming that pkcs1-MGF is used with an identical + * hash algorithm. All other kinds of parameters are ignored. */ + err = _ksba_keyinfo_get_pss_info (der + parm_off, parm_len, + &pss_hash, &salt_length); + if (gpg_err_code (err) == GPG_ERR_INV_OBJ) + err = 0; + if (err) + return err; + } + + der += nread; derlen -= nread; @@ -1655,40 +1430,62 @@ cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, /* FIXME: We don't release the stringbuf in case of error better let the macro jump to a label */ - elem = algo_table[algoidx].elem_string; - ctrl = algo_table[algoidx].ctrl_string; - for (; *elem; ctrl++, elem++) + if (!mode && (algo_table[algoidx].pkalgo == PKALGO_ED25519 + ||algo_table[algoidx].pkalgo == PKALGO_ED448)) { - int is_int; - - if ( (*ctrl & 0x80) && !elem[1] ) - { /* Hack to allow a raw value */ - is_int = 1; - len = derlen; - } - else + /* EdDSA is special: R and S are simply concatenated; see rfc8410. */ + put_stringbuf (&sb, "(1:r"); + put_stringbuf_mem_sexp (&sb, der, derlen/2); + put_stringbuf (&sb, ")"); + der += derlen/2; + derlen /= 2; + put_stringbuf (&sb, "(1:s"); + put_stringbuf_mem_sexp (&sb, der, derlen); + put_stringbuf (&sb, ")"); + } + else + { + elem = algo_table[algoidx].elem_string; + ctrl = algo_table[algoidx].ctrl_string; + for (; *elem; ctrl++, elem++) { - if (!derlen) - return gpg_error (GPG_ERR_INV_KEYINFO); - c = *der++; derlen--; - if ( c != *ctrl ) - return gpg_error (GPG_ERR_UNEXPECTED_TAG); - is_int = c == 0x02; - TLV_LENGTH (der); - } - if (is_int && *elem != '-') - { /* take this integer */ - char tmp[2]; + int is_int; - put_stringbuf (&sb, "("); - tmp[0] = *elem; tmp[1] = 0; - put_stringbuf_sexp (&sb, tmp); - put_stringbuf_mem_sexp (&sb, der, len); - der += len; - derlen -= len; - put_stringbuf (&sb, ")"); + if ( (*ctrl & 0x80) && !elem[1] ) + { /* Hack to allow a raw value */ + is_int = 1; + len = derlen; + } + else + { + if (!derlen) + return gpg_error (GPG_ERR_INV_KEYINFO); + c = *der++; derlen--; + if ( c != *ctrl ) + return gpg_error (GPG_ERR_UNEXPECTED_TAG); + is_int = c == 0x02; + TLV_LENGTH (der); + } + if (is_int && *elem != '-') + { /* take this integer */ + char tmp[2]; + + put_stringbuf (&sb, "("); + tmp[0] = *elem; tmp[1] = 0; + put_stringbuf_sexp (&sb, tmp); + put_stringbuf_mem_sexp (&sb, der, len); + der += len; + derlen -= len; + put_stringbuf (&sb, ")"); + } } } + if (mode == 2) /* ECDH */ + { + put_stringbuf (&sb, "(1:s"); + put_stringbuf_mem_sexp (&sb, encrkey, encrkeylen); + put_stringbuf (&sb, ")"); + } put_stringbuf (&sb, ")"); if (!mode && algo_table[algoidx].digest_string) { @@ -1697,12 +1494,31 @@ cryptval_to_sexp (int mode, const unsigned char *der, size_t derlen, put_stringbuf_sexp (&sb, algo_table[algoidx].digest_string); put_stringbuf (&sb, ")"); } + if (!mode && pss_hash) + { + put_stringbuf (&sb, "(5:flags3:pss)"); + put_stringbuf (&sb, "(9:hash-algo"); + put_stringbuf_sexp (&sb, pss_hash); + put_stringbuf (&sb, ")"); + put_stringbuf (&sb, "(11:salt-length"); + put_stringbuf_uint (&sb, salt_length); + put_stringbuf (&sb, ")"); + } + if (mode == 2) /* ECDH */ + { + put_stringbuf (&sb, "(9:encr-algo"); + put_stringbuf_sexp (&sb, keyencralgo); + put_stringbuf (&sb, ")(9:wrap-algo"); + put_stringbuf_sexp (&sb, keywrapalgo); + put_stringbuf (&sb, ")"); + } put_stringbuf (&sb, ")"); *r_string = get_stringbuf (&sb); if (!*r_string) return gpg_error (GPG_ERR_ENOMEM); + xfree (pss_hash); return 0; } @@ -1732,35 +1548,86 @@ gpg_error_t _ksba_sigval_to_sexp (const unsigned char *der, size_t derlen, ksba_sexp_t *r_string) { - return cryptval_to_sexp (0, der, derlen, r_string); + return cryptval_to_sexp (0, der, derlen, NULL, NULL, NULL, 0, r_string); } /* Assume that der is a buffer of length DERLEN with a DER encoded - Asn.1 structure like this: - - SEQUENCE { - algorithm OBJECT IDENTIFIER, - parameters ANY DEFINED BY algorithm OPTIONAL } - encryptedKey OCTET STRING - - We only allow parameters == NULL. - - The function parses this structure and creates a S-Exp suitable to be - used as encrypted value in Libgcrypt's public key functions: - - (enc-val - (<algo> - (<param_name1> <mpi>) - ... - (<param_namen> <mpi>) - )) - - The S-Exp will be returned in a string which the caller must free. - We don't pass an ASN.1 node here but a plain memory block. */ + * ASN.1 structure like this: + * + * SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL + * } + * encryptedKey OCTET STRING + * + * The function parses this structure and creates a S-expression + * suitable to be used as encrypted value in Libgcrypt's public key + * functions: + * + * (enc-val + * (<algo> + * (<param_name1> <mpi>) + * ... + * (<param_namen> <mpi>) + * )) + * + * The S-expression will be returned in a string which the caller must + * free. Note that the input buffer may not a proper ASN.1 object but + * a plain memory block; this is becuase the SEQUENCE is followed by + * an OCTET STRING or BIT STRING. + */ gpg_error_t _ksba_encval_to_sexp (const unsigned char *der, size_t derlen, ksba_sexp_t *r_string) { - return cryptval_to_sexp (1, der, derlen, r_string); + return cryptval_to_sexp (1, der, derlen, NULL, NULL, NULL, 0, r_string); +} + + +/* Assume that der is a buffer of length DERLEN with a DER encoded + * ASN.1 structure like this: + * + * [1] { + * SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL + * } + * encryptedKey BIT STRING + * } + * + * The function parses this structure and creates an S-expression + * conveying all parameters required for ECDH: + * + * (enc-val + * (ecdh + * (e <octetstring>) + * (s <octetstring>) + * (ukm <octetstring>) + * (encr-algo <oid>) + * (wrap-algo <oid>))) + * + * E is the ephemeral public key and S is the encrypted key. The user + * keying material (ukm) is optional. The S-expression will be + * returned in a string which the caller must free. + */ +gpg_error_t +_ksba_encval_kari_to_sexp (const unsigned char *der, size_t derlen, + const char *keyencralgo, const char *keywrapalgo, + const void *enckey, size_t enckeylen, + ksba_sexp_t *r_string) +{ + gpg_error_t err; + struct tag_info ti; + size_t save_derlen = derlen; + + err = parse_context_tag (&der, &derlen, &ti, 1); + if (err) + return err; + if (save_derlen < ti.nhdr) + return gpg_error (GPG_ERR_INV_BER); + derlen = save_derlen - ti.nhdr; + return cryptval_to_sexp (2, der, derlen, + keyencralgo, keywrapalgo, enckey, enckeylen, + r_string); } diff --git a/src/keyinfo.h b/src/keyinfo.h index a9c1b30..66f5805 100644 --- a/src/keyinfo.h +++ b/src/keyinfo.h @@ -49,17 +49,27 @@ gpg_error_t _ksba_keyinfo_to_sexp (const unsigned char *der, size_t derlen, ksba_sexp_t *r_string) _KSBA_VISIBILITY_DEFAULT; -gpg_error_t _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, +gpg_error_t _ksba_keyinfo_from_sexp (ksba_const_sexp_t sexp, int algoinfomode, unsigned char **r_der, size_t *r_derlen) _KSBA_VISIBILITY_DEFAULT; gpg_error_t _ksba_algoinfo_from_sexp (ksba_const_sexp_t sexp, unsigned char **r_der, size_t *r_derlen); +gpg_error_t _ksba_keyinfo_get_pss_info (const unsigned char *der, + size_t derlen, + char **r_psshash, + unsigned int *r_saltlen); + gpg_error_t _ksba_sigval_to_sexp (const unsigned char *der, size_t derlen, ksba_sexp_t *r_string); gpg_error_t _ksba_encval_to_sexp (const unsigned char *der, size_t derlen, ksba_sexp_t *r_string); +gpg_error_t _ksba_encval_kari_to_sexp (const unsigned char *der, size_t derlen, + const char *keyencralgo, + const char *keywrapalgo, + const void *enckey, size_t enckeylen, + ksba_sexp_t *r_string); int _ksba_node_with_oid_to_digest_algo (const unsigned char *image, AsnNode node); diff --git a/src/ksba-config.in b/src/ksba-config.in index 55f4fcb..76d038d 100644 --- a/src/ksba-config.in +++ b/src/ksba-config.in @@ -71,8 +71,17 @@ while test $# -gt 0; do --exec-prefix) echo_exec_prefix=yes ;; - --version) - echo "@VERSION@" + --variable=*) + case "${1#*=}" in + prefix) echo "$prefix" ;; + exec_prefix) echo "$exec_prefix" ;; + host) echo "$my_host" ;; + api_version) echo "$api_version" ;; + esac + exit 0 + ;; + --modversion|--version) + echo "@PACKAGE_VERSION@" exit 0 ;; --api-version) @@ -1,6 +1,6 @@ /* ksba.h - X.509 library used by GnuPG * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2010, 2011 - * 2012, 2013, 2104, 2015 g10 Code GmbH + * 2012, 2013, 2104, 2015, 2019 g10 Code GmbH * * This file is part of KSBA. * @@ -42,6 +42,16 @@ extern "C" { #endif #endif +/* The version of this header should match the one of the library. Do + * not use this symbol in your application; use assuan_check_version + * instead. */ +#define KSBA_VERSION "1.4.0" + +/* The version number of this header. It may be used to handle minor + * API incompatibilities. */ +#define KSBA_VERSION_NUMBER 0x010400 + + /* Check for compiler features. */ #ifdef __GNUC__ @@ -58,6 +68,50 @@ extern "C" { #endif +#define KSBA_CLASS_UNIVERSAL 0 +#define KSBA_CLASS_APPLICATION 1 +#define KSBA_CLASS_CONTEXT 2 +#define KSBA_CLASS_PRIVATE 3 +#define KSBA_CLASS_ENCAPSULATE 0x80 /* Pseudo class. */ + +#define KSBA_TYPE_BOOLEAN 1 +#define KSBA_TYPE_INTEGER 2 +#define KSBA_TYPE_BIT_STRING 3 +#define KSBA_TYPE_OCTET_STRING 4 +#define KSBA_TYPE_NULL 5 +#define KSBA_TYPE_OBJECT_ID 6 +#define KSBA_TYPE_OBJECT_DESCRIPTOR 7 +#define KSBA_TYPE_EXTERNAL 8 +#define KSBA_TYPE_REAL 9 +#define KSBA_TYPE_ENUMERATED 10 +#define KSBA_TYPE_EMBEDDED_PDV 11 +#define KSBA_TYPE_UTF8_STRING 12 +#define KSBA_TYPE_RELATIVE_OID 13 +#define KSBA_TYPE_TIME 14 +#define KSBA_TYPE_SEQUENCE 16 +#define KSBA_TYPE_SET 17 +#define KSBA_TYPE_NUMERIC_STRING 18 +#define KSBA_TYPE_PRINTABLE_STRING 19 +#define KSBA_TYPE_TELETEX_STRING 20 +#define KSBA_TYPE_VIDEOTEX_STRING 21 +#define KSBA_TYPE_IA5_STRING 22 +#define KSBA_TYPE_UTC_TIME 23 +#define KSBA_TYPE_GENERALIZED_TIME 24 +#define KSBA_TYPE_GRAPHIC_STRING 25 +#define KSBA_TYPE_VISIBLE_STRING 26 +#define KSBA_TYPE_GENERAL_STRING 27 +#define KSBA_TYPE_UNIVERSAL_STRING 28 +#define KSBA_TYPE_CHARACTER_STRING 29 +#define KSBA_TYPE_BMP_STRING 30 +#define KSBA_TYPE_DATE 31 +#define KSBA_TYPE_TIME_OF_DAY 32 +#define KSBA_TYPE_DATE_TIME 33 +#define KSBA_TYPE_DURATION 34 +#define KSBA_TYPE_OID_IRI 35 +#define KSBA_TYPE_RELATIVE_OID_IRI 36 + + + typedef gpg_error_t KsbaError _KSBA_DEPRECATED; typedef enum @@ -69,7 +123,8 @@ typedef enum KSBA_CT_DIGESTED_DATA = 4, KSBA_CT_ENCRYPTED_DATA = 5, KSBA_CT_AUTH_DATA = 6, - KSBA_CT_PKCS12 = 7 + KSBA_CT_PKCS12 = 7, + KSBA_CT_SPC_IND_DATA_CTX = 8 } ksba_content_type_t; typedef ksba_content_type_t KsbaContentType _KSBA_DEPRECATED; @@ -218,6 +273,11 @@ typedef const unsigned char *ksba_const_sexp_t; typedef const unsigned char *KsbaConstSexp _KSBA_DEPRECATED; +/* This is a generic object used by various functions. */ +struct ksba_der_s; +typedef struct ksba_der_s *ksba_der_t; + + /*-- cert.c --*/ gpg_error_t ksba_cert_new (ksba_cert_t *acert); void ksba_cert_ref (ksba_cert_t cert); @@ -527,6 +587,30 @@ const char *ksba_name_enum (ksba_name_t name, int idx); char *ksba_name_get_uri (ksba_name_t name, int idx); +/*-- der-builder.c --*/ +void ksba_der_release (ksba_der_t d); + +ksba_der_t ksba_der_builder_new (unsigned int nitems); +void ksba_der_builder_reset (ksba_der_t d); + +void ksba_der_add_ptr (ksba_der_t d, int cls, int tag, + void *value, size_t valuelen); +void ksba_der_add_val (ksba_der_t d, int cls, int tag, + const void *value, size_t valuelen); +void ksba_der_add_int (ksba_der_t d, const void *value, size_t valuelen, + int force_positive); +void ksba_der_add_oid (ksba_der_t d, const char *oidstr); +void ksba_der_add_bts (ksba_der_t d, const void *value, size_t valuelen, + unsigned int unusedbits); +void ksba_der_add_der (ksba_der_t d, const void *der, size_t derlen); +void ksba_der_add_tag (ksba_der_t d, int cls, int tag); +void ksba_der_add_end (ksba_der_t d); + +gpg_error_t ksba_der_builder_get (ksba_der_t d, + unsigned char **r_obj, size_t *r_objlen); + + + /*-- util.c --*/ void ksba_set_malloc_hooks ( void *(*new_alloc_func)(size_t n), void *(*new_realloc_func)(void *p, size_t n), diff --git a/src/ksba.h.in b/src/ksba.h.in new file mode 100644 index 0000000..78efc81 --- /dev/null +++ b/src/ksba.h.in @@ -0,0 +1,637 @@ +/* ksba.h - X.509 library used by GnuPG + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2010, 2011 + * 2012, 2013, 2104, 2015, 2019 g10 Code GmbH + * + * This file is part of KSBA. + * + * KSBA is free software; you can redistribute it and/or modify + * it under the terms of either + * + * - the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * or + * + * - 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. + * + * or both in parallel, as here. + * + * KSBA 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 copies of the GNU General Public License + * and the GNU Lesser General Public License along with this program; + * if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KSBA_H +#define KSBA_H 1 + +#include <gpg-error.h> +#include <stdio.h> + +#ifdef __cplusplus +extern "C" { +#if 0 + } +#endif +#endif + +/* The version of this header should match the one of the library. Do + * not use this symbol in your application; use assuan_check_version + * instead. */ +#define KSBA_VERSION "@VERSION@" + +/* The version number of this header. It may be used to handle minor + * API incompatibilities. */ +#define KSBA_VERSION_NUMBER @VERSION_NUMBER@ + + + +/* Check for compiler features. */ +#ifdef __GNUC__ +#define _KSBA_GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#if _KSBA_GCC_VERSION > 30100 +#define _KSBA_DEPRECATED __attribute__ ((__deprecated__)) +#endif +#endif /*__GNUC__*/ + +#ifndef _KSBA_DEPRECATED +#define _KSBA_DEPRECATED +#endif + + +#define KSBA_CLASS_UNIVERSAL 0 +#define KSBA_CLASS_APPLICATION 1 +#define KSBA_CLASS_CONTEXT 2 +#define KSBA_CLASS_PRIVATE 3 +#define KSBA_CLASS_ENCAPSULATE 0x80 /* Pseudo class. */ + +#define KSBA_TYPE_BOOLEAN 1 +#define KSBA_TYPE_INTEGER 2 +#define KSBA_TYPE_BIT_STRING 3 +#define KSBA_TYPE_OCTET_STRING 4 +#define KSBA_TYPE_NULL 5 +#define KSBA_TYPE_OBJECT_ID 6 +#define KSBA_TYPE_OBJECT_DESCRIPTOR 7 +#define KSBA_TYPE_EXTERNAL 8 +#define KSBA_TYPE_REAL 9 +#define KSBA_TYPE_ENUMERATED 10 +#define KSBA_TYPE_EMBEDDED_PDV 11 +#define KSBA_TYPE_UTF8_STRING 12 +#define KSBA_TYPE_RELATIVE_OID 13 +#define KSBA_TYPE_TIME 14 +#define KSBA_TYPE_SEQUENCE 16 +#define KSBA_TYPE_SET 17 +#define KSBA_TYPE_NUMERIC_STRING 18 +#define KSBA_TYPE_PRINTABLE_STRING 19 +#define KSBA_TYPE_TELETEX_STRING 20 +#define KSBA_TYPE_VIDEOTEX_STRING 21 +#define KSBA_TYPE_IA5_STRING 22 +#define KSBA_TYPE_UTC_TIME 23 +#define KSBA_TYPE_GENERALIZED_TIME 24 +#define KSBA_TYPE_GRAPHIC_STRING 25 +#define KSBA_TYPE_VISIBLE_STRING 26 +#define KSBA_TYPE_GENERAL_STRING 27 +#define KSBA_TYPE_UNIVERSAL_STRING 28 +#define KSBA_TYPE_CHARACTER_STRING 29 +#define KSBA_TYPE_BMP_STRING 30 +#define KSBA_TYPE_DATE 31 +#define KSBA_TYPE_TIME_OF_DAY 32 +#define KSBA_TYPE_DATE_TIME 33 +#define KSBA_TYPE_DURATION 34 +#define KSBA_TYPE_OID_IRI 35 +#define KSBA_TYPE_RELATIVE_OID_IRI 36 + + + +typedef gpg_error_t KsbaError _KSBA_DEPRECATED; + +typedef enum + { + KSBA_CT_NONE = 0, + KSBA_CT_DATA = 1, + KSBA_CT_SIGNED_DATA = 2, + KSBA_CT_ENVELOPED_DATA = 3, + KSBA_CT_DIGESTED_DATA = 4, + KSBA_CT_ENCRYPTED_DATA = 5, + KSBA_CT_AUTH_DATA = 6, + KSBA_CT_PKCS12 = 7, + KSBA_CT_SPC_IND_DATA_CTX = 8 + } +ksba_content_type_t; +typedef ksba_content_type_t KsbaContentType _KSBA_DEPRECATED; + + + +typedef enum + { + KSBA_SR_NONE = 0, /* Never seen by libksba user. */ + KSBA_SR_RUNNING = 1, /* Never seen by libksba user. */ + KSBA_SR_GOT_CONTENT = 2, + KSBA_SR_NEED_HASH = 3, + KSBA_SR_BEGIN_DATA = 4, + KSBA_SR_END_DATA = 5, + KSBA_SR_READY = 6, + KSBA_SR_NEED_SIG = 7, + KSBA_SR_DETACHED_DATA = 8, + KSBA_SR_BEGIN_ITEMS = 9, + KSBA_SR_GOT_ITEM = 10, + KSBA_SR_END_ITEMS = 11 + } +ksba_stop_reason_t; +typedef ksba_stop_reason_t KsbaStopReason _KSBA_DEPRECATED; + +typedef enum + { + KSBA_CRLREASON_UNSPECIFIED = 1, + KSBA_CRLREASON_KEY_COMPROMISE = 2, + KSBA_CRLREASON_CA_COMPROMISE = 4, + KSBA_CRLREASON_AFFILIATION_CHANGED = 8, + KSBA_CRLREASON_SUPERSEDED = 16, + KSBA_CRLREASON_CESSATION_OF_OPERATION = 32, + KSBA_CRLREASON_CERTIFICATE_HOLD = 64, + KSBA_CRLREASON_REMOVE_FROM_CRL = 256, + KSBA_CRLREASON_PRIVILEGE_WITHDRAWN = 512, + KSBA_CRLREASON_AA_COMPROMISE = 1024, + KSBA_CRLREASON_OTHER = 32768 + } +ksba_crl_reason_t; +typedef ksba_crl_reason_t KsbaCRLReason _KSBA_DEPRECATED; + +typedef enum + { + KSBA_OCSP_RSPSTATUS_SUCCESS = 0, + KSBA_OCSP_RSPSTATUS_MALFORMED = 1, + KSBA_OCSP_RSPSTATUS_INTERNAL = 2, + KSBA_OCSP_RSPSTATUS_TRYLATER = 3, + KSBA_OCSP_RSPSTATUS_SIGREQUIRED = 5, + KSBA_OCSP_RSPSTATUS_UNAUTHORIZED = 6, + KSBA_OCSP_RSPSTATUS_REPLAYED = 253, + KSBA_OCSP_RSPSTATUS_OTHER = 254, + KSBA_OCSP_RSPSTATUS_NONE = 255 + } +ksba_ocsp_response_status_t; + +typedef enum + { + KSBA_STATUS_NONE = 0, + KSBA_STATUS_UNKNOWN = 1, + KSBA_STATUS_GOOD = 2, + KSBA_STATUS_REVOKED = 4 + } +ksba_status_t; + + +typedef enum + { + KSBA_KEYUSAGE_DIGITAL_SIGNATURE = 1, + KSBA_KEYUSAGE_NON_REPUDIATION = 2, + KSBA_KEYUSAGE_KEY_ENCIPHERMENT = 4, + KSBA_KEYUSAGE_DATA_ENCIPHERMENT = 8, + KSBA_KEYUSAGE_KEY_AGREEMENT = 16, + KSBA_KEYUSAGE_KEY_CERT_SIGN = 32, + KSBA_KEYUSAGE_CRL_SIGN = 64, + KSBA_KEYUSAGE_ENCIPHER_ONLY = 128, + KSBA_KEYUSAGE_DECIPHER_ONLY = 256 + } +ksba_key_usage_t; +typedef ksba_key_usage_t KsbaKeyUsage _KSBA_DEPRECATED; + +/* ISO format, e.g. "19610711T172059", assumed to be UTC. */ +typedef char ksba_isotime_t[16]; + + +/* X.509 certificates are represented by this object. + ksba_cert_new() creates such an object */ +struct ksba_cert_s; +typedef struct ksba_cert_s *ksba_cert_t; +typedef struct ksba_cert_s *KsbaCert _KSBA_DEPRECATED; + +/* CMS objects are controlled by this object. + ksba_cms_new() creates it */ +struct ksba_cms_s; +typedef struct ksba_cms_s *ksba_cms_t; +typedef struct ksba_cms_s *KsbaCMS _KSBA_DEPRECATED; + +/* CRL objects are controlled by this object. + ksba_crl_new() creates it */ +struct ksba_crl_s; +typedef struct ksba_crl_s *ksba_crl_t; +typedef struct ksba_crl_s *KsbaCRL _KSBA_DEPRECATED; + +/* OCSP objects are controlled by this object. + ksba_ocsp_new() creates it. */ +struct ksba_ocsp_s; +typedef struct ksba_ocsp_s *ksba_ocsp_t; + +/* PKCS-10 creation is controlled by this object. + ksba_certreq_new() creates it */ +struct ksba_certreq_s; +typedef struct ksba_certreq_s *ksba_certreq_t; +typedef struct ksba_certreq_s *KsbaCertreq _KSBA_DEPRECATED; + +/* This is a reader object for various purposes + see ksba_reader_new et al. */ +struct ksba_reader_s; +typedef struct ksba_reader_s *ksba_reader_t; +typedef struct ksba_reader_s *KsbaReader _KSBA_DEPRECATED; + +/* This is a writer object for various purposes + see ksba_writer_new et al. */ +struct ksba_writer_s; +typedef struct ksba_writer_s *ksba_writer_t; +typedef struct ksba_writer_s *KsbaWriter _KSBA_DEPRECATED; + +/* This is an object to store an ASN.1 parse tree as + create by ksba_asn_parse_file() */ +struct ksba_asn_tree_s; +typedef struct ksba_asn_tree_s *ksba_asn_tree_t; +typedef struct ksba_asn_tree_s *KsbaAsnTree _KSBA_DEPRECATED; + +/* This is an object to reference a General Name. Such an object is + returned by several functions. */ +struct ksba_name_s; +typedef struct ksba_name_s *ksba_name_t; +typedef struct ksba_name_s *KsbaName _KSBA_DEPRECATED; + +/* KsbaSexp is just an unsigned char * which should be used for + documentation purpose. The S-expressions returned by libksba are + always in canonical representation with an extra 0 byte at the end, + so that one can print the values in the debugger and at least see + the first bytes */ +typedef unsigned char *ksba_sexp_t; +typedef unsigned char *KsbaSexp _KSBA_DEPRECATED; +typedef const unsigned char *ksba_const_sexp_t; +typedef const unsigned char *KsbaConstSexp _KSBA_DEPRECATED; + + +/* This is a generic object used by various functions. */ +struct ksba_der_s; +typedef struct ksba_der_s *ksba_der_t; + + +/*-- cert.c --*/ +gpg_error_t ksba_cert_new (ksba_cert_t *acert); +void ksba_cert_ref (ksba_cert_t cert); +void ksba_cert_release (ksba_cert_t cert); +gpg_error_t ksba_cert_set_user_data (ksba_cert_t cert, const char *key, + const void *data, size_t datalen); +gpg_error_t ksba_cert_get_user_data (ksba_cert_t cert, const char *key, + void *buffer, size_t bufferlen, + size_t *datalen); + +gpg_error_t ksba_cert_read_der (ksba_cert_t cert, ksba_reader_t reader); +gpg_error_t ksba_cert_init_from_mem (ksba_cert_t cert, + const void *buffer, size_t length); +const unsigned char *ksba_cert_get_image (ksba_cert_t cert, size_t *r_length); +gpg_error_t ksba_cert_hash (ksba_cert_t cert, + int what, + void (*hasher)(void *, + const void *, + size_t length), + void *hasher_arg); +const char *ksba_cert_get_digest_algo (ksba_cert_t cert); +ksba_sexp_t ksba_cert_get_serial (ksba_cert_t cert); +char *ksba_cert_get_issuer (ksba_cert_t cert, int idx); +gpg_error_t ksba_cert_get_validity (ksba_cert_t cert, int what, + ksba_isotime_t r_time); +char *ksba_cert_get_subject (ksba_cert_t cert, int idx); +ksba_sexp_t ksba_cert_get_public_key (ksba_cert_t cert); +ksba_sexp_t ksba_cert_get_sig_val (ksba_cert_t cert); + +gpg_error_t ksba_cert_get_extension (ksba_cert_t cert, int idx, + char const **r_oid, int *r_crit, + size_t *r_deroff, size_t *r_derlen); + +gpg_error_t ksba_cert_is_ca (ksba_cert_t cert, int *r_ca, int *r_pathlen); +gpg_error_t ksba_cert_get_key_usage (ksba_cert_t cert, unsigned int *r_flags); +gpg_error_t ksba_cert_get_cert_policies (ksba_cert_t cert, char **r_policies); +gpg_error_t ksba_cert_get_ext_key_usages (ksba_cert_t cert, char **result); +gpg_error_t ksba_cert_get_crl_dist_point (ksba_cert_t cert, int idx, + ksba_name_t *r_distpoint, + ksba_name_t *r_issuer, + ksba_crl_reason_t *r_reason); +gpg_error_t ksba_cert_get_auth_key_id (ksba_cert_t cert, + ksba_sexp_t *r_keyid, + ksba_name_t *r_name, + ksba_sexp_t *r_serial); +gpg_error_t ksba_cert_get_subj_key_id (ksba_cert_t cert, + int *r_crit, + ksba_sexp_t *r_keyid); +gpg_error_t ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx, + char **r_method, + ksba_name_t *r_location); +gpg_error_t ksba_cert_get_subject_info_access (ksba_cert_t cert, int idx, + char **r_method, + ksba_name_t *r_location); + + +/*-- cms.c --*/ +ksba_content_type_t ksba_cms_identify (ksba_reader_t reader); + +gpg_error_t ksba_cms_new (ksba_cms_t *r_cms); +void ksba_cms_release (ksba_cms_t cms); +gpg_error_t ksba_cms_set_reader_writer (ksba_cms_t cms, + ksba_reader_t r, ksba_writer_t w); + +gpg_error_t ksba_cms_parse (ksba_cms_t cms, ksba_stop_reason_t *r_stopreason); +gpg_error_t ksba_cms_build (ksba_cms_t cms, ksba_stop_reason_t *r_stopreason); + +ksba_content_type_t ksba_cms_get_content_type (ksba_cms_t cms, int what); +const char *ksba_cms_get_content_oid (ksba_cms_t cms, int what); +gpg_error_t ksba_cms_get_content_enc_iv (ksba_cms_t cms, void *iv, + size_t maxivlen, size_t *ivlen); +const char *ksba_cms_get_digest_algo_list (ksba_cms_t cms, int idx); +gpg_error_t ksba_cms_get_issuer_serial (ksba_cms_t cms, int idx, + char **r_issuer, + ksba_sexp_t *r_serial); +const char *ksba_cms_get_digest_algo (ksba_cms_t cms, int idx); +ksba_cert_t ksba_cms_get_cert (ksba_cms_t cms, int idx); +gpg_error_t ksba_cms_get_message_digest (ksba_cms_t cms, int idx, + char **r_digest, size_t *r_digest_len); +gpg_error_t ksba_cms_get_signing_time (ksba_cms_t cms, int idx, + ksba_isotime_t r_sigtime); +gpg_error_t ksba_cms_get_sigattr_oids (ksba_cms_t cms, int idx, + const char *reqoid, char **r_value); +ksba_sexp_t ksba_cms_get_sig_val (ksba_cms_t cms, int idx); +ksba_sexp_t ksba_cms_get_enc_val (ksba_cms_t cms, int idx); + +void ksba_cms_set_hash_function (ksba_cms_t cms, + void (*hash_fnc)(void *, const void *, size_t), + void *hash_fnc_arg); + +gpg_error_t ksba_cms_hash_signed_attrs (ksba_cms_t cms, int idx); + + +gpg_error_t ksba_cms_set_content_type (ksba_cms_t cms, int what, + ksba_content_type_t type); +gpg_error_t ksba_cms_add_digest_algo (ksba_cms_t cms, const char *oid); +gpg_error_t ksba_cms_add_signer (ksba_cms_t cms, ksba_cert_t cert); +gpg_error_t ksba_cms_add_cert (ksba_cms_t cms, ksba_cert_t cert); +gpg_error_t ksba_cms_add_smime_capability (ksba_cms_t cms, const char *oid, + const unsigned char *der, + size_t derlen); +gpg_error_t ksba_cms_set_message_digest (ksba_cms_t cms, int idx, + const unsigned char *digest, + size_t digest_len); +gpg_error_t ksba_cms_set_signing_time (ksba_cms_t cms, int idx, + const ksba_isotime_t sigtime); +gpg_error_t ksba_cms_set_sig_val (ksba_cms_t cms, + int idx, ksba_const_sexp_t sigval); + +gpg_error_t ksba_cms_set_content_enc_algo (ksba_cms_t cms, + const char *oid, + const void *iv, + size_t ivlen); +gpg_error_t ksba_cms_add_recipient (ksba_cms_t cms, ksba_cert_t cert); +gpg_error_t ksba_cms_set_enc_val (ksba_cms_t cms, + int idx, ksba_const_sexp_t encval); + + +/*-- crl.c --*/ +gpg_error_t ksba_crl_new (ksba_crl_t *r_crl); +void ksba_crl_release (ksba_crl_t crl); +gpg_error_t ksba_crl_set_reader (ksba_crl_t crl, ksba_reader_t r); +void ksba_crl_set_hash_function (ksba_crl_t crl, + void (*hash_fnc)(void *, + const void *, size_t), + void *hash_fnc_arg); +const char *ksba_crl_get_digest_algo (ksba_crl_t crl); +gpg_error_t ksba_crl_get_issuer (ksba_crl_t crl, char **r_issuer); +gpg_error_t ksba_crl_get_extension (ksba_crl_t crl, int idx, + char const **oid, int *critical, + unsigned char const **der, size_t *derlen); +gpg_error_t ksba_crl_get_auth_key_id (ksba_crl_t crl, + ksba_sexp_t *r_keyid, + ksba_name_t *r_name, + ksba_sexp_t *r_serial); +gpg_error_t ksba_crl_get_crl_number (ksba_crl_t crl, ksba_sexp_t *number); +gpg_error_t ksba_crl_get_update_times (ksba_crl_t crl, + ksba_isotime_t this_update, + ksba_isotime_t next_update); +gpg_error_t ksba_crl_get_item (ksba_crl_t crl, + ksba_sexp_t *r_serial, + ksba_isotime_t r_revocation_date, + ksba_crl_reason_t *r_reason); +ksba_sexp_t ksba_crl_get_sig_val (ksba_crl_t crl); +gpg_error_t ksba_crl_parse (ksba_crl_t crl, ksba_stop_reason_t *r_stopreason); + + + +/*-- ocsp.c --*/ +gpg_error_t ksba_ocsp_new (ksba_ocsp_t *r_oscp); +void ksba_ocsp_release (ksba_ocsp_t ocsp); +gpg_error_t ksba_ocsp_set_digest_algo (ksba_ocsp_t ocsp, const char *oid); +gpg_error_t ksba_ocsp_set_requestor (ksba_ocsp_t ocsp, ksba_cert_t cert); +gpg_error_t ksba_ocsp_add_target (ksba_ocsp_t ocsp, + ksba_cert_t cert, ksba_cert_t issuer_cert); +size_t ksba_ocsp_set_nonce (ksba_ocsp_t ocsp, + unsigned char *nonce, size_t noncelen); + +gpg_error_t ksba_ocsp_prepare_request (ksba_ocsp_t ocsp); +gpg_error_t ksba_ocsp_hash_request (ksba_ocsp_t ocsp, + void (*hasher)(void *, const void *, + size_t length), + void *hasher_arg); +gpg_error_t ksba_ocsp_set_sig_val (ksba_ocsp_t ocsp, + ksba_const_sexp_t sigval); +gpg_error_t ksba_ocsp_add_cert (ksba_ocsp_t ocsp, ksba_cert_t cert); +gpg_error_t ksba_ocsp_build_request (ksba_ocsp_t ocsp, + unsigned char **r_buffer, + size_t *r_buflen); + +gpg_error_t ksba_ocsp_parse_response (ksba_ocsp_t ocsp, + const unsigned char *msg, size_t msglen, + ksba_ocsp_response_status_t *resp_status); + +const char *ksba_ocsp_get_digest_algo (ksba_ocsp_t ocsp); +gpg_error_t ksba_ocsp_hash_response (ksba_ocsp_t ocsp, + const unsigned char *msg, size_t msglen, + void (*hasher)(void *, const void *, + size_t length), + void *hasher_arg); +ksba_sexp_t ksba_ocsp_get_sig_val (ksba_ocsp_t ocsp, + ksba_isotime_t produced_at); +gpg_error_t ksba_ocsp_get_responder_id (ksba_ocsp_t ocsp, + char **r_name, + ksba_sexp_t *r_keyid); +ksba_cert_t ksba_ocsp_get_cert (ksba_ocsp_t ocsp, int idx); +gpg_error_t ksba_ocsp_get_status (ksba_ocsp_t ocsp, ksba_cert_t cert, + ksba_status_t *r_status, + ksba_isotime_t r_this_update, + ksba_isotime_t r_next_update, + ksba_isotime_t r_revocation_time, + ksba_crl_reason_t *r_reason); +gpg_error_t ksba_ocsp_get_extension (ksba_ocsp_t ocsp, ksba_cert_t cert, + int idx, + char const **r_oid, int *r_crit, + unsigned char const **r_der, + size_t *r_derlen); + + +/*-- certreq.c --*/ +gpg_error_t ksba_certreq_new (ksba_certreq_t *r_cr); +void ksba_certreq_release (ksba_certreq_t cr); +gpg_error_t ksba_certreq_set_writer (ksba_certreq_t cr, ksba_writer_t w); +void ksba_certreq_set_hash_function ( + ksba_certreq_t cr, + void (*hash_fnc)(void *, const void *, size_t), + void *hash_fnc_arg); +gpg_error_t ksba_certreq_add_subject (ksba_certreq_t cr, const char *name); +gpg_error_t ksba_certreq_set_public_key (ksba_certreq_t cr, + ksba_const_sexp_t key); +gpg_error_t ksba_certreq_add_extension (ksba_certreq_t cr, + const char *oid, int is_crit, + const void *der, + size_t derlen); +gpg_error_t ksba_certreq_set_sig_val (ksba_certreq_t cr, + ksba_const_sexp_t sigval); +gpg_error_t ksba_certreq_build (ksba_certreq_t cr, + ksba_stop_reason_t *r_stopreason); + +/* The functions below are used to switch to X.509 certificate creation. */ +gpg_error_t ksba_certreq_set_serial (ksba_certreq_t cr, ksba_const_sexp_t sn); +gpg_error_t ksba_certreq_set_issuer (ksba_certreq_t cr, const char *name); +gpg_error_t ksba_certreq_set_validity (ksba_certreq_t cr, int what, + const ksba_isotime_t timebuf); +gpg_error_t ksba_certreq_set_siginfo (ksba_certreq_t cr, + ksba_const_sexp_t siginfo); + + + +/*-- reader.c --*/ +gpg_error_t ksba_reader_new (ksba_reader_t *r_r); +void ksba_reader_release (ksba_reader_t r); +gpg_error_t ksba_reader_set_release_notify (ksba_reader_t r, + void (*notify)(void*,ksba_reader_t), + void *notify_value); +gpg_error_t ksba_reader_clear (ksba_reader_t r, + unsigned char **buffer, size_t *buflen); +gpg_error_t ksba_reader_error (ksba_reader_t r); + +gpg_error_t ksba_reader_set_mem (ksba_reader_t r, + const void *buffer, size_t length); +gpg_error_t ksba_reader_set_fd (ksba_reader_t r, int fd); +gpg_error_t ksba_reader_set_file (ksba_reader_t r, FILE *fp); +gpg_error_t ksba_reader_set_cb (ksba_reader_t r, + int (*cb)(void*,char *,size_t,size_t*), + void *cb_value ); + +gpg_error_t ksba_reader_read (ksba_reader_t r, + char *buffer, size_t length, size_t *nread); +gpg_error_t ksba_reader_unread (ksba_reader_t r, const void *buffer, size_t count); +unsigned long ksba_reader_tell (ksba_reader_t r); + +/*-- writer.c --*/ +gpg_error_t ksba_writer_new (ksba_writer_t *r_w); +void ksba_writer_release (ksba_writer_t w); +gpg_error_t ksba_writer_set_release_notify (ksba_writer_t w, + void (*notify)(void*,ksba_writer_t), + void *notify_value); +int ksba_writer_error (ksba_writer_t w); +unsigned long ksba_writer_tell (ksba_writer_t w); +gpg_error_t ksba_writer_set_fd (ksba_writer_t w, int fd); +gpg_error_t ksba_writer_set_file (ksba_writer_t w, FILE *fp); +gpg_error_t ksba_writer_set_cb (ksba_writer_t w, + int (*cb)(void*,const void *,size_t), + void *cb_value); +gpg_error_t ksba_writer_set_mem (ksba_writer_t w, size_t initial_size); +const void *ksba_writer_get_mem (ksba_writer_t w, size_t *nbytes); +void * ksba_writer_snatch_mem (ksba_writer_t w, size_t *nbytes); +gpg_error_t ksba_writer_set_filter (ksba_writer_t w, + gpg_error_t (*filter)(void*, + const void *,size_t, size_t *, + void *, size_t, size_t *), + void *filter_arg); + +gpg_error_t ksba_writer_write (ksba_writer_t w, const void *buffer, size_t length); +gpg_error_t ksba_writer_write_octet_string (ksba_writer_t w, + const void *buffer, size_t length, + int flush); + +/*-- asn1-parse.y --*/ +int ksba_asn_parse_file (const char *filename, ksba_asn_tree_t *result, + int debug); +void ksba_asn_tree_release (ksba_asn_tree_t tree); + +/*-- asn1-func.c --*/ +void ksba_asn_tree_dump (ksba_asn_tree_t tree, const char *name, FILE *fp); +gpg_error_t ksba_asn_create_tree (const char *mod_name, ksba_asn_tree_t *result); + +/*-- oid.c --*/ +char *ksba_oid_to_str (const char *buffer, size_t length); +gpg_error_t ksba_oid_from_str (const char *string, + unsigned char **rbuf, size_t *rlength); + +/*-- dn.c --*/ +gpg_error_t ksba_dn_der2str (const void *der, size_t derlen, char **r_string); +gpg_error_t ksba_dn_str2der (const char *string, + unsigned char **rder, size_t *rderlen); +gpg_error_t ksba_dn_teststr (const char *string, int seq, + size_t *rerroff, size_t *rerrlen); + + +/*-- name.c --*/ +gpg_error_t ksba_name_new (ksba_name_t *r_name); +void ksba_name_ref (ksba_name_t name); +void ksba_name_release (ksba_name_t name); +const char *ksba_name_enum (ksba_name_t name, int idx); +char *ksba_name_get_uri (ksba_name_t name, int idx); + + +/*-- der-builder.c --*/ +void ksba_der_release (ksba_der_t d); + +ksba_der_t ksba_der_builder_new (unsigned int nitems); +void ksba_der_builder_reset (ksba_der_t d); + +void ksba_der_add_ptr (ksba_der_t d, int cls, int tag, + void *value, size_t valuelen); +void ksba_der_add_val (ksba_der_t d, int cls, int tag, + const void *value, size_t valuelen); +void ksba_der_add_int (ksba_der_t d, const void *value, size_t valuelen, + int force_positive); +void ksba_der_add_oid (ksba_der_t d, const char *oidstr); +void ksba_der_add_bts (ksba_der_t d, const void *value, size_t valuelen, + unsigned int unusedbits); +void ksba_der_add_der (ksba_der_t d, const void *der, size_t derlen); +void ksba_der_add_tag (ksba_der_t d, int cls, int tag); +void ksba_der_add_end (ksba_der_t d); + +gpg_error_t ksba_der_builder_get (ksba_der_t d, + unsigned char **r_obj, size_t *r_objlen); + + + +/*-- util.c --*/ +void ksba_set_malloc_hooks ( void *(*new_alloc_func)(size_t n), + void *(*new_realloc_func)(void *p, size_t n), + void (*new_free_func)(void*) ); +void ksba_set_hash_buffer_function ( gpg_error_t (*fnc) + (void *arg, const char *oid, + const void *buffer, size_t length, + size_t resultsize, + unsigned char *result, + size_t *resultlen), + void *fnc_arg); +void *ksba_malloc (size_t n ); +void *ksba_calloc (size_t n, size_t m ); +void *ksba_realloc (void *p, size_t n); +char *ksba_strdup (const char *p); +void ksba_free ( void *a ); + +/*--version.c --*/ +const char *ksba_check_version (const char *req_version); + +#ifdef __cplusplus +} +#endif +#endif /*KSBA_H*/ diff --git a/src/ksba.m4 b/src/ksba.m4 index 73b2e26..ad8de4f 100644 --- a/src/ksba.m4 +++ b/src/ksba.m4 @@ -1,5 +1,5 @@ # ksba.m4 - autoconf macro to detect ksba -# Copyright (C) 2002 g10 Code GmbH +# Copyright (C) 2002, 2018 g10 Code GmbH # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -21,19 +21,39 @@ dnl this features allows to prevent build against newer versions of libksba dnl with a changed API. dnl AC_DEFUN([AM_PATH_KSBA], -[AC_REQUIRE([AC_CANONICAL_HOST]) - AC_ARG_WITH(ksba-prefix, - AC_HELP_STRING([--with-ksba-prefix=PFX], - [prefix where KSBA is installed (optional)]), +[ AC_REQUIRE([AC_CANONICAL_HOST]) + dnl --with-libksba-prefix=PFX is the preferred name for this option, + dnl since that is consistent with how our three siblings use the directory/ + dnl package name in --with-$dir_name-prefix=PFX. + AC_ARG_WITH(libksba-prefix, + AC_HELP_STRING([--with-libksba-prefix=PFX], + [prefix where KSBA is installed (optional)]), ksba_config_prefix="$withval", ksba_config_prefix="") + + dnl Accept --with-ksba-prefix and make it work the same as + dnl --with-libksba-prefix above, for backwards compatibility, + dnl but do not document this old, inconsistently-named option. + AC_ARG_WITH(ksba-prefix,, + ksba_config_prefix="$withval", ksba_config_prefix="") + if test x$ksba_config_prefix != x ; then - ksba_config_args="$ksba_config_args --prefix=$ksba_config_prefix" - if test x${KSBA_CONFIG+set} != xset ; then - KSBA_CONFIG=$ksba_config_prefix/bin/ksba-config - fi + if test x${KSBA_CONFIG+set} != xset ; then + KSBA_CONFIG=$ksba_config_prefix/bin/ksba-config + fi + fi + + use_gpgrt_config="" + if test x"$KSBA_CONFIG" = x -a x"$GPGRT_CONFIG" != x -a "$GPGRT_CONFIG" != "no"; then + if $GPGRT_CONFIG ksba --exists; then + KSBA_CONFIG="$GPGRT_CONFIG ksba" + AC_MSG_NOTICE([Use gpgrt-config as ksba-config]) + use_gpgrt_config=yes + fi + fi + if test -z "$use_gpgrt_config"; then + AC_PATH_PROG(KSBA_CONFIG, ksba-config, no) fi - AC_PATH_PROG(KSBA_CONFIG, ksba-config, no) tmp=ifelse([$1], ,1:1.0.0,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_ksba_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` @@ -52,7 +72,11 @@ AC_DEFUN([AM_PATH_KSBA], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` req_micro=`echo $min_ksba_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` - ksba_config_version=`$KSBA_CONFIG $ksba_config_args --version` + if test -z "$use_gpgrt_config"; then + ksba_config_version=`$KSBA_CONFIG --version` + else + ksba_config_version=`$KSBA_CONFIG --modversion` + fi major=`echo $ksba_config_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` minor=`echo $ksba_config_version | \ @@ -84,7 +108,11 @@ AC_DEFUN([AM_PATH_KSBA], # Even if we have a recent libksba, we should check that the # API is compatible. if test "$req_ksba_api" -gt 0 ; then - tmp=`$KSBA_CONFIG --api-version 2>/dev/null || echo 0` + if test -z "$use_gpgrt_config"; then + tmp=`$KSBA_CONFIG --api-version 2>/dev/null || echo 0` + else + tmp=`$KSBA_CONFIG --variable=api_version 2>/dev/null || echo 0` + fi if test "$tmp" -gt 0 ; then AC_MSG_CHECKING([KSBA API version]) if test "$req_ksba_api" -eq "$tmp" ; then @@ -97,15 +125,19 @@ AC_DEFUN([AM_PATH_KSBA], fi fi if test $ok = yes; then - KSBA_CFLAGS=`$KSBA_CONFIG $ksba_config_args --cflags` - KSBA_LIBS=`$KSBA_CONFIG $ksba_config_args --libs` + KSBA_CFLAGS=`$KSBA_CONFIG --cflags` + KSBA_LIBS=`$KSBA_CONFIG --libs` ifelse([$2], , :, [$2]) - libksba_config_host=`$LIBKSBA_CONFIG $ksba_config_args --host 2>/dev/null || echo none` + if test -z "$use_gpgrt_config"; then + libksba_config_host=`$KSBA_CONFIG --host 2>/dev/null || echo none` + else + libksba_config_host=`$KSBA_CONFIG --variable=host 2>/dev/null || echo none` + fi if test x"$libksba_config_host" != xnone ; then if test x"$libksba_config_host" != x"$host" ; then AC_MSG_WARN([[ *** -*** The config script $LIBKSBA_CONFIG was +*** The config script "$KSBA_CONFIG" was *** built for $libksba_config_host and thus may not match the *** used host $host. *** You may want to use the configure option --with-libksba-prefix diff --git a/src/ksba.pc.in b/src/ksba.pc.in new file mode 100644 index 0000000..96b5d7d --- /dev/null +++ b/src/ksba.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=@includedir@ +libdir=@libdir@ +host=@KSBA_CONFIG_HOST@ +api_version=@KSBA_CONFIG_API_VERSION@ + +Name: ksba +Description: X.509 and CMS support library +Requires: gpg-error +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} @KSBA_CONFIG_CFLAGS@ +Libs: -L${libdir} @KSBA_CONFIG_LIBS@ +URL: http://www.gnupg.org/related_software/libksba/ diff --git a/src/libksba.def b/src/libksba.def index 004ba3a..cd2d81c 100644 --- a/src/libksba.def +++ b/src/libksba.def @@ -194,3 +194,16 @@ EXPORTS ksba_certreq_set_issuer @149 ksba_certreq_set_validity @150 ksba_certreq_set_siginfo @151 + + ksba_der_release @152 + ksba_der_builder_new @153 + ksba_der_builder_reset @154 + ksba_der_add_ptr @155 + ksba_der_add_val @156 + ksba_der_add_int @157 + ksba_der_add_oid @158 + ksba_der_add_bts @159 + ksba_der_add_der @160 + ksba_der_add_tag @161 + ksba_der_add_end @162 + ksba_der_builder_get @163 diff --git a/src/libksba.vers b/src/libksba.vers index dd6080f..271eedb 100644 --- a/src/libksba.vers +++ b/src/libksba.vers @@ -108,6 +108,12 @@ KSBA_0.9 { ksba_writer_snatch_mem; ksba_writer_tell; ksba_writer_write; ksba_writer_write_octet_string; ksba_writer_set_release_notify; + ksba_der_release; ksba_der_builder_new; ksba_der_builder_reset; + ksba_der_add_ptr; ksba_der_add_val; ksba_der_add_int; + ksba_der_add_oid; ksba_der_add_bts; ksba_der_add_der; + ksba_der_add_tag; ksba_der_add_end; + ksba_der_builder_get; + local: *; }; @@ -63,202 +63,6 @@ dump_hex (const unsigned char *p, size_t n) } #endif - -static void -parse_skip (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - if (ti->length) - { - assert (ti->length <= *len); - *len -= ti->length; - *buf += ti->length; - } -} - -static gpg_error_t -parse_sequence (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_SEQUENCE - && ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - return err; -} - -static gpg_error_t -parse_enumerated (unsigned char const **buf, size_t *len, struct tag_info *ti, - size_t maxlen) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_ENUMERATED - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (maxlen && ti->length > maxlen) - err = gpg_error (GPG_ERR_TOO_LARGE); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - -static gpg_error_t -parse_integer (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_INTEGER - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - -static gpg_error_t -parse_octet_string (unsigned char const **buf, size_t *len, struct tag_info *ti) -{ - gpg_error_t err; - - err= _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_UNIVERSAL && ti->tag == TYPE_OCTET_STRING - && !ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti->length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - - -/* Note that R_BOOL will only be set if a value has been given. Thus - the caller should set it to the default value prior to calling this - function. Obviously no call to parse_skip is required after - calling this function. */ -static gpg_error_t -parse_optional_boolean (unsigned char const **buf, size_t *len, int *r_bool) -{ - gpg_error_t err; - struct tag_info ti; - - err = _ksba_ber_parse_tl (buf, len, &ti); - if (err) - ; - else if (!ti.length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti.length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - else if (ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_BOOLEAN - && !ti.is_constructed) - { - if (ti.length != 1) - err = gpg_error (GPG_ERR_BAD_BER); - *r_bool = !!**buf; - parse_skip (buf, len, &ti); - } - else - { /* Undo the read. */ - *buf -= ti.nhdr; - *len += ti.nhdr; - } - - return err; -} - - - -static gpg_error_t -parse_object_id_into_str (unsigned char const **buf, size_t *len, char **oid) -{ - struct tag_info ti; - gpg_error_t err; - - *oid = NULL; - err = _ksba_ber_parse_tl (buf, len, &ti); - if (err) - ; - else if (!(ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_OBJECT_ID - && !ti.is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (!ti.length) - err = gpg_error (GPG_ERR_TOO_SHORT); - else if (ti.length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - else if (!(*oid = ksba_oid_to_str (*buf, ti.length))) - err = gpg_error_from_syserror (); - else - { - *buf += ti.length; - *len -= ti.length; - } - return err; -} - - -static gpg_error_t -parse_asntime_into_isotime (unsigned char const **buf, size_t *len, - ksba_isotime_t isotime) -{ - struct tag_info ti; - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, &ti); - if (err) - ; - else if ( !(ti.class == CLASS_UNIVERSAL - && (ti.tag == TYPE_UTC_TIME || ti.tag == TYPE_GENERALIZED_TIME) - && !ti.is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (ti.length > *len) - err = gpg_error (GPG_ERR_INV_BER); - else if (!(err = _ksba_asntime_to_iso (*buf, ti.length, - ti.tag == TYPE_UTC_TIME, isotime))) - parse_skip (buf, len, &ti); - - return err; -} - - -static gpg_error_t -parse_context_tag (unsigned char const **buf, size_t *len, struct tag_info *ti, - int tag) -{ - gpg_error_t err; - - err = _ksba_ber_parse_tl (buf, len, ti); - if (err) - ; - else if (!(ti->class == CLASS_CONTEXT && ti->tag == tag - && ti->is_constructed) ) - err = gpg_error (GPG_ERR_INV_OBJ); - else if (ti->length > *len) - err = gpg_error (GPG_ERR_BAD_BER); - - return err; -} - - /* Create a new OCSP object and retrun it in R_OCSP. Return 0 on success or an error code. @@ -616,8 +420,6 @@ ksba_ocsp_prepare_request (ksba_ocsp_t ocsp) /* Write the serialNumber of the certificate to be checked. */ err = _ksba_cert_get_serial_ptr (ri->cert, &der, &derlen); if (!err) - err = _ksba_ber_write_tl (w1, TYPE_INTEGER, CLASS_UNIVERSAL, 0, derlen); - if (!err) err = ksba_writer_write (w1, der, derlen); if (err) goto leave; @@ -171,9 +171,9 @@ make_flagged_int (unsigned long value, char *buf, size_t buflen) * * Convertes the OID given in dotted decimal form to an DER encoding * and returns it in allocated buffer rbuf and its length in rlength. - * rbuf is set to NULL in case of an error is returned. + * rbuf is set to NULL in case an error is returned. * Scanning stops at the first white space. - + * * The caller must free the returned buffer using ksba_free() or the * function he has registered as a replacement. * diff --git a/src/reader.c b/src/reader.c index c59978d..475054e 100644 --- a/src/reader.c +++ b/src/reader.c @@ -31,6 +31,7 @@ #include <config.h> #include <stdio.h> #include <stdlib.h> +#include <unistd.h> #include <string.h> #include <assert.h> #include <errno.h> @@ -101,12 +102,12 @@ ksba_reader_set_release_notify (ksba_reader_t r, /* Clear the error and eof indicators for READER, so that it can be - continued to use. Also dicards any unread bytes. This is usually - required if the upper layer want to send to send an EOF to indicate + continued to use. Also discards any unread bytes. This is usually + required if the upper layer wants to send an EOF to indicate the logical end of one part of a file. If BUFFER and BUFLEN are not NULL, possible unread data is copied to a newly allocated buffer and this buffer is assigned to BUFFER, BUFLEN will be set to - the length of the unread bytes. */ + the length of the unread bytes. */ gpg_error_t ksba_reader_clear (ksba_reader_t r, unsigned char **buffer, size_t *buflen) { @@ -407,6 +408,41 @@ ksba_reader_read (ksba_reader_t r, char *buffer, size_t length, size_t *nread) } r->nread += *nread; } + else if (r->type == READER_TYPE_FD) + { + ssize_t n; + + if (r->eof) + return gpg_error (GPG_ERR_EOF); + + if (!length) + { + *nread = 0; + return 0; + } + + n = read (r->u.fd, buffer, length); + if (n > 0) + { + r->nread += n; + *nread = n; + } + else + { + *nread = 0; + + if (n < 0) + { + r->error = errno; + return gpg_error_from_errno (errno); + } + else + { + r->eof = 1; + return gpg_error (GPG_ERR_EOF); + } + } + } else return gpg_error (GPG_ERR_BUG); diff --git a/src/sexp-parse.h b/src/sexp-parse.h index 61d77b3..e211a0d 100644 --- a/src/sexp-parse.h +++ b/src/sexp-parse.h @@ -52,7 +52,7 @@ snext (unsigned char const **buf) } /* Skip over the S-Expression BUF points to and update BUF to point to - the chacter right behind. DEPTH gives the initial number of open + the byte right behind. DEPTH gives the initial number of open lists and may be passed as a positive number to skip over the remainder of an S-Expression if the current position is somewhere in an S-Expression. The function may return an error code if it diff --git a/src/stringbuf.h b/src/stringbuf.h new file mode 100644 index 0000000..197f153 --- /dev/null +++ b/src/stringbuf.h @@ -0,0 +1,183 @@ +/* stringbuf.h - Inline functions for building strings. + * Copyright (C) 2001, 2002, 2007, 2008, 2012, 2020 g10 Code GmbH + * + * This file is part of KSBA. + * + * KSBA is free software; you can redistribute it and/or modify + * it under the terms of either + * + * - the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * or + * + * - 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. + * + * or both in parallel, as here. + * + * KSBA 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 copies of the GNU General Public License + * and the GNU Lesser General Public License along with this program; + * if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef STRINGBUF_H +#define STRINGBUF_H 1 + +#include "util.h" +#include "errno.h" + +struct stringbuf +{ + size_t len; + size_t size; + char *buf; + gpg_error_t out_of_core; +}; + + +static inline void +init_stringbuf (struct stringbuf *sb, int initiallen) +{ + sb->len = 0; + sb->size = initiallen; + sb->out_of_core = 0; + /* allocate one more, so that get_stringbuf can append a nul */ + sb->buf = xtrymalloc (initiallen+1); + if (!sb->buf) + sb->out_of_core = errno? errno : ENOMEM; +} + + +static inline void +deinit_stringbuf (struct stringbuf *sb) +{ + xfree (sb->buf); + sb->buf = NULL; + sb->out_of_core = ENOMEM; /* make sure the caller does an init before reuse */ +} + + +static inline void +put_stringbuf_mem (struct stringbuf *sb, const char *text, size_t n) +{ + if (sb->out_of_core) + return; + + if (sb->len + n >= sb->size) + { + char *p; + + sb->size += n + 100; + p = xtryrealloc (sb->buf, sb->size + 1); + if (!p) + { + sb->out_of_core = errno? errno : ENOMEM; + return; + } + sb->buf = p; + } + memcpy (sb->buf+sb->len, text, n); + sb->len += n; +} + + +static inline void +put_stringbuf_mem_skip (struct stringbuf *sb, const char *text, size_t n, + int skip) +{ + char *p; + + if (!skip) + { + put_stringbuf_mem (sb, text, n); + return; + } + if (sb->out_of_core) + return; + + if (sb->len + n >= sb->size) + { + /* Note: we allocate too much here, but we don't care. */ + sb->size += n + 100; + p = xtryrealloc (sb->buf, sb->size + 1); + if ( !p) + { + sb->out_of_core = errno? errno : ENOMEM; + return; + } + sb->buf = p; + } + p = sb->buf+sb->len; + while (n > skip) + { + text += skip; + n -= skip; + *p++ = *text++; + n--; + sb->len++; + } +} + + +static inline void +put_stringbuf (struct stringbuf *sb, const char *text) +{ + put_stringbuf_mem (sb, text,strlen (text)); +} + + +static inline void +put_stringbuf_mem_sexp (struct stringbuf *sb, const char *text, size_t length) +{ + char buf[20]; + sprintf (buf,"%u:", (unsigned int)length); + put_stringbuf (sb, buf); + put_stringbuf_mem (sb, text, length); +} + + +static inline void +put_stringbuf_sexp (struct stringbuf *sb, const char *text) +{ + put_stringbuf_mem_sexp (sb, text, strlen (text)); +} + + +static inline void +put_stringbuf_uint (struct stringbuf *sb, unsigned int value) +{ + char buf[35]; + snprintf (buf, sizeof buf, "%u", (unsigned int)value); + put_stringbuf_sexp (sb, buf); +} + + +static inline char * +get_stringbuf (struct stringbuf *sb) +{ + char *p; + + if (sb->out_of_core) + { + xfree (sb->buf); sb->buf = NULL; + gpg_err_set_errno (sb->out_of_core); + return NULL; + } + + sb->buf[sb->len] = 0; + p = sb->buf; + sb->buf = NULL; + sb->out_of_core = ENOMEM; /* make sure the caller does an init before reuse */ + return p; +} + + +#endif /*STRINGBUF_H*/ @@ -166,6 +166,55 @@ ksba_strdup (const char *str) } +/* This is safe version of realloc useful for reallocing a calloced + * array. There are two ways to call it: The first example + * reallocates the array A to N elements each of SIZE but does not + * clear the newly allocated elements: + * + * p = _ksba_reallocarray (a, n, n, nsize); + * + * Note that when NOLD is larger than N no cleaning is needed anyway. + * The second example reallocates an array of size NOLD to N elements + * each of SIZE but clear the newly allocated elements: + * + * p = _ksba_reallocarray (a, nold, n, nsize); + * + * Note that gpgrt_reallocarray (NULL, 0, n, nsize) is equivalent to + * _ksba_calloc (n, nsize). + * + */ +void * +_ksba_reallocarray (void *a, size_t oldnmemb, size_t nmemb, size_t size) +{ + size_t oldbytes, bytes; + char *p; + + bytes = nmemb * size; /* size_t is unsigned so the behavior on overflow + * is defined. */ + if (size && bytes / size != nmemb) + { + gpg_err_set_errno (ENOMEM); + return NULL; + } + + p = ksba_realloc (a, bytes); + if (p && oldnmemb < nmemb) + { + /* OLDNMEMBS is lower than NMEMB thus the user asked for a + calloc. Clear all newly allocated members. */ + oldbytes = oldnmemb * size; + if (size && oldbytes / size != oldnmemb) + { + xfree (p); + gpg_err_set_errno (ENOMEM); + return NULL; + } + memset (p + oldbytes, 0, bytes - oldbytes); + } + return p; +} + + void ksba_free ( void *a ) { @@ -44,6 +44,7 @@ gpg_error_t _ksba_hash_buffer (const char *oid, size_t resultsize, unsigned char *result, size_t *resultlen); +void *_ksba_reallocarray (void *a, size_t oldnmemb, size_t nmemb, size_t size); void *_ksba_xmalloc (size_t n ); void *_ksba_xcalloc (size_t n, size_t m ); diff --git a/src/versioninfo.rc.in b/src/versioninfo.rc.in index ef25eb8..9318e8b 100644 --- a/src/versioninfo.rc.in +++ b/src/versioninfo.rc.in @@ -40,7 +40,7 @@ BEGIN VALUE "FileDescription", "Libksba - X.509 and CMS Library\0" VALUE "FileVersion", "@LIBKSBA_LT_CURRENT@.@LIBKSBA_LT_AGE@.@LIBKSBA_LT_REVISION@.@BUILD_REVISION@\0" VALUE "InternalName", "libksba\0" - VALUE "LegalCopyright", "Copyright © 2015 g10 Code GmbH\0" + VALUE "LegalCopyright", "Copyright © 2019 g10 Code GmbH\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "libksba.dll\0" VALUE "PrivateBuild", "\0" diff --git a/src/visibility.c b/src/visibility.c index 7a76e16..c4bf397 100644 --- a/src/visibility.c +++ b/src/visibility.c @@ -34,6 +34,7 @@ #define _KSBA_INCLUDED_BY_VISIBILITY_C #include "util.h" + /*--version.c --*/ const char * ksba_check_version (const char *req_version) @@ -1237,3 +1238,82 @@ ksba_name_get_uri (ksba_name_t name, int idx) { return _ksba_name_get_uri (name, idx); } + + +/*-- der-encoder.c --*/ +void +ksba_der_release (ksba_der_t d) +{ + if (d) + _ksba_der_release (d); +} + +ksba_der_t +ksba_der_builder_new (unsigned int nitems) +{ + return _ksba_der_builder_new (nitems); +} + +void +ksba_der_builder_reset (ksba_der_t d) +{ + _ksba_der_builder_reset (d); +} + +void +ksba_der_add_ptr (ksba_der_t d, int cls, int tag, + void *value, size_t valuelen) +{ + _ksba_der_add_ptr (d, cls, tag, value, valuelen); +} + +void +ksba_der_add_val (ksba_der_t d, int cls, int tag, + const void *value, size_t valuelen) +{ + _ksba_der_add_val (d, cls, tag, value, valuelen); +} + +void +ksba_der_add_int (ksba_der_t d, const void *value, size_t valuelen, + int force_positive) +{ + _ksba_der_add_int (d, value, valuelen, force_positive); +} + +void +ksba_der_add_oid (ksba_der_t d, const char *oidstr) +{ + _ksba_der_add_oid (d, oidstr); +} + +void +ksba_der_add_bts (ksba_der_t d, const void *value, size_t valuelen, + unsigned int unusedbits) +{ + _ksba_der_add_bts (d, value, valuelen, unusedbits); +} + +void +ksba_der_add_der (ksba_der_t d, const void *der, size_t derlen) +{ + _ksba_der_add_der (d, der, derlen); +} + +void +ksba_der_add_tag (ksba_der_t d, int cls, int tag) +{ + _ksba_der_add_tag (d, cls, tag); +} + +void +ksba_der_add_end (ksba_der_t d) +{ + _ksba_der_add_end (d); +} + +gpg_error_t +ksba_der_builder_get (ksba_der_t d, unsigned char **r_obj, size_t *r_objlen) +{ + return _ksba_der_builder_get (d, r_obj, r_objlen); +} diff --git a/src/visibility.h b/src/visibility.h index 04f67f9..0a2d96d 100644 --- a/src/visibility.h +++ b/src/visibility.h @@ -192,6 +192,19 @@ #define ksba_writer_write _ksba_writer_write #define ksba_writer_write_octet_string _ksba_writer_write_octet_string +#define ksba_der_release _ksba_der_release +#define ksba_der_builder_new _ksba_der_builder_new +#define ksba_der_builder_reset _ksba_der_builder_reset +#define ksba_der_add_ptr _ksba_der_add_ptr +#define ksba_der_add_val _ksba_der_add_val +#define ksba_der_add_int _ksba_der_add_int +#define ksba_der_add_oid _ksba_der_add_oid +#define ksba_der_add_bts _ksba_der_add_bts +#define ksba_der_add_der _ksba_der_add_der +#define ksba_der_add_tag _ksba_der_add_tag +#define ksba_der_add_end _ksba_der_add_end +#define ksba_der_builder_get _ksba_der_builder_get + /* Include the main header file to map the public symbols to the internal underscore prefixed symbols. */ @@ -386,6 +399,19 @@ int ksba_asn_delete_structure (void *dummy); #undef ksba_writer_write #undef ksba_writer_write_octet_string +#undef ksba_der_release +#undef ksba_der_builder_new +#undef ksba_der_builder_reset +#undef ksba_der_add_ptr +#undef ksba_der_add_val +#undef ksba_der_add_int +#undef ksba_der_add_oid +#undef ksba_der_add_bts +#undef ksba_der_add_der +#undef ksba_der_add_tag +#undef ksba_der_add_end +#undef ksba_der_builder_get + /* Mark all symbols. */ @@ -549,6 +575,19 @@ MARK_VISIBLE (ksba_writer_tell) MARK_VISIBLE (ksba_writer_write) MARK_VISIBLE (ksba_writer_write_octet_string) +MARK_VISIBLE (ksba_der_release) +MARK_VISIBLE (ksba_der_builder_new) +MARK_VISIBLE (ksba_der_builder_reset) +MARK_VISIBLE (ksba_der_add_ptr) +MARK_VISIBLE (ksba_der_add_val) +MARK_VISIBLE (ksba_der_add_int) +MARK_VISIBLE (ksba_der_add_oid) +MARK_VISIBLE (ksba_der_add_bts) +MARK_VISIBLE (ksba_der_add_der) +MARK_VISIBLE (ksba_der_add_tag) +MARK_VISIBLE (ksba_der_add_end) +MARK_VISIBLE (ksba_der_builder_get) + # undef MARK_VISIBLE #endif /*_KSBA_INCLUDED_BY_VISIBILITY_C*/ |