Panu Matilainen 34fad6
diff -r ec9e6c427068 Makefile.am
Panu Matilainen 34fad6
--- a/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -10,14 +10,14 @@ EXTRA_DIST = CHANGES ChangeLog CREDITS D
Panu Matilainen 34fad6
 	po/*.in po/*.po po/rpm.pot \
Panu Matilainen 34fad6
 	rpm.magic rpmpopt-$(VERSION) rpmqv.c 
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-SUBDIRS = po misc @WITH_ZLIB_SUBDIR@ @WITH_ELFUTILS_SUBDIR@ @WITH_MAGIC_SUBDIR@ @WITH_DB_SUBDIR@ @WITH_SQLITE3_SUBDIR@ @WITH_POPT_SUBDIR@ @WITH_BEECRYPT_SUBDIR@ @WITH_NEON_SUBDIR@ lua rpmio rpmdb lib build @WITH_PYTHON_SUBDIR@ tools scripts doc .
Panu Matilainen 34fad6
+SUBDIRS = po misc @WITH_ZLIB_SUBDIR@ @WITH_ELFUTILS_SUBDIR@ @WITH_MAGIC_SUBDIR@ @WITH_DB_SUBDIR@ @WITH_SQLITE3_SUBDIR@ @WITH_POPT_SUBDIR@ @WITH_NEON_SUBDIR@ lua rpmio rpmdb lib build @WITH_PYTHON_SUBDIR@ tools scripts doc .
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 INCLUDES = \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/build \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/lib \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmdb \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/misc \
Panu Matilainen 34fad6
 	@WITH_LIBELF_INCLUDE@ \
Panu Matilainen 34fad6
@@ -25,7 +25,7 @@ INCLUDES = \
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 staticLDFLAGS = @LDFLAGS_STATIC@ @LDFLAGS_NPTL@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-myLDFLAGS = @WITH_LIBELF_LIB@ @WITH_BEECRYPT_LIB@
Panu Matilainen 34fad6
+myLDFLAGS = @WITH_LIBELF_LIB@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 myLDADD = \
Panu Matilainen 34fad6
 	$(top_builddir)/lib/librpm.la \
Panu Matilainen 34fad6
@@ -33,6 +33,7 @@ myLDADD = \
Panu Matilainen 34fad6
 	$(top_builddir)/rpmio/librpmio.la \
Panu Matilainen 34fad6
 	@WITH_POPT_LIB@ \
Panu Matilainen 34fad6
 	@WITH_ZLIB_LIB@ \
Panu Matilainen 34fad6
+	@WITH_NSS_LIB@ \
Panu Matilainen 34fad6
 	@LIBMISC@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 rpmbindir = `echo $(bindir) | sed -e s,usr/bin,bin,`
Panu Matilainen 34fad6
@@ -71,7 +72,7 @@ rpmd.o:	$(top_srcdir)/rpmqv.c
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 rpmi_SOURCES =
Panu Matilainen 34fad6
 #rpmi_LDFLAGS =		$(myLDFLAGS) $(staticLDFLAGS)
Panu Matilainen 34fad6
-#rpmi_LDADD =		rpmi.o $(myLDADD) @WITH_LIBELF_LIB@ @WITH_BEECRYPT_LIB@
Panu Matilainen 34fad6
+#rpmi_LDADD =		rpmi.o $(myLDADD) @WITH_LIBELF_LIB@
Panu Matilainen 34fad6
 rpmi_LDFLAGS =		$(myLDFLAGS)
Panu Matilainen 34fad6
 rpmi_LDADD =		rpmi.o $(myLDADD)
Panu Matilainen 34fad6
 rpmi.o:	$(top_srcdir)/rpmqv.c
Panu Matilainen 34fad6
@@ -112,7 +113,6 @@ lint:
Panu Matilainen 34fad6
 		`make -s sources -C lib` \
Panu Matilainen 34fad6
 		`make -s sources -C rpmdb` \
Panu Matilainen 34fad6
 		`make -s sources -C rpmio` \
Panu Matilainen 34fad6
-		`make -s sources -C beecrypt` \
Panu Matilainen 34fad6
 		`make -s sources -C file/src` \
Panu Matilainen 34fad6
 		`make -s sources -C popt`
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
diff -r ec9e6c427068 autogen.sh
Panu Matilainen 34fad6
--- a/autogen.sh	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/autogen.sh	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -48,9 +48,6 @@ if [ -d zlib ]; then
Panu Matilainen 34fad6
 if [ -d zlib ]; then
Panu Matilainen 34fad6
     (echo "--- zlib"; cd zlib; ./autogen.sh --noconfigure "$@")
Panu Matilainen 34fad6
 fi
Panu Matilainen 34fad6
-if [ -d beecrypt ]; then
Panu Matilainen 34fad6
-    (echo "--- beecrypt"; cd beecrypt; ./autogen.sh --noconfigure "$@")
Panu Matilainen 34fad6
-fi
Panu Matilainen 34fad6
 if [ -d elfutils ]; then
Panu Matilainen 34fad6
     (echo "--- elfutils"; cd elfutils; ./autogen.sh --noconfigure "$@")
Panu Matilainen 34fad6
 fi
Panu Matilainen 34fad6
diff -r ec9e6c427068 build/Makefile.am
Panu Matilainen 34fad6
--- a/build/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/build/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -9,7 +9,7 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/lib \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmdb \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_MAGIC_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_LIBELF_INCLUDE@ \
Panu Matilainen 34fad6
diff -r ec9e6c427068 configure.ac
Panu Matilainen 34fad6
--- a/configure.ac	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/configure.ac	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -463,34 +463,32 @@ AC_SUBST(WITH_LIBDWARF_DEBUGEDIT)
Panu Matilainen 34fad6
 AC_SUBST(WITH_LIBDWARF_DEBUGEDIT)
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 #=================
Panu Matilainen 34fad6
-# Check for beecrypt library. Prefer external, otherwise internal.
Panu Matilainen 34fad6
-WITH_BEECRYPT_SUBDIR=
Panu Matilainen 34fad6
-WITH_BEECRYPT_INCLUDE=
Panu Matilainen 34fad6
-WITH_BEECRYPT_LIB=
Panu Matilainen 34fad6
-AC_CHECK_HEADER([beecrypt/beecrypt.h], [
Panu Matilainen 34fad6
-  AC_CHECK_LIB(beecrypt, mpfprintln, [
Panu Matilainen 34fad6
-    AC_DEFINE(HAVE_LIBBEECRYPT, 1, [Define to 1 if you have the 'beecrypt' library (-lbeecrypt).])
Panu Matilainen 34fad6
-    AC_CHECK_HEADER([beecrypt/api.h], [
Panu Matilainen 34fad6
-      AC_DEFINE(HAVE_BEECRYPT_API_H, 1, [Define to 1 if you have the <beecrypt/api.h> header file.])
Panu Matilainen 34fad6
-    ])
Panu Matilainen 34fad6
-    WITH_BEECRYPT_INCLUDE="-I${includedir}/beecrypt"
Panu Matilainen 34fad6
-    WITH_BEECRYPT_LIB="-lbeecrypt"
Panu Matilainen 34fad6
+# Check for NSS library.
Panu Matilainen 34fad6
+WITH_NSS_INCLUDE=
Panu Matilainen 34fad6
+WITH_NSS_LIB=
Panu Matilainen 34fad6
+check=`pkg-config --version 2>/dev/null`
Panu Matilainen 34fad6
+if test -n "$check"; then
Panu Matilainen 34fad6
+  addlib=$(pkg-config --libs nss | sed 's/-lsmime3//;s/-lssl3//')
Panu Matilainen 34fad6
+  addcppflags=$(pkg-config --cflags nss)
Panu Matilainen 34fad6
+else
Panu Matilainen 34fad6
+# Without pkg-config, we'll kludge in some defaults
Panu Matilainen 34fad6
+  addlib="-lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
Panu Matilainen 34fad6
+  addcppflags="-I/usr/include/nss3 -I/usr/include/nspr4"
Panu Matilainen 34fad6
+fi
Panu Matilainen 34fad6
+save_CPPFLAGS="$CPPFLAGS"
Panu Matilainen 34fad6
+CPPFLAGS="$save_CPPFLAGS $addcppflags"
Panu Matilainen 34fad6
+AC_CHECK_HEADER([nss3/nss.h], [
Panu Matilainen 34fad6
+  AC_CHECK_LIB(nss3, NSS_NoDB_Init, [
Panu Matilainen 34fad6
+    AC_DEFINE(HAVE_LIBNSS, 1, [Define to 1 if you have the 'NSS' library (-lnss3).])
Panu Matilainen 34fad6
+    WITH_NSS_INCLUDE="$addcppflags"
Panu Matilainen 34fad6
+    WITH_NSS_LIB="$addlib"
Panu Matilainen 34fad6
   ])
Panu Matilainen 34fad6
 ],[
Panu Matilainen 34fad6
-  if test -d beecrypt ; then
Panu Matilainen 34fad6
-    AC_DEFINE(HAVE_LIBBEECRYPT, 1, [Define to 1 if you have the 'beecrypt' library (-lbeecrypt).])
Panu Matilainen 34fad6
-    WITH_BEECRYPT_SUBDIR=beecrypt
Panu Matilainen 34fad6
-    WITH_BEECRYPT_INCLUDE="-I\${top_srcdir}/${WITH_BEECRYPT_SUBDIR}"
Panu Matilainen 34fad6
-    WITH_BEECRYPT_LIB="\${top_builddir}/${WITH_BEECRYPT_SUBDIR}/libbeecrypt.la"
Panu Matilainen 34fad6
-  fi
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-   if test -z "${WITH_BEECRYPT_LIB}" ; then
Panu Matilainen 34fad6
-       AC_MSG_ERROR([rpm requires beecrypt]) 
Panu Matilainen 34fad6
-   fi
Panu Matilainen 34fad6
-])
Panu Matilainen 34fad6
-AC_SUBST(WITH_BEECRYPT_SUBDIR)
Panu Matilainen 34fad6
-AC_SUBST(WITH_BEECRYPT_INCLUDE)
Panu Matilainen 34fad6
-AC_SUBST(WITH_BEECRYPT_LIB)
Panu Matilainen 34fad6
+  AC_MSG_ERROR([rpm requires NSS]) 
Panu Matilainen 34fad6
+])
Panu Matilainen 34fad6
+CPPFLAGS="$save_CPPFLAGS"
Panu Matilainen 34fad6
+AC_SUBST(WITH_NSS_INCLUDE)
Panu Matilainen 34fad6
+AC_SUBST(WITH_NSS_LIB)
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 #=================
Panu Matilainen 34fad6
 # Check for neon library. Prefer external, otherwise internal.
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/Makefile.am
Panu Matilainen 34fad6
--- a/lib/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -9,7 +9,7 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/build \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmdb \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/misc \
Panu Matilainen 34fad6
 	@INCPATH@
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/formats.c
Panu Matilainen 34fad6
--- a/lib/formats.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/formats.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -210,23 +210,17 @@ static /*@only@*/ char * base64Format(in
Panu Matilainen 34fad6
 	int lc;
Panu Matilainen 34fad6
 	/* XXX HACK ALERT: element field abused as no. bytes of binary data. */
Panu Matilainen 34fad6
 	size_t ns = element;
Panu Matilainen 34fad6
-	size_t nt = ((ns + 2) / 3) * 4;
Panu Matilainen 34fad6
+	size_t nt = 0;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /*@-boundswrite@*/
Panu Matilainen 34fad6
-	/*@-globs@*/
Panu Matilainen 34fad6
-	/* Add additional bytes necessary for eol string(s). */
Panu Matilainen 34fad6
-	if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
Panu Matilainen 34fad6
-	    lc = (nt + b64encode_chars_per_line - 1) / b64encode_chars_per_line;
Panu Matilainen 34fad6
-        if (((nt + b64encode_chars_per_line - 1) % b64encode_chars_per_line) != 0)
Panu Matilainen 34fad6
-            ++lc;
Panu Matilainen 34fad6
-	    nt += lc * strlen(b64encode_eolstr);
Panu Matilainen 34fad6
+	if ((enc = b64encode(data, ns, -1)) != NULL) {
Panu Matilainen 34fad6
+		nt = strlen(enc);
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
-	/*@=globs@*/
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	val = t = xmalloc(nt + padding + 1);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	*t = '\0';
Panu Matilainen 34fad6
-	if ((enc = b64encode(data, ns)) != NULL) {
Panu Matilainen 34fad6
+	if (enc != NULL) {
Panu Matilainen 34fad6
 	    t = stpcpy(t, enc);
Panu Matilainen 34fad6
 	    enc = _free(enc);
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
@@ -310,16 +304,13 @@ static /*@only@*/ char * xmlFormat(int_3
Panu Matilainen 34fad6
 	xtag = "string";
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case RPM_BIN_TYPE:
Panu Matilainen 34fad6
-    {	int cpl = b64encode_chars_per_line;
Panu Matilainen 34fad6
-/*@-mods@*/
Panu Matilainen 34fad6
-	b64encode_chars_per_line = 0;
Panu Matilainen 34fad6
-/*@=mods@*/
Panu Matilainen 34fad6
-/*@-formatconst@*/
Panu Matilainen 34fad6
-	s = base64Format(type, data, formatPrefix, padding, element);
Panu Matilainen 34fad6
-/*@=formatconst@*/
Panu Matilainen 34fad6
-/*@-mods@*/
Panu Matilainen 34fad6
-	b64encode_chars_per_line = cpl;
Panu Matilainen 34fad6
-/*@=mods@*/
Panu Matilainen 34fad6
+    {	
Panu Matilainen 34fad6
+	/* XXX HACK ALERT: element field abused as no. bytes of binary data. */
Panu Matilainen 34fad6
+	size_t ns = element;
Panu Matilainen 34fad6
+    	if ((s = b64encode(data, ns, 0)) == NULL) {
Panu Matilainen 34fad6
+    		/* XXX proper error handling would be better. */
Panu Matilainen 34fad6
+    		s = xcalloc(1, padding + (ns / 3) * 4 + 1);
Panu Matilainen 34fad6
+    	}
Panu Matilainen 34fad6
 	xtag = "base64";
Panu Matilainen 34fad6
     }	break;
Panu Matilainen 34fad6
     case RPM_CHAR_TYPE:
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/package.c
Panu Matilainen 34fad6
--- a/lib/package.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/package.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -1008,11 +1008,9 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t 
Panu Matilainen 34fad6
 		fddig->hashctx = NULL;
Panu Matilainen 34fad6
 		/*@switchbreak@*/ break;
Panu Matilainen 34fad6
 	    case PGPHASHALGO_SHA1:
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
 	    case PGPHASHALGO_SHA256:
Panu Matilainen 34fad6
 	    case PGPHASHALGO_SHA384:
Panu Matilainen 34fad6
 	    case PGPHASHALGO_SHA512:
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
 		dig->sha1ctx = fddig->hashctx;
Panu Matilainen 34fad6
 		fddig->hashctx = NULL;
Panu Matilainen 34fad6
 		/*@switchbreak@*/ break;
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/rpmchecksig.c
Panu Matilainen 34fad6
--- a/lib/rpmchecksig.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/rpmchecksig.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -447,7 +447,7 @@ rpmRC rpmcliImportPubkey(const rpmts ts,
Panu Matilainen 34fad6
     if (rpmtsOpenDB(ts, (O_RDWR|O_CREAT)))
Panu Matilainen 34fad6
 	return RPMRC_FAIL;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-    if ((enc = b64encode(pkt, pktlen)) == NULL)
Panu Matilainen 34fad6
+    if ((enc = b64encode(pkt, pktlen, -1)) == NULL)
Panu Matilainen 34fad6
 	goto exit;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     dig = pgpNewDig();
Panu Matilainen 34fad6
@@ -698,11 +698,9 @@ assert(dig->md5ctx == NULL);
Panu Matilainen 34fad6
 	    fddig->hashctx = NULL;
Panu Matilainen 34fad6
 	    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 	case PGPHASHALGO_SHA1:
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
 	case PGPHASHALGO_SHA256:
Panu Matilainen 34fad6
 	case PGPHASHALGO_SHA384:
Panu Matilainen 34fad6
 	case PGPHASHALGO_SHA512:
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
 assert(dig->sha1ctx == NULL);
Panu Matilainen 34fad6
 	    dig->sha1ctx = fddig->hashctx;
Panu Matilainen 34fad6
 	    fddig->hashctx = NULL;
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/rpmts.c
Panu Matilainen 34fad6
--- a/lib/rpmts.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/rpmts.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -4,7 +4,7 @@
Panu Matilainen 34fad6
  */
Panu Matilainen 34fad6
 #include "system.h"
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-#include "rpmio_internal.h"	/* XXX for pgp and beecrypt */
Panu Matilainen 34fad6
+#include "rpmio_internal.h"	/* XXX for pgp */
Panu Matilainen 34fad6
 #include <rpmlib.h>
Panu Matilainen 34fad6
 #include <rpmmacro.h>		/* XXX rpmtsOpenDB() needs rpmGetPath */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
diff -r ec9e6c427068 lib/signature.c
Panu Matilainen 34fad6
--- a/lib/signature.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/lib/signature.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -1215,9 +1215,10 @@ verifyRSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
     int_32 sigtag = rpmtsSigtag(ts);
Panu Matilainen 34fad6
     pgpDig dig = rpmtsDig(ts);
Panu Matilainen 34fad6
     pgpDigParams sigp = rpmtsSignature(ts);
Panu Matilainen 34fad6
-    const char * prefix = NULL;
Panu Matilainen 34fad6
+    SECOidTag sigalg;
Panu Matilainen 34fad6
     rpmRC res = RPMRC_OK;
Panu Matilainen 34fad6
     int xx;
Panu Matilainen 34fad6
+    SECItem digest;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     *t = '\0';
Panu Matilainen 34fad6
     if (dig != NULL && dig->hdrmd5ctx == md5ctx)
Panu Matilainen 34fad6
@@ -1248,43 +1249,40 @@ verifyRSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
     switch (sigp->hash_algo) {
Panu Matilainen 34fad6
     case PGPHASHALGO_MD5:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/MD5");
Panu Matilainen 34fad6
-	prefix = "3020300c06082a864886f70d020505000410";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA1:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/SHA1");
Panu Matilainen 34fad6
-	prefix = "3021300906052b0e03021a05000414";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_RIPEMD160:
Panu Matilainen 34fad6
 	res = RPMRC_NOKEY;
Panu Matilainen 34fad6
-	prefix = NULL;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_MD2:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/MD2");
Panu Matilainen 34fad6
-	prefix = "3020300c06082a864886f70d020205000410";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_TIGER192:
Panu Matilainen 34fad6
 	res = RPMRC_NOKEY;
Panu Matilainen 34fad6
-	prefix = NULL;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_HAVAL_5_160:
Panu Matilainen 34fad6
 	res = RPMRC_NOKEY;
Panu Matilainen 34fad6
-	prefix = NULL;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA256:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/SHA256");
Panu Matilainen 34fad6
-	prefix = "3031300d060960864801650304020105000420";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA384:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/SHA384");
Panu Matilainen 34fad6
-	prefix = "3041300d060960864801650304020205000430";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA512:
Panu Matilainen 34fad6
 	t = stpcpy(t, " RSA/SHA512");
Panu Matilainen 34fad6
-	prefix = "3051300d060960864801650304020305000440";
Panu Matilainen 34fad6
+	sigalg = SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     default:
Panu Matilainen 34fad6
 	res = RPMRC_NOKEY;
Panu Matilainen 34fad6
-	prefix = NULL;
Panu Matilainen 34fad6
+	sigalg = SEC_OID_UNKNOWN;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
@@ -1295,8 +1293,6 @@ verifyRSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
Panu Matilainen 34fad6
     {	DIGEST_CTX ctx = rpmDigestDup(md5ctx);
Panu Matilainen 34fad6
-	byte signhash16[2];
Panu Matilainen 34fad6
-	const char * s;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	if (sigp->hash != NULL)
Panu Matilainen 34fad6
 	    xx = rpmDigestUpdate(ctx, sigp->hash, sigp->hashlen);
Panu Matilainen 34fad6
@@ -1313,40 +1309,18 @@ verifyRSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
 #endif
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-	xx = rpmDigestFinal(ctx, (void **)&dig->md5, &dig->md5len, 1);
Panu Matilainen 34fad6
+	xx = rpmDigestFinal(ctx, (void **)&dig->md5, &dig->md5len, 0);
Panu Matilainen 34fad6
 	(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
Panu Matilainen 34fad6
 	rpmtsOp(ts, RPMTS_OP_DIGEST)->count--;	/* XXX one too many */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	/* Compare leading 16 bits of digest for quick check. */
Panu Matilainen 34fad6
-	s = dig->md5;
Panu Matilainen 34fad6
-	signhash16[0] = (nibble(s[0]) << 4) | nibble(s[1]);
Panu Matilainen 34fad6
-	signhash16[1] = (nibble(s[2]) << 4) | nibble(s[3]);
Panu Matilainen 34fad6
-	if (memcmp(signhash16, sigp->signhash16, sizeof(signhash16))) {
Panu Matilainen 34fad6
+	if (memcmp(dig->md5, sigp->signhash16, 2)) {
Panu Matilainen 34fad6
 	    res = RPMRC_FAIL;
Panu Matilainen 34fad6
 	    goto exit;
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
-    }
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    /* Generate RSA modulus parameter. */
Panu Matilainen 34fad6
-    {	unsigned int nbits = MP_WORDS_TO_BITS(dig->c.size);
Panu Matilainen 34fad6
-	unsigned int nb = (nbits + 7) >> 3;
Panu Matilainen 34fad6
-	const char * hexstr;
Panu Matilainen 34fad6
-	char * tt;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-assert(prefix != NULL);
Panu Matilainen 34fad6
-	hexstr = tt = xmalloc(2 * nb + 1);
Panu Matilainen 34fad6
-	memset(tt, 'f', (2 * nb));
Panu Matilainen 34fad6
-	tt[0] = '0'; tt[1] = '0';
Panu Matilainen 34fad6
-	tt[2] = '0'; tt[3] = '1';
Panu Matilainen 34fad6
-	tt += (2 * nb) - strlen(prefix) - strlen(dig->md5) - 2;
Panu Matilainen 34fad6
-	*tt++ = '0'; *tt++ = '0';
Panu Matilainen 34fad6
-	tt = stpcpy(tt, prefix);
Panu Matilainen 34fad6
-	tt = stpcpy(tt, dig->md5);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-	mpnzero(&dig->rsahm);	(void) mpnsethex(&dig->rsahm, hexstr);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-	hexstr = _free(hexstr);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
+	digest.type = siBuffer;
Panu Matilainen 34fad6
+	digest.data = dig->md5;
Panu Matilainen 34fad6
+	digest.len = dig->md5len;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     /* Retrieve the matching public key. */
Panu Matilainen 34fad6
@@ -1355,12 +1329,7 @@ assert(prefix != NULL);
Panu Matilainen 34fad6
 	goto exit;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_SIGNATURE), 0);
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
-    xx = rsavrfy(&dig->rsa_pk.n, &dig->rsa_pk.e, &dig->c, &dig->rsahm);
Panu Matilainen 34fad6
-#else
Panu Matilainen 34fad6
-    xx = rsavrfy(&dig->rsa_pk, &dig->rsahm, &dig->c);
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
-    if (xx)
Panu Matilainen 34fad6
+    if (VFY_VerifyDigest(&digest, dig->rsa, dig->rsasig, sigalg, NULL) == SECSuccess)
Panu Matilainen 34fad6
 	res = RPMRC_OK;
Panu Matilainen 34fad6
     else
Panu Matilainen 34fad6
 	res = RPMRC_FAIL;
Panu Matilainen 34fad6
@@ -1401,6 +1370,7 @@ verifyDSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
     pgpDigParams sigp = rpmtsSignature(ts);
Panu Matilainen 34fad6
     rpmRC res;
Panu Matilainen 34fad6
     int xx;
Panu Matilainen 34fad6
+    SECItem digest;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     *t = '\0';
Panu Matilainen 34fad6
     if (dig != NULL && dig->hdrsha1ctx == sha1ctx)
Panu Matilainen 34fad6
@@ -1428,7 +1398,6 @@ verifyDSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
Panu Matilainen 34fad6
     {	DIGEST_CTX ctx = rpmDigestDup(sha1ctx);
Panu Matilainen 34fad6
-	byte signhash16[2];
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	if (sigp->hash != NULL)
Panu Matilainen 34fad6
 	    xx = rpmDigestUpdate(ctx, sigp->hash, sigp->hashlen);
Panu Matilainen 34fad6
@@ -1442,19 +1411,18 @@ verifyDSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
 	    memcpy(trailer+2, &nb, sizeof(nb));
Panu Matilainen 34fad6
 	    xx = rpmDigestUpdate(ctx, trailer, sizeof(trailer));
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
-	xx = rpmDigestFinal(ctx, (void **)&dig->sha1, &dig->sha1len, 1);
Panu Matilainen 34fad6
+	xx = rpmDigestFinal(ctx, (void **)&dig->sha1, &dig->sha1len, 0);
Panu Matilainen 34fad6
 	(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
Panu Matilainen 34fad6
 	rpmtsOp(ts, RPMTS_OP_DIGEST)->count--;	/* XXX one too many */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-	mpnzero(&dig->hm);	(void) mpnsethex(&dig->hm, dig->sha1);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
 	/* Compare leading 16 bits of digest for quick check. */
Panu Matilainen 34fad6
-	signhash16[0] = (*dig->hm.data >> 24) & 0xff;
Panu Matilainen 34fad6
-	signhash16[1] = (*dig->hm.data >> 16) & 0xff;
Panu Matilainen 34fad6
-	if (memcmp(signhash16, sigp->signhash16, sizeof(signhash16))) {
Panu Matilainen 34fad6
+	if (memcmp(dig->sha1, sigp->signhash16, 2)) {
Panu Matilainen 34fad6
 	    res = RPMRC_FAIL;
Panu Matilainen 34fad6
 	    goto exit;
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
+	digest.type = siBuffer;
Panu Matilainen 34fad6
+	digest.data = dig->sha1;
Panu Matilainen 34fad6
+	digest.len = dig->sha1len;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     /* Retrieve the matching public key. */
Panu Matilainen 34fad6
@@ -1463,8 +1431,8 @@ verifyDSASignature(rpmts ts, /*@out@*/ c
Panu Matilainen 34fad6
 	goto exit;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     (void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_SIGNATURE), 0);
Panu Matilainen 34fad6
-    if (dsavrfy(&dig->p, &dig->q, &dig->g,
Panu Matilainen 34fad6
-		&dig->hm, &dig->y, &dig->r, &dig->s))
Panu Matilainen 34fad6
+    if (VFY_VerifyDigest(&digest, dig->dsa, dig->dsasig,
Panu Matilainen 34fad6
+    		SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST, NULL) == SECSuccess)
Panu Matilainen 34fad6
 	res = RPMRC_OK;
Panu Matilainen 34fad6
     else
Panu Matilainen 34fad6
 	res = RPMRC_FAIL;
Panu Matilainen 34fad6
diff -r ec9e6c427068 python/Makefile.am
Panu Matilainen 34fad6
--- a/python/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/python/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -17,7 +17,7 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmdb \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
 	@WITH_LIBELF_INCLUDE@ \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/misc \
Panu Matilainen 34fad6
 	-I$(pyincdir) \
Panu Matilainen 34fad6
@@ -42,7 +42,7 @@ rpm_LTLIBRARIES = _rpmmodule.la
Panu Matilainen 34fad6
 rpm_LTLIBRARIES = _rpmmodule.la
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 _rpmmodule_la_LDFLAGS = $(mylibs) $(LIBS) -module -avoid-version
Panu Matilainen 34fad6
-_rpmmodule_la_LIBADD =  @WITH_BEECRYPT_LIB@
Panu Matilainen 34fad6
+_rpmmodule_la_LIBADD =  @WITH_NSS_LIB@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 _rpmmodule_la_SOURCES = rpmmodule.c header-py.c \
Panu Matilainen 34fad6
 		       rpmal-py.c rpmds-py.c rpmdb-py.c rpmfd-py.c rpmfts-py.c \
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmdb/Makefile.am
Panu Matilainen 34fad6
--- a/rpmdb/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmdb/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -9,7 +9,7 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/build \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/lib \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/misc \
Panu Matilainen 34fad6
 	@WITH_SQLITE3_INCLUDE@ \
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/Makefile.am
Panu Matilainen 34fad6
--- a/rpmio/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -10,7 +10,7 @@ EXTRA_PROGRAMS = tax tdigest tdir tfts t
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir) \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_NEON_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_LUA_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
@@ -19,23 +19,21 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 pkgincdir = $(pkgincludedir)
Panu Matilainen 34fad6
 pkginc_HEADERS = \
Panu Matilainen 34fad6
-	argv.h fts.h rpmdav.h \
Panu Matilainen 34fad6
+	argv.h base64.h fts.h rpmdav.h \
Panu Matilainen 34fad6
 	rpmio.h rpmurl.h rpmmacro.h rpmlog.h rpmmessages.h rpmerr.h rpmpgp.h \
Panu Matilainen 34fad6
 	rpmsq.h rpmsw.h ugid.h
Panu Matilainen 34fad6
 noinst_HEADERS = rpmio_internal.h rpmlua.h rpmhook.h
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-BEECRYPTLOBJS = $(shell test X"@WITH_BEECRYPT_SUBDIR@" != X && cat $(top_builddir)/@WITH_BEECTYPT_SUBDIR@/listobjs)
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 LDFLAGS = -L$(RPM_BUILD_ROOT)$(usrlibdir) -L$(DESTDIR)$(usrlibdir)
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 usrlibdir = $(libdir)@MARK64@
Panu Matilainen 34fad6
 usrlib_LTLIBRARIES = librpmio.la
Panu Matilainen 34fad6
 librpmio_la_SOURCES = \
Panu Matilainen 34fad6
-	argv.c digest.c fts.c macro.c rpmdav.c \
Panu Matilainen 34fad6
+	argv.c base64.c digest.c fts.c macro.c rpmdav.c \
Panu Matilainen 34fad6
 	rpmhook.c rpmio.c rpmlog.c rpmlua.c rpmmalloc.c \
Panu Matilainen 34fad6
 	rpmpgp.c rpmrpc.c rpmsq.c rpmsw.c strcasecmp.c stubs.c url.c ugid.c
Panu Matilainen 34fad6
 librpmio_la_LDFLAGS = -release 4.4 $(LDFLAGS) \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_LIB@ \
Panu Matilainen 34fad6
+	@WITH_NSS_LIB@ \
Panu Matilainen 34fad6
 	@WITH_NEON_LIB@ \
Panu Matilainen 34fad6
 	@WITH_LUA_LIB@ \
Panu Matilainen 34fad6
 	@WITH_MAGIC_LIB@ \
Panu Matilainen 34fad6
@@ -44,22 +42,10 @@ librpmio_la_LIBADD = # $(BEECRYPTLOBJS)
Panu Matilainen 34fad6
 librpmio_la_LIBADD = # $(BEECRYPTLOBJS)
Panu Matilainen 34fad6
 librpmio_la_DEPENDENCIES = # .created
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-.created:
Panu Matilainen 34fad6
-	if test X"@WITH_BEECRYPT_SUBDIR@" != X; then \
Panu Matilainen 34fad6
-	${MAKE} -C $(top_builddir)/@WITH_BEECRYPT_SUBDIR@ listobjs ; \
Panu Matilainen 34fad6
-	for lo in $(BEECRYPTLOBJS); do \
Panu Matilainen 34fad6
-	  [ -f $$lo ] || $(LN_S) $(top_builddir)/@WITH_BEECRYPT_SUBDIR@/$$lo $$lo ; \
Panu Matilainen 34fad6
-	done \
Panu Matilainen 34fad6
-	fi
Panu Matilainen 34fad6
-	touch $@
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-clean-local:
Panu Matilainen 34fad6
-	rm -f $(BEECRYPTLOBJS) *.o .created
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
 #BUILT_SOURCES = rpmio.lcd
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 rpmio.lcd: Makefile.am ${librpmio_la_SOURCES} ${pkginc_HEADERS} ${noinst_HEADERS}
Panu Matilainen 34fad6
-	-lclint -load ../beecrypt/beecrypt.lcd $(DEFS) $(INCLUDES) $(librpmio_la_SOURCES) -dump $@ 2>/dev/null
Panu Matilainen 34fad6
+	-lclint -load $(DEFS) $(INCLUDES) $(librpmio_la_SOURCES) -dump $@ 2>/dev/null
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 .PHONY:	sources
Panu Matilainen 34fad6
 sources:
Panu Matilainen 34fad6
@@ -105,7 +91,6 @@ tinv_LDADD = librpmio.la $(top_builddir)
Panu Matilainen 34fad6
 tinv_LDADD = librpmio.la $(top_builddir)/popt/libpopt.la
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 tkey_SOURCES = tkey.c
Panu Matilainen 34fad6
-tkey_LDFLAGS = @LDFLAGS_STATIC@
Panu Matilainen 34fad6
 tkey_LDADD = librpmio.la $(top_builddir)/popt/libpopt.la
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 tring_SOURCES = tring.c
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/base64.c
Panu Matilainen 34fad6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
Panu Matilainen 34fad6
+++ b/rpmio/base64.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -0,0 +1,254 @@
Panu Matilainen 34fad6
+/* base64 encoder/decoder based on public domain implementation
Panu Matilainen 34fad6
+ * by Chris Venter */
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#include <arpa/inet.h>
Panu Matilainen 34fad6
+#include <stdlib.h>
Panu Matilainen 34fad6
+#include "base64.h"
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static char base64_encode_value(char value_in)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	static const char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Panu Matilainen 34fad6
+	if (value_in > 63) return '=';
Panu Matilainen 34fad6
+	return encoding[(int)value_in];
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static char *base64_encode_block(const char *plaintext_in, int length_in, char *codechar)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	const char *plainchar = plaintext_in;
Panu Matilainen 34fad6
+	const char *const plaintextend = plaintext_in + length_in;
Panu Matilainen 34fad6
+	char result;
Panu Matilainen 34fad6
+	char fragment;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	while (1) {
Panu Matilainen 34fad6
+		if (plainchar == plaintextend) {
Panu Matilainen 34fad6
+			return codechar;
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+		fragment = *plainchar++;
Panu Matilainen 34fad6
+		result = (fragment & 0x0fc) >> 2;
Panu Matilainen 34fad6
+		*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+		result = (fragment & 0x003) << 4;
Panu Matilainen 34fad6
+		if (plainchar == plaintextend)
Panu Matilainen 34fad6
+		{
Panu Matilainen 34fad6
+			*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+			*codechar++ = '=';
Panu Matilainen 34fad6
+			*codechar++ = '=';
Panu Matilainen 34fad6
+			return codechar;
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+		fragment = *plainchar++;
Panu Matilainen 34fad6
+		result |= (fragment & 0x0f0) >> 4;
Panu Matilainen 34fad6
+		*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+		result = (fragment & 0x00f) << 2;
Panu Matilainen 34fad6
+		if (plainchar == plaintextend)
Panu Matilainen 34fad6
+		{
Panu Matilainen 34fad6
+			*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+			*codechar++ = '=';
Panu Matilainen 34fad6
+			return codechar;
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+		fragment = *plainchar++;
Panu Matilainen 34fad6
+		result |= (fragment & 0x0c0) >> 6;
Panu Matilainen 34fad6
+		*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+		result  = (fragment & 0x03f) >> 0;
Panu Matilainen 34fad6
+		*codechar++ = base64_encode_value(result);
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	/* control should not reach here */
Panu Matilainen 34fad6
+	return codechar;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#define BASE64_DEFAULT_LINE_LENGTH 64
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+char *b64encode(const void *data, size_t len, int linelen)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	size_t encodedlen;
Panu Matilainen 34fad6
+	const char *dataptr = data;
Panu Matilainen 34fad6
+	char *output;
Panu Matilainen 34fad6
+	char *outptr;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	if (data == NULL)
Panu Matilainen 34fad6
+		return NULL;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (linelen < 0)
Panu Matilainen 34fad6
+		linelen = BASE64_DEFAULT_LINE_LENGTH;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	linelen /= 4;
Panu Matilainen 34fad6
+	encodedlen = ((len + 2) / 3) * 4;
Panu Matilainen 34fad6
+	if (linelen > 0) {
Panu Matilainen 34fad6
+		encodedlen += encodedlen/(linelen * 4) + 1;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	++encodedlen; /* for zero termination */
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	output = malloc(encodedlen);
Panu Matilainen 34fad6
+	if (output == NULL)
Panu Matilainen 34fad6
+		return NULL;
Panu Matilainen 34fad6
+		
Panu Matilainen 34fad6
+	outptr = output;	
Panu Matilainen 34fad6
+	while (len > 0) {
Panu Matilainen 34fad6
+		if (linelen > 0 && len > linelen * 3) {
Panu Matilainen 34fad6
+			outptr = base64_encode_block(dataptr, linelen * 3, outptr);
Panu Matilainen 34fad6
+			len -= linelen * 3;
Panu Matilainen 34fad6
+			dataptr += linelen * 3;
Panu Matilainen 34fad6
+		} else {
Panu Matilainen 34fad6
+			outptr = base64_encode_block(dataptr, len, outptr);
Panu Matilainen 34fad6
+			len = 0;
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+		if (linelen > 0) {
Panu Matilainen 34fad6
+			*outptr++ = '\n';
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	*outptr = '\0';
Panu Matilainen 34fad6
+	return output;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static int base64_decode_value(char value_in)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
Panu Matilainen 34fad6
+	static const char decoding_size = sizeof(decoding);
Panu Matilainen 34fad6
+	value_in -= 43;
Panu Matilainen 34fad6
+	if (value_in < 0 || value_in > decoding_size)
Panu Matilainen 34fad6
+		return -1;
Panu Matilainen 34fad6
+	return decoding[(int)value_in];
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static size_t base64_decode_block(const char *code_in, const size_t length_in, char *plaintext_out)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	const char *codechar = code_in;
Panu Matilainen 34fad6
+	char *plainchar = plaintext_out;
Panu Matilainen 34fad6
+	char fragment;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	*plainchar = 0;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	while (1)
Panu Matilainen 34fad6
+	{
Panu Matilainen 34fad6
+		do {
Panu Matilainen 34fad6
+			if (codechar == code_in+length_in)
Panu Matilainen 34fad6
+			{
Panu Matilainen 34fad6
+				return plainchar - plaintext_out;
Panu Matilainen 34fad6
+			}
Panu Matilainen 34fad6
+			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 34fad6
+		*plainchar    = (fragment & 0x03f) << 2;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+		do {
Panu Matilainen 34fad6
+			if (codechar == code_in+length_in)
Panu Matilainen 34fad6
+			{
Panu Matilainen 34fad6
+				return plainchar - plaintext_out;
Panu Matilainen 34fad6
+			}
Panu Matilainen 34fad6
+			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 34fad6
+		*plainchar++ |= (fragment & 0x030) >> 4;
Panu Matilainen 34fad6
+		*plainchar    = (fragment & 0x00f) << 4;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+		do {
Panu Matilainen 34fad6
+			if (codechar == code_in+length_in)
Panu Matilainen 34fad6
+			{
Panu Matilainen 34fad6
+				return plainchar - plaintext_out;
Panu Matilainen 34fad6
+			}
Panu Matilainen 34fad6
+			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 34fad6
+		*plainchar++ |= (fragment & 0x03c) >> 2;
Panu Matilainen 34fad6
+		*plainchar    = (fragment & 0x003) << 6;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+		do {
Panu Matilainen 34fad6
+			if (codechar == code_in+length_in)
Panu Matilainen 34fad6
+			{
Panu Matilainen 34fad6
+				return plainchar - plaintext_out;
Panu Matilainen 34fad6
+			}
Panu Matilainen 34fad6
+			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 34fad6
+		*plainchar++   |= (fragment & 0x03f);
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	/* control should not reach here */
Panu Matilainen 34fad6
+	return plainchar - plaintext_out;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+int b64decode(const char *in, void **out, size_t *outlen)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	size_t outcnt = 0;
Panu Matilainen 34fad6
+	const char *inptr = in;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	*out = NULL;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (in == NULL) {
Panu Matilainen 34fad6
+		return 1;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	while (*inptr != '\0') {
Panu Matilainen 34fad6
+		/* assume all ASCII control chars as whitespace */
Panu Matilainen 34fad6
+		if (*inptr > 32) {
Panu Matilainen 34fad6
+			if (base64_decode_value(*inptr) != -1) {
Panu Matilainen 34fad6
+				++outcnt;
Panu Matilainen 34fad6
+			} else {
Panu Matilainen 34fad6
+				return 3;
Panu Matilainen 34fad6
+			}
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+		++inptr;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	if (outcnt % 4 != 0)
Panu Matilainen 34fad6
+		return 2;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	outcnt = (outcnt / 4) * 3;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	*out = malloc(outcnt + 1); /* base64_decode_block can write one extra character */
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	if (*out == NULL)
Panu Matilainen 34fad6
+		return 4;
Panu Matilainen 34fad6
+	
Panu Matilainen 34fad6
+	*outlen = base64_decode_block(in, inptr - in, *out);
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	return 0;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#define CRC24_INIT 0xb704ce
Panu Matilainen 34fad6
+#define CRC24_POLY 0x1864cfb
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+char *b64crc(const unsigned char *data, size_t len)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	uint32_t crc = CRC24_INIT;
Panu Matilainen 34fad6
+	int i;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	while (len--) {
Panu Matilainen 34fad6
+		crc ^= (*data++) << 16;
Panu Matilainen 34fad6
+		for (i = 0; i < 8; i++) {
Panu Matilainen 34fad6
+			crc <<= 1;
Panu Matilainen 34fad6
+			if (crc & 0x1000000)
Panu Matilainen 34fad6
+				crc ^= CRC24_POLY;
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	crc = htonl(crc & 0xffffff);
Panu Matilainen 34fad6
+	data = (unsigned char *)&crc;
Panu Matilainen 34fad6
+	++data;
Panu Matilainen 34fad6
+	return b64encode(data, 3, 0);
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#ifdef BASE64_TEST
Panu Matilainen 34fad6
+#include <stdio.h>
Panu Matilainen 34fad6
+#include <string.h>
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+int main(int argc, char *argv[]) 
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+	static char tst[]="wtrt8122čLýáj\x20s ~ýhž\t4\x02šjjmBvž^%$RTš#á.íěj\x1hčýčŤc+";
Panu Matilainen 34fad6
+	char *encoded;
Panu Matilainen 34fad6
+	void *decoded;
Panu Matilainen 34fad6
+	size_t size;
Panu Matilainen 34fad6
+	int err;
Panu Matilainen 34fad6
+	printf("Original: %lu\n%s\n", sizeof(tst)-1, tst);
Panu Matilainen 34fad6
+	encoded = b64encode(tst, sizeof(tst)-1, 64);
Panu Matilainen 34fad6
+	printf("Encoded: %lu\n%s\n", strlen(encoded), encoded);
Panu Matilainen 34fad6
+	if ((err = b64decode(encoded, &decoded, &size)) != 0) {
Panu Matilainen 34fad6
+		fprintf(stderr, "Error in decode: %d\n", err);
Panu Matilainen 34fad6
+		return 1;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	printf("Decoded:\n%.*s\n", (int)size, (char *)decoded);
Panu Matilainen 34fad6
+	if (size != sizeof(tst)-1) {
Panu Matilainen 34fad6
+		fprintf(stderr, "Size differs orig: %lu new: %lu\n", sizeof(tst)-1, size);
Panu Matilainen 34fad6
+		return 1;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	if (memcmp(tst, decoded, size) != 0) {
Panu Matilainen 34fad6
+		fprintf(stderr, "Decoded data differs.\n");
Panu Matilainen 34fad6
+		return 1;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+	fprintf(stderr, "OK\n");
Panu Matilainen 34fad6
+	return 0;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+#endif
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/base64.h
Panu Matilainen 34fad6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
Panu Matilainen 34fad6
+++ b/rpmio/base64.h	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -0,0 +1,29 @@
Panu Matilainen 34fad6
+/* base64 encoder/decoder based on public domain implementation
Panu Matilainen 34fad6
+ * by Chris Venter */
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#include <sys/types.h>
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+/* returns malloced base64 encoded string
Panu Matilainen 34fad6
+ * lines are split with \n characters to be nearest lower multiple of linelen
Panu Matilainen 34fad6
+ * if linelen/4 == 0 lines are not split
Panu Matilainen 34fad6
+ * if linelen < 0 default line length (64) is used
Panu Matilainen 34fad6
+ * the returned string is empty when len == 0
Panu Matilainen 34fad6
+ * returns NULL on failures
Panu Matilainen 34fad6
+ */
Panu Matilainen 34fad6
+char *b64encode(const void *data, size_t len, int linelen);
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+/* decodes from zero terminated base64 encoded string to a newly malloced buffer
Panu Matilainen 34fad6
+ * ignores whitespace characters in the input string
Panu Matilainen 34fad6
+ * return values:
Panu Matilainen 34fad6
+ *  0 - OK
Panu Matilainen 34fad6
+ *  1 - input is NULL
Panu Matilainen 34fad6
+ *  2 - invalid length
Panu Matilainen 34fad6
+ *  3 - invalid characters on input
Panu Matilainen 34fad6
+ *  4 - malloc failed
Panu Matilainen 34fad6
+ */
Panu Matilainen 34fad6
+int b64decode(const char *in, void **out, size_t *outlen);
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+/* counts CRC24 and base64 encodes it in a malloced string
Panu Matilainen 34fad6
+ * returns NULL on failures
Panu Matilainen 34fad6
+ */
Panu Matilainen 34fad6
+char *b64crc(const unsigned char *data, size_t len);
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/digest.c
Panu Matilainen 34fad6
--- a/rpmio/digest.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/digest.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -19,16 +19,7 @@
Panu Matilainen 34fad6
  */
Panu Matilainen 34fad6
 struct DIGEST_CTX_s {
Panu Matilainen 34fad6
     rpmDigestFlags flags;	/*!< Bit(s) to control digest operation. */
Panu Matilainen 34fad6
-    uint32_t datalen;		/*!< No. bytes in block of plaintext data. */
Panu Matilainen 34fad6
-    uint32_t paramlen;		/*!< No. bytes of digest parameters. */
Panu Matilainen 34fad6
-    uint32_t digestlen;		/*!< No. bytes of digest. */
Panu Matilainen 34fad6
-    void * param;		/*!< Digest parameters. */
Panu Matilainen 34fad6
-    int (*Reset) (void * param)
Panu Matilainen 34fad6
-	/*@modifies param @*/;	/*!< Digest initialize. */
Panu Matilainen 34fad6
-    int (*Update) (void * param, const byte * data, size_t size)
Panu Matilainen 34fad6
-	/*@modifies param @*/;	/*!< Digest transform. */
Panu Matilainen 34fad6
-    int (*Digest) (void * param, /*@out@*/ byte * digest)
Panu Matilainen 34fad6
-	/*@modifies param, digest @*/;	/*!< Digest finish. */
Panu Matilainen 34fad6
+    HASHContext *hashctx;	/*!< Internal NSS hash context. */
Panu Matilainen 34fad6
 };
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /*@-boundsread@*/
Panu Matilainen 34fad6
@@ -37,115 +28,101 @@ rpmDigestDup(DIGEST_CTX octx)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     DIGEST_CTX nctx;
Panu Matilainen 34fad6
     nctx = memcpy(xcalloc(1, sizeof(*nctx)), octx, sizeof(*nctx));
Panu Matilainen 34fad6
-    nctx->param = memcpy(xcalloc(1, nctx->paramlen), octx->param, nctx->paramlen);
Panu Matilainen 34fad6
+    nctx->hashctx = HASH_Clone(octx->hashctx);
Panu Matilainen 34fad6
+    if (nctx->hashctx == NULL) {
Panu Matilainen 34fad6
+    	fprintf(stderr, "HASH_Clone failed\n");
Panu Matilainen 34fad6
+    	exit(EXIT_FAILURE);  /* FIX: callers do not bother checking error return */
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
     return nctx;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 /*@=boundsread@*/
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-DIGEST_CTX
Panu Matilainen 34fad6
-rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Panu Matilainen 34fad6
+static HASH_HashType
Panu Matilainen 34fad6
+getHashType(pgpHashAlgo hashalgo)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
-    DIGEST_CTX ctx = xcalloc(1, sizeof(*ctx));
Panu Matilainen 34fad6
-    int xx;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    ctx->flags = flags;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
     switch (hashalgo) {
Panu Matilainen 34fad6
     case PGPHASHALGO_MD5:
Panu Matilainen 34fad6
-	ctx->digestlen = 16;
Panu Matilainen 34fad6
-	ctx->datalen = 64;
Panu Matilainen 34fad6
-/*@-sizeoftype@*/ /* FIX: union, not void pointer */
Panu Matilainen 34fad6
-	ctx->paramlen = sizeof(md5Param);
Panu Matilainen 34fad6
-/*@=sizeoftype@*/
Panu Matilainen 34fad6
-	ctx->param = xcalloc(1, ctx->paramlen);
Panu Matilainen 34fad6
-/*@-type@*/ /* FIX: cast? */
Panu Matilainen 34fad6
-	ctx->Reset = (void *) md5Reset;
Panu Matilainen 34fad6
-	ctx->Update = (void *) md5Update;
Panu Matilainen 34fad6
-	ctx->Digest = (void *) md5Digest;
Panu Matilainen 34fad6
-/*@=type@*/
Panu Matilainen 34fad6
+	return HASH_AlgMD5;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA1:
Panu Matilainen 34fad6
-	ctx->digestlen = 20;
Panu Matilainen 34fad6
-	ctx->datalen = 64;
Panu Matilainen 34fad6
-/*@-sizeoftype@*/ /* FIX: union, not void pointer */
Panu Matilainen 34fad6
-	ctx->paramlen = sizeof(sha1Param);
Panu Matilainen 34fad6
-/*@=sizeoftype@*/
Panu Matilainen 34fad6
-	ctx->param = xcalloc(1, ctx->paramlen);
Panu Matilainen 34fad6
-/*@-type@*/ /* FIX: cast? */
Panu Matilainen 34fad6
-	ctx->Reset = (void *) sha1Reset;
Panu Matilainen 34fad6
-	ctx->Update = (void *) sha1Update;
Panu Matilainen 34fad6
-	ctx->Digest = (void *) sha1Digest;
Panu Matilainen 34fad6
-/*@=type@*/
Panu Matilainen 34fad6
+	return HASH_AlgSHA1;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA256:
Panu Matilainen 34fad6
-	ctx->digestlen = 32;
Panu Matilainen 34fad6
-	ctx->datalen = 64;
Panu Matilainen 34fad6
-/*@-sizeoftype@*/ /* FIX: union, not void pointer */
Panu Matilainen 34fad6
-	ctx->paramlen = sizeof(sha256Param);
Panu Matilainen 34fad6
-/*@=sizeoftype@*/
Panu Matilainen 34fad6
-	ctx->param = xcalloc(1, ctx->paramlen);
Panu Matilainen 34fad6
-/*@-type@*/ /* FIX: cast? */
Panu Matilainen 34fad6
-	ctx->Reset = (void *) sha256Reset;
Panu Matilainen 34fad6
-	ctx->Update = (void *) sha256Update;
Panu Matilainen 34fad6
-	ctx->Digest = (void *) sha256Digest;
Panu Matilainen 34fad6
-/*@=type@*/
Panu Matilainen 34fad6
+	return HASH_AlgSHA256;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA384:
Panu Matilainen 34fad6
-	ctx->digestlen = 48;
Panu Matilainen 34fad6
-	ctx->datalen = 128;
Panu Matilainen 34fad6
-/*@-sizeoftype@*/ /* FIX: union, not void pointer */
Panu Matilainen 34fad6
-	ctx->paramlen = sizeof(sha384Param);
Panu Matilainen 34fad6
-/*@=sizeoftype@*/
Panu Matilainen 34fad6
-	ctx->param = xcalloc(1, ctx->paramlen);
Panu Matilainen 34fad6
-/*@-type@*/ /* FIX: cast? */
Panu Matilainen 34fad6
-	ctx->Reset = (void *) sha384Reset;
Panu Matilainen 34fad6
-	ctx->Update = (void *) sha384Update;
Panu Matilainen 34fad6
-	ctx->Digest = (void *) sha384Digest;
Panu Matilainen 34fad6
-/*@=type@*/
Panu Matilainen 34fad6
+	return HASH_AlgSHA384;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     case PGPHASHALGO_SHA512:
Panu Matilainen 34fad6
-	ctx->digestlen = 64;
Panu Matilainen 34fad6
-	ctx->datalen = 128;
Panu Matilainen 34fad6
-/*@-sizeoftype@*/ /* FIX: union, not void pointer */
Panu Matilainen 34fad6
-	ctx->paramlen = sizeof(sha512Param);
Panu Matilainen 34fad6
-/*@=sizeoftype@*/
Panu Matilainen 34fad6
-	ctx->param = xcalloc(1, ctx->paramlen);
Panu Matilainen 34fad6
-/*@-type@*/ /* FIX: cast? */
Panu Matilainen 34fad6
-	ctx->Reset = (void *) sha512Reset;
Panu Matilainen 34fad6
-	ctx->Update = (void *) sha512Update;
Panu Matilainen 34fad6
-	ctx->Digest = (void *) sha512Digest;
Panu Matilainen 34fad6
-/*@=type@*/
Panu Matilainen 34fad6
+	return HASH_AlgSHA512;
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
     case PGPHASHALGO_RIPEMD160:
Panu Matilainen 34fad6
     case PGPHASHALGO_MD2:
Panu Matilainen 34fad6
     case PGPHASHALGO_TIGER192:
Panu Matilainen 34fad6
     case PGPHASHALGO_HAVAL_5_160:
Panu Matilainen 34fad6
     default:
Panu Matilainen 34fad6
+	return HASH_AlgNULL;
Panu Matilainen 34fad6
+	/*@notreached@*/ break;
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+size_t
Panu Matilainen 34fad6
+rpmDigestLength(pgpHashAlgo hashalgo)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    return HASH_ResultLen(getHashType(hashalgo));
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+DIGEST_CTX
Panu Matilainen 34fad6
+rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    HASH_HashType type;
Panu Matilainen 34fad6
+    DIGEST_CTX ctx = xcalloc(1, sizeof(*ctx));
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    if (NSS_NoDB_Init(NULL) != SECSuccess)
Panu Matilainen 34fad6
+	return NULL;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    ctx->flags = flags;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    type = getHashType(hashalgo);
Panu Matilainen 34fad6
+    if (type == HASH_AlgNULL) {
Panu Matilainen 34fad6
 	free(ctx);
Panu Matilainen 34fad6
 	return NULL;
Panu Matilainen 34fad6
-	/*@notreached@*/ break;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-/*@-boundsread@*/
Panu Matilainen 34fad6
-    xx = (*ctx->Reset) (ctx->param);
Panu Matilainen 34fad6
-/*@=boundsread@*/
Panu Matilainen 34fad6
+    ctx->hashctx = HASH_Create(type);
Panu Matilainen 34fad6
+    if (ctx->hashctx == NULL) {
Panu Matilainen 34fad6
+    	free(ctx);
Panu Matilainen 34fad6
+    	return NULL;
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-DPRINTF((stderr, "*** Init(%x) ctx %p param %p\n", flags, ctx, ctx->param));
Panu Matilainen 34fad6
+    HASH_Begin(ctx->hashctx);
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
+DPRINTF((stderr, "*** Init(%x) ctx %p hashctx %p\n", flags, ctx, ctx->hashctx));
Panu Matilainen 34fad6
     return ctx;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-/*@-mustmod@*/ /* LCL: ctx->param may be modified, but ctx is abstract @*/
Panu Matilainen 34fad6
+/*@-mustmod@*/ /* LCL: ctx->hashctx may be modified, but ctx is abstract @*/
Panu Matilainen 34fad6
 int
Panu Matilainen 34fad6
 rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
+    unsigned int partlen;
Panu Matilainen 34fad6
+    const unsigned char *ptr = data;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     if (ctx == NULL)
Panu Matilainen 34fad6
 	return -1;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-DPRINTF((stderr, "*** Update(%p,%p,%d) param %p \"%s\"\n", ctx, data, len, ctx->param, ((char *)data)));
Panu Matilainen 34fad6
+DPRINTF((stderr, "*** Update(%p,%p,%d) hashctx %p \"%s\"\n", ctx, data, len, ctx->hashctx, ((char *)data)));
Panu Matilainen 34fad6
 /*@-boundsread@*/
Panu Matilainen 34fad6
-    return (*ctx->Update) (ctx->param, data, len);
Panu Matilainen 34fad6
+   partlen = ~(unsigned int)0xFF;
Panu Matilainen 34fad6
+   while (len > 0) {
Panu Matilainen 34fad6
+   	if (len < partlen) {
Panu Matilainen 34fad6
+   		partlen = (unsigned int)len;
Panu Matilainen 34fad6
+   	}
Panu Matilainen 34fad6
+	HASH_Update(ctx->hashctx, ptr, partlen);
Panu Matilainen 34fad6
+	ptr += partlen;
Panu Matilainen 34fad6
+	len -= partlen;
Panu Matilainen 34fad6
+   }
Panu Matilainen 34fad6
+   return 0;
Panu Matilainen 34fad6
 /*@=boundsread@*/
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 /*@=mustmod@*/
Panu Matilainen 34fad6
@@ -154,35 +131,37 @@ int
Panu Matilainen 34fad6
 int
Panu Matilainen 34fad6
 rpmDigestFinal(DIGEST_CTX ctx, void ** datap, size_t *lenp, int asAscii)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
-    byte * digest;
Panu Matilainen 34fad6
+    unsigned char * digest;
Panu Matilainen 34fad6
     char * t;
Panu Matilainen 34fad6
     int i;
Panu Matilainen 34fad6
+    unsigned int digestlen;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     if (ctx == NULL)
Panu Matilainen 34fad6
 	return -1;
Panu Matilainen 34fad6
-    digest = xmalloc(ctx->digestlen);
Panu Matilainen 34fad6
+    digestlen = HASH_ResultLenContext(ctx->hashctx);
Panu Matilainen 34fad6
+    digest = xmalloc(digestlen);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-DPRINTF((stderr, "*** Final(%p,%p,%p,%d) param %p digest %p\n", ctx, datap, lenp, asAscii, ctx->param, digest));
Panu Matilainen 34fad6
-/*@-noeffectuncon@*/ /* FIX: check rc */
Panu Matilainen 34fad6
-    (void) (*ctx->Digest) (ctx->param, digest);
Panu Matilainen 34fad6
+DPRINTF((stderr, "*** Final(%p,%p,%p,%d) hashctx %p digest %p\n", ctx, datap, lenp, asAscii, ctx->hashctx, digest));
Panu Matilainen 34fad6
+/*@-noeffectuncon@*/
Panu Matilainen 34fad6
+    HASH_End(ctx->hashctx, digest, &digestlen, digestlen);
Panu Matilainen 34fad6
 /*@=noeffectuncon@*/
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     /* Return final digest. */
Panu Matilainen 34fad6
 /*@-branchstate@*/
Panu Matilainen 34fad6
     if (!asAscii) {
Panu Matilainen 34fad6
-	if (lenp) *lenp = ctx->digestlen;
Panu Matilainen 34fad6
+	if (lenp) *lenp = digestlen;
Panu Matilainen 34fad6
 	if (datap) {
Panu Matilainen 34fad6
 	    *datap = digest;
Panu Matilainen 34fad6
 	    digest = NULL;
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
     } else {
Panu Matilainen 34fad6
-	if (lenp) *lenp = (2*ctx->digestlen) + 1;
Panu Matilainen 34fad6
+	if (lenp) *lenp = (2*digestlen) + 1;
Panu Matilainen 34fad6
 	if (datap) {
Panu Matilainen 34fad6
 	    const byte * s = (const byte *) digest;
Panu Matilainen 34fad6
 	    static const char hex[] = "0123456789abcdef";
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-	    *datap = t = xmalloc((2*ctx->digestlen) + 1);
Panu Matilainen 34fad6
-	    for (i = 0 ; i < ctx->digestlen; i++) {
Panu Matilainen 34fad6
+	    *datap = t = xmalloc((2*digestlen) + 1);
Panu Matilainen 34fad6
+	    for (i = 0 ; i < digestlen; i++) {
Panu Matilainen 34fad6
 		*t++ = hex[ (unsigned)((*s >> 4) & 0x0f) ];
Panu Matilainen 34fad6
 		*t++ = hex[ (unsigned)((*s++   ) & 0x0f) ];
Panu Matilainen 34fad6
 	    }
Panu Matilainen 34fad6
@@ -191,11 +170,10 @@ DPRINTF((stderr, "*** Final(%p,%p,%p,%d)
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 /*@=branchstate@*/
Panu Matilainen 34fad6
     if (digest) {
Panu Matilainen 34fad6
-	memset(digest, 0, ctx->digestlen);	/* In case it's sensitive */
Panu Matilainen 34fad6
+	memset(digest, 0, digestlen);	/* In case it's sensitive */
Panu Matilainen 34fad6
 	free(digest);
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
-    memset(ctx->param, 0, ctx->paramlen);	/* In case it's sensitive */
Panu Matilainen 34fad6
-    free(ctx->param);
Panu Matilainen 34fad6
+    HASH_Destroy(ctx->hashctx);
Panu Matilainen 34fad6
     memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
Panu Matilainen 34fad6
     free(ctx);
Panu Matilainen 34fad6
     return 0;
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/rpmio_internal.h
Panu Matilainen 34fad6
--- a/rpmio/rpmio_internal.h	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/rpmio_internal.h	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -9,30 +9,14 @@
Panu Matilainen 34fad6
 #include <rpmio.h>
Panu Matilainen 34fad6
 #include <rpmurl.h>
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
-#include <api.h>
Panu Matilainen 34fad6
-#else
Panu Matilainen 34fad6
-#include <beecrypt.api.h>
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
 #include <rpmpgp.h>
Panu Matilainen 34fad6
 #include <rpmsw.h>
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-/* Drag in the beecrypt includes. */
Panu Matilainen 34fad6
-#include <beecrypt.h>
Panu Matilainen 34fad6
 #include <base64.h>
Panu Matilainen 34fad6
-#include <dsa.h>
Panu Matilainen 34fad6
-#include <endianness.h>
Panu Matilainen 34fad6
-#include <md5.h>
Panu Matilainen 34fad6
-#include <mp.h>
Panu Matilainen 34fad6
-#include <rsa.h>
Panu Matilainen 34fad6
-#include <rsapk.h>
Panu Matilainen 34fad6
-#include <sha1.h>
Panu Matilainen 34fad6
-#if HAVE_BEECRYPT_API_H
Panu Matilainen 34fad6
-#include <sha256.h>
Panu Matilainen 34fad6
-#include <sha384.h>
Panu Matilainen 34fad6
-#include <sha512.h>
Panu Matilainen 34fad6
-#endif
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+#include "nss.h"
Panu Matilainen 34fad6
+#include "sechash.h"
Panu Matilainen 34fad6
+#include "keyhi.h"
Panu Matilainen 34fad6
+#include "cryptohi.h"
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /** \ingroup rpmio
Panu Matilainen 34fad6
  * Values parsed from OpenPGP signature/pubkey packet(s).
Panu Matilainen 34fad6
@@ -85,20 +69,13 @@ struct pgpDig_s {
Panu Matilainen 34fad6
     void * md5;			/*!< (rsa) V3 signature hash. */
Panu Matilainen 34fad6
     size_t md5len;		/*!< (rsa) V3 signature hash length. */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-    /* DSA parameters. */
Panu Matilainen 34fad6
-    mpbarrett p;
Panu Matilainen 34fad6
-    mpbarrett q;
Panu Matilainen 34fad6
-    mpnumber g;
Panu Matilainen 34fad6
-    mpnumber y;
Panu Matilainen 34fad6
-    mpnumber hm;
Panu Matilainen 34fad6
-    mpnumber r;
Panu Matilainen 34fad6
-    mpnumber s;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    /* RSA parameters. */
Panu Matilainen 34fad6
-    rsapk rsa_pk;
Panu Matilainen 34fad6
-    mpnumber m;
Panu Matilainen 34fad6
-    mpnumber c;
Panu Matilainen 34fad6
-    mpnumber rsahm;
Panu Matilainen 34fad6
+    /* DSA parameters */
Panu Matilainen 34fad6
+    SECKEYPublicKey *dsa;
Panu Matilainen 34fad6
+    SECItem *dsasig;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    /* RSA parameters */
Panu Matilainen 34fad6
+    SECKEYPublicKey *rsa;
Panu Matilainen 34fad6
+    SECItem *rsasig;
Panu Matilainen 34fad6
 };
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /** \ingroup rpmio
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/rpmpgp.c
Panu Matilainen 34fad6
--- a/rpmio/rpmpgp.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/rpmpgp.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -260,38 +260,100 @@ const char * pgpMpiHex(const byte *p)
Panu Matilainen 34fad6
 /**
Panu Matilainen 34fad6
  * @return		0 on success
Panu Matilainen 34fad6
  */
Panu Matilainen 34fad6
-static int pgpHexSet(const char * pre, int lbits,
Panu Matilainen 34fad6
-		/*@out@*/ mpnumber * mpn, const byte * p, const byte * pend)
Panu Matilainen 34fad6
+static int pgpMpiSet(const char * pre, int lbits,
Panu Matilainen 34fad6
+		/*@out@*/ void *dest, const byte * p, const byte * pend)
Panu Matilainen 34fad6
 	/*@globals fileSystem @*/
Panu Matilainen 34fad6
-	/*@modifies mpn, fileSystem @*/
Panu Matilainen 34fad6
+	/*@modifies dest, fileSystem @*/
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     unsigned int mbits = pgpMpiBits(p);
Panu Matilainen 34fad6
     unsigned int nbits;
Panu Matilainen 34fad6
     unsigned int nbytes;
Panu Matilainen 34fad6
-    char * t;
Panu Matilainen 34fad6
+    char *t = dest;
Panu Matilainen 34fad6
     unsigned int ix;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     if ((p + ((mbits+7) >> 3)) > pend)
Panu Matilainen 34fad6
 	return 1;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
+    if (mbits > lbits)
Panu Matilainen 34fad6
+	return 1;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     nbits = (lbits > mbits ? lbits : mbits);
Panu Matilainen 34fad6
     nbytes = ((nbits + 7) >> 3);
Panu Matilainen 34fad6
-    t = xmalloc(2*nbytes+1);
Panu Matilainen 34fad6
-    ix = 2 * ((nbits - mbits) >> 3);
Panu Matilainen 34fad6
+    ix = (nbits - mbits) >> 3;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 if (_debug)
Panu Matilainen 34fad6
-fprintf(stderr, "*** mbits %u nbits %u nbytes %u t %p[%d] ix %u\n", mbits, nbits, nbytes, t, (2*nbytes+1), ix);
Panu Matilainen 34fad6
-    if (ix > 0) memset(t, (int)'0', ix);
Panu Matilainen 34fad6
-    strcpy(t+ix, pgpMpiHex(p));
Panu Matilainen 34fad6
+fprintf(stderr, "*** mbits %u nbits %u nbytes %u ix %u\n", mbits, nbits, nbytes, ix);
Panu Matilainen 34fad6
+    if (ix > 0) memset(t, '\0', ix);
Panu Matilainen 34fad6
+    memcpy(t+ix, p+2, nbytes-ix);
Panu Matilainen 34fad6
 if (_debug)
Panu Matilainen 34fad6
-fprintf(stderr, "*** %s %s\n", pre, t);
Panu Matilainen 34fad6
-    (void) mpnsethex(mpn, t);
Panu Matilainen 34fad6
-    t = _free(t);
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, mpn->size, mpn->data);
Panu Matilainen 34fad6
+fprintf(stderr, "*** %s %s\n", pre, pgpHexStr(dest, nbytes));
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     return 0;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+/**
Panu Matilainen 34fad6
+ * @return		NULL on error
Panu Matilainen 34fad6
+ */
Panu Matilainen 34fad6
+static SECItem *pgpMpiItem(PRArenaPool *arena, /*@out@*/ SECItem *item, const byte *p)
Panu Matilainen 34fad6
+	/*@globals fileSystem @*/
Panu Matilainen 34fad6
+	/*@modifies dest, fileSystem @*/
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    unsigned int nbytes = pgpMpiLen(p)-2;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    if (item == NULL) {
Panu Matilainen 34fad6
+    	if ((item=SECITEM_AllocItem(arena, item, nbytes)) == NULL)
Panu Matilainen 34fad6
+    	    return item;
Panu Matilainen 34fad6
+    } else {
Panu Matilainen 34fad6
+    	if (arena != NULL)
Panu Matilainen 34fad6
+    	    item->data = PORT_ArenaGrow(arena, item->data, item->len, nbytes);
Panu Matilainen 34fad6
+    	else
Panu Matilainen 34fad6
+    	    item->data = PORT_Realloc(item->data, nbytes);
Panu Matilainen 34fad6
+    	
Panu Matilainen 34fad6
+    	if (item->data == NULL) {
Panu Matilainen 34fad6
+    	    if (arena == NULL)
Panu Matilainen 34fad6
+    		SECITEM_FreeItem(item, PR_TRUE);
Panu Matilainen 34fad6
+    	    return NULL;
Panu Matilainen 34fad6
+    	}
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    memcpy(item->data, p+2, nbytes);
Panu Matilainen 34fad6
+    item->len = nbytes;
Panu Matilainen 34fad6
+    return item;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
 /*@=boundswrite@*/
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static SECKEYPublicKey *pgpNewPublicKey(KeyType type)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    PRArenaPool *arena;
Panu Matilainen 34fad6
+    SECKEYPublicKey *key;
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
+    arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
Panu Matilainen 34fad6
+    if (arena == NULL)
Panu Matilainen 34fad6
+	return NULL;
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
+    key = PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey));
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
+    if (key == NULL) {
Panu Matilainen 34fad6
+	PORT_FreeArena(arena, PR_FALSE);
Panu Matilainen 34fad6
+	return NULL;
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
+    key->keyType = type;
Panu Matilainen 34fad6
+    key->pkcs11ID = CK_INVALID_HANDLE;
Panu Matilainen 34fad6
+    key->pkcs11Slot = NULL;
Panu Matilainen 34fad6
+    key->arena = arena;
Panu Matilainen 34fad6
+    return key;
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static SECKEYPublicKey *pgpNewRSAKey(void)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    return pgpNewPublicKey(rsaKey);
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+static SECKEYPublicKey *pgpNewDSAKey(void)
Panu Matilainen 34fad6
+{
Panu Matilainen 34fad6
+    return pgpNewPublicKey(dsaKey);
Panu Matilainen 34fad6
+}
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 int pgpPrtSubType(const byte *h, unsigned int hlen, pgpSigType sigtype)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
@@ -407,6 +469,10 @@ static const char * pgpSigDSA[] = {
Panu Matilainen 34fad6
 };
Panu Matilainen 34fad6
 /*@=varuse =readonlytrans @*/
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
+#ifndef DSA_SUBPRIME_LEN
Panu Matilainen 34fad6
+#define DSA_SUBPRIME_LEN 20
Panu Matilainen 34fad6
+#endif
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
 static int pgpPrtSigParams(/*@unused@*/ pgpTag tag, byte pubkey_algo, byte sigtype,
Panu Matilainen 34fad6
 		const byte *p, const byte *h, unsigned int hlen)
Panu Matilainen 34fad6
 	/*@globals fileSystem @*/
Panu Matilainen 34fad6
@@ -414,7 +480,13 @@ static int pgpPrtSigParams(/*@unused@*/ 
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     const byte * pend = h + hlen;
Panu Matilainen 34fad6
     int i;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
+    SECItem dsaraw;
Panu Matilainen 34fad6
+    unsigned char dsabuf[2*DSA_SUBPRIME_LEN];
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    dsaraw.type = 0;
Panu Matilainen 34fad6
+    dsaraw.data = dsabuf;
Panu Matilainen 34fad6
+    dsaraw.len = sizeof(dsabuf);
Panu Matilainen 34fad6
+    
Panu Matilainen 34fad6
     for (i = 0; p < pend; i++, p += pgpMpiLen(p)) {
Panu Matilainen 34fad6
 	if (pubkey_algo == PGPPUBKEYALGO_RSA) {
Panu Matilainen 34fad6
 	    if (i >= 1) break;
Panu Matilainen 34fad6
@@ -423,9 +495,9 @@ static int pgpPrtSigParams(/*@unused@*/ 
Panu Matilainen 34fad6
 	    {
Panu Matilainen 34fad6
 		switch (i) {
Panu Matilainen 34fad6
 		case 0:		/* m**d */
Panu Matilainen 34fad6
-		    (void) mpnsethex(&_dig->c, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t  m**d = "),  mpfprintln(stderr, _dig->c.size, _dig->c.data);
Panu Matilainen 34fad6
+		    _dig->rsasig = pgpMpiItem(NULL, _dig->rsasig, p);
Panu Matilainen 34fad6
+		    if (_dig->rsasig == NULL)
Panu Matilainen 34fad6
+			return 1;
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		default:
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
@@ -440,11 +512,21 @@ fprintf(stderr, "\t  m**d = "),  mpfprin
Panu Matilainen 34fad6
 		int xx;
Panu Matilainen 34fad6
 		xx = 0;
Panu Matilainen 34fad6
 		switch (i) {
Panu Matilainen 34fad6
-		case 0:		/* r */
Panu Matilainen 34fad6
-		    xx = pgpHexSet(pgpSigDSA[i], 160, &_dig->r, p, pend);
Panu Matilainen 34fad6
+		case 0:
Panu Matilainen 34fad6
+		    memset(dsaraw.data, '\0', 2*DSA_SUBPRIME_LEN);
Panu Matilainen 34fad6
+				/* r */
Panu Matilainen 34fad6
+		    xx = pgpMpiSet(pgpSigDSA[i], DSA_SUBPRIME_LEN*8, dsaraw.data, p, pend);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		case 1:		/* s */
Panu Matilainen 34fad6
-		    xx = pgpHexSet(pgpSigDSA[i], 160, &_dig->s, p, pend);
Panu Matilainen 34fad6
+		    xx = pgpMpiSet(pgpSigDSA[i], DSA_SUBPRIME_LEN*8, dsaraw.data + DSA_SUBPRIME_LEN, p, pend);
Panu Matilainen 34fad6
+		    if (_dig->dsasig != NULL)
Panu Matilainen 34fad6
+		    	SECITEM_FreeItem(_dig->dsasig, PR_FALSE);
Panu Matilainen 34fad6
+		    else if ((_dig->dsasig=SECITEM_AllocItem(NULL, NULL, 0)) == NULL) {
Panu Matilainen 34fad6
+		        xx = 1;
Panu Matilainen 34fad6
+		        /*@switchbreak@*/ break;
Panu Matilainen 34fad6
+		    }
Panu Matilainen 34fad6
+		    if (DSAU_EncodeDerSig(_dig->dsasig, &dsaraw) != SECSuccess)
Panu Matilainen 34fad6
+		    	xx = 1;
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		default:
Panu Matilainen 34fad6
 		    xx = 1;
Panu Matilainen 34fad6
@@ -629,16 +711,17 @@ static const byte * pgpPrtPubkeyParams(b
Panu Matilainen 34fad6
 	if (pubkey_algo == PGPPUBKEYALGO_RSA) {
Panu Matilainen 34fad6
 	    if (i >= 2) break;
Panu Matilainen 34fad6
 	    if (_dig) {
Panu Matilainen 34fad6
+		if (_dig->rsa == NULL) {
Panu Matilainen 34fad6
+		    _dig->rsa = pgpNewRSAKey();
Panu Matilainen 34fad6
+		    if (_dig->rsa == NULL)
Panu Matilainen 34fad6
+			break; /* error abort? */
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
 		switch (i) {
Panu Matilainen 34fad6
 		case 0:		/* n */
Panu Matilainen 34fad6
-		    (void) mpbsethex(&_dig->rsa_pk.n, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     n = "),  mpfprintln(stderr, _dig->rsa_pk.n.size, _dig->rsa_pk.n.modl);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->rsa->arena, &_dig->rsa->u.rsa.modulus, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		case 1:		/* e */
Panu Matilainen 34fad6
-		    (void) mpnsethex(&_dig->rsa_pk.e, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     e = "),  mpfprintln(stderr, _dig->rsa_pk.e.size, _dig->rsa_pk.e.data);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->rsa->arena, &_dig->rsa->u.rsa.publicExponent, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		default:
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
@@ -648,26 +731,23 @@ fprintf(stderr, "\t     e = "),  mpfprin
Panu Matilainen 34fad6
 	} else if (pubkey_algo == PGPPUBKEYALGO_DSA) {
Panu Matilainen 34fad6
 	    if (i >= 4) break;
Panu Matilainen 34fad6
 	    if (_dig) {
Panu Matilainen 34fad6
+		if (_dig->dsa == NULL) {
Panu Matilainen 34fad6
+		    _dig->dsa = pgpNewDSAKey();
Panu Matilainen 34fad6
+		    if (_dig->dsa == NULL)
Panu Matilainen 34fad6
+			break; /* error abort? */
Panu Matilainen 34fad6
+		}
Panu Matilainen 34fad6
 		switch (i) {
Panu Matilainen 34fad6
 		case 0:		/* p */
Panu Matilainen 34fad6
-		    (void) mpbsethex(&_dig->p, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     p = "),  mpfprintln(stderr, _dig->p.size, _dig->p.modl);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->dsa->arena, &_dig->dsa->u.dsa.params.prime, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		case 1:		/* q */
Panu Matilainen 34fad6
-		    (void) mpbsethex(&_dig->q, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     q = "),  mpfprintln(stderr, _dig->q.size, _dig->q.modl);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->dsa->arena, &_dig->dsa->u.dsa.params.subPrime, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		case 2:		/* g */
Panu Matilainen 34fad6
-		    (void) mpnsethex(&_dig->g, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     g = "),  mpfprintln(stderr, _dig->g.size, _dig->g.data);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->dsa->arena, &_dig->dsa->u.dsa.params.base, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		case 3:		/* y */
Panu Matilainen 34fad6
-		    (void) mpnsethex(&_dig->y, pgpMpiHex(p));
Panu Matilainen 34fad6
-if (_debug && _print)
Panu Matilainen 34fad6
-fprintf(stderr, "\t     y = "),  mpfprintln(stderr, _dig->y.size, _dig->y.data);
Panu Matilainen 34fad6
+		    pgpMpiItem(_dig->dsa->arena, &_dig->dsa->u.dsa.publicValue, p);
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
 		default:
Panu Matilainen 34fad6
 		    /*@switchbreak@*/ break;
Panu Matilainen 34fad6
@@ -1014,6 +1094,8 @@ pgpDig pgpNewDig(void)
Panu Matilainen 34fad6
 pgpDig pgpNewDig(void)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     pgpDig dig = xcalloc(1, sizeof(*dig));
Panu Matilainen 34fad6
+    NSS_NoDB_Init(NULL);
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     return dig;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
@@ -1038,14 +1120,27 @@ void pgpCleanDig(pgpDig dig)
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	dig->md5 = _free(dig->md5);
Panu Matilainen 34fad6
 	dig->sha1 = _free(dig->sha1);
Panu Matilainen 34fad6
-	mpnfree(&dig->hm);
Panu Matilainen 34fad6
-	mpnfree(&dig->r);
Panu Matilainen 34fad6
-	mpnfree(&dig->s);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-	(void) rsapkFree(&dig->rsa_pk);
Panu Matilainen 34fad6
-	mpnfree(&dig->m);
Panu Matilainen 34fad6
-	mpnfree(&dig->c);
Panu Matilainen 34fad6
-	mpnfree(&dig->rsahm);
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (dig->dsa != NULL) {
Panu Matilainen 34fad6
+	    SECKEY_DestroyPublicKey(dig->dsa);
Panu Matilainen 34fad6
+	    dig->dsa = NULL;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (dig->dsasig != NULL) {
Panu Matilainen 34fad6
+	    SECITEM_ZfreeItem(dig->dsasig, PR_TRUE);
Panu Matilainen 34fad6
+	    dig->dsasig = NULL;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (dig->rsa != NULL) {
Panu Matilainen 34fad6
+	    SECKEY_DestroyPublicKey(dig->rsa);
Panu Matilainen 34fad6
+	    dig->rsa = NULL;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+	if (dig->rsasig != NULL) {
Panu Matilainen 34fad6
+	    SECITEM_ZfreeItem(dig->rsasig, PR_TRUE);
Panu Matilainen 34fad6
+	    dig->rsasig = NULL;
Panu Matilainen 34fad6
+	}
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 /*@-nullstate@*/
Panu Matilainen 34fad6
     return;
Panu Matilainen 34fad6
@@ -1072,14 +1167,6 @@ pgpDig pgpFreeDig(/*@only@*/ /*@null@*/ 
Panu Matilainen 34fad6
 	    (void) rpmDigestFinal(dig->sha1ctx, NULL, NULL, 0);
Panu Matilainen 34fad6
 	/*@=branchstate@*/
Panu Matilainen 34fad6
 	dig->sha1ctx = NULL;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-	mpbfree(&dig->p);
Panu Matilainen 34fad6
-	mpbfree(&dig->q);
Panu Matilainen 34fad6
-	mpnfree(&dig->g);
Panu Matilainen 34fad6
-	mpnfree(&dig->y);
Panu Matilainen 34fad6
-	mpnfree(&dig->hm);
Panu Matilainen 34fad6
-	mpnfree(&dig->r);
Panu Matilainen 34fad6
-	mpnfree(&dig->s);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 #ifdef	NOTYET
Panu Matilainen 34fad6
 	/*@-branchstate@*/
Panu Matilainen 34fad6
@@ -1094,12 +1181,6 @@ pgpDig pgpFreeDig(/*@only@*/ /*@null@*/ 
Panu Matilainen 34fad6
 	    (void) rpmDigestFinal(dig->md5ctx, NULL, NULL, 0);
Panu Matilainen 34fad6
 	/*@=branchstate@*/
Panu Matilainen 34fad6
 	dig->md5ctx = NULL;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-	mpbfree(&dig->rsa_pk.n);
Panu Matilainen 34fad6
-	mpnfree(&dig->rsa_pk.e);
Panu Matilainen 34fad6
-	mpnfree(&dig->m);
Panu Matilainen 34fad6
-	mpnfree(&dig->c);
Panu Matilainen 34fad6
-	mpnfree(&dig->hm);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	dig = _free(dig);
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
@@ -1286,20 +1367,13 @@ char * pgpArmorWrap(int atype, const uns
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     const char * enc;
Panu Matilainen 34fad6
     char * t;
Panu Matilainen 34fad6
-    size_t nt;
Panu Matilainen 34fad6
+    size_t nt = 0;
Panu Matilainen 34fad6
     char * val;
Panu Matilainen 34fad6
-    int lc;
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    nt = ((ns + 2) / 3) * 4;
Panu Matilainen 34fad6
-    /*@-globs@*/
Panu Matilainen 34fad6
-    /* Add additional bytes necessary for eol string(s). */
Panu Matilainen 34fad6
-    if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
Panu Matilainen 34fad6
-	lc = (nt + b64encode_chars_per_line - 1) / b64encode_chars_per_line;
Panu Matilainen 34fad6
-       if (((nt + b64encode_chars_per_line - 1) % b64encode_chars_per_line) != 0)
Panu Matilainen 34fad6
-        ++lc;
Panu Matilainen 34fad6
-	nt += lc * strlen(b64encode_eolstr);
Panu Matilainen 34fad6
-    }
Panu Matilainen 34fad6
-    /*@=globs@*/
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    enc = b64encode(s, ns, -1);
Panu Matilainen 34fad6
+    if (enc != NULL) {
Panu Matilainen 34fad6
+    	nt = strlen(enc);
Panu Matilainen 34fad6
+    }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     nt += 512;	/* XXX slop for armor and crc */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
@@ -1311,9 +1385,9 @@ char * pgpArmorWrap(int atype, const uns
Panu Matilainen 34fad6
     /*@-globs@*/
Panu Matilainen 34fad6
     t = stpcpy( stpcpy(t, "-----\nVersion: rpm-"), VERSION);
Panu Matilainen 34fad6
     /*@=globs@*/
Panu Matilainen 34fad6
-    t = stpcpy(t, " (beecrypt-4.1.2)\n\n");
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    if ((enc = b64encode(s, ns)) != NULL) {
Panu Matilainen 34fad6
+    t = stpcpy(t, " (NSS-3)\n\n");
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+    if (enc != NULL) {
Panu Matilainen 34fad6
 	t = stpcpy(t, enc);
Panu Matilainen 34fad6
 	enc = _free(enc);
Panu Matilainen 34fad6
 	if ((enc = b64crc(s, ns)) != NULL) {
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/rpmpgp.h
Panu Matilainen 34fad6
--- a/rpmio/rpmpgp.h	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/rpmpgp.h	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -12,11 +12,7 @@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 #include <string.h>
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-#if !defined(_BEECRYPT_API_H)
Panu Matilainen 34fad6
-/*@-redef@*/
Panu Matilainen 34fad6
 typedef unsigned char byte;
Panu Matilainen 34fad6
-/*@=redef@*/
Panu Matilainen 34fad6
-#endif	/* _BEECRYPT_API_H */
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /**
Panu Matilainen 34fad6
  */
Panu Matilainen 34fad6
@@ -1393,6 +1389,15 @@ DIGEST_CTX rpmDigestDup(DIGEST_CTX octx)
Panu Matilainen 34fad6
 	/*@*/;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /** \ingroup rpmio
Panu Matilainen 34fad6
+ * Obtain digest length in bytes.
Panu Matilainen 34fad6
+ * @param hashalgo	type of digest
Panu Matilainen 34fad6
+ * @return		digest length
Panu Matilainen 34fad6
+ */
Panu Matilainen 34fad6
+/*@only@*/ /*@null@*/
Panu Matilainen 34fad6
+size_t rpmDigestLength(pgpHashAlgo hashalgo)
Panu Matilainen 34fad6
+	/*@*/;
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
+/** \ingroup rpmio
Panu Matilainen 34fad6
  * Initialize digest.
Panu Matilainen 34fad6
  * Set bit count to 0 and buffer to mysterious initialization constants.
Panu Matilainen 34fad6
  * @param hashalgo	type of digest
Panu Matilainen 34fad6
diff -r ec9e6c427068 rpmio/tkey.c
Panu Matilainen 34fad6
--- a/rpmio/tkey.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/rpmio/tkey.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -31,7 +31,7 @@ fprintf(stderr, "*** sig is\n%s\n", sig)
Panu Matilainen 34fad6
 	return rc;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-    if ((enc = b64encode(dec, declen)) == NULL) {
Panu Matilainen 34fad6
+    if ((enc = b64encode(dec, declen, -1)) == NULL) {
Panu Matilainen 34fad6
 	fprintf(stderr, "*** b64encode failed\n");
Panu Matilainen 34fad6
 	return rc;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
@@ -51,52 +51,40 @@ fprintf(stderr, "??? %5d %02x != %02x '%
Panu Matilainen 34fad6
     return rc;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-/* FIPS-186 test vectors. */
Panu Matilainen 34fad6
-static const char * fips_p = "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac49693dfbf83724c2ec0736ee31c80291";
Panu Matilainen 34fad6
-static const char * fips_q = "c773218c737ec8ee993b4f2ded30f48edace915f";
Panu Matilainen 34fad6
-static const char * fips_g = "626d027839ea0a13413163a55b4cb500299d5522956cefcb3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9cc42e9f6f464b088cc572af53e6d78802";
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-static const char * fips_hm = "a9993e364706816aba3e25717850c26c9cd0d89d";
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-static const char * fips_y = "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a859bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74858fba33f44c06699630a76b030ee333";
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-static const char * fips_r = "8bac1ab66410435cb7181f95b16ab97c92b341c0";
Panu Matilainen 34fad6
-static const char * fips_s = "41e2345f1f56df2458f426d155b4ba2db6dcd8c8";
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
 /* Secret key */
Panu Matilainen 34fad6
-static const char * jbjSecretDSA = "
Panu Matilainen 34fad6
-lQFvBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
Panu Matilainen 34fad6
-zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
Panu Matilainen 34fad6
-AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
Panu Matilainen 34fad6
-qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
Panu Matilainen 34fad6
-Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
Panu Matilainen 34fad6
-2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
Panu Matilainen 34fad6
-1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL/8DAwJUAllw1pdZ
Panu Matilainen 34fad6
-WmBIoAvRiv7kE6hWfeCvZzdBVgrHYrp8ceUa3OdulGfYw/0sIzpEU0FfZmFjdG9y
Panu Matilainen 34fad6
-OgAA30gJ4JMFKVfthnDCHHL+O8lNxykKBmrgVPLClue0KUplZmYgSm9obnNvbiAo
Panu Matilainen 34fad6
-QVJTIE4zTlBRKSA8amJqQHJlZGhhdC5jb20+iFcEExECABcFAju6XHwFCwcKAwQD
Panu Matilainen 34fad6
-FQMCAxYCAQIXgAAKCRCB0qVW2I6DmQU6AJ490bVWZuM4yCOh8MWj6qApCr1/gwCf
Panu Matilainen 34fad6
-f3+QgXFXAeTyPtMmReyWxThABtE=
Panu Matilainen 34fad6
+static const char * jbjSecretDSA = "\n\
Panu Matilainen 34fad6
+lQFvBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR\n\
Panu Matilainen 34fad6
+zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy\n\
Panu Matilainen 34fad6
+AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm\n\
Panu Matilainen 34fad6
+qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv\n\
Panu Matilainen 34fad6
+Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT\n\
Panu Matilainen 34fad6
+2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh\n\
Panu Matilainen 34fad6
+1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL/8DAwJUAllw1pdZ\n\
Panu Matilainen 34fad6
+WmBIoAvRiv7kE6hWfeCvZzdBVgrHYrp8ceUa3OdulGfYw/0sIzpEU0FfZmFjdG9y\n\
Panu Matilainen 34fad6
+OgAA30gJ4JMFKVfthnDCHHL+O8lNxykKBmrgVPLClue0KUplZmYgSm9obnNvbiAo\n\
Panu Matilainen 34fad6
+QVJTIE4zTlBRKSA8amJqQHJlZGhhdC5jb20+iFcEExECABcFAju6XHwFCwcKAwQD\n\
Panu Matilainen 34fad6
+FQMCAxYCAQIXgAAKCRCB0qVW2I6DmQU6AJ490bVWZuM4yCOh8MWj6qApCr1/gwCf\n\
Panu Matilainen 34fad6
+f3+QgXFXAeTyPtMmReyWxThABtE=\n\
Panu Matilainen 34fad6
 ";
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /* Public key */
Panu Matilainen 34fad6
-static const char * jbjPublicDSA = "
Panu Matilainen 34fad6
-mQFCBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
Panu Matilainen 34fad6
-zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
Panu Matilainen 34fad6
-AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
Panu Matilainen 34fad6
-qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
Panu Matilainen 34fad6
-Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
Panu Matilainen 34fad6
-2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
Panu Matilainen 34fad6
-1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL7QpSmVmZiBKb2hu
Panu Matilainen 34fad6
-c29uIChBUlMgTjNOUFEpIDxqYmpAcmVkaGF0LmNvbT6IVwQTEQIAFwUCO7pcfAUL
Panu Matilainen 34fad6
-BwoDBAMVAwIDFgIBAheAAAoJEIHSpVbYjoOZBToAn3TXaAI+bhg51EeyaiFip/6W
Panu Matilainen 34fad6
-OVwBAJ44rTtNsgZBQxXISjB64CWxl4VaWQ==
Panu Matilainen 34fad6
+static const char * jbjPublicDSA = "\n\
Panu Matilainen 34fad6
+mQFCBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR\n\
Panu Matilainen 34fad6
+zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy\n\
Panu Matilainen 34fad6
+AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm\n\
Panu Matilainen 34fad6
+qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv\n\
Panu Matilainen 34fad6
+Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT\n\
Panu Matilainen 34fad6
+2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh\n\
Panu Matilainen 34fad6
+1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL7QpSmVmZiBKb2hu\n\
Panu Matilainen 34fad6
+c29uIChBUlMgTjNOUFEpIDxqYmpAcmVkaGF0LmNvbT6IVwQTEQIAFwUCO7pcfAUL\n\
Panu Matilainen 34fad6
+BwoDBAMVAwIDFgIBAheAAAoJEIHSpVbYjoOZBToAn3TXaAI+bhg51EeyaiFip/6W\n\
Panu Matilainen 34fad6
+OVwBAJ44rTtNsgZBQxXISjB64CWxl4VaWQ==\n\
Panu Matilainen 34fad6
 ";
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 /* Signature */
Panu Matilainen 34fad6
-static const char * abcSignatureDSA = "
Panu Matilainen 34fad6
-iD8DBQA7vII+gdKlVtiOg5kRAvg4AJ0fV3gDBADobAnK2HOkV88bfmFMEgCeNysO
Panu Matilainen 34fad6
-nP3dWWJnp0Pnbor7pIob4Dk=
Panu Matilainen 34fad6
+static const char * abcSignatureDSA = "\n\
Panu Matilainen 34fad6
+iD8DBQA7vII+gdKlVtiOg5kRAvg4AJ0fV3gDBADobAnK2HOkV88bfmFMEgCeNysO\n\
Panu Matilainen 34fad6
+nP3dWWJnp0Pnbor7pIob4Dk=\n\
Panu Matilainen 34fad6
 ";
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 int
Panu Matilainen 34fad6
@@ -107,28 +95,6 @@ main (int argc, char *argv[])
Panu Matilainen 34fad6
     int rc;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     dig = pgpNewDig();
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    mpbzero(&dig->p);	mpbsethex(&dig->p, fips_p);
Panu Matilainen 34fad6
-    mpbzero(&dig->q);	mpbsethex(&dig->q, fips_q);
Panu Matilainen 34fad6
-    mpnzero(&dig->g);	mpnsethex(&dig->g, fips_g);
Panu Matilainen 34fad6
-    mpnzero(&dig->y);	mpnsethex(&dig->y, fips_y);
Panu Matilainen 34fad6
-    mpnzero(&dig->r);	mpnsethex(&dig->r, fips_r);
Panu Matilainen 34fad6
-    mpnzero(&dig->s);	mpnsethex(&dig->s, fips_s);
Panu Matilainen 34fad6
-    mpnzero(&dig->hm);	mpnsethex(&dig->hm, fips_hm);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
Panu Matilainen 34fad6
-		&dig->y, &dig->r, &dig->s);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-fprintf(stderr, "=============================== DSA FIPS-186-1: rc %d\n", rc);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    mpbfree(&dig->p);
Panu Matilainen 34fad6
-    mpbfree(&dig->q);
Panu Matilainen 34fad6
-    mpnfree(&dig->g);
Panu Matilainen 34fad6
-    mpnfree(&dig->y);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    mpnfree(&dig->hm);
Panu Matilainen 34fad6
-    mpnfree(&dig->r);
Panu Matilainen 34fad6
-    mpnfree(&dig->s);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 fprintf(stderr, "=============================== GPG Secret Key\n");
Panu Matilainen 34fad6
     if ((rc = doit(jbjSecretDSA, dig, printing)) != 0)
Panu Matilainen 34fad6
@@ -144,39 +110,33 @@ fprintf(stderr, "=======================
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     {	DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
Panu Matilainen 34fad6
 	struct pgpDigParams_s * dsig = &dig->signature;
Panu Matilainen 34fad6
-	const char * digest = NULL;
Panu Matilainen 34fad6
+	void *digest = NULL;
Panu Matilainen 34fad6
 	size_t digestlen = 0;
Panu Matilainen 34fad6
 	const char * txt = "abc";
Panu Matilainen 34fad6
+	SECItem digitem;
Panu Matilainen 34fad6
 	
Panu Matilainen 34fad6
 	rpmDigestUpdate(ctx, txt, strlen(txt));
Panu Matilainen 34fad6
 	rpmDigestUpdate(ctx, dsig->hash, dsig->hashlen);
Panu Matilainen 34fad6
-	rpmDigestFinal(ctx, (void **)&digest, &digestlen, 1);
Panu Matilainen 34fad6
+	rpmDigestFinal(ctx, &digest, &digestlen, 0);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-	mpnzero(&dig->hm); mpnsethex(&dig->hm, digest);
Panu Matilainen 34fad6
+fprintf(stderr, "\n    hm = [ 160]: %s\n\n", pgpHexStr(digest, digestlen));
Panu Matilainen 34fad6
+	digitem.type = siBuffer;
Panu Matilainen 34fad6
+	digitem.data = digest;
Panu Matilainen 34fad6
+	digitem.len = digestlen;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-fprintf(stderr, "\n    hm = [ 160]: %s\n\n", digest);
Panu Matilainen 34fad6
+	rc = VFY_VerifyDigest(&digitem, dig->dsa, dig->dsasig, SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST, NULL);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 	if (digest) {
Panu Matilainen 34fad6
-	    free((void *)digest);
Panu Matilainen 34fad6
+	    free(digest);
Panu Matilainen 34fad6
 	    digest = NULL;
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-    rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
Panu Matilainen 34fad6
-		&dig->y, &dig->r, &dig->s);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 fprintf(stderr, "=============================== DSA verify: rc %d\n", rc);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    mpbfree(&dig->p);
Panu Matilainen 34fad6
-    mpbfree(&dig->q);
Panu Matilainen 34fad6
-    mpnfree(&dig->g);
Panu Matilainen 34fad6
-    mpnfree(&dig->y);
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
-    mpnfree(&dig->hm);
Panu Matilainen 34fad6
-    mpnfree(&dig->r);
Panu Matilainen 34fad6
-    mpnfree(&dig->s);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     dig = pgpFreeDig(dig);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     return rc;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
diff -r ec9e6c427068 tools/Makefile.am
Panu Matilainen 34fad6
--- a/tools/Makefile.am	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/tools/Makefile.am	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -8,7 +8,7 @@ INCLUDES = -I. \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/lib \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmdb \
Panu Matilainen 34fad6
 	-I$(top_srcdir)/rpmio \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_INCLUDE@ \
Panu Matilainen 34fad6
+	@WITH_NSS_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_POPT_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_LIBELF_INCLUDE@ \
Panu Matilainen 34fad6
 	@WITH_LIBDWARF_INCLUDE@ \
Panu Matilainen 34fad6
@@ -36,10 +36,10 @@ convertdb1_SOURCES =	convertdb1.c
Panu Matilainen 34fad6
 convertdb1_SOURCES =	convertdb1.c
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 debugedit_SOURCES =	debugedit.c hashtab.c
Panu Matilainen 34fad6
-#debugedit_LDADD =	@LDFLAGS_STATIC@ \
Panu Matilainen 34fad6
-debugedit_LDADD =	\
Panu Matilainen 34fad6
+debugedit_CFLAGS = 	$(INCLUDES)
Panu Matilainen 34fad6
+#debugedit_LDFLAGS =	$(staticLDFLAGS)
Panu Matilainen 34fad6
+debugedit_LDADD =	$(top_builddir)/rpmio/librpmio.la \
Panu Matilainen 34fad6
 	@WITH_LIBELF_LIB@ \
Panu Matilainen 34fad6
-	@WITH_BEECRYPT_LIB@ \
Panu Matilainen 34fad6
 	@WITH_POPT_LIB@
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 javadeps_SOURCES =	javadeps.c
Panu Matilainen 34fad6
diff -r ec9e6c427068 tools/debugedit.c
Panu Matilainen 34fad6
--- a/tools/debugedit.c	Wed Oct 24 16:02:51 2007 +0300
Panu Matilainen 34fad6
+++ b/tools/debugedit.c	Thu Nov 01 10:56:58 2007 +0100
Panu Matilainen 34fad6
@@ -36,8 +36,8 @@
Panu Matilainen 34fad6
 #include <gelf.h>
Panu Matilainen 34fad6
 #include <dwarf.h>
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-#include <beecrypt/beecrypt.h>
Panu Matilainen 34fad6
-
Panu Matilainen 34fad6
+#include <rpmio.h>
Panu Matilainen 34fad6
+#include <rpmpgp.h>
Panu Matilainen 34fad6
 #include "hashtab.h"
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
 #define DW_TAG_partial_unit 0x3c
Panu Matilainen 34fad6
@@ -1304,22 +1304,27 @@ error_out:
Panu Matilainen 34fad6
   return NULL;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
+static const pgpHashAlgo algorithms[] = { PGPHASHALGO_MD5,
Panu Matilainen 34fad6
+  PGPHASHALGO_SHA1, PGPHASHALGO_SHA256, PGPHASHALGO_SHA384, PGPHASHALGO_SHA512 };
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
 /* Compute a fresh build ID bit-string from the editted file contents.  */
Panu Matilainen 34fad6
 static void
Panu Matilainen 34fad6
 handle_build_id (DSO *dso, Elf_Data *build_id,
Panu Matilainen 34fad6
 		 size_t build_id_offset, size_t build_id_size)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
-  hashFunctionContext ctx;
Panu Matilainen 34fad6
-  const hashFunction *hf = NULL;
Panu Matilainen 34fad6
-  int i = hashFunctionCount ();
Panu Matilainen 34fad6
+  DIGEST_CTX ctx;
Panu Matilainen 34fad6
+  pgpHashAlgo algorithm;
Panu Matilainen 34fad6
+  int i = sizeof(algorithms)/sizeof(algorithms[0]);
Panu Matilainen 34fad6
+  void *digest = NULL;
Panu Matilainen 34fad6
+  size_t len;
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
   while (i-- > 0)
Panu Matilainen 34fad6
     {
Panu Matilainen 34fad6
-      hf = hashFunctionGet (i);
Panu Matilainen 34fad6
-      if (hf != NULL && hf->digestsize == build_id_size)
Panu Matilainen 34fad6
+      algorithm = algorithms[i];
Panu Matilainen 34fad6
+      if (rpmDigestLength(algorithm) == build_id_size)
Panu Matilainen 34fad6
 	break;
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
-  if (hf == NULL)
Panu Matilainen 34fad6
+  if (i < 0)
Panu Matilainen 34fad6
     {
Panu Matilainen 34fad6
       fprintf (stderr, "Cannot handle %Zu-byte build ID\n", build_id_size);
Panu Matilainen 34fad6
       exit (1);
Panu Matilainen 34fad6
@@ -1335,7 +1340,7 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen 34fad6
   /* Clear the old bits so they do not affect the new hash.  */
Panu Matilainen 34fad6
   memset ((char *) build_id->d_buf + build_id_offset, 0, build_id_size);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-  hashFunctionContextInit (&ctx, hf);
Panu Matilainen 34fad6
+  ctx = rpmDigestInit(algorithm, 0);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
   /* Slurp the relevant header bits and section contents and feed them
Panu Matilainen 34fad6
      into the hash function.  The only bits we ignore are the offset
Panu Matilainen 34fad6
@@ -1349,8 +1354,7 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen 34fad6
     inline void process (const void *data, size_t size);
Panu Matilainen 34fad6
     inline void process (const void *data, size_t size)
Panu Matilainen 34fad6
     {
Panu Matilainen 34fad6
-      memchunk chunk = { .data = (void *) data, .size = size };
Panu Matilainen 34fad6
-      hashFunctionContextUpdateMC (&ctx, &chunk);
Panu Matilainen 34fad6
+      rpmDigestUpdate(ctx, data, size);
Panu Matilainen 34fad6
     }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     union
Panu Matilainen 34fad6
@@ -1405,22 +1409,17 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen 34fad6
 	}
Panu Matilainen 34fad6
   }
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
-  hashFunctionContextDigest (&ctx, (byte *) build_id->d_buf + build_id_offset);
Panu Matilainen 34fad6
-  hashFunctionContextFree (&ctx;;
Panu Matilainen 34fad6
+  rpmDigestFinal(ctx, &digest, &len, 0);
Panu Matilainen 34fad6
+  memcpy((unsigned char *)build_id->d_buf + build_id_offset, digest, build_id_size);
Panu Matilainen 34fad6
+  free(digest);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
   elf_flagdata (build_id, ELF_C_SET, ELF_F_DIRTY);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
   /* Now format the build ID bits in hex to print out.  */
Panu Matilainen 34fad6
   {
Panu Matilainen 34fad6
-    const unsigned char * id = build_id->d_buf + build_id_offset;
Panu Matilainen 34fad6
+    const byte * id = (byte *)build_id->d_buf + build_id_offset;
Panu Matilainen 34fad6
     char hex[build_id_size * 2 + 1];
Panu Matilainen 34fad6
-    int n = snprintf (hex, 3, "%02" PRIx8, id[0]);
Panu Matilainen 34fad6
-    assert (n == 2);
Panu Matilainen 34fad6
-    for (i = 1; i < build_id_size; ++i)
Panu Matilainen 34fad6
-      {
Panu Matilainen 34fad6
-	n = snprintf (&hex[i * 2], 3, "%02" PRIx8, id[i]);
Panu Matilainen 34fad6
-	assert (n == 2);
Panu Matilainen 34fad6
-      }
Panu Matilainen 34fad6
+    pgpHexCvt(hex, id, build_id_size);
Panu Matilainen 34fad6
     puts (hex);
Panu Matilainen 34fad6
   }
Panu Matilainen 34fad6
 }
Panu Matilainen fa7edf
diff -r 39cb695c7c8b rpmio/base64.c
Panu Matilainen fa7edf
--- a/rpmio/base64.c	Thu Nov 01 10:42:01 2007 +0100
Panu Matilainen fa7edf
+++ b/rpmio/base64.c	Wed Nov 14 18:16:51 2007 +0100
Panu Matilainen fa7edf
@@ -98,21 +98,20 @@ char *b64encode(const void *data, size_t
Panu Matilainen fa7edf
 	return output;
Panu Matilainen fa7edf
 }
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
-static int base64_decode_value(char value_in)
Panu Matilainen fa7edf
-{
Panu Matilainen fa7edf
-	static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
Panu Matilainen fa7edf
-	static const char decoding_size = sizeof(decoding);
Panu Matilainen fa7edf
+static int base64_decode_value(unsigned char value_in)
Panu Matilainen fa7edf
+{
Panu Matilainen fa7edf
+	static const int decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
Panu Matilainen fa7edf
 	value_in -= 43;
Panu Matilainen fa7edf
-	if (value_in < 0 || value_in > decoding_size)
Panu Matilainen fa7edf
+	if (value_in > sizeof(decoding)/sizeof(int))
Panu Matilainen fa7edf
 		return -1;
Panu Matilainen fa7edf
-	return decoding[(int)value_in];
Panu Matilainen fa7edf
+	return decoding[value_in];
Panu Matilainen fa7edf
 }
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
 static size_t base64_decode_block(const char *code_in, const size_t length_in, char *plaintext_out)
Panu Matilainen fa7edf
 {
Panu Matilainen fa7edf
 	const char *codechar = code_in;
Panu Matilainen fa7edf
 	char *plainchar = plaintext_out;
Panu Matilainen fa7edf
-	char fragment;
Panu Matilainen fa7edf
+	int fragment;
Panu Matilainen fa7edf
 	
Panu Matilainen fa7edf
 	*plainchar = 0;
Panu Matilainen fa7edf
 	
Panu Matilainen fa7edf
@@ -123,38 +122,38 @@ static size_t base64_decode_block(const 
Panu Matilainen fa7edf
 			{
Panu Matilainen fa7edf
 				return plainchar - plaintext_out;
Panu Matilainen fa7edf
 			}
Panu Matilainen fa7edf
-			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen fa7edf
-		} while (fragment < 0);
Panu Matilainen fa7edf
-		*plainchar    = (fragment & 0x03f) << 2;
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
-		do {
Panu Matilainen fa7edf
-			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
-			{
Panu Matilainen fa7edf
-				return plainchar - plaintext_out;
Panu Matilainen fa7edf
-			}
Panu Matilainen fa7edf
-			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen fa7edf
-		} while (fragment < 0);
Panu Matilainen fa7edf
-		*plainchar++ |= (fragment & 0x030) >> 4;
Panu Matilainen fa7edf
-		*plainchar    = (fragment & 0x00f) << 4;
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
-		do {
Panu Matilainen fa7edf
-			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
-			{
Panu Matilainen fa7edf
-				return plainchar - plaintext_out;
Panu Matilainen fa7edf
-			}
Panu Matilainen fa7edf
-			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen fa7edf
-		} while (fragment < 0);
Panu Matilainen fa7edf
-		*plainchar++ |= (fragment & 0x03c) >> 2;
Panu Matilainen fa7edf
-		*plainchar    = (fragment & 0x003) << 6;
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
-		do {
Panu Matilainen fa7edf
-			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
-			{
Panu Matilainen fa7edf
-				return plainchar - plaintext_out;
Panu Matilainen fa7edf
-			}
Panu Matilainen fa7edf
-			fragment = (char)base64_decode_value(*codechar++);
Panu Matilainen fa7edf
-		} while (fragment < 0);
Panu Matilainen fa7edf
-		*plainchar++   |= (fragment & 0x03f);
Panu Matilainen fa7edf
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen fa7edf
+		} while (fragment < 0);
Panu Matilainen fa7edf
+		*plainchar    = (char)((fragment & 0x03f) << 2);
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+		do {
Panu Matilainen fa7edf
+			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
+			{
Panu Matilainen fa7edf
+				return plainchar - plaintext_out;
Panu Matilainen fa7edf
+			}
Panu Matilainen fa7edf
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen fa7edf
+		} while (fragment < 0);
Panu Matilainen fa7edf
+		*plainchar++ |= (char)((fragment & 0x030) >> 4);
Panu Matilainen fa7edf
+		*plainchar    = (char)((fragment & 0x00f) << 4);
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+		do {
Panu Matilainen fa7edf
+			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
+			{
Panu Matilainen fa7edf
+				return plainchar - plaintext_out;
Panu Matilainen fa7edf
+			}
Panu Matilainen fa7edf
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen fa7edf
+		} while (fragment < 0);
Panu Matilainen fa7edf
+		*plainchar++ |= (char)((fragment & 0x03c) >> 2);
Panu Matilainen fa7edf
+		*plainchar    = (char)((fragment & 0x003) << 6);
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+		do {
Panu Matilainen fa7edf
+			if (codechar == code_in+length_in)
Panu Matilainen fa7edf
+			{
Panu Matilainen fa7edf
+				return plainchar - plaintext_out;
Panu Matilainen fa7edf
+			}
Panu Matilainen fa7edf
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen fa7edf
+		} while (fragment < 0);
Panu Matilainen fa7edf
+		*plainchar++   |= (char)(fragment & 0x03f);
Panu Matilainen fa7edf
 	}
Panu Matilainen fa7edf
 	/* control should not reach here */
Panu Matilainen fa7edf
 	return plainchar - plaintext_out;
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/rpmio/digest.c.nss-init rpm-4.4.2.2/rpmio/digest.c
Panu Matilainen fa7edf
--- rpm-4.4.2.2/rpmio/digest.c.nss-init	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/rpmio/digest.c	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
@@ -78,9 +78,6 @@ rpmDigestInit(pgpHashAlgo hashalgo, rpmD
Panu Matilainen fa7edf
     HASH_HashType type;
Panu Matilainen fa7edf
     DIGEST_CTX ctx = xcalloc(1, sizeof(*ctx));
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
-    if (NSS_NoDB_Init(NULL) != SECSuccess)
Panu Matilainen fa7edf
-	return NULL;
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
     ctx->flags = flags;
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
     type = getHashType(hashalgo);
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/rpmio/rpmpgp.h.nss-init rpm-4.4.2.2/rpmio/rpmpgp.h
Panu Matilainen fa7edf
--- rpm-4.4.2.2/rpmio/rpmpgp.h.nss-init	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/rpmio/rpmpgp.h	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
@@ -1380,6 +1380,15 @@ unsigned int pgpCRC(const byte *octets, 
Panu Matilainen fa7edf
 }
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
 /** \ingroup rpmio
Panu Matilainen fa7edf
+ * Perform cryptography initialization.
Panu Matilainen fa7edf
+ * It must be called before any cryptography can be used within rpm.
Panu Matilainen fa7edf
+ * It's not normally necessary to call it directly as it's called in
Panu Matilainen fa7edf
+ * general rpm initialization routines.
Panu Matilainen fa7edf
+ * @return		0 on success, -1 on failure
Panu Matilainen fa7edf
+ */
Panu Matilainen fa7edf
+int rpmInitCrypto(void);
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+/** \ingroup rpmio
Panu Matilainen fa7edf
  * Duplicate a digest context.
Panu Matilainen fa7edf
  * @param octx		existing digest context
Panu Matilainen fa7edf
  * @return		duplicated digest context
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/rpmio/rpmpgp.c.nss-init rpm-4.4.2.2/rpmio/rpmpgp.c
Panu Matilainen fa7edf
--- rpm-4.4.2.2/rpmio/rpmpgp.c.nss-init	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/rpmio/rpmpgp.c	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
@@ -17,6 +17,8 @@ static int _debug = 0;
Panu Matilainen fa7edf
 /*@unchecked@*/
Panu Matilainen fa7edf
 static int _print = 0;
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
+static int _crypto_initialized = 0;
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
 /*@unchecked@*/ /*@null@*/
Panu Matilainen fa7edf
 static pgpDig _dig = NULL;
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
@@ -1094,7 +1096,6 @@ int pgpPrtPkt(const byte *pkt, unsigned 
Panu Matilainen fa7edf
 pgpDig pgpNewDig(void)
Panu Matilainen fa7edf
 {
Panu Matilainen fa7edf
     pgpDig dig = xcalloc(1, sizeof(*dig));
Panu Matilainen fa7edf
-    NSS_NoDB_Init(NULL);
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
     return dig;
Panu Matilainen fa7edf
 }
Panu Matilainen fa7edf
@@ -1404,5 +1405,18 @@ char * pgpArmorWrap(int atype, const uns
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
     return val;
Panu Matilainen fa7edf
 }
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
 /*@=boundsread@*/
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+int rpmInitCrypto(void) {
Panu Matilainen fa7edf
+    int rc = 0;
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+    if (!_crypto_initialized && NSS_NoDB_Init(NULL) != SECSuccess) {
Panu Matilainen fa7edf
+        rc = -1;
Panu Matilainen fa7edf
+    } else {
Panu Matilainen fa7edf
+        _crypto_initialized = 1;
Panu Matilainen fa7edf
+    }
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+    return rc;
Panu Matilainen fa7edf
+}
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/tools/debugedit.c.nss-init rpm-4.4.2.2/tools/debugedit.c
Panu Matilainen fa7edf
--- rpm-4.4.2.2/tools/debugedit.c.nss-init	2007-11-15 15:01:42.000000000 +0200
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/tools/debugedit.c	2007-11-15 15:02:23.000000000 +0200
Panu Matilainen fa7edf
@@ -1318,6 +1318,8 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen fa7edf
   void *digest = NULL;
Panu Matilainen fa7edf
   size_t len;
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
+  rpmInitCrypto();
Panu Matilainen fa7edf
+
Panu Matilainen fa7edf
   while (i-- > 0)
Panu Matilainen fa7edf
     {
Panu Matilainen fa7edf
       algorithm = algorithms[i];
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/lib/rpmrc.c.nss-init rpm-4.4.2.2/lib/rpmrc.c
Panu Matilainen fa7edf
--- rpm-4.4.2.2/lib/rpmrc.c.nss-init	2007-09-11 09:28:15.000000000 +0300
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/lib/rpmrc.c	2007-11-15 15:00:41.000000000 +0200
Panu Matilainen fa7edf
@@ -1850,6 +1850,10 @@ static int rpmReadRC(/*@null@*/ const ch
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
 int rpmReadConfigFiles(const char * file, const char * target)
Panu Matilainen fa7edf
 {
Panu Matilainen fa7edf
+    /* Initialize crypto engine as early as possible */
Panu Matilainen fa7edf
+    if (rpmInitCrypto() < 0) {
Panu Matilainen fa7edf
+	return -1;
Panu Matilainen fa7edf
+    }	
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
     /* Preset target macros */
Panu Matilainen fa7edf
     /*@-nullstate@*/	/* FIX: target can be NULL */
Panu Matilainen fa7edf
diff -up rpm-4.4.2.2/tools/debugedit.c.gcc43 rpm-4.4.2.2/tools/debugedit.c
Panu Matilainen fa7edf
--- rpm-4.4.2.2/tools/debugedit.c.gcc43	2008-01-04 08:57:09.000000000 +0200
Panu Matilainen fa7edf
+++ rpm-4.4.2.2/tools/debugedit.c	2008-01-04 08:58:40.000000000 +0200
Panu Matilainen fa7edf
@@ -1353,12 +1353,6 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen fa7edf
      or Elf64 object, only that we are consistent in what bits feed the
Panu Matilainen fa7edf
      hash so it comes out the same for the same file contents.  */
Panu Matilainen fa7edf
   {
Panu Matilainen fa7edf
-    inline void process (const void *data, size_t size);
Panu Matilainen fa7edf
-    inline void process (const void *data, size_t size)
Panu Matilainen fa7edf
-    {
Panu Matilainen fa7edf
-      rpmDigestUpdate(ctx, data, size);
Panu Matilainen fa7edf
-    }
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
     union
Panu Matilainen fa7edf
     {
Panu Matilainen fa7edf
       GElf_Ehdr ehdr;
Panu Matilainen fa7edf
@@ -1387,7 +1381,7 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen fa7edf
 	  goto bad;
Panu Matilainen fa7edf
 	if (elf64_xlatetom (&x, &x, dso->ehdr.e_ident[EI_DATA]) == NULL)
Panu Matilainen fa7edf
 	  goto bad;
Panu Matilainen fa7edf
-	process (x.d_buf, x.d_size);
Panu Matilainen fa7edf
+	rpmDigestUpdate(ctx, x.d_buf, x.d_size);
Panu Matilainen fa7edf
       }
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
     x.d_type = ELF_T_SHDR;
Panu Matilainen fa7edf
@@ -1399,14 +1393,14 @@ handle_build_id (DSO *dso, Elf_Data *bui
Panu Matilainen fa7edf
 	  u.shdr.sh_offset = 0;
Panu Matilainen fa7edf
 	  if (elf64_xlatetom (&x, &x, dso->ehdr.e_ident[EI_DATA]) == NULL)
Panu Matilainen fa7edf
 	    goto bad;
Panu Matilainen fa7edf
-	  process (x.d_buf, x.d_size);
Panu Matilainen fa7edf
+	  rpmDigestUpdate(ctx, x.d_buf, x.d_size);
Panu Matilainen fa7edf
 
Panu Matilainen fa7edf
 	  if (u.shdr.sh_type != SHT_NOBITS)
Panu Matilainen fa7edf
 	    {
Panu Matilainen fa7edf
 	      Elf_Data *d = elf_rawdata (dso->scn[i], NULL);
Panu Matilainen fa7edf
 	      if (d == NULL)
Panu Matilainen fa7edf
 		goto bad;
Panu Matilainen fa7edf
-	      process (d->d_buf, d->d_size);
Panu Matilainen fa7edf
+	      rpmDigestUpdate(ctx, d->d_buf, d->d_size);
Panu Matilainen fa7edf
 	    }
Panu Matilainen fa7edf
 	}
Panu Matilainen fa7edf
   }