1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-04-25 16:27:46 +00:00

Fix encrypting/decrypting packets, vendor Sapphire Blowfish implementation

I ended up just stealing this from iolite, which in turn took it from Sapphire.
I tried for a few hours to get a Rust Blowfish implementation going, but the one
from Physis didn't work. I'll try again later.
This commit is contained in:
Joshua Goins 2025-03-08 21:13:00 -05:00
parent 64b1ea9280
commit 942a64cd7b
10 changed files with 1709 additions and 410 deletions

557
Cargo.lock generated
View file

@ -4,18 +4,18 @@ version = 4
[[package]]
name = "addr2line"
version = "0.21.0"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
name = "adler2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]]
name = "array-init"
@ -25,13 +25,13 @@ checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
[[package]]
name = "async-trait"
version = "0.1.80"
version = "0.1.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.62",
"syn 2.0.99",
]
[[package]]
@ -86,17 +86,17 @@ dependencies = [
[[package]]
name = "backtrace"
version = "0.3.71"
version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
"windows-targets",
]
[[package]]
@ -151,25 +151,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
[[package]]
name = "bytes"
version = "1.6.0"
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cc"
version = "1.0.97"
version = "1.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4"
[[package]]
name = "cfg-expr"
version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789"
checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
dependencies = [
"smallvec",
"target-lexicon",
"shlex",
]
[[package]]
@ -180,19 +179,13 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cpufeatures"
version = "0.2.12"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "crunchy"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "crypto-common"
version = "0.1.6"
@ -219,12 +212,6 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "equivalent"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "fnv"
version = "1.0.7"
@ -242,30 +229,30 @@ dependencies = [
[[package]]
name = "futures-channel"
version = "0.3.30"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [
"futures-core",
]
[[package]]
name = "futures-core"
version = "0.3.30"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]]
name = "futures-task"
version = "0.3.30"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]]
name = "futures-util"
version = "0.3.30"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-core",
"futures-task",
@ -296,25 +283,9 @@ dependencies = [
[[package]]
name = "gimli"
version = "0.28.1"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "half"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
dependencies = [
"cfg-if",
"crunchy",
]
[[package]]
name = "hashbrown"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "headers"
@ -340,18 +311,6 @@ dependencies = [
"http",
]
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "http"
version = "0.2.12"
@ -376,9 +335,9 @@ dependencies = [
[[package]]
name = "httparse"
version = "1.8.0"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
[[package]]
name = "httpdate"
@ -388,9 +347,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
version = "0.14.28"
version = "0.14.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
dependencies = [
"bytes",
"futures-channel",
@ -409,21 +368,11 @@ dependencies = [
"want",
]
[[package]]
name = "indexmap"
version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
dependencies = [
"equivalent",
"hashbrown",
]
[[package]]
name = "itoa"
version = "1.0.11"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "kawari"
@ -431,9 +380,9 @@ version = "0.1.0"
dependencies = [
"axum",
"binrw",
"cc",
"md5",
"minijinja",
"physis",
"rand",
"serde",
"serde_json",
@ -444,27 +393,15 @@ dependencies = [
[[package]]
name = "lazy_static"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.154"
version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
[[package]]
name = "libz-sys"
version = "1.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]]
name = "matchit"
@ -480,9 +417,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
[[package]]
name = "memchr"
version = "2.7.2"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "mime"
@ -492,57 +429,47 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minijinja"
version = "2.0.1"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7165d0e94806d52ad5295e4b54a95176d831814840bc067298ca647e1c956338"
checksum = "6e36f1329330bb1614c94b78632b9ce45dd7d761f3304a1bed07b2990a7c5097"
dependencies = [
"serde",
]
[[package]]
name = "miniz_oxide"
version = "0.7.2"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [
"adler",
"adler2",
]
[[package]]
name = "mio"
version = "0.8.11"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [
"libc",
"wasi",
"windows-sys 0.48.0",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
"windows-sys",
]
[[package]]
name = "object"
version = "0.32.2"
version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.19.0"
version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
name = "owo-colors"
@ -550,57 +477,37 @@ version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "percent-encoding"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "physis"
version = "0.4.0"
source = "git+https://github.com/redstrate/Physis#af0d34c011f49f7c0cabaf174ca30d123c0a0859"
dependencies = [
"binrw",
"bitflags",
"half",
"libz-sys",
"system-deps",
"texture2ddecoder",
"tracing",
]
[[package]]
name = "pin-project"
version = "1.1.5"
version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
version = "1.1.5"
version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.62",
"syn 2.0.99",
]
[[package]]
name = "pin-project-lite"
version = "0.2.14"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "pin-utils"
@ -608,32 +515,29 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "ppv-lite86"
version = "0.2.17"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
[[package]]
name = "proc-macro2"
version = "1.0.82"
version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.36"
version = "1.0.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801"
dependencies = [
"proc-macro2",
]
@ -676,66 +580,58 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustversion"
version = "1.0.16"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0"
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
[[package]]
name = "ryu"
version = "1.0.18"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "serde"
version = "1.0.201"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c"
checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.201"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865"
checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.62",
"syn 2.0.99",
]
[[package]]
name = "serde_json"
version = "1.0.117"
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "serde_path_to_error"
version = "0.1.16"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
dependencies = [
"itoa",
"serde",
]
[[package]]
name = "serde_spanned"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
dependencies = [
"serde",
]
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
@ -769,19 +665,19 @@ dependencies = [
]
[[package]]
name = "smallvec"
version = "1.14.0"
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "socket2"
version = "0.5.7"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@ -797,9 +693,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.62"
version = "2.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb"
checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2"
dependencies = [
"proc-macro2",
"quote",
@ -812,34 +708,6 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]]
name = "system-deps"
version = "7.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005"
dependencies = [
"cfg-expr",
"heck",
"pkg-config",
"toml",
"version-compare",
]
[[package]]
name = "target-lexicon"
version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "texture2ddecoder"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d82f195862d86c369d24dfcaaad28334b374be46590375113ad74aeb4e1184c"
dependencies = [
"paste",
]
[[package]]
name = "thread_local"
version = "1.1.8"
@ -852,64 +720,29 @@ dependencies = [
[[package]]
name = "tokio"
version = "1.37.0"
version = "1.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"num_cpus",
"pin-project-lite",
"socket2",
"tokio-macros",
"windows-sys 0.48.0",
"windows-sys",
]
[[package]]
name = "tokio-macros"
version = "2.2.0"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.62",
]
[[package]]
name = "toml"
version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit",
]
[[package]]
name = "toml_datetime"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.22.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
dependencies = [
"indexmap",
"serde",
"serde_spanned",
"toml_datetime",
"winnow",
"syn 2.0.99",
]
[[package]]
@ -929,21 +762,21 @@ dependencies = [
[[package]]
name = "tower-layer"
version = "0.3.2"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
[[package]]
name = "tower-service"
version = "0.3.2"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
version = "0.1.40"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
dependencies = [
"pin-project-lite",
"tracing-core",
@ -951,18 +784,18 @@ dependencies = [
[[package]]
name = "tracing-core"
version = "0.1.32"
version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
dependencies = [
"once_cell",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.18"
version = "0.3.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
dependencies = [
"sharded-slab",
"thread_local",
@ -977,33 +810,21 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "typenum"
version = "1.17.0"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
name = "unicode-ident"
version = "1.0.12"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version-compare"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "version_check"
version = "0.9.4"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "want"
@ -1020,150 +841,96 @@ version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.5",
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm 0.48.5",
"windows_aarch64_msvc 0.48.5",
"windows_i686_gnu 0.48.5",
"windows_i686_msvc 0.48.5",
"windows_x86_64_gnu 0.48.5",
"windows_x86_64_gnullvm 0.48.5",
"windows_x86_64_msvc 0.48.5",
]
[[package]]
name = "windows-targets"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
dependencies = [
"windows_aarch64_gnullvm 0.52.5",
"windows_aarch64_msvc 0.52.5",
"windows_i686_gnu 0.52.5",
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc 0.52.5",
"windows_x86_64_gnu 0.52.5",
"windows_x86_64_gnullvm 0.52.5",
"windows_x86_64_msvc 0.52.5",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.5"
name = "zerocopy"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
[[package]]
name = "winnow"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"memchr",
"byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.99",
]

View file

@ -25,6 +25,9 @@ opt-level = "z"
codegen-units = 1
panic = "abort"
[build-dependencies]
cc = "1.0"
[dependencies]
axum = { version = "0.6", features = ["json", "tokio", "http1", "form", "query", "headers"], default-features = false }
serde_json = { version = "1.0", default-features = false }
@ -35,5 +38,4 @@ tracing-subscriber = { version = "0.3", features = ["fmt"], default-features = f
rand = "0.8"
minijinja = "2.0"
binrw = { version = "0.14" }
physis = { git = "https://github.com/redstrate/Physis" }
md5 = "0.7.0"

7
build.rs Normal file
View file

@ -0,0 +1,7 @@
fn main() {
cc::Build::new()
.cpp(true)
.file("src/blowfish/blowfish.cpp")
.file("src/blowfish/wrapper.cpp")
.compile("FFXIVBlowfish")
}

316
src/blowfish/blowfish.cpp Normal file
View file

@ -0,0 +1,316 @@
// blowfish.cpp C++ class implementation of the BLOWFISH encryption algorithm
// _THE BLOWFISH ENCRYPTION ALGORITHM_
// by Bruce Schneier
// Revised code--3/20/94
// Converted to C++ class 5/96, Jim Conger
#include <cstdint>
#include "blowfish.h"
#include "blowfish_consts.h" // holds the random digit tables
#define S(x, i) (SBoxes[i][x.w.byte##i])
#define bf_F(x) (((S(x, 0) + S(x, 1)) ^ S(x, 2)) + S(x, 3))
#define ROUND(a, b, n) (a.dword ^= bf_F(b) ^ PArray[n])
BlowFish::BlowFish()
{
PArray = new DWORD[18];
SBoxes = new DWORD[4][256];
}
BlowFish::~BlowFish()
{
delete PArray;
delete[] SBoxes;
}
// the low level (private) encryption function
void BlowFish::Blowfish_encipher(DWORD *xl, DWORD *xr)
{
union aword Xl, Xr;
Xl.dword = *xl;
Xr.dword = *xr;
Xl.dword ^= PArray[0];
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[1]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[2]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[3]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[4]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[5]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[6]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[7]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[8]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[9]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[10]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[11]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[12]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[13]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[14]);
(Xr.dword ^= ((((SBoxes[0][Xl.w.byte0]) + (SBoxes[1][Xl.w.byte1])) ^
(SBoxes[2][Xl.w.byte2])) +
(SBoxes[3][Xl.w.byte3])) ^
PArray[15]);
(Xl.dword ^= ((((SBoxes[0][Xr.w.byte0]) + (SBoxes[1][Xr.w.byte1])) ^
(SBoxes[2][Xr.w.byte2])) +
(SBoxes[3][Xr.w.byte3])) ^
PArray[16]);
Xr.dword ^= PArray[17];
*xr = Xl.dword;
*xl = Xr.dword;
}
// the low level (private) decryption function
void BlowFish::Blowfish_decipher(DWORD *xl, DWORD *xr)
{
union aword Xl;
union aword Xr;
Xl.dword = *xl;
Xr.dword = *xr;
Xl.dword ^= PArray[17];
ROUND(Xr, Xl, 16);
ROUND(Xl, Xr, 15);
ROUND(Xr, Xl, 14);
ROUND(Xl, Xr, 13);
ROUND(Xr, Xl, 12);
ROUND(Xl, Xr, 11);
ROUND(Xr, Xl, 10);
ROUND(Xl, Xr, 9);
ROUND(Xr, Xl, 8);
ROUND(Xl, Xr, 7);
ROUND(Xr, Xl, 6);
ROUND(Xl, Xr, 5);
ROUND(Xr, Xl, 4);
ROUND(Xl, Xr, 3);
ROUND(Xr, Xl, 2);
ROUND(Xl, Xr, 1);
Xr.dword ^= PArray[0];
*xl = Xr.dword;
*xr = Xl.dword;
}
// constructs the enctryption sieve
void BlowFish::initialize(BYTE key[], int32_t keybytes)
{
int i, j;
DWORD datal, datar;
// first fill arrays from data tables
for (i = 0; i < 18; i++)
PArray[i] = bf_P[i];
for (i = 0; i < 4; i++)
{
for (j = 0; j < 256; j++)
SBoxes[i][j] = bf_S[i][j];
}
int32_t v12; // eax@6
int32_t v13; // ecx@6
int32_t v14; // eax@8
int32_t v15; // edx@8
int32_t v16; // edx@8
int32_t v17; // eax@10
int32_t v18; // ecx@10
int32_t v19; // ecx@10
int32_t v20; // edx@12
int32_t v21; // edx@12
int32_t v10 = keybytes;
uintptr_t v9 = (uintptr_t)key;
int32_t v8 = 0;
int32_t v11 = 0;
do
{
v13 = (char)(*(BYTE *)(v8 + v9));
v12 = v8 + 1;
if (v12 >= v10)
v12 = 0;
v16 = (char)*(BYTE *)(v12 + v9);
v14 = v12 + 1;
v15 = (v13 << 8) | v16;
if (v14 >= v10)
v14 = 0;
v19 = (char)*(BYTE *)(v14 + v9);
v17 = v14 + 1;
v18 = (v15 << 8) | v19;
if (v17 >= v10)
v17 = 0;
v21 = (char)*(BYTE *)(v17 + v9);
v8 = v17 + 1;
v20 = (v18 << 8) | v21;
if (v8 >= v10)
v8 = 0;
*((DWORD *)PArray + v11++) ^= v20;
} while (v11 < 18);
datal = 0;
datar = 0;
for (i = 0; i < NPASS + 2; i += 2)
{
Blowfish_encipher(&datal, &datar);
PArray[i] = datal;
PArray[i + 1] = datar;
}
for (i = 0; i < 4; ++i)
{
for (j = 0; j < 256; j += 2)
{
Blowfish_encipher(&datal, &datar);
SBoxes[i][j] = datal;
SBoxes[i][j + 1] = datar;
}
}
}
// get output length, which must be even MOD 8
DWORD BlowFish::GetOutputLength(DWORD lInputLong)
{
DWORD lVal;
lVal = lInputLong % 8; // find out if uneven number of bytes at the end
if (lVal != 0)
return lInputLong + 8 - lVal;
else
return lInputLong;
}
// Encode pIntput into pOutput. Input length in lSize. Returned value
// is length of output which will be even MOD 8 bytes. Input buffer and
// output buffer can be the same, but be sure buffer length is even MOD 8.
DWORD BlowFish::Encode(BYTE *pInput, BYTE *pOutput, DWORD lSize)
{
DWORD lCount, lOutSize, lGoodBytes;
BYTE *pi, *po;
int i, j;
int SameDest = (pInput == pOutput ? 1 : 0);
lOutSize = GetOutputLength(lSize);
for (lCount = 0; lCount < lOutSize; lCount += 8)
{
if (SameDest) // if encoded data is being written into input buffer
{
if (lCount < lSize - 7) // if not dealing with uneven bytes at end
{
Blowfish_encipher((DWORD *)pInput,
(DWORD *)(pInput + 4));
}
else // pad end of data with null bytes to complete encryption
{
po = pInput + lSize; // point at byte past the end of actual data
j = (int)(lOutSize - lSize); // number of bytes to set to null
for (i = 0; i < j; i++)
*po++ = 0;
Blowfish_encipher((DWORD *)pInput,
(DWORD *)(pInput + 4));
}
pInput += 8;
}
else // output buffer not equal to input buffer, so must copy
{ // input to output buffer prior to encrypting
if (lCount < lSize - 7) // if not dealing with uneven bytes at end
{
pi = pInput;
po = pOutput;
for (i = 0; i < 8; i++)
// copy bytes to output
*po++ = *pi++;
Blowfish_encipher((DWORD *)pOutput, // now encrypt them
(DWORD *)(pOutput + 4));
}
else // pad end of data with null bytes to complete encryption
{
lGoodBytes = lSize - lCount; // number of remaining data bytes
po = pOutput;
for (i = 0; i < (int)lGoodBytes; i++)
*po++ = *pInput++;
for (j = i; j < 8; j++)
*po++ = 0;
Blowfish_encipher((DWORD *)pOutput,
(DWORD *)(pOutput + 4));
}
pInput += 8;
pOutput += 8;
}
}
return lOutSize;
}
// Decode pIntput into pOutput. Input length in lSize. Input buffer and
// output buffer can be the same, but be sure buffer length is even MOD 8.
void BlowFish::Decode(BYTE *pInput, BYTE *pOutput, DWORD lSize)
{
DWORD lCount;
BYTE *pi, *po;
int i;
int SameDest = (pInput == pOutput ? 1 : 0);
for (lCount = 0; lCount < lSize; lCount += 8)
{
if (SameDest) // if encoded data is being written into input buffer
{
Blowfish_decipher((DWORD *)pInput,
(DWORD *)(pInput + 4));
pInput += 8;
}
else // output buffer not equal to input buffer
{ // so copy input to output before decoding
pi = pInput;
po = pOutput;
for (i = 0; i < 8; i++)
*po++ = *pi++;
Blowfish_decipher((DWORD *)pOutput,
(DWORD *)(pOutput + 4));
pInput += 8;
pOutput += 8;
}
}
}

87
src/blowfish/blowfish.h Normal file
View file

@ -0,0 +1,87 @@
#ifndef _BLOWFISH_H
#define _BLOWFISH_H
// blowfish.h interface file for blowfish.cpp
// _THE BLOWFISH ENCRYPTION ALGORITHM_
// by Bruce Schneier
// Revised code--3/20/94
// Converted to C++ class 5/96, Jim Conger
#define MAXKEYBYTES 56 // 448 bits max
#define NPASS 16 // SBox passes
#define DWORD uint32_t
#define WORD unsigned short
#define BYTE uint8_t
class BlowFish
{
private:
void Blowfish_encipher(DWORD *xl, DWORD *xr);
void Blowfish_decipher(DWORD *xl, DWORD *xr);
public:
DWORD *PArray;
DWORD (*SBoxes)
[256];
BlowFish();
~BlowFish();
void initialize(BYTE key[], int32_t keybytes);
DWORD GetOutputLength(DWORD lInputLong);
DWORD Encode(BYTE *pInput, BYTE *pOutput, DWORD lSize);
void Decode(BYTE *pInput, BYTE *pOutput, DWORD lSize);
};
// choose a byte order for your hardware
#define ORDER_DCBA // chosing Intel in this case
#ifdef ORDER_DCBA // DCBA - little endian - intel
union aword
{
DWORD dword;
BYTE byte[4];
struct
{
uint32_t byte3 : 8;
uint32_t byte2 : 8;
uint32_t byte1 : 8;
uint32_t byte0 : 8;
} w;
};
#endif
#ifdef ORDER_ABCD // ABCD - big endian - motorola
union aword
{
DWORD dword;
BYTE byte[4];
struct
{
uint32_t byte0 : 8;
uint32_t byte1 : 8;
uint32_t byte2 : 8;
uint32_t byte3 : 8;
} w;
};
#endif
#ifdef ORDER_BADC // BADC - vax
union aword
{
DWORD dword;
BYTE byte[4];
struct
{
uint32_t byte1 : 8;
uint32_t byte0 : 8;
uint32_t byte3 : 8;
uint32_t byte2 : 8;
} w;
};
#endif
#endif

File diff suppressed because it is too large Load diff

30
src/blowfish/wrapper.cpp Normal file
View file

@ -0,0 +1,30 @@
#include <cstdint>
#include <cstdlib>
#include "blowfish.h"
#include "wrapper.h"
// the contents of blowfish.cpp and it's headers are directly from sapphire server (which I believe is ripped from the game but with prep methods)
// https://github.com/SapphireServer/Sapphire/blob/master/src/common/Crypt/blowfish.cpp
// TODO: eventually get the lobby to work with the blowfish or blowfish_rs crate.
BYTE *blowfish_encode(BYTE *key, uint32_t keybytes, BYTE *pInput, DWORD lSize)
{
BlowFish blowfish;
blowfish.initialize(key, keybytes);
BYTE *pOutput = new BYTE[lSize];
blowfish.Encode(pInput, pOutput, lSize);
return pOutput;
}
BYTE *blowfish_decode(BYTE *key, uint32_t keybytes, BYTE *pInput, DWORD lSize)
{
BlowFish blowfish;
blowfish.initialize(key, keybytes);
BYTE *pOutput = new BYTE[lSize];
blowfish.Decode(pInput, pOutput, lSize);
return pOutput;
}

21
src/blowfish/wrapper.h Normal file
View file

@ -0,0 +1,21 @@
#include <cstdint>
extern "C"
{
typedef void *BlowfishHandle;
#define DWORD uint32_t
#define WORD unsigned short
#define BYTE uint8_t
struct ExpandedKey
{
DWORD *PArray;
DWORD (*SBoxes)
[256];
};
BYTE *blowfish_encode(BYTE *key, uint32_t keybytes, BYTE *pInput, DWORD lSize);
BYTE *blowfish_decode(BYTE *key, uint32_t keybytes, BYTE *pInput, DWORD lSize);
//__declspec(dllexport) void destroy(BlowFish hanle);
}

View file

@ -1,8 +1,9 @@
use std::io::Cursor;
use std::fs::write;
use std::{io::Cursor, slice};
use binrw::{BinRead, BinResult};
use physis::blowfish::Blowfish;
use crate::packet::blowfish_decode;
const GAME_VERSION: u16 = 7000;
@ -22,7 +23,7 @@ mod tests {
#[test]
fn test_encryption_key() {
let key = generate_encryption_key([0x00, 0x00, 0x00, 0x00], "foobar");
let key = generate_encryption_key(&[0x00, 0x00, 0x00, 0x00], "foobar");
assert_eq!(
key,
[
@ -47,13 +48,11 @@ where
data.resize(size as usize, 0x0);
reader.read_exact(&mut data)?;
write("encrypted.bin", &data);
unsafe {
let decryption_result = blowfish_decode(encryption_key.as_ptr(), 16, data.as_ptr(), size);
let decrypted_data = slice::from_raw_parts(decryption_result, size as usize);
let blowfish = Blowfish::new(encryption_key);
let decrypted_data = blowfish.decrypt(&data).unwrap();
write("decrypted.bin", &decrypted_data);
let mut cursor = Cursor::new(&decrypted_data);
T::read_options(&mut cursor, endian, ())
let mut cursor = Cursor::new(&decrypted_data);
T::read_options(&mut cursor, endian, ())
}
}

View file

@ -5,7 +5,6 @@ use std::{
};
use binrw::{BinRead, BinResult, BinWrite, binrw, helpers::until_eof};
use physis::blowfish::Blowfish;
use tokio::{
io::{AsyncWriteExt, WriteHalf},
net::TcpStream,
@ -26,6 +25,22 @@ pub(crate) fn read_string(byte_stream: Vec<u8>) -> String {
str.trim_matches(char::from(0)).to_string() // trim \0 from the end of strings
}
#[link(name = "FFXIVBlowfish")]
unsafe extern "C" {
pub fn blowfish_encode(
key: *const u8,
keybytes: u32,
pInput: *const u8,
lSize: u32,
) -> *const u8;
pub fn blowfish_decode(
key: *const u8,
keybytes: u32,
pInput: *const u8,
lSize: u32,
) -> *const u8;
}
#[binrw]
#[brw(repr = u16)]
#[derive(Debug)]
@ -203,11 +218,18 @@ pub async fn parse_packet(socket: &mut WriteHalf<TcpStream>, data: &[u8], state:
// Generate an encryption key for this client
state.client_key = Some(generate_encryption_key(key, phrase));
let blowfish = Blowfish::new(&state.client_key.unwrap());
let mut data = 0xE0003C2Au32.to_le_bytes().to_vec();
data.resize(0x280, 0);
let data = blowfish.encrypt(&data).unwrap();
unsafe {
let result = blowfish_encode(
state.client_key.unwrap().as_ptr(),
16,
data.as_ptr(),
0x280,
);
data = std::slice::from_raw_parts(result, 0x280).to_vec();
}
let response_packet = PacketSegment {
source_actor: 0,