* ksba.texi: Added a new function. Markup improvements.
authorWerner Koch <wk@gnupg.org>
Fri, 15 Apr 2005 19:44:29 +0000 (19:44 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 15 Apr 2005 19:44:29 +0000 (19:44 +0000)
* cert.c (get_info_access): Fixed case of more than one
AccessDescription.

* ksba.h (ksba_cert_get_subj_key_id): New.
* cert.c (get_simple_octet_string_ext): New.
(ksba_cert_get_subj_key_id): New.
* libksba.vers: Added ksba_cert_get_subj_key_id.

* cert.c (ksba_cert_get_auth_key_id): Add support for
keyIdentifier.
* crl.c (ksba_crl_get_auth_key_id): Ditto.

* cert-basic.c (list_extensions): Print the AKI.keyIdentifier and
the subjectKeyIdentifier.
* t-crl-parser.c (one_file): Print the AKI.keyIdentifier.

15 files changed:
ChangeLog
Makefile.am
NEWS
acinclude.m4
compile [new file with mode: 0755]
doc/ChangeLog
doc/ksba.texi
src/ChangeLog
src/cert.c
src/crl.c
src/ksba.h
src/libksba.vers
tests/ChangeLog
tests/cert-basic.c
tests/t-crl-parser.c

index f1cd257..fd82e69 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-16  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (AUTOMAKE_OPTIONS): Add option to create bzip 2 file
+       and to use the m4 directory.
+       * acinclude.m4: Removed all code.  It belongs into m4/.
+
 2004-12-18  Werner Koch  <wk@g10code.com>
 
        * configure.ac: Print a hint about failed corss compilations.
index 070e7e6..b388d0e 100644 (file)
 
 ## Process this file with automake to produce Makefile.in
 
+ACLOCAL_AMFLAGS = -I m4
+AUTOMAKE_OPTIONS = dist-bzip2
+
 EXTRA_DIST = README-alpha autogen.sh
 
+
 if CROSS_COMPILING
 tests =
 else
diff --git a/NEWS b/NEWS
index 982477a..b17c7ad 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,15 @@
 Noteworthy changes in version 0.9.11
 -------------------------------------------------
 
+ * New convenience API function for the subjectKeyIdentifier.
+
+ * Implemented the keyIdentifier part for authorityKeyIdentifier of
+   CRLs and certificates.
+
+ * Interface changes relative to the 0.9.7 release:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ksba_cert_get_subj_key_id            NEW.
+
 
 Noteworthy changes in version 0.9.10 (2004-12-03)
 -------------------------------------------------
@@ -228,7 +237,7 @@ Noteworthy changes in version 0.4.0 (2002-04-15)
  * Nearly all stuff needed for the Aegypten project is now in place.
 
 
- Copyright 2002 g10 Code GmbH
+ Copyright 2002, 2003, 2004, 2005 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
index 5a91bb8..2a226a2 100644 (file)
@@ -20,57 +20,4 @@ dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
 
 
-dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
-dnl                   [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
-dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS
-dnl
-AC_DEFUN(AM_PATH_GPG_ERROR,
-[ AC_ARG_WITH(gpg-error-prefix,
-            AC_HELP_STRING([--with-gpg-error-prefix=PFX],
-                           [prefix where GPG Error is installed (optional)]),
-     gpg_error_config_prefix="$withval", gpg_error_config_prefix="")
-  if test x$gpg_error_config_prefix != x ; then
-     if test x${GPG_ERROR_CONFIG+set} != xset ; then
-        GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config
-     fi
-  fi
-
-  AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no)
-  min_gpg_error_version=ifelse([$1], ,0.0,$1)
-  AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version)
-  ok=no
-  if test "$GPG_ERROR_CONFIG" != "no" ; then
-    req_major=`echo $min_gpg_error_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
-    req_minor=`echo $min_gpg_error_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
-    gpg_error_config_version=`$GPG_ERROR_CONFIG $gpg_error_config_args --version`
-    major=`echo $gpg_error_config_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
-    minor=`echo $gpg_error_config_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
-    if test "$major" -gt "$req_major"; then
-        ok=yes
-    else 
-        if test "$major" -eq "$req_major"; then
-            if test "$minor" -ge "$req_minor"; then
-               ok=yes
-            fi
-        fi
-    fi
-  fi
-  if test $ok = yes; then
-    GPG_ERROR_CFLAGS=`$GPG_ERROR_CONFIG $gpg_error_config_args --cflags`
-    GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs`
-    AC_MSG_RESULT(yes)
-    ifelse([$2], , :, [$2])
-  else
-    GPG_ERROR_CFLAGS=""
-    GPG_ERROR_LIBS=""
-    AC_MSG_RESULT(no)
-    ifelse([$3], , :, [$3])
-  fi
-  AC_SUBST(GPG_ERROR_CFLAGS)
-  AC_SUBST(GPG_ERROR_LIBS)
-])
 
diff --git a/compile b/compile
new file mode 100755 (executable)
index 0000000..3d21703
--- /dev/null
+++ b/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2004-10-12.08
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit 0
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit 0
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as `compile cc -o foo foo.c'.
+       # So we strip `-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
index 7ef304c..26cb685 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-15  Werner Koch  <wk@g10code.com>
+
+       * ksba.texi: Added a new function.  Markup improvements.
+
+2005-02-08  Werner Koch  <wk@g10code.com>
+
+       * ksba.texi: Fixed direntry.
+
 2004-03-23  Werner Koch  <wk@gnupg.org>
 
        * ksba.texi: Added 2 more functions. Minor other updates.
@@ -28,7 +36,7 @@
 
        * ksba.texi: Add new functions.
 
- Copyright 2002, 2003 g10 Code GmbH
+ Copyright 2002, 2003, 2004, 2005 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
index ce38ed0..43e8bd7 100644 (file)
@@ -4,7 +4,7 @@
 
 @dircategory GNU libraries
 @direntry
-* libksba: (ksba)              An X.509 Library.
+* libksba: (ksba).              An X.509 Library.
 @end direntry
 
 @include version.texi
@@ -145,7 +145,7 @@ certifictes, CMS data and related data more easy.
 This manual documents the `KSBA' library programming interface.  All functions
 and data types provided by the library are explained.
 
-The reader is assumed to possess basic knowledge about the the implemented
+The reader is assumed to possess basic knowledge about the implemented
 protocols.
 
 This manual can be used in several ways.  If read from the beginning
@@ -219,7 +219,7 @@ like this:
 #include <ksba.h>
 @end example
 
-The name space of `KSBA' is @code{ksba_*} for function names, @code{Ksba*} for
+The name space of `KSBA' is @code{ksba_*} for function names, @code{ksba*} for
 data types and @code{KSBA_*} for other symbols.  In addition the same name
 prefixes with one prepended underscore are reserved for internal use and
 should never be used by an application.
@@ -233,7 +233,7 @@ features may have been introduced but due to problem with the dynamic
 linker an old version is actually used.  So you may want to check that
 the version is okay right after program startup.
 
-@deftypefun const char *ksba_check_version (const char *@var{req_version})
+@deftypefun {const char *} ksba_check_version (@w{const char *@var{req_version}})
 
 Check that the the version of the library is at minimum the one given as
 a string in @var{req_version} and return the actual version string of
@@ -299,8 +299,8 @@ gcc -o foo foo.c `ksba-config --cflags --libs`
 One of the most complex data formats are the X.509 certificates.
 @acronym{KSBA} provides an easy to use interface to handle them.
 
-@deftp {Data type} KsbaCert
-The @code{KsbaCert} type is a handle for an X.509 certificate.
+@deftp {Data type} ksba_cert_t
+The @code{ksba_cert_t} type is a handle for an X.509 certificate.
 @end deftp
 
 @menu
@@ -316,28 +316,28 @@ The @code{KsbaCert} type is a handle for an X.509 certificate.
 This section explains how to create a certificate object, initialize it
 copy it and eventually destroy it. 
 
-@deftypefun ksba_cert_tksba_cert_new (void)
-The function @code{ksba_cert_new} creates a new @code{KsbaCert}
+@deftypefun ksba_cert_t ksba_cert_new (void)
+The function @code{ksba_cert_new} creates a new @code{ksba_cert_t}
 object and returns a handle for it.
 
 The only reason why this function may fail is an out-of-memory condition in
 which case @code{NULL} is returned.
 @end deftypefun
 
-@deftypefun void ksba_cert_ref (ksba_cert_tcert)
+@deftypefun void ksba_cert_ref (@w{ksba_cert_t @var{cert}})
 The function @code{ksba_cert_ref} bumps the reference counter of the
 certificate object up by one.  Thus an extra @code{ksba_cert_release} is
 required to actually release the memory used for the object.
 @end deftypefun
 
-@deftypefun void ksba_cert_release (@w{ksba_cert_t@var{cert}})
+@deftypefun void ksba_cert_release (@w{ksba_cert_t @var{cert}})
 The function @code{ksba_cert_release} destroys the certificate object with the
 handle @var{cert} and releases all associated resources.  Due to the use of
 reference counting no actual memory may be released.  It is okay to pass
 @code{NULL} to the function in which case nothing happens.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_read_der (@w{ksba_cert_t@var{cert}}, @w{KsbaReader @var{reader}})
+@deftypefun gpg_error_t ksba_cert_read_der (@w{ksba_cert_t @var{cert}}, @w{ksba_reader_t @var{reader}})
 
 Read the next certificate from @var{reader} and store it in the
 certificate object @var{cert} for future access.  The certificate is parsed
@@ -348,7 +348,7 @@ The function returns zero if the operation was successfully performed or
 an error code.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_init_from_mem (@w{ksba_cert_t@var{cert}}, @w{const void *@var{buffer}}, @w{size_t @var{length}})
+@deftypefun gpg_error_t ksba_cert_init_from_mem (@w{ksba_cert_t @var{cert}}, @w{const void *@var{buffer}}, @w{size_t @var{length}})
 
 Parse the @var{buffer} which should contain a @acronym{DER} encoded
 certificate of @var{length} and initialize the @var{cert}.  This
@@ -369,7 +369,7 @@ certificate in a well defined manner.  An error will be retruned if the
 certificate object has not yet been initialzied by means of
 @code{ksba_cert_read_der} or @code{ksba_cert_init_from_mem}.
 
-@deftypefun const unsigned char *ksba_cert_get_image (@w{ksba_cert_t@var{cert}}, @w{size_t *@var{r_length}}) 
+@deftypefun {const unsigned char *} ksba_cert_get_image (@w{ksba_cert_t @var{cert}}, @w{size_t *@var{r_length}}) 
 
 This function returns a pointer
 to the @acronym{DER} encoded buffer with the raw certificate as well as
@@ -380,7 +380,7 @@ The function returns @code{NULL} on error or a pointer which is valid as
 long as @var{cert} is valid.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_hash (@w{ksba_cert_t@var{cert}}, @w{int @var{what}}, @w{void (*@var{hasher})(void *, const void *, size_t length)}, @w{void *@var{hasher_arg}})
+@deftypefun gpg_error_t ksba_cert_hash (@w{ksba_cert_t @var{cert}}, @w{int @var{what}}, @w{void (*@var{hasher})(void *, const void *, size_t length)}, @w{void *@var{hasher_arg}})
 
 This function feeds the data which is expected to be hashed into the
 given function @var{hasher}, where the first argument passed is
@@ -395,7 +395,7 @@ function is not expected to yiled errors anyway.
 @end deftypefun
 
 
-@deftypefun const char *ksba_cert_get_digest_algo (ksba_cert_tcert)
+@deftypefun {const char *} ksba_cert_get_digest_algo (@w{ksba_cert_t @var{cert}})
 
 Figure out the the digest algorithm used for the signature and return
 its @acronym{OID} in dotted decimal format.  This function is most
@@ -406,7 +406,7 @@ string with the @acronym{OID}.  This string is valid as long the
 certificate object is valid.
 @end deftypefun
 
-@deftypefun KsbaSexp ksba_cert_get_serial (ksba_cert_tcert)
+@deftypefun ksba_sexp_t ksba_cert_get_serial (@w{ksba_cert_t @var{cert}})
 
 The function returns the serial number of the certificate @var{cert}.
 The serial number is an integer returned as an cancnical encoded
@@ -414,7 +414,7 @@ S-expression with just one element.  The caller must free the returned
 value.  @code{NULL} is returned in case of error.
 @end deftypefun
 
-@deftypefun char *ksba_cert_get_issuer (ksba_cert_tcert, int idx)
+@deftypefun {char *} ksba_cert_get_issuer (@w{ksba_cert_t @var{cert}, int @var{idx}})
 
 With @var{idx} given as @code{0}, this function returns the
 Distinguished Name (@acronym{DN}) of the certificate issuer which
@@ -441,7 +441,7 @@ The caller must free the returned string using @code{ksba_free} or
 whatever function has been registered as a replacement.
 @end deftypefun
 
-@deftypefun char *ksba_cert_get_subject (ksba_cert_tcert, int idx)
+@deftypefun {char *} ksba_cert_get_subject (@w{ksba_cert_t @var{cert}, int @var{idx}})
 
 With @var{idx} given as @code{0}, this function returns the
 Distinguished Name (@acronym{DN}) of the certificate's subject.  The
@@ -467,7 +467,7 @@ whatever function has been registered as a replacement.
 @end deftypefun
 
 
-@deftypefun time_t ksba_cert_get_validity (ksba_cert_t@var{cert}, int @var{what})
+@deftypefun time_t ksba_cert_get_validity (@w{ksba_cert_t @var{cert}, int @var{what}})
 
 Return the validity dates from the certificate.  If no value is
 available @code{0} is returned because we can safely assume that the
@@ -478,26 +478,26 @@ To return the `notBefore' date, the value @code{0} must be supplied for
 @var{what};  @code{1} yields the `notAfter' value.
 @end deftypefun
 
-@deftypefun KsbaSexp ksba_cert_get_public_key (ksba_cert_tcert)
+@deftypefun ksba_sexp_t ksba_cert_get_public_key (@w{ksba_cert_t @var{cert}})
 
 @c !FIXME!
 [This needs to get written - for now please see libksba/src/cert.c]
 
 @end deftypefun
 
-@deftypefun KsbaSexp ksba_cert_get_sig_val (ksba_cert_tcert)
+@deftypefun ksba_sexp_t ksba_cert_get_sig_val (ksba_cert_t @var{cert})
 
 @c !FIXME!
 [This needs to get written - for now please see libksba/src/cert.c]
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_get_extension (ksba_cert_tcert, int idx, char const **r_oid, int *r_crit, size_t *r_deroff, size_t *r_derlen)
+@deftypefun gpg_error_t ksba_cert_get_extension (@w{ksba_cert_t @var{cert}, int @var{idx}, char const **@var{r_oid}, int *@var{r_crit}, size_t *@var{r_deroff}, size_t *@var{r_derlen}})
 
 @c !FIXME!
 [This needs to get written - for now please see libksba/src/cert.c]
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_is_ca (ksba_cert_tcert, int *r_ca, int *r_pathlen)
+@deftypefun gpg_error_t ksba_cert_is_ca (@w{ksba_cert_t @var{cert}, int *@var{r_ca}, int *@var{r_pathlen}})
 
 Return information on the basicConstraint (2.5.19.19) of CERT.  R_CA
 receives true if this is a CA and only in that case R_PATHLEN is set to
@@ -506,29 +506,29 @@ limitation
 
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_get_key_usage (ksba_cert_tcert, unsigned int *r_flags)
+@deftypefun gpg_error_t ksba_cert_get_key_usage (@w{ksba_cert_t @var{cert}, unsigned int *@var{r_flags}})
 
-Get the key usage flags. The function returns Ksba_No_Data if no
+Get the key usage flags. The function returns @code{GPG_ERR_NO_DATA} if no
 key usage is specified. 
 @end deftypefun
 
 
-@deftypefun gpg_error_t ksba_cert_get_cert_policies (ksba_cert_tcert, char **r_policies)
+@deftypefun gpg_error_t ksba_cert_get_cert_policies (@w{ksba_cert_t @var{cert}, char **@var{r_policies}})
 
 Return a string with the certificatePolicies delimited by linefeeds.
 The return values may be extended to carry more information er line, so
 the caller should only use the first white-space delimited token per
-line.  The function returns KSBA_No_Data when this extension is not used.
-Caller must free the returned value. 
+line.  The function returns @code{GPG_ERR_NO_DATA} when this extension
+is not used.  Caller must free the returned value.
 
 @end deftypefun
 
 
-@deftypefun gpg_error_t ksba_cert_get_crl_dist_point (ksba_cert_t@var{cert}, int @var{idx}, ksba_name_t *@var{r_distpoint}, ksba_name_t *@var{r_issuer}, unsigned int *@var{r_reason})
+@deftypefun gpg_error_t ksba_cert_get_crl_dist_point (@w{ksba_cert_t @var{cert}, int @var{idx}, ksba_name_t *@var{r_distpoint}, ksba_name_t *@var{r_issuer}, unsigned int *@var{r_reason}})
 
 Return the CRLDistPoints given in the certificate extension of
 certificate @var{cert}.  @var{idx} should be iterated starting from 0
-until the function returns @code{-1}.  @var{r_distpoint} returns a
+until the function returns @code{GPG_ERR_EOF}.  @var{r_distpoint} returns a
 ksba_name_t object with the distribution point name(s); the return value
 may be @code{NULL} to indicate that this name is not available.
 @var{r_issuer} returns the CRL issuer; if the returned value is
@@ -543,18 +543,28 @@ and @var{r_issuer} must be released by the caller using
 @code{ksba_name_release}.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_get_auth_key_id (ksba_cert_t@var{cert}, KsbaSexp *@var{r_keyid}, ksba_name_t *@var{r_name}, KsbaSexp *@var{r_serial})
 
-Return the authorityKeyIdentifier in @var{r_name} and @var{r_serial} or
-in @var{r_keyid}.  @code{KSBA_No_Data} is returned if no
-authorityKeyIdentifier or only one using the keyIdentifier method is
-available.
+@deftypefun gpg_error_t ksba_cert_get_subj_key_id (@w{ksba_cert_t @var{cert}, int *@var{r_crit}, ksba_sexp_t *@var{r_keyid}})
 
-Note that r_keyid is not yet implemented and @var{NULL} must be passed instead.
+Return the subjectKeyIdentifier extension as a simple allocated
+S-expression at the address of @var{r_keyid}. 0 is returned on success,
+@code{GPG_ERR_NO_DATA} if no such extension is available or any other
+error code.  If @var{r_crit} is not passed as @code{NULL}, the critical flag of
+this is extension is stored at this address.
 @end deftypefun
 
 
-@deftypefun gpg_error_t ksba_cert_get_authority_info_access (ksba_cert_t @var{cert}, int @var{idx}, char **@var{r_method}, ksba_name_t *@var{r_location})
+@deftypefun gpg_error_t ksba_cert_get_auth_key_id (@w{ksba_cert_t @var{cert}, ksba_sexp_t *@var{r_keyid}, ksba_name_t *@var{r_name}, ksba_sexp_t *@var{r_serial}})
+
+Return the authorityKeyIdentifier in @var{r_name} and @var{r_serial} or
+in @var{r_keyid}.  @code{GPG_ERR_NO_DATA} is returned if no
+authorityKeyIdentifier has been found.  This error code is also returned
+if @var{r_keyid} has been given as NULL and only an
+authorityKeyIdentifier with the keyIdentifier method is available.
+@end deftypefun
+
+
+@deftypefun gpg_error_t ksba_cert_get_authority_info_access (@w{ksba_cert_t @var{cert}, int @var{idx}, char **@var{r_method}, ksba_name_t *@var{r_location}})
 
 Return the authorityInfoAccess attributes. @var{idx} should be
 iterated starting from 0 until this function returns
@@ -569,7 +579,7 @@ error.
 See RFC-2459, section 4.2.2.1 for the defintion of this attribute.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cert_get_subject_info_access (ksba_cert_t @var{cert}, int @var{idx}, char **@var{r_method}, ksba_name_t *@var{r_location})
+@deftypefun gpg_error_t ksba_cert_get_subject_info_access (@w{ksba_cert_t @var{cert}, int @var{idx}, char **@var{r_method}, ksba_name_t *@var{r_location}})
 
 Return the subjectInfoAccess attributes. @var{idx} should be
 iterated starting from 0 until this function returns
@@ -585,7 +595,6 @@ See RFC-2459, section 4.2.2.2 for the defintion of this attribute.
 @end deftypefun
 
 
-
 @node Setting attributes
 @section How to set certificate attributes
 
@@ -610,33 +619,33 @@ All operations with the CMS framework require the use of a so called CMS
 object which is internally used to keeptrack of the current state and to
 store some meta information.
 
-@deftp {Data type} KsbaCMS
-The @code{KsbaCMS} type is used for this CMS object.
+@deftp {Data type} ksba_cms_t
+The @code{ksba_cms_t} type is used for this CMS object.
 @end deftp
-@deftp {Data type} KsbaStopReason
-The @code{KsbaStopReason} type is an enumeration used for communication
+@deftp {Data type} ksba_stop_reason_t
+The @code{ksba_stop_reason_t} type is an enumeration used for communication
 between the phases of a parsing or building process.
 @end deftp
 
 
-@deftypefun KsbaCMS ksba_cms_new (void)
+@deftypefun ksba_cms_t ksba_cms_new (void)
 
 This function creates a new CMS object.  The only reason the function
 may fail is an out-of-memory condition in which case @code{NULL} is
 returned.  It is safe for the caller to translate this to the standard
-@acronym{KSBA} error code @code{KSBA_Out_Of_Core}.  Any object created
+error code @code{GPG_ERR_ENOMEM}.  Any object created
 with this function should be released after use by using
 @code{ksba_cms_release}.  
 @end deftypefun
 
-@deftypefun void ksba_cms_release (KsbaCMS cms)
+@deftypefun void ksba_cms_release (@w{ksba_cms_t @var{cms}})
 
 Release allresources associated with the @var{CMS} object.  It is
 perfectly okay to pass @code{NULL} to this function in which case
 nothing happens.
 @end deftypefun
 
-@deftypefun gpg_error_t ksba_cms_set_reader_writer (KsbaCMS @var{cms}, KsbaReader @var{r}, KsbaWriter @var{w})
+@deftypefun gpg_error_t ksba_cms_set_reader_writer (@w{ksba_cms_t @var{cms}, ksba_reader_t @var{r}, ksba_writer_t @var{w}})
 
 About all usages of the CMS framework require some input and output data
 (great surprise!).  Do accomplish this in the most abstract way, no
@@ -663,7 +672,7 @@ limited in size; e.g. it does not make sense to use a video clip as the
 @acronym{DN} despite the fact that the standard does not forbid it.
 
 
-@deftypefun gpg_error_t ksba_cms_parse (KsbaCMS @var{cms}, KsbaStopReason *@var{r_stopreason})
+@deftypefun gpg_error_t ksba_cms_parse (@w{ksba_cms_t @var{cms}, ksba_stop_reason_t *@var{r_stopreason}})
 
 This is the core function of the parser and commonly used in a loop.
 The parsing process is divided into serveral phases to allow the user to
@@ -706,14 +715,14 @@ early.  This can be accomplished by hooking into the stop reason
 @code{KSBA_SR_GOT_CONTENT} and retrieving the content using
 
 
-@deftypefun KsbaContentType ksba_cms_get_content_type (KsbaCMS @var{cms}, int @var{what})
+@deftypefun ksba_content_t ksba_cms_get_content_type (@w{ksba_cms_t @var{cms}, int @var{what}})
 
 By using a value of @code{0} for @var{what} this function returns the
 content type of the outer container; using @code{1} does return the
 content type of the enclosed object.
 
-@deftp {Data type} KsbaContentType
-The @code{KsbaContentType} type is an enumeration used to describe the
+@deftp {Data type} ksba_content_t
+The @code{ksba_content_t} type is an enumeration used to describe the
 content of a CMS message.  Here is a list of possible values:
 
 @table @code
@@ -743,7 +752,7 @@ Not yet supported
 @end deftypefun
 
 
-@deftypefun const char *ksba_cms_get_content_oid (KsbaCMS cms, int what)
+@deftypefun {const char *} ksba_cms_get_content_oid (@w{ksba_cms_t @var{cms}, int @var{what}})
 
 Return the object ID of @var{cms}.  This is a constant string valid as
 long as the context is valid and no new parse is started.  This function
@@ -793,12 +802,13 @@ The @code{ksba_name_t} type is an object to represent names sets.
 @end deftp
 
 
-@deftypefun void ksba_name_release (ksba_name_t @var{name})
+@deftypefun void ksba_name_release (@w{ksba_name_t @var{name}})
+
 This function releases the object @var{name}.  Passing @code{NULL} is
 allowed.
 @end deftypefun
 
-@deftypefun const char *ksba_name_enum (ksba_name_t @var{name}, int @var{idx})
+@deftypefun {const char *} ksba_name_enum (@w{ksba_name_t @var{name}, int @var{idx}})
 
 By iterating @var{idx} up starting with 0, this function returns all
 General Names stored in @var{name}.  The format of the returned name is either
@@ -817,7 +827,8 @@ probably an Universal Resource Identifier which has the S-expression:
 The returned string has the same lifetime as @var{name}. 
 @end deftypefun
 
-@deftypefun char *ksba_name_get_uri (ksba_name_t @var{name}, int @var{idx})
+@deftypefun {char *} ksba_name_get_uri (@w{ksba_name_t @var{name}, int @var{idx}})
+
 Convenience function to return names representing an URI.  Caller
 must free the returned value.  Note that this function should not be
 used to enumerate the names.
@@ -945,12 +956,8 @@ representation, Libksba recognizes the follwing extra labels:
 
 @node Concept Index
 @unnumbered Concept Index
-
 @printindex cp
-
 @node Function and Data Index
 @unnumbered Function and Data Index
-
 @printindex fn
-
 @bye
index 7d4e1a0..af3c7f2 100644 (file)
@@ -1,3 +1,17 @@
+2005-04-15  Werner Koch  <wk@g10code.com>
+
+       * cert.c (get_info_access): Fixed case of more than one
+       AccessDescription.
+
+       * ksba.h (ksba_cert_get_subj_key_id): New.
+       * cert.c (get_simple_octet_string_ext): New.
+       (ksba_cert_get_subj_key_id): New.
+       * libksba.vers: Added ksba_cert_get_subj_key_id. 
+
+       * cert.c (ksba_cert_get_auth_key_id): Add support for
+       keyIdentifier.
+       * crl.c (ksba_crl_get_auth_key_id): Ditto.
+       
 2005-01-31  Werner Koch  <wk@g10code.com>
 
        * cms-parser.c (_ksba_cms_parse_signed_data_part_2): Allow NDEF
        (ksba_cert_get_subject): Ditto.
        
 
- Copyright 2001, 2002 g10 Code GmbH
+ Copyright 2001, 2002, 2003, 2004, 2005 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
index cc58e93..54ac9c5 100644 (file)
@@ -1,5 +1,5 @@
 /* cert.c - main function for the certificate handling
- *      Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
+ *      Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH
  *
  * This file is part of KSBA.
  *
@@ -32,6 +32,7 @@
 #include "keyinfo.h"
 #include "cert.h"
 
+static const char oidstr_subjectKeyIdentifier[] = "2.5.29.14";
 static const char oidstr_keyUsage[]         = "2.5.29.15";
 static const char oidstr_subjectAltName[]   = "2.5.29.17";
 static const char oidstr_issuerAltName[]    = "2.5.29.18";
@@ -1568,10 +1569,10 @@ ksba_cert_get_crl_dist_point (ksba_cert_t cert, int idx,
 }
 
 \f
-/* Return the authorityKeyIdentifier in r_name and r_serial or in
-   r_keyID.  Note that r_keyID is not yet supported and must be passed
-   as NULL.  GPG_ERR_NO_DATA is returned if no authorityKeyIdentifier
-   or only one using the keyIdentifier method is available. */
+/* Return the authorityKeyIdentifier in R_NAME and R_SERIAL or/and in
+   R_KEYID.  GPG_ERR_NO_DATA is returned if no authorityKeyIdentifier
+   or only one using the keyIdentifier method is available and R_KEYID
+   is NULL. */
 gpg_error_t 
 ksba_cert_get_auth_key_id (ksba_cert_t cert,
                            ksba_sexp_t *r_keyid,
@@ -1582,13 +1583,15 @@ ksba_cert_get_auth_key_id (ksba_cert_t cert,
   const char *oid;
   size_t off, derlen;
   const unsigned char *der;
+  const unsigned char *keyid_der = NULL;
+  size_t keyid_derlen = 0;
   int idx, crit;
   struct tag_info ti;
   char numbuf[30];
   size_t numbuflen;
  
   if (r_keyid)
-    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+    *r_keyid = NULL;
   if (!r_name || !r_serial)
     return gpg_error (GPG_ERR_INV_VALUE);
   *r_name = NULL;
@@ -1637,13 +1640,18 @@ ksba_cert_get_auth_key_id (ksba_cert_t cert,
     return gpg_error (GPG_ERR_BAD_BER);
 
   if (ti.tag == 0)
-    { /* We do not support the keyIdentifier method yet, but we need
-         to skip it. */
+    { /* keyIdentifier:  Save it away and skip over it. */
+      keyid_der = der;
+      keyid_derlen = ti.length;
+
       der += ti.length;
       derlen -= ti.length;
+      /* If the keyid has been requested but no other data follows, we
+         directly jump to the end. */
+      if (r_keyid && !derlen)
+        goto build_keyid;
       if (!derlen)
         return gpg_error (GPG_ERR_NO_DATA); /* not available */
-        
       err = _ksba_ber_parse_tl (&der, &derlen, &ti);
       if (err)
         return err;
@@ -1689,18 +1697,117 @@ ksba_cert_get_auth_key_id (ksba_cert_t cert,
   (*r_serial)[numbuflen + ti.length] = ')';
   (*r_serial)[numbuflen + ti.length + 1] = 0;
 
+ build_keyid:
+  if (r_keyid && keyid_der && keyid_derlen)
+    {
+      sprintf (numbuf,"(%u:", (unsigned int)keyid_derlen);
+      numbuflen = strlen (numbuf);
+      *r_keyid = xtrymalloc (numbuflen + keyid_derlen + 2);
+      if (!*r_keyid)
+        return gpg_error (GPG_ERR_ENOMEM);
+      strcpy (*r_keyid, numbuf);
+      memcpy (*r_keyid+numbuflen, keyid_der, keyid_derlen);
+      (*r_keyid)[numbuflen + keyid_derlen] = ')';
+      (*r_keyid)[numbuflen + keyid_derlen + 1] = 0;
+    }
+  return 0;
+}
+
 
+/* Return a simple octet string extension at the object identifier OID
+   from certificate CERT.  The data is return as a simple S-expression
+   and stored at R_DATA.  Returns 0 on success or an error code.
+   common error codes are: GPG_ERR_NO_DATA if no such extension is
+   available, GPG_ERR_DUP_VALUE if more than one is available.  If
+   R_CRIT is not NULL, the critical extension flag will be stored at
+   that address. */
+static gpg_error_t 
+get_simple_octet_string_ext (ksba_cert_t cert, const char *oid,
+                             int *r_crit, ksba_sexp_t *r_data)
+{
+  gpg_error_t err;
+  const char *tmpoid;
+  size_t off, derlen;
+  const unsigned char *der;
+  int idx, crit;
+  struct tag_info ti;
+  char numbuf[30];
+  size_t numbuflen;
+  if (!r_data)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *r_data = NULL;
+
+  for (idx=0; !(err=ksba_cert_get_extension (cert, idx, &tmpoid, &crit,
+                                             &off, &derlen)); idx++)
+    {
+      if (!strcmp (tmpoid, oid))
+        break;
+    }
+  if (err)
+    {
+      if (gpg_err_code (err) == GPG_ERR_EOF)
+        return gpg_error (GPG_ERR_NO_DATA);
+      return err;
+    }
+    
+  /* Check that there is only one */
+  for (idx++; !(err=ksba_cert_get_extension (cert, idx, &tmpoid, NULL,
+                                             NULL, NULL)); idx++)
+    {
+      if (!strcmp (tmpoid, oid))
+        return gpg_error (GPG_ERR_DUP_VALUE); 
+    }
+  
+  der = cert->image + off;
+
+  err = _ksba_ber_parse_tl (&der, &derlen, &ti);
+  if (err)
+    return err;
+  if ( !(ti.class == CLASS_UNIVERSAL && ti.tag == TYPE_OCTET_STRING
+         && !ti.is_constructed) )
+    return gpg_error (GPG_ERR_INV_CERT_OBJ);
+  if (ti.ndef)
+    return gpg_error (GPG_ERR_NOT_DER_ENCODED);
+  if (ti.length > derlen)
+    return gpg_error (GPG_ERR_BAD_BER);
+  if (ti.length != derlen)
+    return gpg_error (GPG_ERR_INV_CERT_OBJ); /* Garbage follows. */
+
+  sprintf (numbuf,"(%u:", (unsigned int)ti.length);
+  numbuflen = strlen (numbuf);
+  *r_data = xtrymalloc (numbuflen + ti.length + 2);
+  if (!*r_data)
+    return gpg_error (GPG_ERR_ENOMEM);
+  strcpy (*r_data, numbuf);
+  memcpy (*r_data+numbuflen, der, ti.length);
+  (*r_data)[numbuflen + ti.length] = ')';
+  (*r_data)[numbuflen + ti.length + 1] = 0;
+  if (r_crit)
+    *r_crit = crit;
   return 0;
 }
 
 
+/* 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
+   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)
+{
+  return get_simple_octet_string_ext (cert, oidstr_subjectKeyIdentifier,
+                                      r_crit, r_keyid);
+}
 
 
+\f
 /* MODE 0 := authorityInfoAccess
         1 := subjectInfoAccess
 
-   Caller must release METHOD and LOCATIOn if the fucntion retruned
-   with success; on error bot variables will point to NULL.
+   Caller must release METHOD and LOCATION if the function returned
+   with success; on error both variables will point to NULL.
  */   
 static gpg_error_t
 get_info_access (ksba_cert_t cert, int idx, int mode,
@@ -1779,9 +1886,12 @@ get_info_access (ksba_cert_t cert, int idx, int mode,
                   idx--;
                   continue;  
                 }
-              
-              if (!ti.length)
-                return 0;  
+              /* We only need the next object, thus we can (and
+                 actually need to) limit the DERLEN to the length of
+                 the current sequence. */
+              derlen = ti.length;
+              if (!derlen)
+                return gpg_error (GPG_ERR_INV_CERT_OBJ);
 
               err = _ksba_ber_parse_tl (&der, &derlen, &ti);
               if (err)
@@ -1818,13 +1928,13 @@ get_info_access (ksba_cert_t cert, int idx, int mode,
 
 
 /* Return the authorityInfoAccess attributes. IDX should be iterated
-   starting from 0 until the function returns -1.  R_METHOD returns an
-   allocated string with the OID of one item and R_LOCATION return the
-   GeneralName for that OID.  The return values for 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 retruns
-   an error.  See RFC 2459, section 4.2.2.1 */
+   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
+   return the GeneralName for that OID.  The return values for
+   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 */
 gpg_error_t
 ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx,
                                      char **r_method, ksba_name_t *r_location)
@@ -1835,13 +1945,13 @@ ksba_cert_get_authority_info_access (ksba_cert_t cert, int idx,
 }
 
 /* Return the subjectInfoAccess attributes. IDX should be iterated
-   starting from 0 until the function returns -1.  R_METHOD returns an
-   allocated string with the OID of one item and R_LOCATION return the
-   GeneralName for that OID.  The return values for 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 retruns
-   an error.  See RFC 2459, section 4.2.2.2 */
+   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
+   return the GeneralName for that OID.  The return values for
+   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 */
 gpg_error_t
 ksba_cert_get_subject_info_access (ksba_cert_t cert, int idx,
                                    char **r_method, ksba_name_t *r_location)
index 67b449e..c91a52a 100644 (file)
--- a/src/crl.c
+++ b/src/crl.c
@@ -1,5 +1,5 @@
 /* crl.c - CRL parser
- *      Copyright (C) 2002, 2004 g10 Code GmbH
+ *      Copyright (C) 2002, 2004, 2005 g10 Code GmbH
  *
  * This file is part of KSBA.
  *
@@ -339,9 +339,9 @@ ksba_crl_get_extension (ksba_crl_t crl, int idx,
 
 
 /* Return the authorityKeyIdentifier in r_name and r_serial or in
-   r_keyID.  Note that r_keyID is not yet supported and must be passed
-   as NULL.  GPG_ERR_NO_DATA is returned if no authorityKeyIdentifier
-   or only one using the keyIdentifier method is available. 
+   r_keyID.  GPG_ERR_NO_DATA is returned if no authorityKeyIdentifier
+   or only one using the keyIdentifier method is available and R_KEYID
+   is NULL.
 
    FIXME: This function shares a lot of code with the one in cert.c 
 */
@@ -354,13 +354,15 @@ ksba_crl_get_auth_key_id (ksba_crl_t crl,
   gpg_error_t err;
   size_t derlen;
   const unsigned char *der;
+  const unsigned char *keyid_der = NULL;
+  size_t keyid_derlen = 0;
   struct tag_info ti;
   char numbuf[30];
   size_t numbuflen;
   crl_extn_t e;
 
   if (r_keyid)
-    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+    *r_keyid = NULL;
   if (!crl || !r_name || !r_serial)
     return gpg_error (GPG_ERR_INV_VALUE);
   *r_name = NULL;
@@ -399,17 +401,23 @@ ksba_crl_get_auth_key_id (ksba_crl_t crl,
   if (err)
     return err;
   if (ti.class != CLASS_CONTEXT) 
-    return gpg_error (GPG_ERR_INV_CRL_OBJ); /* we expected a tag */
+    return gpg_error (GPG_ERR_INV_CRL_OBJ); /* We expected a tag. */
   if (ti.ndef)
     return gpg_error (GPG_ERR_NOT_DER_ENCODED);
   if (derlen < ti.length)
     return gpg_error (GPG_ERR_BAD_BER);
 
   if (ti.tag == 0)
-    { /* We do not support the keyIdentifier method yet, but we need
-         to skip it. */
+    { /* keyIdentifier:  Just save it away for later use. */
+      keyid_der = der;
+      keyid_derlen = ti.length;
+
       der += ti.length;
       derlen -= ti.length;
+      /* If the keyid has been requested but no other data follows, we
+         directly jump to the end. */
+      if (r_keyid && !derlen)
+        goto build_keyid;
       if (!derlen)
         return gpg_error (GPG_ERR_NO_DATA); /* not available */
         
@@ -458,6 +466,19 @@ ksba_crl_get_auth_key_id (ksba_crl_t crl,
   (*r_serial)[numbuflen + ti.length] = ')';
   (*r_serial)[numbuflen + ti.length + 1] = 0;
 
+ build_keyid:
+  if (r_keyid && keyid_der && keyid_derlen)
+    {
+      sprintf (numbuf,"(%u:", (unsigned int)keyid_derlen);
+      numbuflen = strlen (numbuf);
+      *r_keyid = xtrymalloc (numbuflen + keyid_derlen + 2);
+      if (!*r_keyid)
+        return gpg_error (GPG_ERR_ENOMEM);
+      strcpy (*r_keyid, numbuf);
+      memcpy (*r_keyid+numbuflen, keyid_der, keyid_derlen);
+      (*r_keyid)[numbuflen + keyid_derlen] = ')';
+      (*r_keyid)[numbuflen + keyid_derlen + 1] = 0;
+    }
   return 0;
 }
 
index c650cc1..ab5d8a3 100644 (file)
@@ -1,5 +1,5 @@
 /* ksba.h - X509 library for the Aegypten project
- *      Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
+ *      Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH
  *
  * This file is part of KSBA.
  *
@@ -237,6 +237,9 @@ 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);
index 2d44055..67858f9 100644 (file)
@@ -36,6 +36,7 @@ KSBA_0.9 {
     ksba_cert_init_from_mem; ksba_cert_is_ca; ksba_cert_new;
     ksba_cert_read_der; ksba_cert_ref; ksba_cert_release;
     ksba_cert_get_authority_info_access; ksba_cert_get_subject_info_access;
+    ksba_cert_get_subj_key_id;
 
     ksba_certreq_add_subject; ksba_certreq_build; ksba_certreq_new;
     ksba_certreq_release; ksba_certreq_set_hash_function; 
index cb9bd63..7614767 100644 (file)
@@ -1,3 +1,9 @@
+2005-04-15  Werner Koch  <wk@g10code.com>
+
+       * cert-basic.c (list_extensions): Print the AKI.keyIdentifier and
+       the subjectKeyIdentifier.
+       * t-crl-parser.c (one_file): Print the AKI.keyIdentifier.
+
 2004-11-28  Werner Koch  <wk@g10code.com>
 
        * t-cms-parser.c (one_file): Do not use a writer object.
        (print_sexp): this and changed all callers.
        
 
- Copyright 2001, 2002 g10 Code GmbH
+ Copyright 2001, 2002, 2003, 2004, 2005 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
index 9aa6688..a8ade91 100644 (file)
@@ -1,5 +1,5 @@
 /* cert-basic.c - basic test for the certificate management.
- *      Copyright (C) 2001, 2002, 2004 g10 Code GmbH
+ *      Copyright (C) 2001, 2002, 2004, 2005 g10 Code GmbH
  *
  * This file is part of KSBA.
  *
@@ -62,6 +62,20 @@ xmalloc (size_t n)
 }
 
 
+void
+print_hex (const unsigned char *p, size_t n)
+{
+  if (!p)
+    fputs ("none", stdout);
+  else
+    {
+      for (; n; n--, p++)
+        printf ("%02X", *p);
+    }
+}
+
+
+
 static void
 print_sexp (ksba_const_sexp_t p)
 {
@@ -228,6 +242,7 @@ list_extensions (ksba_cert_t cert)
   char *string, *p;
   ksba_name_t name1, name2;
   ksba_sexp_t serial;
+  ksba_sexp_t keyid;
 
   for (idx=0; !(err=ksba_cert_get_extension (cert, idx,
                                              &oid, &crit, &off, &len));idx++)
@@ -245,23 +260,49 @@ list_extensions (ksba_cert_t cert)
       errorcount++;
     }
 
-  /* authorityKeyIdentifier */
-  err = ksba_cert_get_auth_key_id (cert, NULL, &name1, &serial);
+  /* subjectKeyIdentifier */
+  err = ksba_cert_get_subj_key_id (cert, NULL, &keyid);
   if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA)
     {
-      fputs ("AuthorityKeyIdentifier: ", stdout);
+      fputs ("SubjectKeyIdentifier: ", stdout);
       if (gpg_err_code (err) == GPG_ERR_NO_DATA)
         fputs ("none", stdout);
       else
         {
-          print_names (24, name1);
-          ksba_name_release (name1);
-          fputs ("                 serial: ", stdout);
-          print_sexp (serial);
-          ksba_free (serial);
+          print_sexp (keyid);
+          ksba_free (keyid);
         }
       putchar ('\n');
     }
+
+
+  /* authorityKeyIdentifier */
+  err = ksba_cert_get_auth_key_id (cert, &keyid, &name1, &serial);
+  if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA)
+    {
+      fputs ("AuthorityKeyIdentifier: ", stdout);
+      if (gpg_err_code (err) == GPG_ERR_NO_DATA)
+        fputs ("none\n", stdout);
+      else
+        {
+          if (name1)
+            {
+              print_names (24, name1);
+              ksba_name_release (name1);
+              fputs ("                serial: ", stdout);
+              print_sexp (serial);
+              ksba_free (serial);
+            }
+          putchar ('\n');
+          if (keyid)
+            {
+              fputs ("         keyIdentifier: ", stdout);
+              print_sexp (keyid);
+              ksba_free (keyid);
+              putchar ('\n');
+            }
+        }
+    }
   else
     { 
       fprintf (stderr, "%s:%d: ksba_cert_get_auth_key_id: %s\n", 
index 2bb1df8..54b0d97 100644 (file)
@@ -1,5 +1,5 @@
 /* t-crl-parser.c - basic test for the CRl parser.
- *      Copyright (C) 2002, 2004 g10 Code GmbH
+ *      Copyright (C) 2002, 2004, 2005 g10 Code GmbH
  *
  * This file is part of KSBA.
  *
@@ -191,22 +191,33 @@ one_file (const char *fname)
   {
     ksba_name_t name1;
     ksba_sexp_t serial;
+    ksba_sexp_t keyid;
 
-    err = ksba_crl_get_auth_key_id (crl, NULL, &name1, &serial);
+    err = ksba_crl_get_auth_key_id (crl, &keyid, &name1, &serial);
     if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA)
       {
         fputs ("AuthorityKeyIdentifier: ", stdout);
         if (gpg_err_code (err) == GPG_ERR_NO_DATA)
-          fputs ("none", stdout);
+          fputs ("none\n", stdout);
         else
           {
-            print_names (24, name1);
-            ksba_name_release (name1);
-            fputs ("                serial: ", stdout);
-            print_sexp (serial);
-            ksba_free (serial);
+            if (name1)
+              {
+                print_names (24, name1);
+                ksba_name_release (name1);
+                fputs ("                serial: ", stdout);
+                print_sexp (serial);
+                ksba_free (serial);
+              }
+            putchar ('\n');
+            if (keyid)
+              {
+                fputs ("         keyIdentifier: ", stdout);
+                print_sexp (keyid);
+                ksba_free (keyid);
+                putchar ('\n');
+              }
           }
-        putchar ('\n');
       }
     else
       fail_if_err (err);