diff options
| author | mat <github@matdoes.dev> | 2022-04-30 21:30:45 -0500 |
|---|---|---|
| committer | mat <github@matdoes.dev> | 2022-04-30 21:30:45 -0500 |
| commit | 80d49a76073d417e118b85636df2a923043b0250 (patch) | |
| tree | 8e27492a181d82fcf524e8b5b5b997e9231e3aed /azalea-auth/src | |
| parent | cc70d80932269ca3d044224481ab46082e0a8449 (diff) | |
| download | azalea-drasl-80d49a76073d417e118b85636df2a923043b0250.tar.xz | |
azalea_auth::encryption -> azalea_crypto
Diffstat (limited to 'azalea-auth/src')
| -rw-r--r-- | azalea-auth/src/encryption.rs | 106 | ||||
| -rwxr-xr-x | azalea-auth/src/lib.rs | 1 |
2 files changed, 0 insertions, 107 deletions
diff --git a/azalea-auth/src/encryption.rs b/azalea-auth/src/encryption.rs deleted file mode 100644 index dc2620cc..00000000 --- a/azalea-auth/src/encryption.rs +++ /dev/null @@ -1,106 +0,0 @@ -use aes::cipher::inout::InOutBuf; -use aes::cipher::BlockEncrypt; -use aes::{ - cipher::{ - generic_array::GenericArray, AsyncStreamCipher, BlockDecryptMut, BlockEncryptMut, KeyIvInit, - }, - Aes128, -}; -use rand::{rngs::OsRng, RngCore}; -use sha1::{Digest, Sha1}; - -fn generate_secret_key() -> [u8; 16] { - let mut key = [0u8; 16]; - OsRng.fill_bytes(&mut key); - key -} - -fn digest_data(server_id: &[u8], public_key: &[u8], private_key: &[u8]) -> Vec<u8> { - let mut digest = Sha1::new(); - digest.update(server_id); - digest.update(public_key); - digest.update(private_key); - digest.finalize().to_vec() -} - -fn hex_digest(digest: &[u8]) -> String { - // Note that the Sha1.hexdigest() method used by minecraft is non standard. - // It doesn't match the digest method found in most programming languages - // and libraries. It works by treating the sha1 output bytes as one large - // integer in two's complement and then printing the integer in base 16, - // placing a minus sign if the interpreted number is negative. - num_bigint::BigInt::from_signed_bytes_be(digest).to_str_radix(16) -} - -#[derive(Debug)] -pub struct EncryptResult { - pub secret_key: [u8; 16], - pub encrypted_public_key: Vec<u8>, - pub encrypted_nonce: Vec<u8>, -} - -pub fn encrypt(public_key: &[u8], nonce: &[u8]) -> Result<EncryptResult, String> { - // On receipt of a Encryption Request from the server, the client will - // generate a random 16-byte shared secret, to be used with the AES/CFB8 - // stream cipher. - let secret_key = generate_secret_key(); - // let hash = hex_digest(&digest_data(server_id.as_bytes(), public_key, &secret_key)); - - // this.keybytes = Crypt.encryptUsingKey(publicKey, secretKey.getEncoded()); - // this.nonce = Crypt.encryptUsingKey(publicKey, arrby); - let encrypted_public_key: Vec<u8> = - rsa_public_encrypt_pkcs1::encrypt(&public_key, &secret_key)?; - let encrypted_nonce: Vec<u8> = rsa_public_encrypt_pkcs1::encrypt(&public_key, &nonce)?; - - Ok(EncryptResult { - secret_key, - encrypted_public_key, - encrypted_nonce, - }) -} - -// TODO: update the aes and cfb8 crates -pub type Aes128CfbEnc = cfb8::Encryptor<Aes128>; -pub type Aes128CfbDec = cfb8::Decryptor<Aes128>; - -pub fn create_cipher(key: &[u8]) -> (Aes128CfbEnc, Aes128CfbDec) { - ( - Aes128CfbEnc::new_from_slices(key, key).unwrap(), - Aes128CfbDec::new_from_slices(key, key).unwrap(), - ) -} - -// wow this is terrible -pub fn encrypt_packet(cipher: &mut Aes128CfbEnc, packet: &mut [u8]) { - let (chunks, rest) = InOutBuf::from(packet).into_chunks(); - assert!(rest.is_empty()); - cipher.encrypt_blocks_inout_mut(chunks); -} -pub fn decrypt_packet(cipher: &mut Aes128CfbDec, packet: &mut [u8]) { - let (chunks, rest) = InOutBuf::from(packet).into_chunks(); - assert!(rest.is_empty()); - cipher.decrypt_blocks_inout_mut(chunks); -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_generate_secret_key() { - let key = generate_secret_key(); - assert_eq!(key.len(), 16); - } - - #[test] - fn test_hex_digest() { - let digest = hex_digest(&digest_data(b"Notch", &[], &[])); - assert_eq!(digest, "4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48"); - - let digest = hex_digest(&digest_data(b"jeb_", &[], &[])); - assert_eq!(digest, "-7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1"); - - let digest = hex_digest(&digest_data(b"simon", &[], &[])); - assert_eq!(digest, "88e16a1019277b15d58faf0541e11910eb756f6"); - } -} diff --git a/azalea-auth/src/lib.rs b/azalea-auth/src/lib.rs index ba35055f..773ea1d9 100755 --- a/azalea-auth/src/lib.rs +++ b/azalea-auth/src/lib.rs @@ -1,4 +1,3 @@ //! Handle Minecraft authentication. -pub mod encryption; pub mod game_profile; |
