tools/gpgtar: Rework argument parsing.
[gnupg.git] / tools / gpgkey2ssh.c
index 75b18b2..f12c5f4 100644 (file)
@@ -1,22 +1,30 @@
-/* gpgkey2ssh.c - Converter ...
-       Copyright (C) 2005 Free Software Foundation, Inc.
-  This file is part of GnuPG.
-  GnuPG is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-  GnuPG is distributed in the hope that it will be useful, but WITHOUT
-  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-  License for more details.
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-  02111-1307, USA.  */
+/* gpgkey2ssh.c - Converter  (Debug helper)
+ *     Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* 
+   FIXME:  This tool needs some cleanup:
+
+   - Do not use assert() for error output.
+   - Add proper option parsing and standard options.
+   - retrieve_key_material needs to take the ordinal at field 1 in account.
+   0 Write a man page.
+*/
 
 #include <config.h>
 
@@ -28,6 +36,7 @@
 #include <errno.h>
 
 #include "util.h"
+#include "sysutils.h"
 
 \f
 
@@ -66,7 +75,7 @@ retrieve_key_material (FILE *fp, const char *hexkeyid, int *algorithm_id,
   id = 0;
 
   /* Loop over all records until we have found the subkey
-     corresponsing to the fingerprint. Inm general the first record
+     corresponding to the fingerprint. In general the first record
      should be the pub record, but we don't rely on that.  Given that
      we only need to look at one key, it is sufficient to compare the
      keyid so that we don't need to look at "fpr" records. */
@@ -84,7 +93,7 @@ retrieve_key_material (FILE *fp, const char *hexkeyid, int *algorithm_id,
         break; /* EOF. */
       if (i < 0)
        {
-         err = gpg_error_from_errno (errno);
+         err = gpg_error_from_syserror ();
          goto leave; /* Error. */
        }
       if (!max_length)
@@ -185,7 +194,7 @@ key_to_blob (unsigned char **blob, size_t *blob_n, const char *identifier, ...)
   int ret;
   pkdbuf_t *pkd;
 
-  stream = tmpfile ();
+  stream = gnupg_tmpfile ();
   assert (stream);
 
   identifier_n = strlen (identifier);
@@ -215,6 +224,8 @@ key_to_blob (unsigned char **blob, size_t *blob_n, const char *identifier, ...)
       assert (ret == 1);
     }
 
+  va_end (ap);
+
   blob_new_n = ftell (stream);
   rewind (stream);
 
@@ -237,7 +248,7 @@ main (int argc, char **argv)
   int algorithm_id;
   pkdbuf_t *pkdbuf;
   size_t pkdbuf_n;
-  char *command;
+  char *command = NULL;
   FILE *fp;
   int ret;
   gcry_error_t err;
@@ -249,31 +260,63 @@ main (int argc, char **argv)
   pkdbuf = NULL;
   pkdbuf_n = 0;
 
-  assert (argc == 2);
+  algorithm_id = 0;  /* (avoid cc warning) */
+  identifier = NULL; /* (avoid cc warning) */
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "Usage: %s KEYID\n", argv[0]);
+      exit (1);
+    }
+  if (strcmp (argv[1], "--help") == 0)
+    {
+      fprintf (stderr, "Usage: %s KEYID\n", argv[0]);
+      fprintf (stderr, "\n");
+      fprintf (stderr,
+               "Convert a gpg key to a format appropriate for inclusion in an\n"
+               "ssh authorized_keys file.\n");
+      exit (0);
+    }
 
   keyid = argv[1];
 
-  ret = asprintf (&command,
-                 "gpg --list-keys --with-colons --with-key-data '%s'",
-                 keyid);
-  assert (ret > 0);
+  asprintf (&command,
+            "gpg2 --list-keys --with-colons --with-key-data '%s'",
+            keyid);
+  if (! command)
+    {
+      fprintf (stderr, "Out of memory.\n");
+      exit (1);
+    }
 
   fp = popen (command, "r");
-  assert (fp);
+  if (! fp)
+    {
+      fprintf (stderr, "Failed to running: '%s'\n", command);
+      exit (1);
+    }
 
   err = retrieve_key_material (fp, keyid, &algorithm_id, &pkdbuf, &pkdbuf_n);
-  assert (! err);
-  assert ((algorithm_id == 1) || (algorithm_id == 17));
+  if (err)
+    {
+      fprintf (stderr, "Error looking up key: %s\n", gpg_strerror (err));
+      exit (1);
+    }
+  if (! ((algorithm_id == 1) || (algorithm_id == 17)))
+    {
+      fprintf (stderr, "Unsupported algorithm: %d\n", algorithm_id);
+      exit (1);
+    }
 
   if (algorithm_id == 1)
     {
       identifier = "ssh-rsa";
       ret = key_to_blob (&blob, &blob_n, identifier,
-                        &pkdbuf[0], &pkdbuf[1], NULL);
+                        &pkdbuf[1], &pkdbuf[0], NULL);
     }
   else if (algorithm_id == 17)
     {
-      identifier = "ssh-dsa";
+      identifier = "ssh-dss";
       ret = key_to_blob (&blob, &blob_n, identifier,
                         &pkdbuf[0], &pkdbuf[1], &pkdbuf[2], &pkdbuf[3], NULL);
     }