suricata
detect-tls.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2011-2012 ANSSI
3 * Copyright (C) 2022 Open Information Security Foundation
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * \file
31 *
32 * \author Pierre Chifflier <pierre.chifflier@ssi.gouv.fr>
33 *
34 * Implements the tls.* keywords
35 */
36
37#include "suricata-common.h"
38#include "threads.h"
39#include "decode.h"
40
41#include "detect.h"
42#include "detect-parse.h"
43#include "detect-content.h"
44
45#include "detect-engine.h"
46#include "detect-engine-mpm.h"
47#include "detect-engine-state.h"
48
49#include "flow.h"
50#include "flow-var.h"
51#include "flow-util.h"
52
53#include "util-debug.h"
54#include "util-unittest.h"
56
57#include "app-layer.h"
58
59#include "app-layer-ssl.h"
60#include "detect-tls.h"
62
63#include "stream-tcp.h"
64
65/**
66 * \brief Regex for parsing "id" option, matching number or "number"
67 */
68
69#define PARSE_REGEX "^([A-z0-9\\s\\-\\.=,\\*@]+|\"[A-z0-9\\s\\-\\.=,\\*@]+\")\\s*$"
70#define PARSE_REGEX_FINGERPRINT "^([A-z0-9\\:\\*]+|\"[A-z0-9\\:\\* ]+\")\\s*$"
71
72static DetectParseRegex subject_parse_regex;
73static DetectParseRegex issuerdn_parse_regex;
74static DetectParseRegex fingerprint_parse_regex;
75
76static int DetectTlsSubjectMatch (DetectEngineThreadCtx *,
77 Flow *, uint8_t, void *, void *,
78 const Signature *, const SigMatchCtx *);
79static int DetectTlsSubjectSetup (DetectEngineCtx *, Signature *, const char *);
80static void DetectTlsSubjectFree(DetectEngineCtx *, void *);
81
82static int DetectTlsIssuerDNMatch (DetectEngineThreadCtx *,
83 Flow *, uint8_t, void *, void *,
84 const Signature *, const SigMatchCtx *);
85static int DetectTlsIssuerDNSetup (DetectEngineCtx *, Signature *, const char *);
86static void DetectTlsIssuerDNFree(DetectEngineCtx *, void *);
87
88static int DetectTlsFingerprintSetup (DetectEngineCtx *, Signature *, const char *);
89static void DetectTlsFingerprintFree(DetectEngineCtx *, void *);
90
91static int DetectTlsStoreSetup (DetectEngineCtx *, Signature *, const char *);
92static int DetectTlsStorePostMatch (DetectEngineThreadCtx *det_ctx,
93 Packet *, const Signature *s, const SigMatchCtx *unused);
94
95static int g_tls_cert_list_id = 0;
96static int g_tls_cert_fingerprint_list_id = 0;
97
98/**
99 * \brief Registration function for keyword: tls.version
100 */
102{
103 sigmatch_table[DETECT_TLS_SUBJECT].name = "tls.subject";
104 sigmatch_table[DETECT_TLS_SUBJECT].desc = "match TLS/SSL certificate Subject field";
105 sigmatch_table[DETECT_TLS_SUBJECT].url = "/rules/tls-keywords.html#tls-subject";
106 sigmatch_table[DETECT_TLS_SUBJECT].AppLayerTxMatch = DetectTlsSubjectMatch;
107 sigmatch_table[DETECT_TLS_SUBJECT].Setup = DetectTlsSubjectSetup;
108 sigmatch_table[DETECT_TLS_SUBJECT].Free = DetectTlsSubjectFree;
111
112 sigmatch_table[DETECT_TLS_ISSUERDN].name = "tls.issuerdn";
113 sigmatch_table[DETECT_TLS_ISSUERDN].desc = "match TLS/SSL certificate IssuerDN field";
114 sigmatch_table[DETECT_TLS_ISSUERDN].url = "/rules/tls-keywords.html#tls-issuerdn";
115 sigmatch_table[DETECT_TLS_ISSUERDN].AppLayerTxMatch = DetectTlsIssuerDNMatch;
116 sigmatch_table[DETECT_TLS_ISSUERDN].Setup = DetectTlsIssuerDNSetup;
117 sigmatch_table[DETECT_TLS_ISSUERDN].Free = DetectTlsIssuerDNFree;
121
122 sigmatch_table[DETECT_TLS_FINGERPRINT].name = "tls.fingerprint";
123 sigmatch_table[DETECT_TLS_FINGERPRINT].desc = "match TLS/SSL certificate SHA1 fingerprint";
124 sigmatch_table[DETECT_TLS_FINGERPRINT].url = "/rules/tls-keywords.html#tls-fingerprint";
125 sigmatch_table[DETECT_TLS_FINGERPRINT].Setup = DetectTlsFingerprintSetup;
126 sigmatch_table[DETECT_TLS_FINGERPRINT].Free = DetectTlsFingerprintFree;
130
131 sigmatch_table[DETECT_TLS_STORE].name = "tls_store";
133 sigmatch_table[DETECT_TLS_STORE].desc = "store TLS/SSL certificate on disk";
134 sigmatch_table[DETECT_TLS_STORE].url = "/rules/tls-keywords.html#tls-store";
135 sigmatch_table[DETECT_TLS_STORE].Match = DetectTlsStorePostMatch;
136 sigmatch_table[DETECT_TLS_STORE].Setup = DetectTlsStoreSetup;
138
139 DetectSetupParseRegexes(PARSE_REGEX, &subject_parse_regex);
140 DetectSetupParseRegexes(PARSE_REGEX, &issuerdn_parse_regex);
141 DetectSetupParseRegexes(PARSE_REGEX_FINGERPRINT, &fingerprint_parse_regex);
142
143 g_tls_cert_list_id = DetectBufferTypeRegister("tls_cert");
144 g_tls_cert_fingerprint_list_id = DetectBufferTypeRegister("tls.cert_fingerprint");
145
148
151}
152
153/**
154 * \brief match the specified Subject on a tls session
155 *
156 * \param t pointer to thread vars
157 * \param det_ctx pointer to the pattern matcher thread
158 * \param p pointer to the current packet
159 * \param m pointer to the sigmatch that we will cast into DetectTlsData
160 *
161 * \retval 0 no match
162 * \retval 1 match
163 */
164static int DetectTlsSubjectMatch (DetectEngineThreadCtx *det_ctx,
165 Flow *f, uint8_t flags, void *state, void *txv,
166 const Signature *s, const SigMatchCtx *m)
167{
168 SCEnter();
169
170 const DetectTlsData *tls_data = (const DetectTlsData *)m;
171 SSLState *ssl_state = (SSLState *)state;
172 if (ssl_state == NULL) {
173 SCLogDebug("no tls state, no match");
174 SCReturnInt(0);
175 }
176
177 int ret = 0;
178
179 SSLStateConnp *connp = NULL;
180 if (flags & STREAM_TOSERVER) {
181 connp = &ssl_state->client_connp;
182 } else {
183 connp = &ssl_state->server_connp;
184 }
185
186 if (connp->cert0_subject != NULL) {
187 SCLogDebug("TLS: Subject is [%s], looking for [%s]\n",
188 connp->cert0_subject, tls_data->subject);
189
190 if (strstr(connp->cert0_subject, tls_data->subject) != NULL) {
191 if (tls_data->flags & DETECT_CONTENT_NEGATED) {
192 ret = 0;
193 } else {
194 ret = 1;
195 }
196 } else {
197 if (tls_data->flags & DETECT_CONTENT_NEGATED) {
198 ret = 1;
199 } else {
200 ret = 0;
201 }
202 }
203 } else {
204 ret = 0;
205 }
206
207 SCReturnInt(ret);
208}
209
210/**
211 * \brief This function is used to parse IPV4 ip_id passed via keyword: "id"
212 *
213 * \param de_ctx Pointer to the detection engine context
214 * \param str Pointer to the user provided id option
215 *
216 * \retval id_d pointer to DetectTlsData on success
217 * \retval NULL on failure
218 */
219static DetectTlsData *DetectTlsSubjectParse (DetectEngineCtx *de_ctx, const char *str, bool negate)
220{
221 DetectTlsData *tls = NULL;
222 size_t pcre2_len;
223 const char *str_ptr;
224 char *orig = NULL;
225 char *tmp_str;
226 uint32_t flag = 0;
227
228 pcre2_match_data *match = NULL;
229 int ret = DetectParsePcreExec(&subject_parse_regex, &match, str, 0, 0);
230 if (ret != 2) {
231 SCLogError("invalid tls.subject option");
232 goto error;
233 }
234
235 if (negate)
237
238 int res = pcre2_substring_get_bynumber(match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
239 if (res < 0) {
240 SCLogError("pcre2_substring_get_bynumber failed");
241 goto error;
242 }
243
244 /* We have a correct id option */
245 tls = SCMalloc(sizeof(DetectTlsData));
246 if (unlikely(tls == NULL))
247 goto error;
248 tls->subject = NULL;
249 tls->flags = flag;
250
251 orig = SCStrdup((char*)str_ptr);
252 if (unlikely(orig == NULL)) {
253 goto error;
254 }
255 pcre2_substring_free((PCRE2_UCHAR *)str_ptr);
256
257 tmp_str=orig;
258
259 /* Let's see if we need to escape "'s */
260 if (tmp_str[0] == '"') {
261 tmp_str[strlen(tmp_str) - 1] = '\0';
262 tmp_str += 1;
263 }
264
265 tls->subject = SCStrdup(tmp_str);
266 if (unlikely(tls->subject == NULL)) {
267 goto error;
268 }
269
270 pcre2_match_data_free(match);
271 SCFree(orig);
272
273 SCLogDebug("will look for TLS subject %s", tls->subject);
274
275 return tls;
276
277error:
278 if (match) {
279 pcre2_match_data_free(match);
280 }
281 if (orig != NULL)
282 SCFree(orig);
283 if (tls != NULL)
284 DetectTlsSubjectFree(de_ctx, tls);
285 return NULL;
286
287}
288
289/**
290 * \brief this function is used to add the parsed "id" option
291 * \brief into the current signature
292 *
293 * \param de_ctx pointer to the Detection Engine Context
294 * \param s pointer to the Current Signature
295 * \param idstr pointer to the user provided "id" option
296 *
297 * \retval 0 on Success
298 * \retval -1 on Failure
299 */
300static int DetectTlsSubjectSetup (DetectEngineCtx *de_ctx, Signature *s, const char *str)
301{
302 DetectTlsData *tls = NULL;
303
305 return -1;
306
307 tls = DetectTlsSubjectParse(de_ctx, str, s->init_data->negated);
308 if (tls == NULL)
309 goto error;
310
311 /* Okay so far so good, lets get this into a SigMatch
312 * and put it in the Signature. */
313
315 de_ctx, s, DETECT_TLS_SUBJECT, (SigMatchCtx *)tls, g_tls_cert_list_id) == NULL) {
316 goto error;
317 }
318 return 0;
319
320error:
321 if (tls != NULL)
322 DetectTlsSubjectFree(de_ctx, tls);
323 return -1;
324
325}
326
327/**
328 * \brief this function will free memory associated with DetectTlsData
329 *
330 * \param id_d pointer to DetectTlsData
331 */
332static void DetectTlsSubjectFree(DetectEngineCtx *de_ctx, void *ptr)
333{
334 DetectTlsData *id_d = (DetectTlsData *)ptr;
335 if (ptr == NULL)
336 return;
337 if (id_d->subject != NULL)
338 SCFree(id_d->subject);
339 SCFree(id_d);
340}
341
342/**
343 * \brief match the specified IssuerDN on a tls session
344 *
345 * \param t pointer to thread vars
346 * \param det_ctx pointer to the pattern matcher thread
347 * \param p pointer to the current packet
348 * \param m pointer to the sigmatch that we will cast into DetectTlsData
349 *
350 * \retval 0 no match
351 * \retval 1 match
352 */
353static int DetectTlsIssuerDNMatch (DetectEngineThreadCtx *det_ctx,
354 Flow *f, uint8_t flags, void *state, void *txv,
355 const Signature *s, const SigMatchCtx *m)
356{
357 SCEnter();
358
359 const DetectTlsData *tls_data = (const DetectTlsData *)m;
360 SSLState *ssl_state = (SSLState *)state;
361 if (ssl_state == NULL) {
362 SCLogDebug("no tls state, no match");
363 SCReturnInt(0);
364 }
365
366 int ret = 0;
367
368 SSLStateConnp *connp = NULL;
369 if (flags & STREAM_TOSERVER) {
370 connp = &ssl_state->client_connp;
371 } else {
372 connp = &ssl_state->server_connp;
373 }
374
375 if (connp->cert0_issuerdn != NULL) {
376 SCLogDebug("TLS: IssuerDN is [%s], looking for [%s]\n",
377 connp->cert0_issuerdn, tls_data->issuerdn);
378
379 if (strstr(connp->cert0_issuerdn, tls_data->issuerdn) != NULL) {
380 if (tls_data->flags & DETECT_CONTENT_NEGATED) {
381 ret = 0;
382 } else {
383 ret = 1;
384 }
385 } else {
386 if (tls_data->flags & DETECT_CONTENT_NEGATED) {
387 ret = 1;
388 } else {
389 ret = 0;
390 }
391 }
392 } else {
393 ret = 0;
394 }
395
396 SCReturnInt(ret);
397}
398
399/**
400 * \brief This function is used to parse IPV4 ip_id passed via keyword: "id"
401 *
402 * \param de_ctx Pointer to the detection engine context
403 * \param str Pointer to the user provided id option
404 *
405 * \retval id_d pointer to DetectTlsData on success
406 * \retval NULL on failure
407 */
408static DetectTlsData *DetectTlsIssuerDNParse(DetectEngineCtx *de_ctx, const char *str, bool negate)
409{
410 DetectTlsData *tls = NULL;
411 size_t pcre2_len;
412 const char *str_ptr;
413 char *orig = NULL;
414 char *tmp_str;
415 uint32_t flag = 0;
416
417 pcre2_match_data *match = NULL;
418 int ret = DetectParsePcreExec(&issuerdn_parse_regex, &match, str, 0, 0);
419 if (ret != 2) {
420 SCLogError("invalid tls.issuerdn option");
421 goto error;
422 }
423
424 if (negate)
426
427 int res = pcre2_substring_get_bynumber(match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
428 if (res < 0) {
429 SCLogError("pcre2_substring_get_bynumber failed");
430 goto error;
431 }
432
433 /* We have a correct id option */
434 tls = SCMalloc(sizeof(DetectTlsData));
435 if (unlikely(tls == NULL))
436 goto error;
437 tls->issuerdn = NULL;
438 tls->flags = flag;
439
440 orig = SCStrdup((char*)str_ptr);
441 if (unlikely(orig == NULL)) {
442 goto error;
443 }
444 pcre2_substring_free((PCRE2_UCHAR *)str_ptr);
445
446 tmp_str=orig;
447
448 /* Let's see if we need to escape "'s */
449 if (tmp_str[0] == '"')
450 {
451 tmp_str[strlen(tmp_str) - 1] = '\0';
452 tmp_str += 1;
453 }
454
455 tls->issuerdn = SCStrdup(tmp_str);
456 if (unlikely(tls->issuerdn == NULL)) {
457 goto error;
458 }
459
460 SCFree(orig);
461
462 pcre2_match_data_free(match);
463 SCLogDebug("Will look for TLS issuerdn %s", tls->issuerdn);
464
465 return tls;
466
467error:
468 if (match) {
469 pcre2_match_data_free(match);
470 }
471 if (orig != NULL)
472 SCFree(orig);
473 if (tls != NULL)
474 DetectTlsIssuerDNFree(de_ctx, tls);
475 return NULL;
476
477}
478
479/**
480 * \brief this function is used to add the parsed "id" option
481 * \brief into the current signature
482 *
483 * \param de_ctx pointer to the Detection Engine Context
484 * \param s pointer to the Current Signature
485 * \param idstr pointer to the user provided "id" option
486 *
487 * \retval 0 on Success
488 * \retval -1 on Failure
489 */
490static int DetectTlsIssuerDNSetup (DetectEngineCtx *de_ctx, Signature *s, const char *str)
491{
492 DetectTlsData *tls = NULL;
493
495 return -1;
496
497 tls = DetectTlsIssuerDNParse(de_ctx, str, s->init_data->negated);
498 if (tls == NULL)
499 goto error;
500
501 /* Okay so far so good, lets get this into a SigMatch
502 * and put it in the Signature. */
503
505 de_ctx, s, DETECT_TLS_ISSUERDN, (SigMatchCtx *)tls, g_tls_cert_list_id) == NULL) {
506 goto error;
507 }
508 return 0;
509
510error:
511 if (tls != NULL)
512 DetectTlsIssuerDNFree(de_ctx, tls);
513 return -1;
514
515}
516
517/**
518 * \brief this function will free memory associated with DetectTlsData
519 *
520 * \param id_d pointer to DetectTlsData
521 */
522static void DetectTlsIssuerDNFree(DetectEngineCtx *de_ctx, void *ptr)
523{
524 DetectTlsData *id_d = (DetectTlsData *)ptr;
525 SCFree(id_d->issuerdn);
526 SCFree(id_d);
527}
528
529/**
530 * \brief This function is used to parse fingerprint passed via keyword: "fingerprint"
531 *
532 * \param de_ctx Pointer to the detection engine context
533 * \param str Pointer to the user provided fingerprint option
534 *
535 * \retval pointer to DetectTlsData on success
536 * \retval NULL on failure
537 */
538
539/**
540 * \brief this function is used to add the parsed "fingerprint" option
541 * \brief into the current signature
542 *
543 * \param de_ctx pointer to the Detection Engine Context
544 * \param s pointer to the Current Signature
545 * \param id pointer to the user provided "fingerprint" option
546 *
547 * \retval 0 on Success
548 * \retval -1 on Failure
549 */
550static int DetectTlsFingerprintSetup (DetectEngineCtx *de_ctx, Signature *s, const char *str)
551{
552 if (DetectContentSetup(de_ctx, s, str) < 0) {
553 return -1;
554 }
555
557 g_tls_cert_fingerprint_list_id, ALPROTO_TLS) < 0)
558 return -1;
559
560 return 0;
561}
562
563/**
564 * \brief this function will free memory associated with DetectTlsData
565 *
566 * \param pointer to DetectTlsData
567 */
568static void DetectTlsFingerprintFree(DetectEngineCtx *de_ctx, void *ptr)
569{
570 DetectTlsData *id_d = (DetectTlsData *)ptr;
571 SCFree(id_d);
572}
573
574/**
575 * \brief this function is used to add the parsed "store" option
576 * \brief into the current signature
577 *
578 * \param de_ctx pointer to the Detection Engine Context
579 * \param s pointer to the Current Signature
580 * \param idstr pointer to the user provided "store" option
581 *
582 * \retval 0 on Success
583 * \retval -1 on Failure
584 */
585static int DetectTlsStoreSetup (DetectEngineCtx *de_ctx, Signature *s, const char *str)
586{
587
589 return -1;
590
592
594 NULL) {
595 return -1;
596 }
597 return 0;
598}
599
600/** \warning modifies Flow::alstate */
601static int DetectTlsStorePostMatch (DetectEngineThreadCtx *det_ctx,
602 Packet *p, const Signature *s, const SigMatchCtx *unused)
603{
604 SCEnter();
605
606 if (p->flow == NULL)
607 return 0;
608
609 SSLState *ssl_state = FlowGetAppState(p->flow);
610 if (ssl_state == NULL) {
611 SCLogDebug("no tls state, no match");
612 SCReturnInt(0);
613 }
614
615 SSLStateConnp *connp;
616
617 if (PKT_IS_TOSERVER(p)) {
618 connp = &ssl_state->client_connp;
619 } else {
620 connp = &ssl_state->server_connp;
621 }
622
624 SCReturnInt(1);
625}
@ ALPROTO_TLS
@ TLS_STATE_CLIENT_CERT_DONE
#define SSL_TLS_LOG_PEM
@ TLS_STATE_SERVER_CERT_DONE
uint8_t flags
Definition decode-gre.h:0
#define PKT_IS_TOSERVER(p)
Definition decode.h:238
int DetectContentSetup(DetectEngineCtx *de_ctx, Signature *s, const char *contentstr)
Function to setup a content pattern.
#define DETECT_CONTENT_NEGATED
@ DETECT_TLS_ISSUERDN
@ DETECT_TLS_SUBJECT
@ DETECT_TLS_FINGERPRINT
@ DETECT_TLS_CERT_SUBJECT
@ DETECT_TLS_CERT_ISSUER
@ DETECT_TLS_CERT_FINGERPRINT
Data structures and function prototypes for keeping state for the detection engine.
int DetectBufferTypeRegister(const char *name)
void DetectAppLayerInspectEngineRegister(const char *name, AppProto alproto, uint32_t dir, int progress, InspectEngineFuncPtr Callback, InspectionBufferGetDataPtr GetData)
Registers an app inspection engine.
uint8_t DetectEngineInspectGenericList(DetectEngineCtx *de_ctx, DetectEngineThreadCtx *det_ctx, const struct DetectEngineAppInspectionEngine_ *engine, const Signature *s, Flow *f, uint8_t flags, void *alstate, void *txv, uint64_t tx_id)
Do the content inspection & validation for a signature.
void DetectSetupParseRegexes(const char *parse_str, DetectParseRegex *detect_parse)
int SCDetectSignatureSetAppProto(Signature *s, AppProto alproto)
int DetectParsePcreExec(DetectParseRegex *parse_regex, pcre2_match_data **match, const char *str, int start_offset, int options)
int DetectEngineContentModifierBufferSetup(DetectEngineCtx *de_ctx, Signature *s, const char *arg, int sm_type, int sm_list, AppProto alproto)
SigMatch * SCSigMatchAppendSMToList(DetectEngineCtx *de_ctx, Signature *s, uint16_t type, SigMatchCtx *ctx, const int list)
Append a SigMatch to the list type.
SigTableElmt * sigmatch_table
void DetectTlsRegister(void)
Registration function for keyword: tls.version.
Definition detect-tls.c:101
#define PARSE_REGEX
Regex for parsing "id" option, matching number or "number".
Definition detect-tls.c:69
#define PARSE_REGEX_FINGERPRINT
Definition detect-tls.c:70
#define SIGMATCH_NOOPT
Definition detect.h:1651
#define SIG_FLAG_TOCLIENT
Definition detect.h:272
#define SIG_FLAG_TLSSTORE
Definition detect.h:274
#define SIG_FLAG_TOSERVER
Definition detect.h:271
#define SIGMATCH_QUOTES_MANDATORY
Definition detect.h:1668
@ DETECT_SM_LIST_POSTMATCH
Definition detect.h:127
#define SIGMATCH_HANDLE_NEGATION
Definition detect.h:1672
SCMutex m
Definition flow-hash.h:6
DetectEngineCtx * de_ctx
main detection engine ctx
Definition detect.h:932
uint32_t flags
Definition detect-tls.h:39
char * issuerdn
Definition detect-tls.h:41
Flow data structure.
Definition flow.h:356
struct Flow_ * flow
Definition decode.h:546
uint32_t cert_log_flag
SSLv[2.0|3.[0|1|2|3]] state structure.
SSLStateConnp server_connp
SSLStateConnp client_connp
Used to start a pointer to SigMatch context Should never be dereferenced without casting to something...
Definition detect.h:351
const char * url
Definition detect.h:1462
int(* Setup)(DetectEngineCtx *, Signature *, const char *)
Definition detect.h:1441
uint16_t alternative
Definition detect.h:1457
void(* Free)(DetectEngineCtx *, void *)
Definition detect.h:1446
uint16_t flags
Definition detect.h:1450
const char * desc
Definition detect.h:1461
int(* AppLayerTxMatch)(DetectEngineThreadCtx *, Flow *, uint8_t flags, void *alstate, void *txv, const Signature *, const SigMatchCtx *)
Definition detect.h:1424
int(* Match)(DetectEngineThreadCtx *, Packet *, const Signature *, const SigMatchCtx *)
Definition detect.h:1421
const char * alias
Definition detect.h:1460
const char * name
Definition detect.h:1459
Signature container.
Definition detect.h:668
uint32_t flags
Definition detect.h:669
SignatureInitData * init_data
Definition detect.h:747
#define str(s)
#define SCEnter(...)
Definition util-debug.h:277
#define SCLogDebug(...)
Definition util-debug.h:275
#define SCReturnInt(x)
Definition util-debug.h:281
#define SCLogError(...)
Macro used to log ERROR messages.
Definition util-debug.h:267
#define SCMalloc(sz)
Definition util-mem.h:47
#define SCFree(p)
Definition util-mem.h:61
#define SCStrdup(s)
Definition util-mem.h:56
#define unlikely(expr)