lower case
diff --git a/src/cmd/auth/asn12dsa.c b/src/cmd/auth/asn12dsa.c
index 7df5dd7..793dbcd 100644
--- a/src/cmd/auth/asn12dsa.c
+++ b/src/cmd/auth/asn12dsa.c
@@ -59,7 +59,7 @@
 	if(key == nil)
 		sysfatal("couldn't parse asn1 key");
 
-	s = smprint("key proto=dsa %s%sp=%B q=%B alpha=%B key=%B !secret=%B\n",
+	s = smprint("key proto=dsa %s%sp=%lB q=%lB alpha=%lB key=%lB !secret=%lB\n",
 		tag ? tag : "", tag ? " " : "",
 		key->pub.p, key->pub.q, key->pub.alpha, key->pub.key,
 		key->secret);
diff --git a/src/cmd/auth/asn12rsa.c b/src/cmd/auth/asn12rsa.c
index a2df044..abddf8b 100644
--- a/src/cmd/auth/asn12rsa.c
+++ b/src/cmd/auth/asn12rsa.c
@@ -59,7 +59,7 @@
 	if(key == nil)
 		sysfatal("couldn't parse asn1 key");
 
-	s = smprint("key proto=rsa %s%ssize=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+	s = smprint("key proto=rsa %s%ssize=%d ek=%lB !dk=%lB n=%lB !p=%lB !q=%lB !kp=%lB !kq=%lB !c2=%lB\n",
 		tag ? tag : "", tag ? " " : "",
 		mpsignif(key->pub.n), key->pub.ek,
 		key->dk, key->pub.n, key->p, key->q,
diff --git a/src/cmd/auth/dsa2pub.c b/src/cmd/auth/dsa2pub.c
new file mode 100644
index 0000000..37dc832
--- /dev/null
+++ b/src/cmd/auth/dsa2pub.c
@@ -0,0 +1,44 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include <mp.h>
+#include <libsec.h>
+#include "rsa2any.h"
+
+void
+usage(void)
+{
+	fprint(2, "usage: auth/dsa2pub [file]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char **argv)
+{
+	RSApriv *key;
+	Attr *a;
+	char *s;
+
+	fmtinstall('A', _attrfmt);
+	fmtinstall('B', mpfmt);
+	quotefmtinstall();
+
+	ARGBEGIN{
+	default:
+		usage();
+	}ARGEND
+
+	if(argc > 1)
+		usage();
+
+	if((key = getdsakey(argc, argv, 0, &a)) == nil)
+		sysfatal("%r");
+
+	s = smprint("key %A p=%lB q=%lB alpha=%lB key=%lB\n",
+		a, 
+		key->pub.p, key->pub.q, key->pub.alpha, key->pub.key);
+	if(s == nil)
+		sysfatal("smprint: %r");
+	write(1, s, strlen(s));
+	exits(nil);
+}
diff --git a/src/cmd/auth/dsagen.c b/src/cmd/auth/dsagen.c
index 5fa9f99..58d5924 100644
--- a/src/cmd/auth/dsagen.c
+++ b/src/cmd/auth/dsagen.c
@@ -36,7 +36,7 @@
 
 	key = dsagen(nil);
 
-	s = smprint("key proto=dsa %s%sp=%B q=%B alpha=%B key=%B !secret=%B\n",
+	s = smprint("key proto=dsa %s%sp=%lB q=%lB alpha=%lB key=%lB !secret=%lB\n",
 		tag ? tag : "", tag ? " " : "",
 		key->pub.p, key->pub.q, key->pub.alpha, key->pub.key,
 		key->secret);
diff --git a/src/cmd/auth/mkfile b/src/cmd/auth/mkfile
index 39d2f53..2585456 100644
--- a/src/cmd/auth/mkfile
+++ b/src/cmd/auth/mkfile
@@ -6,6 +6,7 @@
 	asn12dsa\
 	asn12rsa\
 	dsagen\
+	dsa2pub\
 	dsa2ssh\
 	passwd\
 	pemdecode\
diff --git a/src/cmd/auth/rsa2pub.c b/src/cmd/auth/rsa2pub.c
index 7de1050..c0a208a 100644
--- a/src/cmd/auth/rsa2pub.c
+++ b/src/cmd/auth/rsa2pub.c
@@ -34,7 +34,7 @@
 	if((key = getkey(argc, argv, 0, &a)) == nil)
 		sysfatal("%r");
 
-	s = smprint("key %A size=%d ek=%B n=%B\n",
+	s = smprint("key %A size=%d ek=%lB n=%lB\n",
 		a, 
 		mpsignif(key->pub.n), key->pub.ek, key->pub.n);
 	if(s == nil)
diff --git a/src/cmd/auth/rsafill.c b/src/cmd/auth/rsafill.c
index b9e26d4..08cb859 100644
--- a/src/cmd/auth/rsafill.c
+++ b/src/cmd/auth/rsafill.c
@@ -34,7 +34,7 @@
 	if((key = getkey(argc, argv, 1, &a)) == nil)
 		sysfatal("%r");
 
-	s = smprint("key %A size=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+	s = smprint("key %A size=%d ek=%lB !dk=%lB n=%lB !p=%lB !q=%lB !kp=%lB !kq=%lB !c2=%lB\n",
 		a, 
 		mpsignif(key->pub.n), key->pub.ek,
 		key->dk, key->pub.n, key->p, key->q,
diff --git a/src/cmd/auth/rsagen.c b/src/cmd/auth/rsagen.c
index d05f562..d51560b 100644
--- a/src/cmd/auth/rsagen.c
+++ b/src/cmd/auth/rsagen.c
@@ -45,7 +45,7 @@
 		key = rsagen(bits, 6, 0);
 	}while(mpsignif(key->pub.n) != bits);
 
-	s = smprint("key proto=rsa %s%ssize=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
+	s = smprint("key proto=rsa %s%ssize=%d ek=%lB !dk=%lB n=%lB !p=%lB !q=%lB !kp=%lB !kq=%lB !c2=%lB\n",
 		tag ? tag : "", tag ? " " : "",
 		mpsignif(key->pub.n), key->pub.ek,
 		key->dk, key->pub.n, key->p, key->q,