@@ -5,7 +5,7 @@ use std::collections::HashMap;
5
5
6
6
pub fn encode_base64 ( input : & FieldValue , utf16modifier : & Option < Utf16Modifier > ) -> String {
7
7
let mut encoded = match utf16modifier {
8
- Some ( Utf16Modifier :: Utf16le ) => STANDARD_NO_PAD . encode (
8
+ Some ( Utf16Modifier :: Utf16le | Utf16Modifier :: Wide ) => STANDARD_NO_PAD . encode (
9
9
input
10
10
. value_to_string ( )
11
11
. encode_utf16 ( )
@@ -19,6 +19,16 @@ pub fn encode_base64(input: &FieldValue, utf16modifier: &Option<Utf16Modifier>)
19
19
. flat_map ( |x| x. to_be_bytes ( ) )
20
20
. collect :: < Vec < u8 > > ( ) ,
21
21
) ,
22
+ Some ( Utf16Modifier :: Utf16 ) => {
23
+ let mut bytes = vec ! [ 0xFF , 0xFE ] ;
24
+ bytes. extend (
25
+ input
26
+ . value_to_string ( )
27
+ . encode_utf16 ( )
28
+ . flat_map ( |x| x. to_le_bytes ( ) ) ,
29
+ ) ;
30
+ STANDARD_NO_PAD . encode ( bytes)
31
+ }
22
32
None => STANDARD_NO_PAD . encode ( input. value_to_string ( ) ) ,
23
33
} ;
24
34
if encoded. len ( ) % 4 == 2 || encoded. len ( ) % 4 == 3 {
@@ -36,7 +46,7 @@ pub fn encode_base64_offset(
36
46
let mut encoded = vec ! [ ] ;
37
47
38
48
let char_width = match utf16modifier {
39
- Some ( Utf16Modifier :: Utf16be ) | Some ( Utf16Modifier :: Utf16le ) => 2 ,
49
+ Some ( _ ) => 2 ,
40
50
None => 1 ,
41
51
} ;
42
52
@@ -151,6 +161,37 @@ mod tests {
151
161
assert_eq ! ( encode_base64( & input, & Some ( Utf16Modifier :: Utf16be ) ) , "" ) ;
152
162
}
153
163
164
+ #[ test]
165
+ fn test_base64_sub_modifiers_docs_example ( ) {
166
+ // https://github.com/SigmaHQ/sigma-specification/blob/main/appendix/sigma-modifiers-appendix.md#encoding
167
+
168
+ let input = FieldValue :: from ( "cmd" ) ;
169
+
170
+ // utf16le: Transforms value to UTF16-LE encoding, e.g. cmd > 63 00 6d 00 64 00
171
+ assert_eq ! (
172
+ encode_base64( & input, & Some ( Utf16Modifier :: Utf16le ) ) ,
173
+ "YwBtAGQA"
174
+ ) ;
175
+
176
+ // utf16be: Transforms value to UTF16-BE encoding, e.g. cmd > 00 63 00 6d 00 64
177
+ assert_eq ! (
178
+ encode_base64( & input, & Some ( Utf16Modifier :: Utf16be ) ) ,
179
+ "AGMAbQBk"
180
+ ) ;
181
+
182
+ // utf16: Prepends a byte order mark and encodes UTF16, e.g. cmd > FF FE 63 00 6d 00 64 00
183
+ assert_eq ! (
184
+ encode_base64( & input, & Some ( Utf16Modifier :: Utf16 ) ) ,
185
+ "//5jAG0AZA"
186
+ ) ;
187
+
188
+ // wide: an alias for the utf16le modifier.
189
+ assert_eq ! (
190
+ encode_base64( & input, & Some ( Utf16Modifier :: Wide ) ) ,
191
+ "YwBtAGQA"
192
+ ) ;
193
+ }
194
+
154
195
#[ test]
155
196
fn test_base64_offset_bash ( ) {
156
197
let encoded = encode_base64_offset ( & FieldValue :: from ( "/bin/bash" ) , & None ) ;
0 commit comments