1use serde::{Deserialize, Serialize};
12
13#[cfg(feature = "reader")]
14pub mod fp_utils;
15#[cfg(feature = "reader")]
16pub mod tier0;
17#[cfg(feature = "reader")]
18pub mod tier1;
19#[cfg(feature = "reader")]
20pub mod tier2;
21
22pub const PIR_DEPTH: usize = 25;
30
31pub const TIER0_LAYERS: usize = 9;
33
34pub const TIER1_LAYERS: usize = 6;
36
37pub const TIER2_LAYERS: usize = 10;
39
40pub const TIER1_ROWS: usize = 1 << TIER0_LAYERS; pub const TIER2_ROWS: usize = 1 << (TIER0_LAYERS + TIER1_LAYERS); pub const TIER1_LEAVES: usize = 1 << TIER1_LAYERS; pub const TIER2_LEAVES: usize = 1 << TIER2_LAYERS; pub const YPIR_MIN_ROWS: usize = 2048;
55
56pub const TIER1_YPIR_ROWS: usize = if TIER1_ROWS >= YPIR_MIN_ROWS { TIER1_ROWS } else { YPIR_MIN_ROWS }; pub const TIER2_LEAF_BYTES: usize = 96;
62
63pub const TIER1_ROW_BYTES: usize = TIER1_LEAVES * 64; pub const TIER2_ROW_BYTES: usize = TIER2_LEAVES * TIER2_LEAF_BYTES; pub const TIER1_ITEM_BITS: usize = TIER1_ROW_BYTES * 8;
71
72pub const TIER2_ITEM_BITS: usize = TIER2_ROW_BYTES * 8;
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct PirMetadata {
80 pub root25: String,
82 pub root29: String,
84 pub num_ranges: usize,
86 pub pir_depth: usize,
88 pub tier0_bytes: usize,
90 pub tier1_rows: usize,
92 pub tier1_row_bytes: usize,
94 pub tier2_rows: usize,
96 pub tier2_row_bytes: usize,
98 pub height: Option<u64>,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct YpirScenario {
110 pub num_items: usize,
111 pub item_size_bits: usize,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct RootInfo {
117 pub root29: String,
118 pub root25: String,
119 pub num_ranges: usize,
120 pub pir_depth: usize,
121 pub height: Option<u64>,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct HealthInfo {
127 pub status: String,
128 pub tier1_rows: usize,
129 pub tier2_rows: usize,
130 pub tier1_row_bytes: usize,
131 pub tier2_row_bytes: usize,
132}
133
134const U64_BYTES: usize = std::mem::size_of::<u64>();
135
136pub fn serialize_ypir_query(pqr: &[u64], pub_params: &[u64]) -> Vec<u8> {
140 let pqr_byte_len = pqr.len() * U64_BYTES;
141 let mut payload = Vec::with_capacity(U64_BYTES + (pqr.len() + pub_params.len()) * U64_BYTES);
142 payload.extend_from_slice(&(pqr_byte_len as u64).to_le_bytes());
143 for &v in pqr {
144 payload.extend_from_slice(&v.to_le_bytes());
145 }
146 for &v in pub_params {
147 payload.extend_from_slice(&v.to_le_bytes());
148 }
149 payload
150}
151
152#[cfg(test)]
153mod tests {
154 use super::*;
155
156 #[test]
157 fn serialize_ypir_query_empty() {
158 let result = serialize_ypir_query(&[], &[]);
159 assert_eq!(result.len(), U64_BYTES);
160 assert_eq!(u64::from_le_bytes(result[..8].try_into().unwrap()), 0);
161 }
162
163 #[test]
164 fn serialize_ypir_query_round_trip_layout() {
165 let pqr = vec![1u64, 2, 3];
166 let pp = vec![100u64, 200];
167 let payload = serialize_ypir_query(&pqr, &pp);
168
169 let expected_len = U64_BYTES + (pqr.len() + pp.len()) * U64_BYTES;
170 assert_eq!(payload.len(), expected_len);
171
172 let pqr_byte_len = u64::from_le_bytes(payload[..8].try_into().unwrap()) as usize;
173 assert_eq!(pqr_byte_len, pqr.len() * U64_BYTES);
174
175 for (i, &expected) in pqr.iter().enumerate() {
176 let offset = U64_BYTES + i * U64_BYTES;
177 let val = u64::from_le_bytes(payload[offset..offset + U64_BYTES].try_into().unwrap());
178 assert_eq!(val, expected);
179 }
180
181 for (i, &expected) in pp.iter().enumerate() {
182 let offset = U64_BYTES + pqr_byte_len + i * U64_BYTES;
183 let val = u64::from_le_bytes(payload[offset..offset + U64_BYTES].try_into().unwrap());
184 assert_eq!(val, expected);
185 }
186 }
187
188 #[test]
189 fn serialize_ypir_query_length_prefix_correctness() {
190 let pqr = vec![42u64];
191 let pp = vec![99u64];
192 let payload = serialize_ypir_query(&pqr, &pp);
193
194 let pqr_byte_len = u64::from_le_bytes(payload[..8].try_into().unwrap()) as usize;
195 assert_eq!(pqr_byte_len, 8);
196
197 let remaining = payload.len() - U64_BYTES - pqr_byte_len;
198 assert_eq!(remaining, pp.len() * U64_BYTES);
199 }
200}