41 static void DetectTransformFromBase64DecodeFree(
DetectEngineCtx *,
void *);
43 #define DETECT_TRANSFORM_FROM_BASE64_MODE_DEFAULT (uint8_t) SCBase64ModeRFC4648
44 static void DetectTransformFromBase64DecodeRegisterTests(
void);
46 static void TransformFromBase64Decode(
59 DetectTransformFromBase64DecodeRegisterTests;
66 SCTransformBase64Free(ptr);
69 static SCDetectTransformFromBase64Data *DetectTransformFromBase64DecodeParse(
const char *
str)
71 SCDetectTransformFromBase64Data *tbd = SCTransformBase64Parse(
str);
87 static int DetectTransformFromBase64DecodeSetup(
94 SCDetectTransformFromBase64Data *b64d = DetectTransformFromBase64DecodeParse(opts_str);
98 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_OFFSET_VAR) {
99 SCLogError(
"offset value must be a value, not a variable name");
103 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_NBYTES_VAR) {
104 SCLogError(
"byte value must be a value, not a variable name");
112 DetectTransformFromBase64DecodeFree(
de_ctx, b64d);
116 static void TransformFromBase64Decode(
119 SCDetectTransformFromBase64Data *b64d = options;
120 const uint8_t *input = buffer->
inspect;
122 uint32_t decode_length = input_len;
124 SCBase64Mode mode = b64d->mode;
125 uint32_t
offset = b64d->offset;
126 uint32_t nbytes = b64d->nbytes;
138 if (nbytes > decode_length) {
139 SCLogDebug(
"byte count %d plus offset %d exceeds length %d; returning", nbytes,
offset,
143 decode_length = nbytes;
145 if (decode_length == 0) {
149 uint32_t decoded_size = SCBase64DecodeBufferSize(decode_length);
150 uint8_t decoded[decoded_size];
151 uint32_t num_decoded = SCBase64Decode((
const uint8_t *)input, decode_length, mode, decoded);
152 if (num_decoded > 0) {
160 static int DetectTransformFromBase64DecodeTest01(
void)
162 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
163 uint32_t input_len = strlen((
char *)input);
164 const char *result =
"This is Suricata";
165 uint32_t result_len = strlen((
char *)result);
166 SCDetectTransformFromBase64Data b64d = {
175 TransformFromBase64Decode(NULL, &buffer, &b64d);
184 static int DetectTransformFromBase64DecodeTest01a(
void)
186 const uint8_t *input = (
const uint8_t *)
"Zm 9v Ym Fy";
187 uint32_t input_len = strlen((
char *)input);
188 const char *result =
"foobar";
189 uint32_t result_len = strlen((
char *)result);
190 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeRFC2045 };
196 TransformFromBase64Decode(NULL, &buffer, &b64d);
205 static int DetectTransformFromBase64DecodeTest02(
void)
207 const uint8_t *input = (
const uint8_t *)
"This is Suricata\n";
208 uint32_t input_len = strlen((
char *)input);
209 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeStrict };
214 buffer_orig = buffer;
216 TransformFromBase64Decode(NULL, &buffer, &b64d);
225 static int DetectTransformFromBase64DecodeTest03(
void)
227 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
228 uint32_t input_len = strlen((
char *)input);
230 SCDetectTransformFromBase64Data b64d = {
231 .nbytes = input_len + 1,
238 TransformFromBase64Decode(NULL, &buffer, &b64d);
239 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
246 static int DetectTransformFromBase64DecodeTest04(
void)
248 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
249 uint32_t input_len = strlen((
char *)input);
251 SCDetectTransformFromBase64Data b64d = {
252 .offset = input_len + 1,
259 TransformFromBase64Decode(NULL, &buffer, &b64d);
260 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
267 static int DetectTransformFromBase64DecodeTest05(
void)
269 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
270 uint32_t input_len = strlen((
char *)input);
271 const char *result =
"This is S";
272 uint32_t result_len = strlen((
char *)result);
274 SCDetectTransformFromBase64Data b64d = {
283 TransformFromBase64Decode(NULL, &buffer, &b64d);
292 static int DetectTransformFromBase64DecodeTest06(
void)
294 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
295 uint32_t input_len = strlen((
char *)input);
296 const char *result =
"s is Suricata";
297 uint32_t result_len = strlen((
char *)result);
299 SCDetectTransformFromBase64Data b64d = {
308 TransformFromBase64Decode(NULL, &buffer, &b64d);
317 static int DetectTransformFromBase64DecodeTest07(
void)
320 const uint8_t *input = (
const uint8_t *)
"SGVs bG8 gV29y bGQ=";
321 uint32_t input_len = strlen((
char *)input);
322 const char *result =
"Hello Wor";
323 uint32_t result_len = strlen((
char *)result);
325 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len - 4,
326 .mode = SCBase64ModeRFC2045 };
332 TransformFromBase64Decode(NULL, &buffer, &b64d);
341 static int DetectTransformFromBase64DecodeTest08(
void)
344 const uint8_t *input = (
const uint8_t *)
"This is not base64-encoded";
345 uint32_t input_len = strlen((
char *)input);
347 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeRFC2045 };
353 TransformFromBase64Decode(NULL, &buffer, &b64d);
359 static void DetectTransformFromBase64DecodeRegisterTests(
void)
361 UtRegisterTest(
"DetectTransformFromBase64DecodeTest01", DetectTransformFromBase64DecodeTest01);
363 "DetectTransformFromBase64DecodeTest01a", DetectTransformFromBase64DecodeTest01a);
364 UtRegisterTest(
"DetectTransformFromBase64DecodeTest02", DetectTransformFromBase64DecodeTest02);
365 UtRegisterTest(
"DetectTransformFromBase64DecodeTest03", DetectTransformFromBase64DecodeTest03);
366 UtRegisterTest(
"DetectTransformFromBase64DecodeTest04", DetectTransformFromBase64DecodeTest04);
367 UtRegisterTest(
"DetectTransformFromBase64DecodeTest05", DetectTransformFromBase64DecodeTest05);
368 UtRegisterTest(
"DetectTransformFromBase64DecodeTest06", DetectTransformFromBase64DecodeTest06);
369 UtRegisterTest(
"DetectTransformFromBase64DecodeTest07", DetectTransformFromBase64DecodeTest07);
370 UtRegisterTest(
"DetectTransformFromBase64DecodeTest08", DetectTransformFromBase64DecodeTest08);