|
1 |
| -use std::sync::Arc; |
2 |
| - |
3 |
| -use crate::{client::Session, packets::encryption_response::EncryptionResponsePacket}; |
| 1 | +use crate::{packets::encryption_response::EncryptionResponsePacket, server::MinecraftServer}; |
4 | 2 | use aes::{cipher::KeyIvInit, Aes128};
|
5 |
| -use anyhow::Result; |
6 |
| -use bytes::BytesMut; |
| 3 | +use anyhow::{Error, Result}; |
| 4 | +use rsa::Pkcs1v15Encrypt; |
7 | 5 |
|
8 |
| -use rsa::{Pkcs1v15Encrypt, RsaPrivateKey}; |
| 6 | +impl MinecraftServer { |
| 7 | + /** |
| 8 | + Handle encryption response |
9 | 9 |
|
10 |
| -pub fn handle_encryption( |
11 |
| - session: &mut Session, |
12 |
| - buffer: &mut BytesMut, |
13 |
| - keys: Arc<rsa::RsaPrivateKey>, |
14 |
| -) -> Result<()> { |
15 |
| - let response = EncryptionResponsePacket::parse(buffer)?; |
| 10 | + Check verify tokens and set up the cipher |
| 11 | + */ |
| 12 | + pub fn handle_encryption(&mut self) -> Result<()> { |
| 13 | + let response = EncryptionResponsePacket::parse(&mut self.buffer)?; |
16 | 14 |
|
17 |
| - // Decrypt client's keys |
18 |
| - let decrypted_secret = decrypt(&keys, &response.shared_secret)?; |
19 |
| - let decrypted_verify = decrypt(&keys, &response.verify_token)?; |
| 15 | + // Decrypt client's keys |
| 16 | + let decrypted_secret = self |
| 17 | + .keys |
| 18 | + .decrypt(Pkcs1v15Encrypt, &response.shared_secret)?; |
| 19 | + let decrypted_verify = self.keys.decrypt(Pkcs1v15Encrypt, &response.verify_token)?; |
20 | 20 |
|
21 |
| - // Check tokens equality |
22 |
| - if decrypted_verify |
23 |
| - .iter() |
24 |
| - .zip(&session.verify_token) |
25 |
| - .filter(|&(a, b)| a == b) |
26 |
| - .count() |
27 |
| - != decrypted_verify.len() |
28 |
| - { |
29 |
| - panic!("Verify tokens didn't match!"); |
30 |
| - } |
| 21 | + // Check tokens equality |
| 22 | + if decrypted_verify |
| 23 | + .iter() |
| 24 | + .zip(&self.session.verify_token) |
| 25 | + .filter(|&(a, b)| a == b) |
| 26 | + .count() |
| 27 | + != decrypted_verify.len() |
| 28 | + { |
| 29 | + return Err(Error::msg("Verify tokens didn't match!")); |
| 30 | + } |
31 | 31 |
|
32 |
| - // Set up client cipher |
33 |
| - session.secret = Some(decrypted_secret.clone()); |
34 |
| - session.cipher = Some( |
35 |
| - cfb8::Encryptor::<Aes128>::new_from_slices( |
| 32 | + // Set up client cipher |
| 33 | + self.session.secret = Some(decrypted_secret.clone()); |
| 34 | + self.session.cipher = Some(cfb8::Encryptor::<Aes128>::new_from_slices( |
36 | 35 | &decrypted_secret.clone(),
|
37 | 36 | &decrypted_secret.clone(),
|
38 |
| - ) |
39 |
| - .unwrap(), |
40 |
| - ); |
41 |
| - Ok(()) |
42 |
| -} |
43 |
| - |
44 |
| -fn decrypt(private_key: &RsaPrivateKey, data: &Vec<u8>) -> Result<Vec<u8>, rsa::Error> { |
45 |
| - return private_key.decrypt(Pkcs1v15Encrypt, data); |
| 37 | + )?); |
| 38 | + Ok(()) |
| 39 | + } |
46 | 40 | }
|
0 commit comments