41 #define DETECT_TRANSFORM_FROM_BASE64_MODE_DEFAULT (uint8_t) SCBase64ModeRFC4648
42 static void DetectTransformFromBase64DecodeRegisterTests(
void);
45 static void DetectTransformFromBase64Id(
const uint8_t **data, uint32_t *length,
void *context)
48 SCDetectTransformFromBase64Data *b64d = (SCDetectTransformFromBase64Data *)context;
52 *data = (
const uint8_t *)b64d;
53 *length =
sizeof(*b64d);
60 SCTransformBase64Free(ptr);
64 static SCDetectTransformFromBase64Data *DetectTransformFromBase64DecodeParse(
const char *
str)
66 SCDetectTransformFromBase64Data *tbd = SCTransformBase64Parse(
str);
82 static int DetectTransformFromBase64DecodeSetup(
89 SCDetectTransformFromBase64Data *b64d = DetectTransformFromBase64DecodeParse(opts_str);
93 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_OFFSET_VAR) {
94 SCLogError(
"offset value must be a value, not a variable name");
98 if (b64d->flags & DETECT_TRANSFORM_BASE64_FLAG_NBYTES_VAR) {
99 SCLogError(
"byte value must be a value, not a variable name");
107 DetectTransformFromBase64DecodeFree(
de_ctx, b64d);
111 static void TransformFromBase64Decode(
114 SCDetectTransformFromBase64Data *b64d = options;
115 const uint8_t *input = buffer->
inspect;
117 uint32_t decode_length = input_len;
119 SCBase64Mode mode = b64d->mode;
120 uint32_t
offset = b64d->offset;
121 uint32_t nbytes = b64d->nbytes;
133 if (nbytes > decode_length) {
134 SCLogDebug(
"byte count %d plus offset %d exceeds length %d; returning", nbytes,
offset,
138 decode_length = nbytes;
140 if (decode_length == 0) {
144 uint32_t decoded_size = SCBase64DecodeBufferSize(decode_length);
145 uint8_t decoded[decoded_size];
146 uint32_t num_decoded = SCBase64Decode((
const uint8_t *)input, decode_length, mode, decoded);
147 if (num_decoded > 0) {
164 DetectTransformFromBase64DecodeRegisterTests;
171 static int DetectTransformFromBase64DecodeTest01(
void)
173 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
174 uint32_t input_len = strlen((
char *)input);
175 const char *result =
"This is Suricata";
176 uint32_t result_len = strlen((
char *)result);
177 SCDetectTransformFromBase64Data b64d = {
186 TransformFromBase64Decode(NULL, &buffer, &b64d);
195 static int DetectTransformFromBase64DecodeTest01a(
void)
197 const uint8_t *input = (
const uint8_t *)
"Zm 9v Ym Fy";
198 uint32_t input_len = strlen((
char *)input);
199 const char *result =
"foobar";
200 uint32_t result_len = strlen((
char *)result);
201 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeRFC2045 };
207 TransformFromBase64Decode(NULL, &buffer, &b64d);
216 static int DetectTransformFromBase64DecodeTest02(
void)
218 const uint8_t *input = (
const uint8_t *)
"This is Suricata\n";
219 uint32_t input_len = strlen((
char *)input);
220 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeStrict };
225 buffer_orig = buffer;
227 TransformFromBase64Decode(NULL, &buffer, &b64d);
236 static int DetectTransformFromBase64DecodeTest03(
void)
238 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
239 uint32_t input_len = strlen((
char *)input);
241 SCDetectTransformFromBase64Data b64d = {
242 .nbytes = input_len + 1,
249 TransformFromBase64Decode(NULL, &buffer, &b64d);
250 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
257 static int DetectTransformFromBase64DecodeTest04(
void)
259 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
260 uint32_t input_len = strlen((
char *)input);
262 SCDetectTransformFromBase64Data b64d = {
263 .offset = input_len + 1,
270 TransformFromBase64Decode(NULL, &buffer, &b64d);
271 FAIL_IF_NOT(strncmp((
const char *)input, (
const char *)buffer.
inspect, input_len) == 0);
278 static int DetectTransformFromBase64DecodeTest05(
void)
280 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
281 uint32_t input_len = strlen((
char *)input);
282 const char *result =
"This is S";
283 uint32_t result_len = strlen((
char *)result);
285 SCDetectTransformFromBase64Data b64d = {
294 TransformFromBase64Decode(NULL, &buffer, &b64d);
303 static int DetectTransformFromBase64DecodeTest06(
void)
305 const uint8_t *input = (
const uint8_t *)
"VGhpcyBpcyBTdXJpY2F0YQ==";
306 uint32_t input_len = strlen((
char *)input);
307 const char *result =
"s is Suricata";
308 uint32_t result_len = strlen((
char *)result);
310 SCDetectTransformFromBase64Data b64d = {
319 TransformFromBase64Decode(NULL, &buffer, &b64d);
328 static int DetectTransformFromBase64DecodeTest07(
void)
331 const uint8_t *input = (
const uint8_t *)
"SGVs bG8 gV29y bGQ=";
332 uint32_t input_len = strlen((
char *)input);
333 const char *result =
"Hello Wor";
334 uint32_t result_len = strlen((
char *)result);
336 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len - 4,
337 .mode = SCBase64ModeRFC2045 };
343 TransformFromBase64Decode(NULL, &buffer, &b64d);
352 static int DetectTransformFromBase64DecodeTest08(
void)
355 const uint8_t *input = (
const uint8_t *)
"This is not base64-encoded";
356 uint32_t input_len = strlen((
char *)input);
358 SCDetectTransformFromBase64Data b64d = { .nbytes = input_len, .mode = SCBase64ModeRFC2045 };
364 TransformFromBase64Decode(NULL, &buffer, &b64d);
370 static void DetectTransformFromBase64DecodeRegisterTests(
void)
372 UtRegisterTest(
"DetectTransformFromBase64DecodeTest01", DetectTransformFromBase64DecodeTest01);
374 "DetectTransformFromBase64DecodeTest01a", DetectTransformFromBase64DecodeTest01a);
375 UtRegisterTest(
"DetectTransformFromBase64DecodeTest02", DetectTransformFromBase64DecodeTest02);
376 UtRegisterTest(
"DetectTransformFromBase64DecodeTest03", DetectTransformFromBase64DecodeTest03);
377 UtRegisterTest(
"DetectTransformFromBase64DecodeTest04", DetectTransformFromBase64DecodeTest04);
378 UtRegisterTest(
"DetectTransformFromBase64DecodeTest05", DetectTransformFromBase64DecodeTest05);
379 UtRegisterTest(
"DetectTransformFromBase64DecodeTest06", DetectTransformFromBase64DecodeTest06);
380 UtRegisterTest(
"DetectTransformFromBase64DecodeTest07", DetectTransformFromBase64DecodeTest07);
381 UtRegisterTest(
"DetectTransformFromBase64DecodeTest08", DetectTransformFromBase64DecodeTest08);