diff options
Diffstat (limited to 'g10/getkey.c')
-rw-r--r-- | g10/getkey.c | 122 |
1 files changed, 72 insertions, 50 deletions
diff --git a/g10/getkey.c b/g10/getkey.c index 4aea8e7ca..c978cb9fd 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -48,7 +48,7 @@ typedef struct user_id_db { typedef struct pkc_cache_entry { struct pkc_cache_entry *next; u32 keyid[2]; - PKT_pubkey_cert *pkc; + PKT_public_cert *pkc; } *pkc_cache_entry_t; static STRLIST keyrings; @@ -59,9 +59,9 @@ static pkc_cache_entry_t pkc_cache; static int pkc_cache_entries; /* number of entries in pkc cache */ -static int scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, +static int scan_keyring( PKT_public_cert *pkc, u32 *keyid, const char *name, const char *filename ); -static int scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, +static int scan_secret_keyring( PKT_secret_cert *skc, u32 *keyid, const char *name, const char *filename); @@ -80,7 +80,7 @@ add_keyring( const char *name ) void -cache_pubkey_cert( PKT_pubkey_cert *pkc ) +cache_public_cert( PKT_public_cert *pkc ) { pkc_cache_entry_t ce; u32 keyid[2]; @@ -95,7 +95,7 @@ cache_pubkey_cert( PKT_pubkey_cert *pkc ) for( ce = pkc_cache; ce; ce = ce->next ) if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] ) { if( DBG_CACHE ) - log_debug("cache_pubkey_cert: already in cache\n"); + log_debug("cache_public_cert: already in cache\n"); return; } @@ -106,7 +106,7 @@ cache_pubkey_cert( PKT_pubkey_cert *pkc ) log_info("too many entries in pkc cache - disabled\n"); } ce = pkc_cache; - free_pubkey_cert( ce->pkc ); + free_public_cert( ce->pkc ); } else { pkc_cache_entries++; @@ -114,7 +114,7 @@ cache_pubkey_cert( PKT_pubkey_cert *pkc ) ce->next = pkc_cache; pkc_cache = ce; } - ce->pkc = copy_pubkey_cert( NULL, pkc ); + ce->pkc = copy_public_cert( NULL, pkc ); ce->keyid[0] = keyid[0]; ce->keyid[1] = keyid[1]; } @@ -152,7 +152,7 @@ cache_user_id( PKT_user_id *uid, u32 *keyid ) * internal structures. */ int -get_pubkey( PKT_pubkey_cert *pkc, u32 *keyid ) +get_pubkey( PKT_public_cert *pkc, u32 *keyid ) { keyid_list_t kl; int internal = 0; @@ -179,7 +179,7 @@ get_pubkey( PKT_pubkey_cert *pkc, u32 *keyid ) for( ce = pkc_cache; ce; ce = ce->next ) if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] ) { if( pkc ) - copy_pubkey_cert( pkc, ce->pkc ); + copy_public_cert( pkc, ce->pkc ); return 0; } @@ -207,7 +207,7 @@ get_pubkey( PKT_pubkey_cert *pkc, u32 *keyid ) leave: if( !rc ) - cache_pubkey_cert( pkc ); + cache_public_cert( pkc ); if( internal ) m_free(pkc); return rc; @@ -221,7 +221,7 @@ get_pubkey( PKT_pubkey_cert *pkc, u32 *keyid ) * a pubkey with that algo. */ int -get_pubkey_by_name( PKT_pubkey_cert *pkc, const char *name ) +get_pubkey_by_name( PKT_public_cert *pkc, const char *name ) { int internal = 0; int rc = 0; @@ -253,7 +253,7 @@ get_pubkey_by_name( PKT_pubkey_cert *pkc, const char *name ) * Get a secret key and store it into skey */ int -get_seckey( PKT_seckey_cert *skc, u32 *keyid ) +get_seckey( PKT_secret_cert *skc, u32 *keyid ) { int rc=0; @@ -277,7 +277,7 @@ get_seckey( PKT_seckey_cert *skc, u32 *keyid ) * Get a secret key by name and store it into skc */ int -get_seckey_by_name( PKT_seckey_cert *skc, const char *name ) +get_seckey_by_name( PKT_secret_cert *skc, const char *name ) { int rc=0; @@ -302,7 +302,7 @@ get_seckey_by_name( PKT_seckey_cert *skc, const char *name ) * scan the keyring and look for either the keyid or the name. */ static int -scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, +scan_keyring( PKT_public_cert *pkc, u32 *keyid, const char *name, const char *filename ) { int rc=0; @@ -311,7 +311,7 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, PACKET pkt; int save_mode; u32 akeyid[2]; - PKT_pubkey_cert *last_pk = NULL; + PKT_public_cert *last_pk = NULL; assert( !keyid || !name ); @@ -338,34 +338,34 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, while( (rc=parse_packet(a, &pkt)) != -1 ) { if( rc ) ; /* e.g. unknown packet */ - else if( keyid && found && pkt.pkttype == PKT_PUBKEY_CERT ) { + else if( keyid && found && pkt.pkttype == PKT_PUBLIC_CERT ) { log_error("Hmmm, pubkey without an user id in '%s'\n", filename); goto leave; } - else if( keyid && pkt.pkttype == PKT_PUBKEY_CERT ) { - switch( pkt.pkt.pubkey_cert->pubkey_algo ) { + else if( keyid && pkt.pkttype == PKT_PUBLIC_CERT ) { + switch( pkt.pkt.public_cert->pubkey_algo ) { case PUBKEY_ALGO_ELGAMAL: case PUBKEY_ALGO_RSA: - keyid_from_pkc( pkt.pkt.pubkey_cert, akeyid ); + keyid_from_pkc( pkt.pkt.public_cert, akeyid ); if( akeyid[0] == keyid[0] && akeyid[1] == keyid[1] ) { - copy_pubkey_cert( pkc, pkt.pkt.pubkey_cert ); + copy_public_cert( pkc, pkt.pkt.public_cert ); found++; } break; default: log_error("cannot handle pubkey algo %d\n", - pkt.pkt.pubkey_cert->pubkey_algo); + pkt.pkt.public_cert->pubkey_algo); } } else if( keyid && found && pkt.pkttype == PKT_USER_ID ) { cache_user_id( pkt.pkt.user_id, keyid ); goto leave; } - else if( name && pkt.pkttype == PKT_PUBKEY_CERT ) { + else if( name && pkt.pkttype == PKT_PUBLIC_CERT ) { if( last_pk ) - free_pubkey_cert(last_pk); - last_pk = pkt.pkt.pubkey_cert; - pkt.pkt.pubkey_cert = NULL; + free_public_cert(last_pk); + last_pk = pkt.pkt.public_cert; + pkt.pkt.public_cert = NULL; } else if( name && pkt.pkttype == PKT_USER_ID ) { if( memistr( pkt.pkt.user_id->name, pkt.pkt.user_id->len, name )) { @@ -378,16 +378,16 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, pkt.pkt.user_id->len, pkt.pkt.user_id->name, pkc->pubkey_algo, last_pk->pubkey_algo ); else { - copy_pubkey_cert( pkc, last_pk ); + copy_public_cert( pkc, last_pk ); goto leave; } } } - else if( !keyid && !name && pkt.pkttype == PKT_PUBKEY_CERT ) { + else if( !keyid && !name && pkt.pkttype == PKT_PUBLIC_CERT ) { if( last_pk ) - free_pubkey_cert(last_pk); - last_pk = pkt.pkt.pubkey_cert; - pkt.pkt.pubkey_cert = NULL; + free_public_cert(last_pk); + last_pk = pkt.pkt.public_cert; + pkt.pkt.public_cert = NULL; } else if( !keyid && !name && pkt.pkttype == PKT_USER_ID ) { if( !last_pk ) @@ -399,7 +399,7 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, keyid_from_pkc( last_pk, akeyid ); cache_user_id( pkt.pkt.user_id, akeyid ); } - cache_pubkey_cert( last_pk ); + cache_public_cert( last_pk ); } } free_packet(&pkt); @@ -408,7 +408,7 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, leave: if( last_pk ) - free_pubkey_cert(last_pk); + free_public_cert(last_pk); free_packet(&pkt); iobuf_close(a); set_packet_list_mode(save_mode); @@ -422,7 +422,7 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, * PKT returns the secret key certificate. */ static int -scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, +scan_secret_keyring( PKT_secret_cert *skc, u32 *keyid, const char *name, const char *filename ) { int rc=0; @@ -431,7 +431,7 @@ scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, PACKET pkt; int save_mode; u32 akeyid[2]; - PKT_seckey_cert *last_pk = NULL; + PKT_secret_cert *last_pk = NULL; assert( !keyid || !name ); @@ -445,33 +445,33 @@ scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, while( (rc=parse_packet(a, &pkt)) != -1 ) { if( rc ) ; /* e.g. unknown packet */ - else if( keyid && found && pkt.pkttype == PKT_SECKEY_CERT ) { + else if( keyid && found && pkt.pkttype == PKT_SECRET_CERT ) { log_error("Hmmm, seckey without an user id in '%s'\n", filename); goto leave; } - else if( keyid && pkt.pkttype == PKT_SECKEY_CERT ) { - switch( pkt.pkt.seckey_cert->pubkey_algo ) { + else if( keyid && pkt.pkttype == PKT_SECRET_CERT ) { + switch( pkt.pkt.secret_cert->pubkey_algo ) { case PUBKEY_ALGO_ELGAMAL: case PUBKEY_ALGO_RSA: - keyid_from_skc( pkt.pkt.seckey_cert, akeyid ); + keyid_from_skc( pkt.pkt.secret_cert, akeyid ); if( akeyid[0] == keyid[0] && akeyid[1] == keyid[1] ) { - copy_seckey_cert( skc, pkt.pkt.seckey_cert ); + copy_secret_cert( skc, pkt.pkt.secret_cert ); found++; } break; default: log_error("cannot handle pubkey algo %d\n", - pkt.pkt.seckey_cert->pubkey_algo); + pkt.pkt.secret_cert->pubkey_algo); } } else if( keyid && found && pkt.pkttype == PKT_USER_ID ) { goto leave; } - else if( name && pkt.pkttype == PKT_SECKEY_CERT ) { + else if( name && pkt.pkttype == PKT_SECRET_CERT ) { if( last_pk ) - free_seckey_cert(last_pk); - last_pk = pkt.pkt.seckey_cert; - pkt.pkt.seckey_cert = NULL; + free_secret_cert(last_pk); + last_pk = pkt.pkt.secret_cert; + pkt.pkt.secret_cert = NULL; } else if( name && pkt.pkttype == PKT_USER_ID ) { if( memistr( pkt.pkt.user_id->name, pkt.pkt.user_id->len, name )) { @@ -484,16 +484,16 @@ scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, pkt.pkt.user_id->len, pkt.pkt.user_id->name, skc->pubkey_algo, last_pk->pubkey_algo ); else { - copy_seckey_cert( skc, last_pk ); + copy_secret_cert( skc, last_pk ); goto leave; } } } - else if( !keyid && !name && pkt.pkttype == PKT_SECKEY_CERT ) { + else if( !keyid && !name && pkt.pkttype == PKT_SECRET_CERT ) { if( last_pk ) - free_seckey_cert(last_pk); - last_pk = pkt.pkt.seckey_cert; - pkt.pkt.seckey_cert = NULL; + free_secret_cert(last_pk); + last_pk = pkt.pkt.secret_cert; + pkt.pkt.secret_cert = NULL; } else if( !keyid && !name && pkt.pkttype == PKT_USER_ID ) { if( !last_pk ) @@ -513,7 +513,7 @@ scan_secret_keyring( PKT_seckey_cert *skc, u32 *keyid, leave: if( last_pk ) - free_seckey_cert(last_pk); + free_secret_cert(last_pk); free_packet(&pkt); iobuf_close(a); set_packet_list_mode(save_mode); @@ -545,4 +545,26 @@ get_user_id_string( u32 *keyid ) return p; } +char* +get_user_id( u32 *keyid, size_t *rn ) +{ + user_id_db_t r; + char *p; + int pass=0; + /* try it two times; second pass reads from keyrings */ + do { + for(r=user_id_db; r; r = r->next ) + if( r->keyid[0] == keyid[0] && r->keyid[1] == keyid[1] ) { + p = m_alloc( r->len ); + memcpy(p, r->name, r->len ); + *rn = r->len; + return p; + } + } while( ++pass < 2 && !get_pubkey( NULL, keyid ) ); + p = m_alloc( 19 ); + memcpy(p, "[User id not found]", 19 ); + *rn = 19; + return p; +} + |