]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust/http2: use base64 crate for base64 decode
authorJason Ish <jason.ish@oisf.net>
Thu, 6 Jan 2022 17:28:40 +0000 (11:28 -0600)
committerVictor Julien <vjulien@oisf.net>
Tue, 11 Jan 2022 06:30:48 +0000 (07:30 +0100)
rust/src/http2/detect.rs

index f08acd523b18163439bddfe2e159b28d1b57135e..b4e834a225adb40200fdd6853203413f664af685 100644 (file)
@@ -965,108 +965,8 @@ pub unsafe extern "C" fn rs_http2_tx_set_uri(
     http2_tx_set_header(state, ":path".as_bytes(), slice)
 }
 
-#[derive(Debug, PartialEq)]
-pub enum Http2Base64Error {
-    InvalidBase64,
-}
-
-impl std::error::Error for Http2Base64Error {}
-
-impl std::fmt::Display for Http2Base64Error {
-    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
-        write!(f, "invalid base64")
-    }
-}
-
-fn http2_base64_map(input: u8) -> Result<u8, Http2Base64Error> {
-    match input {
-        43 => Ok(62),  // +
-        47 => Ok(63),  // /
-        48 => Ok(52),  // 0
-        49 => Ok(53),  // 1
-        50 => Ok(54),  // 2
-        51 => Ok(55),  // 3
-        52 => Ok(56),  // 4
-        53 => Ok(57),  // 5
-        54 => Ok(58),  // 6
-        55 => Ok(59),  // 7
-        56 => Ok(60),  // 8
-        57 => Ok(61),  // 9
-        65 => Ok(0),   // A
-        66 => Ok(1),   // B
-        67 => Ok(2),   // C
-        68 => Ok(3),   // D
-        69 => Ok(4),   // E
-        70 => Ok(5),   // F
-        71 => Ok(6),   // G
-        72 => Ok(7),   // H
-        73 => Ok(8),   // I
-        74 => Ok(9),   // J
-        75 => Ok(10),  // K
-        76 => Ok(11),  // L
-        77 => Ok(12),  // M
-        78 => Ok(13),  // N
-        79 => Ok(14),  // O
-        80 => Ok(15),  // P
-        81 => Ok(16),  // Q
-        82 => Ok(17),  // R
-        83 => Ok(18),  // S
-        84 => Ok(19),  // T
-        85 => Ok(20),  // U
-        86 => Ok(21),  // V
-        87 => Ok(22),  // W
-        88 => Ok(23),  // X
-        89 => Ok(24),  // Y
-        90 => Ok(25),  // Z
-        97 => Ok(26),  // a
-        98 => Ok(27),  // b
-        99 => Ok(28),  // c
-        100 => Ok(29), // d
-        101 => Ok(30), // e
-        102 => Ok(31), // f
-        103 => Ok(32), // g
-        104 => Ok(33), // h
-        105 => Ok(34), // i
-        106 => Ok(35), // j
-        107 => Ok(36), // k
-        108 => Ok(37), // l
-        109 => Ok(38), // m
-        110 => Ok(39), // n
-        111 => Ok(40), // o
-        112 => Ok(41), // p
-        113 => Ok(42), // q
-        114 => Ok(43), // r
-        115 => Ok(44), // s
-        116 => Ok(45), // t
-        117 => Ok(46), // u
-        118 => Ok(47), // v
-        119 => Ok(48), // w
-        120 => Ok(49), // x
-        121 => Ok(50), // y
-        122 => Ok(51), // z
-        _ => Err(Http2Base64Error::InvalidBase64),
-    }
-}
-
-fn http2_decode_base64(input: &[u8]) -> Result<Vec<u8>, Http2Base64Error> {
-    if input.len() % 4 != 0 {
-        return Err(Http2Base64Error::InvalidBase64);
-    }
-    let mut r = vec![0; (input.len() * 3) / 4];
-    for i in 0..input.len() / 4 {
-        let i1 = http2_base64_map(input[4 * i])?;
-        let i2 = http2_base64_map(input[4 * i + 1])?;
-        let i3 = http2_base64_map(input[4 * i + 2])?;
-        let i4 = http2_base64_map(input[4 * i + 3])?;
-        r[3 * i] = (i1 << 2) | (i2 >> 4);
-        r[3 * i + 1] = (i2 << 4) | (i3 >> 2);
-        r[3 * i + 2] = (i3 << 6) | i4;
-    }
-    return Ok(r);
-}
-
 fn http2_tx_set_settings(state: &mut HTTP2State, input: &[u8]) {
-    match http2_decode_base64(input) {
+    match base64::decode(input) {
         Ok(dec) => {
             if dec.len() % 6 != 0 {
                 state.set_event(HTTP2Event::InvalidHTTP1Settings);