package com.l7tech.security.xml;

import com.l7tech.common.io.XmlUtil;
import com.l7tech.security.keys.XmlSecretKey;
import com.l7tech.security.keys.XmlSecretKeyFactory;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.DomUtils;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.HexUtils;
import com.l7tech.util.InvalidDocumentFormatException;
import com.l7tech.util.NamespaceFactory;
import com.l7tech.util.Pair;
import com.l7tech.util.SoapConstants;
import com.l7tech.xml.soap.SoapUtil;
import java.security.GeneralSecurityException;
import java.security.KeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.crypto.SecretKey;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class XmlElementEncryptor {
   private static final SecureRandom a;
   public static final String PROP_ENCRYPT_FOR_EXPIRED_CERT;
   public static final String PROP_OAEP_DIGEST_SHA256;
   final XmlElementEncryptionResolvedConfig b;
   private static final String[] c;

   public XmlElementEncryptor(@NotNull XmlElementEncryptionResolvedConfig var1) throws NoSuchAlgorithmException {
      if (var1 == null) {
         a(0);
      }

      super();
      this.b = var1;
      XmlSecretKeyFactory.validateAlgorithmUri(var1.getXencAlgorithm());
   }

   public static SupportedDigestMethods defaultOaepDigestMethod() {
      try {
         if (ConfigFactory.getBooleanProperty(c[24], false)) {
            return SupportedDigestMethods.SHA256;
         }
      } catch (RuntimeException var0) {
         throw a(var0);
      }

      return SupportedDigestMethods.SHA1;
   }

   public Pair<Element, SecretKey> createEncryptedKey(@NotNull Document var1, boolean var2, @Nullable SupportedDigestMethods var3, @Nullable byte[] var4) throws GeneralSecurityException {
      try {
         if (var1 == null) {
            a(1);
         }
      } catch (GeneralSecurityException var10) {
         throw a(var10);
      }

      byte[] var5 = new byte[32];
      a.nextBytes(var5);
      XmlSecretKey var6 = XmlSecretKeyFactory.createKey(var5, this.b.getXencAlgorithm());
      Element var7 = createEncryptedKey(var1, this.b.getRecipientCert(), var6, var2, var3, var4);
      String var8 = this.b.getEncryptedKeyRecipientAttribute();

      try {
         if (var8 != null) {
            var7.setAttribute(c[2], var8);
         }
      } catch (GeneralSecurityException var9) {
         throw a(var9);
      }

      return new Pair(var7, var6);
   }

   public static Element createEncryptedKey(
      @NotNull Document var0,
      @NotNull X509Certificate var1,
      @NotNull SecretKey var2,
      boolean var3,
      @Nullable SupportedDigestMethods var4,
      @Nullable byte[] var5
   ) throws GeneralSecurityException {
      try {
         if (var0 == null) {
            a(2);
         }
      } catch (GeneralSecurityException var21) {
         throw a(var21);
      }

      try {
         if (var1 == null) {
            a(3);
         }
      } catch (GeneralSecurityException var17) {
         throw a(var17);
      }

      try {
         if (var2 == null) {
            a(4);
         }
      } catch (GeneralSecurityException var20) {
         throw a(var20);
      }

      String var6 = SoapUtil.XMLENC_NS;
      String[] var15 = c;
      String var7 = var15[25];
      Element var8 = var0.createElementNS(var6, var15[28]);
      var8.setAttributeNS(XmlUtil.XMLNS_NS, var15[12], var6);
      Element var9 = DomUtils.createAndAppendElementNS(var8, var15[13], var6, var15[25]);
      IssuerSerialKeyInfoDetails var10 = new IssuerSerialKeyInfoDetails(var1, false);
      var10.createAndAppendKeyInfoElement(new NamespaceFactory(), var8);
      Element var11 = DomUtils.createAndAppendElementNS(var8, var15[10], var6, var15[25]);
      Element var12 = DomUtils.createAndAppendElementNS(var11, var15[7], var6, var15[25]);

      Element var10000;
      String var10001;
      String var10002;
      label65: {
         try {
            var10000 = var9;
            var10001 = var15[21];
            if (var3) {
               var10002 = SoapConstants.SUPPORTED_ENCRYPTEDKEY_ALGO_2;
               break label65;
            }
         } catch (GeneralSecurityException var19) {
            throw a(var19);
         }

         var10002 = SoapConstants.SUPPORTED_ENCRYPTEDKEY_ALGO;
      }

      try {
         var10000.setAttribute(var10001, var10002);
         if (!ConfigFactory.getBooleanProperty(c[32], false)) {
            var1.checkValidity();
         }
      } catch (GeneralSecurityException var16) {
         throw a(var16);
      }

      byte[] var13;
      label57: {
         label80: {
            label55: {
               try {
                  if (!var3) {
                     break label80;
                  }

                  if (null != var4) {
                     break label55;
                  }
               } catch (GeneralSecurityException var18) {
                  throw a(var18);
               }

               var4 = defaultOaepDigestMethod();
            }

            if (!SupportedDigestMethods.SHA1.equals(var4)) {
               var15 = c;
               Element var14 = DomUtils.createAndAppendElementNS(var9, var15[22], SoapUtil.DIGSIG_URI, var15[9]);
               var14.setAttribute(var15[21], var4.getIdentifier());
            }

            var13 = XencUtil.encryptKeyWithRsaOaepMGF1SHA1(var2.getEncoded(), var1, var1.getPublicKey(), var4, var5);
            break label57;
         }

         var13 = XencUtil.encryptKeyWithRsaAndPad(var2.getEncoded(), var1, var1.getPublicKey());
      }

      String var22 = HexUtils.encodeBase64(var13, true);
      var12.appendChild(DomUtils.createTextNode(var0, var22));
      return var8;
   }

   public Element encryptAndReplaceElement(@NotNull Element var1, @NotNull Pair<Element, SecretKey> var2) throws XencUtil.XencException, KeyException, NoSuchAlgorithmException {
      try {
         if (var1 == null) {
            a(5);
         }
      } catch (InvalidDocumentFormatException var11) {
         throw a(var11);
      }

      try {
         if (var2 == null) {
            a(6);
         }
      } catch (InvalidDocumentFormatException var12) {
         throw a(var12);
      }

      Element var3 = (Element)var2.left;
      SecretKey var4 = (SecretKey)var2.right;
      XmlSecretKey var5 = XmlSecretKeyFactory.createKey(var4.getEncoded(), this.b.getXencAlgorithm());
      Element var6 = XencUtil.encryptElement(var1, var5, this.b.isEncryptContentsOnly());

      try {
         var6 = insertKeyInfoAndDeUglifyNamespaces(var6, var3, this.b.getXencAlgorithm());
      } catch (InvalidDocumentFormatException var10) {
         String var10002 = ExceptionUtils.getMessage(var10);
         String[] var8 = c;
         throw new RuntimeException(var8[14] + var10002, var10);
      }

      String var7 = this.b.getEncryptedDataTypeAttribute();

      try {
         if (var7 != null) {
            var6.setAttribute(c[31], var7);
         }

         return var6;
      } catch (InvalidDocumentFormatException var9) {
         throw a(var9);
      }
   }

   public static Element insertKeyInfoAndDeUglifyNamespaces(Element var0, Element var1, String var2) throws InvalidDocumentFormatException {
      String var3 = SoapUtil.XMLENC_NS;
      String[] var13 = c;
      String var4 = var13[8];
      Element var5 = var0.getOwnerDocument().createElementNS(var3, var13[30]);

      try {
         var5.setAttributeNS(XmlUtil.XMLNS_NS, var13[27], var3);
         if (var0.hasAttribute(var13[19])) {
            var5.setAttribute(var13[31], var0.getAttribute(var13[31]));
         }
      } catch (InvalidDocumentFormatException var14) {
         throw a(var14);
      }

      var0.getParentNode().replaceChild(var5, var0);
      var13 = c;
      Element var6 = XmlUtil.createAndAppendElementNS(var5, var13[3], var3, var13[25]);
      var6.setAttribute(var13[34], var2);
      Element var7 = XmlUtil.createAndAppendElementNS(var5, var13[4], SoapUtil.DIGSIG_URI, var13[33]);
      var7.appendChild(var5.getOwnerDocument().importNode(var1, true));
      Element var8 = XmlUtil.createAndAppendElementNS(var5, var13[11], var3, var13[25]);
      Element var9 = XmlUtil.createAndAppendElementNS(var8, var13[20], var3, var13[25]);
      Element var10 = XmlUtil.findExactlyOneChildElementByName(var0, var3, var13[10]);
      Element var11 = XmlUtil.findExactlyOneChildElementByName(var10, var3, var13[7]);
      String var12 = XmlUtil.getTextValue(var11);
      XmlUtil.setTextContent(var9, var12);
      return var5;
   }

   static {
      String[] var5 = new String[37];
      int var3 = 0;
      String var2 = "\f+@yi}*\n'Eyv/=\u001a6D\"|e&\u0002(\u0002\u000eh&\u001b\u0003!@3k>\u001b\u0001'_/u>1\u001d-\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00033k),\u00164Y\u0010j8\u001b\u00174D$`.\u001d\n6Y\t=!N?u#;\u00010\u0010**N$|:*\u0006+C\u001b`>6\u0000 \u0007$!T\u001fk,1\u0018\n*N$|:*.*I\u0004`:2\u000e'H\u0013i/3\n*Y>.6J#h/0\u001bdK9wj\u001e!+Y\u0018p&2O4L$d';\u001b!_v\"o-HdB0%o-Aa^vh?-\u001bdC9qj<\ndC#i&\u000b,-]>`8\b\u000e(X3\u0004\u0017!C5\u0004\u000b7D1\n,-]>`8\u001a\u000e0L\n,-]>`8\u001a\u000e0L\n\u0017)A8vp&\n*N\u0010**N$|:*\u0006+C\u001b`>6\u0000 )&*Y3w$?\u0003dH$w%,O3E?i/~\n*N$|:*\u0006*Jv`&;\u0002!C\"?j\u0006S-C?qt\u0012\f6H7q/\u001b\u0001'_/u>;\u000b\u000fH/\f\n*N$|:*\n f3|\t\u001c!N$`>\u0015\n=\u0004;=]3\u000b,-]>`8\b\u000e(X3\t.(J9w#*\u0007)\f+-J3v>\u0013\n0E9a\u0007\t%N\"j8'*\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00039d/.A D1`9*A7E77\u007fh\u0004\u0017!C5\u0007\n(H;`$*\n\u0017)A8vp&\n*N\u0011\u0017!C5?\u000f0\f6T&q/:$!T\u0006\f+C0l-\u0012\u0017!C5?\u000f0\f6T&q/:+%Y7\u0004;=]3-\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00033k),\u00164Y\u0010j8\u001b\u00174D$`.\u001d\n6Y\u0004\u000b7D1\t.(J9w#*\u0007)";
      int var4 = "\f+@yi}*\n'Eyv/=\u001a6D\"|e&\u0002(\u0002\u000eh&\u001b\u0003!@3k>\u001b\u0001'_/u>1\u001d-\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00033k),\u00164Y\u0010j8\u001b\u00174D$`.\u001d\n6Y\t=!N?u#;\u00010\u0010**N$|:*\u0006+C\u001b`>6\u0000 \u0007$!T\u001fk,1\u0018\n*N$|:*.*I\u0004`:2\u000e'H\u0013i/3\n*Y>.6J#h/0\u001bdK9wj\u001e!+Y\u0018p&2O4L$d';\u001b!_v\"o-HdB0%o-Aa^vh?-\u001bdC9qj<\ndC#i&\u000b,-]>`8\b\u000e(X3\u0004\u0017!C5\u0004\u000b7D1\n,-]>`8\u001a\u000e0L\n,-]>`8\u001a\u000e0L\n\u0017)A8vp&\n*N\u0010**N$|:*\u0006+C\u001b`>6\u0000 )&*Y3w$?\u0003dH$w%,O3E?i/~\n*N$|:*\u0006*Jv`&;\u0002!C\"?j\u0006S-C?qt\u0012\f6H7q/\u001b\u0001'_/u>;\u000b\u000fH/\f\n*N$|:*\n f3|\t\u001c!N$`>\u0015\n=\u0004;=]3\u000b,-]>`8\b\u000e(X3\t.(J9w#*\u0007)\f+-J3v>\u0013\n0E9a\u0007\t%N\"j8'*\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00039d/.A D1`9*A7E77\u007fh\u0004\u0017!C5\u0007\n(H;`$*\n\u0017)A8vp&\n*N\u0011\u0017!C5?\u000f0\f6T&q/:$!T\u0006\f+C0l-\u0012\u0017!C5?\u000f0\f6T&q/:+%Y7\u0004;=]3-\f+@xi}*\n'Exv/=\u001a6D\"|d&\u0002(\u00033k),\u00164Y\u0010j8\u001b\u00174D$`.\u001d\n6Y\u0004\u000b7D1\t.(J9w#*\u0007)"
         .length();
      char var1 = '+';
      int var7 = -1;

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

         while (true) {
            String var8 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     c = var5;
                     String[] var9 = c;
                     PROP_ENCRYPT_FOR_EXPIRED_CERT = c[1];
                     PROP_OAEP_DIGEST_SHA256 = var9[36];
                     a = new SecureRandom();
                     return;
                  }

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

                  var2 = "^b\r|6`xBs-p4}*Oh\u0003;*>iId\u0006;5l~Yu\u0007a?'eAk@z'lm\u0002c\u0007r#zi\u0002t\u0006tt<+";
                  var4 = "^b\r|6`xBs-p4}*Oh\u0003;*>iId\u0006;5l~Yu\u0007a?'eAk@z'lm\u0002c\u0007r#zi\u0002t\u0006tt<+".length();
                  var1 = '\r';
                  var7 = -1;
            }

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

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

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

      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 -> 82;
            case 1 -> 121;
            case 2 -> 16;
            case 3 -> 107;
            case 4 -> 56;
            case 5 -> 119;
            default -> 99;
         });
      }

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