From 4b1cdbcb317c4ac9f08b32d2344bd187e44ebec4 Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Wed, 8 Jun 2022 01:18:19 -0400 Subject: [PATCH] I have sinned but it feels good --- native/compile-linux.sh | 2 +- native/compile-macos.sh | 23 ++++++ native/src/main/c/jni_cipher_macos.c | 66 ++++++++++++++++++ .../c/{jni_cipher.c => jni_cipher_openssl.c} | 0 .../natives/util/NativeConstraints.java | 1 - .../velocitypowered/natives/util/Natives.java | 8 +++ .../macos_arm64/velocity-cipher.dylib | Bin 0 -> 34034 bytes .../macos_arm64/velocity-compress.dylib | Bin 0 -> 86068 bytes 8 files changed, 98 insertions(+), 2 deletions(-) create mode 100755 native/compile-macos.sh create mode 100644 native/src/main/c/jni_cipher_macos.c rename native/src/main/c/{jni_cipher.c => jni_cipher_openssl.c} (100%) create mode 100755 native/src/main/resources/macos_arm64/velocity-cipher.dylib create mode 100755 native/src/main/resources/macos_arm64/velocity-compress.dylib diff --git a/native/compile-linux.sh b/native/compile-linux.sh index ceaa58251..5442dce9d 100755 --- a/native/compile-linux.sh +++ b/native/compile-linux.sh @@ -21,5 +21,5 @@ ARCH=$(uname -m) mkdir -p src/main/resources/linux_$ARCH $CC $CFLAGS -Ilibdeflate src/main/c/jni_util.c src/main/c/jni_zlib_deflate.c src/main/c/jni_zlib_inflate.c \ libdeflate/libdeflate.a -o src/main/resources/linux_$ARCH/velocity-compress.so -$CC $CFLAGS -shared src/main/c/jni_util.c src/main/c/jni_cipher.c \ +$CC $CFLAGS -shared src/main/c/jni_util.c src/main/c/jni_cipher_openssl.c \ -o src/main/resources/linux_$ARCH/velocity-cipher.so -lcrypto \ No newline at end of file diff --git a/native/compile-macos.sh b/native/compile-macos.sh new file mode 100755 index 000000000..d920c0921 --- /dev/null +++ b/native/compile-macos.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if [ ! "$CC" ]; then + export CC=clang +fi + +if [ ! -d libdeflate ]; then + echo "Cloning libdeflate..." + git clone https://github.com/ebiggers/libdeflate.git +fi + +echo "Compiling libdeflate..." +cd libdeflate || exit +CFLAGS="-fPIC -O2 -fomit-frame-pointer" make +cd .. + +CFLAGS="-O2 -I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin/ -fPIC -shared -Wall -Werror -fomit-frame-pointer" +ARCH=$(uname -m) +mkdir -p src/main/resources/linux_$ARCH +$CC $CFLAGS -Ilibdeflate src/main/c/jni_util.c src/main/c/jni_zlib_deflate.c src/main/c/jni_zlib_inflate.c \ + libdeflate/libdeflate.a -o src/main/resources/macos_$ARCH/velocity-compress.dylib +$CC $CFLAGS -shared src/main/c/jni_util.c src/main/c/jni_cipher_macos.c \ + -o src/main/resources/macos_$ARCH/velocity-cipher.dylib -lSystem \ No newline at end of file diff --git a/native/src/main/c/jni_cipher_macos.c b/native/src/main/c/jni_cipher_macos.c new file mode 100644 index 000000000..aa7d1aba3 --- /dev/null +++ b/native/src/main/c/jni_cipher_macos.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include "jni_util.h" + +typedef unsigned char byte; + +JNIEXPORT jlong JNICALL +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_init(JNIEnv *env, + jclass clazz, + jbyteArray key, + jboolean encrypt) +{ + jsize keyLen = (*env)->GetArrayLength(env, key); + if (keyLen != 16) { + throwException(env, "java/lang/IllegalArgumentException", "cipher not 16 bytes"); + return 0; + } + + // Since we know the array size is always bounded, we can just use GetArrayRegion + // and save ourselves some error-checking headaches. + jbyte keyBytes[16]; + (*env)->GetByteArrayRegion(env, key, 0, keyLen, (jbyte*) keyBytes); + if ((*env)->ExceptionCheck(env)) { + return 0; + } + + CCCryptorRef cryptor = NULL; + CCCryptorStatus result = CCCryptorCreateWithMode(encrypt ? kCCEncrypt : kCCDecrypt, + kCCModeCFB8, + kCCAlgorithmAES128, + ccNoPadding, + keyBytes, + keyBytes, + 16, + NULL, + 0, + 0, + 0, + &cryptor); + if (result != kCCSuccess) { + throwException(env, "java/security/GeneralSecurityException", "openssl initialize cipher"); + return 0; + } + return (jlong) cryptor; +} + +JNIEXPORT void JNICALL +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_free(JNIEnv *env, + jclass clazz, + jlong ptr) +{ + CCCryptorRelease((CCCryptorRef) ptr); +} + +JNIEXPORT void JNICALL +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_process(JNIEnv *env, + jclass clazz, + jlong ptr, + jlong source, + jint len, + jlong dest) +{ + CCCryptorUpdate((CCCryptorRef) ptr, (byte*) source, len, (byte*) dest, len, NULL); +} \ No newline at end of file diff --git a/native/src/main/c/jni_cipher.c b/native/src/main/c/jni_cipher_openssl.c similarity index 100% rename from native/src/main/c/jni_cipher.c rename to native/src/main/c/jni_cipher_openssl.c diff --git a/native/src/main/java/com/velocitypowered/natives/util/NativeConstraints.java b/native/src/main/java/com/velocitypowered/natives/util/NativeConstraints.java index ac74c3b4a..68577a7b7 100644 --- a/native/src/main/java/com/velocitypowered/natives/util/NativeConstraints.java +++ b/native/src/main/java/com/velocitypowered/natives/util/NativeConstraints.java @@ -40,7 +40,6 @@ public class NativeConstraints { // give amd64. IS_AMD64 = osArch.equals("amd64") || osArch.equals("x86_64"); IS_AARCH64 = osArch.equals("aarch64") || osArch.equals("arm64"); - System.out.println(System.getProperty("os.name", "")); } static final BooleanSupplier NATIVE_BASE = () -> NATIVES_ENABLED && CAN_GET_MEMORYADDRESS; diff --git a/native/src/main/java/com/velocitypowered/natives/util/Natives.java b/native/src/main/java/com/velocitypowered/natives/util/Natives.java index 928b2dd3d..00db7b353 100644 --- a/native/src/main/java/com/velocitypowered/natives/util/Natives.java +++ b/native/src/main/java/com/velocitypowered/natives/util/Natives.java @@ -85,6 +85,10 @@ public class Natives { copyAndLoadNative("/linux_aarch64/velocity-compress.so"), "libdeflate (Linux aarch64)", LibdeflateVelocityCompressor.FACTORY), + new NativeCodeLoader.Variant<>(NativeConstraints.MACOS_AARCH64, + copyAndLoadNative("/macos_arm64/velocity-compress.dylib"), + "libdeflate (macOS ARM64 / Apple Silicon)", + LibdeflateVelocityCompressor.FACTORY), new NativeCodeLoader.Variant<>(NativeCodeLoader.ALWAYS, () -> { }, "Java", JavaVelocityCompressor.FACTORY) ) @@ -104,6 +108,10 @@ public class Natives { new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_AARCH64, copyAndLoadNative("/linux_aarch64/velocity-cipher.so"), "OpenSSL (Linux aarch64)", NativeVelocityCipher.FACTORY), + new NativeCodeLoader.Variant<>(NativeConstraints.MACOS_AARCH64, + copyAndLoadNative("/macos_arm64/velocity-cipher.dylib"), + "native (macOS ARM64 / Apple Silicon)", + NativeVelocityCipher.FACTORY), new NativeCodeLoader.Variant<>(NativeCodeLoader.ALWAYS, () -> { }, "Java", JavaVelocityCipher.FACTORY) ) diff --git a/native/src/main/resources/macos_arm64/velocity-cipher.dylib b/native/src/main/resources/macos_arm64/velocity-cipher.dylib new file mode 100755 index 0000000000000000000000000000000000000000..ba6883dd4ac798d3bbe16b5f647feeb3101363d7 GIT binary patch literal 34034 zcmeI5Yitx%6oAjnv}Kh7OLV_}N0b8xKX=~aTlk0SM+79fCnQ7@u zSs_ip7ip-EA4&}h*hZ8fJ`x|P8jbOfDbY%dVyo5Q1Aj;*E&}U0GqYt|B#;pObxwQc z-gEA~XYT#(-Jj>q=O>Py&IgbHB@cBDs+t4P0|n%Q`KX7mRfxJ(4Rwxd>O-Asf@kNV zJEPP?2wQKrspiV`cqf;;{>Pn}0FW(bI#Zbg$!t>y%WiG7CSB9xZMnm3y3y-Fc6L0U z7Z2C&h!7#mHjP;Gq&;=LZ+r3Dz4nalnNwnuPl(po1|t?0Myx6B*i+-(xWXOT;1)o3 z_WV5eWFds!BAQGss=KbU*6YQ~%x??Y%H-&?E3~iAq6)FHtgcK1tJc)IyQ_MA&rwoL zQraduAwo3Av$pk|@fKoVN7SkFqBDobZBl4n<)}hbR;;;a)yj&@nM-JnExK76 z?uZzT6mT&>()mRs0fx}N#j}Ud-hwvm9lfji5r9ju^lid*;Dlz94>en8%B1xBIG2oi zai+Ili4JN zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l30x3?iK_PpPIXBG z#}s*RLV-aas43rkH3ia&5x)cn#?ZG#R#VC{H8rXf4Suf_4xZ{N8H1FV7lwUBPD8z+Kf5Sun5<(Lh}78Nl^A3mw1d8 zs;P-|dR`&EYZTXsd9X!e$b{;fy4CGJD7k~>)B_9#uIwXvLb#XX4r-nF*8_mh7y~;aX*(K%BQqDT&2|K#g z%NHk`a&YtUdAU;qxe^m?Tio1Osw+jPlru{rb>ddHUo92nmw+E_%Fk^$m39RCx>7#d zze9Rn-mdiJ{M)#N*o($Rym41$@^GtXCoNfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l z2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l z3H)aS{1~|$^#N4+CVA$%0Ia$<7GRmVXMpY%02QweP^sby^_TGC00}QUkQz`sQFowI z1cO1dBVotQps8!NUT@ef_r}9|Rzr;*(KRdEb6+BiUGW3(!m_o{IuUAFCz>=PGS$=E zs+nPWy(DnXvfX0FH=Mb@q5f{X9zulTQIYwedm_F;H}$ZHX|~a(TSAY8Xl8g%gs8&H z9%`*f(D~wfMKlo+@PGm*J89PmBXJhia^BEhb?1&%4#W8arU1SUg_eI9YY?GLFB>s=Hh$K%O&L6_<+lkf8 z9u=XFejQJOjJqM@A3zKhe<_Y!0Crx+Hx|u zwr|$yzvuOBt>~Hm=+d`Jhd$VS==)cf@BZMRR?&05_!ryWR{8D|Ywv$)+v_`eZ}~X1 XV@LFR{A^6-|Ir5KZ@J(uPH1 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