Skip to content

Commit eb1abf3

Browse files
committed
Add option to hide keys in log and print sha256(key) instead
1 parent bcd3db9 commit eb1abf3

18 files changed

+317
-19
lines changed

api/librdb-api.h

+17-6
Original file line numberDiff line numberDiff line change
@@ -436,20 +436,31 @@ _LIBRDB_API void RDB_IgnoreChecksum(RdbParser *p);
436436
* terminate its operation. The default threshold is unlimited. */
437437
_LIBRDB_API void RDB_setMaxRawSize(RdbParser *p, size_t maxSize);
438438

439-
/* logger */
439+
/* Following function returns a hint for the total number of items in the current
440+
* parsed key context - to assist with memory allocation or other optimizations.
441+
* If hint is not available, then return -1. */
442+
_LIBRDB_API int64_t RDB_getNumItemsHint(RdbParser *p);
443+
444+
/****************************************************************
445+
* Logger
446+
****************************************************************/
447+
/* Set the logging level for the parser */
440448
_LIBRDB_API void RDB_setLogLevel(RdbParser *p, RdbLogLevel l);
449+
450+
/* Set a custom logger callback function */
441451
_LIBRDB_API void RDB_setLogger(RdbParser *p, RdbLoggerCB f);
452+
453+
/* Log a message with the specified log level */
442454
#ifdef __GNUC__
443455
_LIBRDB_API void RDB_log(RdbParser *p, RdbLogLevel lvl, const char *format, ...)
444-
__attribute__((format(printf, 3, 4)));
456+
__attribute__((format(printf, 3, 4)));
445457
#else
446458
_LIBRDB_API void RDB_log(RdbParser *p, RdbLogLevel lvl, const char *format, ...);
447459
#endif
448460

449-
/* Following function returns a hint for the total number of items in the current
450-
* parsed key context - to assist with memory allocation or other optimizations.
451-
* If hint is not available, then return -1. */
452-
_LIBRDB_API int64_t RDB_getNumItemsHint(RdbParser *p);
461+
/* To hide keys in logs by printing first 8 hex digits of SHA256(key) instead of
462+
* printing the key itself */
463+
_LIBRDB_API void RDB_hideKeysInLog(RdbParser *p);
453464

454465
/****************************************************************
455466
* Pause the Parser

deps/redis/sha256.c

+163
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
/*********************************************************************
2+
* Filename: sha256.c
3+
* Author: Brad Conte (brad AT bradconte.com)
4+
* Copyright:
5+
* Disclaimer: This code is presented "as is" without any guarantees.
6+
* Details: Implementation of the SHA-256 hashing algorithm.
7+
SHA-256 is one of the three algorithms in the SHA2
8+
specification. The others, SHA-384 and SHA-512, are not
9+
offered in this implementation.
10+
Algorithm specification can be found here:
11+
* http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
12+
This implementation uses little endian byte order.
13+
*********************************************************************/
14+
15+
/*************************** HEADER FILES ***************************/
16+
#include <stdlib.h>
17+
#include <string.h>
18+
#include "sha256.h"
19+
20+
/****************************** MACROS ******************************/
21+
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
22+
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
23+
24+
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
25+
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
26+
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
27+
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
28+
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
29+
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
30+
31+
/**************************** VARIABLES *****************************/
32+
static const WORD k[64] = {
33+
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
34+
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
35+
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
36+
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
37+
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
38+
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
39+
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
40+
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
41+
};
42+
43+
/*********************** FUNCTION DEFINITIONS ***********************/
44+
void sha256_transform(SHA256_CTX *ctx, const BYTE data[])
45+
{
46+
WORD a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
47+
48+
for (i = 0, j = 0; i < 16; ++i, j += 4) {
49+
m[i] = ((WORD) data[j + 0] << 24) |
50+
((WORD) data[j + 1] << 16) |
51+
((WORD) data[j + 2] << 8) |
52+
((WORD) data[j + 3]);
53+
}
54+
55+
for ( ; i < 64; ++i)
56+
m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
57+
58+
a = ctx->state[0];
59+
b = ctx->state[1];
60+
c = ctx->state[2];
61+
d = ctx->state[3];
62+
e = ctx->state[4];
63+
f = ctx->state[5];
64+
g = ctx->state[6];
65+
h = ctx->state[7];
66+
67+
for (i = 0; i < 64; ++i) {
68+
t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
69+
t2 = EP0(a) + MAJ(a,b,c);
70+
h = g;
71+
g = f;
72+
f = e;
73+
e = d + t1;
74+
d = c;
75+
c = b;
76+
b = a;
77+
a = t1 + t2;
78+
}
79+
80+
ctx->state[0] += a;
81+
ctx->state[1] += b;
82+
ctx->state[2] += c;
83+
ctx->state[3] += d;
84+
ctx->state[4] += e;
85+
ctx->state[5] += f;
86+
ctx->state[6] += g;
87+
ctx->state[7] += h;
88+
}
89+
90+
void sha256_init(SHA256_CTX *ctx)
91+
{
92+
ctx->datalen = 0;
93+
ctx->bitlen = 0;
94+
ctx->state[0] = 0x6a09e667;
95+
ctx->state[1] = 0xbb67ae85;
96+
ctx->state[2] = 0x3c6ef372;
97+
ctx->state[3] = 0xa54ff53a;
98+
ctx->state[4] = 0x510e527f;
99+
ctx->state[5] = 0x9b05688c;
100+
ctx->state[6] = 0x1f83d9ab;
101+
ctx->state[7] = 0x5be0cd19;
102+
}
103+
104+
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len)
105+
{
106+
WORD i;
107+
108+
for (i = 0; i < len; ++i) {
109+
ctx->data[ctx->datalen] = data[i];
110+
ctx->datalen++;
111+
if (ctx->datalen == 64) {
112+
sha256_transform(ctx, ctx->data);
113+
ctx->bitlen += 512;
114+
ctx->datalen = 0;
115+
}
116+
}
117+
}
118+
119+
void sha256_final(SHA256_CTX *ctx, BYTE hash[])
120+
{
121+
WORD i;
122+
123+
i = ctx->datalen;
124+
125+
// Pad whatever data is left in the buffer.
126+
if (ctx->datalen < 56) {
127+
ctx->data[i++] = 0x80;
128+
while (i < 56)
129+
ctx->data[i++] = 0x00;
130+
}
131+
else {
132+
ctx->data[i++] = 0x80;
133+
while (i < 64)
134+
ctx->data[i++] = 0x00;
135+
sha256_transform(ctx, ctx->data);
136+
memset(ctx->data, 0, 56);
137+
}
138+
139+
// Append to the padding the total message's length in bits and transform.
140+
ctx->bitlen += ctx->datalen * 8;
141+
ctx->data[63] = ctx->bitlen;
142+
ctx->data[62] = ctx->bitlen >> 8;
143+
ctx->data[61] = ctx->bitlen >> 16;
144+
ctx->data[60] = ctx->bitlen >> 24;
145+
ctx->data[59] = ctx->bitlen >> 32;
146+
ctx->data[58] = ctx->bitlen >> 40;
147+
ctx->data[57] = ctx->bitlen >> 48;
148+
ctx->data[56] = ctx->bitlen >> 56;
149+
sha256_transform(ctx, ctx->data);
150+
151+
// Since this implementation uses little endian byte ordering and SHA uses big endian,
152+
// reverse all the bytes when copying the final state to the output hash.
153+
for (i = 0; i < 4; ++i) {
154+
hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
155+
hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
156+
hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
157+
hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
158+
hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
159+
hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
160+
hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
161+
hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
162+
}
163+
}

deps/redis/sha256.h

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*********************************************************************
2+
* Filename: sha256.h
3+
* Author: Brad Conte (brad AT bradconte.com)
4+
* Copyright:
5+
* Disclaimer: This code is presented "as is" without any guarantees.
6+
* Details: Defines the API for the corresponding SHA256 implementation.
7+
*********************************************************************/
8+
9+
#ifndef SHA256_H
10+
#define SHA256_H
11+
12+
/*************************** HEADER FILES ***************************/
13+
#include <stddef.h>
14+
#include <stdint.h>
15+
16+
/****************************** MACROS ******************************/
17+
#define SHA256_BLOCK_SIZE 32 // SHA256 outputs a 32 byte digest
18+
19+
/**************************** DATA TYPES ****************************/
20+
typedef uint8_t BYTE; // 8-bit byte
21+
typedef uint32_t WORD; // 32-bit word
22+
23+
typedef struct {
24+
BYTE data[64];
25+
WORD datalen;
26+
unsigned long long bitlen;
27+
WORD state[8];
28+
} SHA256_CTX;
29+
30+
/*********************** FUNCTION DECLARATIONS **********************/
31+
void sha256_init(SHA256_CTX *ctx);
32+
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len);
33+
void sha256_final(SHA256_CTX *ctx, BYTE hash[]);
34+
35+
#endif // SHA256_H

src/cli/rdb-cli.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,8 @@ int matchRdbDataType(const char *dataTypeStr) {
342342
if (!strcmp(dataTypeStr, "func")) return RDB_DATA_TYPE_FUNCTION;
343343

344344
loggerWrap(RDB_LOG_ERR,
345-
"Invalid TYPE argument (%s). Valid values: str, list, set, zset, hash, module, stream, func",
346-
dataTypeStr);
345+
"Invalid TYPE argument (%s). Valid values: str, list, set, zset, hash, module, stream, func",
346+
dataTypeStr);
347347
exit(1);
348348
}
349349

src/ext/common.c src/ext/extCommon.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "common.h"
1+
#include "extCommon.h"
22
#include "../../deps/redis/util.h"
33

44
/* Example:: Input: length=123 return: buf="\r\n$123\r\n" */

src/ext/common.h src/ext/extCommon.h

+3
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,7 @@ static inline void iov_plain(struct iovec *iov, const char *s, size_t l) {
5050
iov->iov_len = l;
5151
}
5252

53+
/*** hidden LIB API function (not declared in librdb-api.h) ***/
54+
_LIBRDB_API char *__RDB_key(RdbParser *p, char *key, char buf[9]);
55+
5356
#endif /*define RDBX_COMMON_H*/

src/ext/handlersFilter.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <regex.h>
22
#include <string.h>
33
#include "../lib/defines.h" /* valid include since it brings only RDB_* defines */
4-
#include "common.h"
4+
#include "extCommon.h"
55

66
struct RdbxFilter {
77
regex_t regex_compiled;

src/ext/handlersToJson.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <stdio.h>
55
#include <string.h>
66
#include <ctype.h>
7-
#include "common.h"
7+
#include "extCommon.h"
88
#include "../../deps/redis/util.h"
99

1010
struct RdbxToJson;

src/ext/handlersToPrint.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <stdio.h>
33
#include <string.h>
44
#include <ctype.h>
5-
#include "common.h"
5+
#include "extCommon.h"
66
#include "../../deps/redis/util.h"
77

88
struct RdbxToPrint;

src/ext/handlersToResp.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <assert.h>
33
#include <sys/uio.h>
44
#include <inttypes.h>
5-
#include "common.h"
5+
#include "extCommon.h"
66

77
#include "../../deps/redis/crc64.h"
88
#include "../../deps/redis/util.h"

src/ext/readerFile.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <stdio.h>
22
#include <string.h>
33
#include <errno.h>
4-
#include "common.h"
4+
#include "extCommon.h"
55

66
struct RdbxReaderFile {
77
RdbParser *parser;

src/ext/readerFileDesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <string.h>
66
#include <errno.h>
77
#include <unistd.h>
8-
#include "common.h"
8+
#include "extCommon.h"
99

1010

1111
struct RdbxReaderFileDesc {

src/ext/respToFileWriter.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include <stdio.h>
2-
#include "common.h"
2+
#include "extCommon.h"
33
#include <string.h>
44
#include <errno.h>
55

src/ext/respToRedisLoader.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <netinet/in.h>
77
#include <arpa/inet.h>
88
#include <errno.h>
9-
#include "common.h"
9+
#include "extCommon.h"
1010
#include "readerResp.h"
1111

1212
#ifdef USE_OPENSSL
@@ -71,10 +71,11 @@ static int onReadRepliesErrorCb(void *context, char *msg) {
7171
(strstr(msg, "not found"))) /* error includes "not found" */
7272
return 0; /* mask error */
7373

74+
char buf[9];
7475
RDB_reportError(ctx->p, (RdbRes) RDBX_ERR_RESP_WRITE,
7576
"\nerror from dst '-%s' on key '%s' on command '%s' (RESP Command #%zu)\n",
7677
msg,
77-
ctx->pendingCmds.key[currIdx],
78+
__RDB_key(ctx->p, ctx->pendingCmds.key[currIdx], buf),
7879
ctx->pendingCmds.cmd[currIdx],
7980
ctx->respReader.countReplies);
8081

0 commit comments

Comments
 (0)