// 
// 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.EccP384CurvePoint;
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.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccCurvePoint;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccP256CurvePoint;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.BasePublicEncryptionKey;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.SymmAlgorithm;
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.PublicEncryptionKey;
import org.bouncycastle.its.ITSPublicEncryptionKey;

public class BcITSPublicEncryptionKey extends ITSPublicEncryptionKey
{
    public BcITSPublicEncryptionKey(final PublicEncryptionKey publicEncryptionKey) {
        super(publicEncryptionKey);
    }
    
    static PublicEncryptionKey fromKeyParameters(final ECPublicKeyParameters ecPublicKeyParameters) {
        final ASN1ObjectIdentifier name = ((ECNamedDomainParameters)ecPublicKeyParameters.getParameters()).getName();
        final ECPoint q = ecPublicKeyParameters.getQ();
        if (name.equals(SECObjectIdentifiers.secp256r1)) {
            return new PublicEncryptionKey(SymmAlgorithm.aes128Ccm, new BasePublicEncryptionKey.Builder().setChoice(0).setValue(EccP256CurvePoint.uncompressedP256(q.getAffineXCoord().toBigInteger(), q.getAffineYCoord().toBigInteger())).createBasePublicEncryptionKey());
        }
        if (name.equals(TeleTrusTObjectIdentifiers.brainpoolP256r1)) {
            return new PublicEncryptionKey(SymmAlgorithm.aes128Ccm, new BasePublicEncryptionKey.Builder().setChoice(1).setValue(EccP256CurvePoint.uncompressedP256(q.getAffineXCoord().toBigInteger(), q.getAffineYCoord().toBigInteger())).createBasePublicEncryptionKey());
        }
        throw new IllegalArgumentException("unknown curve in public encryption key");
    }
    
    public BcITSPublicEncryptionKey(final AsymmetricKeyParameter asymmetricKeyParameter) {
        super(fromKeyParameters((ECPublicKeyParameters)asymmetricKeyParameter));
    }
    
    public AsymmetricKeyParameter getKey() {
        final BasePublicEncryptionKey publicKey = this.encryptionKey.getPublicKey();
        ASN1ObjectIdentifier asn1ObjectIdentifier = null;
        X9ECParameters x9ECParameters = null;
        switch (publicKey.getChoice()) {
            case 0: {
                asn1ObjectIdentifier = SECObjectIdentifiers.secp256r1;
                x9ECParameters = NISTNamedCurves.getByOID(SECObjectIdentifiers.secp256r1);
                break;
            }
            case 1: {
                asn1ObjectIdentifier = TeleTrusTObjectIdentifiers.brainpoolP256r1;
                x9ECParameters = TeleTrusTNamedCurves.getByOID(TeleTrusTObjectIdentifiers.brainpoolP256r1);
                break;
            }
            default: {
                throw new IllegalStateException("unknown key type");
            }
        }
        final ECCurve curve = x9ECParameters.getCurve();
        if (this.encryptionKey.getPublicKey().getBasePublicEncryptionKey() instanceof EccCurvePoint) {
            final EccCurvePoint eccCurvePoint = (EccCurvePoint)publicKey.getBasePublicEncryptionKey();
            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");
    }
}
