(
globals: Arc<Globals>,
client_ctx: ClientCtx,
encrypted_packet: Vec<u8>,
)
| 166 | } |
| 167 | |
| 168 | async fn handle_client_query( |
| 169 | globals: Arc<Globals>, |
| 170 | client_ctx: ClientCtx, |
| 171 | encrypted_packet: Vec<u8>, |
| 172 | ) -> Result<(), Error> { |
| 173 | let original_packet_size = encrypted_packet.len(); |
| 174 | ensure!(original_packet_size >= DNS_HEADER_SIZE, "Short packet"); |
| 175 | debug_assert!(DNSCRYPT_QUERY_MIN_OVERHEAD > ANONYMIZED_DNSCRYPT_QUERY_MAGIC.len()); |
| 176 | if globals.anonymized_dns_enabled |
| 177 | && original_packet_size >= ANONYMIZED_DNSCRYPT_QUERY_MAGIC.len() + DNS_HEADER_SIZE |
| 178 | && encrypted_packet[..ANONYMIZED_DNSCRYPT_QUERY_MAGIC.len()] |
| 179 | == ANONYMIZED_DNSCRYPT_QUERY_MAGIC |
| 180 | { |
| 181 | return handle_anonymized_dns( |
| 182 | globals, |
| 183 | client_ctx, |
| 184 | &encrypted_packet[ANONYMIZED_DNSCRYPT_QUERY_MAGIC.len()..], |
| 185 | ) |
| 186 | .await; |
| 187 | } |
| 188 | if !globals.dnscrypt_enabled { |
| 189 | return Ok(()); |
| 190 | } |
| 191 | let mut dnscrypt_encryption_params_set = vec![]; |
| 192 | for params in &**globals.dnscrypt_encryption_params_set.read() { |
| 193 | dnscrypt_encryption_params_set.push((*params).clone()) |
| 194 | } |
| 195 | let over_udp = matches!(&client_ctx, ClientCtx::Udp(_)); |
| 196 | let (enc_params, mut packet) = |
| 197 | match dnscrypt::decrypt( |
| 198 | &encrypted_packet, |
| 199 | &dnscrypt_encryption_params_set, |
| 200 | &globals.pq_ticket_key, |
| 201 | globals.pq_enabled, |
| 202 | ) { |
| 203 | Ok(x) => x, |
| 204 | Err(_) => { |
| 205 | let packet = encrypted_packet; |
| 206 | match serve_certificates( |
| 207 | &packet, |
| 208 | &globals.provider_name, |
| 209 | &dnscrypt_encryption_params_set, |
| 210 | globals.pq_enabled, |
| 211 | over_udp, |
| 212 | ) { |
| 213 | Ok(Some(synth_packet)) => { |
| 214 | return encrypt_and_respond_to_query( |
| 215 | globals, |
| 216 | client_ctx, |
| 217 | packet, |
| 218 | synth_packet, |
| 219 | original_packet_size, |
| 220 | None, |
| 221 | ) |
| 222 | .await |
| 223 | } |
| 224 | Ok(None) => return Ok(()), |
| 225 | Err(_) => { |
no test coverage detected