mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
gpg: Remove all support for v3 keys and always create v4-signatures.
* g10/build-packet.c (do_key): Remove support for building v3 keys. * g10/parse-packet.c (read_protected_v3_mpi): Remove. (parse_key): Remove support for v3-keys. Add dedicated warnings for v3-key packets. * g10/keyid.c (hash_public_key): Remove v3-key support. (keyid_from_pk): Ditto. (fingerprint_from_pk): Ditto. * g10/options.h (opt): Remove fields force_v3_sigs and force_v4_certs. * g10/gpg.c (cmd_and_opt_values): Remove oForceV3Sigs, oNoForceV3Sigs, oForceV4Certs, oNoForceV4Certs. (opts): Turn --force-v3-sigs, --no-force-v3-sigs, --force-v4-certs, --no-force-v4-certs int dummy options. (main): Remove setting of the force_v3_sigs force_v4_certs flags. * g10/revoke.c (gen_revoke, create_revocation): Always create v4 certs. * g10/sign.c (hash_uid): Remove support for v3-signatures (hash_sigversion_to_magic): Ditto. (only_old_style): Remove this v3-key function. (write_signature_packets): Remove support for creating v3-signatures. (sign_file): Ditto. (sign_symencrypt_file): Ditto. (clearsign_file): Ditto. Remove code to emit no Hash armor line if only v3-keys are used. (make_keysig_packet): Remove arg SIGVERSION and force using v4-signatures. Change all callers to not pass a value for this arg. Remove all v3-key related code. (update_keysig_packet): Remove v3-signature support. * g10/keyedit.c (sign_uids): Always create v4-signatures. * g10/textfilter.c (copy_clearsig_text): Remove arg pgp2mode and change caller. -- v3 keys are deprecated for about 15 years and due the severe weaknesses of MD5 it does not make any sense to keep code around to use these old and broken keys. Users who need to decrypt old messages should use gpg 1.4 and best re-encrypt them to modern standards. verification of old (i.e. PGP2) created signatures is thus also not anymore possible but such signatures have no values anyway - MD5 is just too broken. We have also kept support for v3 signatures until now. With the removal of support for v3 keys it is questionable whether it makes any sense to keep support for v3-signatures. What we do now is to keep support for verification of v3-signatures but we force the use of v4-signatures. The latter makes the --pgp6 and --pgp7 switch a bit obsolete because those PGP versions require v3-signatures for messages. These versions of PGP are also really old and not anymore maintained so they have not received any bug fixes and should not be used anyway. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
60d22d54a5
commit
8fd150b05b
@ -9,6 +9,15 @@
|
|||||||
===================
|
===================
|
||||||
GnuPG (>=1.0.3) is in compliance with RFC2440 despite these exceptions:
|
GnuPG (>=1.0.3) is in compliance with RFC2440 despite these exceptions:
|
||||||
|
|
||||||
|
* With GnuPG >= 2.1.0 all support for version 3 keys has been
|
||||||
|
removed. Thus there is no more compatibility with PGP-2. Users
|
||||||
|
who need to be able to decrypt old PGP 2 messages should use
|
||||||
|
GnuPG 1.4.x along with the option --allow-weak-digest-algos.
|
||||||
|
|
||||||
|
* With GnuPG >= 2.1.0 all signatures (on messages and keys) are
|
||||||
|
created using version 4 signatures. Support for verifying
|
||||||
|
version 3 signature is still available.
|
||||||
|
|
||||||
* (9.2) states that IDEA SHOULD be implemented. This is not done
|
* (9.2) states that IDEA SHOULD be implemented. This is not done
|
||||||
due to patent problems.
|
due to patent problems.
|
||||||
UPDATE: Since version 1.4.13 (or GnuPG 2.x with Libgcrypt 1.6)
|
UPDATE: Since version 1.4.13 (or GnuPG 2.x with Libgcrypt 1.6)
|
||||||
|
18
doc/gpg.texi
18
doc/gpg.texi
@ -2129,6 +2129,7 @@ platforms that have different line ending conventions (UNIX-like to Mac,
|
|||||||
Mac to Windows, etc). @option{--no-textmode} disables this option, and
|
Mac to Windows, etc). @option{--no-textmode} disables this option, and
|
||||||
is the default.
|
is the default.
|
||||||
|
|
||||||
|
@ifclear gpgtwoone
|
||||||
@item --force-v3-sigs
|
@item --force-v3-sigs
|
||||||
@itemx --no-force-v3-sigs
|
@itemx --no-force-v3-sigs
|
||||||
@opindex force-v3-sigs
|
@opindex force-v3-sigs
|
||||||
@ -2147,6 +2148,15 @@ Defaults to no.
|
|||||||
Always use v4 key signatures even on v3 keys. This option also
|
Always use v4 key signatures even on v3 keys. This option also
|
||||||
changes the default hash algorithm for v3 RSA keys from MD5 to SHA-1.
|
changes the default hash algorithm for v3 RSA keys from MD5 to SHA-1.
|
||||||
@option{--no-force-v4-certs} disables this option.
|
@option{--no-force-v4-certs} disables this option.
|
||||||
|
@end ifclear
|
||||||
|
|
||||||
|
@ifset gpgtwoone
|
||||||
|
@item --force-v3-sigs
|
||||||
|
@itemx --no-force-v3-sigs
|
||||||
|
@item --force-v4-certs
|
||||||
|
@itemx --no-force-v4-certs
|
||||||
|
These options are obsolete and have no effect since GnuPG 2.1.
|
||||||
|
@end ifset
|
||||||
|
|
||||||
@item --force-mdc
|
@item --force-mdc
|
||||||
@opindex force-mdc
|
@opindex force-mdc
|
||||||
@ -2301,8 +2311,12 @@ compression algorithms none and ZIP. This also disables
|
|||||||
--throw-keyids, and making signatures with signing subkeys as PGP 6
|
--throw-keyids, and making signatures with signing subkeys as PGP 6
|
||||||
does not understand signatures made by signing subkeys.
|
does not understand signatures made by signing subkeys.
|
||||||
|
|
||||||
This option implies @option{--disable-mdc --escape-from-lines
|
@ifclear gpgtwoone
|
||||||
--force-v3-sigs}.
|
This option implies @option{--disable-mdc --escape-from-lines --force-v3-sigs}.
|
||||||
|
@end ifclear
|
||||||
|
@ifset gpgtwoone
|
||||||
|
This option implies @option{--disable-mdc --escape-from-lines}.
|
||||||
|
@end ifset
|
||||||
|
|
||||||
@item --pgp7
|
@item --pgp7
|
||||||
@opindex pgp7
|
@opindex pgp7
|
||||||
|
@ -291,24 +291,13 @@ do_key (iobuf_t out, int ctb, PKT_public_key *pk)
|
|||||||
int i, nskey, npkey;
|
int i, nskey, npkey;
|
||||||
iobuf_t a = iobuf_temp(); /* Build in a self-enlarging buffer. */
|
iobuf_t a = iobuf_temp(); /* Build in a self-enlarging buffer. */
|
||||||
|
|
||||||
/* Write the version number - if none is specified, use 3 */
|
/* Write the version number - if none is specified, use 4 */
|
||||||
if ( !pk->version )
|
if ( !pk->version )
|
||||||
iobuf_put ( a, 3 );
|
iobuf_put ( a, 4 );
|
||||||
else
|
else
|
||||||
iobuf_put ( a, pk->version );
|
iobuf_put ( a, pk->version );
|
||||||
write_32 (a, pk->timestamp );
|
write_32 (a, pk->timestamp );
|
||||||
|
|
||||||
/* v3 needs the expiration time. */
|
|
||||||
if ( pk->version < 4 )
|
|
||||||
{
|
|
||||||
u16 ndays;
|
|
||||||
if ( pk->expiredate )
|
|
||||||
ndays = (u16)((pk->expiredate - pk->timestamp) / 86400L);
|
|
||||||
else
|
|
||||||
ndays = 0;
|
|
||||||
write_16(a, ndays);
|
|
||||||
}
|
|
||||||
|
|
||||||
iobuf_put (a, pk->pubkey_algo );
|
iobuf_put (a, pk->pubkey_algo );
|
||||||
|
|
||||||
/* Get number of secret and public parameters. They are held in one
|
/* Get number of secret and public parameters. They are held in one
|
||||||
@ -347,45 +336,37 @@ do_key (iobuf_t out, int ctb, PKT_public_key *pk)
|
|||||||
/* Build the header for protected (encrypted) secret parameters. */
|
/* Build the header for protected (encrypted) secret parameters. */
|
||||||
if (ski->is_protected)
|
if (ski->is_protected)
|
||||||
{
|
{
|
||||||
if ( is_RSA (pk->pubkey_algo) && pk->version < 4 && !ski->s2k.mode )
|
/* OpenPGP protection according to rfc2440. */
|
||||||
|
iobuf_put (a, ski->sha1chk? 0xfe : 0xff);
|
||||||
|
iobuf_put (a, ski->algo);
|
||||||
|
if (ski->s2k.mode >= 1000)
|
||||||
{
|
{
|
||||||
/* The simple rfc1991 (v3) way. */
|
/* These modes are not possible in OpenPGP, we use them
|
||||||
iobuf_put (a, ski->algo );
|
to implement our extensions, 101 can be viewed as a
|
||||||
iobuf_write (a, ski->iv, ski->ivlen);
|
private/experimental extension (this is not specified
|
||||||
|
in rfc2440 but the same scheme is used for all other
|
||||||
|
algorithm identifiers). */
|
||||||
|
iobuf_put (a, 101);
|
||||||
|
iobuf_put (a, ski->s2k.hash_algo);
|
||||||
|
iobuf_write (a, "GNU", 3 );
|
||||||
|
iobuf_put (a, ski->s2k.mode - 1000);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* OpenPGP protection according to rfc2440. */
|
iobuf_put (a, ski->s2k.mode);
|
||||||
iobuf_put (a, ski->sha1chk? 0xfe : 0xff);
|
iobuf_put (a, ski->s2k.hash_algo);
|
||||||
iobuf_put (a, ski->algo);
|
|
||||||
if (ski->s2k.mode >= 1000)
|
|
||||||
{
|
|
||||||
/* These modes are not possible in OpenPGP, we use
|
|
||||||
them to implement our extensions, 101 can be
|
|
||||||
viewed as a private/experimental extension (this
|
|
||||||
is not specified in rfc2440 but the same scheme
|
|
||||||
is used for all other algorithm identifiers). */
|
|
||||||
iobuf_put (a, 101);
|
|
||||||
iobuf_put (a, ski->s2k.hash_algo);
|
|
||||||
iobuf_write (a, "GNU", 3 );
|
|
||||||
iobuf_put (a, ski->s2k.mode - 1000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iobuf_put (a, ski->s2k.mode);
|
|
||||||
iobuf_put (a, ski->s2k.hash_algo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ski->s2k.mode == 1 || ski->s2k.mode == 3)
|
|
||||||
iobuf_write (a, ski->s2k.salt, 8);
|
|
||||||
|
|
||||||
if (ski->s2k.mode == 3)
|
|
||||||
iobuf_put (a, ski->s2k.count);
|
|
||||||
|
|
||||||
/* For our special modes 1001, 1002 we do not need an IV. */
|
|
||||||
if (ski->s2k.mode != 1001 && ski->s2k.mode != 1002)
|
|
||||||
iobuf_write (a, ski->iv, ski->ivlen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ski->s2k.mode == 1 || ski->s2k.mode == 3)
|
||||||
|
iobuf_write (a, ski->s2k.salt, 8);
|
||||||
|
|
||||||
|
if (ski->s2k.mode == 3)
|
||||||
|
iobuf_put (a, ski->s2k.count);
|
||||||
|
|
||||||
|
/* For our special modes 1001, 1002 we do not need an IV. */
|
||||||
|
if (ski->s2k.mode != 1001 && ski->s2k.mode != 1002)
|
||||||
|
iobuf_write (a, ski->iv, ski->ivlen);
|
||||||
|
|
||||||
}
|
}
|
||||||
else /* Not protected. */
|
else /* Not protected. */
|
||||||
iobuf_put (a, 0 );
|
iobuf_put (a, 0 );
|
||||||
@ -400,7 +381,7 @@ do_key (iobuf_t out, int ctb, PKT_public_key *pk)
|
|||||||
/* The serial number gets stored in the IV field. */
|
/* The serial number gets stored in the IV field. */
|
||||||
iobuf_write (a, ski->iv, ski->ivlen);
|
iobuf_write (a, ski->iv, ski->ivlen);
|
||||||
}
|
}
|
||||||
else if (ski->is_protected && pk->version >= 4)
|
else if (ski->is_protected)
|
||||||
{
|
{
|
||||||
/* The secret key is protected - write it out as it is. */
|
/* The secret key is protected - write it out as it is. */
|
||||||
byte *p;
|
byte *p;
|
||||||
@ -410,20 +391,6 @@ do_key (iobuf_t out, int ctb, PKT_public_key *pk)
|
|||||||
p = gcry_mpi_get_opaque (pk->pkey[npkey], &ndatabits);
|
p = gcry_mpi_get_opaque (pk->pkey[npkey], &ndatabits);
|
||||||
iobuf_write (a, p, (ndatabits+7)/8 );
|
iobuf_write (a, p, (ndatabits+7)/8 );
|
||||||
}
|
}
|
||||||
else if (ski->is_protected)
|
|
||||||
{
|
|
||||||
/* The secret key is protected the old v4 way. */
|
|
||||||
for ( ; i < nskey; i++ )
|
|
||||||
{
|
|
||||||
byte *p;
|
|
||||||
unsigned int ndatabits;
|
|
||||||
|
|
||||||
assert (gcry_mpi_get_flag (pk->pkey[i], GCRYMPI_FLAG_OPAQUE));
|
|
||||||
p = gcry_mpi_get_opaque (pk->pkey[i], &ndatabits);
|
|
||||||
iobuf_write (a, p, (ndatabits+7)/8);
|
|
||||||
}
|
|
||||||
write_16 (a, ski->csum );
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Non-protected key. */
|
/* Non-protected key. */
|
||||||
|
@ -152,7 +152,7 @@ int cipher_filter( void *opaque, int control,
|
|||||||
int text_filter( void *opaque, int control,
|
int text_filter( void *opaque, int control,
|
||||||
iobuf_t chain, byte *buf, size_t *ret_len);
|
iobuf_t chain, byte *buf, size_t *ret_len);
|
||||||
int copy_clearsig_text (iobuf_t out, iobuf_t inp, gcry_md_hd_t md,
|
int copy_clearsig_text (iobuf_t out, iobuf_t inp, gcry_md_hd_t md,
|
||||||
int escape_dash, int escape_from, int pgp2mode);
|
int escape_dash, int escape_from);
|
||||||
|
|
||||||
/*-- progress.c --*/
|
/*-- progress.c --*/
|
||||||
progress_filter_context_t *new_progress_context (void);
|
progress_filter_context_t *new_progress_context (void);
|
||||||
|
25
g10/gpg.c
25
g10/gpg.c
@ -272,10 +272,6 @@ enum cmd_and_opt_values
|
|||||||
oShowPhotos,
|
oShowPhotos,
|
||||||
oNoShowPhotos,
|
oNoShowPhotos,
|
||||||
oPhotoViewer,
|
oPhotoViewer,
|
||||||
oForceV3Sigs,
|
|
||||||
oNoForceV3Sigs,
|
|
||||||
oForceV4Certs,
|
|
||||||
oNoForceV4Certs,
|
|
||||||
oForceMDC,
|
oForceMDC,
|
||||||
oNoForceMDC,
|
oNoForceMDC,
|
||||||
oDisableMDC,
|
oDisableMDC,
|
||||||
@ -525,10 +521,6 @@ static ARGPARSE_OPTS opts[] = {
|
|||||||
ARGPARSE_s_n (oQuiet, "quiet", "@"),
|
ARGPARSE_s_n (oQuiet, "quiet", "@"),
|
||||||
ARGPARSE_s_n (oNoTTY, "no-tty", "@"),
|
ARGPARSE_s_n (oNoTTY, "no-tty", "@"),
|
||||||
|
|
||||||
ARGPARSE_s_n (oForceV3Sigs, "force-v3-sigs", "@"),
|
|
||||||
ARGPARSE_s_n (oNoForceV3Sigs, "no-force-v3-sigs", "@"),
|
|
||||||
ARGPARSE_s_n (oForceV4Certs, "force-v4-certs", "@"),
|
|
||||||
ARGPARSE_s_n (oNoForceV4Certs, "no-force-v4-certs", "@"),
|
|
||||||
ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
|
ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
|
||||||
ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
|
ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
|
||||||
ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
|
ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
|
||||||
@ -810,6 +802,10 @@ static ARGPARSE_OPTS opts[] = {
|
|||||||
ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
|
ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
|
||||||
ARGPARSE_s_n (oNoop, "compress-keys", "@"),
|
ARGPARSE_s_n (oNoop, "compress-keys", "@"),
|
||||||
ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
|
ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
|
||||||
|
ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
|
||||||
|
ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
|
||||||
|
ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
|
||||||
|
ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
|
||||||
|
|
||||||
ARGPARSE_end ()
|
ARGPARSE_end ()
|
||||||
};
|
};
|
||||||
@ -2535,7 +2531,6 @@ main (int argc, char **argv)
|
|||||||
opt.allow_freeform_uid = 1;
|
opt.allow_freeform_uid = 1;
|
||||||
opt.pgp2_workarounds = 0;
|
opt.pgp2_workarounds = 0;
|
||||||
opt.escape_from = 1;
|
opt.escape_from = 1;
|
||||||
opt.force_v3_sigs = 0;
|
|
||||||
opt.not_dash_escaped = 0;
|
opt.not_dash_escaped = 0;
|
||||||
opt.def_cipher_algo = 0;
|
opt.def_cipher_algo = 0;
|
||||||
opt.def_digest_algo = 0;
|
opt.def_digest_algo = 0;
|
||||||
@ -2553,7 +2548,6 @@ main (int argc, char **argv)
|
|||||||
opt.allow_freeform_uid = 1;
|
opt.allow_freeform_uid = 1;
|
||||||
opt.pgp2_workarounds = 0;
|
opt.pgp2_workarounds = 0;
|
||||||
opt.escape_from = 0;
|
opt.escape_from = 0;
|
||||||
opt.force_v3_sigs = 0;
|
|
||||||
opt.not_dash_escaped = 0;
|
opt.not_dash_escaped = 0;
|
||||||
opt.def_cipher_algo = 0;
|
opt.def_cipher_algo = 0;
|
||||||
opt.def_digest_algo = 0;
|
opt.def_digest_algo = 0;
|
||||||
@ -2637,10 +2631,7 @@ main (int argc, char **argv)
|
|||||||
opt.verify_options&=~VERIFY_SHOW_PHOTOS;
|
opt.verify_options&=~VERIFY_SHOW_PHOTOS;
|
||||||
break;
|
break;
|
||||||
case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
|
case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
|
||||||
case oForceV3Sigs: opt.force_v3_sigs = 1; break;
|
|
||||||
case oNoForceV3Sigs: opt.force_v3_sigs = 0; break;
|
|
||||||
case oForceV4Certs: opt.force_v4_certs = 1; break;
|
|
||||||
case oNoForceV4Certs: opt.force_v4_certs = 0; break;
|
|
||||||
case oForceMDC: opt.force_mdc = 1; break;
|
case oForceMDC: opt.force_mdc = 1; break;
|
||||||
case oNoForceMDC: opt.force_mdc = 0; break;
|
case oNoForceMDC: opt.force_mdc = 0; break;
|
||||||
case oDisableMDC: opt.disable_mdc = 1; break;
|
case oDisableMDC: opt.disable_mdc = 1; break;
|
||||||
@ -3288,15 +3279,17 @@ main (int argc, char **argv)
|
|||||||
/* Do these after the switch(), so they can override settings. */
|
/* Do these after the switch(), so they can override settings. */
|
||||||
if(PGP6)
|
if(PGP6)
|
||||||
{
|
{
|
||||||
|
/* That does not anymore work becuase we have no more support
|
||||||
|
for v3 signatures. */
|
||||||
opt.disable_mdc=1;
|
opt.disable_mdc=1;
|
||||||
opt.escape_from=1;
|
opt.escape_from=1;
|
||||||
opt.force_v3_sigs=1;
|
|
||||||
opt.ask_sig_expire=0;
|
opt.ask_sig_expire=0;
|
||||||
}
|
}
|
||||||
else if(PGP7)
|
else if(PGP7)
|
||||||
{
|
{
|
||||||
|
/* That does not anymore work because we have no more support
|
||||||
|
for v3 signatures. */
|
||||||
opt.escape_from=1;
|
opt.escape_from=1;
|
||||||
opt.force_v3_sigs=1;
|
|
||||||
opt.ask_sig_expire=0;
|
opt.ask_sig_expire=0;
|
||||||
}
|
}
|
||||||
else if(PGP8)
|
else if(PGP8)
|
||||||
|
@ -536,14 +536,10 @@ sign_uids (estream_t fp,
|
|||||||
{
|
{
|
||||||
u32 sk_keyid[2], pk_keyid[2];
|
u32 sk_keyid[2], pk_keyid[2];
|
||||||
char *p, *trust_regexp = NULL;
|
char *p, *trust_regexp = NULL;
|
||||||
int force_v4 = 0, class = 0, selfsig = 0;
|
int class = 0, selfsig = 0;
|
||||||
u32 duration = 0, timestamp = 0;
|
u32 duration = 0, timestamp = 0;
|
||||||
byte trust_depth = 0, trust_value = 0;
|
byte trust_depth = 0, trust_value = 0;
|
||||||
|
|
||||||
if (local || nonrevocable || trust
|
|
||||||
|| opt.cert_policy_url || opt.cert_notations)
|
|
||||||
force_v4 = 1;
|
|
||||||
|
|
||||||
pk = sk_rover->pk;
|
pk = sk_rover->pk;
|
||||||
keyid_from_pk (pk, sk_keyid);
|
keyid_from_pk (pk, sk_keyid);
|
||||||
|
|
||||||
@ -567,14 +563,7 @@ sign_uids (estream_t fp,
|
|||||||
|
|
||||||
/* Is this a self-sig? */
|
/* Is this a self-sig? */
|
||||||
if (pk_keyid[0] == sk_keyid[0] && pk_keyid[1] == sk_keyid[1])
|
if (pk_keyid[0] == sk_keyid[0] && pk_keyid[1] == sk_keyid[1])
|
||||||
{
|
selfsig = 1;
|
||||||
selfsig = 1;
|
|
||||||
/* Do not force a v4 sig here, otherwise it would
|
|
||||||
be difficult to remake a v3 selfsig. If this
|
|
||||||
is a v3->v4 promotion case, then we set
|
|
||||||
force_v4 later anyway. */
|
|
||||||
force_v4 = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (node->pkt->pkttype == PKT_USER_ID)
|
else if (node->pkt->pkttype == PKT_USER_ID)
|
||||||
{
|
{
|
||||||
@ -716,7 +705,6 @@ sign_uids (estream_t fp,
|
|||||||
"it to an OpenPGP self-"
|
"it to an OpenPGP self-"
|
||||||
"signature? (y/N) ")))
|
"signature? (y/N) ")))
|
||||||
{
|
{
|
||||||
force_v4 = 1;
|
|
||||||
node->flag |= NODFLG_DELSIG;
|
node->flag |= NODFLG_DELSIG;
|
||||||
xfree (user);
|
xfree (user);
|
||||||
continue;
|
continue;
|
||||||
@ -860,7 +848,6 @@ sign_uids (estream_t fp,
|
|||||||
passphrase, etc). */
|
passphrase, etc). */
|
||||||
timestamp = now;
|
timestamp = now;
|
||||||
duration = primary_pk->expiredate - now;
|
duration = primary_pk->expiredate - now;
|
||||||
force_v4 = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cpr_kill_prompt ();
|
cpr_kill_prompt ();
|
||||||
@ -879,9 +866,6 @@ sign_uids (estream_t fp,
|
|||||||
duration = parse_expire_string (opt.def_cert_expire);
|
duration = parse_expire_string (opt.def_cert_expire);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (duration)
|
|
||||||
force_v4 = 1;
|
|
||||||
|
|
||||||
if (selfsig)
|
if (selfsig)
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
@ -1041,7 +1025,7 @@ sign_uids (estream_t fp,
|
|||||||
node->pkt->pkt.user_id,
|
node->pkt->pkt.user_id,
|
||||||
NULL,
|
NULL,
|
||||||
pk,
|
pk,
|
||||||
0x13, 0, force_v4 ? 4 : 0, 0, 0,
|
0x13, 0, 0, 0,
|
||||||
keygen_add_std_prefs, primary_pk,
|
keygen_add_std_prefs, primary_pk,
|
||||||
NULL);
|
NULL);
|
||||||
else
|
else
|
||||||
@ -1049,7 +1033,7 @@ sign_uids (estream_t fp,
|
|||||||
node->pkt->pkt.user_id,
|
node->pkt->pkt.user_id,
|
||||||
NULL,
|
NULL,
|
||||||
pk,
|
pk,
|
||||||
class, 0, force_v4 ? 4 : 0,
|
class, 0,
|
||||||
timestamp, duration,
|
timestamp, duration,
|
||||||
sign_mk_attrib, &attrib,
|
sign_mk_attrib, &attrib,
|
||||||
NULL);
|
NULL);
|
||||||
@ -3290,7 +3274,7 @@ menu_adduid (KBNODE pub_keyblock, int photo, const char *photo_name)
|
|||||||
if (!uid)
|
if (!uid)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x13, 0, 0, 0, 0,
|
err = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x13, 0, 0, 0,
|
||||||
keygen_add_std_prefs, pk, NULL);
|
keygen_add_std_prefs, pk, NULL);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
@ -3674,9 +3658,7 @@ menu_addrevoker (ctrl_t ctrl, kbnode_t pub_keyblock, int sensitive)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The 1F signature must be at least v4 to carry the revocation key
|
rc = make_keysig_packet (&sig, pk, NULL, NULL, pk, 0x1F, 0, 0, 0,
|
||||||
subpacket. */
|
|
||||||
rc = make_keysig_packet (&sig, pk, NULL, NULL, pk, 0x1F, 0, 4, 0, 0,
|
|
||||||
keygen_add_revkey, &revkey, NULL);
|
keygen_add_revkey, &revkey, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
@ -4966,7 +4948,7 @@ reloop: /* (must use this, because we are modifing the list) */
|
|||||||
}
|
}
|
||||||
rc = make_keysig_packet (&sig, primary_pk,
|
rc = make_keysig_packet (&sig, primary_pk,
|
||||||
unode->pkt->pkt.user_id,
|
unode->pkt->pkt.user_id,
|
||||||
NULL, signerkey, 0x30, 0, 0, 0, 0,
|
NULL, signerkey, 0x30, 0, 0, 0,
|
||||||
sign_mk_attrib, &attrib, NULL);
|
sign_mk_attrib, &attrib, NULL);
|
||||||
free_public_key (signerkey);
|
free_public_key (signerkey);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -5058,7 +5040,7 @@ menu_revuid (KBNODE pub_keyblock)
|
|||||||
node->flag &= ~NODFLG_SELUID;
|
node->flag &= ~NODFLG_SELUID;
|
||||||
|
|
||||||
rc = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x30, 0,
|
rc = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x30, 0,
|
||||||
(reason == NULL) ? 3 : 0, timestamp, 0,
|
timestamp, 0,
|
||||||
sign_mk_attrib, &attrib, NULL);
|
sign_mk_attrib, &attrib, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
@ -5122,7 +5104,7 @@ menu_revkey (KBNODE pub_keyblock)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
rc = make_keysig_packet (&sig, pk, NULL, NULL, pk,
|
rc = make_keysig_packet (&sig, pk, NULL, NULL, pk,
|
||||||
0x20, 0, opt.force_v4_certs ? 4 : 0, 0, 0,
|
0x20, 0, 0, 0,
|
||||||
revocation_reason_build_cb, reason, NULL);
|
revocation_reason_build_cb, reason, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
@ -5183,7 +5165,7 @@ menu_revsubkey (KBNODE pub_keyblock)
|
|||||||
|
|
||||||
node->flag &= ~NODFLG_SELKEY;
|
node->flag &= ~NODFLG_SELKEY;
|
||||||
rc = make_keysig_packet (&sig, mainpk, NULL, subpk, mainpk,
|
rc = make_keysig_packet (&sig, mainpk, NULL, subpk, mainpk,
|
||||||
0x28, 0, 0, 0, 0, sign_mk_attrib, &attrib,
|
0x28, 0, 0, 0, sign_mk_attrib, &attrib,
|
||||||
NULL);
|
NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
|
10
g10/keygen.c
10
g10/keygen.c
@ -812,7 +812,7 @@ make_backsig (PKT_signature *sig, PKT_public_key *pk,
|
|||||||
cache_public_key (sub_pk);
|
cache_public_key (sub_pk);
|
||||||
|
|
||||||
err = make_keysig_packet (&backsig, pk, NULL, sub_pk, sub_psk, 0x19,
|
err = make_keysig_packet (&backsig, pk, NULL, sub_pk, sub_psk, 0x19,
|
||||||
0, 0, timestamp, 0, NULL, NULL, cache_nonce);
|
0, timestamp, 0, NULL, NULL, cache_nonce);
|
||||||
if (err)
|
if (err)
|
||||||
log_error ("make_keysig_packet failed for backsig: %s\n", g10_errstr(err));
|
log_error ("make_keysig_packet failed for backsig: %s\n", g10_errstr(err));
|
||||||
else
|
else
|
||||||
@ -922,7 +922,7 @@ write_direct_sig (KBNODE root, PKT_public_key *psk,
|
|||||||
|
|
||||||
/* Make the signature. */
|
/* Make the signature. */
|
||||||
err = make_keysig_packet (&sig, pk, NULL,NULL, psk, 0x1F,
|
err = make_keysig_packet (&sig, pk, NULL,NULL, psk, 0x1F,
|
||||||
0, 0, timestamp, 0,
|
0, timestamp, 0,
|
||||||
keygen_add_revkey, revkey, cache_nonce);
|
keygen_add_revkey, revkey, cache_nonce);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
@ -977,7 +977,7 @@ write_selfsigs (KBNODE root, PKT_public_key *psk,
|
|||||||
|
|
||||||
/* Make the signature. */
|
/* Make the signature. */
|
||||||
err = make_keysig_packet (&sig, pk, uid, NULL, psk, 0x13,
|
err = make_keysig_packet (&sig, pk, uid, NULL, psk, 0x13,
|
||||||
0, 0, timestamp, 0,
|
0, timestamp, 0,
|
||||||
keygen_add_std_prefs, pk, cache_nonce);
|
keygen_add_std_prefs, pk, cache_nonce);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
@ -1036,12 +1036,12 @@ write_keybinding (KBNODE root, PKT_public_key *pri_psk, PKT_public_key *sub_psk,
|
|||||||
oduap.usage = use;
|
oduap.usage = use;
|
||||||
oduap.pk = sub_pk;
|
oduap.pk = sub_pk;
|
||||||
err = make_keysig_packet (&sig, pri_pk, NULL, sub_pk, pri_psk, 0x18,
|
err = make_keysig_packet (&sig, pri_pk, NULL, sub_pk, pri_psk, 0x18,
|
||||||
0, 0, timestamp, 0,
|
0, timestamp, 0,
|
||||||
keygen_add_key_flags_and_expire, &oduap,
|
keygen_add_key_flags_and_expire, &oduap,
|
||||||
cache_nonce);
|
cache_nonce);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
log_error ("make_keysig_packet failed: %s\n", g10_errstr (err));
|
log_error ("make_keysig_packeto failed: %s\n", g10_errstr (err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
96
g10/keyid.c
96
g10/keyid.c
@ -147,10 +147,6 @@ hash_public_key (gcry_md_hd_t md, PKT_public_key *pk)
|
|||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
int npkey = pubkey_get_npkey (pk->pubkey_algo);
|
int npkey = pubkey_get_npkey (pk->pubkey_algo);
|
||||||
|
|
||||||
/* Two extra bytes for the expiration date in v3 */
|
|
||||||
if(pk->version<4)
|
|
||||||
n+=2;
|
|
||||||
|
|
||||||
/* FIXME: We can avoid the extra malloc by calling only the first
|
/* FIXME: We can avoid the extra malloc by calling only the first
|
||||||
mpi_print here which computes the required length and calling the
|
mpi_print here which computes the required length and calling the
|
||||||
real mpi_print only at the end. The speed advantage would only be
|
real mpi_print only at the end. The speed advantage would only be
|
||||||
@ -211,16 +207,6 @@ hash_public_key (gcry_md_hd_t md, PKT_public_key *pk)
|
|||||||
gcry_md_putc ( md, pk->timestamp >> 8 );
|
gcry_md_putc ( md, pk->timestamp >> 8 );
|
||||||
gcry_md_putc ( md, pk->timestamp );
|
gcry_md_putc ( md, pk->timestamp );
|
||||||
|
|
||||||
if(pk->version<4)
|
|
||||||
{
|
|
||||||
u16 days=0;
|
|
||||||
if(pk->expiredate)
|
|
||||||
days=(u16)((pk->expiredate - pk->timestamp) / 86400L);
|
|
||||||
|
|
||||||
gcry_md_putc ( md, days >> 8 );
|
|
||||||
gcry_md_putc ( md, days );
|
|
||||||
}
|
|
||||||
|
|
||||||
gcry_md_putc ( md, pk->pubkey_algo );
|
gcry_md_putc ( md, pk->pubkey_algo );
|
||||||
|
|
||||||
if(npkey==0 && pk->pkey[0]
|
if(npkey==0 && pk->pkey[0]
|
||||||
@ -432,18 +418,6 @@ keyid_from_pk (PKT_public_key *pk, u32 *keyid)
|
|||||||
keyid[1] = pk->keyid[1];
|
keyid[1] = pk->keyid[1];
|
||||||
lowbits = keyid[1];
|
lowbits = keyid[1];
|
||||||
}
|
}
|
||||||
else if( pk->version < 4 )
|
|
||||||
{
|
|
||||||
if( is_RSA(pk->pubkey_algo) )
|
|
||||||
{
|
|
||||||
lowbits = (pubkey_get_npkey (pk->pubkey_algo) ?
|
|
||||||
v3_keyid ( pk->pkey[0], keyid ) : 0); /* From n. */
|
|
||||||
pk->keyid[0] = keyid[0];
|
|
||||||
pk->keyid[1] = keyid[1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pk->keyid[0]=pk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const byte *dp;
|
const byte *dp;
|
||||||
@ -706,66 +680,20 @@ colon_expirestr_from_sig (PKT_signature *sig)
|
|||||||
byte *
|
byte *
|
||||||
fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
|
fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
|
||||||
{
|
{
|
||||||
byte *buf;
|
|
||||||
const byte *dp;
|
const byte *dp;
|
||||||
size_t len, nbytes;
|
size_t len;
|
||||||
int i;
|
gcry_md_hd_t md;
|
||||||
|
|
||||||
if ( pk->version < 4 )
|
md = do_fingerprint_md(pk);
|
||||||
{
|
dp = gcry_md_read( md, 0 );
|
||||||
if ( is_RSA(pk->pubkey_algo) )
|
len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
|
||||||
{
|
assert( len <= MAX_FINGERPRINT_LEN );
|
||||||
/* RSA in version 3 packets is special. */
|
if (!array)
|
||||||
gcry_md_hd_t md;
|
array = xmalloc ( len );
|
||||||
|
memcpy (array, dp, len );
|
||||||
if (gcry_md_open (&md, DIGEST_ALGO_MD5, 0))
|
pk->keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
|
||||||
BUG ();
|
pk->keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
|
||||||
if ( pubkey_get_npkey (pk->pubkey_algo) > 1 )
|
gcry_md_close( md);
|
||||||
{
|
|
||||||
for (i=0; i < 2; i++)
|
|
||||||
{
|
|
||||||
if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0,
|
|
||||||
&nbytes, pk->pkey[i]))
|
|
||||||
BUG ();
|
|
||||||
/* fixme: Better allocate BUF on the stack */
|
|
||||||
buf = xmalloc (nbytes);
|
|
||||||
if (gcry_mpi_print (GCRYMPI_FMT_USG, buf, nbytes,
|
|
||||||
NULL, pk->pkey[i]))
|
|
||||||
BUG ();
|
|
||||||
gcry_md_write (md, buf, nbytes);
|
|
||||||
xfree (buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gcry_md_final (md);
|
|
||||||
if (!array)
|
|
||||||
array = xmalloc (16);
|
|
||||||
len = 16;
|
|
||||||
memcpy (array, gcry_md_read (md, DIGEST_ALGO_MD5), 16);
|
|
||||||
gcry_md_close(md);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!array)
|
|
||||||
array = xmalloc(16);
|
|
||||||
len = 16;
|
|
||||||
memset (array,0,16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gcry_md_hd_t md;
|
|
||||||
|
|
||||||
md = do_fingerprint_md(pk);
|
|
||||||
dp = gcry_md_read( md, 0 );
|
|
||||||
len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
|
|
||||||
assert( len <= MAX_FINGERPRINT_LEN );
|
|
||||||
if (!array)
|
|
||||||
array = xmalloc ( len );
|
|
||||||
memcpy (array, dp, len );
|
|
||||||
pk->keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
|
|
||||||
pk->keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
|
|
||||||
gcry_md_close( md);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret_len)
|
if (ret_len)
|
||||||
*ret_len = len;
|
*ret_len = len;
|
||||||
|
@ -74,8 +74,6 @@ struct
|
|||||||
int no_armor;
|
int no_armor;
|
||||||
int list_packets; /* list-packets mode: 1=normal, 2=invoked by command*/
|
int list_packets; /* list-packets mode: 1=normal, 2=invoked by command*/
|
||||||
int def_cipher_algo;
|
int def_cipher_algo;
|
||||||
int force_v3_sigs;
|
|
||||||
int force_v4_certs;
|
|
||||||
int force_mdc;
|
int force_mdc;
|
||||||
int disable_mdc;
|
int disable_mdc;
|
||||||
int def_digest_algo;
|
int def_digest_algo;
|
||||||
|
@ -530,7 +530,7 @@ int ask_for_detached_datafile( gcry_md_hd_t md, gcry_md_hd_t md2,
|
|||||||
int make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
|
int make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
|
||||||
PKT_user_id *uid, PKT_public_key *subpk,
|
PKT_user_id *uid, PKT_public_key *subpk,
|
||||||
PKT_public_key *pksk, int sigclass, int digest_algo,
|
PKT_public_key *pksk, int sigclass, int digest_algo,
|
||||||
int sigversion, u32 timestamp, u32 duration,
|
u32 timestamp, u32 duration,
|
||||||
int (*mksubpkt)(PKT_signature *, void *),
|
int (*mksubpkt)(PKT_signature *, void *),
|
||||||
void *opaque,
|
void *opaque,
|
||||||
const char *cache_nonce);
|
const char *cache_nonce);
|
||||||
|
@ -1901,53 +1901,6 @@ parse_onepass_sig (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static gcry_mpi_t
|
|
||||||
read_protected_v3_mpi (IOBUF inp, unsigned long *length)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
unsigned int nbits, nbytes;
|
|
||||||
unsigned char *buf, *p;
|
|
||||||
gcry_mpi_t val;
|
|
||||||
|
|
||||||
if (*length < 2)
|
|
||||||
{
|
|
||||||
log_error ("mpi too small\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((c = iobuf_get (inp)) == -1)
|
|
||||||
return NULL;
|
|
||||||
--*length;
|
|
||||||
nbits = c << 8;
|
|
||||||
if ((c = iobuf_get (inp)) == -1)
|
|
||||||
return NULL;
|
|
||||||
--*length;
|
|
||||||
nbits |= c;
|
|
||||||
|
|
||||||
if (nbits > 16384)
|
|
||||||
{
|
|
||||||
log_error ("mpi too large (%u bits)\n", nbits);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
nbytes = (nbits + 7) / 8;
|
|
||||||
buf = p = xmalloc (2 + nbytes);
|
|
||||||
*p++ = nbits >> 8;
|
|
||||||
*p++ = nbits;
|
|
||||||
for (; nbytes && *length; nbytes--, --*length)
|
|
||||||
*p++ = iobuf_get (inp);
|
|
||||||
if (nbytes)
|
|
||||||
{
|
|
||||||
log_error ("packet shorter than mpi\n");
|
|
||||||
xfree (buf);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert buffer into an opaque MPI. */
|
|
||||||
val = gcry_mpi_set_opaque (NULL, buf, (p - buf) * 8);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
||||||
byte * hdr, int hdrlen, PACKET * pkt)
|
byte * hdr, int hdrlen, PACKET * pkt)
|
||||||
@ -1956,7 +1909,6 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
int i, version, algorithm;
|
int i, version, algorithm;
|
||||||
unsigned long timestamp, expiredate, max_expiredate;
|
unsigned long timestamp, expiredate, max_expiredate;
|
||||||
int npkey, nskey;
|
int npkey, nskey;
|
||||||
int is_v4 = 0;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
u32 keyid[2];
|
u32 keyid[2];
|
||||||
PKT_public_key *pk;
|
PKT_public_key *pk;
|
||||||
@ -1991,8 +1943,19 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (version == 4)
|
else if (version == 4)
|
||||||
is_v4 = 1;
|
{
|
||||||
else if (version != 2 && version != 3)
|
/* The only supported version. Use an older gpg
|
||||||
|
versions (i.e. gpg 1.4 to parse v3 packets). */
|
||||||
|
}
|
||||||
|
else if (version == 2 || version == 3)
|
||||||
|
{
|
||||||
|
log_info ("packet(%d) with obsolete version %d\n", pkttype, version);
|
||||||
|
if (list_mode)
|
||||||
|
es_fprintf (listfp, ":key packet: [obsolete version %d]\n", version);
|
||||||
|
err = gpg_error (GPG_ERR_INV_PACKET);
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
log_error ("packet(%d) with unknown version %d\n", pkttype, version);
|
log_error ("packet(%d) with unknown version %d\n", pkttype, version);
|
||||||
if (list_mode)
|
if (list_mode)
|
||||||
@ -2012,23 +1975,8 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
|
|
||||||
timestamp = read_32 (inp);
|
timestamp = read_32 (inp);
|
||||||
pktlen -= 4;
|
pktlen -= 4;
|
||||||
if (is_v4)
|
expiredate = 0; /* have to get it from the selfsignature */
|
||||||
{
|
max_expiredate = 0;
|
||||||
expiredate = 0; /* have to get it from the selfsignature */
|
|
||||||
max_expiredate = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
unsigned short ndays;
|
|
||||||
ndays = read_16 (inp);
|
|
||||||
pktlen -= 2;
|
|
||||||
if (ndays)
|
|
||||||
expiredate = timestamp + ndays * 86400L;
|
|
||||||
else
|
|
||||||
expiredate = 0;
|
|
||||||
|
|
||||||
max_expiredate = expiredate;
|
|
||||||
}
|
|
||||||
algorithm = iobuf_get_noeof (inp);
|
algorithm = iobuf_get_noeof (inp);
|
||||||
pktlen--;
|
pktlen--;
|
||||||
if (list_mode)
|
if (list_mode)
|
||||||
@ -2145,7 +2093,7 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
ski->s2k.hash_algo = iobuf_get_noeof (inp);
|
ski->s2k.hash_algo = iobuf_get_noeof (inp);
|
||||||
pktlen--;
|
pktlen--;
|
||||||
/* Check for the special GNU extension. */
|
/* Check for the special GNU extension. */
|
||||||
if (is_v4 && ski->s2k.mode == 101)
|
if (ski->s2k.mode == 101)
|
||||||
{
|
{
|
||||||
for (i = 0; i < 4 && pktlen; i++, pktlen--)
|
for (i = 0; i < 4 && pktlen; i++, pktlen--)
|
||||||
temp[i] = iobuf_get_noeof (inp);
|
temp[i] = iobuf_get_noeof (inp);
|
||||||
@ -2312,7 +2260,7 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
10 * 8);
|
10 * 8);
|
||||||
pktlen = 0;
|
pktlen = 0;
|
||||||
}
|
}
|
||||||
else if (is_v4 && ski->is_protected)
|
else if (ski->is_protected)
|
||||||
{
|
{
|
||||||
/* Ugly: The length is encrypted too, so we read all stuff
|
/* Ugly: The length is encrypted too, so we read all stuff
|
||||||
* up to the end of the packet into the first SKEY
|
* up to the end of the packet into the first SKEY
|
||||||
@ -2331,29 +2279,18 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The v3 method: The mpi length is not encrypted. */
|
/* Not encrypted. */
|
||||||
for (i = npkey; i < nskey; i++)
|
for (i = npkey; i < nskey; i++)
|
||||||
{
|
{
|
||||||
if (ski->is_protected)
|
unsigned int n = pktlen;
|
||||||
{
|
pk->pkey[i] = mpi_read (inp, &n, 0);
|
||||||
pk->pkey[i] = read_protected_v3_mpi (inp, &pktlen);
|
pktlen -= n;
|
||||||
if (pk->pkey[i])
|
if (list_mode)
|
||||||
gcry_mpi_set_flag (pk->pkey[i], GCRYMPI_FLAG_USER1);
|
{
|
||||||
if (list_mode)
|
es_fprintf (listfp, "\tskey[%d]: ", i);
|
||||||
es_fprintf (listfp, "\tskey[%d]: [v3 protected]\n", i);
|
mpi_print (listfp, pk->pkey[i], mpi_print_mode);
|
||||||
}
|
es_putc ('\n', listfp);
|
||||||
else
|
}
|
||||||
{
|
|
||||||
unsigned int n = pktlen;
|
|
||||||
pk->pkey[i] = mpi_read (inp, &n, 0);
|
|
||||||
pktlen -= n;
|
|
||||||
if (list_mode)
|
|
||||||
{
|
|
||||||
es_fprintf (listfp, "\tskey[%d]: ", i);
|
|
||||||
mpi_print (listfp, pk->pkey[i], mpi_print_mode);
|
|
||||||
es_putc ('\n', listfp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pk->pkey[i])
|
if (!pk->pkey[i])
|
||||||
err = gpg_error (GPG_ERR_INV_PACKET);
|
err = gpg_error (GPG_ERR_INV_PACKET);
|
||||||
|
18
g10/revoke.c
18
g10/revoke.c
@ -338,7 +338,7 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
|
|||||||
|
|
||||||
/* create it */
|
/* create it */
|
||||||
rc = make_keysig_packet( &sig, pk, NULL, NULL, pk2, 0x20, 0,
|
rc = make_keysig_packet( &sig, pk, NULL, NULL, pk2, 0x20, 0,
|
||||||
0, 0, 0,
|
0, 0,
|
||||||
revocation_reason_build_cb, reason,
|
revocation_reason_build_cb, reason,
|
||||||
NULL);
|
NULL);
|
||||||
if( rc ) {
|
if( rc ) {
|
||||||
@ -465,7 +465,6 @@ create_revocation (const char *filename,
|
|||||||
push_armor_filter (afx, out);
|
push_armor_filter (afx, out);
|
||||||
|
|
||||||
rc = make_keysig_packet (&sig, psk, NULL, NULL, psk, 0x20, 0,
|
rc = make_keysig_packet (&sig, psk, NULL, NULL, psk, 0x20, 0,
|
||||||
opt.force_v4_certs? 4:0,
|
|
||||||
0, 0,
|
0, 0,
|
||||||
revocation_reason_build_cb, reason, cache_nonce);
|
revocation_reason_build_cb, reason, cache_nonce);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -649,16 +648,13 @@ gen_revoke (const char *uname)
|
|||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psk->version >= 4 || opt.force_v4_certs)
|
/* Get the reason for the revocation. */
|
||||||
|
reason = ask_revocation_reason (1, 0, 1);
|
||||||
|
if (!reason)
|
||||||
{
|
{
|
||||||
/* Get the reason for the revocation. */
|
/* User decided to cancel. */
|
||||||
reason = ask_revocation_reason (1, 0, 1);
|
rc = 0;
|
||||||
if (!reason)
|
goto leave;
|
||||||
{
|
|
||||||
/* user decided to cancel */
|
|
||||||
rc = 0;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opt.armor)
|
if (!opt.armor)
|
||||||
|
257
g10/sign.c
257
g10/sign.c
@ -155,30 +155,32 @@ mk_notation_policy_etc (PKT_signature *sig,
|
|||||||
static void
|
static void
|
||||||
hash_uid (gcry_md_hd_t md, int sigversion, const PKT_user_id *uid)
|
hash_uid (gcry_md_hd_t md, int sigversion, const PKT_user_id *uid)
|
||||||
{
|
{
|
||||||
if ( sigversion >= 4 ) {
|
byte buf[5];
|
||||||
byte buf[5];
|
|
||||||
|
|
||||||
if(uid->attrib_data) {
|
(void)sigversion;
|
||||||
buf[0] = 0xd1; /* indicates an attribute packet */
|
|
||||||
buf[1] = uid->attrib_len >> 24; /* always use 4 length bytes */
|
if (uid->attrib_data)
|
||||||
buf[2] = uid->attrib_len >> 16;
|
{
|
||||||
buf[3] = uid->attrib_len >> 8;
|
buf[0] = 0xd1; /* Indicates an attribute packet. */
|
||||||
buf[4] = uid->attrib_len;
|
buf[1] = uid->attrib_len >> 24; /* Always use 4 length bytes. */
|
||||||
}
|
buf[2] = uid->attrib_len >> 16;
|
||||||
else {
|
buf[3] = uid->attrib_len >> 8;
|
||||||
buf[0] = 0xb4; /* indicates a userid packet */
|
buf[4] = uid->attrib_len;
|
||||||
buf[1] = uid->len >> 24; /* always use 4 length bytes */
|
|
||||||
buf[2] = uid->len >> 16;
|
|
||||||
buf[3] = uid->len >> 8;
|
|
||||||
buf[4] = uid->len;
|
|
||||||
}
|
|
||||||
gcry_md_write( md, buf, 5 );
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buf[0] = 0xb4; /* Indicates a userid packet. */
|
||||||
|
buf[1] = uid->len >> 24; /* Always use 4 length bytes. */
|
||||||
|
buf[2] = uid->len >> 16;
|
||||||
|
buf[3] = uid->len >> 8;
|
||||||
|
buf[4] = uid->len;
|
||||||
|
}
|
||||||
|
gcry_md_write( md, buf, 5 );
|
||||||
|
|
||||||
if(uid->attrib_data)
|
if (uid->attrib_data)
|
||||||
gcry_md_write (md, uid->attrib_data, uid->attrib_len );
|
gcry_md_write (md, uid->attrib_data, uid->attrib_len );
|
||||||
else
|
else
|
||||||
gcry_md_write (md, uid->name, uid->len );
|
gcry_md_write (md, uid->name, uid->len );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -188,45 +190,38 @@ hash_uid (gcry_md_hd_t md, int sigversion, const PKT_user_id *uid)
|
|||||||
static void
|
static void
|
||||||
hash_sigversion_to_magic (gcry_md_hd_t md, const PKT_signature *sig)
|
hash_sigversion_to_magic (gcry_md_hd_t md, const PKT_signature *sig)
|
||||||
{
|
{
|
||||||
if (sig->version >= 4)
|
byte buf[6];
|
||||||
gcry_md_putc (md, sig->version);
|
size_t n;
|
||||||
gcry_md_putc (md, sig->sig_class);
|
|
||||||
if (sig->version < 4) {
|
|
||||||
u32 a = sig->timestamp;
|
|
||||||
gcry_md_putc (md, (a >> 24) & 0xff );
|
|
||||||
gcry_md_putc (md, (a >> 16) & 0xff );
|
|
||||||
gcry_md_putc (md, (a >> 8) & 0xff );
|
|
||||||
gcry_md_putc (md, a & 0xff );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
byte buf[6];
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
gcry_md_putc (md, sig->pubkey_algo);
|
gcry_md_putc (md, sig->version);
|
||||||
gcry_md_putc (md, sig->digest_algo);
|
gcry_md_putc (md, sig->sig_class);
|
||||||
if (sig->hashed) {
|
gcry_md_putc (md, sig->pubkey_algo);
|
||||||
n = sig->hashed->len;
|
gcry_md_putc (md, sig->digest_algo);
|
||||||
gcry_md_putc (md, (n >> 8) );
|
if (sig->hashed)
|
||||||
gcry_md_putc (md, n );
|
{
|
||||||
gcry_md_write (md, sig->hashed->data, n );
|
n = sig->hashed->len;
|
||||||
n += 6;
|
gcry_md_putc (md, (n >> 8) );
|
||||||
}
|
gcry_md_putc (md, n );
|
||||||
else {
|
gcry_md_write (md, sig->hashed->data, n );
|
||||||
gcry_md_putc (md, 0); /* always hash the length of the subpacket*/
|
n += 6;
|
||||||
gcry_md_putc (md, 0);
|
|
||||||
n = 6;
|
|
||||||
}
|
|
||||||
/* add some magic */
|
|
||||||
buf[0] = sig->version;
|
|
||||||
buf[1] = 0xff;
|
|
||||||
buf[2] = n >> 24; /* hmmm, n is only 16 bit, so this is always 0 */
|
|
||||||
buf[3] = n >> 16;
|
|
||||||
buf[4] = n >> 8;
|
|
||||||
buf[5] = n;
|
|
||||||
gcry_md_write (md, buf, 6);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gcry_md_putc (md, 0); /* Always hash the length of the subpacket. */
|
||||||
|
gcry_md_putc (md, 0);
|
||||||
|
n = 6;
|
||||||
|
}
|
||||||
|
/* Add some magic. */
|
||||||
|
buf[0] = sig->version;
|
||||||
|
buf[1] = 0xff;
|
||||||
|
buf[2] = n >> 24; /* (n is only 16 bit, so this is always 0) */
|
||||||
|
buf[3] = n >> 16;
|
||||||
|
buf[4] = n >> 8;
|
||||||
|
buf[5] = n;
|
||||||
|
gcry_md_write (md, buf, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Perform the sign operation. If CACHE_NONCE is given the agent is
|
/* Perform the sign operation. If CACHE_NONCE is given the agent is
|
||||||
advised to use that cached passphrase fro the key. */
|
advised to use that cached passphrase fro the key. */
|
||||||
static int
|
static int
|
||||||
@ -520,26 +515,6 @@ hash_for (PKT_public_key *pk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return true iff all keys in SK_LIST are old style (v3 RSA). */
|
|
||||||
static int
|
|
||||||
only_old_style (SK_LIST sk_list)
|
|
||||||
{
|
|
||||||
SK_LIST sk_rover = NULL;
|
|
||||||
int old_style = 0;
|
|
||||||
|
|
||||||
for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next)
|
|
||||||
{
|
|
||||||
PKT_public_key *pk = sk_rover->pk;
|
|
||||||
|
|
||||||
if (pk->pubkey_algo == PUBKEY_ALGO_RSA && pk->version < 4)
|
|
||||||
old_style = 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return old_style;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_status_sig_created (PKT_public_key *pk, PKT_signature *sig, int what)
|
print_status_sig_created (PKT_public_key *pk, PKT_signature *sig, int what)
|
||||||
{
|
{
|
||||||
@ -705,10 +680,8 @@ write_signature_packets (SK_LIST sk_list, IOBUF out, gcry_md_hd_t hash,
|
|||||||
|
|
||||||
/* Build the signature packet. */
|
/* Build the signature packet. */
|
||||||
sig = xmalloc_clear (sizeof *sig);
|
sig = xmalloc_clear (sizeof *sig);
|
||||||
if (opt.force_v3_sigs)
|
if (duration || opt.sig_policy_url
|
||||||
sig->version = 3;
|
|| opt.sig_notations || opt.sig_keyserver_url)
|
||||||
else if (duration || opt.sig_policy_url
|
|
||||||
|| opt.sig_notations || opt.sig_keyserver_url)
|
|
||||||
sig->version = 4;
|
sig->version = 4;
|
||||||
else
|
else
|
||||||
sig->version = pk->version;
|
sig->version = pk->version;
|
||||||
@ -727,11 +700,8 @@ write_signature_packets (SK_LIST sk_list, IOBUF out, gcry_md_hd_t hash,
|
|||||||
if (gcry_md_copy (&md, hash))
|
if (gcry_md_copy (&md, hash))
|
||||||
BUG ();
|
BUG ();
|
||||||
|
|
||||||
if (sig->version >= 4)
|
build_sig_subpkt_from_sig (sig);
|
||||||
{
|
mk_notation_policy_etc (sig, pk, NULL);
|
||||||
build_sig_subpkt_from_sig (sig);
|
|
||||||
mk_notation_policy_etc (sig, pk, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_sigversion_to_magic (md, sig);
|
hash_sigversion_to_magic (md, sig);
|
||||||
gcry_md_final (md);
|
gcry_md_final (md);
|
||||||
@ -814,13 +784,10 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
|
|||||||
&& (rc=setup_symkey(&efx.symkey_s2k,&efx.symkey_dek)))
|
&& (rc=setup_symkey(&efx.symkey_s2k,&efx.symkey_dek)))
|
||||||
goto leave;
|
goto leave;
|
||||||
|
|
||||||
if(!opt.force_v3_sigs)
|
if (opt.ask_sig_expire && !opt.batch)
|
||||||
{
|
duration = ask_expire_interval(1,opt.def_sig_expire);
|
||||||
if(opt.ask_sig_expire && !opt.batch)
|
else
|
||||||
duration=ask_expire_interval(1,opt.def_sig_expire);
|
duration = parse_expire_string(opt.def_sig_expire);
|
||||||
else
|
|
||||||
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. */
|
||||||
@ -1123,30 +1090,22 @@ clearsign_file( const char *fname, strlist_t locusr, const char *outfile )
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
SK_LIST sk_list = NULL;
|
SK_LIST sk_list = NULL;
|
||||||
SK_LIST sk_rover = NULL;
|
SK_LIST sk_rover = NULL;
|
||||||
int old_style = 0;
|
|
||||||
int only_md5 = 0;
|
|
||||||
u32 duration=0;
|
u32 duration=0;
|
||||||
|
|
||||||
pfx = new_progress_context ();
|
pfx = new_progress_context ();
|
||||||
afx = new_armor_context ();
|
afx = new_armor_context ();
|
||||||
init_packet( &pkt );
|
init_packet( &pkt );
|
||||||
|
|
||||||
if(!opt.force_v3_sigs)
|
if (opt.ask_sig_expire && !opt.batch)
|
||||||
{
|
duration = ask_expire_interval (1,opt.def_sig_expire);
|
||||||
if(opt.ask_sig_expire && !opt.batch)
|
else
|
||||||
duration=ask_expire_interval(1,opt.def_sig_expire);
|
duration = parse_expire_string (opt.def_sig_expire);
|
||||||
else
|
|
||||||
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( locusr, &sk_list, PUBKEY_USAGE_SIG )) )
|
if( (rc=build_sk_list( locusr, &sk_list, PUBKEY_USAGE_SIG )) )
|
||||||
goto leave;
|
goto leave;
|
||||||
|
|
||||||
if(!duration )
|
|
||||||
old_style = only_old_style( sk_list );
|
|
||||||
|
|
||||||
/* 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)))
|
||||||
@ -1184,18 +1143,7 @@ clearsign_file( const char *fname, strlist_t locusr, const char *outfile )
|
|||||||
|
|
||||||
iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----" LF );
|
iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----" LF );
|
||||||
|
|
||||||
for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next)
|
{
|
||||||
{
|
|
||||||
if (hash_for (sk_rover->pk) == DIGEST_ALGO_MD5)
|
|
||||||
only_md5 = 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
only_md5 = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !(old_style && only_md5) ) {
|
|
||||||
const char *s;
|
const char *s;
|
||||||
int any = 0;
|
int any = 0;
|
||||||
byte hashs_seen[256];
|
byte hashs_seen[256];
|
||||||
@ -1234,8 +1182,8 @@ clearsign_file( const char *fname, strlist_t locusr, const char *outfile )
|
|||||||
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, (old_style && only_md5) );
|
opt.escape_from);
|
||||||
/* fixme: check for read errors */
|
/* fixme: check for read errors */
|
||||||
|
|
||||||
/* now write the armor */
|
/* now write the armor */
|
||||||
@ -1292,13 +1240,10 @@ sign_symencrypt_file (const char *fname, strlist_t locusr)
|
|||||||
memset( &cfx, 0, sizeof cfx);
|
memset( &cfx, 0, sizeof cfx);
|
||||||
init_packet( &pkt );
|
init_packet( &pkt );
|
||||||
|
|
||||||
if(!opt.force_v3_sigs)
|
if (opt.ask_sig_expire && !opt.batch)
|
||||||
{
|
duration = ask_expire_interval (1, opt.def_sig_expire);
|
||||||
if(opt.ask_sig_expire && !opt.batch)
|
else
|
||||||
duration=ask_expire_interval(1,opt.def_sig_expire);
|
duration = parse_expire_string (opt.def_sig_expire);
|
||||||
else
|
|
||||||
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. */
|
||||||
@ -1441,52 +1386,39 @@ sign_symencrypt_file (const char *fname, strlist_t locusr)
|
|||||||
* applied (actually: dropped) when a v3 key is used. TIMESTAMP is
|
* applied (actually: dropped) when a v3 key is used. TIMESTAMP is
|
||||||
* the timestamp to use for the signature. 0 means "now" */
|
* the timestamp to use for the signature. 0 means "now" */
|
||||||
int
|
int
|
||||||
make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
|
make_keysig_packet (PKT_signature **ret_sig, PKT_public_key *pk,
|
||||||
PKT_user_id *uid, PKT_public_key *subpk,
|
PKT_user_id *uid, PKT_public_key *subpk,
|
||||||
PKT_public_key *pksk,
|
PKT_public_key *pksk,
|
||||||
int sigclass, int digest_algo,
|
int sigclass, int digest_algo,
|
||||||
int sigversion, u32 timestamp, u32 duration,
|
u32 timestamp, u32 duration,
|
||||||
int (*mksubpkt)(PKT_signature *, void *), void *opaque,
|
int (*mksubpkt)(PKT_signature *, void *), void *opaque,
|
||||||
const char *cache_nonce)
|
const char *cache_nonce)
|
||||||
{
|
{
|
||||||
PKT_signature *sig;
|
PKT_signature *sig;
|
||||||
int rc=0;
|
int rc=0;
|
||||||
|
int sigversion;
|
||||||
gcry_md_hd_t md;
|
gcry_md_hd_t md;
|
||||||
|
|
||||||
assert( (sigclass >= 0x10 && sigclass <= 0x13) || sigclass == 0x1F
|
assert( (sigclass >= 0x10 && sigclass <= 0x13) || sigclass == 0x1F
|
||||||
|| sigclass == 0x20 || sigclass == 0x18 || sigclass == 0x19
|
|| sigclass == 0x20 || sigclass == 0x18 || sigclass == 0x19
|
||||||
|| sigclass == 0x30 || sigclass == 0x28 );
|
|| sigclass == 0x30 || sigclass == 0x28 );
|
||||||
|
|
||||||
if (opt.force_v4_certs)
|
sigversion = 4;
|
||||||
sigversion = 4;
|
|
||||||
|
|
||||||
if (sigversion < pksk->version)
|
if (sigversion < pksk->version)
|
||||||
sigversion = pksk->version;
|
sigversion = pksk->version;
|
||||||
|
|
||||||
/* If you are making a signature on a v4 key using your v3 key, it
|
|
||||||
doesn't make sense to generate a v3 sig. After all, no v3-only
|
|
||||||
PGP implementation could understand the v4 key in the first
|
|
||||||
place. Note that this implies that a signature on an attribute
|
|
||||||
uid is usually going to be v4 as well, since they are not
|
|
||||||
generally found on v3 keys. */
|
|
||||||
if (sigversion < pk->version)
|
|
||||||
sigversion = pk->version;
|
|
||||||
|
|
||||||
if( !digest_algo )
|
if( !digest_algo )
|
||||||
{
|
{
|
||||||
/* Basically, this means use SHA1 always unless it's a v3 RSA
|
/* Basically, this means use SHA1 always unless the user
|
||||||
key making a v3 cert (use MD5), or the user specified
|
specified something (use whatever they said), or it's DSA
|
||||||
something (use whatever they said), or it's DSA (use the
|
(use the best match). They still can't pick an
|
||||||
best match). They still can't pick an inappropriate hash
|
inappropriate hash for DSA or the signature will fail.
|
||||||
for DSA or the signature will fail. Note that this still
|
Note that this still allows the caller of
|
||||||
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;
|
||||||
else if(pksk->pubkey_algo == PUBKEY_ALGO_RSA
|
|
||||||
&& pk->version<4 && sigversion<4)
|
|
||||||
digest_algo = DIGEST_ALGO_MD5;
|
|
||||||
else if(pksk->pubkey_algo == PUBKEY_ALGO_DSA)
|
else if(pksk->pubkey_algo == PUBKEY_ALGO_DSA)
|
||||||
digest_algo = match_dsa_hash (gcry_mpi_get_nbits (pksk->pkey[1])/8);
|
digest_algo = match_dsa_hash (gcry_mpi_get_nbits (pksk->pkey[1])/8);
|
||||||
else if (pksk->pubkey_algo == PUBKEY_ALGO_ECDSA
|
else if (pksk->pubkey_algo == PUBKEY_ALGO_ECDSA
|
||||||
@ -1533,16 +1465,14 @@ make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
|
|||||||
if(duration)
|
if(duration)
|
||||||
sig->expiredate=sig->timestamp+duration;
|
sig->expiredate=sig->timestamp+duration;
|
||||||
sig->sig_class = sigclass;
|
sig->sig_class = sigclass;
|
||||||
if( sig->version >= 4 )
|
|
||||||
{
|
build_sig_subpkt_from_sig( sig );
|
||||||
build_sig_subpkt_from_sig( sig );
|
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( sig->version >= 4 && mksubpkt )
|
if (mksubpkt)
|
||||||
rc = (*mksubpkt)( sig, opaque );
|
rc = (*mksubpkt)( sig, opaque );
|
||||||
|
|
||||||
if( !rc ) {
|
if( !rc ) {
|
||||||
@ -1627,17 +1557,14 @@ update_keysig_packet( PKT_signature **ret_sig,
|
|||||||
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. */
|
||||||
|
|
||||||
if( sig->version >= 4 )
|
/* Put the updated timestamp into the sig. Note that this will
|
||||||
{
|
automagically lower any sig expiration dates to correctly
|
||||||
/* Put the updated timestamp into the sig. Note that this
|
correspond to the differences in the timestamps (i.e. the
|
||||||
will automagically lower any sig expiration dates to
|
duration will shrink). */
|
||||||
correctly correspond to the differences in the timestamps
|
build_sig_subpkt_from_sig( sig );
|
||||||
(i.e. the duration will shrink). */
|
|
||||||
build_sig_subpkt_from_sig( sig );
|
|
||||||
|
|
||||||
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);
|
||||||
|
@ -161,7 +161,7 @@ text_filter( void *opaque, int control,
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md,
|
copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md,
|
||||||
int escape_dash, int escape_from, int pgp2mode )
|
int escape_dash, int escape_from)
|
||||||
{
|
{
|
||||||
unsigned int maxlen;
|
unsigned int maxlen;
|
||||||
byte *buffer = NULL; /* malloced buffer */
|
byte *buffer = NULL; /* malloced buffer */
|
||||||
@ -170,10 +170,7 @@ copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md,
|
|||||||
int truncated = 0;
|
int truncated = 0;
|
||||||
int pending_lf = 0;
|
int pending_lf = 0;
|
||||||
|
|
||||||
if( !opt.pgp2_workarounds )
|
if( !escape_dash )
|
||||||
pgp2mode = 0;
|
|
||||||
|
|
||||||
if( !escape_dash )
|
|
||||||
escape_from = 0;
|
escape_from = 0;
|
||||||
|
|
||||||
write_status_begin_signing (md);
|
write_status_begin_signing (md);
|
||||||
@ -194,9 +191,7 @@ copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md,
|
|||||||
gcry_md_putc ( md, '\n' );
|
gcry_md_putc ( md, '\n' );
|
||||||
}
|
}
|
||||||
gcry_md_write ( md, buffer,
|
gcry_md_write ( md, buffer,
|
||||||
len_without_trailing_chars (buffer, n,
|
len_without_trailing_chars (buffer, n, " \t\r\n"));
|
||||||
pgp2mode?
|
|
||||||
" \r\n":" \t\r\n"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gcry_md_write ( md, buffer, n );
|
gcry_md_write ( md, buffer, n );
|
||||||
|
@ -24,7 +24,7 @@ dsa_usrname1="pgp5"
|
|||||||
# we use the sub key because we do not yet have the logic to to derive
|
# we use the sub key because we do not yet have the logic to to derive
|
||||||
# the first encryption key from a keyblock (I guess) (Well of course
|
# the first encryption key from a keyblock (I guess) (Well of course
|
||||||
# we have this by now and the notation below will lookup the primary
|
# we have this by now and the notation below will lookup the primary
|
||||||
# first and the search for the encryption subkey.)
|
# first and then search for the encryption subkey.)
|
||||||
dsa_usrname2="0xCB879DE9"
|
dsa_usrname2="0xCB879DE9"
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user