diff options
| author | mat <github@matdoes.dev> | 2022-01-01 18:59:38 -0600 |
|---|---|---|
| committer | mat <github@matdoes.dev> | 2022-01-01 18:59:38 -0600 |
| commit | 9f576c5600ba9a244bc0d433bb7de174284066a2 (patch) | |
| tree | 4c571515d0cd85733e027ed262b449a512e87474 /azalea-auth | |
| parent | 1a961d968b80b720ef2d3900c0b95e1c16a0089e (diff) | |
| download | azalea-drasl-9f576c5600ba9a244bc0d433bb7de174284066a2.tar.xz | |
start work on encryption
Diffstat (limited to 'azalea-auth')
| -rw-r--r-- | azalea-auth/Cargo.toml | 3 | ||||
| -rw-r--r-- | azalea-auth/src/encryption.rs | 53 | ||||
| -rw-r--r-- | azalea-auth/src/lib.rs | 3 |
3 files changed, 59 insertions, 0 deletions
diff --git a/azalea-auth/Cargo.toml b/azalea-auth/Cargo.toml index aa9b7bdb..cb807776 100644 --- a/azalea-auth/Cargo.toml +++ b/azalea-auth/Cargo.toml @@ -6,4 +6,7 @@ version = "0.1.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +num-bigint = "^0.4.3" +rand = {version = "^0.8.4", features = ["getrandom"]} +sha-1 = "^0.10.0" uuid = "^0.8.2" diff --git a/azalea-auth/src/encryption.rs b/azalea-auth/src/encryption.rs new file mode 100644 index 00000000..334d8cb3 --- /dev/null +++ b/azalea-auth/src/encryption.rs @@ -0,0 +1,53 @@ +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) +} + +fn encrypt(public_key: &[u8], server_id: String, nonce: &[u8]) { + let secret_key = generate_secret_key(); + let hash = hex_digest(&digest_data(server_id.as_bytes(), public_key, &secret_key)); +} + +#[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 773ea1d9..afe9eb33 100644 --- a/azalea-auth/src/lib.rs +++ b/azalea-auth/src/lib.rs @@ -1,3 +1,6 @@ //! Handle Minecraft authentication. pub mod game_profile; +pub mod encryption; + + |
