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

package org.bouncycastle.its.bc;

import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccCurvePoint;
import org.bouncycastle.asn1.teletrust.TeleTrusTNamedCurves;
import org.bouncycastle.asn1.nist.NISTNamedCurves;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccP384CurvePoint;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Point384;
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccP256CurvePoint;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Point256;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.sec.SECObjectIdentifiers;
import org.bouncycastle.crypto.params.ECNamedDomainParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.PublicVerificationKey;
import org.bouncycastle.its.ITSPublicVerificationKey;

public class BcITSPublicVerificationKey extends ITSPublicVerificationKey
{
    public BcITSPublicVerificationKey(final PublicVerificationKey publicVerificationKey) {
        super(publicVerificationKey);
    }
    
    static PublicVerificationKey fromKeyParameters(final ECPublicKeyParameters ecPublicKeyParameters) {
        final ASN1ObjectIdentifier name = ((ECNamedDomainParameters)ecPublicKeyParameters.getParameters()).getName();
        final ECPoint q = ecPublicKeyParameters.getQ();
        if (name.equals(SECObjectIdentifiers.secp256r1)) {
            return new PublicVerificationKey(0, EccP256CurvePoint.uncompressedP256(Point256.builder().setX(q.getAffineXCoord().toBigInteger()).setY(q.getAffineYCoord().toBigInteger()).createPoint256()));
        }
        if (name.equals(TeleTrusTObjectIdentifiers.brainpoolP256r1)) {
            return new PublicVerificationKey(1, EccP256CurvePoint.uncompressedP256(Point256.builder().setX(q.getAffineXCoord().toBigInteger()).setY(q.getAffineYCoord().toBigInteger()).createPoint256()));
        }
        if (name.equals(TeleTrusTObjectIdentifiers.brainpoolP384r1)) {
            return new PublicVerificationKey(2, EccP384CurvePoint.uncompressedP384(Point384.builder().setX(q.getAffineXCoord().toBigInteger()).setY(q.getAffineYCoord().toBigInteger()).createPoint384()));
        }
        throw new IllegalArgumentException("unknown curve in public encryption key");
    }
    
    public BcITSPublicVerificationKey(final AsymmetricKeyParameter asymmetricKeyParameter) {
        super(fromKeyParameters((ECPublicKeyParameters)asymmetricKeyParameter));
    }
    
    public AsymmetricKeyParameter getKey() {
        ASN1ObjectIdentifier asn1ObjectIdentifier = null;
        X9ECParameters x9ECParameters = null;
        switch (this.verificationKey.getChoice()) {
            case 0: {
                asn1ObjectIdentifier = SECObjectIdentifiers.secp256r1;
                x9ECParameters = NISTNamedCurves.getByOID(SECObjectIdentifiers.secp256r1);
                break;
            }
            case 1: {
                asn1ObjectIdentifier = TeleTrusTObjectIdentifiers.brainpoolP256r1;
                x9ECParameters = TeleTrusTNamedCurves.getByOID(TeleTrusTObjectIdentifiers.brainpoolP256r1);
                break;
            }
            case 2: {
                asn1ObjectIdentifier = TeleTrusTObjectIdentifiers.brainpoolP384r1;
                x9ECParameters = TeleTrusTNamedCurves.getByOID(TeleTrusTObjectIdentifiers.brainpoolP384r1);
                break;
            }
            default: {
                throw new IllegalStateException("unknown key type");
            }
        }
        final ECCurve curve = x9ECParameters.getCurve();
        if (this.verificationKey.getPublicVerificationKey() instanceof EccCurvePoint) {
            final EccCurvePoint eccCurvePoint = (EccCurvePoint)this.verificationKey.getPublicVerificationKey();
            byte[] array;
            if (eccCurvePoint instanceof EccP256CurvePoint) {
                array = eccCurvePoint.getEncodedPoint();
            }
            else {
                if (!(eccCurvePoint instanceof EccP384CurvePoint)) {
                    throw new IllegalStateException("unknown key type");
                }
                array = eccCurvePoint.getEncodedPoint();
            }
            return new ECPublicKeyParameters(curve.decodePoint(array).normalize(), new ECNamedDomainParameters(asn1ObjectIdentifier, x9ECParameters));
        }
        throw new IllegalStateException("extension to public verification key not supported");
    }
}
