aboutsummaryrefslogtreecommitdiffstats
path: root/common/tlv.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2020-04-24 11:14:05 +0000
committerWerner Koch <[email protected]>2020-04-24 13:37:48 +0000
commit5ea878274ef51c819368f021c69c518b9aef6f82 (patch)
tree5b57469a29bd00e0d88a0318880a43c465d0c29b /common/tlv.c
parentsm: Minor debug output format changes. (diff)
downloadgnupg-5ea878274ef51c819368f021c69c518b9aef6f82.tar.gz
gnupg-5ea878274ef51c819368f021c69c518b9aef6f82.zip
common: Add an easy to use DER builder.
* common/tlv-builder.c: New. * common/tlv.c: Remove stuff only used by GnuPG 1. (put_tlv_to_membuf, get_tlv_length): Move to ... * common/tlv-builder.c: here. * common/tlv.h (tlv_builder_t): New. -- Such code should actually go into libksba and we will eventually do that. However, for now it is easier to keep it here. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/tlv.c')
-rw-r--r--common/tlv.c113
1 files changed, 2 insertions, 111 deletions
diff --git a/common/tlv.c b/common/tlv.c
index 86e954a19..947464bf7 100644
--- a/common/tlv.c
+++ b/common/tlv.c
@@ -32,21 +32,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <assert.h>
-
-#if GNUPG_MAJOR_VERSION == 1
-#define GPG_ERR_EOF (-1)
-#define GPG_ERR_BAD_BER (1) /*G10ERR_GENERAL*/
-#define GPG_ERR_INV_SEXP (45) /*G10ERR_INV_ARG*/
-typedef int gpg_error_t;
-#define gpg_make_err(x,n) (n)
-#else
#include <gpg-error.h>
-#endif
+
#include "util.h"
#include "tlv.h"
+
static const unsigned char *
do_find_tlv (const unsigned char *buffer, size_t length,
int tag, size_t *nbytes, int nestlevel)
@@ -157,107 +149,6 @@ find_tlv_unchecked (const unsigned char *buffer, size_t length,
}
-/* Write TAG of CLASS to MEMBUF. CONSTRUCTED is a flag telling
- * whether the value is constructed. LENGTH gives the length of the
- * value, if it is 0 undefinite length is assumed. LENGTH is ignored
- * for the NULL tag. TAG must be less that 0x1f. */
-void
-put_tlv_to_membuf (membuf_t *membuf, int class, int tag,
- int constructed, size_t length)
-{
- unsigned char buf[20];
- int buflen = 0;
- int i;
-
- if (tag < 0x1f)
- {
- *buf = (class << 6) | tag;
- if (constructed)
- *buf |= 0x20;
- buflen++;
- }
- else
- BUG ();
-
- if (!tag && !class)
- buf[buflen++] = 0; /* end tag */
- else if (tag == TAG_NULL && !class)
- buf[buflen++] = 0; /* NULL tag */
- else if (!length)
- buf[buflen++] = 0x80; /* indefinite length */
- else if (length < 128)
- buf[buflen++] = length;
- else
- {
- /* If we know the sizeof a size_t we could support larger
- * objects - however this is pretty ridiculous */
- i = (length <= 0xff ? 1:
- length <= 0xffff ? 2:
- length <= 0xffffff ? 3: 4);
-
- buf[buflen++] = (0x80 | i);
- if (i > 3)
- buf[buflen++] = length >> 24;
- if (i > 2)
- buf[buflen++] = length >> 16;
- if (i > 1)
- buf[buflen++] = length >> 8;
- buf[buflen++] = length;
- }
-
- put_membuf (membuf, buf, buflen);
-}
-
-
-/* Return the length of the to be constructed TLV. CONSTRUCTED is a
- * flag telling whether the value is constructed. LENGTH gives the
- * length of the value, if it is 0 undefinite length is assumed.
- * LENGTH is ignored for the NULL tag. TAG must be less that 0x1f. */
-size_t
-get_tlv_length (int class, int tag, int constructed, size_t length)
-{
- size_t buflen = 0;
- int i;
-
- (void)constructed; /* Not used, but passed for uniformity of such calls. */
-
- if (tag < 0x1f)
- {
- buflen++;
- }
- else
- {
- buflen++; /* assume one and let the actual write function bail out */
- }
-
- if (!tag && !class)
- buflen++; /* end tag */
- else if (tag == TAG_NULL && !class)
- buflen++; /* NULL tag */
- else if (!length)
- buflen++; /* indefinite length */
- else if (length < 128)
- buflen++;
- else
- {
- i = (length <= 0xff ? 1:
- length <= 0xffff ? 2:
- length <= 0xffffff ? 3: 4);
-
- buflen++;
- if (i > 3)
- buflen++;
- if (i > 2)
- buflen++;
- if (i > 1)
- buflen++;
- buflen++;
- }
-
- return buflen + length;
-}
-
-
/* ASN.1 BER parser: Parse BUFFER of length SIZE and return the tag
and the length part from the TLV triplet. Update BUFFER and SIZE
on success. */