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 with the BC FIPS provider. The APIs may also be used with other providers although if being used in a FIPS context it is the responsibility of the user to ensure that any other providers used are FIPS certified and used appropriately.

There is a newer version: 2.0.3
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