/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.common.io.CertUtils
 *  com.l7tech.gateway.common.audit.AssertionMessages
 *  com.l7tech.gateway.common.audit.Audit
 *  com.l7tech.gateway.common.audit.AuditDetailMessage
 *  com.l7tech.gateway.common.audit.AuditHaver
 *  com.l7tech.message.Message
 *  com.l7tech.policy.assertion.Assertion
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.IdentityTarget
 *  com.l7tech.policy.assertion.IdentityTargetable
 *  com.l7tech.policy.assertion.MessageTargetable
 *  com.l7tech.policy.assertion.PolicyAssertionException
 *  com.l7tech.policy.assertion.TargetMessageType
 *  com.l7tech.policy.assertion.xmlsec.SecurityHeaderAddressable
 *  com.l7tech.policy.assertion.xmlsec.XmlSecurityRecipientContext
 *  com.l7tech.policy.variable.NoSuchVariableException
 *  com.l7tech.security.token.EncryptedKey
 *  com.l7tech.security.token.KerberosSigningSecurityToken
 *  com.l7tech.security.token.SamlSecurityToken
 *  com.l7tech.security.token.SecurityContextToken
 *  com.l7tech.security.token.SigningSecurityToken
 *  com.l7tech.security.token.X509SigningSecurityToken
 *  com.l7tech.security.xml.decorator.DecorationRequirements
 *  com.l7tech.security.xml.processor.ProcessorResult
 *  com.l7tech.util.ConfigFactory
 *  com.l7tech.util.ExceptionUtils
 *  com.l7tech.util.HexUtils
 */
package com.l7tech.server.policy.assertion.xmlsec;

import com.l7tech.common.io.CertUtils;
import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.Audit;
import com.l7tech.gateway.common.audit.AuditDetailMessage;
import com.l7tech.gateway.common.audit.AuditHaver;
import com.l7tech.message.Message;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.IdentityTarget;
import com.l7tech.policy.assertion.IdentityTargetable;
import com.l7tech.policy.assertion.MessageTargetable;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.TargetMessageType;
import com.l7tech.policy.assertion.xmlsec.SecurityHeaderAddressable;
import com.l7tech.policy.assertion.xmlsec.XmlSecurityRecipientContext;
import com.l7tech.policy.variable.NoSuchVariableException;
import com.l7tech.security.token.EncryptedKey;
import com.l7tech.security.token.KerberosSigningSecurityToken;
import com.l7tech.security.token.SamlSecurityToken;
import com.l7tech.security.token.SecurityContextToken;
import com.l7tech.security.token.SigningSecurityToken;
import com.l7tech.security.token.X509SigningSecurityToken;
import com.l7tech.security.xml.decorator.DecorationRequirements;
import com.l7tech.security.xml.processor.ProcessorResult;
import com.l7tech.server.message.AuthenticationContext;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.AssertionStatusException;
import com.l7tech.server.policy.assertion.ServerAssertion;
import com.l7tech.server.policy.assertion.xmlsec.AddWssEncryptionContext;
import com.l7tech.server.policy.assertion.xmlsec.a;
import com.l7tech.server.util.WSSecurityProcessorUtils;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.HexUtils;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AddWssEncryptionSupport
implements AuditHaver {
    static boolean a;
    private final AuditHaver b;
    private final MessageTargetable c;
    private final X509Certificate d;
    private final SecurityHeaderAddressable e;
    private final IdentityTarget f;
    private static final String[] g;

    public AddWssEncryptionSupport(AuditHaver auditHaver, Logger logger, MessageTargetable messageTargetable, SecurityHeaderAddressable securityHeaderAddressable, IdentityTargetable identityTargetable) {
        this.b = auditHaver;
        this.c = messageTargetable;
        this.e = securityHeaderAddressable;
        this.f = new IdentityTarget(identityTargetable.getIdentityTarget());
        X509Certificate x509Certificate = null;
        if (!securityHeaderAddressable.getRecipientContext().localRecipient()) {
            try {
                x509Certificate = CertUtils.decodeCert((byte[])HexUtils.decodeBase64((String)securityHeaderAddressable.getRecipientContext().getBase64edX509Certificate(), (boolean)true));
            }
            catch (CertificateException certificateException) {
                logger.log(Level.WARNING, g[2] + certificateException.getMessage(), certificateException);
                x509Certificate = null;
            }
        }
        this.d = x509Certificate;
    }

    public Message getTargetMessage(PolicyEnforcementContext policyEnforcementContext) throws AssertionStatusException {
        try {
            return policyEnforcementContext.getTargetMessage(this.c);
        }
        catch (NoSuchVariableException noSuchVariableException) {
            this.getAuditor().logAndAudit((AuditDetailMessage)AssertionMessages.MESSAGE_TARGET_ERROR, new String[]{noSuchVariableException.getVariable(), ExceptionUtils.getMessage((Throwable)noSuchVariableException)});
            throw new AssertionStatusException(AssertionStatus.FAILED);
        }
    }

    public Audit getAuditor() {
        return this.b.getAuditor();
    }

    public AddWssEncryptionContext buildEncryptionContext(PolicyEnforcementContext policyEnforcementContext) throws PolicyAssertionException, MultipleTokensException {
        XmlSecurityRecipientContext xmlSecurityRecipientContext;
        String string;
        SigningSecurityToken signingSecurityToken;
        X509Certificate x509Certificate;
        block16: {
            block14: {
                block15: {
                    x509Certificate = null;
                    signingSecurityToken = null;
                    string = null;
                    xmlSecurityRecipientContext = null;
                    try {
                        if (this.e.getRecipientContext().localRecipient()) break block14;
                        if (this.d != null) break block15;
                    }
                    catch (PolicyAssertionException policyAssertionException) {
                        throw AddWssEncryptionSupport.a((Exception)((Object)policyAssertionException));
                    }
                    String string2 = g[1];
                    this.getAuditor().logAndAudit((AuditDetailMessage)AssertionMessages.EXCEPTION_WARNING_WITH_MORE_INFO, new String[]{string2});
                    throw new AssertionStatusException(AssertionStatus.SERVER_ERROR, string2);
                }
                x509Certificate = this.d;
                xmlSecurityRecipientContext = this.e.getRecipientContext();
                break block16;
            }
            if (this.a()) {
                SigningSecurityToken signingSecurityToken2;
                Message message = policyEnforcementContext.getRequest();
                AuthenticationContext authenticationContext = policyEnforcementContext.getAuthenticationContext(message);
                ProcessorResult processorResult = message.getSecurityKnob().getProcessorResult();
                SigningSecurityToken[] signingSecurityTokenArray = new IdentityTarget().equals((Object)this.f) ? WSSecurityProcessorUtils.getSigningSecurityTokens(authenticationContext.getCredentials()) : (processorResult != null ? ((signingSecurityToken2 = WSSecurityProcessorUtils.getSigningSecurityTokenByIdentity(authenticationContext, processorResult, this.f)) != null ? new SigningSecurityToken[]{signingSecurityToken2} : new SigningSecurityToken[]{}) : new SigningSecurityToken[]{});
                if (signingSecurityTokenArray.length == 1) {
                    signingSecurityToken = signingSecurityTokenArray[0];
                    try {
                        try {
                            try {
                                if (processorResult == null || !(signingSecurityToken instanceof X509SigningSecurityToken)) break block16;
                            }
                            catch (PolicyAssertionException policyAssertionException) {
                                throw AddWssEncryptionSupport.a((Exception)((Object)policyAssertionException));
                            }
                            if (!(signingSecurityToken instanceof SamlSecurityToken)) break block16;
                        }
                        catch (PolicyAssertionException policyAssertionException) {
                            throw AddWssEncryptionSupport.a((Exception)((Object)policyAssertionException));
                        }
                        if (a) break block16;
                    }
                    catch (PolicyAssertionException policyAssertionException) {
                        throw AddWssEncryptionSupport.a((Exception)((Object)policyAssertionException));
                    }
                    string = processorResult.getLastKeyEncryptionAlgorithm();
                } else {
                    try {
                        if (signingSecurityTokenArray.length > 1) {
                            throw new MultipleTokensException();
                        }
                    }
                    catch (PolicyAssertionException policyAssertionException) {
                        throw AddWssEncryptionSupport.a((Exception)((Object)policyAssertionException));
                    }
                }
            }
        }
        return new AddWssEncryptionContext(x509Certificate, signingSecurityToken, string, xmlSecurityRecipientContext);
    }

    private boolean a() {
        return TargetMessageType.RESPONSE.equals((Object)this.c.getTarget());
    }

    public void applyDecorationRequirements(PolicyEnforcementContext policyEnforcementContext, DecorationRequirements decorationRequirements, AddWssEncryptionContext addWssEncryptionContext, ServerAssertion serverAssertion) {
        block24: {
            block23: {
                block22: {
                    try {
                        if (!this.a() || new IdentityTarget().equals((Object)this.f)) break block22;
                    }
                    catch (AssertionStatusException assertionStatusException) {
                        throw AddWssEncryptionSupport.a(assertionStatusException);
                    }
                    try {
                        try {
                            decorationRequirements.clearTokens();
                            if (policyEnforcementContext == null || serverAssertion == null) break block22;
                        }
                        catch (AssertionStatusException assertionStatusException) {
                            throw AddWssEncryptionSupport.a(assertionStatusException);
                        }
                        policyEnforcementContext.addDeferredAssertion(serverAssertion, new a(this, (Assertion)serverAssertion.getAssertion(), decorationRequirements, addWssEncryptionContext, serverAssertion));
                    }
                    catch (AssertionStatusException assertionStatusException) {
                        throw AddWssEncryptionSupport.a(assertionStatusException);
                    }
                }
                try {
                    if (decorationRequirements.getKeyEncryptionAlgorithm() == null) {
                        decorationRequirements.setKeyEncryptionAlgorithm(addWssEncryptionContext.c);
                    }
                }
                catch (AssertionStatusException assertionStatusException) {
                    throw AddWssEncryptionSupport.a(assertionStatusException);
                }
                try {
                    if (addWssEncryptionContext.a == null) break block23;
                    decorationRequirements.setRecipientCertificate(addWssEncryptionContext.a);
                    break block24;
                }
                catch (AssertionStatusException assertionStatusException) {
                    throw AddWssEncryptionSupport.a(assertionStatusException);
                }
            }
            if (addWssEncryptionContext.b != null) {
                SigningSecurityToken signingSecurityToken;
                block26: {
                    block25: {
                        signingSecurityToken = addWssEncryptionContext.b;
                        try {
                            if (!(signingSecurityToken instanceof X509SigningSecurityToken)) break block25;
                            decorationRequirements.setRecipientCertificate(((X509SigningSecurityToken)signingSecurityToken).getMessageSigningCertificate());
                            break block24;
                        }
                        catch (AssertionStatusException assertionStatusException) {
                            throw AddWssEncryptionSupport.a(assertionStatusException);
                        }
                    }
                    try {
                        if (!(signingSecurityToken instanceof KerberosSigningSecurityToken)) break block26;
                        WSSecurityProcessorUtils.setToken(decorationRequirements, signingSecurityToken);
                        break block24;
                    }
                    catch (AssertionStatusException assertionStatusException) {
                        throw AddWssEncryptionSupport.a(assertionStatusException);
                    }
                }
                try {
                    try {
                        try {
                            if (!(signingSecurityToken instanceof SecurityContextToken) && !(signingSecurityToken instanceof EncryptedKey)) break block24;
                        }
                        catch (AssertionStatusException assertionStatusException) {
                            throw AddWssEncryptionSupport.a(assertionStatusException);
                        }
                        if (!WSSecurityProcessorUtils.setToken(decorationRequirements, signingSecurityToken)) break block24;
                    }
                    catch (AssertionStatusException assertionStatusException) {
                        throw AddWssEncryptionSupport.a(assertionStatusException);
                    }
                    decorationRequirements.setSignTimestamp(true);
                }
                catch (AssertionStatusException assertionStatusException) {
                    throw AddWssEncryptionSupport.a(assertionStatusException);
                }
            }
        }
    }

    /*
     * Enabled aggressive block sorting
     */
    static {
        String[] stringArray = new String[3];
        int n2 = 0;
        String string = "\u000bp\u00124)Y\u0013\r|\u001746\u000b\u0015\u001ez\r42\u001d\u0014F{\u001ay*\u001c\u0006\u001cv\u0010tk\u001b\u0014\r[\u001an \r\u0013\r{4\u007f</\u000b\u000fp\rs1\u0006\n.p\rI$\u0003\u000b\"\u000b~\u0011t*\u001aG\u001az\u000bh,\u000b\u0011\r?\u000br N\u0015\r|\u0016j,\u000b\t\u001c?\u001c\u007f7\u001a>)l\f\u007f7\u001a\u000e\u0007q_m,\u0002\u000bH~\u0013m$\u0017\u0014Hy\u001es)TG\u001az\u001cs5\u0007\u0002\u0006k_y \u001c\u0013H|\u001et+\u0001\u0013H}\u001a:!\u000b\u0004\u0007{\u001a~\u007fN";
        int n3 = "\u000bp\u00124)Y\u0013\r|\u001746\u000b\u0015\u001ez\r42\u001d\u0014F{\u001ay*\u001c\u0006\u001cv\u0010tk\u001b\u0014\r[\u001an \r\u0013\r{4\u007f</\u000b\u000fp\rs1\u0006\n.p\rI$\u0003\u000b\"\u000b~\u0011t*\u001aG\u001az\u000bh,\u000b\u0011\r?\u000br N\u0015\r|\u0016j,\u000b\t\u001c?\u001c\u007f7\u001a>)l\f\u007f7\u001a\u000e\u0007q_m,\u0002\u000bH~\u0013m$\u0017\u0014Hy\u001es)TG\u001az\u001cs5\u0007\u0002\u0006k_y \u001c\u0013H|\u001et+\u0001\u0013H}\u001a:!\u000b\u0004\u0007{\u001a~\u007fN".length();
        int n4 = 63;
        int n5 = -1;
        while (true) {
            int n6 = ++n5;
            stringArray[n2++] = AddWssEncryptionSupport.a(73, AddWssEncryptionSupport.a(string.substring(n6, n6 + n4)));
            if ((n5 += n4) >= n3) {
                g = stringArray;
                a = ConfigFactory.getBooleanProperty((String)g[0], (boolean)true);
                return;
            }
            n4 = string.charAt(n5);
        }
    }

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

    private static char[] a(String string) {
        char[] cArray = string.toCharArray();
        if (cArray.length < 2) {
            cArray = cArray;
            cArray[0] = (char)(cArray[0] ^ 0x2E);
        }
        return cArray;
    }

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String a(int n2, char[] cArray) {
        char[] cArray2;
        block11: {
            int n3;
            int n4;
            int n5;
            block10: {
                n5 = n2;
                cArray2 = cArray;
                n4 = cArray.length;
                n3 = 0;
                if (!true) break block10;
                n4 = n4;
                if (n4 <= n3) break block11;
            }
            do {
                n5 = n5;
                cArray2 = cArray2;
                int n6 = n3;
                cArray2[n6] = (char)(cArray2[n6] ^ (n5 ^ (switch (n3 % 7) {
                    case 0 -> 33;
                    case 1 -> 86;
                    case 2 -> 54;
                    case 3 -> 83;
                    case 4 -> 12;
                    case 5 -> 39;
                    default -> 46;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }

    public static class MultipleTokensException
    extends Exception {
        static final long serialVersionUID = -8825657399047487863L;
    }
}

