41 static void DetectTransformFromBase64DecodeFree(
DetectEngineCtx *,
void *);
43 #define DETECT_TRANSFORM_FROM_BASE64_MODE_DEFAULT (uint8_t) Base64ModeRFC4648
44 static void DetectTransformFromBase64DecodeRegisterTests(
void);
46 static void TransformFromBase64Decode(
InspectionBuffer *buffer,
void *options);
58 DetectTransformFromBase64DecodeRegisterTests;
65 SCTransformBase64Free(ptr);
68 static SCDetectTransformFromBase64Data *DetectTransformFromBase64DecodeParse(
const char *
str)
70 SCDetectTransformFromBase64Data *tbd = SCTransformBase64Parse(
str);
86 static int DetectTransformFromBase64DecodeSetup(
93 SCDetectTransformFromBase64Data *b64d = DetectTransformFromBase64DecodeParse(opts_str);
97 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_OFFSET_VAR) {
98 SCLogError(
"offset value must be a value, not a variable name");
102 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_NBYTES_VAR) {
103 SCLogError(
"byte value must be a value, not a variable name");
111 DetectTransformFromBase64DecodeFree(
de_ctx, b64d);
115 static void TransformFromBase64Decode(
InspectionBuffer *buffer,
void *options)
117 SCDetectTransformFromBase64Data *b64d = options;
118 const uint8_t *input = buffer->
inspect;
120 uint32_t decode_length = input_len;
122 Base64Mode mode = b64d->mode;
123 uint32_t
offset = b64d->offset;
124 uint32_t nbytes = b64d->nbytes;
136 if (nbytes > decode_length) {
137 SCLogDebug(
"byte count %d plus offset %d exceeds length %d; returning", nbytes,
offset,
141 decode_length = nbytes;
143 if (decode_length == 0) {
147 uint32_t decoded_size = Base64DecodeBufferSize(decode_length);
148 uint8_t decoded[decoded_size];
149 uint32_t num_decoded = Base64Decode((
const uint8_t *)input, decode_length, mode, decoded);
150 if (num_decoded > 0) {
158 static int DetectTransformFromBase64DecodeTest01(
void)
160 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
161 uint32_t input_len = strlen((
char *)input);
162 const char *result =
"This is Suricata";
163 uint32_t result_len = strlen((
char *)result);
164 SCDetectTransformFromBase64Data b64d = {
173 TransformFromBase64Decode(&buffer, &b64d);
182 static int DetectTransformFromBase64DecodeTest01a(
void)
184 const uint8_t *input = (
const uint8_t *)
"Zm 9v Ym Fy";
185 uint32_t input_len = strlen((
char *)input);
186 const char *result =
"foobar";
187 uint32_t result_len = strlen((
char *)result);
188 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = Base64ModeRFC2045 };
194 TransformFromBase64Decode(&buffer, &b64d);
203 static int DetectTransformFromBase64DecodeTest02(
void)
205 const uint8_t *input = (
const uint8_t *)
"This is Suricata\n";
206 uint32_t input_len = strlen((
char *)input);
207 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = Base64ModeStrict };
212 buffer_orig = buffer;
214 TransformFromBase64Decode(&buffer, &b64d);
223 static int DetectTransformFromBase64DecodeTest03(
void)
225 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
226 uint32_t input_len = strlen((
char *)input);
228 SCDetectTransformFromBase64Data b64d = {
229 .nbytes = input_len + 1,
236 TransformFromBase64Decode(&buffer, &b64d);
237 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
244 static int DetectTransformFromBase64DecodeTest04(
void)
246 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
247 uint32_t input_len = strlen((
char *)input);
249 SCDetectTransformFromBase64Data b64d = {
250 .offset = input_len + 1,
257 TransformFromBase64Decode(&buffer, &b64d);
258 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
265 static int DetectTransformFromBase64DecodeTest05(
void)
267 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
268 uint32_t input_len = strlen((
char *)input);
269 const char *result =
"This is S";
270 uint32_t result_len = strlen((
char *)result);
272 SCDetectTransformFromBase64Data b64d = {
281 TransformFromBase64Decode(&buffer, &b64d);
290 static int DetectTransformFromBase64DecodeTest06(
void)
292 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
293 uint32_t input_len = strlen((
char *)input);
294 const char *result =
"s is Suricata";
295 uint32_t result_len = strlen((
char *)result);
297 SCDetectTransformFromBase64Data b64d = {
306 TransformFromBase64Decode(&buffer, &b64d);
315 static int DetectTransformFromBase64DecodeTest07(
void)
318 const uint8_t *input = (
const uint8_t *)
"SGVs bG8 gV29y bGQ=";
319 uint32_t input_len = strlen((
char *)input);
320 const char *result =
"Hello Wor";
321 uint32_t result_len = strlen((
char *)result);
323 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len - 4,
324 .mode = Base64ModeRFC2045 };
330 TransformFromBase64Decode(&buffer, &b64d);
339 static int DetectTransformFromBase64DecodeTest08(
void)
342 const uint8_t *input = (
const uint8_t *)
"This is not base64-encoded";
343 uint32_t input_len = strlen((
char *)input);
345 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = Base64ModeRFC2045 };
351 TransformFromBase64Decode(&buffer, &b64d);
357 static void DetectTransformFromBase64DecodeRegisterTests(
void)
359 UtRegisterTest(
"DetectTransformFromBase64DecodeTest01", DetectTransformFromBase64DecodeTest01);
361 "DetectTransformFromBase64DecodeTest01a", DetectTransformFromBase64DecodeTest01a);
362 UtRegisterTest(
"DetectTransformFromBase64DecodeTest02", DetectTransformFromBase64DecodeTest02);
363 UtRegisterTest(
"DetectTransformFromBase64DecodeTest03", DetectTransformFromBase64DecodeTest03);
364 UtRegisterTest(
"DetectTransformFromBase64DecodeTest04", DetectTransformFromBase64DecodeTest04);
365 UtRegisterTest(
"DetectTransformFromBase64DecodeTest05", DetectTransformFromBase64DecodeTest05);
366 UtRegisterTest(
"DetectTransformFromBase64DecodeTest06", DetectTransformFromBase64DecodeTest06);
367 UtRegisterTest(
"DetectTransformFromBase64DecodeTest07", DetectTransformFromBase64DecodeTest07);
368 UtRegisterTest(
"DetectTransformFromBase64DecodeTest08", DetectTransformFromBase64DecodeTest08);