Fix skin not displayed in Minecraft 1.20.2

This commit is contained in:
Haowei Wen 2023-11-01 18:47:45 +08:00
parent acef784f82
commit f6970a51b2

View file

@ -16,16 +16,17 @@
*/
package moe.yushi.authlibinjector.transform.support;
import static java.lang.invoke.MethodHandles.publicLookup;
import static java.lang.invoke.MethodType.methodType;
import static moe.yushi.authlibinjector.util.IOUtils.asBytes;
import static moe.yushi.authlibinjector.util.Logging.Level.DEBUG;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.ARETURN;
import static org.objectweb.asm.Opcodes.ASM9;
import static org.objectweb.asm.Opcodes.GETFIELD;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.IRETURN;
import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandle;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.PrivateKey;
@ -61,7 +62,32 @@ public class YggdrasilKeyTransformUnit implements TransformUnit {
}
@CallbackMethod
public static boolean verifyPropertySignature(String propertyValue, String base64Signature) {
public static boolean verifyPropertySignature(Object propertyObj) {
String base64Signature;
String propertyValue;
try {
MethodHandle valueHandle;
try {
valueHandle = publicLookup().findVirtual(propertyObj.getClass(), "getValue", methodType(String.class));
} catch (NoSuchMethodException ignored) {
valueHandle = publicLookup().findVirtual(propertyObj.getClass(), "value", methodType(String.class));
}
MethodHandle signatureHandle;
try {
signatureHandle = publicLookup().findVirtual(propertyObj.getClass(), "getSignature", methodType(String.class));
} catch(NoSuchMethodException ignored) {
signatureHandle = publicLookup().findVirtual(propertyObj.getClass(), "signature", methodType(String.class));
}
base64Signature = (String) signatureHandle.invokeWithArguments(propertyObj);
propertyValue = (String) valueHandle.invokeWithArguments(propertyObj);
} catch (Throwable e) {
Logging.log(Level.ERROR, "Failed to get property attributes", e);
return false;
}
byte[] sig = Base64.getDecoder().decode(base64Signature);
byte[] data = propertyValue.getBytes();
@ -145,9 +171,6 @@ public class YggdrasilKeyTransformUnit implements TransformUnit {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "com/mojang/authlib/properties/Property", "value", "Ljava/lang/String;");
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "com/mojang/authlib/properties/Property", "signature", "Ljava/lang/String;");
ctx.invokeCallback(mv, YggdrasilKeyTransformUnit.class, "verifyPropertySignature");
mv.visitInsn(IRETURN);
mv.visitMaxs(-1, -1);
@ -170,9 +193,6 @@ public class YggdrasilKeyTransformUnit implements TransformUnit {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
mv.visitCode();
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "com/mojang/authlib/properties/Property", "getValue", "()Ljava/lang/String;", false);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "com/mojang/authlib/properties/Property", "getSignature", "()Ljava/lang/String;", false);
ctx.invokeCallback(mv, YggdrasilKeyTransformUnit.class, "verifyPropertySignature");
mv.visitInsn(IRETURN);
mv.visitMaxs(-1, -1);