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

package org.bouncycastle.jcajce.util;

import java.security.spec.ECParameterSpec;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.asn1.x9.X9ECParametersHolder;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.x9.X9ECPoint;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x9.X962Parameters;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import java.security.spec.ECPoint;
import java.security.interfaces.ECPublicKey;

public class ECKeyUtil
{
    public static ECPublicKey createKeyWithCompression(final ECPublicKey ecPublicKey) {
        return new ECPublicKeyWithCompression(ecPublicKey);
    }
    
    private static class ECPublicKeyWithCompression implements ECPublicKey
    {
        private final ECPublicKey ecPublicKey;
        
        public ECPublicKeyWithCompression(final ECPublicKey ecPublicKey) {
            this.ecPublicKey = ecPublicKey;
        }
        
        @Override
        public ECPoint getW() {
            return this.ecPublicKey.getW();
        }
        
        @Override
        public String getAlgorithm() {
            return this.ecPublicKey.getAlgorithm();
        }
        
        @Override
        public String getFormat() {
            return this.ecPublicKey.getFormat();
        }
        
        @Override
        public byte[] getEncoded() {
            final SubjectPublicKeyInfo instance = SubjectPublicKeyInfo.getInstance(this.ecPublicKey.getEncoded());
            final X962Parameters instance2 = X962Parameters.getInstance(instance.getAlgorithm().getParameters());
            ECCurve ecCurve;
            if (instance2.isNamedCurve()) {
                final ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier)instance2.getParameters();
                X9ECParametersHolder x9ECParametersHolder = CustomNamedCurves.getByOIDLazy(asn1ObjectIdentifier);
                if (x9ECParametersHolder == null) {
                    x9ECParametersHolder = ECNamedCurveTable.getByOIDLazy(asn1ObjectIdentifier);
                }
                ecCurve = x9ECParametersHolder.getCurve();
            }
            else {
                if (instance2.isImplicitlyCA()) {
                    throw new IllegalStateException("unable to identify implictlyCA");
                }
                ecCurve = X9ECParameters.getInstance(instance2.getParameters()).getCurve();
            }
            final ASN1OctetString instance3 = ASN1OctetString.getInstance(new X9ECPoint(ecCurve.decodePoint(instance.getPublicKeyData().getOctets()), true).toASN1Primitive());
            try {
                return new SubjectPublicKeyInfo(instance.getAlgorithm(), instance3.getOctets()).getEncoded();
            }
            catch (final IOException ex) {
                throw new IllegalStateException("unable to encode EC public key: " + ex.getMessage());
            }
        }
        
        @Override
        public ECParameterSpec getParams() {
            return this.ecPublicKey.getParams();
        }
    }
}
