Panu Matilainen 5e0009
commit c8173f26908886f7b02f7f88a7a2aed9498839da
Panu Matilainen 5e0009
Author: Panu Matilainen <pmatilai@redhat.com>
Panu Matilainen 5e0009
Date:   Tue Apr 1 10:42:49 2008 +0300
Panu Matilainen 5e0009
Panu Matilainen 5e0009
    NSS support
Panu Matilainen 5e0009
Panu Matilainen 5e0009
diff --git a/Makefile.am b/Makefile.am
Panu Matilainen 5e0009
index 0495836..4c68c4c 100644
Panu Matilainen 5e0009
--- a/Makefile.am
Panu Matilainen 5e0009
+++ b/Makefile.am
Panu Matilainen 5e0009
@@ -10,14 +10,14 @@ EXTRA_DIST = CHANGES ChangeLog CREDITS Doxyheader GROUPS README.amiga INSTALL \
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 5e0009
diff --git a/autogen.sh b/autogen.sh
Panu Matilainen 5e0009
index 27d4118..63bfbe1 100755
Panu Matilainen 5e0009
--- a/autogen.sh
Panu Matilainen 5e0009
+++ b/autogen.sh
Panu Matilainen 5e0009
@@ -48,9 +48,6 @@ fi
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 5e0009
diff --git a/build/Makefile.am b/build/Makefile.am
Panu Matilainen 5e0009
index 83d2dee..75b41c2 100644
Panu Matilainen 5e0009
--- a/build/Makefile.am
Panu Matilainen 5e0009
+++ b/build/Makefile.am
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 5e0009
diff --git a/configure.ac b/configure.ac
Panu Matilainen 5e0009
index b004391..c98c86d 100644
Panu Matilainen 5e0009
--- a/configure.ac
Panu Matilainen 5e0009
+++ b/configure.ac
Panu Matilainen 5e0009
@@ -463,34 +463,32 @@ AC_SUBST(WITH_LIBDWARF_INCLUDE)
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 5e0009
+  AC_MSG_ERROR([rpm requires NSS]) 
Panu Matilainen 5e0009
 ])
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
+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 5e0009
diff --git a/lib/Makefile.am b/lib/Makefile.am
Panu Matilainen 5e0009
index d433b75..fe761da 100644
Panu Matilainen 5e0009
--- a/lib/Makefile.am
Panu Matilainen 5e0009
+++ b/lib/Makefile.am
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 5e0009
diff --git a/lib/formats.c b/lib/formats.c
Panu Matilainen 5e0009
index 59f953a..e4354ff 100644
Panu Matilainen 5e0009
--- a/lib/formats.c
Panu Matilainen 5e0009
+++ b/lib/formats.c
Panu Matilainen 5e0009
@@ -210,23 +210,17 @@ static /*@only@*/ char * base64Format(int_32 type, const void * data,
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 5e0009
@@ -310,16 +304,13 @@ static /*@only@*/ char * xmlFormat(int_32 type, const void * data,
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 5e0009
diff --git a/lib/package.c b/lib/package.c
Panu Matilainen 5e0009
index 09571b0..8458b02 100644
Panu Matilainen 5e0009
--- a/lib/package.c
Panu Matilainen 5e0009
+++ b/lib/package.c
Panu Matilainen 5e0009
@@ -1008,11 +1008,9 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
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 5e0009
diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c
Panu Matilainen 5e0009
index b4d377e..83b2d2e 100644
Panu Matilainen 5e0009
--- a/lib/rpmchecksig.c
Panu Matilainen 5e0009
+++ b/lib/rpmchecksig.c
Panu Matilainen 5e0009
@@ -447,7 +447,7 @@ rpmRC rpmcliImportPubkey(const rpmts ts, const unsigned char * pkt, ssize_t pktl
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 5e0009
diff --git a/lib/rpmrc.c b/lib/rpmrc.c
Panu Matilainen 5e0009
index d402a1e..07e604a 100644
Panu Matilainen 5e0009
--- a/lib/rpmrc.c
Panu Matilainen 5e0009
+++ b/lib/rpmrc.c
Panu Matilainen 5e0009
@@ -1884,6 +1884,10 @@ int rpmReadConfigFiles(const char * file, const char * target)
Panu Matilainen 5e0009
     /* Reset umask to its default umask(2) value. */
Panu Matilainen 5e0009
     mode = umask(mode);
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
+    /* Initialize crypto engine as early as possible */
Panu Matilainen 5e0009
+    if (rpmInitCrypto() < 0) {
Panu Matilainen 5e0009
+	return -1;
Panu Matilainen 5e0009
+    }	
Panu Matilainen 5e0009
     /* Preset target macros */
Panu Matilainen 5e0009
     /*@-nullstate@*/	/* FIX: target can be NULL */
Panu Matilainen 5e0009
     rpmRebuildTargetVars(&target, NULL);
Panu Matilainen 5e0009
diff --git a/lib/rpmts.c b/lib/rpmts.c
Panu Matilainen 5e0009
index ef791c6..8423957 100644
Panu Matilainen 5e0009
--- a/lib/rpmts.c
Panu Matilainen 5e0009
+++ b/lib/rpmts.c
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 5e0009
diff --git a/lib/signature.c b/lib/signature.c
Panu Matilainen 5e0009
index 5617e32..0db1349 100644
Panu Matilainen 5e0009
--- a/lib/signature.c
Panu Matilainen 5e0009
+++ b/lib/signature.c
Panu Matilainen 5e0009
@@ -1215,9 +1215,10 @@ verifyRSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1248,43 +1249,40 @@ verifyRSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1295,8 +1293,6 @@ verifyRSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1313,40 +1309,18 @@ verifyRSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1401,6 +1370,7 @@ verifyDSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1428,7 +1398,6 @@ verifyDSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1442,19 +1411,18 @@ verifyDSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
@@ -1463,8 +1431,8 @@ verifyDSASignature(rpmts ts, /*@out@*/ char * t,
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 5e0009
diff --git a/python/Makefile.am b/python/Makefile.am
Panu Matilainen 5e0009
index 1b8c83a..c1da992 100644
Panu Matilainen 5e0009
--- a/python/Makefile.am
Panu Matilainen 5e0009
+++ b/python/Makefile.am
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 5e0009
@@ -42,7 +42,7 @@ rpmdir = $(pylibdir)/site-packages/rpm
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 5e0009
diff --git a/rpmdb/Makefile.am b/rpmdb/Makefile.am
Panu Matilainen 5e0009
index 0f017f9..2393dd7 100644
Panu Matilainen 5e0009
--- a/rpmdb/Makefile.am
Panu Matilainen 5e0009
+++ b/rpmdb/Makefile.am
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 5e0009
diff --git a/rpmio/Makefile.am b/rpmio/Makefile.am
Panu Matilainen 5e0009
index 2d26dcc..44e4096 100644
Panu Matilainen 5e0009
--- a/rpmio/Makefile.am
Panu Matilainen 5e0009
+++ b/rpmio/Makefile.am
Panu Matilainen 5e0009
@@ -10,7 +10,7 @@ EXTRA_PROGRAMS = tax tdigest tdir tfts tget thkp tput tglob tinv tkey tring trpm
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 5e0009
-BEECRYPTLOBJS = $(shell test X"@WITH_BEECRYPT_SUBDIR@" != X && cat $(top_builddir)/@WITH_BEECTYPT_SUBDIR@/listobjs)
Panu Matilainen 5e0009
-
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 5e0009
@@ -44,22 +42,10 @@ librpmio_la_LDFLAGS = -release 4.4 $(LDFLAGS) \
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 5e0009
@@ -105,7 +91,6 @@ tinv_LDFLAGS = @LDFLAGS_STATIC@
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 5e0009
diff --git a/rpmio/base64.c b/rpmio/base64.c
Panu Matilainen 5e0009
new file mode 100644
Panu Matilainen 5e0009
index 0000000..b11b381
Panu Matilainen 5e0009
--- /dev/null
Panu Matilainen 5e0009
+++ b/rpmio/base64.c
Panu Matilainen 5e0009
@@ -0,0 +1,253 @@
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 5e0009
+static int base64_decode_value(unsigned char value_in)
Panu Matilainen 34fad6
+{
Panu Matilainen 5e0009
+	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 34fad6
+	value_in -= 43;
Panu Matilainen 5e0009
+	if (value_in > sizeof(decoding)/sizeof(int))
Panu Matilainen 34fad6
+		return -1;
Panu Matilainen 5e0009
+	return decoding[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 5e0009
+	int 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 5e0009
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 5e0009
+		*plainchar    = (char)((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 5e0009
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 5e0009
+		*plainchar++ |= (char)((fragment & 0x030) >> 4);
Panu Matilainen 5e0009
+		*plainchar    = (char)((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 5e0009
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 5e0009
+		*plainchar++ |= (char)((fragment & 0x03c) >> 2);
Panu Matilainen 5e0009
+		*plainchar    = (char)((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 5e0009
+			fragment = base64_decode_value(*codechar++);
Panu Matilainen 34fad6
+		} while (fragment < 0);
Panu Matilainen 5e0009
+		*plainchar++   |= (char)(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 5e0009
diff --git a/rpmio/base64.h b/rpmio/base64.h
Panu Matilainen 5e0009
new file mode 100644
Panu Matilainen 5e0009
index 0000000..79ae0b6
Panu Matilainen 5e0009
--- /dev/null
Panu Matilainen 5e0009
+++ b/rpmio/base64.h
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 5e0009
diff --git a/rpmio/digest.c b/rpmio/digest.c
Panu Matilainen 5e0009
index 5b4cde8..894cf82 100644
Panu Matilainen 5e0009
--- a/rpmio/digest.c
Panu Matilainen 5e0009
+++ b/rpmio/digest.c
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 5e0009
@@ -37,115 +28,98 @@ 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
+    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 5e0009
@@ -154,35 +128,37 @@ DPRINTF((stderr, "*** Update(%p,%p,%d) param %p \"%s\"\n", ctx, data, len, ctx->
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 5e0009
@@ -191,11 +167,10 @@ DPRINTF((stderr, "*** Final(%p,%p,%p,%d) param %p digest %p\n", ctx, datap, lenp
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 5e0009
diff --git a/rpmio/rpmio_internal.h b/rpmio/rpmio_internal.h
Panu Matilainen 5e0009
index c2906e8..f92ee8a 100644
Panu Matilainen 5e0009
--- a/rpmio/rpmio_internal.h
Panu Matilainen 5e0009
+++ b/rpmio/rpmio_internal.h
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 5e0009
diff --git a/rpmio/rpmpgp.c b/rpmio/rpmpgp.c
Panu Matilainen 5e0009
index 5d2c6f4..2cc03f8 100644
Panu Matilainen 5e0009
--- a/rpmio/rpmpgp.c
Panu Matilainen 5e0009
+++ b/rpmio/rpmpgp.c
Panu Matilainen 5e0009
@@ -17,6 +17,8 @@ static int _debug = 0;
Panu Matilainen 5e0009
 /*@unchecked@*/
Panu Matilainen 5e0009
 static int _print = 0;
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
+static int _crypto_initialized = 0;
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
 /*@unchecked@*/ /*@null@*/
Panu Matilainen 5e0009
 static pgpDig _dig = NULL;
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
@@ -260,39 +262,101 @@ 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 5e0009
 
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 5e0009
+
Panu Matilainen 34fad6
 int pgpPrtSubType(const byte *h, unsigned int hlen, pgpSigType sigtype)
Panu Matilainen 34fad6
 {
Panu Matilainen 5e0009
     const byte *p = h;
Panu Matilainen 5e0009
@@ -407,6 +471,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 5e0009
@@ -414,7 +482,13 @@ static int pgpPrtSigParams(/*@unused@*/ pgpTag tag, byte pubkey_algo, byte sigty
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     const byte * pend = h + hlen;
Panu Matilainen 34fad6
     int i;
Panu Matilainen 34fad6
+    SECItem dsaraw;
Panu Matilainen 34fad6
+    unsigned char dsabuf[2*DSA_SUBPRIME_LEN];
Panu Matilainen 5e0009
 
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 5e0009
@@ -423,9 +497,9 @@ static int pgpPrtSigParams(/*@unused@*/ pgpTag tag, byte pubkey_algo, byte sigty
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 5e0009
@@ -440,11 +514,21 @@ fprintf(stderr, "\t  m**d = "),  mpfprintln(stderr, _dig->c.size, _dig->c.data);
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 5e0009
@@ -629,16 +713,17 @@ static const byte * pgpPrtPubkeyParams(byte pubkey_algo,
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 5e0009
@@ -648,26 +733,23 @@ fprintf(stderr, "\t     e = "),  mpfprintln(stderr, _dig->rsa_pk.e.size, _dig->r
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 5e0009
@@ -1023,6 +1105,7 @@ int pgpPrtPkt(const byte *pkt, unsigned int pleft)
Panu Matilainen 34fad6
 pgpDig pgpNewDig(void)
Panu Matilainen 34fad6
 {
Panu Matilainen 34fad6
     pgpDig dig = xcalloc(1, sizeof(*dig));
Panu Matilainen 34fad6
+
Panu Matilainen 34fad6
     return dig;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
 
Panu Matilainen 5e0009
@@ -1047,14 +1130,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 5e0009
@@ -1082,14 +1178,6 @@ pgpDig pgpFreeDig(/*@only@*/ /*@null@*/ pgpDig dig)
Panu Matilainen 34fad6
 	/*@=branchstate@*/
Panu Matilainen 34fad6
 	dig->sha1ctx = NULL;
Panu Matilainen 5e0009
 
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 5e0009
-
Panu Matilainen 34fad6
 #ifdef	NOTYET
Panu Matilainen 34fad6
 	/*@-branchstate@*/
Panu Matilainen 5e0009
 	if (dig->hdrmd5ctx != NULL)
Panu Matilainen 5e0009
@@ -1104,12 +1192,6 @@ pgpDig pgpFreeDig(/*@only@*/ /*@null@*/ pgpDig dig)
Panu Matilainen 34fad6
 	/*@=branchstate@*/
Panu Matilainen 34fad6
 	dig->md5ctx = NULL;
Panu Matilainen 5e0009
 
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 5e0009
-
Panu Matilainen 34fad6
 	dig = _free(dig);
Panu Matilainen 34fad6
     }
Panu Matilainen 5e0009
     return dig;
Panu Matilainen 5e0009
@@ -1295,20 +1377,13 @@ char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns)
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 5e0009
 
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
+    enc = b64encode(s, ns, -1);
Panu Matilainen 34fad6
+    if (enc != NULL) {
Panu Matilainen 34fad6
+    	nt = strlen(enc);
Panu Matilainen 5e0009
     }
Panu Matilainen 5e0009
-    /*@=globs@*/
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     nt += 512;	/* XXX slop for armor and crc */
Panu Matilainen 34fad6
 
Panu Matilainen 5e0009
@@ -1320,9 +1395,9 @@ char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns)
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
+    t = stpcpy(t, " (NSS-3)\n\n");
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
-    if ((enc = b64encode(s, ns)) != NULL) {
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 5e0009
@@ -1339,5 +1414,18 @@ char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns)
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
     return val;
Panu Matilainen 5e0009
 }
Panu Matilainen 5e0009
-
Panu Matilainen 5e0009
 /*@=boundsread@*/
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
+int rpmInitCrypto(void) {
Panu Matilainen 5e0009
+    int rc = 0;
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
+    if (!_crypto_initialized && NSS_NoDB_Init(NULL) != SECSuccess) {
Panu Matilainen 5e0009
+        rc = -1;
Panu Matilainen 5e0009
+    } else {
Panu Matilainen 5e0009
+        _crypto_initialized = 1;
Panu Matilainen 5e0009
+    }
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
+    return rc;
Panu Matilainen 5e0009
+}
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
diff --git a/rpmio/rpmpgp.h b/rpmio/rpmpgp.h
Panu Matilainen 5e0009
index d90d4e7..c1e2db5 100644
Panu Matilainen 5e0009
--- a/rpmio/rpmpgp.h
Panu Matilainen 5e0009
+++ b/rpmio/rpmpgp.h
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 5e0009
@@ -1384,6 +1380,15 @@ unsigned int pgpCRC(const byte *octets, size_t len)
Panu Matilainen 5e0009
 }
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
 /** \ingroup rpmio
Panu Matilainen 5e0009
+ * Perform cryptography initialization.
Panu Matilainen 5e0009
+ * It must be called before any cryptography can be used within rpm.
Panu Matilainen 5e0009
+ * It's not normally necessary to call it directly as it's called in
Panu Matilainen 5e0009
+ * general rpm initialization routines.
Panu Matilainen 5e0009
+ * @return		0 on success, -1 on failure
Panu Matilainen 5e0009
+ */
Panu Matilainen 5e0009
+int rpmInitCrypto(void);
Panu Matilainen 5e0009
+
Panu Matilainen 5e0009
+/** \ingroup rpmio
Panu Matilainen 5e0009
  * Duplicate a digest context.
Panu Matilainen 5e0009
  * @param octx		existing digest context
Panu Matilainen 5e0009
  * @return		duplicated digest context
Panu Matilainen 5e0009
@@ -1393,6 +1398,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 5e0009
diff --git a/rpmio/tkey.c b/rpmio/tkey.c
Panu Matilainen 5e0009
index e03dba0..9fb7805 100644
Panu Matilainen 5e0009
--- a/rpmio/tkey.c
Panu Matilainen 5e0009
+++ b/rpmio/tkey.c
Panu Matilainen 5e0009
@@ -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 5e0009
@@ -51,52 +51,40 @@ fprintf(stderr, "??? %5d %02x != %02x '%c' != '%c'\n", i, (*s & 0xff), (*t & 0xf
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 5e0009
@@ -108,28 +96,6 @@ main (int argc, char *argv[])
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     dig = pgpNewDig();
Panu Matilainen 5e0009
 
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 5e0009
-
Panu Matilainen 34fad6
 fprintf(stderr, "=============================== GPG Secret Key\n");
Panu Matilainen 34fad6
     if ((rc = doit(jbjSecretDSA, dig, printing)) != 0)
Panu Matilainen 5e0009
 	fprintf(stderr, "==> FAILED: rc %d\n", rc);
Panu Matilainen 5e0009
@@ -144,39 +110,33 @@ fprintf(stderr, "=============================== GPG Signature of \"abc\"\n");
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 5e0009
 
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 5e0009
-
Panu Matilainen 34fad6
     dig = pgpFreeDig(dig);
Panu Matilainen 34fad6
 
Panu Matilainen 34fad6
     return rc;
Panu Matilainen 34fad6
 }
Panu Matilainen 34fad6
+
Panu Matilainen 5e0009
diff --git a/tools/Makefile.am b/tools/Makefile.am
Panu Matilainen 5e0009
index 72bfd0b..053a02a 100644
Panu Matilainen 5e0009
--- a/tools/Makefile.am
Panu Matilainen 5e0009
+++ b/tools/Makefile.am
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 5e0009
@@ -36,10 +36,10 @@ bin_PROGRAMS =	rpmgraph
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 5e0009
diff --git a/tools/debugedit.c b/tools/debugedit.c
Panu Matilainen 5e0009
index f6e27b6..e69ff3d 100644
Panu Matilainen 5e0009
--- a/tools/debugedit.c
Panu Matilainen 5e0009
+++ b/tools/debugedit.c
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 5e0009
@@ -1304,22 +1304,29 @@ 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 5e0009
+
Panu Matilainen 5e0009
+  rpmInitCrypto();
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 5e0009
@@ -1335,7 +1342,7 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
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 5e0009
@@ -1346,13 +1353,6 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
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 5e0009
-      memchunk chunk = { .data = (void *) data, .size = size };
Panu Matilainen 5e0009
-      hashFunctionContextUpdateMC (&ctx, &chunk);
Panu Matilainen fa7edf
-    }
Panu Matilainen fa7edf
-
Panu Matilainen fa7edf
     union
Panu Matilainen fa7edf
     {
Panu Matilainen fa7edf
       GElf_Ehdr ehdr;
Panu Matilainen 5e0009
@@ -1381,7 +1381,7 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
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 5e0009
@@ -1393,34 +1393,29 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
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
   }
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
-  hashFunctionContextDigest (&ctx, (byte *) build_id->d_buf + build_id_offset);
Panu Matilainen 5e0009
-  hashFunctionContextFree (&ctx;;
Panu Matilainen 5e0009
+  rpmDigestFinal(ctx, &digest, &len, 0);
Panu Matilainen 5e0009
+  memcpy((unsigned char *)build_id->d_buf + build_id_offset, digest, build_id_size);
Panu Matilainen 5e0009
+  free(digest);
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
   elf_flagdata (build_id, ELF_C_SET, ELF_F_DIRTY);
Panu Matilainen 5e0009
 
Panu Matilainen 5e0009
   /* Now format the build ID bits in hex to print out.  */
Panu Matilainen 5e0009
   {
Panu Matilainen 5e0009
-    const unsigned char * id = build_id->d_buf + build_id_offset;
Panu Matilainen 5e0009
+    const byte * id = (byte *)build_id->d_buf + build_id_offset;
Panu Matilainen 5e0009
     char hex[build_id_size * 2 + 1];
Panu Matilainen 5e0009
-    int n = snprintf (hex, 3, "%02" PRIx8, id[0]);
Panu Matilainen 5e0009
-    assert (n == 2);
Panu Matilainen 5e0009
-    for (i = 1; i < build_id_size; ++i)
Panu Matilainen 5e0009
-      {
Panu Matilainen 5e0009
-	n = snprintf (&hex[i * 2], 3, "%02" PRIx8, id[i]);
Panu Matilainen 5e0009
-	assert (n == 2);
Panu Matilainen 5e0009
-      }
Panu Matilainen 5e0009
+    pgpHexCvt(hex, id, build_id_size);
Panu Matilainen 5e0009
     puts (hex);
Panu Matilainen 5e0009
   }
Panu Matilainen 5e0009
 }