1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-11 23:59:50 +02:00
gnupg/sm/keylist.c

221 lines
4.9 KiB
C
Raw Normal View History

2001-11-19 17:52:10 +01:00
/* keylist.c
* Copyright (C) 1998, 1999, 2000, 2001 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
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <assert.h>
#include <gcrypt.h>
#include <ksba.h>
#include "gpgsm.h"
#include "keydb.h"
static void
print_key_data (KsbaCert cert, FILE *fp)
{
#if 0
int n = pk ? pubkey_get_npkey( pk->pubkey_algo ) : 0;
int i;
for(i=0; i < n; i++ )
{
fprintf (fp, "pkd:%d:%u:", i, mpi_get_nbits( pk->pkey[i] ) );
mpi_print(stdout, pk->pkey[i], 1 );
putchar(':');
putchar('\n');
}
#endif
}
static void
print_capabilities (KsbaCert cert, FILE *fp)
{
putc ('e', fp);
putc ('s', fp);
putc ('c', fp);
putc ('E', fp);
putc ('S', fp);
putc ('C', fp);
putc (':', fp);
}
static void
print_time (time_t t, FILE *fp)
{
if (!t)
;
else if ( t == (time_t)(-1) )
putc ('?', fp);
else
fprintf (fp, "%lu", (unsigned long)t);
}
2001-11-19 17:52:10 +01:00
/* List one certificate in colon mode */
static void
list_cert_colon (KsbaCert cert, FILE *fp)
{
int idx, trustletter = 0;
unsigned char *p;
2001-11-19 17:52:10 +01:00
fputs ("crt:", fp);
trustletter = 0;
#if 0
if (is_not_valid (cert))
putc ('i', fp);
else if ( is_revoked (cert) )
putc ('r', fp);
else if ( has_expired (cert))
putcr ('e', fp);
else
#endif
{
trustletter = '?'; /*get_validity_info ( pk, NULL );*/
putc (trustletter, fp);
}
fprintf (fp, ":%u:%d::",
2001-11-19 17:52:10 +01:00
/*keylen_of_cert (cert)*/1024,
/* pubkey_algo_of_cert (cert)*/'R');
/* we assume --fixed-list-mode for gpgsm */
print_time ( ksba_cert_get_validity (cert, 0), fp);
putc (':', fp);
print_time ( ksba_cert_get_validity (cert, 1), fp);
putc (':', fp);
putc (':', fp);
if ((p = ksba_cert_get_serial (cert)))
{
int i, len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
for (i=0; i < len; i++)
fprintf (fp,"%02X", p[4+i]);
xfree (p);
}
putc (':', fp);
2001-11-19 17:52:10 +01:00
putc (':', fp);
if ((p = ksba_cert_get_issuer (cert,0)))
{
fputs (p, fp); /* FIXME: Escape colons and linefeeds */
xfree (p);
}
2001-11-19 17:52:10 +01:00
putc (':', fp);
print_capabilities (cert, fp);
putc ('\n', fp);
2001-11-19 17:52:10 +01:00
p = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
fprintf (fp, "fpr:::::::::%s:\n", p);
xfree (p);
if (opt.with_key_data)
{
if ( (p = gpgsm_get_keygrip_hexstring (cert)))
{
fprintf (fp, "grp:::::::::%s:\n", p);
xfree (p);
}
print_key_data (cert, fp);
}
2001-11-19 17:52:10 +01:00
for (idx=0; (p = ksba_cert_get_subject (cert,idx)); idx++)
{
fprintf (fp, "uid:%c::::::::", trustletter);
fputs (p, fp); /* FIXME: Escape colons and linefeeds */
xfree (p);
putc (':', fp);
putc (':', fp);
putc ('\n', fp);
}
2001-11-19 17:52:10 +01:00
}
/* List all keys or just the key given as NAMES */
void
gpgsm_list_keys (CTRL ctrl, STRLIST names, FILE *fp)
{
KEYDB_HANDLE hd;
KsbaCert cert = NULL;
int rc=0;
const char *lastresname, *resname;
hd = keydb_new (0);
if (!hd)
rc = GNUPG_General_Error;
2001-11-19 17:52:10 +01:00
else
rc = keydb_search_first (hd);
if (rc)
{
if (rc != -1)
log_error ("keydb_search_first failed: %s\n", gnupg_strerror (rc) );
2001-11-19 17:52:10 +01:00
goto leave;
}
lastresname = NULL;
do
{
rc = keydb_get_cert (hd, &cert);
if (rc)
{
log_error ("keydb_get_cert failed: %s\n", gnupg_strerror (rc));
2001-11-19 17:52:10 +01:00
goto leave;
}
resname = keydb_get_resource_name (hd);
if (lastresname != resname )
{
int i;
if (ctrl->no_server)
{
fprintf (fp, "%s\n", resname );
for (i=strlen(resname); i; i-- )
putchar('-');
putc ('\n', fp);
lastresname = resname;
}
}
if (ctrl->with_colons)
list_cert_colon (cert, fp);
else
list_cert_colon (cert, fp);
ksba_cert_release (cert);
cert = NULL;
2001-11-19 17:52:10 +01:00
}
while (!(rc = keydb_search_next (hd)));
if (rc && rc != -1)
log_error ("keydb_search_next failed: %s\n", gnupg_strerror (rc));
2001-11-19 17:52:10 +01:00
leave:
ksba_cert_release (cert);
keydb_release (hd);
}