mirror of
git://git.gnupg.org/gnupg.git
synced 2024-10-30 19:58:44 +01:00
sm: More improvements for PKCS#12 parsing for latest IVBB changes.
* common/tlv.h (TLV_PARSER_FLAG_T5793): New.
(tlv_parser_new): New macro. Rename function with an underscore.
(tlv_next_with_flag): New.
* common/tlv-parser.c (struct tlv_parser_s): Remove const from buffer.
Add fields crammed, lasttlv, and origoff. Remove bufferlist ands ist
definition.
(dump_to_file): New but disabled debug helper.
(parse_tag): Print more info on error.
(_tlv_parser_new): Add args lasttlv and LNO. Take a copy of the data.
(_tlv_parser_release): Free the copy of the buffer and return the
recorded TLV object from tlv_parser_new.
(_tlv_peek, tlv_parser_peek, _tlv_parser_peek_null): Remove.
(_tlv_push): Record crammed length.
(_tlv_pop): Restore crammed length.
(_tlv_parser_next): Add arg flags. More debug output. Handle cramming
here. Take care of cramming here.
(tlv_expect_object): Simplify to adjust for changes in _tlv_parser_next.
(tlv_expect_octet_string): Remove arg encapsulates. Adjust for
changes in _tlv_parser_next. Change all allers.
(tlv_expect_null): New.
(cram_octet_string): Rewrite.
(need_octet_string_cramming): Remove.
* sm/minip12.c (dump_to_file): New. Enable in debug mode and if an
envvar ist set. Replace all explict but disabled dumping to call this
function.
(parse_bag_encrypted_data): Replace tlv_peek_null and a peeking for an
optional SET by non-peeking code.
(parse_cert_bag): Ditto.
(parse_shrouded_key_bag): Replace tlv_peek_null by non-peeking code.
(parse_bag_encrypted_data): Use the new TLV_PARSER_FLAG_T5793 to
enable the Mozilla workaround.
(parse_bag_encrypted_data): Replace the 'renewed_tlv' code by the new
tlv_parser_release semantics.
(parse_shrouded_key_bag): Ditto.
(parse_shrouded_key_bag): Create a new context instead of using the
former encapsulated mechanism for tlv_expect_octet_string.
(parse_bag_data): Ditto.
(p12_parse): Ditto.
* common/tlv-parser.c: New
* common/Makefile.am: Add new file.
--
GnuPG-bug-id: 7213
Backported-from-master: 690fd61a0c
This backport required to introduce the new tlv-parser.c file and
remove most source copied stuff from minip12.c. Thus the above
ChangeList is not fully correct.
This commit is contained in:
parent
1d0874c3d2
commit
0dcd1504ba
@ -61,7 +61,7 @@ common_sources = \
|
|||||||
openpgpdefs.h \
|
openpgpdefs.h \
|
||||||
gc-opt-flags.h \
|
gc-opt-flags.h \
|
||||||
sexp-parse.h \
|
sexp-parse.h \
|
||||||
tlv.c tlv.h tlv-builder.c \
|
tlv.c tlv.h tlv-builder.c tlv-parser.c \
|
||||||
init.c init.h \
|
init.c init.h \
|
||||||
sexputil.c \
|
sexputil.c \
|
||||||
sysutils.c sysutils.h \
|
sysutils.c sysutils.h \
|
||||||
|
65
common/tlv.h
65
common/tlv.h
@ -72,10 +72,22 @@ enum tlv_tag_type {
|
|||||||
TAG_BMP_STRING = 30
|
TAG_BMP_STRING = 30
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct tag_info
|
||||||
|
{
|
||||||
|
int class;
|
||||||
|
int is_constructed;
|
||||||
|
unsigned long tag;
|
||||||
|
size_t length; /* length part of the TLV */
|
||||||
|
size_t nhdr;
|
||||||
|
int ndef; /* It is an indefinite length */
|
||||||
|
};
|
||||||
|
|
||||||
struct tlv_builder_s;
|
struct tlv_builder_s;
|
||||||
typedef struct tlv_builder_s *tlv_builder_t;
|
typedef struct tlv_builder_s *tlv_builder_t;
|
||||||
|
|
||||||
|
struct tlv_parser_s;
|
||||||
|
typedef struct tlv_parser_s *tlv_parser_t;
|
||||||
|
|
||||||
/*-- tlv.c --*/
|
/*-- tlv.c --*/
|
||||||
|
|
||||||
/* Locate a TLV encoded data object in BUFFER of LENGTH and return a
|
/* Locate a TLV encoded data object in BUFFER of LENGTH and return a
|
||||||
@ -138,6 +150,59 @@ void put_tlv_to_membuf (membuf_t *membuf, int class, int tag,
|
|||||||
size_t get_tlv_length (int class, int tag, int constructed, size_t length);
|
size_t get_tlv_length (int class, int tag, int constructed, size_t length);
|
||||||
|
|
||||||
|
|
||||||
|
/*-- tlv-parser.c --*/
|
||||||
|
#define TLV_PARSER_FLAG_T5793 1 /* Enable workaround for Mozilla bug. */
|
||||||
|
|
||||||
|
tlv_parser_t _tlv_parser_new (const unsigned char *buffer, size_t bufsize,
|
||||||
|
int verbosity, tlv_parser_t lasttlv, int lno);
|
||||||
|
tlv_parser_t _tlv_parser_release (tlv_parser_t tlv, int lno);
|
||||||
|
|
||||||
|
void _tlv_parser_dump_tag (const char *text, int lno, tlv_parser_t tlv);
|
||||||
|
void _tlv_parser_dump_state (const char *text, const char *text2,
|
||||||
|
int lno, tlv_parser_t tlv);
|
||||||
|
|
||||||
|
gpg_error_t _tlv_parser_next (tlv_parser_t tlv, unsigned int flags, int lno);
|
||||||
|
|
||||||
|
unsigned int tlv_parser_level (tlv_parser_t tlv);
|
||||||
|
size_t tlv_parser_offset (tlv_parser_t tlv);
|
||||||
|
const char *tlv_parser_lastfunc (tlv_parser_t tlv);
|
||||||
|
const char *tlv_parser_lasterrstr (tlv_parser_t tlv);
|
||||||
|
void tlv_parser_set_pending (tlv_parser_t tlv);
|
||||||
|
size_t tlv_parser_tag_length (tlv_parser_t tlv, int with_header);
|
||||||
|
|
||||||
|
void tlv_parser_skip (tlv_parser_t tlv);
|
||||||
|
|
||||||
|
gpg_error_t tlv_expect_sequence (tlv_parser_t tlv);
|
||||||
|
gpg_error_t tlv_expect_context_tag (tlv_parser_t tlv, int *r_tag);
|
||||||
|
gpg_error_t tlv_expect_set (tlv_parser_t tlv);
|
||||||
|
gpg_error_t tlv_expect_object (tlv_parser_t tlv, int class, int tag,
|
||||||
|
unsigned char const **r_data,
|
||||||
|
size_t *r_datalen);
|
||||||
|
gpg_error_t tlv_expect_octet_string (tlv_parser_t tlv,
|
||||||
|
unsigned char const **r_data,
|
||||||
|
size_t *r_datalen);
|
||||||
|
gpg_error_t tlv_expect_integer (tlv_parser_t tlv, int *r_value);
|
||||||
|
#ifdef GCRYPT_VERSION
|
||||||
|
gpg_error_t tlv_expect_mpinteger (tlv_parser_t tlv, int ignore_zero,
|
||||||
|
gcry_mpi_t *r_value);
|
||||||
|
#endif
|
||||||
|
gpg_error_t tlv_expect_object_id (tlv_parser_t tlv,
|
||||||
|
unsigned char const **r_oid,
|
||||||
|
size_t *r_oidlen);
|
||||||
|
gpg_error_t tlv_expect_null (tlv_parser_t tlv);
|
||||||
|
|
||||||
|
/* Easier to use wrapper around parse_ber_header. */
|
||||||
|
gpg_error_t tlv_parse_tag (unsigned char const **buffer,
|
||||||
|
size_t *size, struct tag_info *ti);
|
||||||
|
|
||||||
|
/* Convenience macro and macros to include the line number. */
|
||||||
|
#define tlv_parser_new(a,b,c,d) _tlv_parser_new ((a),(b),(c),(d), __LINE__)
|
||||||
|
#define tlv_parser_release(a) _tlv_parser_release ((a), __LINE__)
|
||||||
|
#define tlv_parser_dump_tag(a,b) _tlv_parser_dump_tag ((a),__LINE__,(b))
|
||||||
|
#define tlv_parser_dump_state(a,b,c) \
|
||||||
|
_tlv_parser_dump_state ((a),(b),__LINE__,(c))
|
||||||
|
#define tlv_next(a) _tlv_parser_next ((a),0, __LINE__)
|
||||||
|
#define tlv_next_with_flag(a,b) _tlv_parser_next ((a),(b), __LINE__)
|
||||||
|
|
||||||
|
|
||||||
#endif /* SCD_TLV_H */
|
#endif /* SCD_TLV_H */
|
||||||
|
1124
sm/minip12.c
1124
sm/minip12.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user