mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
partial DSA support
This commit is contained in:
parent
1b1a6d7e77
commit
a6a8f1e706
62 changed files with 2247 additions and 447 deletions
224
g10/keylist.c
224
g10/keylist.c
|
@ -32,17 +32,231 @@
|
|||
#include "memory.h"
|
||||
#include "util.h"
|
||||
#include "trustdb.h"
|
||||
#include "ttyio.h"
|
||||
#include "main.h"
|
||||
#include "i18n.h"
|
||||
|
||||
static void list_all(void);
|
||||
static void list_one(const char *name);
|
||||
static void fingerprint( PKT_public_cert *pkc );
|
||||
|
||||
|
||||
/****************
|
||||
* List the keys in a special forma which is extensible and easy to parse
|
||||
* If NAMES is NULL; the complte keyring is listed
|
||||
*
|
||||
* List the keys
|
||||
* If NNAMES is 0; all available keys are listed
|
||||
*/
|
||||
void
|
||||
ext_key_list( STRLIST names )
|
||||
std_key_list( int nnames, char **names )
|
||||
{
|
||||
if( !nnames )
|
||||
list_all();
|
||||
else { /* List by user id */
|
||||
for( ; nnames ; nnames--, names++ )
|
||||
list_one( *names );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
list_all()
|
||||
{
|
||||
int i, seq=0;
|
||||
const char *s;
|
||||
IOBUF a;
|
||||
|
||||
while( (s=get_keyring(seq++)) ) {
|
||||
if( !(a = iobuf_open(s)) ) {
|
||||
log_error(_("can't open %s: %s\n"), s, strerror(errno));
|
||||
continue;
|
||||
}
|
||||
if( seq > 1 )
|
||||
putchar('\n');
|
||||
printf("%s\n", s );
|
||||
for(i=strlen(s); i; i-- )
|
||||
putchar('-');
|
||||
putchar('\n');
|
||||
|
||||
proc_packets( a );
|
||||
iobuf_close(a);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
list_one( const char *name )
|
||||
{
|
||||
int rc = 0;
|
||||
KBNODE keyblock = NULL;
|
||||
KBNODE kbctx;
|
||||
KBNODE node;
|
||||
KBPOS kbpos;
|
||||
PKT_public_cert *pkc;
|
||||
u32 keyid[2];
|
||||
int any=0;
|
||||
|
||||
/* search the userid */
|
||||
rc = find_keyblock_byname( &kbpos, name );
|
||||
if( rc ) {
|
||||
log_error("%s: user not found\n", name );
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* read the keyblock */
|
||||
rc = read_keyblock( &kbpos, &keyblock );
|
||||
if( rc ) {
|
||||
log_error("%s: keyblock read problem: %s\n", name, g10_errstr(rc) );
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* get the keyid from the keyblock */
|
||||
node = find_kbnode( keyblock, PKT_PUBLIC_CERT );
|
||||
if( !node ) {
|
||||
log_error("Oops; public key not found anymore!\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
pkc = node->pkt->pkt.public_cert;
|
||||
keyid_from_pkc( pkc, keyid );
|
||||
if( opt.with_colons )
|
||||
printf("pub::%u:%d:%08lX%08lX:%s:::",
|
||||
/* fixme: add trust value here */
|
||||
nbits_from_pkc( pkc ),
|
||||
pkc->pubkey_algo,
|
||||
(ulong)keyid[0],(ulong)keyid[1],
|
||||
datestr_from_pkc( pkc )
|
||||
/* fixme: add LID and ownertrust here */
|
||||
);
|
||||
else
|
||||
printf("pub %4u%c/%08lX %s ", nbits_from_pkc( pkc ),
|
||||
pubkey_letter( pkc->pubkey_algo ),
|
||||
(ulong)keyid[1],
|
||||
datestr_from_pkc( pkc ) );
|
||||
|
||||
for( kbctx=NULL; (node=walk_kbnode( keyblock, &kbctx, 0)) ; ) {
|
||||
if( node->pkt->pkttype == PKT_USER_ID ) {
|
||||
if( any ) {
|
||||
if( opt.with_colons )
|
||||
printf("uid::::::::");
|
||||
else
|
||||
printf("uid%*s", 28, "");
|
||||
}
|
||||
print_string( stdout, node->pkt->pkt.user_id->name,
|
||||
node->pkt->pkt.user_id->len, opt.with_colons );
|
||||
if( opt.with_colons )
|
||||
putchar(':');
|
||||
putchar('\n');
|
||||
if( !any ) {
|
||||
if( opt.fingerprint )
|
||||
fingerprint( pkc );
|
||||
any = 1;
|
||||
}
|
||||
}
|
||||
else if( opt.list_sigs && node->pkt->pkttype == PKT_SIGNATURE ) {
|
||||
PKT_signature *sig = node->pkt->pkt.signature;
|
||||
int sigrc;
|
||||
|
||||
if( !any ) { /* no user id, (maybe a revocation follows)*/
|
||||
if( sig->sig_class == 0x20 )
|
||||
puts("[revoked]");
|
||||
else
|
||||
putchar('\n');
|
||||
if( opt.fingerprint )
|
||||
fingerprint( pkc );
|
||||
any=1;
|
||||
}
|
||||
|
||||
if( sig->sig_class == 0x20 || sig->sig_class == 0x30 )
|
||||
fputs("rev", stdout);
|
||||
else if( (sig->sig_class&~3) == 0x10 )
|
||||
fputs("sig", stdout);
|
||||
else {
|
||||
if( opt.with_colons )
|
||||
printf("sig:::::::::%02x:\n",sig->sig_class );
|
||||
else
|
||||
printf("sig "
|
||||
"[unexpected signature class 0x%02x]\n",sig->sig_class );
|
||||
continue;
|
||||
}
|
||||
if( opt.check_sigs ) {
|
||||
fflush(stdout);
|
||||
rc = check_key_signature( keyblock, node, NULL );
|
||||
switch( rc ) {
|
||||
case 0: sigrc = '!'; break;
|
||||
case G10ERR_BAD_SIGN: sigrc = '-'; break;
|
||||
case G10ERR_NO_PUBKEY: sigrc = '?'; break;
|
||||
default: sigrc = '%'; break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
rc = 0;
|
||||
sigrc = ' ';
|
||||
}
|
||||
if( opt.with_colons ) {
|
||||
putchar(':');
|
||||
if( sigrc != ' ' )
|
||||
putchar(sigrc);
|
||||
printf(":::%08lX%08lX:%s:::", (ulong)sig->keyid[0],
|
||||
(ulong)sig->keyid[1], datestr_from_sig(sig));
|
||||
}
|
||||
else
|
||||
printf("%c %08lX %s ",
|
||||
sigrc, (ulong)sig->keyid[1], datestr_from_sig(sig));
|
||||
if( sigrc == '%' )
|
||||
printf("[%s] ", g10_errstr(rc) );
|
||||
else if( sigrc == '?' )
|
||||
;
|
||||
else {
|
||||
size_t n;
|
||||
char *p = get_user_id( sig->keyid, &n );
|
||||
print_string( stdout, p, n, opt.with_colons );
|
||||
m_free(p);
|
||||
}
|
||||
if( opt.with_colons )
|
||||
printf(":%02x:", sig->sig_class );
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
if( !any ) {/* oops, no user id */
|
||||
if( opt.with_colons )
|
||||
putchar(':');
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
|
||||
leave:
|
||||
release_kbnode( keyblock );
|
||||
}
|
||||
|
||||
static void
|
||||
fingerprint( PKT_public_cert *pkc )
|
||||
{
|
||||
byte *array, *p;
|
||||
size_t i, n;
|
||||
|
||||
p = array = fingerprint_from_pkc( pkc, &n );
|
||||
if( opt.with_colons ) {
|
||||
printf("fpr::::::::");
|
||||
for(i=0; i < n ; i++, p++ )
|
||||
printf("%02X", *p );
|
||||
putchar(':');
|
||||
}
|
||||
else {
|
||||
printf(" Key fingerprint =");
|
||||
if( n == 20 ) {
|
||||
for(i=0; i < n ; i++, i++, p += 2 ) {
|
||||
if( i == 10 )
|
||||
putchar(' ');
|
||||
printf(" %02X%02X", *p, p[1] );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(i=0; i < n ; i++, p++ ) {
|
||||
if( i && !(i%8) )
|
||||
putchar(' ');
|
||||
printf(" %02X", *p );
|
||||
}
|
||||
}
|
||||
}
|
||||
putchar('\n');
|
||||
m_free(array);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue