All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bouncycastle.oer.its.template.ieee1609dot2.IEEE1609dot2 Maven / Gradle / Ivy

Go to download

The Bouncy Castle Java APIs for ASN.1 extension and utility APIs used to support bcpkix and bctls. This jar contains APIs for Java 8 and later.

There is a newer version: 2.73.6
Show newest version
package org.bouncycastle.oer.its.template.ieee1609dot2;

import java.math.BigInteger;

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

/**
 * OER forward definition builders for OER encoded data.
 */
public class IEEE1609dot2
{

    public static final OERDefinition.Builder Opaque = OERDefinition.octets().typeName("Opaque");


    /**
     * PduFunctionalType ::= INTEGER (0..255)
     * tlsHandshake          PduFunctionalType ::= 1
     * iso21177ExtendedAuth  PduFunctionalType ::= 2
     */
    public static final OERDefinition.Builder PduFunctionalType = OERDefinition.integer(0, 255).typeName("PduFunctionalType");


    /**
     * HashedData::= CHOICE {
     * sha256HashedData  OCTET STRING (SIZE(32)),
     * ...,
     * sha384HashedData  OCTET STRING (SIZE(48)),
     * reserved          OCTET STRING (SIZE(32))
     * }
     */
    public static final OERDefinition.Builder HashedData = OERDefinition.choice(
        OERDefinition.octets(32).label("sha256HashedData"),
        OERDefinition.extension(
            OERDefinition.octets(48).label("sha384HashedData"),
            OERDefinition.octets(32).label("reserved")
        )
    ).typeName("HashedData");

    /**
     * MissingCrlIdentifier ::= SEQUENCE {
     * cracaId    HashedId3,
     * crlSeries  CrlSeries,
     * ...
     * }
     */
    public static final OERDefinition.Builder MissingCrlIdentifier = OERDefinition.seq(
        Ieee1609Dot2BaseTypes.HashedId3.label("cracaId"),
        Ieee1609Dot2BaseTypes.CrlSeries.label("crlSeries"),
        OERDefinition.extension()
    ).typeName("MissingCrlIdentifier");


    /**
     * etsiHeaderInfoContributorId         HeaderInfoContributorId ::= 2
     */
    private static final ASN1Integer etsiHeaderInfoContributorId = new ASN1Integer(BigIntegers.TWO);
    private static final ASN1Encodable[] extensionBlockSwitchKeys = new ASN1Encodable[]{etsiHeaderInfoContributorId};

    /**
     * HeaderInfoContributorId ::= INTEGER (0..255)
     * etsiHeaderInfoContributorId         HeaderInfoContributorId ::= 2
     */

    public static final OERDefinition.Builder HeaderInfoContributorId = OERDefinition.integer(0, 255)
        .typeName("HeaderInfoContributorId").validSwitchValue(etsiHeaderInfoContributorId);


    /**
     * Switch for ContributedExtensionBlock
     */
    public static final Switch ContributedExtensionBlockSwitch = new Switch()
    {

        public ASN1Encodable[] keys()
        {
            return extensionBlockSwitchKeys;
        }

        public Element result(SwitchIndexer indexer)
        {
            ASN1Integer type = ASN1Integer.getInstance(indexer.get(0).toASN1Primitive());

            if (type.equals(etsiHeaderInfoContributorId))
            {
                return OERDefinition.seqof(EtsiTs103097ExtensionModule.EtsiOriginatingHeaderInfoExtension).rangeToMAXFrom(1).label("extns").build();
            }

            //
            // We got here because the header extension value is unknown.
            //
            throw new IllegalArgumentException("No forward definition for type id " + type);
        }

    };

    /**
     * IEEE1609DOT2-HEADERINFO-CONTRIBUTED-EXTENSION ::= CLASS {
     * &id    HeaderInfoContributorId UNIQUE,
     * &Extn
     * } WITH SYNTAX {&Extn IDENTIFIED BY &id}
     * 

* ContributedExtensionBlock ::= SEQUENCE { * contributorId IEEE1609DOT2-HEADERINFO-CONTRIBUTED-EXTENSION. * &id({Ieee1609Dot2HeaderInfoContributedExtensions}), * extns SEQUENCE (SIZE(1..MAX)) OF IEEE1609DOT2-HEADERINFO-CONTRIBUTED-EXTENSION. * &Extn({Ieee1609Dot2HeaderInfoContributedExtensions}{@.contributorId}) * } */ public static final OERDefinition.Builder ContributedExtensionBlock = OERDefinition.seq( HeaderInfoContributorId.label("contributorId"), OERDefinition.aSwitch(ContributedExtensionBlockSwitch).label("Extn") ).typeName("ContributedExtensionBlock"); /** * ContributedExtensionBlocks ::= SEQUENCE (SIZE(1..MAX)) OF ContributedExtensionBlock */ public static final OERDefinition.Builder ContributedExtensionBlocks = OERDefinition.seqof(ContributedExtensionBlock).rangeToMAXFrom(1).typeName("ContributedExtensionBlocks"); /** * PreSharedKeyRecipientInfo ::= HashedId8 */ public static final OERDefinition.Builder PreSharedKeyRecipientInfo = Ieee1609Dot2BaseTypes.HashedId8.typeName("PreSharedKeyRecipientInfo"); /** * EncryptedDataEncryptionKey ::= CHOICE { * eciesNistP256 EciesP256EncryptedKey, * eciesBrainpoolP256r1 EciesP256EncryptedKey, * ... * } */ public static final OERDefinition.Builder EncryptedDataEncryptionKey = OERDefinition.choice( Ieee1609Dot2BaseTypes.EciesP256EncryptedKey.label("eciesNistP256"), Ieee1609Dot2BaseTypes.EciesP256EncryptedKey.label("eciesBrainpoolP256r1"), OERDefinition.extension() ).typeName("EncryptedDataEncryptionKey"); /** * PKRecipientInfo ::= SEQUENCE { * recipientId HashedId8, * encKey EncryptedDataEncryptionKey * } */ public static final OERDefinition.Builder PKRecipientInfo = OERDefinition.seq( Ieee1609Dot2BaseTypes.HashedId8.label("recipientId"), EncryptedDataEncryptionKey.label("encKey") ).typeName("PKRecipientInfo"); /** * AesCcmCiphertext ::= SEQUENCE { * nonce OCTET STRING (SIZE (12)), * ccmCiphertext Opaque * } */ public static final OERDefinition.Builder AesCcmCiphertext = OERDefinition.seq( OERDefinition.octets(12).label("nonce"), Opaque.label("ccmCiphertext") ).typeName("AesCcmCiphertext"); /** * SymmetricCiphertext ::= CHOICE { * aes128ccm AesCcmCiphertext, * ... * } */ public static final OERDefinition.Builder SymmetricCiphertext = OERDefinition.choice( AesCcmCiphertext.label("aes128ccm"), OERDefinition.extension() ).typeName("SymmetricCiphertext"); /** * SymmRecipientInfo ::= SEQUENCE { * recipientId HashedId8, * encKey SymmetricCiphertext * } */ public static final OERDefinition.Builder SymmRecipientInfo = OERDefinition.seq( Ieee1609Dot2BaseTypes.HashedId8.label("recipientId"), SymmetricCiphertext.label("encKey") ).typeName("SymmRecipientInfo"); /** * RecipientInfo ::= CHOICE { * pskRecipInfo PreSharedKeyRecipientInfo, * symmRecipInfo SymmRecipientInfo, * certRecipInfo PKRecipientInfo, * signedDataRecipInfo PKRecipientInfo, * rekRecipInfo PKRecipientInfo * } */ public static final OERDefinition.Builder RecipientInfo = OERDefinition.choice( PreSharedKeyRecipientInfo.label("pskRecipInfo"), SymmRecipientInfo.label("symmRecipInfo"), PKRecipientInfo.label("certRecipInfo"), PKRecipientInfo.label("signedDataRecipInfo"), PKRecipientInfo.label("rekRecipInfo") ).typeName("RecipientInfo"); /** * SequenceOfRecipientInfo ::= SEQUENCE OF RecipientInfo */ public static final OERDefinition.Builder SequenceOfRecipientInfo = OERDefinition.seqof( RecipientInfo ).typeName("SequenceOfRecipientInfo"); /** * EncryptedData ::= SEQUENCE { * recipients SequenceOfRecipientInfo, * ciphertext SymmetricCiphertext * } */ public static final OERDefinition.Builder EncryptedData = OERDefinition.seq( SequenceOfRecipientInfo.label("recipients"), SymmetricCiphertext.label("ciphertext") ).typeName("EncryptedData"); /** * Countersignature ::= Ieee1609Dot2Data (WITH COMPONENTS {..., * content (WITH COMPONENTS {..., * signedData (WITH COMPONENTS {..., * tbsData (WITH COMPONENTS {..., * payload (WITH COMPONENTS {..., * data ABSENT, * extDataHash PRESENT * }), * headerInfo(WITH COMPONENTS {..., * generationTime PRESENT, * expiryTime ABSENT, * generationLocation ABSENT, * p2pcdLearningRequest ABSENT, * missingCrlIdentifier ABSENT, * encryptionKey ABSENT * }) * }) * }) * }) * }) */ /** * EndEntityType ::= BIT STRING {app (0), enrol (1) } (SIZE (8)) */ public static final OERDefinition.Builder EndEntityType = OERDefinition.bitString(8).defaultValue(new DERBitString(new byte[]{0}, 0)) .typeName("EndEntityType"); /** * SubjectPermissions ::= CHOICE { * explicit SequenceOfPsidSspRange, * all NULL, * ... * } */ public static final OERDefinition.Builder SubjectPermissions = OERDefinition.choice( Ieee1609Dot2BaseTypes.SequenceOfPsidSspRange.label("explicit"), OERDefinition.nullValue().label("all"), OERDefinition.extension() ).typeName("SubjectPermissions"); /** * VerificationKeyIndicator ::= CHOICE { * verificationKey PublicVerificationKey, * reconstructionValue EccP256CurvePoint, * ... * } */ public static final OERDefinition.Builder VerificationKeyIndicator = OERDefinition.choice( Ieee1609Dot2BaseTypes.PublicVerificationKey.label("verificationKey"), Ieee1609Dot2BaseTypes.EccP256CurvePoint.label("reconstructionValue"), OERDefinition.extension() ).typeName("VerificationKeyIndicator"); /** * PsidGroupPermissions ::= SEQUENCE { * subjectPermissions SubjectPermissions, * minChainLength INTEGER DEFAULT 1, * chainLengthRange INTEGER DEFAULT 0, * eeType EndEntityType DEFAULT '00'H * } */ public static final OERDefinition.Builder PsidGroupPermissions = OERDefinition.seq( SubjectPermissions.label("subjectPermissions"), OERDefinition.integer(1).label("minChainLength"), OERDefinition.integer(0).label("chainLengthRange"), EndEntityType.label("eeType") ).typeName("PsidGroupPermissions"); /** * SequenceOfPsidGroupPermissions ::= SEQUENCE OF PsidGroupPermissions */ public static final OERDefinition.Builder SequenceOfPsidGroupPermissions = OERDefinition.seqof(PsidGroupPermissions).typeName("SequenceOfPsidGroupPermissions"); /** * LinkageData ::= SEQUENCE { * iCert IValue, * linkage-value LinkageValue, * group-linkage-value GroupLinkageValue OPTIONAL * } */ public static final OERDefinition.Builder LinkageData = OERDefinition.seq( Ieee1609Dot2BaseTypes.IValue.label("iCert"), Ieee1609Dot2BaseTypes.LinkageValue.label("linkageValue"), OERDefinition.optional(Ieee1609Dot2BaseTypes.GroupLinkageValue.label("groupLinkageValue")), OERDefinition.extension() ).typeName("LinkageData"); /** * CertificateId ::= CHOICE { * linkageData LinkageData, * name Hostname, * binaryId OCTET STRING(SIZE(1..64)), * none NULL, * ... * } */ public static final OERDefinition.Builder CertificateId = OERDefinition.choice( LinkageData.label("linkageData"), Ieee1609Dot2BaseTypes.Hostname.label("name"), OERDefinition.octets(1, 64).label("binaryId"), OERDefinition.nullValue().label("none"), OERDefinition.extension() ).typeName("CertificateId"); /** * ToBeSignedCertificate ::= SEQUENCE { * id CertificateId, * cracaId HashedId3, * crlSeries CrlSeries, * validityPeriod ValidityPeriod, * region GeographicRegion OPTIONAL, * assuranceLevel SubjectAssurance OPTIONAL, * appPermissions SequenceOfPsidSsp OPTIONAL, * certIssuePermissions SequenceOfPsidGroupPermissions OPTIONAL, * certRequestPermissions SequenceOfPsidGroupPermissions OPTIONAL, * canRequestRollover NULL OPTIONAL, * encryptionKey PublicEncryptionKey OPTIONAL, * verifyKeyIndicator VerificationKeyIndicator, * ... * } * (WITH COMPONENTS { ..., appPermissions PRESENT} | * WITH COMPONENTS { ..., certIssuePermissions PRESENT} | * WITH COMPONENTS { ..., certRequestPermissions PRESENT}) */ public static final OERDefinition.Builder ToBeSignedCertificate = OERDefinition.seq( 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"), SequenceOfPsidGroupPermissions.label("certIssuePermissions"), SequenceOfPsidGroupPermissions.label("certRequestPermissions"), OERDefinition.nullValue().label("canRequestRollover"), Ieee1609Dot2BaseTypes.PublicEncryptionKey.label("encryptionKey")), VerificationKeyIndicator.label("verifyKeyIndicator"), OERDefinition.extension() ).typeName("ToBeSignedCertificate"); /** * IssuerIdentifier ::= CHOICE { * sha256AndDigest HashedId8, * self HashAlgorithm, * ..., * sha384AndDigest HashedId8 * } */ public static final OERDefinition.Builder IssuerIdentifier = OERDefinition.choice( Ieee1609Dot2BaseTypes.HashedId8.label("sha256AndDigest"), Ieee1609Dot2BaseTypes.HashAlgorithm.label("self"), OERDefinition.extension( Ieee1609Dot2BaseTypes.HashedId8.label("sha384AndDigest")) ).typeName("IssuerIdentifier"); /** * CertificateType ::= ENUMERATED { * explicit, * implicit, * ... * } */ public static final OERDefinition.Builder CertificateType = OERDefinition.enumeration( OERDefinition.enumItem("explicit"), OERDefinition.enumItem("implicit"), OERDefinition.extension()) .typeName("CertificateType"); private static ASN1Integer explicitOrdinal = new ASN1Integer(BigInteger.ZERO); private static ASN1Integer implicitOrdinal = new ASN1Integer(BigInteger.ONE); /** * CertificateBase represents both of these, but with different values * depending on the type. *

* ExplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., * type(explicit), * toBeSigned(WITH COMPONENTS {..., * verifyKeyIndicator(WITH COMPONENTS {verificationKey}) * }), * signature PRESENT * }) *

* ImplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., * type(implicit), * toBeSigned(WITH COMPONENTS {..., * verifyKeyIndicator(WITH COMPONENTS {reconstructionValue}) * }), * signature ABSENT * }) *

*

*

* CertificateBase ::= SEQUENCE { * version Uint8(3), * type CertificateType, * issuer IssuerIdentifier, * toBeSigned ToBeSignedCertificate, * signature Signature OPTIONAL * } */ public static final OERDefinition.Builder CertificateBase = OERDefinition.seq( Ieee1609Dot2BaseTypes.UINT8.label("version"), CertificateType.label("type"), IssuerIdentifier.label("issuer"), ToBeSignedCertificate.label("toBeSigned"), OERDefinition.optional(Ieee1609Dot2BaseTypes.Signature.label("signature"))).label("signature") .typeName("CertificateBase"); /** * Certificate ::= CertificateBase (ImplicitCertificate | ExplicitCertificate) */ public static final OERDefinition.Builder Certificate = CertificateBase.copy().typeName("Certificate"); /** * ExplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., * type(explicit), * toBeSigned(WITH COMPONENTS {..., * verifyKeyIndicator(WITH COMPONENTS {verificationKey}) * }), * signature PRESENT * }) */ public static final OERDefinition.Builder ExplicitCertificate = CertificateBase.typeName("ExplicitCertificate") .replaceChild(1, CertificateType.validSwitchValue(explicitOrdinal).label("type")); /** * ImplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., * type(implicit), * toBeSigned(WITH COMPONENTS {..., * verifyKeyIndicator(WITH COMPONENTS {reconstructionValue}) * }), * signature ABSENT * }) */ public static final OERDefinition.Builder ImplicitCertificate = CertificateBase.typeName("ImplicitCertificate") .replaceChild(1, CertificateType.validSwitchValue(implicitOrdinal).label("type")); /** * SequenceOfCertificate ::= SEQUENCE OF Certificate */ public static final OERDefinition.Builder SequenceOfCertificate = OERDefinition.seqof(Certificate).typeName("SequenceOfCertificate"); /** * SignerIdentifier ::= CHOICE { * digest HashedId8, * certificate SequenceOfCertificate, * self NULL, * ... * } */ public static final OERDefinition.Builder SignerIdentifier = OERDefinition.choice( Ieee1609Dot2BaseTypes.HashedId8.label("digest"), SequenceOfCertificate.label("certificate"), OERDefinition.nullValue().label("self"), OERDefinition.extension() ).typeName("SignerIdentifier"); /** * HeaderInfo ::= SEQUENCE { * psid Psid, * generationTime Time64 OPTIONAL, * expiryTime Time64 OPTIONAL, * generationLocation ThreeDLocation OPTIONAL, * p2pcdLearningRequest HashedId3 OPTIONAL, * missingCrlIdentifier MissingCrlIdentifier OPTIONAL, * encryptionKey EncryptionKey OPTIONAL, * ..., * inlineP2pcdRequest SequenceOfHashedId3 OPTIONAL, * requestedCertificate Certificate OPTIONAL, * pduFunctionalType PduFunctionalType OPTIONAL, * contributedExtensions ContributedExtensionBlocks OPTIONAL * } */ public static final OERDefinition.Builder 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"), MissingCrlIdentifier.label("missingCrlIdentifier"), Ieee1609Dot2BaseTypes.EncryptionKey.label("encryptionKey") ), OERDefinition.extension( OERDefinition.optional( Ieee1609Dot2BaseTypes.SequenceOfHashedId3.label("inlineP2pcdRequest"), Certificate.label("requestedCertificate"), PduFunctionalType.label("pduFunctionalType"), ContributedExtensionBlocks.label("contributedExtensions") ) ) ).typeName("HeaderInfo"); /** * ToBeSignedData ::= SEQUENCE { * payload SignedDataPayload, * headerInfo HeaderInfo * } * Defined in static initializer. */ public static final OERDefinition.Builder ToBeSignedData; /** * SignedData ::= SEQUENCE { * hashId HashAlgorithm, * tbsData ToBeSignedData, * signer SignerIdentifier, * signature Signature * } */ public static final OERDefinition.Builder SignedData = OERDefinition.seq( Ieee1609Dot2BaseTypes.HashAlgorithm.label("hashId"), OERDefinition.deferred(new ElementSupplier() { private Element built; public Element build() { synchronized (this) { if (built == null) { built = ToBeSignedData.label("tbsData").build(); } return built; } } }).label("tbsData"), SignerIdentifier.label("signer"), Ieee1609Dot2BaseTypes.Signature.label("signature") ).typeName("SignedData"); /** * Ieee1609Dot2Content ::= CHOICE { * unsecuredData Opaque, * signedData SignedData, * encryptedData EncryptedData, * signedCertificateRequest Opaque, * ... * } */ public static final OERDefinition.Builder Ieee1609Dot2Content = OERDefinition.choice( Opaque.label("unsecuredData"), OERDefinition.deferred(new ElementSupplier() { private Element built; public Element build() { synchronized (this) { if (built == null) { built = SignedData.label("signedData").mayRecurse(true).build(); } return built; } } // new DeferredElementSupplier(SignedData.label("signedData") }).label("signedData").mayRecurse(true), EncryptedData.label("encryptedData"), Opaque.label("signedCertificateRequest"), OERDefinition.extension()).typeName("Ieee1609Dot2Content"); public static final OERDefinition.Builder CounterSignature = OERDefinition.seq( Ieee1609Dot2BaseTypes.UINT8.label("protocolVersion"), Ieee1609Dot2Content.label("content") ).typeName("CounterSignature"); /** * Ieee1609Dot2Data ::= SEQUENCE { * protocolVersion Uint8(3), * content Ieee1609Dot2Content * } */ public static final OERDefinition.Builder Ieee1609Dot2Data = OERDefinition.seq( Ieee1609Dot2BaseTypes.UINT8.validSwitchValue(new ASN1Integer(3)).label("protocolVersion"), Ieee1609Dot2Content.label("content")).typeName("Ieee1609Dot2Data"); /** * SignedDataPayload ::= SEQUENCE { * data Ieee1609Dot2Data OPTIONAL, * extDataHash HashedData OPTIONAL, * ... * } (WITH COMPONENTS {..., data PRESENT} | * WITH COMPONENTS {..., extDataHash PRESENT}) */ public static final OERDefinition.Builder SignedDataPayload = OERDefinition.seq( OERDefinition.optional( Ieee1609Dot2Data.label("data"), HashedData.label("extDataHash")), OERDefinition.extension() ).typeName("SignedDataPayload"); static { /* * ToBeSignedData ::= SEQUENCE { * payload SignedDataPayload, * headerInfo HeaderInfo * } */ ToBeSignedData = OERDefinition.seq( SignedDataPayload.label("payload"), HeaderInfo.label("headerInfo") ).typeName("ToBeSignedData"); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy