diff options
author | Werner Koch <[email protected]> | 2024-09-09 14:41:35 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2024-09-09 14:47:04 +0000 |
commit | d528d0b065334b4c8c52e66441160e308b51d24f (patch) | |
tree | 6d4e920f8b0c9fdda0515d8e035b3533ee475aba /g10/parse-packet.c | |
parent | gpg: Improve detection of input data read errors. (diff) | |
download | gnupg-d528d0b065334b4c8c52e66441160e308b51d24f.tar.gz gnupg-d528d0b065334b4c8c52e66441160e308b51d24f.zip |
gpg: New commands --add-recipients and --change-recipients.
* g10/gpg.c (aAddRecipients, aChangeRecipients): New consts.
(opts): Add --add-recipients and --change-recipients.
(main): Handle them.
* g10/gpg.h (struct server_control_s): Add fields modify_recipients,
clear_recipients, and last_read_ctb.
* g10/armor.c (was_armored): New.
* g10/decrypt.c (decrypt_message): Add optional arg 'remusr'. Handle
re-encryption if desired.
* g10/encrypt.c (write_pubkey_enc): Factor info printing out to ...
(show_encrypted_for_user_info): new.
(reencrypt_to_new_recipients): New.
* g10/packet.h (struct parse_packet_ctx_s): Add fields only_fookey_enc
and last_ctb.
(init_parse_packet): Clear them.
* g10/parse-packet.c (parse): Store CTB in the context. Early return
on pubkey_enc and symkey_enc packets if requested.
* g10/mainproc.c (proc_encrypted): Allow for PKT being NULL. Return
early in modify-recipients mode.
(proc_encryption_packets): Add two optional args 'r_dek' and 'r_list'.
Adjust callers. Call do_proc_packets in modify-recipients mode
depending on the optional args.
(do_proc_packets): Add arg 'keep_dek_and_list'. Adjust callers. Save
the last read CTB in CTRL and return after the last fooenc_enc
packets.
--
This basically works but does not yet handle symmetric encrypted
packets (symkey_enc).
GnuPG-bug-id: 1825
(Yes, this is an at least 9 year old feature request)
Diffstat (limited to '')
-rw-r--r-- | g10/parse-packet.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 8bd283b4b..a16f70fea 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -763,6 +763,7 @@ parse (parse_packet_ctx_t ctx, PACKET *pkt, int onlykeypkts, off_t * retpos, rc = -1; goto leave; } + ctx->last_ctb = ctb; hdrlen = 0; hdr[hdrlen++] = ctb; @@ -774,18 +775,28 @@ parse (parse_packet_ctx_t ctx, PACKET *pkt, int onlykeypkts, off_t * retpos, } /* Immediately following the header is the length. There are two - formats: the old format and the new format. If bit 6 (where the - least significant bit is bit 0) is set in the tag, then we are - dealing with a new format packet. Otherwise, it is an old format - packet. */ + * formats: the old format and the new format. If bit 6 (where the + * least significant bit is bit 0) is set in the tag, then we are + * dealing with a new format packet. Otherwise, it is an old format + * packet. In the new format the packet's type is encoded in the 6 + * least significant bits of the tag; in the old format it is + * encoded in bits 2-5. */ pktlen = 0; new_ctb = !!(ctb & 0x40); if (new_ctb) + pkttype = ctb & 0x3f; + else + pkttype = (ctb >> 2) & 0xf; + + if (ctx->only_fookey_enc + && !(pkttype == PKT_SYMKEY_ENC || pkttype == PKT_PUBKEY_ENC)) { - /* Get the packet's type. This is encoded in the 6 least - significant bits of the tag. */ - pkttype = ctb & 0x3f; + rc = gpg_error (GPG_ERR_TRUE); + goto leave; + } + if (new_ctb) + { /* Extract the packet's length. New format packets have 4 ways to encode the packet length. The value of the first byte determines the encoding and partially determines the length. @@ -855,12 +866,8 @@ parse (parse_packet_ctx_t ctx, PACKET *pkt, int onlykeypkts, off_t * retpos, } } - else - /* This is an old format packet. */ + else /* This is an old format packet. */ { - /* Extract the packet's type. This is encoded in bits 2-5. */ - pkttype = (ctb >> 2) & 0xf; - /* The type of length encoding is encoded in bits 0-1 of the tag. */ lenbytes = ((ctb & 3) == 3) ? 0 : (1 << (ctb & 3)); |