/**************** * Return a malloced string with a default reciepient if there is any */ static char * default_recipient(void) { PKT_secret_key *sk; byte fpr[MAX_FINGERPRINT_LEN+1]; size_t n; char *p; int i; if( opt.def_recipient ) return xstrdup( opt.def_recipient ); if( !opt.def_recipient_self ) return NULL; sk = xmalloc_clear( sizeof *sk ); i = get_seckey_byname( sk, NULL, 0 ); if( i ) { free_secret_key( sk ); return NULL; } n = MAX_FINGERPRINT_LEN; fingerprint_from_sk( sk, fpr, &n ); free_secret_key( sk ); p = xmalloc( 2*n+3 ); *p++ = '0'; *p++ = 'x'; for(i=0; i < n; i++ ) sprintf( p+2*i, "%02X", fpr[i] ); p -= 2; return p; }
int build_sk_list( strlist_t locusr, SK_LIST *ret_sk_list, int unlock, unsigned int use ) { SK_LIST sk_list = NULL; int rc; if( !locusr ) { /* use the default one */ PKT_secret_key *sk; sk = xmalloc_clear( sizeof *sk ); sk->req_usage = use; if( (rc = get_seckey_byname( sk, NULL, unlock )) ) { free_secret_key( sk ); sk = NULL; log_error("no default secret key: %s\n", g10_errstr(rc) ); write_status_text (STATUS_INV_SGNR, get_inv_recpsgnr_code (GPG_ERR_NO_SECKEY)); } else if( !(rc=openpgp_pk_test_algo2 (sk->pubkey_algo, use)) ) { SK_LIST r; if( random_is_faked() && !is_insecure( sk ) ) { log_info(_("key is not flagged as insecure - " "can't use it with the faked RNG!\n")); free_secret_key( sk ); sk = NULL; write_status_text (STATUS_INV_SGNR, get_inv_recpsgnr_code (GPG_ERR_NOT_TRUSTED)); } else { r = xmalloc( sizeof *r ); r->sk = sk; sk = NULL; r->next = sk_list; r->mark = 0; sk_list = r; } } else { free_secret_key( sk ); sk = NULL; log_error("invalid default secret key: %s\n", g10_errstr(rc) ); write_status_text (STATUS_INV_SGNR, get_inv_recpsgnr_code (rc)); } } else { strlist_t locusr_orig = locusr; for(; locusr; locusr = locusr->next ) { PKT_secret_key *sk; rc = 0; /* Do an early check agains duplicated entries. However this * won't catch all duplicates because the user IDs may be * specified in different ways. */ if ( is_duplicated_entry ( locusr_orig, locusr ) ) { log_info (_("skipped \"%s\": duplicated\n"), locusr->d ); continue; } sk = xmalloc_clear( sizeof *sk ); sk->req_usage = use; if( (rc = get_seckey_byname( sk, locusr->d, 0 )) ) { free_secret_key( sk ); sk = NULL; log_error(_("skipped \"%s\": %s\n"), locusr->d, g10_errstr(rc) ); write_status_text_and_buffer (STATUS_INV_SGNR, get_inv_recpsgnr_code (rc), locusr->d, strlen (locusr->d), -1); } else if ( key_present_in_sk_list(sk_list, sk) == 0) { free_secret_key(sk); sk = NULL; log_info(_("skipped: secret key already present\n")); } else if ( unlock && (rc = check_secret_key( sk, 0 )) ) { free_secret_key( sk ); sk = NULL; log_error(_("skipped \"%s\": %s\n"), locusr->d, g10_errstr(rc) ); write_status_text_and_buffer (STATUS_INV_SGNR, get_inv_recpsgnr_code (rc), locusr->d, strlen (locusr->d), -1); } else if( !(rc=openpgp_pk_test_algo2 (sk->pubkey_algo, use)) ) { SK_LIST r; if( sk->version == 4 && (use & PUBKEY_USAGE_SIG) && sk->pubkey_algo == PUBKEY_ALGO_ELGAMAL_E ) { log_info(_("skipped \"%s\": %s\n"),locusr->d, _("this is a PGP generated Elgamal key which" " is not secure for signatures!")); free_secret_key( sk ); sk = NULL; write_status_text_and_buffer (STATUS_INV_SGNR, get_inv_recpsgnr_code (GPG_ERR_WRONG_KEY_USAGE), locusr->d, strlen (locusr->d), -1); } else if( random_is_faked() && !is_insecure( sk ) ) { log_info(_("key is not flagged as insecure - " "can't use it with the faked RNG!\n")); free_secret_key( sk ); sk = NULL; write_status_text_and_buffer (STATUS_INV_SGNR, get_inv_recpsgnr_code (GPG_ERR_NOT_TRUSTED), locusr->d, strlen (locusr->d), -1); } else { r = xmalloc( sizeof *r ); r->sk = sk; sk = NULL; r->next = sk_list; r->mark = 0; sk_list = r; } } else { free_secret_key( sk ); sk = NULL; log_error("skipped \"%s\": %s\n", locusr->d, g10_errstr(rc) ); write_status_text_and_buffer (STATUS_INV_SGNR, get_inv_recpsgnr_code (rc), locusr->d, strlen (locusr->d), -1); } } } if( !rc && !sk_list ) { log_error("no valid signators\n"); write_status_text (STATUS_NO_SGNR, "0"); rc = G10ERR_NO_USER_ID; } if( rc ) release_sk_list( sk_list ); else *ret_sk_list = sk_list; return rc; }