From: Jason Ish Date: Thu, 6 Jan 2022 17:28:40 +0000 (-0600) Subject: rust/http2: use base64 crate for base64 decode X-Git-Tag: suricata-7.0.0-beta1~1083 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50fdcd098c9148819e9634f781e17f04e62b69b7;p=thirdparty%2Fsuricata.git rust/http2: use base64 crate for base64 decode --- diff --git a/rust/src/http2/detect.rs b/rust/src/http2/detect.rs index f08acd523b..b4e834a225 100644 --- a/rust/src/http2/detect.rs +++ b/rust/src/http2/detect.rs @@ -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 { - 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, 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);