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

package org.bouncycastle.oer.its.template.ieee1609dot2;

import org.bouncycastle.oer.ElementSupplier;
import java.math.BigInteger;
import org.bouncycastle.asn1.DERBitString;
import org.bouncycastle.oer.its.template.etsi103097.extension.EtsiTs103097ExtensionModule;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.oer.Element;
import org.bouncycastle.oer.SwitchIndexer;
import org.bouncycastle.util.BigIntegers;
import org.bouncycastle.oer.its.template.ieee1609dot2.basetypes.Ieee1609Dot2BaseTypes;
import org.bouncycastle.oer.Switch;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.oer.OERDefinition;

public class IEEE1609dot2
{
    public static final OERDefinition.Builder Opaque;
    public static final OERDefinition.Builder PduFunctionalType;
    public static final OERDefinition.Builder HashedData;
    public static final OERDefinition.Builder MissingCrlIdentifier;
    private static final ASN1Integer etsiHeaderInfoContributorId;
    private static final ASN1Encodable[] extensionBlockSwitchKeys;
    public static final OERDefinition.Builder HeaderInfoContributorId;
    public static final Switch ContributedExtensionBlockSwitch;
    public static final OERDefinition.Builder ContributedExtensionBlock;
    public static final OERDefinition.Builder ContributedExtensionBlocks;
    public static final OERDefinition.Builder PreSharedKeyRecipientInfo;
    public static final OERDefinition.Builder EncryptedDataEncryptionKey;
    public static final OERDefinition.Builder PKRecipientInfo;
    public static final OERDefinition.Builder AesCcmCiphertext;
    public static final OERDefinition.Builder SymmetricCiphertext;
    public static final OERDefinition.Builder SymmRecipientInfo;
    public static final OERDefinition.Builder RecipientInfo;
    public static final OERDefinition.Builder SequenceOfRecipientInfo;
    public static final OERDefinition.Builder EncryptedData;
    public static final OERDefinition.Builder EndEntityType;
    public static final OERDefinition.Builder SubjectPermissions;
    public static final OERDefinition.Builder VerificationKeyIndicator;
    public static final OERDefinition.Builder PsidGroupPermissions;
    public static final OERDefinition.Builder SequenceOfPsidGroupPermissions;
    public static final OERDefinition.Builder LinkageData;
    public static final OERDefinition.Builder CertificateId;
    public static final OERDefinition.Builder ToBeSignedCertificate;
    public static final OERDefinition.Builder IssuerIdentifier;
    public static final OERDefinition.Builder CertificateType;
    private static ASN1Integer explicitOrdinal;
    private static ASN1Integer implicitOrdinal;
    public static final OERDefinition.Builder CertificateBase;
    public static final OERDefinition.Builder Certificate;
    public static final OERDefinition.Builder ExplicitCertificate;
    public static final OERDefinition.Builder ImplicitCertificate;
    public static final OERDefinition.Builder SequenceOfCertificate;
    public static final OERDefinition.Builder SignerIdentifier;
    public static final OERDefinition.Builder HeaderInfo;
    public static final OERDefinition.Builder ToBeSignedData;
    public static final OERDefinition.Builder SignedData;
    public static final OERDefinition.Builder Ieee1609Dot2Content;
    public static final OERDefinition.Builder CounterSignature;
    public static final OERDefinition.Builder Ieee1609Dot2Data;
    public static final OERDefinition.Builder SignedDataPayload;
    
    static {
        Opaque = OERDefinition.octets().typeName("Opaque");
        PduFunctionalType = OERDefinition.integer(0L, 255L).typeName("PduFunctionalType");
        HashedData = OERDefinition.choice(OERDefinition.octets(32).label("sha256HashedData"), OERDefinition.extension(OERDefinition.octets(48).label("sha384HashedData"), OERDefinition.octets(32).label("reserved"))).typeName("HashedData");
        MissingCrlIdentifier = OERDefinition.seq(Ieee1609Dot2BaseTypes.HashedId3.label("cracaId"), Ieee1609Dot2BaseTypes.CrlSeries.label("crlSeries"), OERDefinition.extension(new Object[0])).typeName("MissingCrlIdentifier");
        etsiHeaderInfoContributorId = new ASN1Integer(BigIntegers.TWO);
        extensionBlockSwitchKeys = new ASN1Encodable[] { IEEE1609dot2.etsiHeaderInfoContributorId };
        HeaderInfoContributorId = OERDefinition.integer(0L, 255L).typeName("HeaderInfoContributorId").validSwitchValue(IEEE1609dot2.etsiHeaderInfoContributorId);
        ContributedExtensionBlockSwitch = new Switch() {
            @Override
            public ASN1Encodable[] keys() {
                return IEEE1609dot2.extensionBlockSwitchKeys;
            }
            
            @Override
            public Element result(final SwitchIndexer switchIndexer) {
                final ASN1Integer instance = ASN1Integer.getInstance(switchIndexer.get(0).toASN1Primitive());
                if (instance.equals(IEEE1609dot2.etsiHeaderInfoContributorId)) {
                    return OERDefinition.seqof(EtsiTs103097ExtensionModule.EtsiOriginatingHeaderInfoExtension).rangeToMAXFrom(1L).label("extns").build();
                }
                throw new IllegalArgumentException("No forward definition for type id " + instance);
            }
        };
        ContributedExtensionBlock = OERDefinition.seq(IEEE1609dot2.HeaderInfoContributorId.label("contributorId"), OERDefinition.aSwitch(IEEE1609dot2.ContributedExtensionBlockSwitch).label("Extn")).typeName("ContributedExtensionBlock");
        ContributedExtensionBlocks = OERDefinition.seqof(IEEE1609dot2.ContributedExtensionBlock).rangeToMAXFrom(1L).typeName("ContributedExtensionBlocks");
        PreSharedKeyRecipientInfo = Ieee1609Dot2BaseTypes.HashedId8.typeName("PreSharedKeyRecipientInfo");
        EncryptedDataEncryptionKey = OERDefinition.choice(Ieee1609Dot2BaseTypes.EciesP256EncryptedKey.label("eciesNistP256"), Ieee1609Dot2BaseTypes.EciesP256EncryptedKey.label("eciesBrainpoolP256r1"), OERDefinition.extension(new Object[0])).typeName("EncryptedDataEncryptionKey");
        PKRecipientInfo = OERDefinition.seq(Ieee1609Dot2BaseTypes.HashedId8.label("recipientId"), IEEE1609dot2.EncryptedDataEncryptionKey.label("encKey")).typeName("PKRecipientInfo");
        AesCcmCiphertext = OERDefinition.seq(OERDefinition.octets(12).label("nonce"), IEEE1609dot2.Opaque.label("ccmCiphertext")).typeName("AesCcmCiphertext");
        SymmetricCiphertext = OERDefinition.choice(IEEE1609dot2.AesCcmCiphertext.label("aes128ccm"), OERDefinition.extension(new Object[0])).typeName("SymmetricCiphertext");
        SymmRecipientInfo = OERDefinition.seq(Ieee1609Dot2BaseTypes.HashedId8.label("recipientId"), IEEE1609dot2.SymmetricCiphertext.label("encKey")).typeName("SymmRecipientInfo");
        RecipientInfo = OERDefinition.choice(IEEE1609dot2.PreSharedKeyRecipientInfo.label("pskRecipInfo"), IEEE1609dot2.SymmRecipientInfo.label("symmRecipInfo"), IEEE1609dot2.PKRecipientInfo.label("certRecipInfo"), IEEE1609dot2.PKRecipientInfo.label("signedDataRecipInfo"), IEEE1609dot2.PKRecipientInfo.label("rekRecipInfo")).typeName("RecipientInfo");
        SequenceOfRecipientInfo = OERDefinition.seqof(IEEE1609dot2.RecipientInfo).typeName("SequenceOfRecipientInfo");
        EncryptedData = OERDefinition.seq(IEEE1609dot2.SequenceOfRecipientInfo.label("recipients"), IEEE1609dot2.SymmetricCiphertext.label("ciphertext")).typeName("EncryptedData");
        EndEntityType = OERDefinition.bitString(8L).defaultValue(new DERBitString(128)).typeName("EndEntityType");
        SubjectPermissions = OERDefinition.choice(Ieee1609Dot2BaseTypes.SequenceOfPsidSspRange.label("explicit"), OERDefinition.nullValue().label("all"), OERDefinition.extension(new Object[0])).typeName("SubjectPermissions");
        VerificationKeyIndicator = OERDefinition.choice(Ieee1609Dot2BaseTypes.PublicVerificationKey.label("verificationKey"), Ieee1609Dot2BaseTypes.EccP256CurvePoint.label("reconstructionValue"), OERDefinition.extension(new Object[0])).typeName("VerificationKeyIndicator");
        PsidGroupPermissions = OERDefinition.seq(IEEE1609dot2.SubjectPermissions.label("subjectPermissions"), OERDefinition.integer(1L).label("minChainLength"), OERDefinition.integer(0L).label("chainLengthRange"), IEEE1609dot2.EndEntityType.label("eeType")).typeName("PsidGroupPermissions");
        SequenceOfPsidGroupPermissions = OERDefinition.seqof(IEEE1609dot2.PsidGroupPermissions).typeName("SequenceOfPsidGroupPermissions");
        LinkageData = OERDefinition.seq(Ieee1609Dot2BaseTypes.IValue.label("iCert"), Ieee1609Dot2BaseTypes.LinkageValue.label("linkageValue"), OERDefinition.optional(Ieee1609Dot2BaseTypes.GroupLinkageValue.label("groupLinkageValue")), OERDefinition.extension(new Object[0])).typeName("LinkageData");
        CertificateId = OERDefinition.choice(IEEE1609dot2.LinkageData.label("linkageData"), Ieee1609Dot2BaseTypes.Hostname.label("name"), OERDefinition.octets(1, 64).label("binaryId"), OERDefinition.nullValue().label("none"), OERDefinition.extension(new Object[0])).typeName("CertificateId");
        ToBeSignedCertificate = OERDefinition.seq(IEEE1609dot2.CertificateId.label("id"), Ieee1609Dot2BaseTypes.HashedId3.label("cracaId"), Ieee1609Dot2BaseTypes.CrlSeries.label("crlSeries"), Ieee1609Dot2BaseTypes.ValidityPeriod.label("validityPeriod"), OERDefinition.optional(Ieee1609Dot2BaseTypes.GeographicRegion.label("region"), Ieee1609Dot2BaseTypes.SubjectAssurance.label("assuranceLevel"), Ieee1609Dot2BaseTypes.SequenceOfPsidSsp.label("appPermissions"), IEEE1609dot2.SequenceOfPsidGroupPermissions.label("certIssuePermissions"), IEEE1609dot2.SequenceOfPsidGroupPermissions.label("certRequestPermissions"), OERDefinition.nullValue().label("canRequestRollover"), Ieee1609Dot2BaseTypes.PublicEncryptionKey.label("encryptionKey")), IEEE1609dot2.VerificationKeyIndicator.label("verifyKeyIndicator"), OERDefinition.extension(new Object[0])).typeName("ToBeSignedCertificate");
        IssuerIdentifier = OERDefinition.choice(Ieee1609Dot2BaseTypes.HashedId8.label("sha256AndDigest"), Ieee1609Dot2BaseTypes.HashAlgorithm.label("self"), OERDefinition.extension(Ieee1609Dot2BaseTypes.HashedId8.label("sha384AndDigest"))).typeName("IssuerIdentifier");
        CertificateType = OERDefinition.enumeration(OERDefinition.enumItem("explicit"), OERDefinition.enumItem("implicit"), OERDefinition.extension(new Object[0])).typeName("CertificateType");
        IEEE1609dot2.explicitOrdinal = new ASN1Integer(BigInteger.ZERO);
        IEEE1609dot2.implicitOrdinal = new ASN1Integer(BigInteger.ONE);
        CertificateBase = OERDefinition.seq(Ieee1609Dot2BaseTypes.UINT8.label("version"), IEEE1609dot2.CertificateType.label("type"), IEEE1609dot2.IssuerIdentifier.label("issuer"), IEEE1609dot2.ToBeSignedCertificate.label("toBeSigned"), OERDefinition.optional(Ieee1609Dot2BaseTypes.Signature.label("signature"))).label("signature").typeName("CertificateBase");
        Certificate = IEEE1609dot2.CertificateBase.copy().typeName("Certificate");
        ExplicitCertificate = IEEE1609dot2.CertificateBase.typeName("ExplicitCertificate").replaceChild(1, IEEE1609dot2.CertificateType.validSwitchValue(IEEE1609dot2.explicitOrdinal).label("type"));
        ImplicitCertificate = IEEE1609dot2.CertificateBase.typeName("ImplicitCertificate").replaceChild(1, IEEE1609dot2.CertificateType.validSwitchValue(IEEE1609dot2.implicitOrdinal).label("type"));
        SequenceOfCertificate = OERDefinition.seqof(IEEE1609dot2.Certificate).typeName("SequenceOfCertificate");
        SignerIdentifier = OERDefinition.choice(Ieee1609Dot2BaseTypes.HashedId8.label("digest"), IEEE1609dot2.SequenceOfCertificate.label("certificate"), OERDefinition.nullValue().label("self"), OERDefinition.extension(new Object[0])).typeName("SignerIdentifier");
        HeaderInfo = OERDefinition.seq(Ieee1609Dot2BaseTypes.Psid.label("psid"), OERDefinition.optional(Ieee1609Dot2BaseTypes.Time64.label("generationTime"), Ieee1609Dot2BaseTypes.Time64.label("expiryTime"), Ieee1609Dot2BaseTypes.ThreeDLocation.label("generationLocation"), Ieee1609Dot2BaseTypes.HashedId3.label("p2pcdLearningRequest"), IEEE1609dot2.MissingCrlIdentifier.label("missingCrlIdentifier"), Ieee1609Dot2BaseTypes.EncryptionKey.label("encryptionKey")), OERDefinition.extension(OERDefinition.optional(Ieee1609Dot2BaseTypes.SequenceOfHashedId3.label("inlineP2pcdRequest"), IEEE1609dot2.Certificate.label("requestedCertificate"), IEEE1609dot2.PduFunctionalType.label("pduFunctionalType"), IEEE1609dot2.ContributedExtensionBlocks.label("contributedExtensions")))).typeName("HeaderInfo");
        SignedData = OERDefinition.seq(Ieee1609Dot2BaseTypes.HashAlgorithm.label("hashId"), OERDefinition.deferred(new ElementSupplier() {
            private Element built;
            
            @Override
            public Element build() {
                synchronized (this) {
                    if (this.built == null) {
                        this.built = IEEE1609dot2.ToBeSignedData.label("tbsData").build();
                    }
                    return this.built;
                }
            }
        }).label("tbsData"), IEEE1609dot2.SignerIdentifier.label("signer"), Ieee1609Dot2BaseTypes.Signature.label("signature")).typeName("SignedData");
        Ieee1609Dot2Content = OERDefinition.choice(IEEE1609dot2.Opaque.label("unsecuredData"), OERDefinition.deferred(new ElementSupplier() {
            private Element built;
            
            @Override
            public Element build() {
                synchronized (this) {
                    if (this.built == null) {
                        this.built = IEEE1609dot2.SignedData.label("signedData").mayRecurse(true).build();
                    }
                    return this.built;
                }
            }
        }).label("signedData").mayRecurse(true), IEEE1609dot2.EncryptedData.label("encryptedData"), IEEE1609dot2.Opaque.label("signedCertificateRequest"), OERDefinition.extension(new Object[0])).typeName("Ieee1609Dot2Content");
        CounterSignature = OERDefinition.seq(Ieee1609Dot2BaseTypes.UINT8.label("protocolVersion"), IEEE1609dot2.Ieee1609Dot2Content.label("content")).typeName("CounterSignature");
        Ieee1609Dot2Data = OERDefinition.seq(Ieee1609Dot2BaseTypes.UINT8.validSwitchValue(new ASN1Integer(3L)).label("protocolVersion"), IEEE1609dot2.Ieee1609Dot2Content.label("content")).typeName("Ieee1609Dot2Data");
        SignedDataPayload = OERDefinition.seq(OERDefinition.optional(IEEE1609dot2.Ieee1609Dot2Data.label("data"), IEEE1609dot2.HashedData.label("extDataHash")), OERDefinition.extension(new Object[0])).typeName("SignedDataPayload");
        ToBeSignedData = OERDefinition.seq(IEEE1609dot2.SignedDataPayload.label("payload"), IEEE1609dot2.HeaderInfo.label("headerInfo")).typeName("ToBeSignedData");
    }
}
