aboutsummaryrefslogtreecommitdiff
path: root/azalea-auth
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-01-01 18:59:38 -0600
committermat <github@matdoes.dev>2022-01-01 18:59:38 -0600
commit9f576c5600ba9a244bc0d433bb7de174284066a2 (patch)
tree4c571515d0cd85733e027ed262b449a512e87474 /azalea-auth
parent1a961d968b80b720ef2d3900c0b95e1c16a0089e (diff)
downloadazalea-drasl-9f576c5600ba9a244bc0d433bb7de174284066a2.tar.xz
start work on encryption
Diffstat (limited to 'azalea-auth')
-rw-r--r--azalea-auth/Cargo.toml3
-rw-r--r--azalea-auth/src/encryption.rs53
-rw-r--r--azalea-auth/src/lib.rs3
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;
+
+