// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.jcajce.provider.asymmetric.util;

import org.bouncycastle.asn1.x9.X9ECParametersHolder;
import java.util.Enumeration;
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import java.util.HashMap;
import java.security.spec.ECPoint;
import org.bouncycastle.math.field.Polynomial;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.math.field.PolynomialExtensionField;
import org.bouncycastle.math.ec.ECAlgorithms;
import org.bouncycastle.math.field.FiniteField;
import java.security.spec.ECField;
import java.security.spec.ECFieldF2m;
import java.math.BigInteger;
import java.security.spec.ECFieldFp;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import java.security.spec.EllipticCurve;
import java.util.Map;
import org.bouncycastle.jce.ECGOST3410NamedCurveTable;
import org.bouncycastle.asn1.cryptopro.GOST3410PublicKeyAlgParameters;
import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.crypto.params.ECDomainParameters;
import java.security.spec.ECParameterSpec;
import java.util.Set;
import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.asn1.x9.X962Parameters;
import org.bouncycastle.jcajce.provider.config.ProviderConfiguration;

public class EC5Util
{
    public static ECCurve getCurve(final ProviderConfiguration providerConfiguration, final X962Parameters x962Parameters) {
        final Set acceptableNamedCurves = providerConfiguration.getAcceptableNamedCurves();
        ECCurve ecCurve;
        if (x962Parameters.isNamedCurve()) {
            final ASN1ObjectIdentifier instance = ASN1ObjectIdentifier.getInstance(x962Parameters.getParameters());
            if (!acceptableNamedCurves.isEmpty() && !acceptableNamedCurves.contains(instance)) {
                throw new IllegalStateException("named curve not acceptable");
            }
            X9ECParameters namedCurveByOid = ECUtil.getNamedCurveByOid(instance);
            if (namedCurveByOid == null) {
                namedCurveByOid = providerConfiguration.getAdditionalECParameters().get(instance);
            }
            ecCurve = namedCurveByOid.getCurve();
        }
        else if (x962Parameters.isImplicitlyCA()) {
            ecCurve = providerConfiguration.getEcImplicitlyCa().getCurve();
        }
        else {
            final ASN1Sequence instance2 = ASN1Sequence.getInstance(x962Parameters.getParameters());
            if (!acceptableNamedCurves.isEmpty()) {
                throw new IllegalStateException("encoded parameters not acceptable");
            }
            if (instance2.size() > 3) {
                ecCurve = X9ECParameters.getInstance(instance2).getCurve();
            }
            else {
                ecCurve = ECGOST3410NamedCurves.getByOIDX9(ASN1ObjectIdentifier.getInstance(instance2.getObjectAt(0))).getCurve();
            }
        }
        return ecCurve;
    }
    
    public static ECDomainParameters getDomainParameters(final ProviderConfiguration providerConfiguration, final ECParameterSpec ecParameterSpec) {
        ECDomainParameters domainParameters;
        if (ecParameterSpec == null) {
            final org.bouncycastle.jce.spec.ECParameterSpec ecImplicitlyCa = providerConfiguration.getEcImplicitlyCa();
            domainParameters = new ECDomainParameters(ecImplicitlyCa.getCurve(), ecImplicitlyCa.getG(), ecImplicitlyCa.getN(), ecImplicitlyCa.getH(), ecImplicitlyCa.getSeed());
        }
        else {
            domainParameters = ECUtil.getDomainParameters(providerConfiguration, convertSpec(ecParameterSpec));
        }
        return domainParameters;
    }
    
    public static ECParameterSpec convertToSpec(final X962Parameters x962Parameters, ECCurve curve) {
        ECParameterSpec ecParameterSpec;
        if (x962Parameters.isNamedCurve()) {
            final ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier)x962Parameters.getParameters();
            X9ECParameters namedCurveByOid = ECUtil.getNamedCurveByOid(asn1ObjectIdentifier);
            if (namedCurveByOid == null) {
                final Map additionalECParameters = BouncyCastleProvider.CONFIGURATION.getAdditionalECParameters();
                if (!additionalECParameters.isEmpty()) {
                    namedCurveByOid = (X9ECParameters)additionalECParameters.get(asn1ObjectIdentifier);
                }
            }
            ecParameterSpec = new ECNamedCurveSpec(ECUtil.getCurveName(asn1ObjectIdentifier), convertCurve(curve, namedCurveByOid.getSeed()), convertPoint(namedCurveByOid.getG()), namedCurveByOid.getN(), namedCurveByOid.getH());
        }
        else if (x962Parameters.isImplicitlyCA()) {
            ecParameterSpec = null;
        }
        else {
            final ASN1Sequence instance = ASN1Sequence.getInstance(x962Parameters.getParameters());
            if (instance.size() > 3) {
                final X9ECParameters instance2 = X9ECParameters.getInstance(instance);
                final EllipticCurve convertCurve = convertCurve(curve, instance2.getSeed());
                if (instance2.getH() != null) {
                    ecParameterSpec = new ECParameterSpec(convertCurve, convertPoint(instance2.getG()), instance2.getN(), instance2.getH().intValue());
                }
                else {
                    ecParameterSpec = new ECParameterSpec(convertCurve, convertPoint(instance2.getG()), instance2.getN(), 1);
                }
            }
            else {
                final GOST3410PublicKeyAlgParameters instance3 = GOST3410PublicKeyAlgParameters.getInstance(instance);
                final ECNamedCurveParameterSpec parameterSpec = ECGOST3410NamedCurveTable.getParameterSpec(ECGOST3410NamedCurves.getName(instance3.getPublicKeyParamSet()));
                curve = parameterSpec.getCurve();
                ecParameterSpec = new ECNamedCurveSpec(ECGOST3410NamedCurves.getName(instance3.getPublicKeyParamSet()), convertCurve(curve, parameterSpec.getSeed()), convertPoint(parameterSpec.getG()), parameterSpec.getN(), parameterSpec.getH());
            }
        }
        return ecParameterSpec;
    }
    
    public static ECParameterSpec convertToSpec(final X9ECParameters x9ECParameters) {
        return new ECParameterSpec(convertCurve(x9ECParameters.getCurve(), null), convertPoint(x9ECParameters.getG()), x9ECParameters.getN(), x9ECParameters.getH().intValue());
    }
    
    public static ECParameterSpec convertToSpec(final ECDomainParameters ecDomainParameters) {
        return new ECParameterSpec(convertCurve(ecDomainParameters.getCurve(), null), convertPoint(ecDomainParameters.getG()), ecDomainParameters.getN(), ecDomainParameters.getH().intValue());
    }
    
    public static EllipticCurve convertCurve(final ECCurve ecCurve, final byte[] array) {
        return new EllipticCurve(convertField(ecCurve.getField()), ecCurve.getA().toBigInteger(), ecCurve.getB().toBigInteger(), null);
    }
    
    public static ECCurve convertCurve(final EllipticCurve ellipticCurve) {
        final ECField field = ellipticCurve.getField();
        final BigInteger a = ellipticCurve.getA();
        final BigInteger b = ellipticCurve.getB();
        if (field instanceof ECFieldFp) {
            return CustomCurves.substitute(new ECCurve.Fp(((ECFieldFp)field).getP(), a, b, null, null));
        }
        final ECFieldF2m ecFieldF2m = (ECFieldF2m)field;
        final int m = ecFieldF2m.getM();
        final int[] convertMidTerms = ECUtil.convertMidTerms(ecFieldF2m.getMidTermsOfReductionPolynomial());
        return new ECCurve.F2m(m, convertMidTerms[0], convertMidTerms[1], convertMidTerms[2], a, b, null, null);
    }
    
    public static ECField convertField(final FiniteField finiteField) {
        if (ECAlgorithms.isFpField(finiteField)) {
            return new ECFieldFp(finiteField.getCharacteristic());
        }
        final Polynomial minimalPolynomial = ((PolynomialExtensionField)finiteField).getMinimalPolynomial();
        final int[] exponentsPresent = minimalPolynomial.getExponentsPresent();
        return new ECFieldF2m(minimalPolynomial.getDegree(), Arrays.reverseInPlace(Arrays.copyOfRange(exponentsPresent, 1, exponentsPresent.length - 1)));
    }
    
    public static ECParameterSpec convertSpec(final EllipticCurve curve, final org.bouncycastle.jce.spec.ECParameterSpec ecParameterSpec) {
        final ECPoint convertPoint = convertPoint(ecParameterSpec.getG());
        if (ecParameterSpec instanceof ECNamedCurveParameterSpec) {
            return new ECNamedCurveSpec(((ECNamedCurveParameterSpec)ecParameterSpec).getName(), curve, convertPoint, ecParameterSpec.getN(), ecParameterSpec.getH());
        }
        return new ECParameterSpec(curve, convertPoint, ecParameterSpec.getN(), ecParameterSpec.getH().intValue());
    }
    
    public static org.bouncycastle.jce.spec.ECParameterSpec convertSpec(final ECParameterSpec ecParameterSpec) {
        final ECCurve convertCurve = convertCurve(ecParameterSpec.getCurve());
        final org.bouncycastle.math.ec.ECPoint convertPoint = convertPoint(convertCurve, ecParameterSpec.getGenerator());
        final BigInteger order = ecParameterSpec.getOrder();
        final BigInteger value = BigInteger.valueOf(ecParameterSpec.getCofactor());
        final byte[] seed = ecParameterSpec.getCurve().getSeed();
        if (ecParameterSpec instanceof ECNamedCurveSpec) {
            return new ECNamedCurveParameterSpec(((ECNamedCurveSpec)ecParameterSpec).getName(), convertCurve, convertPoint, order, value, seed);
        }
        return new org.bouncycastle.jce.spec.ECParameterSpec(convertCurve, convertPoint, order, value, seed);
    }
    
    public static org.bouncycastle.math.ec.ECPoint convertPoint(final ECParameterSpec ecParameterSpec, final ECPoint ecPoint) {
        return convertPoint(convertCurve(ecParameterSpec.getCurve()), ecPoint);
    }
    
    public static org.bouncycastle.math.ec.ECPoint convertPoint(final ECCurve ecCurve, final ECPoint ecPoint) {
        return ecCurve.createPoint(ecPoint.getAffineX(), ecPoint.getAffineY());
    }
    
    public static ECPoint convertPoint(org.bouncycastle.math.ec.ECPoint normalize) {
        normalize = normalize.normalize();
        return new ECPoint(normalize.getAffineXCoord().toBigInteger(), normalize.getAffineYCoord().toBigInteger());
    }
    
    private static class CustomCurves
    {
        private static Map CURVE_MAP;
        
        private static Map createCurveMap() {
            final HashMap hashMap = new HashMap();
            final Enumeration names = CustomNamedCurves.getNames();
            while (names.hasMoreElements()) {
                final String s = names.nextElement();
                final X9ECParametersHolder byNameLazy = ECNamedCurveTable.getByNameLazy(s);
                if (byNameLazy != null) {
                    final ECCurve curve = byNameLazy.getCurve();
                    if (!ECAlgorithms.isFpCurve(curve)) {
                        continue;
                    }
                    hashMap.put(curve, CustomNamedCurves.getByNameLazy(s).getCurve());
                }
            }
            final ECCurve curve2 = CustomNamedCurves.getByNameLazy("Curve25519").getCurve();
            hashMap.put(new ECCurve.Fp(curve2.getField().getCharacteristic(), curve2.getA().toBigInteger(), curve2.getB().toBigInteger(), curve2.getOrder(), curve2.getCofactor(), true), curve2);
            return hashMap;
        }
        
        static ECCurve substitute(final ECCurve ecCurve) {
            final ECCurve ecCurve2 = CustomCurves.CURVE_MAP.get(ecCurve);
            return (null != ecCurve2) ? ecCurve2 : ecCurve;
        }
        
        static {
            CustomCurves.CURVE_MAP = createCurveMap();
        }
    }
}
