/src/suricata7/rust/src/quic/detect.rs
Line | Count | Source |
1 | | /* Copyright (C) 2021 Open Information Security Foundation |
2 | | * |
3 | | * You can copy, redistribute or modify this Program under the terms of |
4 | | * the GNU General Public License version 2 as published by the Free |
5 | | * Software Foundation. |
6 | | * |
7 | | * This program is distributed in the hope that it will be useful, |
8 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
9 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
10 | | * GNU General Public License for more details. |
11 | | * |
12 | | * You should have received a copy of the GNU General Public License |
13 | | * version 2 along with this program; if not, write to the Free Software |
14 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
15 | | * 02110-1301, USA. |
16 | | */ |
17 | | |
18 | | use crate::quic::quic::QuicTransaction; |
19 | | use std::ptr; |
20 | | |
21 | | #[no_mangle] |
22 | 0 | pub unsafe extern "C" fn rs_quic_tx_get_ua( |
23 | 0 | tx: &QuicTransaction, buffer: *mut *const u8, buffer_len: *mut u32, |
24 | 0 | ) -> u8 { |
25 | 0 | if let Some(ua) = &tx.ua { |
26 | 0 | *buffer = ua.as_ptr(); |
27 | 0 | *buffer_len = ua.len() as u32; |
28 | 0 | 1 |
29 | | } else { |
30 | 0 | *buffer = ptr::null(); |
31 | 0 | *buffer_len = 0; |
32 | 0 | 0 |
33 | | } |
34 | 0 | } |
35 | | |
36 | | #[no_mangle] |
37 | 57 | pub unsafe extern "C" fn rs_quic_tx_get_sni( |
38 | 57 | tx: &QuicTransaction, buffer: *mut *const u8, buffer_len: *mut u32, |
39 | 57 | ) -> u8 { |
40 | 57 | if let Some(sni) = &tx.sni { |
41 | 24 | *buffer = sni.as_ptr(); |
42 | 24 | *buffer_len = sni.len() as u32; |
43 | 24 | 1 |
44 | | } else { |
45 | 33 | *buffer = ptr::null(); |
46 | 33 | *buffer_len = 0; |
47 | 33 | 0 |
48 | | } |
49 | 57 | } |
50 | | |
51 | | #[no_mangle] |
52 | 10 | pub unsafe extern "C" fn rs_quic_tx_get_ja3( |
53 | 10 | tx: &QuicTransaction, buffer: *mut *const u8, buffer_len: *mut u32, |
54 | 10 | ) -> u8 { |
55 | 10 | if let Some(ja3) = &tx.ja3 { |
56 | 5 | *buffer = ja3.as_ptr(); |
57 | 5 | *buffer_len = ja3.len() as u32; |
58 | 5 | 1 |
59 | | } else { |
60 | 5 | *buffer = ptr::null(); |
61 | 5 | *buffer_len = 0; |
62 | 5 | 0 |
63 | | } |
64 | 10 | } |
65 | | |
66 | | #[no_mangle] |
67 | 1 | pub unsafe extern "C" fn rs_quic_tx_get_ja4( |
68 | 1 | tx: &QuicTransaction, buffer: *mut *const u8, buffer_len: *mut u32, |
69 | 1 | ) -> u8 { |
70 | 1 | if let Some(ja4) = &tx.ja4 { |
71 | 0 | *buffer = ja4.as_ptr(); |
72 | 0 | *buffer_len = ja4.len() as u32; |
73 | 0 | 1 |
74 | | } else { |
75 | 1 | *buffer = ptr::null(); |
76 | 1 | *buffer_len = 0; |
77 | 1 | 0 |
78 | | } |
79 | 1 | } |
80 | | |
81 | | #[no_mangle] |
82 | 95 | pub unsafe extern "C" fn rs_quic_tx_get_version( |
83 | 95 | tx: &QuicTransaction, buffer: *mut *const u8, buffer_len: *mut u32, |
84 | 95 | ) -> u8 { |
85 | 95 | if tx.header.flags.is_long { |
86 | 87 | let s = &tx.header.version_buf; |
87 | 87 | *buffer = s.as_ptr(); |
88 | 87 | *buffer_len = s.len() as u32; |
89 | 87 | 1 |
90 | | } else { |
91 | 8 | *buffer = ptr::null(); |
92 | 8 | *buffer_len = 0; |
93 | 8 | 0 |
94 | | } |
95 | 95 | } |
96 | | |
97 | | #[no_mangle] |
98 | 2.09k | pub unsafe extern "C" fn rs_quic_tx_get_cyu_hash( |
99 | 2.09k | tx: &QuicTransaction, i: u32, buffer: *mut *const u8, buffer_len: *mut u32, |
100 | 2.09k | ) -> u8 { |
101 | 2.09k | if (i as usize) < tx.cyu.len() { |
102 | 497 | let cyu = &tx.cyu[i as usize]; |
103 | | |
104 | 497 | let p = &cyu.hash; |
105 | | |
106 | 497 | *buffer = p.as_ptr(); |
107 | 497 | *buffer_len = p.len() as u32; |
108 | | |
109 | 497 | 1 |
110 | | } else { |
111 | 1.59k | *buffer = ptr::null(); |
112 | 1.59k | *buffer_len = 0; |
113 | | |
114 | 1.59k | 0 |
115 | | } |
116 | 2.09k | } |
117 | | |
118 | | #[no_mangle] |
119 | 36 | pub unsafe extern "C" fn rs_quic_tx_get_cyu_string( |
120 | 36 | tx: &QuicTransaction, i: u32, buffer: *mut *const u8, buffer_len: *mut u32, |
121 | 36 | ) -> u8 { |
122 | 36 | if (i as usize) < tx.cyu.len() { |
123 | 13 | let cyu = &tx.cyu[i as usize]; |
124 | | |
125 | 13 | let p = &cyu.string; |
126 | | |
127 | 13 | *buffer = p.as_ptr(); |
128 | 13 | *buffer_len = p.len() as u32; |
129 | 13 | 1 |
130 | | } else { |
131 | 23 | *buffer = ptr::null(); |
132 | 23 | *buffer_len = 0; |
133 | | |
134 | 23 | 0 |
135 | | } |
136 | 36 | } |