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

package org.bouncycastle.pqc.crypto.util;

import java.io.IOException;
import org.bouncycastle.pqc.crypto.snova.SnovaPublicKeyParameters;
import org.bouncycastle.pqc.crypto.mayo.MayoPublicKeyParameters;
import org.bouncycastle.pqc.crypto.rainbow.RainbowPublicKeyParameters;
import org.bouncycastle.pqc.crypto.hqc.HQCPublicKeyParameters;
import org.bouncycastle.pqc.crypto.bike.BIKEPublicKeyParameters;
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPublicKeyParameters;
import org.bouncycastle.pqc.crypto.ntruprime.SNTRUPrimePublicKeyParameters;
import org.bouncycastle.pqc.crypto.ntruprime.NTRULPRimePublicKeyParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPublicKeyParameters;
import org.bouncycastle.pqc.crypto.falcon.FalconPublicKeyParameters;
import org.bouncycastle.pqc.crypto.ntru.NTRUPublicKeyParameters;
import org.bouncycastle.pqc.crypto.picnic.PicnicPublicKeyParameters;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.pqc.crypto.saber.SABERPublicKeyParameters;
import org.bouncycastle.pqc.crypto.frodo.FrodoPublicKeyParameters;
import org.bouncycastle.pqc.asn1.XMSSMTPublicKey;
import org.bouncycastle.pqc.asn1.XMSSMTKeyParams;
import org.bouncycastle.pqc.crypto.xmss.XMSSMTPublicKeyParameters;
import org.bouncycastle.pqc.asn1.XMSSPublicKey;
import org.bouncycastle.pqc.asn1.XMSSKeyParams;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.internal.asn1.isara.IsaraObjectIdentifiers;
import org.bouncycastle.pqc.crypto.xmss.XMSSPublicKeyParameters;
import org.bouncycastle.pqc.crypto.cmce.CMCEPublicKeyParameters;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusPublicKeyParameters;
import org.bouncycastle.pqc.crypto.slhdsa.SLHDSAPublicKeyParameters;
import org.bouncycastle.pqc.crypto.lms.HSSPublicKeyParameters;
import org.bouncycastle.util.Encodable;
import org.bouncycastle.pqc.crypto.lms.Composer;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.pqc.crypto.lms.LMSPublicKeyParameters;
import org.bouncycastle.pqc.crypto.newhope.NHPublicKeyParameters;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.pqc.asn1.SPHINCS256KeyParams;
import org.bouncycastle.pqc.asn1.PQCObjectIdentifiers;
import org.bouncycastle.pqc.crypto.sphincs.SPHINCSPublicKeyParameters;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;

public class SubjectPublicKeyInfoFactory
{
    private SubjectPublicKeyInfoFactory() {
    }
    
    public static SubjectPublicKeyInfo createSubjectPublicKeyInfo(final AsymmetricKeyParameter asymmetricKeyParameter) throws IOException {
        if (asymmetricKeyParameter instanceof SPHINCSPublicKeyParameters) {
            final SPHINCSPublicKeyParameters sphincsPublicKeyParameters = (SPHINCSPublicKeyParameters)asymmetricKeyParameter;
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.sphincs256, new SPHINCS256KeyParams(Utils.sphincs256LookupTreeAlgID(sphincsPublicKeyParameters.getTreeDigest()))), sphincsPublicKeyParameters.getKeyData());
        }
        if (asymmetricKeyParameter instanceof NHPublicKeyParameters) {
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.newHope), ((NHPublicKeyParameters)asymmetricKeyParameter).getPubData());
        }
        if (asymmetricKeyParameter instanceof LMSPublicKeyParameters) {
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig), Composer.compose().u32str(1).bytes((Encodable)asymmetricKeyParameter).build());
        }
        if (asymmetricKeyParameter instanceof HSSPublicKeyParameters) {
            final HSSPublicKeyParameters hssPublicKeyParameters = (HSSPublicKeyParameters)asymmetricKeyParameter;
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig), Composer.compose().u32str(hssPublicKeyParameters.getL()).bytes(hssPublicKeyParameters.getLMSPublicKey()).build());
        }
        if (asymmetricKeyParameter instanceof SLHDSAPublicKeyParameters) {
            final SLHDSAPublicKeyParameters slhdsaPublicKeyParameters = (SLHDSAPublicKeyParameters)asymmetricKeyParameter;
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.slhdsaOidLookup(slhdsaPublicKeyParameters.getParameters())), slhdsaPublicKeyParameters.getEncoded());
        }
        if (asymmetricKeyParameter instanceof SPHINCSPlusPublicKeyParameters) {
            final SPHINCSPlusPublicKeyParameters sphincsPlusPublicKeyParameters = (SPHINCSPlusPublicKeyParameters)asymmetricKeyParameter;
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.sphincsPlusOidLookup(sphincsPlusPublicKeyParameters.getParameters())), sphincsPlusPublicKeyParameters.getEncoded());
        }
        if (asymmetricKeyParameter instanceof CMCEPublicKeyParameters) {
            final CMCEPublicKeyParameters cmcePublicKeyParameters = (CMCEPublicKeyParameters)asymmetricKeyParameter;
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.mcElieceOidLookup(cmcePublicKeyParameters.getParameters())), cmcePublicKeyParameters.getEncoded());
        }
        if (asymmetricKeyParameter instanceof XMSSPublicKeyParameters) {
            final XMSSPublicKeyParameters xmssPublicKeyParameters = (XMSSPublicKeyParameters)asymmetricKeyParameter;
            final byte[] publicSeed = xmssPublicKeyParameters.getPublicSeed();
            final byte[] root = xmssPublicKeyParameters.getRoot();
            final byte[] encoded = xmssPublicKeyParameters.getEncoded();
            if (encoded.length > publicSeed.length + root.length) {
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(IsaraObjectIdentifiers.id_alg_xmss), new DEROctetString(encoded));
            }
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.xmss, new XMSSKeyParams(xmssPublicKeyParameters.getParameters().getHeight(), Utils.xmssLookupTreeAlgID(xmssPublicKeyParameters.getTreeDigest()))), new XMSSPublicKey(publicSeed, root));
        }
        else if (asymmetricKeyParameter instanceof XMSSMTPublicKeyParameters) {
            final XMSSMTPublicKeyParameters xmssmtPublicKeyParameters = (XMSSMTPublicKeyParameters)asymmetricKeyParameter;
            final byte[] publicSeed2 = xmssmtPublicKeyParameters.getPublicSeed();
            final byte[] root2 = xmssmtPublicKeyParameters.getRoot();
            final byte[] encoded2 = xmssmtPublicKeyParameters.getEncoded();
            if (encoded2.length > publicSeed2.length + root2.length) {
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(IsaraObjectIdentifiers.id_alg_xmssmt), new DEROctetString(encoded2));
            }
            return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.xmss_mt, new XMSSMTKeyParams(xmssmtPublicKeyParameters.getParameters().getHeight(), xmssmtPublicKeyParameters.getParameters().getLayers(), Utils.xmssLookupTreeAlgID(xmssmtPublicKeyParameters.getTreeDigest()))), new XMSSMTPublicKey(xmssmtPublicKeyParameters.getPublicSeed(), xmssmtPublicKeyParameters.getRoot()));
        }
        else {
            if (asymmetricKeyParameter instanceof FrodoPublicKeyParameters) {
                final FrodoPublicKeyParameters frodoPublicKeyParameters = (FrodoPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.frodoOidLookup(frodoPublicKeyParameters.getParameters())), new DEROctetString(frodoPublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof SABERPublicKeyParameters) {
                final SABERPublicKeyParameters saberPublicKeyParameters = (SABERPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.saberOidLookup(saberPublicKeyParameters.getParameters())), new DERSequence(new DEROctetString(saberPublicKeyParameters.getEncoded())));
            }
            if (asymmetricKeyParameter instanceof PicnicPublicKeyParameters) {
                final PicnicPublicKeyParameters picnicPublicKeyParameters = (PicnicPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.picnicOidLookup(picnicPublicKeyParameters.getParameters())), new DEROctetString(picnicPublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof NTRUPublicKeyParameters) {
                final NTRUPublicKeyParameters ntruPublicKeyParameters = (NTRUPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.ntruOidLookup(ntruPublicKeyParameters.getParameters())), ntruPublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof FalconPublicKeyParameters) {
                final FalconPublicKeyParameters falconPublicKeyParameters = (FalconPublicKeyParameters)asymmetricKeyParameter;
                final byte[] h = falconPublicKeyParameters.getH();
                final AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(Utils.falconOidLookup(falconPublicKeyParameters.getParameters()));
                final byte[] array = new byte[h.length + 1];
                array[0] = (byte)(0 + falconPublicKeyParameters.getParameters().getLogN());
                System.arraycopy(h, 0, array, 1, h.length);
                return new SubjectPublicKeyInfo(algorithmIdentifier, array);
            }
            if (asymmetricKeyParameter instanceof MLKEMPublicKeyParameters) {
                final MLKEMPublicKeyParameters mlkemPublicKeyParameters = (MLKEMPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.mlkemOidLookup(mlkemPublicKeyParameters.getParameters())), mlkemPublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof NTRULPRimePublicKeyParameters) {
                final NTRULPRimePublicKeyParameters ntrulpRimePublicKeyParameters = (NTRULPRimePublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.ntrulprimeOidLookup(ntrulpRimePublicKeyParameters.getParameters())), new DEROctetString(ntrulpRimePublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof SNTRUPrimePublicKeyParameters) {
                final SNTRUPrimePublicKeyParameters sntruPrimePublicKeyParameters = (SNTRUPrimePublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.sntruprimeOidLookup(sntruPrimePublicKeyParameters.getParameters())), new DEROctetString(sntruPrimePublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof DilithiumPublicKeyParameters) {
                final DilithiumPublicKeyParameters dilithiumPublicKeyParameters = (DilithiumPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.dilithiumOidLookup(dilithiumPublicKeyParameters.getParameters())), dilithiumPublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof MLDSAPublicKeyParameters) {
                final MLDSAPublicKeyParameters mldsaPublicKeyParameters = (MLDSAPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.mldsaOidLookup(mldsaPublicKeyParameters.getParameters())), mldsaPublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof BIKEPublicKeyParameters) {
                final BIKEPublicKeyParameters bikePublicKeyParameters = (BIKEPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.bikeOidLookup(bikePublicKeyParameters.getParameters())), bikePublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof HQCPublicKeyParameters) {
                final HQCPublicKeyParameters hqcPublicKeyParameters = (HQCPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.hqcOidLookup(hqcPublicKeyParameters.getParameters())), hqcPublicKeyParameters.getEncoded());
            }
            if (asymmetricKeyParameter instanceof RainbowPublicKeyParameters) {
                final RainbowPublicKeyParameters rainbowPublicKeyParameters = (RainbowPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.rainbowOidLookup(rainbowPublicKeyParameters.getParameters())), new DEROctetString(rainbowPublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof MayoPublicKeyParameters) {
                final MayoPublicKeyParameters mayoPublicKeyParameters = (MayoPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.mayoOidLookup(mayoPublicKeyParameters.getParameters())), new DEROctetString(mayoPublicKeyParameters.getEncoded()));
            }
            if (asymmetricKeyParameter instanceof SnovaPublicKeyParameters) {
                final SnovaPublicKeyParameters snovaPublicKeyParameters = (SnovaPublicKeyParameters)asymmetricKeyParameter;
                return new SubjectPublicKeyInfo(new AlgorithmIdentifier(Utils.snovaOidLookup(snovaPublicKeyParameters.getParameters())), new DEROctetString(snovaPublicKeyParameters.getEncoded()));
            }
            throw new IOException("key parameters not recognized");
        }
    }
}
