From 1bb84f81dfa615f9d3d91f5209078044c540456e Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Mon, 22 Jun 2020 20:14:46 -0400 Subject: [PATCH] Rewrite native crypto to use OpenSSL OpenSSL is much more portable and optimized (important for aarch64) and most systems already have a version. Unfortunately, OpenSSL likes to break their ABI. Thankfully, Velocity's natives system is very flexible largely, so we can provide multiple versions of this crypto. Versions of the dynamically-linked crypto were compiled on CentOS 7 (still supported until 2024, uses OpenSSL 1.0.x) and Debian 9 (the oldest distro including OpenSSL 1.1.0, whose LTS supports ends in 2022). The choice of distros was intended to cover most modern distributions (2014 and afterwards). An ARM compilation (using Debian 9) will be published soon. --- .gitignore | 1 + native/compile-linux.sh | 9 +-- native/src/main/c/jni_cipher.c | 64 ++++++------------ .../natives/encryption/MbedtlsAesImpl.java | 13 ---- .../encryption/NativeVelocityCipher.java | 10 +-- .../natives/encryption/OpenSslCipherImpl.java | 12 ++++ .../velocitypowered/natives/util/Natives.java | 14 ++-- .../linux_x86_64/velocity-cipher-ossl10x.so | Bin 0 -> 8640 bytes .../linux_x86_64/velocity-cipher-ossl11x.so | Bin 0 -> 8712 bytes .../linux_x86_64/velocity-compress.so | Bin 48584 -> 48888 bytes .../encryption/VelocityCipherTest.java | 6 -- 11 files changed, 50 insertions(+), 79 deletions(-) delete mode 100644 native/src/main/java/com/velocitypowered/natives/encryption/MbedtlsAesImpl.java create mode 100644 native/src/main/java/com/velocitypowered/natives/encryption/OpenSslCipherImpl.java create mode 100755 native/src/main/resources/linux_x86_64/velocity-cipher-ossl10x.so create mode 100755 native/src/main/resources/linux_x86_64/velocity-cipher-ossl11x.so diff --git a/.gitignore b/.gitignore index 1cf6c5d69..fbdf3cea6 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,4 @@ native/mbedtls native/zlib-ng native/zlib-cf native/libdeflate +native/src/main/resources/linux_x86_64/velocity-cipher.so \ No newline at end of file diff --git a/native/compile-linux.sh b/native/compile-linux.sh index db7227d06..6d92b6462 100755 --- a/native/compile-linux.sh +++ b/native/compile-linux.sh @@ -7,16 +7,13 @@ fi echo "Compiling libdeflate..." cd libdeflate || exit -make +CFLAGS="-fPIC -O2" make cd .. -# Modify as you need. -MBEDTLS_ROOT=mbedtls CFLAGS="-O3 -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ -fPIC -shared -Wl,-z,noexecstack" ARCH=$(uname -m) mkdir -p src/main/resources/linux_$ARCH gcc $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 -gcc $CFLAGS -I $MBEDTLS_ROOT/include -shared $MBEDTLS_ROOT/library/aes.c $MBEDTLS_ROOT/library/aesni.c \ - $MBEDTLS_ROOT/library/platform.c $MBEDTLS_ROOT/library/platform_util.c src/main/c/jni_util.c src/main/c/jni_cipher.c \ - -o src/main/resources/linux_$ARCH/velocity-cipher.so \ No newline at end of file +gcc $CFLAGS -I $MBEDTLS_ROOT/include -shared src/main/c/jni_util.c src/main/c/jni_cipher.c \ + -o src/main/resources/linux_$ARCH/velocity-cipher.so -lcrypto \ No newline at end of file diff --git a/native/src/main/c/jni_cipher.c b/native/src/main/c/jni_cipher.c index 2a7b92420..e0b0b84e8 100644 --- a/native/src/main/c/jni_cipher.c +++ b/native/src/main/c/jni_cipher.c @@ -1,81 +1,59 @@ #include #include #include -#include +#include #include "jni_util.h" typedef unsigned char byte; -typedef struct { - mbedtls_aes_context cipher; - byte *key; -} velocity_cipher_context; - JNIEXPORT jlong JNICALL -Java_com_velocitypowered_natives_encryption_MbedtlsAesImpl_init(JNIEnv *env, +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_init(JNIEnv *env, jobject obj, - jbyteArray key) + jbyteArray key, + jboolean encrypt) { - velocity_cipher_context *ctx = malloc(sizeof(velocity_cipher_context)); + EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); if (ctx == NULL) { - throwException(env, "java/lang/OutOfMemoryError", "cipher allocate context"); + throwException(env, "java/lang/OutOfMemoryError", "allocate cipher"); return 0; } jsize keyLen = (*env)->GetArrayLength(env, key); jbyte* keyBytes = (*env)->GetPrimitiveArrayCritical(env, key, NULL); if (keyBytes == NULL) { - free(ctx); + EVP_CIPHER_CTX_free(ctx); throwException(env, "java/lang/OutOfMemoryError", "cipher get key"); return 0; } - mbedtls_aes_init(&ctx->cipher); - int ret = mbedtls_aes_setkey_enc(&ctx->cipher, (byte*) keyBytes, keyLen * 8); - if (ret != 0) { - (*env)->ReleasePrimitiveArrayCritical(env, key, keyBytes, 0); - mbedtls_aes_free(&ctx->cipher); - free(ctx); - - throwException(env, "java/security/GeneralSecurityException", "mbedtls set aes key"); - return 0; - } - - ctx->key = malloc(keyLen); - if (ctx->key == NULL) { - (*env)->ReleasePrimitiveArrayCritical(env, key, keyBytes, 0); - mbedtls_aes_free(&ctx->cipher); - free(ctx); - - throwException(env, "java/lang/OutOfMemoryError", "cipher copy key"); - return 0; - } - memcpy(ctx->key, keyBytes, keyLen); + int result = EVP_CipherInit(ctx, EVP_aes_128_cfb8(), (byte*) keyBytes, (byte*) keyBytes, + encrypt); + // Release the key byte array now - we won't need it (*env)->ReleasePrimitiveArrayCritical(env, key, keyBytes, 0); + + if (result != 1) { + EVP_CIPHER_CTX_free(ctx); + throwException(env, "java/security/GeneralSecurityException", "openssl initialize cipher"); + return 0; + } return (jlong) ctx; } JNIEXPORT void JNICALL -Java_com_velocitypowered_natives_encryption_MbedtlsAesImpl_free(JNIEnv *env, +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_free(JNIEnv *env, jobject obj, jlong ptr) { - velocity_cipher_context *ctx = (velocity_cipher_context*) ptr; - mbedtls_aes_free(&ctx->cipher); - free(ctx->key); - free(ctx); + EVP_CIPHER_CTX_free((EVP_CIPHER_CTX *) ptr); } JNIEXPORT void JNICALL -Java_com_velocitypowered_natives_encryption_MbedtlsAesImpl_process(JNIEnv *env, +Java_com_velocitypowered_natives_encryption_OpenSslCipherImpl_process(JNIEnv *env, jobject obj, jlong ptr, jlong source, jint len, - jlong dest, - jboolean encrypt) + jlong dest) { - velocity_cipher_context *ctx = (velocity_cipher_context*) ptr; - mbedtls_aes_crypt_cfb8(&ctx->cipher, encrypt ? MBEDTLS_AES_ENCRYPT : MBEDTLS_AES_DECRYPT, len, ctx->key, - (byte*) source, (byte*) dest); + EVP_CipherUpdate((EVP_CIPHER_CTX*) ptr, (byte*) dest, &len, (byte*) source, len); } \ No newline at end of file diff --git a/native/src/main/java/com/velocitypowered/natives/encryption/MbedtlsAesImpl.java b/native/src/main/java/com/velocitypowered/natives/encryption/MbedtlsAesImpl.java deleted file mode 100644 index ef57cdaa8..000000000 --- a/native/src/main/java/com/velocitypowered/natives/encryption/MbedtlsAesImpl.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.velocitypowered.natives.encryption; - -import java.security.GeneralSecurityException; - -class MbedtlsAesImpl { - - native long init(byte[] key) throws GeneralSecurityException; - - native void process(long ctx, long sourceAddress, int sourceLength, long destinationAddress, - boolean encrypt); - - native void free(long ptr); -} diff --git a/native/src/main/java/com/velocitypowered/natives/encryption/NativeVelocityCipher.java b/native/src/main/java/com/velocitypowered/natives/encryption/NativeVelocityCipher.java index ee7ab1532..cd0bcbd0a 100644 --- a/native/src/main/java/com/velocitypowered/natives/encryption/NativeVelocityCipher.java +++ b/native/src/main/java/com/velocitypowered/natives/encryption/NativeVelocityCipher.java @@ -3,10 +3,8 @@ package com.velocitypowered.natives.encryption; import com.google.common.base.Preconditions; import com.velocitypowered.natives.util.BufferPreference; import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; import java.security.GeneralSecurityException; import javax.crypto.SecretKey; -import javax.crypto.ShortBufferException; public class NativeVelocityCipher implements VelocityCipher { @@ -21,15 +19,13 @@ public class NativeVelocityCipher implements VelocityCipher { return new NativeVelocityCipher(false, key); } }; - private static final MbedtlsAesImpl impl = new MbedtlsAesImpl(); + private static final OpenSslCipherImpl impl = new OpenSslCipherImpl(); private final long ctx; - private final boolean encrypt; private boolean disposed = false; private NativeVelocityCipher(boolean encrypt, SecretKey key) throws GeneralSecurityException { - this.encrypt = encrypt; - this.ctx = impl.init(key.getEncoded()); + this.ctx = impl.init(key.getEncoded(), encrypt); } @Override @@ -40,7 +36,7 @@ public class NativeVelocityCipher implements VelocityCipher { long base = source.memoryAddress() + source.readerIndex(); int len = source.readableBytes(); - impl.process(ctx, base, len, base, encrypt); + impl.process(ctx, base, len, base); } @Override diff --git a/native/src/main/java/com/velocitypowered/natives/encryption/OpenSslCipherImpl.java b/native/src/main/java/com/velocitypowered/natives/encryption/OpenSslCipherImpl.java new file mode 100644 index 000000000..da5fc6b50 --- /dev/null +++ b/native/src/main/java/com/velocitypowered/natives/encryption/OpenSslCipherImpl.java @@ -0,0 +1,12 @@ +package com.velocitypowered.natives.encryption; + +import java.security.GeneralSecurityException; + +class OpenSslCipherImpl { + + native long init(byte[] key, boolean encrypt) throws GeneralSecurityException; + + native void process(long ctx, long source, int len, long dest); + + native void free(long ptr); +} 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 120ec1ee7..24ff34472 100644 --- a/native/src/main/java/com/velocitypowered/natives/util/Natives.java +++ b/native/src/main/java/com/velocitypowered/natives/util/Natives.java @@ -79,12 +79,18 @@ public class Natives { public static final NativeCodeLoader cipher = new NativeCodeLoader<>( ImmutableList.of( - new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64, - copyAndLoadNative("/linux_x86_64/velocity-cipher.so"), - "mbed TLS (Linux x86_64)", NativeVelocityCipher.FACTORY), + new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64, + copyAndLoadNative("/linux_x86_64/velocity-cipher.so"), // Any local version + "OpenSSL local (Linux x86_64)", NativeVelocityCipher.FACTORY), + new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64, + copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl11x.so"), // Debian 9 + "OpenSSL 1.1.x (Linux x86_64)", NativeVelocityCipher.FACTORY), + new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64, + copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl10x.so"), // CentOS 7 + "OpenSSL 1.0.x (Linux x86_64)", NativeVelocityCipher.FACTORY), new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_AARCH64, copyAndLoadNative("/linux_aarch64/velocity-cipher.so"), - "mbed TLS (Linux aarch64)", NativeVelocityCipher.FACTORY), + "OpenSSL (Linux aarch64)", NativeVelocityCipher.FACTORY), new NativeCodeLoader.Variant<>(NativeCodeLoader.ALWAYS, () -> { }, "Java", JavaVelocityCipher.FACTORY) ) diff --git a/native/src/main/resources/linux_x86_64/velocity-cipher-ossl10x.so b/native/src/main/resources/linux_x86_64/velocity-cipher-ossl10x.so new file mode 100755 index 0000000000000000000000000000000000000000..f69edf145f3b0f87eed283786d017889eed52f62 GIT binary patch literal 8640 zcmd^EeQaCR6~B)2MH8H?PzWtspQ^&rNtmQrj+o^$TG_ubFq?}oc~mic^wlV5y85I0+GBWtrYJADMeOMWwO%`FVR8_xz0{868`ofKqO zqerJMvz5N8bbk%`dU3TlP_HS(CND_*DzVRnS4;afVs4c!$K&?2vg4M&MaeHJ`7fzj z?gb@(a>}1IkfZcdJgdcJVy;TEg%^#x)uL9^tMOeZFpPsEsicvyB5BJogfSFP#)Z+< zx7&!BY4cz_W0~o`-R+4~((H>2CQQ4`yTpi2M94rS5kCUKU5AZcWuZM0$z;rou!hsA z@$f{{9JS)9q}UZX95JG)5#z9#NJZn;R_kCS!j%FFJo)t7+HSth8kC-@q{WTYnt^DMr4`9i0Ad3 z$8(z+my2q>XB(?&I!V4*p1yB{Si8XdUP&n5@%+%H=lxN{1&IdJEc)g8Fg&mIS^mIUdLK7FxT zKVI>dDoyAQ)VhcewYdu=JH6_{R67Q)bxcj zlK+5sYVtx(@)wAwrY@Y6{5j(3Q!Jd2{M*D+lNV+s|2pxN#7{~7m&8*O7e>MBGZn7_ z&}X(k57Mu1TGF%U_35R+c-g>dG-N9kq9Gp)y`n$95%s0Sdh+OeE{{kp0FF`pp{h6;jJ2zIpe;{;M zXdrYqx@QW81nCL#WM<8WVD*`nRTx9?V*YJZVM{mXmgOP$s4e$65y(B`DMxmnLk>tS}_l#M4hIX4Hsq|zxold2NEukGWE$v(8q)1_3 z%48B6?M89A^RW#$Y}?70(Xljkw;Manq?wK+_9}jPBNV=M{+sA*i7zJ(e3H-ifX>0) z2~Z9FdlIw_O>RK%_JB62MT*XXlzc~eg>RzXx30FTdKP6HfnAHI8n$LhAW*+E(6Fnn zX1sbz+`RUtuWZ@4fnch$1J41}CC@aWK>e|@jzGh-zcZlSwJOli5vUIZs@rRTp$u74 z6EQsZ;2DOVJbUa2)IU-d4m8a8!vXE#@=&1hSVbt%G+kNtomGLxP(a%eXn@R)K($_D zIFSxQ?kGX15+rKhpYc#1IM;E)Kfyy|R-TDE0@|I*H^Be5iTB;YKFd9!_E$A*3i~$m zwD(i0wMpUpsIF~=bK^CtocH^6isx^`*GJy>X$(^0^1pqSr=zr3RQ1t#r_@kxQ>-;I zwW`gQ_qaJF&wFQsk}K@JYF|`pBB#oEe$d84>1vw@+=gUg{D7*M{mdyj-g~(|3^(b& zrsOddCC~LPDt<{d>|@0j{8V=T*M#rQ?s~6M4ZdE{ZHn$x^mavu6g{lyF-1Gu+rO?g z;wHLD+Zt>QwrHE1np>K-ZQi0a_L?zGk61Q-!!(|#LDBP821Yv zC&hSqVLTP%6@tG@Fho3>-C+fsJFYw?g{R)p)|4^Bi{kN#VW4v7e>ht=JaENg3AE}O4t;9>m&ovS+ z9X}g@d&PG;R>0{dqj6;pI=%vad<8o{mU!uWd|KkAah#77KBYDejuZK@L3sJI9=K<_ zR*=6N_y$LNID2FTJKqOR@hNxzKPlyFggdVEo{~S{nvWkU`J8GO$D6icW2^W0zD>Zr z;!q-*wldb(&`>anz{RfiUZcBfZyy3r%h4vo8Zn|2Z^}R-mNE_|QiG9%5wlY1j1d`| z5C|BJCQQqW1-ET!Y4H}4aV#T}PDdsY6S2~hVkjLMF^$;R$jBsA9Gr|J6^R~7#*Hy6 zo`8>(wGaH#;hnvq-C-kqYX^nOr2Cx57HEWZ!xqpxdWF&1y=Opq1|2WCDE(4Hg^Q5G~`t(;|}Y2#NwoxLR8GdgbW2< zT8K^t##}+ae-~VIHI39g9HZ#u=ZHYIwK*eU%gwa|YaVtTfwW6&HV5-$IPTI+$snhS z^od|*a>R-Zf?8>t4s$Mqvp8 z{r~Sc%dQZBzQ>KgqEF3YPH#E+dT3)l73rkn3lC zZhsQxq`yPS@%@cyPT{0a{}H+MCxB6(sB2r{emkcwfP8O-h)h(MGiAUy^$QiKie!w% zp-`{#OzHm`r#_!MncmAC>(XPBM_u~-KMqsAr?R};|A&-5{U1h&?-5L=B)a_K{^N1< z7>X#*Zk|y03Z`3^Rb|dy{|TT@eZH44y^kX;NkJX=Vbo>)Gg0E(`TVu z=g{YS&Y}u%upC5WVxH-XK*>d}pYIb(|3TljCdAKO`h|NFH42IAvAI(I4HVGW<@))4 z#s80=QT@mL&h~ix{T{kb|M?zvmO2Hg(I$mA>oYxv5~qIQzNRYJSJ1RGtjF|Sz?5hI z`8>K$>9ZW0QO#jiEFwo(QvtCvtbc11FZvOi~ZsChvpaiUZhWp c4bpa3A=hh{3f!!{^Ca5fVMAPB|d=AR0(O)#?VsHRUjsmZB*?(QJBzd)~!KoEE}xeIrp98 zJU=_qq@sPVF;n}%oP&~ik@(o8HiQe~i=bv7BcIew<;x`?A*aXV)Rk;73Jfk#;W6|3Y z!!ErJo+lrB@_WDd;}0H-#Li#-<%>VPeDRUJw|t|qd243->B~Q#`Ox?0-(R8L2W3Zj zANbV{3|VYX!HT2o172}p$ld^tf)z*E47}pNknM(NeI5L5!0N?wW(oXnOW@DA>ifw` zeXlsM0xD4Mwur#-=NAF7*RK#_kyj;tqv&7?V<0>zU9q{ke1` zH8G|eUE>pJ4I(u~?15e_($%ZR`n1TvUM-^^mQWmw+c$S;iIL$BOUJUSV=`js`ZY%K z8Mv4*vI#wxv&A|%k&K(VNT-HnA7q2MY_L7pE&;4>6`BqjaiM9$xt#R{0m>xB&hDZ9AWjQ9Td6-|Df|2GH=V_dw{wb29 zSO2Kf@MWW()KRh_=< zQI9WQQmKdR~(@_*34p9z^BaTH&{4T?lH(kD;h^sSM?|waDYEl;$MA z8hPx}(yZj0k;kqqotAt9^4Nu?lal{e6Y$t|r4y1r1^mbf;AK%~wv_--XO<%wRBvBU z3-7Db3%)~ZAnXwoLD(yX%9lo3)1gm z8>-x-9=}d4yrUM*smFIs;1^R1AM6_{zk34f`-WZvr&j#o2f~Bl!du~i!LGu2@byXY z;MH;&e6$>U0Xj%6{8~Nk?k@Zlyp>Pvh0g$N`|lW-Zv^1+*{;IbmSd+ty?84a$69`N zuDkGVci}y3zi_2k{CBw=#!%etZve{13t$|czUop7#k_ytP(rlF^NgkUBWe9k@o0TL@cW$Q_bE&NAnEr3+CE## zL8qRujgP{G(ilj%zo4H3YT-h6;VpG$pw$~KL|eVZ2hrj5*#Jxn`5kOCB%X#129{GL zA@>1s5O$tB)A7vcojrN8XJofNo;4<8hLJUdrJ;=Krt(dFQeq`t?lvj8v#}2d z*z%Lp6L|x6uRC|@8QqAd`-xxN=!ENL_kDPFguWIBJ}sB`0-Xao1@sbx{TxsQKH3~m z98Vq4%e_E*Y4O1`9~Rf6eZqCb@4DIBhtgL1$MQpJnWeg+t=Rr zrMp_!BaHS@cvR4{uR~t}Y(G39h(Vrd!an~K4Pjqk+P%xC>~Ho3qCS7v=ZUP0`T`(> zDrgIlgy)Cws9-109-Th_(+!=zz>GWQQ=VED_HBG(dDPc7-PrK0X5YrJPXQU|boxB% zN)3=m74l#Wf{j4IxIe`T^o>1k#IJ|aycVgPAL-gwIXB)!a^Bx>CZ4|yUmtm&mtzxjSpN5`WjsoYd1{aM;=nS?5zY@R z9kki=9(aZHdCv`4YVw{VtF&*Dnc$5H#|akRlW(+G(MAB{6Vx!rIZJvgh;n-{3}yUn zqz_Y6^4#t`@g9=@lX&|Xg0+h{d?RU3rY2WH>)5*JG6!JaYF2nOFkCSTLT^S$M z_%gxcs2X1`_Gq^mM4%+;1-{&U)JVZ}gKT{G25}&OFu|OX!!#zcc@I2W)iyI^TB#;PvuSB4L<0 zGe0sCOh6uESENtt?&=?aMATyTNi)Z_1m>S|ppndKqv`B$Jgp_otdY~=`6B`nNE2z@ z)RV!j_uRd?zLLyqX>r4dPeO{sG$zG}5g*sJWPW^n5=?BI%qvx?9?Yb)yqQWvj99fU z2r}Ruec|0PEw(3$sWTZq*C9Ep#Z=8wP@{c9+u7aI8Sd74cI@bn4QK=5&h8i*L2|9) zAeqZ*WARK9(`?a)_JntLMQjP7F1Ue&Le&W!XZo&A&do~cU0bS6Cb%5QyU!v?7z){Q zRhY}OC+?gtTbt{1YS>d@*Y?I$`MAaWB6dVgqnLA(vB|romA7*$U0XCV)k*0-5zI}F zoAF_wreV=Bu4S^O9vsc&gTwh$I=Ly86p|Z@=f*@ZIhg@Vi<*WdIiwpo%*0AHVlCmn?klWZFtN6S|f#D{$Zc7|!%; z&*xL7Drxe0-*Ie!|EO61S+zSJ7xvO zhj$jX=W{XBjikx(vmVnykmDVQc|Jcg4Us*@k2)Mb!7^{aGQ{|t&2*L&xqY_h_s@VF z?K?@2?{Q4|-iP-1za^*r5x}rd=z3PU=g!hOo$rUBA`7-z_IwXu%JH%bC;xqi{Q**7`ZRwSN4xBA#$nI@4`RyqUDkKL|FdL||DThE?-N9) z2xh|Z^Emu52(Zp!I{)8#KN}KtwvWkByFK4$nBKt+kv+H1ZeNB9+?wPZLX7hm{C`-d zKJ!d}1vV`j^7uOnwy47Pd@s9*F9l_zMJm5+&-4!=+PatOIyODf<-Sl|9lx&nX9ibS3E{{bw!=xG1| literal 0 HcmV?d00001 diff --git a/native/src/main/resources/linux_x86_64/velocity-compress.so b/native/src/main/resources/linux_x86_64/velocity-compress.so index d72a66bfd2d7f84c71b3263f9a4af3535874f58a..098226822e36ea9a7d489cb37d86f579bd1c10bf 100755 GIT binary patch literal 48888 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 diff --git a/native/src/test/java/com/velocitypowered/natives/encryption/VelocityCipherTest.java b/native/src/test/java/com/velocitypowered/natives/encryption/VelocityCipherTest.java index 93ab89117..2c48ca99a 100644 --- a/native/src/test/java/com/velocitypowered/natives/encryption/VelocityCipherTest.java +++ b/native/src/test/java/com/velocitypowered/natives/encryption/VelocityCipherTest.java @@ -30,7 +30,6 @@ class VelocityCipherTest { } @Test - @Disabled void nativeIntegrityCheck() throws GeneralSecurityException { VelocityCipherFactory factory = Natives.cipher.get(); if (factory == JavaVelocityCipher.FACTORY) { @@ -39,11 +38,6 @@ class VelocityCipherTest { check(factory, Unpooled::directBuffer); } - @Test - void javaIntegrityCheckDirect() throws GeneralSecurityException { - check(JavaVelocityCipher.FACTORY, Unpooled::directBuffer); - } - @Test void javaIntegrityCheckHeap() throws GeneralSecurityException { check(JavaVelocityCipher.FACTORY, Unpooled::buffer);