1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-04-17 15:44:34 +02:00

indent: Modernize g10/sign.c

--
This commit is contained in:
Werner Koch 2018-10-24 16:00:20 +02:00
parent 256a280c51
commit 3b88bceb4d
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -51,7 +51,8 @@
static int recipient_digest_algo=0; static int recipient_digest_algo=0;
/****************
/*
* Create notations and other stuff. It is assumed that the stings in * Create notations and other stuff. It is assumed that the stings in
* STRLIST are already checked to contain only printable data and have * STRLIST are already checked to contain only printable data and have
* a valid NAME=VALUE format. * a valid NAME=VALUE format.
@ -574,7 +575,7 @@ print_status_sig_created (PKT_public_key *pk, PKT_signature *sig, int what)
* Loop over the secret certificates in SK_LIST and build the one pass * Loop over the secret certificates in SK_LIST and build the one pass
* signature packets. OpenPGP says that the data should be bracket by * signature packets. OpenPGP says that the data should be bracket by
* the onepass-sig and signature-packet; so we build these onepass * the onepass-sig and signature-packet; so we build these onepass
* packet here in reverse order * packet here in reverse order.
*/ */
static int static int
write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass ) write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass )
@ -585,16 +586,16 @@ write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass )
for (skcount=0, sk_rover=sk_list; sk_rover; sk_rover = sk_rover->next) for (skcount=0, sk_rover=sk_list; sk_rover; sk_rover = sk_rover->next)
skcount++; skcount++;
for (; skcount; skcount--) { for (; skcount; skcount--)
{
PKT_public_key *pk; PKT_public_key *pk;
PKT_onepass_sig *ops; PKT_onepass_sig *ops;
PACKET pkt; PACKET pkt;
int i, rc; int i, rc;
for (i=0, sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) { for (i=0, sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next)
if (++i == skcount) if (++i == skcount)
break; break;
}
pk = sk_rover->pk; pk = sk_rover->pk;
ops = xmalloc_clear (sizeof *ops); ops = xmalloc_clear (sizeof *ops);
@ -609,7 +610,8 @@ write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass )
pkt.pkt.onepass_sig = ops; pkt.pkt.onepass_sig = ops;
rc = build_packet (out, &pkt); rc = build_packet (out, &pkt);
free_packet (&pkt, NULL); free_packet (&pkt, NULL);
if (rc) { if (rc)
{
log_error ("build onepass_sig packet failed: %s\n", log_error ("build onepass_sig packet failed: %s\n",
gpg_strerror (rc)); gpg_strerror (rc));
return rc; return rc;
@ -619,6 +621,7 @@ write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass )
return 0; return 0;
} }
/* /*
* Helper to write the plaintext (literal data) packet * Helper to write the plaintext (literal data) packet
*/ */
@ -632,7 +635,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
if (!opt.no_literal) if (!opt.no_literal)
pt = setup_plaintext_name (fname, inp); pt = setup_plaintext_name (fname, inp);
/* try to calculate the length of the data */ /* Try to calculate the length of the data. */
if ( !iobuf_is_pipe_filename (fname) && *fname) if ( !iobuf_is_pipe_filename (fname) && *fname)
{ {
off_t tmpsize; off_t tmpsize;
@ -643,9 +646,9 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
log_info (_("WARNING: '%s' is an empty file\n"), fname); log_info (_("WARNING: '%s' is an empty file\n"), fname);
/* We can't encode the length of very large files because /* We can't encode the length of very large files because
OpenPGP uses only 32 bit for file sizes. So if the size of * OpenPGP uses only 32 bit for file sizes. So if the size of a
a file is larger than 2^32 minus some bytes for packet * file is larger than 2^32 minus some bytes for packet headers,
headers, we switch to partial length encoding. */ * we switch to partial length encoding. */
if (tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536)) if (tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536))
filesize = tmpsize; filesize = tmpsize;
else else
@ -661,7 +664,8 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
else else
filesize = opt.set_filesize? opt.set_filesize : 0; /* stdin */ filesize = opt.set_filesize? opt.set_filesize : 0; /* stdin */
if (!opt.no_literal) { if (!opt.no_literal)
{
PACKET pkt; PACKET pkt;
/* Note that PT has been initialized above in no_literal mode. */ /* Note that PT has been initialized above in no_literal mode. */
@ -680,12 +684,14 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
pt->buf = NULL; pt->buf = NULL;
free_packet (&pkt, NULL); free_packet (&pkt, NULL);
} }
else { else
{
byte copy_buffer[4096]; byte copy_buffer[4096];
int bytes_copied; int bytes_copied;
while ((bytes_copied = iobuf_read (inp, copy_buffer, 4096)) != -1) while ((bytes_copied = iobuf_read (inp, copy_buffer, 4096)) != -1)
if ( (rc=iobuf_write(out, copy_buffer, bytes_copied)) ) { if ((rc = iobuf_write (out, copy_buffer, bytes_copied)))
{
log_error ("copying input to output failed: %s\n", log_error ("copying input to output failed: %s\n",
gpg_strerror (rc)); gpg_strerror (rc));
break; break;
@ -697,6 +703,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
return rc; return rc;
} }
/* /*
* Write the signatures from the SK_LIST to OUT. HASH must be a non-finalized * Write the signatures from the SK_LIST to OUT. HASH must be a non-finalized
* hash which will not be changes here. * hash which will not be changes here.
@ -782,7 +789,7 @@ write_signature_packets (ctrl_t ctrl,
} }
/**************** /*
* Sign the files whose names are in FILENAME. * Sign the files whose names are in FILENAME.
* If DETACHED has the value true, * If DETACHED has the value true,
* make a detached signature. If FILENAMES->d is NULL read from stdin * make a detached signature. If FILENAMES->d is NULL read from stdin
@ -805,7 +812,8 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
text_filter_context_t tfx; text_filter_context_t tfx;
progress_filter_context_t *pfx; progress_filter_context_t *pfx;
encrypt_filter_context_t efx; encrypt_filter_context_t efx;
IOBUF inp = NULL, out = NULL; iobuf_t inp = NULL;
iobuf_t out = NULL;
PACKET pkt; PACKET pkt;
int rc = 0; int rc = 0;
PK_LIST pk_list = NULL; PK_LIST pk_list = NULL;
@ -822,7 +830,8 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
efx.ctrl = ctrl; efx.ctrl = ctrl;
init_packet (&pkt); init_packet (&pkt);
if( filenames ) { if (filenames)
{
fname = filenames->d; fname = filenames->d;
multifile = !!filenames->next; multifile = !!filenames->next;
} }
@ -842,7 +851,7 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
duration = parse_expire_string(opt.def_sig_expire); duration = parse_expire_string(opt.def_sig_expire);
/* Note: In the old non-agent version the following call used to /* Note: In the old non-agent version the following call used to
unprotect the secret key. This is now done on demand by the agent. */ * unprotect the secret key. This is now done on demand by the agent. */
if ((rc = build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG ))) if ((rc = build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG )))
goto leave; goto leave;
@ -850,10 +859,11 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
&& (rc = build_pk_list (ctrl, remusr, &pk_list))) && (rc = build_pk_list (ctrl, remusr, &pk_list)))
goto leave; goto leave;
/* prepare iobufs */ /* Prepare iobufs. */
if (multifile) /* have list of filenames */ if (multifile) /* have list of filenames */
inp = NULL; /* we do it later */ inp = NULL; /* we do it later */
else { else
{
inp = iobuf_open(fname); inp = iobuf_open(fname);
if (inp && is_secured_file (iobuf_get_fd (inp))) if (inp && is_secured_file (iobuf_get_fd (inp)))
{ {
@ -872,8 +882,10 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
handle_progress (pfx, inp, fname); handle_progress (pfx, inp, fname);
} }
if( outfile ) { if (outfile)
if (is_secured_filename ( outfile )) { {
if (is_secured_filename (outfile))
{
out = NULL; out = NULL;
gpg_err_set_errno (EPERM); gpg_err_set_errno (EPERM);
} }
@ -882,7 +894,7 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
if (!out) if (!out)
{ {
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error(_("can't create '%s': %s\n"), outfile, strerror(errno) ); log_error (_("can't create '%s': %s\n"), outfile, gpg_strerror (rc));
goto leave; goto leave;
} }
else if (opt.verbose) else if (opt.verbose)
@ -890,9 +902,11 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
} }
else if ((rc = open_outfile (-1, fname, else if ((rc = open_outfile (-1, fname,
opt.armor? 1 : detached? 2 : 0, 0, &out))) opt.armor? 1 : detached? 2 : 0, 0, &out)))
{
goto leave; goto leave;
}
/* prepare to calculate the MD over the input */ /* Prepare to calculate the MD over the input. */
if (opt.textmode && !outfile && !multifile) if (opt.textmode && !outfile && !multifile)
{ {
memset (&tfx, 0, sizeof tfx); memset (&tfx, 0, sizeof tfx);
@ -905,64 +919,64 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
gcry_md_debug (mfx.md, "sign"); gcry_md_debug (mfx.md, "sign");
/* If we're encrypting and signing, it is reasonable to pick the /* If we're encrypting and signing, it is reasonable to pick the
hash algorithm to use out of the recipient key prefs. This is * hash algorithm to use out of the recipient key prefs. This is
best effort only, as in a DSA2 and smartcard world there are * best effort only, as in a DSA2 and smartcard world there are
cases where we cannot please everyone with a single hash (DSA2 * cases where we cannot please everyone with a single hash (DSA2
wants >160 and smartcards want =160). In the future this could * wants >160 and smartcards want =160). In the future this could
be more complex with different hashes for each sk, but the * be more complex with different hashes for each sk, but the
current design requires a single hash for all SKs. */ * current design requires a single hash for all SKs. */
if (pk_list) if (pk_list)
{ {
if (opt.def_digest_algo) if (opt.def_digest_algo)
{ {
if(!opt.expert && if (!opt.expert
select_algo_from_prefs(pk_list,PREFTYPE_HASH, && select_algo_from_prefs (pk_list,PREFTYPE_HASH,
opt.def_digest_algo, opt.def_digest_algo,
NULL) != opt.def_digest_algo) NULL) != opt.def_digest_algo)
{
log_info (_("WARNING: forcing digest algorithm %s (%d)" log_info (_("WARNING: forcing digest algorithm %s (%d)"
" violates recipient preferences\n"), " violates recipient preferences\n"),
gcry_md_algo_name (opt.def_digest_algo), gcry_md_algo_name (opt.def_digest_algo),
opt.def_digest_algo); opt.def_digest_algo);
} }
}
else else
{ {
int algo, smartcard=0; int algo;
int smartcard=0;
union pref_hint hint; union pref_hint hint;
hint.digest_length = 0; hint.digest_length = 0;
/* Of course, if the recipient asks for something /* Of course, if the recipient asks for something
unreasonable (like the wrong hash for a DSA key) then * unreasonable (like the wrong hash for a DSA key) then
don't do it. Check all sk's - if any are DSA or live * don't do it. Check all sk's - if any are DSA or live
on a smartcard, then the hash has restrictions and we * on a smartcard, then the hash has restrictions and we
may not be able to give the recipient what they want. * may not be able to give the recipient what they want.
For DSA, pass a hint for the largest q we have. Note * For DSA, pass a hint for the largest q we have. Note
that this means that a q>160 key will override a q=160 * that this means that a q>160 key will override a q=160
key and force the use of truncation for the q=160 key. * key and force the use of truncation for the q=160 key.
The alternative would be to ignore the recipient prefs * The alternative would be to ignore the recipient prefs
completely and get a different hash for each DSA key in * completely and get a different hash for each DSA key in
hash_for(). The override behavior here is more or less * hash_for(). The override behavior here is more or less
reasonable as it is under the control of the user which * reasonable as it is under the control of the user which
keys they sign with for a given message and the fact * keys they sign with for a given message and the fact
that the message with multiple signatures won't be * that the message with multiple signatures won't be
usable on an implementation that doesn't understand * usable on an implementation that doesn't understand
DSA2 anyway. */ * DSA2 anyway. */
for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next )
{ {
if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_DSA if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_DSA
|| sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA) || sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA)
{ {
int temp_hashlen = (gcry_mpi_get_nbits int temp_hashlen = gcry_mpi_get_nbits (sk_rover->pk->pkey[1]);
(sk_rover->pk->pkey[1]));
if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA) if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA)
temp_hashlen = ecdsa_qbits_from_Q (temp_hashlen); temp_hashlen = ecdsa_qbits_from_Q (temp_hashlen);
temp_hashlen = (temp_hashlen+7)/8; temp_hashlen = (temp_hashlen+7)/8;
/* Pick a hash that is large enough for our /* Pick a hash that is large enough for our largest Q */
largest q */
if (hint.digest_length < temp_hashlen) if (hint.digest_length < temp_hashlen)
hint.digest_length = temp_hashlen; hint.digest_length = temp_hashlen;
} }
@ -973,18 +987,19 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
} }
/* Current smartcards only do 160-bit hashes. If we have /* Current smartcards only do 160-bit hashes. If we have
to have a >160-bit hash, then we can't use the * to have a >160-bit hash, then we can't use the
recipient prefs as we'd need both =160 and >160 at the * recipient prefs as we'd need both =160 and >160 at the
same time and recipient prefs currently require a * same time and recipient prefs currently require a
single hash for all signatures. All this may well have * single hash for all signatures. All this may well have
to change as the cards add algorithms. */ * to change as the cards add algorithms. */
if ((!smartcard || (smartcard && hint.digest_length==20))
if (!smartcard || (smartcard && hint.digest_length==20)) && ((algo = select_algo_from_prefs (pk_list, PREFTYPE_HASH,
if ( (algo= -1, &hint)) > 0))
select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hint)) > 0) {
recipient_digest_algo = algo; recipient_digest_algo = algo;
} }
} }
}
for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next) for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next)
gcry_md_enable (mfx.md, hash_for (sk_rover->pk)); gcry_md_enable (mfx.md, hash_for (sk_rover->pk));
@ -998,7 +1013,8 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
if (opt.armor && !outfile) if (opt.armor && !outfile)
push_armor_filter (afx, out); push_armor_filter (afx, out);
if( encryptflag ) { if (encryptflag)
{
efx.pk_list = pk_list; efx.pk_list = pk_list;
/* fixme: set efx.cfx.datalen if known */ /* fixme: set efx.cfx.datalen if known */
iobuf_push_filter (out, encrypt_filter, &efx); iobuf_push_filter (out, encrypt_filter, &efx);
@ -1012,30 +1028,34 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
if (compr_algo==-1) if (compr_algo==-1)
{ {
/* If we're not encrypting, then select_algo_from_prefs /* If we're not encrypting, then select_algo_from_prefs
will fail and we'll end up with the default. If we are * will fail and we'll end up with the default. If we are
encrypting, select_algo_from_prefs cannot fail since * encrypting, select_algo_from_prefs cannot fail since
there is an assumed preference for uncompressed data. * there is an assumed preference for uncompressed data.
Still, if it did fail, we'll also end up with the * Still, if it did fail, we'll also end up with the
default. */ * default. */
if ((compr_algo = select_algo_from_prefs (pk_list, PREFTYPE_ZIP,
if((compr_algo= -1, NULL)) == -1)
select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1) {
compr_algo = default_compress_algo(); compr_algo = default_compress_algo();
} }
}
else if (!opt.expert && pk_list else if (!opt.expert && pk_list
&& select_algo_from_prefs (pk_list, PREFTYPE_ZIP, && select_algo_from_prefs (pk_list, PREFTYPE_ZIP,
compr_algo, NULL) != compr_algo) compr_algo, NULL) != compr_algo)
{
log_info (_("WARNING: forcing compression algorithm %s (%d)" log_info (_("WARNING: forcing compression algorithm %s (%d)"
" violates recipient preferences\n"), " violates recipient preferences\n"),
compress_algo_to_string (compr_algo), compr_algo); compress_algo_to_string (compr_algo), compr_algo);
}
/* algo 0 means no compression */ /* Algo 0 means no compression. */
if (compr_algo) if (compr_algo)
push_compress_filter (out, &zfx, compr_algo); push_compress_filter (out, &zfx, compr_algo);
} }
/* Write the one-pass signature packets if needed */ /* Write the one-pass signature packets if needed */
if (!detached) { if (!detached)
{
rc = write_onepass_sig_packets (sk_list, out, rc = write_onepass_sig_packets (sk_list, out,
opt.textmode && !outfile ? 0x01:0x00); opt.textmode && !outfile ? 0x01:0x00);
if (rc) if (rc)
@ -1045,15 +1065,19 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
write_status_begin_signing (mfx.md); write_status_begin_signing (mfx.md);
/* Setup the inner packet. */ /* Setup the inner packet. */
if( detached ) { if (detached)
if( multifile ) { {
if (multifile)
{
strlist_t sl; strlist_t sl;
if (opt.verbose) if (opt.verbose)
log_info (_("signing:") ); log_info (_("signing:") );
/* must walk reverse trough this list */ /* Must walk reverse trough this list. */
for( sl = strlist_last(filenames); sl; for (sl = strlist_last(filenames);
sl = strlist_prev( filenames, sl ) ) { sl;
sl = strlist_prev( filenames, sl))
{
inp = iobuf_open (sl->d); inp = iobuf_open (sl->d);
if (inp && is_secured_file (iobuf_get_fd (inp))) if (inp && is_secured_file (iobuf_get_fd (inp)))
{ {
@ -1065,7 +1089,7 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
{ {
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error (_("can't open '%s': %s\n"), log_error (_("can't open '%s': %s\n"),
sl->d,strerror(errno)); sl->d, gpg_strerror (rc));
goto leave; goto leave;
} }
handle_progress (pfx, inp, sl->d); handle_progress (pfx, inp, sl->d);
@ -1079,28 +1103,31 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
iobuf_push_filter (inp, md_filter, &mfx); iobuf_push_filter (inp, md_filter, &mfx);
while (iobuf_get (inp) != -1) while (iobuf_get (inp) != -1)
; ;
iobuf_close(inp); inp = NULL; iobuf_close (inp);
inp = NULL;
} }
if (opt.verbose) if (opt.verbose)
log_printf ("\n"); log_printf ("\n");
} }
else { else
/* read, so that the filter can calculate the digest */ {
/* Read, so that the filter can calculate the digest. */
while (iobuf_get(inp) != -1) while (iobuf_get(inp) != -1)
; ;
} }
} }
else { else
{
rc = write_plaintext_packet (out, inp, fname, rc = write_plaintext_packet (out, inp, fname,
opt.textmode && !outfile ? (opt.textmode && !outfile) ?
(opt.mimemode? 'm' : 't') : 'b'); (opt.mimemode? 'm' : 't') : 'b');
} }
/* catch errors from above */ /* Catch errors from above. */
if (rc) if (rc)
goto leave; goto leave;
/* write the signatures */ /* Write the signatures. */
rc = write_signature_packets (ctrl, sk_list, out, mfx.md, rc = write_signature_packets (ctrl, sk_list, out, mfx.md,
opt.textmode && !outfile? 0x01 : 0x00, opt.textmode && !outfile? 0x01 : 0x00,
0, duration, detached ? 'D':'S', NULL); 0, duration, detached ? 'D':'S', NULL);
@ -1111,7 +1138,8 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
leave: leave:
if (rc) if (rc)
iobuf_cancel (out); iobuf_cancel (out);
else { else
{
iobuf_close (out); iobuf_close (out);
if (encryptflag) if (encryptflag)
write_status (STATUS_END_ENCRYPTION); write_status (STATUS_END_ENCRYPTION);
@ -1127,9 +1155,8 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
} }
/*
/**************** * Make a clear signature. Note that opt.armor is not needed.
* make a clear signature. note that opt.armor is not needed
*/ */
int int
clearsign_file (ctrl_t ctrl, clearsign_file (ctrl_t ctrl,
@ -1138,7 +1165,8 @@ clearsign_file (ctrl_t ctrl,
armor_filter_context_t *afx; armor_filter_context_t *afx;
progress_filter_context_t *pfx; progress_filter_context_t *pfx;
gcry_md_hd_t textmd = NULL; gcry_md_hd_t textmd = NULL;
IOBUF inp = NULL, out = NULL; iobuf_t inp = NULL;
iobuf_t out = NULL;
PACKET pkt; PACKET pkt;
int rc = 0; int rc = 0;
SK_LIST sk_list = NULL; SK_LIST sk_list = NULL;
@ -1155,11 +1183,11 @@ clearsign_file (ctrl_t ctrl,
duration = parse_expire_string (opt.def_sig_expire); duration = parse_expire_string (opt.def_sig_expire);
/* Note: In the old non-agent version the following call used to /* Note: In the old non-agent version the following call used to
unprotect the secret key. This is now done on demand by the agent. */ * unprotect the secret key. This is now done on demand by the agent. */
if ((rc=build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG))) if ((rc=build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG)))
goto leave; goto leave;
/* prepare iobufs */ /* Prepare iobufs. */
inp = iobuf_open (fname); inp = iobuf_open (fname);
if (inp && is_secured_file (iobuf_get_fd (inp))) if (inp && is_secured_file (iobuf_get_fd (inp)))
{ {
@ -1167,32 +1195,39 @@ clearsign_file (ctrl_t ctrl,
inp = NULL; inp = NULL;
gpg_err_set_errno (EPERM); gpg_err_set_errno (EPERM);
} }
if( !inp ) { if (!inp)
{
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error (_("can't open '%s': %s\n"), log_error (_("can't open '%s': %s\n"),
fname? fname: "[stdin]", strerror(errno) ); fname? fname: "[stdin]", gpg_strerror (rc));
goto leave; goto leave;
} }
handle_progress (pfx, inp, fname); handle_progress (pfx, inp, fname);
if( outfile ) { if (outfile)
if (is_secured_filename (outfile) ) { {
if (is_secured_filename (outfile))
{
outfile = NULL; outfile = NULL;
gpg_err_set_errno (EPERM); gpg_err_set_errno (EPERM);
} }
else else
out = iobuf_create (outfile, 0); out = iobuf_create (outfile, 0);
if (!out) if (!out)
{ {
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error(_("can't create '%s': %s\n"), outfile, strerror(errno) ); log_error (_("can't create '%s': %s\n"), outfile, gpg_strerror (rc));
goto leave; goto leave;
} }
else if (opt.verbose) else if (opt.verbose)
log_info (_("writing to '%s'\n"), outfile); log_info (_("writing to '%s'\n"), outfile);
} }
else if ((rc = open_outfile (-1, fname, 1, 0, &out))) else if ((rc = open_outfile (-1, fname, 1, 0, &out)))
{
goto leave; goto leave;
}
iobuf_writestr (out, "-----BEGIN PGP SIGNED MESSAGE-----" LF); iobuf_writestr (out, "-----BEGIN PGP SIGNED MESSAGE-----" LF);
@ -1203,12 +1238,15 @@ clearsign_file (ctrl_t ctrl,
memset (hashs_seen, 0, sizeof hashs_seen); memset (hashs_seen, 0, sizeof hashs_seen);
iobuf_writestr (out, "Hash: " ); iobuf_writestr (out, "Hash: " );
for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) { for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next)
{
int i = hash_for (sk_rover->pk); int i = hash_for (sk_rover->pk);
if( !hashs_seen[ i & 0xff ] ) { if (!hashs_seen[ i & 0xff ])
{
s = gcry_md_algo_name (i); s = gcry_md_algo_name (i);
if( s ) { if (s)
{
hashs_seen[ i & 0xff ] = 1; hashs_seen[ i & 0xff ] = 1;
if (any) if (any)
iobuf_put (out, ','); iobuf_put (out, ',');
@ -1235,11 +1273,10 @@ clearsign_file (ctrl_t ctrl,
if (DBG_HASHING) if (DBG_HASHING)
gcry_md_debug (textmd, "clearsign"); gcry_md_debug (textmd, "clearsign");
copy_clearsig_text (out, inp, textmd, !opt.not_dash_escaped, copy_clearsig_text (out, inp, textmd, !opt.not_dash_escaped, opt.escape_from);
opt.escape_from);
/* fixme: check for read errors */ /* fixme: check for read errors */
/* now write the armor */ /* Now write the armor. */
afx->what = 2; afx->what = 2;
push_armor_filter (afx, out); push_armor_filter (afx, out);
@ -1262,6 +1299,7 @@ clearsign_file (ctrl_t ctrl,
return rc; return rc;
} }
/* /*
* Sign and conventionally encrypt the given file. * Sign and conventionally encrypt the given file.
* FIXME: Far too much code is duplicated - revamp the whole file. * FIXME: Far too much code is duplicated - revamp the whole file.
@ -1275,7 +1313,8 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
md_filter_context_t mfx; md_filter_context_t mfx;
text_filter_context_t tfx; text_filter_context_t tfx;
cipher_filter_context_t cfx; cipher_filter_context_t cfx;
IOBUF inp = NULL, out = NULL; iobuf_t inp = NULL;
iobuf_t out = NULL;
PACKET pkt; PACKET pkt;
STRING2KEY *s2k = NULL; STRING2KEY *s2k = NULL;
int rc = 0; int rc = 0;
@ -1299,12 +1338,12 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
duration = parse_expire_string (opt.def_sig_expire); duration = parse_expire_string (opt.def_sig_expire);
/* Note: In the old non-agent version the following call used to /* Note: In the old non-agent version the following call used to
unprotect the secret key. This is now done on demand by the agent. */ * unprotect the secret key. This is now done on demand by the agent. */
rc = build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG); rc = build_sk_list (ctrl, locusr, &sk_list, PUBKEY_USAGE_SIG);
if (rc) if (rc)
goto leave; goto leave;
/* prepare iobufs */ /* Prepare iobufs. */
inp = iobuf_open (fname); inp = iobuf_open (fname);
if (inp && is_secured_file (iobuf_get_fd (inp))) if (inp && is_secured_file (iobuf_get_fd (inp)))
{ {
@ -1312,15 +1351,16 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
inp = NULL; inp = NULL;
gpg_err_set_errno (EPERM); gpg_err_set_errno (EPERM);
} }
if( !inp ) { if (!inp)
{
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error (_("can't open '%s': %s\n"), log_error (_("can't open '%s': %s\n"),
fname? fname: "[stdin]", strerror(errno) ); fname? fname: "[stdin]", gpg_strerror (rc));
goto leave; goto leave;
} }
handle_progress (pfx, inp, fname); handle_progress (pfx, inp, fname);
/* prepare key */ /* Prepare key. */
s2k = xmalloc_clear (sizeof *s2k); s2k = xmalloc_clear (sizeof *s2k);
s2k->mode = opt.s2k_mode; s2k->mode = opt.s2k_mode;
s2k->hash_algo = S2K_DIGEST_ALGO; s2k->hash_algo = S2K_DIGEST_ALGO;
@ -1328,7 +1368,8 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
algo = default_cipher_algo (); algo = default_cipher_algo ();
cfx.dek = passphrase_to_dek (algo, s2k, 1, 1, NULL, &canceled); cfx.dek = passphrase_to_dek (algo, s2k, 1, 1, NULL, &canceled);
if (!cfx.dek || !cfx.dek->keylen) { if (!cfx.dek || !cfx.dek->keylen)
{
rc = gpg_error (canceled?GPG_ERR_CANCELED:GPG_ERR_BAD_PASSPHRASE); rc = gpg_error (canceled?GPG_ERR_CANCELED:GPG_ERR_BAD_PASSPHRASE);
log_error (_("error creating passphrase: %s\n"), gpg_strerror (rc)); log_error (_("error creating passphrase: %s\n"), gpg_strerror (rc));
goto leave; goto leave;
@ -1344,12 +1385,12 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
cfx.dek->use_aead? openpgp_aead_algo_name (cfx.dek->use_aead) cfx.dek->use_aead? openpgp_aead_algo_name (cfx.dek->use_aead)
/**/ : "CFB"); /**/ : "CFB");
/* now create the outfile */ /* Now create the outfile. */
rc = open_outfile (-1, fname, opt.armor? 1:0, 0, &out); rc = open_outfile (-1, fname, opt.armor? 1:0, 0, &out);
if (rc) if (rc)
goto leave; goto leave;
/* prepare to calculate the MD over the input */ /* Prepare to calculate the MD over the input. */
if (opt.textmode) if (opt.textmode)
iobuf_push_filter (inp, text_filter, &tfx); iobuf_push_filter (inp, text_filter, &tfx);
if (gcry_md_open (&mfx.md, 0, 0)) if (gcry_md_open (&mfx.md, 0, 0))
@ -1370,6 +1411,7 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
/* (current filters: armor)*/ /* (current filters: armor)*/
{ {
PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc ); PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc );
enc->version = 4; enc->version = 4;
enc->cipher_algo = cfx.dek->algo; enc->cipher_algo = cfx.dek->algo;
enc->s2k = *s2k; enc->s2k = *s2k;
@ -1396,21 +1438,20 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
/* Write the one-pass signature packets */ /* Write the one-pass signature packets */
/* (current filters: zip - encrypt - armor) */ /* (current filters: zip - encrypt - armor) */
rc = write_onepass_sig_packets (sk_list, out, rc = write_onepass_sig_packets (sk_list, out, opt.textmode? 0x01:0x00);
opt.textmode? 0x01:0x00);
if (rc) if (rc)
goto leave; goto leave;
write_status_begin_signing (mfx.md); write_status_begin_signing (mfx.md);
/* Pipe data through all filters; i.e. write the signed stuff */ /* Pipe data through all filters; i.e. write the signed stuff. */
/* (current filters: zip - encrypt - armor) */ /* (current filters: zip - encrypt - armor) */
rc = write_plaintext_packet (out, inp, fname, rc = write_plaintext_packet (out, inp, fname,
opt.textmode ? (opt.mimemode?'m':'t'):'b'); opt.textmode ? (opt.mimemode?'m':'t'):'b');
if (rc) if (rc)
goto leave; goto leave;
/* Write the signatures */ /* Write the signatures. */
/* (current filters: zip - encrypt - armor) */ /* (current filters: zip - encrypt - armor) */
rc = write_signature_packets (ctrl, sk_list, out, mfx.md, rc = write_signature_packets (ctrl, sk_list, out, mfx.md,
opt.textmode? 0x01 : 0x00, opt.textmode? 0x01 : 0x00,
@ -1422,7 +1463,8 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
leave: leave:
if (rc) if (rc)
iobuf_cancel (out); iobuf_cancel (out);
else { else
{
iobuf_close (out); iobuf_close (out);
write_status (STATUS_END_ENCRYPTION); write_status (STATUS_END_ENCRYPTION);
} }
@ -1437,7 +1479,7 @@ sign_symencrypt_file (ctrl_t ctrl, const char *fname, strlist_t locusr)
} }
/**************** /*
* Create a v4 signature in *RET_SIG. * Create a v4 signature in *RET_SIG.
* *
* PK is the primary key to sign (required for all sigs) * PK is the primary key to sign (required for all sigs)
@ -1488,12 +1530,11 @@ make_keysig_packet (ctrl_t ctrl,
if (!digest_algo) if (!digest_algo)
{ {
/* Basically, this means use SHA1 always unless the user /* Basically, this means use SHA1 always unless the user
specified something (use whatever they said), or it's DSA * specified something (use whatever they said), or it's DSA
(use the best match). They still can't pick an * (use the best match). They still can't pick an inappropriate
inappropriate hash for DSA or the signature will fail. * hash for DSA or the signature will fail. Note that this
Note that this still allows the caller of * still allows the caller of make_keysig_packet to override the
make_keysig_packet to override the user setting if it * user setting if it must. */
must. */
if (opt.cert_digest_algo) if (opt.cert_digest_algo)
digest_algo = opt.cert_digest_algo; digest_algo = opt.cert_digest_algo;
@ -1520,15 +1561,15 @@ make_keysig_packet (ctrl_t ctrl,
if (sigclass == 0x18 || sigclass == 0x19 || sigclass == 0x28) if (sigclass == 0x18 || sigclass == 0x19 || sigclass == 0x28)
{ {
/* hash the subkey binding/backsig/revocation */ /* Hash the subkey binding/backsig/revocation. */
hash_public_key (md, subpk); hash_public_key (md, subpk);
} }
else if (sigclass != 0x1F && sigclass != 0x20) else if (sigclass != 0x1F && sigclass != 0x20)
{ {
/* hash the user id */ /* Hash the user id. */
hash_uid (md, sigversion, uid); hash_uid (md, sigversion, uid);
} }
/* and make the signature packet */ /* Make the signature packet. */
sig = xmalloc_clear (sizeof *sig); sig = xmalloc_clear (sizeof *sig);
sig->version = sigversion; sig->version = sigversion;
sig->flags.exportable = 1; sig->flags.exportable = 1;
@ -1536,10 +1577,7 @@ make_keysig_packet (ctrl_t ctrl,
keyid_from_pk (pksk, sig->keyid); keyid_from_pk (pksk, sig->keyid);
sig->pubkey_algo = pksk->pubkey_algo; sig->pubkey_algo = pksk->pubkey_algo;
sig->digest_algo = digest_algo; sig->digest_algo = digest_algo;
if(timestamp) sig->timestamp = timestamp? timestamp : make_timestamp ();
sig->timestamp=timestamp;
else
sig->timestamp=make_timestamp();
if (duration) if (duration)
sig->expiredate = sig->timestamp + duration; sig->expiredate = sig->timestamp + duration;
sig->sig_class = sigclass; sig->sig_class = sigclass;
@ -1548,15 +1586,15 @@ make_keysig_packet (ctrl_t ctrl,
mk_notation_policy_etc (sig, pk, pksk); mk_notation_policy_etc (sig, pk, pksk);
/* Crucial that the call to mksubpkt comes LAST before the calls /* Crucial that the call to mksubpkt comes LAST before the calls
to finalize the sig as that makes it possible for the mksubpkt * to finalize the sig as that makes it possible for the mksubpkt
function to get a reliable pointer to the subpacket area. */ * function to get a reliable pointer to the subpacket area. */
if (mksubpkt) if (mksubpkt)
rc = (*mksubpkt)(sig, opaque); rc = (*mksubpkt)(sig, opaque);
if( !rc ) { if (!rc)
{
hash_sigversion_to_magic (md, sig); hash_sigversion_to_magic (md, sig);
gcry_md_final (md); gcry_md_final (md);
rc = complete_sig (ctrl, sig, pksk, md, cache_nonce); rc = complete_sig (ctrl, sig, pksk, md, cache_nonce);
} }
@ -1570,7 +1608,7 @@ make_keysig_packet (ctrl_t ctrl,
/**************** /*
* Create a new signature packet based on an existing one. * Create a new signature packet based on an existing one.
* Only user ID signatures are supported for now. * Only user ID signatures are supported for now.
* PK is the public key to work on. * PK is the public key to work on.
@ -1615,17 +1653,17 @@ update_keysig_packet (ctrl_t ctrl,
else else
hash_uid (md, orig_sig->version, uid); hash_uid (md, orig_sig->version, uid);
/* create a new signature packet */ /* Create a new signature packet. */
sig = copy_signature (NULL, orig_sig); sig = copy_signature (NULL, orig_sig);
sig->digest_algo = digest_algo; sig->digest_algo = digest_algo;
/* We need to create a new timestamp so that new sig expiration /* We need to create a new timestamp so that new sig expiration
calculations are done correctly... */ * calculations are done correctly... */
sig->timestamp = make_timestamp(); sig->timestamp = make_timestamp();
/* ... but we won't make a timestamp earlier than the existing /* ... but we won't make a timestamp earlier than the existing
one. */ * one. */
{ {
int tmout = 0; int tmout = 0;
while (sig->timestamp <= orig_sig->timestamp) while (sig->timestamp <= orig_sig->timestamp)
@ -1641,22 +1679,22 @@ update_keysig_packet (ctrl_t ctrl,
} }
/* Note that already expired sigs will remain expired (with a /* Note that already expired sigs will remain expired (with a
duration of 1) since build-packet.c:build_sig_subpkt_from_sig * duration of 1) since build-packet.c:build_sig_subpkt_from_sig
detects this case. */ * detects this case. */
/* Put the updated timestamp into the sig. Note that this will /* Put the updated timestamp into the sig. Note that this will
automagically lower any sig expiration dates to correctly * automagically lower any sig expiration dates to correctly
correspond to the differences in the timestamps (i.e. the * correspond to the differences in the timestamps (i.e. the
duration will shrink). */ * duration will shrink). */
build_sig_subpkt_from_sig (sig, pksk); build_sig_subpkt_from_sig (sig, pksk);
if (mksubpkt) if (mksubpkt)
rc = (*mksubpkt)(sig, opaque); rc = (*mksubpkt)(sig, opaque);
if (!rc) { if (!rc)
{
hash_sigversion_to_magic (md, sig); hash_sigversion_to_magic (md, sig);
gcry_md_final (md); gcry_md_final (md);
rc = complete_sig (ctrl, sig, pksk, md, NULL); rc = complete_sig (ctrl, sig, pksk, md, NULL);
} }