From f6970a51b2b1974b90e43d3786e55dcef04d6a8e Mon Sep 17 00:00:00 2001 From: Haowei Wen Date: Wed, 1 Nov 2023 18:47:45 +0800 Subject: [PATCH] Fix skin not displayed in Minecraft 1.20.2 --- .../support/YggdrasilKeyTransformUnit.java | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java b/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java index 8145491..8212797 100644 --- a/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java +++ b/src/main/java/moe/yushi/authlibinjector/transform/support/YggdrasilKeyTransformUnit.java @@ -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);