package com.l7tech.common.password;

import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.HexUtils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CryptL7PasswordHasher implements PasswordHasher {
   public static final String MESSAGE_DIGEST_ALGORITHM_NAME;
   public static final int SALT_BYTES;
   public static final String PREFIX;
   private static final String a;
   private static final Pattern b;
   private final CryptL7 c = new CryptL7();
   private final SecureRandom d;
   private final ThreadLocal<CryptL7.Hasher> e = new ThreadLocal<>();
   private static final String[] f;

   public CryptL7PasswordHasher(SecureRandom var1) {
      this.d = var1;
   }

   @Override
   public String hashPassword(byte[] var1) {
      try {
         byte var2 = this.c.getDefaultWorkFactor();
         byte[] var3 = this.a();
         byte[] var4 = this.c.computeHash(var1, var3, var2, this.b());
         return this.a(var2, var3, var4);
      } catch (NoSuchAlgorithmException var5) {
         throw new RuntimeException(f[6] + ExceptionUtils.getMessage(var5), var5);
      }
   }

   @Override
   public void verifyPassword(byte[] var1, String var2) throws IncorrectPasswordException, PasswordHashingException {
      try {
         a var3 = this.a(var2);
         byte[] var4 = var3.c;
         byte[] var5 = this.c.computeHash(var1, var3.b, var3.a, this.b());

         try {
            if (var5.length != var4.length) {
               throw new PasswordHashingException(f[0]);
            }
         } catch (NoSuchAlgorithmException var10) {
            throw a(var10);
         }

         int var6 = 0;

         for (int var7 = 0; var7 < var5.length; var7++) {
            byte var8 = var5[var7];
            byte var9 = var4[var7];
            var6 |= var8 ^ var9;
         }

         if (var6 == 0) {
            return;
         }
      } catch (NoSuchAlgorithmException var11) {
         throw new PasswordHashingException(f[5] + ExceptionUtils.getMessage(var11), var11);
      }

      throw new IncorrectPasswordException();
   }

   @Override
   public boolean isVerifierRecognized(String var1) {
      try {
         this.a(var1);
         return true;
      } catch (PasswordHashingException var3) {
         return false;
      }
   }

   @Override
   public String getPrefix() {
      return f[4];
   }

   @Override
   public byte[] extractSaltFromVerifier(String var1) {
      try {
         return this.a(var1).b;
      } catch (PasswordHashingException var3) {
         return null;
      }
   }

   private byte[] a() {
      byte[] var1 = new byte[SALT_BYTES];
      this.d.nextBytes(var1);
      return var1;
   }

   private String a(byte var1, byte[] var2, byte[] var3) {
      byte[] var4 = new byte[var2.length + 1];
      var4[0] = var1;
      System.arraycopy(var2, 0, var4, 1, var2.length);
      return f[4] + HexUtils.encodeBase64(var4, true) + "$" + HexUtils.encodeBase64(var3, true);
   }

   private a a(String var1) throws PasswordHashingException {
      try {
         if (!var1.startsWith(f[4])) {
            throw new PasswordHashingException(f[7]);
         }
      } catch (PasswordHashingException var12) {
         throw a(var12);
      }

      Matcher var2 = b.matcher(var1);

      try {
         if (!var2.matches()) {
            throw new PasswordHashingException(f[12]);
         }
      } catch (PasswordHashingException var11) {
         throw a(var11);
      }

      String var3 = var2.group(1);
      String var4 = var2.group(2);
      byte[] var5 = HexUtils.decodeBase64(var3, true);

      try {
         if (var5.length < 2) {
            throw new PasswordHashingException(f[8]);
         }
      } catch (PasswordHashingException var10) {
         throw a(var10);
      }

      byte[] var6 = HexUtils.decodeBase64(var4, true);

      try {
         if (var6.length < 2) {
            throw new PasswordHashingException(f[11]);
         }
      } catch (PasswordHashingException var9) {
         throw a(var9);
      }

      byte[] var7 = new byte[var5.length - 1];
      byte var8 = var5[0];
      System.arraycopy(var5, 1, var7, 0, var7.length);
      return new a(var8, var7, var6);
   }

   private CryptL7.Hasher b() throws NoSuchAlgorithmException {
      CryptL7.Hasher var1 = this.e.get();
      if (var1 == null) {
         var1 = new CryptL7.SingleThreadedJceMessageDigestHasher(MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM_NAME));
         this.e.set(var1);
      }

      return var1;
   }

   static {
      String[] var5 = new String[14];
      int var3 = 0;
      String var2 = "!^kO\u0007.n\u001bV~NB*+\u001aZlSN6l\u001a\u001f|NA>n\u001b\u001f~UH5+\u000eVnBIx}\fMqAN=yILlUN6lI^vC\u0007;~\u001bM}ISx}\fMqAN=yIL}SS1e\u000eL8\n\nx}\fMqAN=yIS}I@,cIRqTJ9\u007f\nW\u0007:wY\n\u0015m=&Ady\n]\u0019&3\u000f5\u001e{s$Tb3\u000e{|#2^5]fuQY\u0012!{\fw64\u00141)\nPu\tKo\u007f\f\\p\td*r\u0019KT\u0010\t5n\u001aLy@B\u001cb\u000eZkSf4l\u0006MqSO5\u0005Ms/o\u0003\u001a<QyEK=+\u001dP8DO=h\u0002\u001fhFT+|\u0006M|\u001d\u0007\u0019<QyEK=+\u001dP8OF+cIOyTT/d\u001b[\"\u000729^kTP7y\r\u001fnBU1m\u0000Zj\u0007C7n\u001a\u001fvHSxx\u001d^jS\u0007/b\u001dW8\u0003koCM\u001fhUB>b\u0011+?ZjNA1n\u001b\u001f|HB++\u0007Pl\u0007N6h\u0005J|B\u0007=e\u0006J\u007fO\u0007+j\u0005K8E^,n\u001a\u0005Ms/o\u0003\u00102^5]fuQY\u0012!{\fw64\u0014+?ZjNA1n\u001b\u001f|HB++\u0007Pl\u0007N6h\u0005J|B\u0007=e\u0006J\u007fO\u00070j\u001aW8E^,n\u001a";
      int var4 = "!^kO\u0007.n\u001bV~NB*+\u001aZlSN6l\u001a\u001f|NA>n\u001b\u001f~UH5+\u000eVnBIx}\fMqAN=yILlUN6lI^vC\u0007;~\u001bM}ISx}\fMqAN=yIL}SS1e\u000eL8\n\nx}\fMqAN=yIS}I@,cIRqTJ9\u007f\nW\u0007:wY\n\u0015m=&Ady\n]\u0019&3\u000f5\u001e{s$Tb3\u000e{|#2^5]fuQY\u0012!{\fw64\u00141)\nPu\tKo\u007f\f\\p\td*r\u0019KT\u0010\t5n\u001aLy@B\u001cb\u000eZkSf4l\u0006MqSO5\u0005Ms/o\u0003\u001a<QyEK=+\u001dP8DO=h\u0002\u001fhFT+|\u0006M|\u001d\u0007\u0019<QyEK=+\u001dP8OF+cIOyTT/d\u001b[\"\u000729^kTP7y\r\u001fnBU1m\u0000Zj\u0007C7n\u001a\u001fvHSxx\u001d^jS\u0007/b\u001dW8\u0003koCM\u001fhUB>b\u0011+?ZjNA1n\u001b\u001f|HB++\u0007Pl\u0007N6h\u0005J|B\u0007=e\u0006J\u007fO\u0007+j\u0005K8E^,n\u001a\u0005Ms/o\u0003\u00102^5]fuQY\u0012!{\fw64\u0014+?ZjNA1n\u001b\u001f|HB++\u0007Pl\u0007N6h\u0005J|B\u0007=e\u0006J\u007fO\u00070j\u001aW8E^,n\u001a"
         .length();
      char var1 = 'r';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 97;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var9 = a(var10000, b(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var9;
                  if ((var7 += var1) >= var4) {
                     f = var5;
                     String[] var10 = f;
                     a = f[10];
                     PREFIX = var10[4];
                     String[] var8 = f;
                     MESSAGE_DIGEST_ALGORITHM_NAME = ConfigFactory.getProperty(var8[3], var8[1]);
                     SALT_BYTES = ConfigFactory.getIntProperty(var8[13], 10);
                     b = Pattern.compile(Pattern.quote(var8[9]) + var8[2]);
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var9;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "I$\u001f71B\u0019r#\u001776\r\u000e}9\u001e%=_\u001a<<\b ;K\u0017y8M4=_\u0013}>\u001c\u007f%\u0000|>\u001a\ny)\u0005|\u0011_\u0007l>!e|^\u001fp>/+&H\r";
                  var4 = "I$\u001f71B\u0019r#\u001776\r\u000e}9\u001e%=_\u001a<<\b ;K\u0017y8M4=_\u0013}>\u001c\u007f%\u0000|>\u001a\ny)\u0005|\u0011_\u0007l>!e|^\u001fp>/+&H\r"
                     .length();
                  var1 = '%';
                  var7 = -1;
            }

            var10000 = 20;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static Exception a(Exception var0) {
      return var0;
   }

   private static char[] b(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 106);
      }

      return var10000;
   }

   private static String a(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 8;
            case 1 -> 94;
            case 2 -> 121;
            case 3 -> 70;
            case 4 -> 70;
            case 5 -> 57;
            default -> 106;
         });
      }

      return new String(var10001).intern();
   }
}
