summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-03-08 09:03:08 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2013-03-08 09:03:08 +0100
commitb19a3072bde93afa1ad04c684a38ad0a3177ab22 (patch)
treed760348a30d0bac96d5a1adcfbb501d360f070db
parent80f2b9f0cba2c55dcb1640fe73ceec55eda80348 (diff)
downloadrsyslog-b19a3072bde93afa1ad04c684a38ad0a3177ab22.tar.gz
rsyslog-b19a3072bde93afa1ad04c684a38ad0a3177ab22.tar.bz2
rsyslog-b19a3072bde93afa1ad04c684a38ad0a3177ab22.zip
logsig: write integers in most compact from to tlv file
-rw-r--r--runtime/librsgt.c60
-rw-r--r--tools/rsgttlvdump.c7
2 files changed, 43 insertions, 24 deletions
diff --git a/runtime/librsgt.c b/runtime/librsgt.c
index 72a1dfeb..b3e23628 100644
--- a/runtime/librsgt.c
+++ b/runtime/librsgt.c
@@ -59,15 +59,6 @@ typedef unsigned char uchar;
#define VERSION "no-version"
#endif
-static void
-outputhash(GTDataHash *hash)
-{
- unsigned i;
- for(i = 0 ; i < hash->digest_length ; ++i)
- printf("%2.2x", hash->digest[i]);
- printf("\n");
-}
-
void
rsgtInit(char *usragent)
@@ -159,19 +150,45 @@ tlvbufAddOctetString(gtctx ctx, uint8_t *octet, int size)
for(i = 0 ; i < size ; ++i)
tlvbufAddOctet(ctx, octet[i]);
}
-static inline void
-tlvbufAddInt32(gtctx ctx, uint32_t val)
-{
- tlvbufAddOctet(ctx, (val >> 24) & 0xff);
- tlvbufAddOctet(ctx, (val >> 16) & 0xff);
- tlvbufAddOctet(ctx, (val >> 8) & 0xff);
- tlvbufAddOctet(ctx, val & 0xff);
+/* return the actual length in to-be-written octets of an integer */
+static inline uint8_t
+tlvbufGetInt64OctetSize(uint64_t val)
+{
+ if(val >> 56)
+ return 8;
+ if((val >> 48) & 0xff)
+ return 7;
+ if((val >> 40) & 0xff)
+ return 6;
+ if((val >> 32) & 0xff)
+ return 5;
+ if((val >> 24) & 0xff)
+ return 4;
+ if((val >> 16) & 0xff)
+ return 3;
+ if((val >> 8) & 0xff)
+ return 2;
+ return 1;
}
static inline void
tlvbufAddInt64(gtctx ctx, uint64_t val)
{
- tlvbufAddInt32(ctx, (val >> 32) & 0xffffffff);
- tlvbufAddInt32(ctx, val & 0xffffffff);
+ uint8_t doWrite = 0;
+ if(val >> 56)
+ tlvbufAddOctet(ctx, (val >> 56) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 48) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 48) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 40) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 40) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 32) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 32) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 24) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 24) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 16) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 16) & 0xff), doWrite = 1;
+ if(doWrite || ((val >> 8) & 0xff))
+ tlvbufAddOctet(ctx, (val >> 8) & 0xff), doWrite = 1;
+ tlvbufAddOctet(ctx, val & 0xff);
}
@@ -204,13 +221,14 @@ void
tlvWriteBlockSig(gtctx ctx, uchar *der, uint16_t lenDer)
{
unsigned tlvlen;
+ uint8_t tlvlenRecords;
+ tlvlenRecords = tlvbufGetInt64OctetSize(ctx->nRecords);
tlvlen = 2 + 1 /* hash algo TLV */ +
2 + hashOutputLengthOctets(ctx->hashAlg) /* iv */ +
2 + 1 + ctx->lenBlkStrtHash /* last hash */ +
- 2 + 8 /* rec-count (64 bit integer) */ +
+ 2 + tlvlenRecords /* rec-count */ +
4 + lenDer /* rfc-3161 */;
-printf("TTTT: tlvlen %u, lenDer %u\n", tlvlen, lenDer);
/* write top-level TLV object (block-sig */
tlv16Write(ctx, 0x00, 0x0902, tlvlen);
/* and now write the children */
@@ -226,7 +244,7 @@ printf("TTTT: tlvlen %u, lenDer %u\n", tlvlen, lenDer);
tlvbufAddOctet(ctx, hashIdentifier(ctx->hashAlg));
tlvbufAddOctetString(ctx, ctx->blkStrtHash, ctx->lenBlkStrtHash);
/* rec-count */
- tlv8Write(ctx, 0x00, 0x03, 8);
+ tlv8Write(ctx, 0x00, 0x03, tlvlenRecords);
tlvbufAddInt64(ctx, ctx->nRecords);
/* rfc-3161 */
tlv16Write(ctx, 0x00, 0x906, lenDer);
diff --git a/tools/rsgttlvdump.c b/tools/rsgttlvdump.c
index 256a85b5..9b536db1 100644
--- a/tools/rsgttlvdump.c
+++ b/tools/rsgttlvdump.c
@@ -40,6 +40,7 @@ processFile(char *name)
uchar hdr[9];
uint16_t tlvtype, tlvlen;
void *obj;
+ int r = -1;
if(!strcmp(name, "-"))
fp = stdin;
@@ -50,10 +51,10 @@ processFile(char *name)
goto err;
}
}
- if(rsgt_tlvrdHeader(fp, hdr) != 0) goto err;
+ if((r = rsgt_tlvrdHeader(fp, hdr)) != 0) goto err;
printf("File Header: '%s'\n", hdr);
while(1) { /* we will err out on EOF */
- if(rsgt_tlvrd(fp, &tlvtype, &tlvlen, &obj) != 0) {
+ if((r = rsgt_tlvrd(fp, &tlvtype, &tlvlen, &obj)) != 0) {
if(feof(fp))
break;
else
@@ -65,7 +66,7 @@ processFile(char *name)
if(fp != stdin)
fclose(fp);
return;
-err: fprintf(stderr, "error processing file %s\n", name);
+err: fprintf(stderr, "error %d processing file %s\n", r, name);
}
int