Remove added length byte for keys
This commit is contained in:
parent
9fa095873c
commit
d14ce407fa
6 changed files with 47 additions and 15 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
|
@ -360,9 +360,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bhttp"
|
name = "bhttp"
|
||||||
version = "0.5.4"
|
version = "0.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2bc657efe5aa3821f1cacfb47665c32849e09820844bff9f5066227312829fa3"
|
checksum = "16fc24bc615b9fd63148f59b218ea58a444b55762f8845da910e23aca686398b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror 1.0.69",
|
"thiserror 1.0.69",
|
||||||
]
|
]
|
||||||
|
|
@ -1806,9 +1806,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ohttp"
|
name = "ohttp"
|
||||||
version = "0.5.4"
|
version = "0.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "10a20082b908632960d0aa59af61e2771502b40249d55986e8bdbcd06d723ea5"
|
checksum = "622b8959bde5da6c70b0a49e8aa359e0c79c5e8ffd23eb3781c0cc575903d862"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aead 0.4.3",
|
"aead 0.4.3",
|
||||||
"aes-gcm 0.9.2",
|
"aes-gcm 0.9.2",
|
||||||
|
|
@ -1817,7 +1817,6 @@ dependencies = [
|
||||||
"hex",
|
"hex",
|
||||||
"hkdf 0.11.0",
|
"hkdf 0.11.0",
|
||||||
"hpke",
|
"hpke",
|
||||||
"lazy_static",
|
|
||||||
"log",
|
"log",
|
||||||
"rand",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
@ -1829,7 +1828,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ohttp-gateway"
|
name = "ohttp-gateway"
|
||||||
version = "0.2.0"
|
version = "0.2.5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"axum",
|
"axum",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
authors = ["Bastian Gruber <foreach@me.com>"]
|
authors = ["Bastian Gruber <foreach@me.com>"]
|
||||||
version = "0.2.0"
|
version = "0.2.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
name = "ohttp-gateway"
|
name = "ohttp-gateway"
|
||||||
categories = ["web-programming", "web-programming::http-server"]
|
categories = ["web-programming", "web-programming::http-server"]
|
||||||
|
|
@ -22,8 +22,8 @@ hyper-util = { version = "0.1", features = ["full"] }
|
||||||
reqwest = { version = "0.12", features = ["json", "stream"] }
|
reqwest = { version = "0.12", features = ["json", "stream"] }
|
||||||
|
|
||||||
# OHTTP implementation - Using the martinthomson/ohttp crate
|
# OHTTP implementation - Using the martinthomson/ohttp crate
|
||||||
ohttp = { version = "0.5", features = ["rust-hpke"] }
|
ohttp = { version = "0.6", features = ["rust-hpke"] }
|
||||||
bhttp = "0.5"
|
bhttp = "0.6"
|
||||||
|
|
||||||
# Middleware and utilities
|
# Middleware and utilities
|
||||||
tower = "0.4"
|
tower = "0.4"
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,8 @@ async fn handle_ohttp_request_inner(
|
||||||
GatewayError::DecryptionError(format!("Failed to decapsulate: {e}"))
|
GatewayError::DecryptionError(format!("Failed to decapsulate: {e}"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
debug!("Request: {:#?}", bhttp_request);
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
"Successfully decapsulated request, {} bytes",
|
"Successfully decapsulated request, {} bytes",
|
||||||
bhttp_request.len()
|
bhttp_request.len()
|
||||||
|
|
@ -178,6 +180,8 @@ fn validate_ohttp_request(
|
||||||
/// Parse binary HTTP message with error handling
|
/// Parse binary HTTP message with error handling
|
||||||
fn parse_bhttp_message(data: &[u8]) -> Result<Message, GatewayError> {
|
fn parse_bhttp_message(data: &[u8]) -> Result<Message, GatewayError> {
|
||||||
let mut cursor = std::io::Cursor::new(data);
|
let mut cursor = std::io::Cursor::new(data);
|
||||||
|
debug!("Cursor: std::io::Cursor::new(data): {:?}", cursor);
|
||||||
|
|
||||||
Message::read_bhttp(&mut cursor)
|
Message::read_bhttp(&mut cursor)
|
||||||
.map_err(|e| GatewayError::InvalidRequest(format!("Failed to parse binary HTTP: {e}")))
|
.map_err(|e| GatewayError::InvalidRequest(format!("Failed to parse binary HTTP: {e}")))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -216,8 +216,7 @@ impl KeyManager {
|
||||||
.config
|
.config
|
||||||
.encode()?;
|
.encode()?;
|
||||||
|
|
||||||
let mut out = Vec::with_capacity(cfg_bytes.len() + 2);
|
let mut out = Vec::with_capacity(cfg_bytes.len());
|
||||||
out.extend_from_slice(&(cfg_bytes.len() as u16).to_be_bytes()); // 2-byte length
|
|
||||||
out.extend_from_slice(&cfg_bytes);
|
out.extend_from_slice(&cfg_bytes);
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -163,14 +163,14 @@ async fn test_config_serialization_format() {
|
||||||
let encoded_config = manager.get_encoded_config().await.unwrap();
|
let encoded_config = manager.get_encoded_config().await.unwrap();
|
||||||
|
|
||||||
// Verify basic structure: length prefix + config data
|
// Verify basic structure: length prefix + config data
|
||||||
assert!(encoded_config.len() >= 4);
|
assert!(encoded_config.len() >= 2);
|
||||||
|
|
||||||
let length = u16::from_be_bytes([encoded_config[0], encoded_config[1]]);
|
let length = u16::from_be_bytes([encoded_config[0], encoded_config[1]]);
|
||||||
assert_eq!(length as usize, encoded_config.len() - 2);
|
assert_eq!(length as usize, encoded_config.len());
|
||||||
|
|
||||||
// Verify it contains expected OHTTP key configuration elements
|
// Verify it contains expected OHTTP key configuration elements
|
||||||
// The exact format would depend on your implementation
|
// The exact format would depend on your implementation
|
||||||
let config_data = &encoded_config[2..];
|
let config_data = &encoded_config[..];
|
||||||
assert!(!config_data.is_empty());
|
assert!(!config_data.is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
|
use bhttp::Message;
|
||||||
|
use ohttp_gateway::GatewayError;
|
||||||
|
use std::io::Cursor;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio;
|
use tokio;
|
||||||
|
use tracing::debug;
|
||||||
// Your key manager module - adjust the import path as needed
|
// Your key manager module - adjust the import path as needed
|
||||||
use ohttp_gateway::key_manager::{CipherSuiteConfig, KeyManager, KeyManagerConfig};
|
use ohttp_gateway::key_manager::{CipherSuiteConfig, KeyManager, KeyManagerConfig};
|
||||||
|
|
||||||
|
|
@ -170,3 +173,30 @@ async fn test_cleanup_expired_keys() {
|
||||||
// Should have cleaned up the expired key
|
// Should have cleaned up the expired key
|
||||||
assert!(final_stats.total_keys <= 2);
|
assert!(final_stats.total_keys <= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_bhttp_parsing() {
|
||||||
|
// let data = &[
|
||||||
|
// 2, 3, 71, 69, 84, 5, 104, 116, 116, 112, 115, 9, 108, 111, 99, 97, 108, 104, 111, 115, 116,
|
||||||
|
// 4, 47, 103, 101, 116, 10, 117, 115, 101, 114, 45, 97, 103, 101, 110, 116, 21, 79, 72, 84,
|
||||||
|
// 84, 80, 45, 84, 101, 115, 116, 45, 67, 108, 105, 101, 110, 116, 47, 49, 46, 48, 6, 97, 99,
|
||||||
|
// 99, 101, 112, 116, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115,
|
||||||
|
// 111, 110, 0, 0,
|
||||||
|
// ];
|
||||||
|
// let mut cursor = std::io::Cursor::new(data);
|
||||||
|
//
|
||||||
|
// let m = Message::read_bhttp(&mut cursor).unwrap();
|
||||||
|
//
|
||||||
|
// println!("TEST {:?}", m);
|
||||||
|
|
||||||
|
const REQUEST: &[u8] = &[
|
||||||
|
2, 3, 71, 69, 84, 5, 104, 116, 116, 112, 115, 9, 108, 111, 99, 97, 108, 104, 111, 115, 116,
|
||||||
|
4, 47, 103, 101, 116, 10, 117, 115, 101, 114, 45, 97, 103, 101, 110, 116, 21, 79, 72, 84,
|
||||||
|
84, 80, 45, 84, 101, 115, 116, 45, 67, 108, 105, 101, 110, 116, 47, 49, 46, 48, 6, 97, 99,
|
||||||
|
99, 101, 112, 116, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115,
|
||||||
|
111, 110, 0, 0,
|
||||||
|
];
|
||||||
|
let m = Message::read_bhttp(&mut Cursor::new(REQUEST)).unwrap();
|
||||||
|
println!("TEST {:?}", m);
|
||||||
|
assert!(m.header().get(b"accept").is_some());
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue