diff --git a/core/Integer.cc b/core/Integer.cc index 88509c137bb7ef9ae12aed560bb9a9aef925502a..360880bb20014acc89b2716ac6546899788a607d 100644 --- a/core/Integer.cc +++ b/core/Integer.cc @@ -1836,6 +1836,7 @@ int INTEGER::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) c unsigned char* bn_as_bin = (unsigned char*) Malloc(num_bytes); BN_bn2bin(D, bn_as_bin); + boolean pad = FALSE; if (BN_is_negative(D)) { for(size_t i = 0; i < num_bytes; ++i){ bn_as_bin[i] = ~bn_as_bin[i]; @@ -1854,15 +1855,25 @@ int INTEGER::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) c } } } + + pad = p_td.oer->signed_ && (!(bn_as_bin[0] & 0x80)); + } else { + pad = p_td.oer->signed_ && (bn_as_bin[0] & 0x80); } if (p_td.oer->bytes == -1) { - encode_oer_length(num_bytes, p_buf, FALSE); + if (pad) { + char pad_ch = BN_is_negative(D) ? 0xFF : 0; + encode_oer_length(num_bytes + 1, p_buf, FALSE); + p_buf.put_c(pad_ch); + } else { + encode_oer_length(num_bytes, p_buf, FALSE); + } } else { int rem_bytes = p_td.oer->bytes - num_bytes; - char pad = BN_is_negative(D) ? 0xFF : 0; + char pad_ch = BN_is_negative(D) ? 0xFF : 0; for (int i = 0; i < rem_bytes; i++) { - p_buf.put_c(pad); + p_buf.put_c(pad_ch); } } p_buf.put_s(num_bytes, bn_as_bin); @@ -1884,7 +1895,7 @@ int INTEGER::OER_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, O } const unsigned char* const ucstr = p_buf.get_read_data(); if ((num_bytes > sizeof(RInt)) || (num_bytes >= 4 && p_td.oer->signed_ == FALSE)) { // Bignum - const boolean negative = ucstr[0] & 0x80 && (p_td.oer->signed_ == TRUE || p_td.oer->bytes == -1); + const boolean negative = ucstr[0] & 0x80 && p_td.oer->signed_ == TRUE; BIGNUM *D = BN_new(); if (negative) { unsigned char* const tmp = (unsigned char*) Malloc(num_bytes); diff --git a/function_test/OER_EncDec/EtsiTs103097Module.asn b/function_test/OER_EncDec/EtsiTs103097Module.asn new file mode 100644 index 0000000000000000000000000000000000000000..d2d8d5879875de99c7d89ba2440e0cbbab324b67 --- /dev/null +++ b/function_test/OER_EncDec/EtsiTs103097Module.asn @@ -0,0 +1,102 @@ +EtsiTs103097Module +{ itu-t(0) identified-organization(4) etsi(0) itsDomain(5) wg5(5) ts(103097) v1(0) } + +DEFINITIONS AUTOMATIC TAGS ::= BEGIN + +IMPORTS + +Ieee1609Dot2Data, ExplicitCertificate + +FROM + +IEEE1609dot2 {iso(1) identified-organization(3) ieee(111) +standards-association-numbered-series-standards(2) wave-stds(1609) +dot2(2) base (1) schema (1) major-version-2(2)}; + +EtsiTs103097Certificate::= ExplicitCertificate (WITH COMPONENTS{..., + toBeSigned (WITH COMPONENTS{..., + id (WITH COMPONENTS{..., + linkageData ABSENT, + binaryId ABSENT + }), + certRequestPermissions ABSENT, + canRequestRollover ABSENT + }) +}) + +SingleEtsiTs103097Certificate ::= SEQUENCE { + only EtsiTs103097Certificate +} + +EtsiTs103097Data::=Ieee1609Dot2Data (WITH COMPONENTS {..., + content (WITH COMPONENTS {..., -- 'Ieee1609Dot2Content' + signedData (WITH COMPONENTS {..., -- constraints on signed data headers 'SignedData' + tbsData (WITH COMPONENTS { -- 'ToBeSignedData' + headerInfo (WITH COMPONENTS {..., -- 'HeaderInfo' + generationTime PRESENT, + p2pcdLearningRequest ABSENT, + missingCrlIdentifier ABSENT + }) + }), + signer (WITH COMPONENTS {..., --constraints on the certificate +-- certificate (WITH COMPONENT (SingleEtsiTs103097Certificate)) + certificate (WITH COMPONENT (EtsiTs103097Certificate)) + }) + }), + encryptedData (WITH COMPONENTS {..., -- constraints on encrypted data headers + recipients (WITH COMPONENT ( + (WITH COMPONENTS {..., + symmRecipInfo ABSENT, + rekRecipInfo ABSENT + }) + )) + }), + signedCertificateRequest ABSENT + }) +}) + +EtsiTs103097Data-Signed {ToBeSignedDataContent} ::= EtsiTs103097Data (WITH COMPONENTS {..., + content (WITH COMPONENTS { + signedData (WITH COMPONENTS {..., + tbsData (WITH COMPONENTS { + payload (WITH COMPONENTS { + data (WITH COMPONENTS {..., + content (WITH COMPONENTS { + unsecuredData (CONTAINING ToBeSignedDataContent) + }) + }) PRESENT + }) + }) + }) + }) +}) + +EtsiTs103097Data-SignedExternalPayload ::= EtsiTs103097Data (WITH COMPONENTS {..., + content (WITH COMPONENTS { + signedData (WITH COMPONENTS {..., + tbsData (WITH COMPONENTS { + payload (WITH COMPONENTS { + extDataHash (WITH COMPONENTS { + sha256HashedData PRESENT + }) PRESENT + }) + }) + }) + }) +}) + +EtsiTs103097Data-Encrypted {ToBeEncryptedDataContent} ::= EtsiTs103097Data (WITH COMPONENTS {..., + content (WITH COMPONENTS { + encryptedData (WITH COMPONENTS {..., + ciphertext (WITH COMPONENTS {..., + aes128ccm (WITH COMPONENTS {..., + ccmCiphertext (CONSTRAINED BY {-- ccm encryption of -- ToBeEncryptedDataContent}) + }) + }) + }) + }) +}) + +EtsiTs103097Data-SignedAndEncrypted {ToBesignedAndEncryptedDataContent} ::= EtsiTs103097DataEncrypted {EtsiTs103097Data-Signed {ToBesignedAndEncryptedDataContent}} + +END diff --git a/function_test/OER_EncDec/IEEE1609dot2.asn b/function_test/OER_EncDec/IEEE1609dot2.asn new file mode 100644 index 0000000000000000000000000000000000000000..f1cf301bcc1428a3d36e3562afc788fc2318001b --- /dev/null +++ b/function_test/OER_EncDec/IEEE1609dot2.asn @@ -0,0 +1,313 @@ +IEEE1609dot2 {iso(1) identified-organization(3) ieee(111) +standards-association-numbered-series-standards(2) wave-stds(1609) +dot2(2) base(1) schema(1) major-version-2(2)} + +-- Minor version: 1 + +--****************************************************************************** +-- +-- IEEE P1609.2 Data Types +-- +--****************************************************************************** + +DEFINITIONS AUTOMATIC TAGS ::= BEGIN + +EXPORTS ALL; + +IMPORTS + CrlSeries, + EccP256CurvePoint, + EciesP256EncryptedKey, + EncryptionKey, + GeographicRegion, + GroupLinkageValue, + HashAlgorithm, + HashedId3, + HashedId8, + Hostname, + IValue, + LinkageValue, + Opaque, + Psid, + PsidSsp, + PsidSspRange, + PublicEncryptionKey, + PublicVerificationKey, + SequenceOfHashedId3, + SequenceOfPsidSsp, + SequenceOfPsidSspRange, + ServiceSpecificPermissions, + Signature, + SubjectAssurance, + SymmetricEncryptionKey, + ThreeDLocation, + Time64, + Uint3, + Uint8, + Uint16, + Uint32, + ValidityPeriod +FROM IEEE1609dot2BaseTypes {iso(1) identified-organization(3) ieee(111) + standards-association-numbered-series-standards(2) wave-stds(1609) + dot2(2) base(1) base-types(2) major-version-2 (2)} + +; + +-- +--********************************************************************* +-- +-- Structures for describing secured data +-- +--********************************************************************* + +-- Necessary to get certain tools to generate sample PDUs +-- TestIeee1609Dot2Data ::= Ieee1609Dot2Data +-- TestCertificate ::= Certificate + +-- this structure belongs later in the file but putting it here avoids +-- compiler errors with certain tools +SignedDataPayload ::= SEQUENCE { + data Ieee1609Dot2Data OPTIONAL, + extDataHash HashedData OPTIONAL, + ... +} + (WITH COMPONENTS {..., data PRESENT} | + WITH COMPONENTS {..., extDataHash PRESENT}) + +Ieee1609Dot2Data ::= SEQUENCE { + protocolVersion Uint8(3), + content Ieee1609Dot2Content +} + +Ieee1609Dot2Content ::= CHOICE { + unsecuredData Opaque, + signedData SignedData, + encryptedData EncryptedData, + signedCertificateRequest Opaque, + ... +} + +SignedData ::= SEQUENCE { + hashId HashAlgorithm, + tbsData ToBeSignedData, + signer SignerIdentifier, + signature Signature +} + +SignerIdentifier ::= CHOICE { + digest HashedId8, + certificate SequenceOfCertificate, + self NULL, + ... +} + +ToBeSignedData ::= SEQUENCE { + payload SignedDataPayload, + headerInfo HeaderInfo +} + +HashedData::= CHOICE { + sha256HashedData OCTET STRING (SIZE(32)), + ... +} + +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 +} + +MissingCrlIdentifier ::= SEQUENCE { + cracaId HashedId3, + crlSeries CrlSeries, + ... +} + +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 + }) + }) + }) + }) +}) + +--********************************************************************** +-- +-- Structures for describing encrypted data +-- +--********************************************************************** + + +EncryptedData ::= SEQUENCE { + recipients SequenceOfRecipientInfo, + ciphertext SymmetricCiphertext +} +RecipientInfo ::= CHOICE { + pskRecipInfo PreSharedKeyRecipientInfo, + symmRecipInfo SymmRecipientInfo, + certRecipInfo PKRecipientInfo, + signedDataRecipInfo PKRecipientInfo, + rekRecipInfo PKRecipientInfo +} + +SequenceOfRecipientInfo ::= SEQUENCE OF RecipientInfo + +PreSharedKeyRecipientInfo ::= HashedId8 +SymmRecipientInfo ::= SEQUENCE { + recipientId HashedId8, + encKey SymmetricCiphertext +} + +PKRecipientInfo ::= SEQUENCE { + recipientId HashedId8, + encKey EncryptedDataEncryptionKey +} + +EncryptedDataEncryptionKey ::= CHOICE { + eciesNistP256 EciesP256EncryptedKey, + eciesBrainpoolP256r1 EciesP256EncryptedKey, + ... +} + +SymmetricCiphertext ::= CHOICE { + aes128ccm AesCcmCiphertext, + ... +} + +AesCcmCiphertext ::= SEQUENCE { + nonce OCTET STRING (SIZE (12)), + ccmCiphertext Opaque -- 16 bytes longer than plaintext +} + + +--********************************************************************** +-- +-- Certificates and other security management data structures +-- +--********************************************************************** + +-- Certificates are implicit (type = implicit, toBeSigned includes +-- reconstruction value, signature absent) or explicit (type = explicit, +-- toBeSigned includes verification key, signature present). + +Certificate ::= CertificateBase (ImplicitCertificate | ExplicitCertificate) + +SingleCertificate ::= SEQUENCE (SIZE(1)) OF Certificate + +SequenceOfCertificate ::= SEQUENCE OF Certificate + +CertificateBase ::= SEQUENCE { + version Uint8(3), + type CertificateType, + issuer IssuerIdentifier, + toBeSigned ToBeSignedCertificate, + signature Signature OPTIONAL +} + +CertificateType ::= ENUMERATED { + explicit, + implicit, + ... +} + +ImplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., + type(implicit), + toBeSigned(WITH COMPONENTS {..., + verifyKeyIndicator(WITH COMPONENTS {reconstructionValue}) + }), + signature ABSENT +}) + +ExplicitCertificate ::= CertificateBase (WITH COMPONENTS {..., + type(explicit), + toBeSigned(WITH COMPONENTS {..., + verifyKeyIndicator(WITH COMPONENTS {verificationKey}) + }), + signature PRESENT +}) + +IssuerIdentifier ::= CHOICE { + sha256AndDigest HashedId8, + self HashAlgorithm, + ..., + sha384AndDigest HashedId8 +} + +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}) + +CertificateId ::= CHOICE { + linkageData LinkageData, + name Hostname, + binaryId OCTET STRING(SIZE(1..64)), + none NULL, + ... +} + +LinkageData ::= SEQUENCE { + iCert IValue, + linkage-value LinkageValue, + group-linkage-value GroupLinkageValue OPTIONAL +} + +EndEntityType ::= BIT STRING {app (0), enrol (1) } (SIZE (8)) (ALL EXCEPT {}) + +PsidGroupPermissions ::= SEQUENCE { + subjectPermissions SubjectPermissions, + minChainLength INTEGER DEFAULT 1, + chainLengthRange INTEGER DEFAULT 0, + eeType EndEntityType DEFAULT {app} +} + +SequenceOfPsidGroupPermissions ::= SEQUENCE OF PsidGroupPermissions + +SubjectPermissions ::= CHOICE { + explicit SequenceOfPsidSspRange, + all NULL, + ... +} + +VerificationKeyIndicator ::= CHOICE { + verificationKey PublicVerificationKey, + reconstructionValue EccP256CurvePoint, + ... +} + +END + diff --git a/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn b/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn new file mode 100644 index 0000000000000000000000000000000000000000..2c7148467901fde5d9a7aafa1a1d8b7e3249294e --- /dev/null +++ b/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn @@ -0,0 +1,338 @@ +IEEE1609dot2BaseTypes {iso(1) identified-organization(3) ieee(111) +standards-association-numbered-series-standards(2) wave-stds(1609) +dot2(2) base(1) base-types(2) major-version-2(2)} + +-- Minor version: 1 + +-- +--******************************************************************** +-- IEEE P1609.2 Base Data Types +-- +--******************************************************************** + +DEFINITIONS AUTOMATIC TAGS ::= BEGIN + +EXPORTS ALL; + + +-- ------------------------------------------------------------------ +-- +-- Integers +-- +-- ------------------------------------------------------------------ + +IMPORTS; + +Uint3 ::= INTEGER (0..7) -- (hex) 07 +Uint8 ::= INTEGER (0..255) -- (hex) ff +Uint16 ::= INTEGER (0..65535) -- (hex) ff ff +Uint32 ::= INTEGER (0..4294967295)--<LONGLONG>-- -- (hex) ff ff ff ff +Uint64 ::= INTEGER (0..18446744073709551615) -- (hex) ff ff ff ff ff ff ff ff + +SequenceOfUint8 ::= SEQUENCE OF Uint8 +SequenceOfUint16 ::= SEQUENCE OF Uint16 + +-- ------------------------------------------------------------------ +-- +-- OCTET STRING types +-- +-- ------------------------------------------------------------------ + + +Opaque ::= OCTET STRING + + +HashedId10 ::= OCTET STRING (SIZE(10)) +HashedId8 ::= OCTET STRING (SIZE(8)) +HashedId3 ::= OCTET STRING (SIZE(3)) +SequenceOfHashedId3 ::= SEQUENCE OF HashedId3 + + +-- ------------------------------------------------------------------ +-- +-- Time +-- +-- ------------------------------------------------------------------ + +Time32 ::= Uint32 +Time64 ::= Uint64 + +ValidityPeriod ::= SEQUENCE { + start Time32, + duration Duration +} + +Duration ::= CHOICE { + microseconds Uint16, + milliseconds Uint16, + seconds Uint16, + minutes Uint16, + hours Uint16, + sixtyHours Uint16, + years Uint16 +} + +-- ------------------------------------------------------------------ +-- +-- Location +-- +-- ------------------------------------------------------------------ + + +GeographicRegion ::= CHOICE { + circularRegion CircularRegion, + rectangularRegion SequenceOfRectangularRegion, + polygonalRegion PolygonalRegion, + identifiedRegion SequenceOfIdentifiedRegion, + ... +} + +CircularRegion ::= SEQUENCE { + center TwoDLocation, + radius Uint16 +} + +RectangularRegion ::= SEQUENCE { + northWest TwoDLocation, + southEast TwoDLocation +} + +SequenceOfRectangularRegion ::= SEQUENCE OF RectangularRegion + +PolygonalRegion ::= SEQUENCE SIZE(3..MAX) OF TwoDLocation + +TwoDLocation ::= SEQUENCE { + latitude Latitude, + longitude Longitude +} + +IdentifiedRegion ::= CHOICE { + countryOnly CountryOnly, + countryAndRegions CountryAndRegions, + countryAndSubregions CountryAndSubregions, + ... +} + +SequenceOfIdentifiedRegion ::= SEQUENCE OF IdentifiedRegion + +CountryOnly ::= Uint16 + +CountryAndRegions ::= SEQUENCE { + countryOnly CountryOnly, + regions SequenceOfUint8 +} + +CountryAndSubregions ::= SEQUENCE { + country CountryOnly, + regionAndSubregions SequenceOfRegionAndSubregions +} + +RegionAndSubregions ::= SEQUENCE { + region Uint8, + subregions SequenceOfUint16 +} + +SequenceOfRegionAndSubregions ::= SEQUENCE OF RegionAndSubregions + +ThreeDLocation ::= SEQUENCE { + latitude Latitude, + longitude Longitude, + elevation Elevation +} + +Latitude ::= NinetyDegreeInt +Longitude ::= OneEightyDegreeInt +Elevation ::= ElevInt + +NinetyDegreeInt ::= INTEGER { + min (-900000000), + max (900000000), + unknown (900000001) +} (-900000000..900000001) + +KnownLatitude ::= NinetyDegreeInt (min..max) -- Minus 90deg to +90deg in microdegree intervals +UnknownLatitude ::= NinetyDegreeInt (unknown) + +OneEightyDegreeInt ::= INTEGER { + min (-1799999999), + max (1800000000), + unknown (1800000001) +} (-1799999999..1800000001) + +KnownLongitude ::= OneEightyDegreeInt (min..max) +UnknownLongitude ::= OneEightyDegreeInt (unknown) + +ElevInt ::= Uint16 -- Range is from -4096 to 61439 in units of one-tenth of a meter + +-- ------------------------------------------------------------------ +-- +-- Crypto +-- +-- ------------------------------------------------------------------ + +Signature ::= CHOICE { + ecdsaNistP256Signature EcdsaP256Signature, + ecdsaBrainpoolP256r1Signature EcdsaP256Signature, + ..., + ecdsaBrainpoolP384r1Signature EcdsaP384Signature +} + +EcdsaP256Signature ::= SEQUENCE { + rSig EccP256CurvePoint, + sSig OCTET STRING (SIZE (32)) +} + +EcdsaP384Signature ::= SEQUENCE { + rSig EccP384CurvePoint, + sSig OCTET STRING (SIZE (48)) +} + +EccP256CurvePoint ::= CHOICE { + x-only OCTET STRING (SIZE (32)), + fill NULL, -- consistency with 1363 / X9.62 + compressed-y-0 OCTET STRING (SIZE (32)), + compressed-y-1 OCTET STRING (SIZE (32)), + uncompressedP256 SEQUENCE { + x OCTET STRING (SIZE (32)), + y OCTET STRING (SIZE (32)) + } +} + +EccP384CurvePoint::= CHOICE { + x-only OCTET STRING (SIZE (48)), + fill NULL, -- consistency w 1363 / X9.62 + compressed-y-0 OCTET STRING (SIZE (48)), + compressed-y-1 OCTET STRING (SIZE (48)), + uncompressedP384 SEQUENCE { + x OCTET STRING (SIZE (48)), + y OCTET STRING (SIZE (48)) + } +} + + +SymmAlgorithm ::= ENUMERATED { + aes128Ccm, + ... +} + +HashAlgorithm ::= ENUMERATED { + sha256, + ..., + sha384 +} + +EciesP256EncryptedKey ::= SEQUENCE { + v EccP256CurvePoint, + c OCTET STRING (SIZE (16)), + t OCTET STRING (SIZE (16)) +} + +EncryptionKey ::= CHOICE { + public PublicEncryptionKey, + symmetric SymmetricEncryptionKey +} + +PublicEncryptionKey ::= SEQUENCE { + supportedSymmAlg SymmAlgorithm, + publicKey BasePublicEncryptionKey +} + +BasePublicEncryptionKey ::= CHOICE { + eciesNistP256 EccP256CurvePoint, + eciesBrainpoolP256r1 EccP256CurvePoint, + ... +} + +PublicVerificationKey ::= CHOICE { + ecdsaNistP256 EccP256CurvePoint, + ecdsaBrainpoolP256r1 EccP256CurvePoint, + ..., + ecdsaBrainpoolP384r1 EccP384CurvePoint +} + +SymmetricEncryptionKey ::= CHOICE { + aes128Ccm OCTET STRING(SIZE(16)), + ... +} + +-- ------------------------------------------------------------------ +-- +-- PSID / ITS-AID +-- +-- ------------------------------------------------------------------ + + +PsidSsp ::= SEQUENCE { + psid Psid, + ssp ServiceSpecificPermissions OPTIONAL +} + +SequenceOfPsidSsp ::= SEQUENCE OF PsidSsp + +Psid ::= INTEGER (0..MAX) + +SequenceOfPsid ::= SEQUENCE OF Psid + +ServiceSpecificPermissions ::= CHOICE { +-- opaque OCTET STRING (SIZE(0..MAX)), + opaque OCTET STRING, + ..., + bitmapSsp BitmapSsp +} + +BitmapSsp ::= OCTET STRING (SIZE(0..31)) + +PsidSspRange ::= SEQUENCE { + psid Psid, + sspRange SspRange OPTIONAL +} + +SequenceOfPsidSspRange ::= SEQUENCE OF PsidSspRange + +SspRange ::= CHOICE { + opaque SequenceOfOctetString, + all NULL, + ... , + bitmapSspRange BitmapSspRange +} + +BitmapSspRange ::= SEQUENCE { + sspValue OCTET STRING (SIZE(1..32)), + sspBitmask OCTET STRING (SIZE(1..32)) +} + +-- SequenceOfOctetString ::= SEQUENCE (SIZE (0..MAX)) OF +-- OCTET STRING (SIZE(0..MAX)) + +SequenceOfOctetString ::= SEQUENCE OF OCTET STRING + +-- ------------------------------------------------------------------ +-- +-- Goes in certs +-- +-- ------------------------------------------------------------------ + +SubjectAssurance ::= OCTET STRING (SIZE(1)) + +CrlSeries ::= Uint16 + + +-- ------------------------------------------------------------------ +-- +-- Pseudonym Linkage +-- +-- ------------------------------------------------------------------ + +IValue ::= Uint16 +Hostname ::= UTF8String (SIZE(0..255)) +LinkageValue ::= OCTET STRING (SIZE(9)) +GroupLinkageValue ::= SEQUENCE { + jValue OCTET STRING (SIZE(4)), + value OCTET STRING (SIZE(9)) +} + +LaId ::= OCTET STRING (SIZE(2)) +LinkageSeed ::= OCTET STRING (SIZE(16)) + +END + diff --git a/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script b/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script new file mode 100644 index 0000000000000000000000000000000000000000..0c8bcf494378f9e11973b1daef03fcdb7f84b3b2 --- /dev/null +++ b/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script @@ -0,0 +1,233 @@ +.****************************************************************************** +.* Copyright (c) 2000-2018 Ericsson Telecom AB +.* All rights reserved. This program and the accompanying materials +.* are made available under the terms of the Eclipse Public License v2.0 +.* which accompanies this distribution, and is available at +.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +.* +.* Contributors: +.* Balasko, Jeno +.* Beres, Szabolcs +.* Delic, Adam +.* Kovacs, Ferenc +.* Szabados, Kristof +.* Tarasov, Victor +.* +.******************************************************************************/ +:text. +:lang eng. +.* +:docname.Test Description +:docno.8/152 91-CRL 113 200/5 Uen +:rev.C +:date.2015-04-27 +.* +:prep.ETH/XZR Kristof Szabados (+36 1 437 7256) +:appr.ETH/XZ (Roland Gecse) +:checked.ETHBAAT +.* +:title.Test Description - OER coder +:contents level=3. +.*---------------------------------------------------------------------* +:h1.PREREQUISITES AND PREPARATIONS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Scope of the Test Object +.*---------------------------------------------------------------------* +:xmp tab=1 nokeep. + +This TD contains unified test case related to TTCN3 Executor's OER coder function. +Test case implement the OER codings example from specification ISO/IEC 8825-7:2015 +(https://www.itu.int/rec/T-REC-X.696-201508-I) +:exmp. + +:p.:us.Revision Information:eus. + +:xmp nokeep. +:us.History:eus. + +REV DATE PREPARED CHANGE +=== ========== ======== ====== +A 2003-10-31 ETHEKR New document +B 2007-03-06 EDMDELI Implicit message encoding +C 2007-03-21 EJNOSZA Bugfix in a testcase for implicit msg. enc. +D 2008-10-01 EFERKOV Big integers +E 2010-01-18 EKRISZA Updated for TITAN R8C +F 2011-06-18 EKRISZA Added tests for errors +A 2011-12-12 EKRISZA Updated for release +PB1 2011-01-30 ETHBAAT Editorial changes +A + +:exmp. + + +.*---------------------------------------------------------------------* +:h2.Test Tools +.*---------------------------------------------------------------------* +:p.:us.Software Tools:eus. +:xmp tab=2 nokeep. + + SAtester + +:exmp. +:np. +.*---------------------------------------------------------------------* +:h1.REQUIREMENT-BASED TESTS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Testing OER encodings +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h3. Example of OER encodings from ISO/IEC 8825-7:2015 Annex A +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - ISO/IEC 8825-7:2015 Annex A – Example of OER encodings> + +<STATIC:ASN> + +TempA + +DEFINITIONS ::= + +BEGIN + + IMPORTS; + + Date ::= [APPLICATION 3] IMPLICIT VisibleString -- YYYYMMDD + EmployeeNumber ::= [APPLICATION 2] IMPLICIT INTEGER + Name ::= [APPLICATION 1] IMPLICIT SEQUENCE { + givenName VisibleString, + initial VisibleString, + familyName VisibleString } + ChildInformation ::= SET { + name Name, + dateOfBirth [0] Date} + Record ::= [APPLICATION 0] IMPLICIT SET { + name Name, + title [0] VisibleString, + number EmployeeNumber, + dateOfHire [1] Date, + nameOfSpouse [2] Name, + children [3] IMPLICIT SEQUENCE OF ChildInformation DEFAULT {} } +END + +<STATIC> + + +type component Test_CT {} + +<TTCN_TC:PURE_EXEC> + +import from TempA all; + +external function enc_OER_Date(in Date pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Date(in octetstring stream) return Date with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_EmployeeNumber(in EmployeeNumber pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EmployeeNumber(in octetstring stream) return EmployeeNumber with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Name(in Name pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Name(in octetstring stream) return Name with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_ChildInformation(in ChildInformation pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_ChildInformation(in octetstring stream) return ChildInformation with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Record(in Record pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Record(in octetstring stream) return Record with { extension "prototype(convert) decode(OER)" } + +//********************************************* +// TESTCASES +//********************************************* + +testcase tc_OER_encoding_of_Date() runs on Test_CT { + const Date date := "19710917" + const octetstring raw_encoded := '083139373130393137'O; + + if (enc_OER_Date(date) == raw_encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Date(raw_encoded) == date) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_encoding_of_EmployeeNumber() runs on Test_CT { + const EmployeeNumber empl_num := 51 + if (enc_OER_EmployeeNumber(empl_num) == '0133'O) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_encoding_of_Name() runs on Test_CT { + const Name name := { + givenName := "John", + initial := "P", + familyName := "Smith" + } + const octetstring raw_encoded := '044A6F686E015005536D697468'O; + + if (enc_OER_Name(name) == raw_encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Name(raw_encoded) == name) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_ChildInformation() runs on Test_CT { + const ChildInformation child := { + name := { + givenName := "Ralph", + initial := "T", + familyName := "Smith" + }, + dateOfBirth := "19571111" + } + const octetstring raw_encoded := '0552616C7068015405536D697468083139353731313131'O; + + if (enc_OER_ChildInformation(child) == raw_encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_ChildInformation(raw_encoded) == child) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Record() runs on Test_CT { + const octetstring raw_encoded := + '80044A6F686E015005536D6974680133084469726563746F72083139373130393137044D617279015405536D69746801020552616C7068015405536D69746808313935373131313105537573616E0142054A6F6E6573083139353930373137'O; + const Record rec := { + name := { + givenName := "John", + initial := "P", + familyName := "Smith"}, + title := "Director", + number := 51, + dateOfHire := "19710917", + nameOfSpouse := { + givenName := "Mary", + initial := "T", + familyName := "Smith"}, + children := { + { name := { + givenName := "Ralph", + initial := "T", + familyName := "Smith"}, + dateOfBirth := "19571111" }, + { name := { + givenName := "Susan", + initial := "B", + familyName := "Jones"}, + dateOfBirth := "19590717"} + } + } + + if (enc_OER_Record(rec) == raw_encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Record(raw_encoded) == rec) {setverdict(pass);} else {setverdict(fail);} +} + +//********************************************* +// CONTROL PART +//********************************************* + +control { + execute(tc_OER_encoding_of_Date()); + execute(tc_OER_encoding_of_EmployeeNumber()); + execute(tc_OER_encoding_of_Name()); + execute(tc_OER_ChildInformation()); + execute(tc_OER_Record()); +} + +<RESULT> + +Overall verdict: pass + +<END_TC> + diff --git a/function_test/OER_EncDec/Makefile b/function_test/OER_EncDec/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..1efc1b96d824e39411a1f903fb36df4dda5efb94 --- /dev/null +++ b/function_test/OER_EncDec/Makefile @@ -0,0 +1,165 @@ +############################################################################## +# Copyright (c) 2000-2018 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v2.0 +# which accompanies this distribution, and is available at +# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +# +# Contributors: +# +# Balasko, Jeno +# Delic, Adam +# Hanko, Matyas +# Kovacs, Ferenc +# Lovassy, Arpad +# Ormandi, Matyas +# Raduly, Csaba +# Szabados, Kristof +# Szabo, Janos Zoltan – initial implementation +# Tarasov, Victor +# +############################################################################## +# uncomment this line to use alternative runtime (TITAN_RUNTIME_2) +# RT2 = yes + +# This Makefile was generated by the compiler +# of the TTCN-3 Test Executor version 1.4.pl5 +# for Matyas Hanko (ethmhk@duna61) on Mon Oct 6 16:26:18 2003 + +# The following make commands are available: +# - make, make all Builds the executable test suite. +# - make compile Translates TTCN-3 and ASN.1 modules to C++. +# - make clean Removes all generated files. +# - make dep Creates/updates dependency list. +# - make archive Archives all source files. + +# +# Set these variables... +# + +TOP := ../../ +include $(TOP)/Makefile.cfg + + +# The path of your TTCN-3 Test Executor installation: +# Uncomment this line to override the environment variable. +# TTCN3_DIR = + +# Your platform: (SOLARIS, LINUX, FREEBSD or WIN32) +ifndef PLATFORM +PLATFORM = SOLARIS +endif + +# Your C++ compiler: +#CXX = g++ + +# Flags for the C++ preprocessor (and makedepend as well): +CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include -I$(XMLDIR)/include/libxml2 +ifdef RT2 +CPPFLAGS += -DTITAN_RUNTIME_2 +endif +ifeq ($(DEBUG), yes) +CPPFLAGS += -DMEMORY_DEBUG +endif + +# Flags for the C++ compiler: +CXXFLAGS = -Wall + +# Flags for the linker: +LDFLAGS = + +# Flags for the TTCN-3 and ASN.1 compiler: +COMPILER_FLAGS = -L +ifdef RT2 +COMPILER_FLAGS += -R +endif + +# Execution mode: (either ttcn3 or ttcn3-parallel) +ifndef RT2 +TTCN3_LIB = ttcn3 +else +TTCN3_LIB = ttcn3-rt2 +endif + + +# The path of your OpenSSL installation: +# If you do not have your own one, leave it unchanged. +OPENSSL_DIR = $(TTCN3_DIR) + +# Directory to store the archived source files: +# Note: you can set any directory except ./archive +ARCHIVE_DIR = ./backup + +# +# You may change these variables. Add your files if necessary... +# + +# The TTCN-3 modules needed for this project: +TTCN3_MODULES = Temp.ttcn + +# The ASN.1 modules needed for this project: +ASN1_MODULES = TempA.asn IEEE1609dot2BaseTypes.asn IEEE1609dot2.asn EtsiTs103097Module.asn + +# C++ source & header files generated by TTCN-3 & ASN.1 compilers: +GENERATED_SOURCES = Temp.cc $(ASN1_MODULES:.asn=.cc) +GENERATED_HEADERS = Temp.hh $(ASN1_MODULES:.asn=.hh) + +# Source & header files of Test Ports and your other modules: +USER_SOURCES = +USER_HEADERS = + +# All object files needed for the executable test suite: +# OBJECTS = Temp.o TempA.o IEEE1609dot2BaseTypes.o IEEE1609dot2.o +OBJECTS = $(GENERATED_SOURCES:.cc=.o) + +# The name of the executable test suite: +TARGET = Temp + +ifdef COVERAGE +CPPFLAGS += -fprofile-arcs -ftest-coverage -g +CXXFLAGS += -fprofile-arcs -ftest-coverage -g +LDFLAGS += -fprofile-arcs -ftest-coverage -g -lgcov +endif + +# +# Do not modify these unless you know what you are doing... +# +SOLARIS_LIBS = -lxnet -L$(XMLDIR)/lib -lxml2 -lresolv -lcurses +SOLARIS8_LIBS = -lxnet -L$(XMLDIR)/lib -lxml2 -lresolv -lnsl -lsocket -lcurses +LINUX_LIBS = -L$(XMLDIR)/lib -lxml2 -lpthread -lrt -lncurses +FREEBSD_LIBS = -L$(XMLDIR)/lib -lxml2 -lncurses +WIN32_LIBS = -L$(XMLDIR)/lib -lxml2 -lncurses + +# +# Rules for building the executable... +# +all: $(TARGET) ; + +$(TARGET): $(OBJECTS) + $(CXX) $(LDFLAGS) -o $@ $(OBJECTS) -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ + -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) + +.cc.o .c.o: + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< + +$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile + @if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi + +compile: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) $(TTCN3_MODULES) \ + $(ASN1_MODULES) $(ASN1_STATIC_MODULES) - $? + touch $@ + +clean: + -$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ + $(GENERATED_SOURCES) compile *.log *.gcda *.gcno + +dep: $(GENERATED_SOURCES) + makedepend $(CPPFLAGS) $(USER_SOURCES) $(GENERATED_SOURCES) + +archive: + mkdir -p $(ARCHIVE_DIR) + tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \ + $(USER_HEADERS) $(USER_SOURCES) Makefile \ + | gzip >$(ARCHIVE_DIR)/$(TARGET)-`date '+%y%m%d-%H%M'`.tgz + diff --git a/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script b/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script new file mode 100644 index 0000000000000000000000000000000000000000..de2b9eb66919908c7b06742f0e24b8515382c1cb --- /dev/null +++ b/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script @@ -0,0 +1,357 @@ +.****************************************************************************** +.* Copyright (c) 2000-2018 Ericsson Telecom AB +.* All rights reserved. This program and the accompanying materials +.* are made available under the terms of the Eclipse Public License v2.0 +.* which accompanies this distribution, and is available at +.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +.* +.* Contributors: +.* Balasko, Jeno +.* Beres, Szabolcs +.* Delic, Adam +.* Kovacs, Ferenc +.* Szabados, Kristof +.* +.******************************************************************************/ +:text. +:lang eng. +.* +:docname.Test Description +:docno.8/152 91-CRL 113 200/5 Uen +:rev.C +:date.2015-04-27 +.* +:prep.ETH/XZR Kristof Szabados (+36 1 437 7256) +:appr.ETH/XZ (Roland Gecse) +:checked.ETHBAAT +.* +:title.Test Description - OER coder +:contents level=3. +.*---------------------------------------------------------------------* +:h1.PREREQUISITES AND PREPARATIONS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Scope of the Test Object +.*---------------------------------------------------------------------* +:xmp tab=1 nokeep. + +This TD contains unified test cases related to TTCN3 Executor's OER coder function. + +The target of these test cases are the basic data types from specification +'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules: +Specification of Octet Encoding Rules' + +The target data types are used in the following technical specification: + 'ETSI TS 103 097 V1.3.1 (2017-10)' +Intelligent Transport Systems (ITS); Security; +Security header and certificate formats and certificate formats + + 'IEEE Std 1609.2-2016 IEEE Standard' +Wireless Access in Vehicular Environments—Security Services for +Applications and Management Messages + +:exmp. + +:p.:us.Revision Information:eus. + +:xmp nokeep. +:us.History:eus. + +REV DATE PREPARED CHANGE +=== ========== ======== ====== +A 2003-10-31 ETHEKR New document +B 2007-03-06 EDMDELI Implicit message encoding +C 2007-03-21 EJNOSZA Bugfix in a testcase for implicit msg. enc. +D 2008-10-01 EFERKOV Big integers +E 2010-01-18 EKRISZA Updated for TITAN R8C +F 2011-06-18 EKRISZA Added tests for errors +A 2011-12-12 EKRISZA Updated for release +PB1 2011-01-30 ETHBAAT Editorial changes + +:exmp. + + +.*---------------------------------------------------------------------* +:h2.Test Tools +.*---------------------------------------------------------------------* +:p.:us.Software Tools:eus. +:xmp tab=2 nokeep. + + SAtester + +:exmp. +:np. +.*---------------------------------------------------------------------* +:h1.REQUIREMENT-BASED TESTS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Testing OER encoding of the basic types +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h3. OER encoding +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - OER encoding (unified tests)> + +<STATIC:ASN> + +TempA + +DEFINITIONS ::= + +BEGIN + +IMPORTS + Certificate, Ieee1609Dot2Data FROM IEEE1609dot2 { + iso(1) identified-organization(3) ieee(111) + standards-association-numbered-series-standards(2) wave-stds(1609) + dot2(2) base(1) schema(1) major-version-2(2) + }; + + TestIeee1609Dot2Data ::= Ieee1609Dot2Data + TestCertificate ::= Certificate + +END + +<STATIC> + + +type component Test_CT {} + +<TTCN_TC:PURE_EXEC> + +import from TempA all; + +external function enc_Ieee1609Dot2Data(in TestIeee1609Dot2Data pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_Ieee1609Dot2Data(in octetstring stream) return TestIeee1609Dot2Data with { extension "prototype(convert) decode(OER)" } + +//********************************************* +// TESTCASES +//********************************************* + +//D.5.1 “Basic safety message†with dummy payload, signed with a digest +testcase tc_Ieee1609Dot2Data_SignedWithDigest() runs on Test_CT { + const octetstring encoded := +'0381004003800F5468697320697320612042534D0D0A4001201112131415161718802122232425262728808231323334353637383132333435363738313233343536373831323334353637384142434445464748414243444546474841424344454647484142434445464748'O; + const TestIeee1609Dot2Data data := { + protocolVersion := 3, + content := { + signedData := { + hashId := sha256, + tbsData := { + payload := { + data := { + protocolVersion := 3, + content := { unsecuredData := '5468697320697320612042534D0D0A'O} + } + }, + headerInfo := { + psid := 32, + generationTime := 1230066625199609624 + } + }, + signer := {digest := '2122232425262728'O}, + signature_ := { + ecdsaNistP256Signature := { + rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O }, + sSig := '4142434445464748414243444546474841424344454647484142434445464748'O + } + } + } + } + }; + + const TestIeee1609Dot2Data decoded := { + protocolVersion := 3, + content := { + signedData := { + hashId := sha256, + tbsData := { + payload := { + data := { + protocolVersion := 3, + content := { unsecuredData := '5468697320697320612042534D0D0A'O} + }, + extDataHash := omit + }, + headerInfo := { + psid := 32, + generationTime := 1230066625199609624, + expiryTime := omit, + generationLocation := omit, + p2pcdLearningRequest := omit, + missingCrlIdentifier := omit, + encryptionKey := omit, + inlineP2pcdRequest := omit, + requestedCertificate := omit + } + }, + signer := {digest := '2122232425262728'O}, + signature_ := { + ecdsaNistP256Signature := { + rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O }, + sSig := '4142434445464748414243444546474841424344454647484142434445464748'O + } + } + } + } + }; + + if (enc_Ieee1609Dot2Data(data) == encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_Ieee1609Dot2Data(encoded) == decoded) {setverdict(pass);} else {setverdict(fail);} +} + +// D.5.2 “Basic safety message†with dummy pay load, signed with a certificate +testcase tc_Ieee1609Dot2Data_SignedWithCertificate() runs on Test_CT { + const octetstring encoded := + '0381004003800F5468697320697320612042534D0D0A4001201112131415161718810101000301802122232425262728508080006431323334353637383941424344515253545556575859616263004604E09A208400A983010380007C8001E4800348010200012000012681829192939495969798919293949596979891929394959697989192939495969798808231323334353637383132333435363738313233343536373831323334353637384142434445464748414243444546474841424344454647484142434445464748'O; + + const TestIeee1609Dot2Data data := { + protocolVersion := 3, + content := { + signedData := { + hashId := sha256, + tbsData := { + payload := { + data := { + protocolVersion := 3, + content := { unsecuredData := '5468697320697320612042534D0D0A'O } + } + }, + headerInfo := { psid := 32, generationTime := 1230066625199609624 } + }, + signer := { + certificate := { + { + version := 3, + type_ := implicit, + issuer := { sha256AndDigest := '2122232425262728'O }, + toBeSigned := { + id := { + linkageData := { + iCert := 100, + linkage_value := '313233343536373839'O, + group_linkage_value := { jValue := '41424344'O, value_ := '515253545556575859'O } + } + }, + cracaId := '616263'O, + crlSeries := 70, + validityPeriod := { start_ := 81828384, duration := { hours := 169 } }, + region := { identifiedRegion := { { countryOnly := 124 }, { countryOnly := 484 }, { countryOnly := 840 } } }, + appPermissions := { { psid := 32}, { psid := 38} }, + verifyKeyIndicator := { reconstructionValue := { compressed_y_0 := '9192939495969798919293949596979891929394959697989192939495969798'O } } + } + } + } + }, + signature_ := { + ecdsaNistP256Signature := { + rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O}, + sSig := '4142434445464748414243444546474841424344454647484142434445464748'O + } + } + } + } + }; + + const TestIeee1609Dot2Data decoded := { + protocolVersion := 3, + content := { + signedData := { + hashId := sha256, + tbsData := { + payload := { + data := { + protocolVersion := 3, + content := { unsecuredData := '5468697320697320612042534D0D0A'O } + }, + extDataHash := omit + }, + headerInfo := { + psid := 32, + generationTime := 1230066625199609624, + expiryTime := omit, + generationLocation := omit, + p2pcdLearningRequest := omit, + missingCrlIdentifier := omit, + encryptionKey := omit, + inlineP2pcdRequest := omit, + requestedCertificate := omit + } + }, + signer := { + certificate := { + { + version := 3, + type_ := implicit, + issuer := { sha256AndDigest := '2122232425262728'O }, + toBeSigned := { + id := { + linkageData := { + iCert := 100, + linkage_value := '313233343536373839'O, + group_linkage_value := { + jValue := '41424344'O, + value_ := '515253545556575859'O + } + } + }, + cracaId := '616263'O, + crlSeries := 70, + validityPeriod := { + start_ := 81828384, + duration := { hours := 169 } + }, + region := { + identifiedRegion := { + { countryOnly := 124 }, + { countryOnly := 484 }, + { countryOnly := 840 } + } + }, + assuranceLevel := omit, + appPermissions := { + { psid := 32, ssp := omit }, + { psid := 38, ssp := omit } + }, + certIssuePermissions := omit, + certRequestPermissions := omit, + canRequestRollover := omit, + encryptionKey := omit, + verifyKeyIndicator := { + reconstructionValue := { compressed_y_0 := '9192939495969798919293949596979891929394959697989192939495969798'O } + } + }, + signature_ := omit + } + } + }, + signature_ := { + ecdsaNistP256Signature := { + rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O}, + sSig := '4142434445464748414243444546474841424344454647484142434445464748'O + } + } + } + } + }; + + if (enc_Ieee1609Dot2Data(data) == encoded) {setverdict(pass);} else {setverdict(fail);} + if (dec_Ieee1609Dot2Data(encoded) == decoded) {setverdict(pass);} else {setverdict(fail);} +} +//********************************************* +// CONTROL PART +//********************************************* + +control { + execute(tc_Ieee1609Dot2Data_SignedWithDigest()); + execute(tc_Ieee1609Dot2Data_SignedWithCertificate()); +} + +<RESULT> + +Overall verdict: pass + +<END_TC> + diff --git a/function_test/OER_EncDec/OER_EncDec_ITSPKI.script b/function_test/OER_EncDec/OER_EncDec_ITSPKI.script new file mode 100644 index 0000000000000000000000000000000000000000..3ddf4ece0c8a4a13aadb7f6a5d4c59ff9d12bc31 --- /dev/null +++ b/function_test/OER_EncDec/OER_EncDec_ITSPKI.script @@ -0,0 +1,810 @@ +.****************************************************************************** +.* Copyright (c) 2000-2018 Ericsson Telecom AB +.* All rights reserved. This program and the accompanying materials +.* are made available under the terms of the Eclipse Public License v2.0 +.* which accompanies this distribution, and is available at +.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +.* +.* Contributors: +.* Balasko, Jeno +.* Beres, Szabolcs +.* Delic, Adam +.* Kovacs, Ferenc +.* Szabados, Kristof +.* Tarasov, Victor +.* +.******************************************************************************/ +:text. +:lang eng. +.* +:docname.Test Description +:docno.8/152 91-CRL 113 200/5 Uen +:rev.C +:date.2015-04-27 +.* +:prep.ETH/XZR Kristof Szabados (+36 1 437 7256) +:appr.ETH/XZ (Roland Gecse) +:checked.ETHBAAT +.* +:title.Test Description - OER coder +:contents level=3. +.*---------------------------------------------------------------------* +:h1.PREREQUISITES AND PREPARATIONS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Scope of the Test Object +.*---------------------------------------------------------------------* +:xmp tab=1 nokeep. + +This TD contains unified test cases related to TTCN3 Executor's OER coder function. + +The target of these test cases are the basic data types from specification +'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules: +Specification of Octet Encoding Rules' + +The target data types are used in the following technical specification: + 'ETSI TS 103 097 V1.3.1 (2017-10)' +Intelligent Transport Systems (ITS); Security; +Security header and certificate formats and certificate formats + + 'IEEE Std 1609.2-2016 IEEE Standard' +Wireless Access in Vehicular Environments—Security Services for +Applications and Management Messages + +:exmp. + +:p.:us.Revision Information:eus. + +:xmp nokeep. +:us.History:eus. + +REV DATE PREPARED CHANGE +=== ========== ======== ====== +A 2003-10-31 ETHEKR New document +B 2007-03-06 EDMDELI Implicit message encoding +C 2007-03-21 EJNOSZA Bugfix in a testcase for implicit msg. enc. +D 2008-10-01 EFERKOV Big integers +E 2010-01-18 EKRISZA Updated for TITAN R8C +F 2011-06-18 EKRISZA Added tests for errors +A 2011-12-12 EKRISZA Updated for release +PB1 2011-01-30 ETHBAAT Editorial changes + +:exmp. + + +.*---------------------------------------------------------------------* +:h2.Test Tools +.*---------------------------------------------------------------------* +:p.:us.Software Tools:eus. +:xmp tab=2 nokeep. + + SAtester + +:exmp. +:np. +.*---------------------------------------------------------------------* +:h1.REQUIREMENT-BASED TESTS +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h2.Testing OER encoding of the basic types +.*---------------------------------------------------------------------* +.*---------------------------------------------------------------------* +:h3. OER encoding +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC - OER encoding (unified tests)> + +<STATIC:ASN> + +TempA + +DEFINITIONS ::= + +BEGIN + + IMPORTS; + + Null ::= NULL + + Bool ::= BOOLEAN + + Uint ::= INTEGER (0..MAX) + Uint8 ::= INTEGER (0..255) + Uint16 ::= INTEGER (0..65535) + Uint32 ::= INTEGER (0..4294967295) + Uint64 ::= INTEGER (0..18446744073709551615) + + Int ::= INTEGER + Sint8 ::= INTEGER (-128..127) + Sint16 ::= INTEGER (-32768..32767) + Sint32 ::= INTEGER (-2147483648..2147483647) + Sint64 ::= INTEGER (-9223372036854775808..9223372036854775807) + + Enum ::= ENUMERATED {zero(0), one(1), two(2)} + EnumM ::= ENUMERATED {zero(0), one(1), two(2), numM(18)} + EnumP ::= ENUMERATED {zero(0), one(1), two(2), numP(1234)} + EnumB ::= ENUMERATED {zero(0), one(1), two(2), numB(65261)} + EnumNM ::= ENUMERATED {zero(0), one(1), two(2), numNM(-275)} + EnumNB ::= ENUMERATED {zero(0), one(1), two(2), numNB(-64302)} + + BitStr ::= BIT STRING + BitStrEmpty ::= BIT STRING (SIZE(0)) + BitStrRandom ::= BIT STRING (SIZE(54)) + BitStrAligned ::= BIT STRING (SIZE(48)) + + OctetStr ::= OCTET STRING + OctetStrEmpty ::= OCTET STRING (SIZE(0)) + OctetStrRandom ::= OCTET STRING (SIZE(6)) + + SequenceEmpty ::= SEQUENCE {} + SequenceEmptyExtendable ::= SEQUENCE { + ... + } + SequenceSimple ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)), + f2 OCTET STRING (SIZE (2)), + f3 OCTET STRING (SIZE (2)) + } + SequenceSimpleExtendable ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)), + f2 OCTET STRING (SIZE (2)), + f3 OCTET STRING (SIZE (2)), + ... + } + SequenceSimpleExtended ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)), + f2 OCTET STRING (SIZE (2)), + f3 OCTET STRING (SIZE (2)), + ..., + e1 OCTET STRING (SIZE (2)), + e2 OCTET STRING (SIZE (2)), + e3 OCTET STRING (SIZE (2)) + + } + SequenceSomeOptional ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)), + f2 [2] OCTET STRING (SIZE (2)) OPTIONAL, + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL + } + SequenceAllOptional ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)) OPTIONAL, + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL + } + SequenceOptionalExtendable ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)), + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL, + ... + } + SequenceLongOptionalExtendable ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)) OPTIONAL, + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL, + f4 [4] OCTET STRING (SIZE (2)) OPTIONAL, + f5 [5] OCTET STRING (SIZE (2)) OPTIONAL, + f6 [6] OCTET STRING (SIZE (2)) OPTIONAL, + f7 [7] OCTET STRING (SIZE (2)) OPTIONAL, + f8 [8] OCTET STRING (SIZE (2)) OPTIONAL, + f9 [9] OCTET STRING (SIZE (2)) OPTIONAL, + f10 [10] OCTET STRING (SIZE (2)) OPTIONAL, + ... + } + SequenceOptionalExtended ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)), + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL, + ..., + e1 [4] OCTET STRING (SIZE (2)) OPTIONAL, + e2 [5] OCTET STRING (SIZE (2)), + e3 [6] OCTET STRING (SIZE (2)) OPTIONAL + } + SequenceLongOptionalExtended ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)), + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL, + ..., + e1 [4] OCTET STRING (SIZE (2)) OPTIONAL, + e2 [5] OCTET STRING (SIZE (2)), + e3 [6] OCTET STRING (SIZE (2)) OPTIONAL, + e4 [7] OCTET STRING (SIZE (2)) OPTIONAL, + e5 [8] OCTET STRING (SIZE (2)), + e6 [9] OCTET STRING (SIZE (2)) OPTIONAL, + e7 [10] OCTET STRING (SIZE (2)) OPTIONAL, + e8 [11] OCTET STRING (SIZE (2)), + e9 [12] OCTET STRING (SIZE (2)) OPTIONAL + } + SequenceUnknownExtended ::= SEQUENCE { + f1 OCTET STRING (SIZE (2)) OPTIONAL, + f2 [2] OCTET STRING (SIZE (2)), + f3 [3] OCTET STRING (SIZE (2)) OPTIONAL, + ..., + e1 [4] OCTET STRING (SIZE (2)) OPTIONAL, + e2 [5] OCTET STRING (SIZE (2)), + e3 [6] OCTET STRING (SIZE (2)) OPTIONAL, + e4 [7] OCTET STRING (SIZE (2)) OPTIONAL + } + + SequenceOfOctetString ::= SEQUENCE OF OCTET STRING (SIZE (2)) + + Choice ::= CHOICE { + f [0] OCTET STRING (SIZE (2)), + s [1] NULL + } + ChoiceBis ::= CHOICE { + f [42] OCTET STRING (SIZE (2)), + s [99] NULL + } + ChoiceTer ::= CHOICE { + f [123456] OCTET STRING (SIZE (2)), + s [999999] NULL + } + ChoiceQuatro ::= CHOICE { + f [0] NULL, + ..., + s [42] OCTET STRING (SIZE (2)), + t [99] NULL + } + + Utf8 ::= UTF8String + +END + +<STATIC> + + +type component Test_CT {} + +<TTCN_TC:PURE_EXEC> + +import from TempA all; + +external function enc_OER_Null(in Null pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Null(in octetstring stream) return Null with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Bool(in Bool pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Bool(in octetstring stream) return Bool with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Uint(in Uint pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Uint(in octetstring stream) return Uint with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Uint8(in Uint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Uint8(in octetstring stream) return Uint8 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Uint16(in Uint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Uint16(in octetstring stream) return Uint16 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Uint32(in Uint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Uint32(in octetstring stream) return Uint32 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Uint64(in Uint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Uint64(in octetstring stream) return Uint64 with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Int(in Int pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Int(in octetstring stream) return Int with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Sint8(in Sint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Sint8(in octetstring stream) return Sint8 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Sint16(in Sint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Sint16(in octetstring stream) return Sint16 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Sint32(in Sint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Sint32(in octetstring stream) return Sint32 with { extension "prototype(convert) decode(OER)" } +external function enc_OER_Sint64(in Sint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Sint64(in octetstring stream) return Sint64 with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Enum(in Enum pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Enum(in octetstring stream) return Enum with { extension "prototype(convert) decode(OER)" } +external function enc_OER_EnumM(in EnumM pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EnumM(in octetstring stream) return EnumM with { extension "prototype(convert) decode(OER)" } +external function enc_OER_EnumP(in EnumP pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EnumP(in octetstring stream) return EnumP with { extension "prototype(convert) decode(OER)" } +external function enc_OER_EnumB(in EnumB pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EnumB(in octetstring stream) return EnumB with { extension "prototype(convert) decode(OER)" } +external function enc_OER_EnumNM(in EnumNM pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EnumNM(in octetstring stream) return EnumNM with { extension "prototype(convert) decode(OER)" } +external function enc_OER_EnumNB(in EnumNB pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_EnumNB(in octetstring stream) return EnumNB with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_BitStr(in BitStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_BitStr(in octetstring pdu) return BitStr with { extension "prototype(convert) decode(OER)" } +external function enc_OER_BitStrEmpty(in BitStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_BitStrEmpty(in octetstring pdu) return BitStrEmpty with { extension "prototype(convert) decode(OER)" } +external function enc_OER_BitStrRandom(in BitStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_BitStrRandom(in octetstring pdu) return BitStrRandom with { extension "prototype(convert) decode(OER)" } +external function enc_OER_BitStrAligned(in BitStrAligned pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_BitStrAligned(in octetstring pdu) return BitStrAligned with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_OctetStr(in OctetStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_OctetStr(in octetstring pdu) return OctetStr with { extension "prototype(convert) decode(OER)" } +external function enc_OER_OctetStrEmpty(in OctetStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_OctetStrEmpty(in octetstring pdu) return OctetStrEmpty with { extension "prototype(convert) decode(OER)" } +external function enc_OER_OctetStrRandom(in OctetStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_OctetStrRandom(in octetstring pdu) return OctetStrRandom with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_SequenceEmpty(in SequenceEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceEmpty(in octetstring stream) return SequenceEmpty with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceEmptyExtendable(in SequenceEmptyExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceEmptyExtendable(in octetstring stream) return SequenceEmptyExtendable with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceSimple(in SequenceSimple pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceSimple(in octetstring stream) return SequenceSimple with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceSimpleExtendable(in SequenceSimpleExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceSimpleExtendable(in octetstring stream) return SequenceSimpleExtendable with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceSimpleExtended(in SequenceSimpleExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceSimpleExtended(in octetstring stream) return SequenceSimpleExtended with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceSomeOptional(in SequenceSomeOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceSomeOptional(in octetstring stream) return SequenceSomeOptional with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceAllOptional(in SequenceAllOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceAllOptional(in octetstring stream) return SequenceAllOptional with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceOptionalExtendable(in SequenceOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceOptionalExtendable(in octetstring stream) return SequenceOptionalExtendable with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceLongOptionalExtendable(in SequenceLongOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceLongOptionalExtendable(in octetstring stream) return SequenceLongOptionalExtendable with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceOptionalExtended(in SequenceOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceOptionalExtended(in octetstring stream) return SequenceOptionalExtended with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceLongOptionalExtended(in SequenceLongOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceLongOptionalExtended(in octetstring stream) return SequenceLongOptionalExtended with { extension "prototype(convert) decode(OER)" } +external function enc_OER_SequenceOfOctetString(in SequenceOfOctetString pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_SequenceOfOctetString(in octetstring stream) return SequenceOfOctetString with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Choice(in Choice pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Choice(in octetstring stream) return Choice with { extension "prototype(convert) decode(OER)" } +external function enc_OER_ChoiceBis(in ChoiceBis pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_ChoiceBis(in octetstring stream) return ChoiceBis with { extension "prototype(convert) decode(OER)" } +external function enc_OER_ChoiceTer(in ChoiceTer pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_ChoiceTer(in octetstring stream) return ChoiceTer with { extension "prototype(convert) decode(OER)" } +external function enc_OER_ChoiceQuatro(in ChoiceQuatro pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_ChoiceQuatro(in octetstring stream) return ChoiceQuatro with { extension "prototype(convert) decode(OER)" } + +external function enc_OER_Utf8(in Utf8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" } +external function dec_OER_Utf8(in octetstring stream) return Utf8 with { extension "prototype(convert) decode(OER)" } + +//********************************************* +// TESTCASES +//********************************************* + +testcase tc_OER_Null() runs on Test_CT { + const Null nn := NULL + + if (enc_OER_Null(nn) == ''O) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Null(''O) == nn) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Bool() runs on Test_CT { + const Bool b1 := true + const Bool b2 := false + + if (enc_OER_Bool(b1) == 'FF'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Bool(b2) == '00'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Bool('FF'O) == b1){setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Bool('42'O) == b1){setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Bool('00'O) == b2){setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Uint() runs on Test_CT { + const Uint u0 := 0 + const Uint u1 := 1 + const Uint u254 := 254 + const Uint uR := 8234104123542484900769178205574010627627573691361805720124810878238590820080 + const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O + const Uint uB := 115307965754428812535861235258289182183752994114051557942764040435498874699501 + const octetstring oB := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O + const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O + + if (enc_OER_Uint(u0) == '0100'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint(u1) == '0101'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint(u254) == '01FE'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint(uR) == oR) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint(uB) == oB) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Uint('0100'O) == u0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint('0101'O) == u1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint('01FE'O) == u254) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint(oR) == uR) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint(oB) == uB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint(oBB) == uB) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Uint8() runs on Test_CT { + const Uint8 u0 := 0 + const Uint8 u1 := 1 + const Uint8 u18 := 18 + const Uint8 u254 := 254 + + if (enc_OER_Uint8(u0) == '00'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint8(u1) == '01'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint8(u18) == '12'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint8(u254) == 'FE'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Uint8('00'O) == u0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint8('01'O) == u1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint8('12'O) == u18) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint8('FE'O) == u254) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Uint16() runs on Test_CT { + const Uint16 u0 := 0 + const Uint16 u1 := 1 + const Uint16 u4660 := 4660 + const Uint16 u65261 := 65261 + + if (enc_OER_Uint16(u0) == '0000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint16(u1) == '0001'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint16(u4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint16(u65261) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Uint16('0000'O) == u0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint16('0001'O) == u1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint16('1234'O) == u4660) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint16('FEED'O) == u65261) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Uint32() runs on Test_CT { + const Uint32 u0 := 0 + const Uint32 u1 := 1 + const Uint32 uR := 305419896 + const Uint32 uB := 4277010157 + + if (enc_OER_Uint32(u0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint32(u1) == '00000001'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint32(uR) == '12345678'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint32(uB) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Uint32('00000000'O) == u0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint32('00000001'O) == u1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint32('12345678'O) == uR) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint32('FEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Uint64() runs on Test_CT { + const Uint64 u0 := 0 + const Uint64 u1 := 1 + const Uint64 uR := 1311768467463790320 + const Uint64 uB := 18369618753251835629 + + if (enc_OER_Uint64(u0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint64(u1) == '0000000000000001'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint64(uR) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Uint64(uB) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Uint64('0000000000000000'O) == u0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint64('0000000000000001'O) == u1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint64('123456789ABCDEF0'O) == uR) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Uint64('FEEDFEEDFEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Int() runs on Test_CT { + const Int i0 := 0 + const Int i1 := 1 + const Int i254 := 254 + const Int iR := 8234104123542484900769178205574010627627573691361805720124810878238590820080 + const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O + const Int iB := 115307965754428812535861235258289182183752994114051557942764040435498874699501 + const octetstring oB := '2100FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O + const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O + const Int iBn := -484123482887382887709749750398725669516990551589006096693543572414254940435 + const octetstring oBn := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O + const Int iBBn := -107557985113773710522801806803113897225642410974278758319332773129674538819856 + const octetstring oBBn := '21FF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O + const octetstring oBBnn := '28FFFFFFFFFFFFFFFF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O + + if (enc_OER_Int(i0) == '0100'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(i1) == '0101'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(i254) == '0200FE'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(iR) == oR) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(iB) == oB) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(iBn) == oBn) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Int(iBBn) == oBBn) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Int('0100'O) == i0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int('0101'O) == i1) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int('0200FE'O) == i254) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int(oR) == iR) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int(oB) == iB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int(oBB) == iB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int(oBBn) == iBBn) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Int(oBBnn) == iBBn) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Sint8() runs on Test_CT { + const Sint8 s0 := 0 + const Sint8 s18 := 18 + const Sint8 sn2 := -2 + + if (enc_OER_Sint8(s0) == '00'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint8(s18) == '12'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint8(sn2) == 'FE'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Sint8('00'O) == s0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint8('12'O) == s18) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint8('FE'O) == sn2) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Sint16() runs on Test_CT { + const Sint16 s0 := 0 + const Sint16 s4660 := 4660 + const Sint16 sn275 := -275 + + if (enc_OER_Sint16(s0) == '0000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint16(s4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint16(sn275) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Sint16('0000'O) == s0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint16('1234'O) == s4660) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint16('FEED'O) == sn275) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Sint32() runs on Test_CT { + const Sint32 s0 := 0 + const Sint32 sB := 305419896 + const Sint32 sN := -17957139 + + if (enc_OER_Sint32(s0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint32(sB) == '12345678'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint32(sN) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Sint32('00000000'O) == s0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint32('12345678'O) == sB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint32('FEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Sint64() runs on Test_CT { + const Sint64 s0 := 0 + const Sint64 sB := 1311768467463790320 + const Sint64 sN := -77125320457715987 + + if (enc_OER_Sint64(s0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint64(sB) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Sint64(sN) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Sint64('0000000000000000'O) == s0) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint64('123456789ABCDEF0'O) == sB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Sint64('FEEDFEEDFEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Enum() runs on Test_CT { + const Enum enum_zero := zero + const EnumM enumm_numM := numM + const EnumP enumm_numP := numP + const EnumB enumm_numB := numB + const EnumNM enumm_numNM := numNM + const EnumNB enumm_numNB := numNB + + if (enc_OER_Enum(enum_zero) == '00'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_EnumM(enumm_numM) == '12'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_EnumP(enumm_numP) == '8204D2'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_EnumB(enumm_numB) == '8300FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_EnumNM(enumm_numNM) == '82FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_EnumNB(enumm_numNB) == '83FF04D2'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Enum('00'O) == enum_zero) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumM('12'O) == enumm_numM) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumP('8204D2'O) == enumm_numP) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumB('8300FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumB('840000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);} + // if (dec_OER_EnumB('85000000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumNM('82FEED'O) == enumm_numNM) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumNB('83FF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_EnumNB('84FFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);} + // if (dec_OER_EnumNB('85FFFFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_BitStr() runs on Test_CT { + const BitStrEmpty empty := ''B + const BitStrRandom random := '111111101110110111111110111011011111111011101101111110'B + const BitStrAligned aligned := '111111101110110111111110111011011111111011101101'B + + if (enc_OER_BitStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_BitStrRandom(random) == 'FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_BitStrAligned(aligned) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (enc_OER_BitStr(empty) == '0100'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_BitStr(random) == '0802FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_BitStr(aligned) == '0700FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_BitStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_BitStrRandom('FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_BitStrAligned('FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_BitStr('0100'O) == empty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_BitStr('0802FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_BitStr('0700FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_OctetStr() runs on Test_CT { + const OctetStrEmpty empty := ''O + const OctetStrRandom random := 'FEEDFEEDFEED'O + + if (enc_OER_OctetStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_OctetStrRandom(random) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (enc_OER_OctetStr(empty) == '00'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_OctetStr(random) == '06FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_OctetStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_OctetStrRandom('FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_OctetStr('00'O) == empty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_OctetStr('06FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceEmpty() runs on Test_CT { + const SequenceEmpty empty := {} + const SequenceEmptyExtendable empty_extendable := {} + + if (enc_OER_SequenceEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceEmptyExtendable(empty_extendable) == '00'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceSimple() runs on Test_CT { + const SequenceSimple s := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O} + const SequenceSimpleExtendable s_ee := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O} + const SequenceSimpleExtended s_ed := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O,e2:='8888'O,e3:='7777'O} + const SequenceSimpleExtended s_ed100 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O} + const SequenceSimpleExtended s_ed010 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e2:='8888'O} + + if (enc_OER_SequenceSimple(s) == 'AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSimpleExtendable(s_ee) == '00AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSimpleExtended(s_ed) == '80AAAABBBBCCCC0205E0029999028888027777'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSimpleExtended(s_ed100) == '80AAAABBBBCCCC020580029999'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSimpleExtended(s_ed010) == '80AAAABBBBCCCC020540028888'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceSimple('AAAABBBBCCCC'O) == s) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceSimpleExtendable('00AAAABBBBCCCC'O) == s_ee) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC0205E0029999028888027777'O) == s_ed) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC020540028888'O).e2 == '8888'O) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceSomeOptional() runs on Test_CT { + const SequenceSomeOptional seqSO111 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O} + const SequenceSomeOptional seqSO110 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := omit} + const SequenceSomeOptional seqSO101 := {f1 := 'AAAA'O,f2 := omit, f3 := 'CCCC'O} + const SequenceSomeOptional seqSO100 := {f1 := 'AAAA'O,f2 := omit, f3 := omit} + + if (enc_OER_SequenceSomeOptional(seqSO111) == 'C0AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSomeOptional(seqSO110) == '80AAAABBBB'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSomeOptional(seqSO101) == '40AAAACCCC'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceSomeOptional(seqSO100) == '00AAAA'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceSomeOptional('C0AAAABBBBCCCC'O) == seqSO111) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceSomeOptional('80AAAABBBB'O) == seqSO110) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceSomeOptional('00AAAA'O) == seqSO100) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceAllOptional() runs on Test_CT { + const SequenceAllOptional seqSAO000 := {f1:=omit,f2:=omit,f3:=omit} + + if (enc_OER_SequenceAllOptional(seqSAO000) == '00'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceAllOptional('00'O) == seqSAO000) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceOptionalExtendable() runs on Test_CT { + const SequenceOptionalExtendable seqSOE110 := {f1:='FEED'O,f2:='FEED'O,f3:=omit} + const SequenceOptionalExtendable seqSOE011 := {f1:=omit,f2:='FEED'O,f3:='FEED'O} + + if (enc_OER_SequenceOptionalExtendable(seqSOE110) == '40FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceOptionalExtendable(seqSOE011) == '20FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceOptionalExtendable('40FEEDFEED'O) == seqSOE110) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceOptionalExtendable('20FEEDFEED'O) == seqSOE011) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceLongOptionalExtendable() runs on Test_CT { + const SequenceLongOptionalExtendable seq01 := { + f1:='FEED'O,f2:='FEED'O,f3:='FEED'O,f4:='FEED'O,f5:='FEED'O,f6:='FEED'O,f7:='FEED'O,f8:='FEED'O,f9:='FEED'O,f10:='FEED'O + } + const SequenceLongOptionalExtendable seq02 := { + f1:='FEED'O,f2:=omit,f3:='FEED'O,f4:=omit,f5:='FEED'O,f6:=omit,f7:='FEED'O,f8:=omit,f9:='FEED'O,f10:=omit + } + + if (enc_OER_SequenceLongOptionalExtendable(seq01) == '7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceLongOptionalExtendable(seq02) == '5540FEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceLongOptionalExtendable('7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) == seq01) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceLongOptionalExtendable('5540FEEDFEEDFEEDFEEDFEED'O) == seq02) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceOptionalExtended() runs on Test_CT { + const SequenceOptionalExtended seq01_enc := {f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O} + const SequenceOptionalExtended seq01_dec := {f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit} + const SequenceOptionalExtended seq02_enc := {f2:='FEED'O,f3:='FEED'O,e2:='FEED'O,e3:='FEED'O} + const SequenceOptionalExtended seq02_dec := {f1:=omit,f2:='FEED'O,f3:='FEED'O,e1:=omit,e2:='FEED'O,e3:='FEED'O} + + if (enc_OER_SequenceOptionalExtended(seq01_enc) == 'C0FEEDFEED0205C002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceOptionalExtended(seq02_enc) == 'A0FEEDFEED02056002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceOptionalExtended('C0FEEDFEED0205C002FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceOptionalExtended('A0FEEDFEED02056002FEED02FEED'O) == seq02_dec) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceLongOptionalExtended() runs on Test_CT { + const SequenceLongOptionalExtended seq01_enc := { + f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O,e4:='FEED'O,e5:='FEED'O,e7:='FEED'O,e8:='FEED'O + } + const SequenceLongOptionalExtended seq01_dec := { + f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit,e4:='FEED'O,e5:='FEED'O,e6:=omit,e7:='FEED'O,e8:='FEED'O,e9:=omit + } + + if (enc_OER_SequenceLongOptionalExtended(seq01_enc) == 'C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceLongOptionalExtended('C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_SequenceOfOctetString() runs on Test_CT { + const SequenceOfOctetString seqOfEmpty := {} + const SequenceOfOctetString seqOf := {'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O} + + if (enc_OER_SequenceOfOctetString(seqOfEmpty) == '0100'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_SequenceOfOctetString(seqOf) == '0106FEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_SequenceOfOctetString('0100'O) == seqOfEmpty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceOfOctetString('0106FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_SequenceOfOctetString('03000006FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);} +} + +testcase tc_OER_Choice() runs on Test_CT { + const Choice choice := {f:='FEED'O} + const ChoiceBis choice_bis := {f:='FEED'O} + const ChoiceTer choice_ter := {f:='FEED'O} + const ChoiceQuatro choice_quatro := {s:='FEED'O} + + if (enc_OER_Choice(choice) == '80FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_ChoiceBis(choice_bis) == 'AAFEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_ChoiceTer(choice_ter) == 'BF87C440FEED'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_ChoiceQuatro(choice_quatro) == 'AA02FEED'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Choice('80FEED'O) == choice) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_ChoiceBis('AAFEED'O) == choice_bis) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_ChoiceTer('BF87C440FEED'O) == choice_ter) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_ChoiceQuatro('AA02FEED'O) == choice_quatro) {setverdict(pass);} else {setverdict(fail);} + +} + +testcase tc_OER_Utf8() runs on Test_CT { + const Utf8 str_empty := "" + const Utf8 str := "May the force be with you." + + if (enc_OER_Utf8(str_empty) == '00'O) {setverdict(pass);} else {setverdict(fail);} + if (enc_OER_Utf8(str) == '1A4D61792074686520666F726365206265207769746820796F752E'O) {setverdict(pass);} else {setverdict(fail);} + + if (dec_OER_Utf8('00'O) == str_empty) {setverdict(pass);} else {setverdict(fail);} + if (dec_OER_Utf8('1A4D61792074686520666F726365206265207769746820796F752E'O) == str) {setverdict(pass);} else {setverdict(fail);} +} + +//********************************************* +// CONTROL PART +//********************************************* + +control { + execute(tc_OER_Null()); + execute(tc_OER_Bool()); + execute(tc_OER_Uint()); + execute(tc_OER_Uint8()); + execute(tc_OER_Uint16()); + execute(tc_OER_Uint32()); + execute(tc_OER_Uint64()); + execute(tc_OER_Int()); + execute(tc_OER_Sint8()); + execute(tc_OER_Sint16()); + execute(tc_OER_Sint32()); + execute(tc_OER_Sint64()); + execute(tc_OER_Enum()); + execute(tc_OER_BitStr()); + execute(tc_OER_OctetStr()); + execute(tc_OER_SequenceEmpty()); + execute(tc_OER_SequenceSimple()); + execute(tc_OER_SequenceSomeOptional()); + execute(tc_OER_SequenceAllOptional()); + execute(tc_OER_SequenceOptionalExtendable()); + execute(tc_OER_SequenceLongOptionalExtendable()); + execute(tc_OER_SequenceOptionalExtended()); + execute(tc_OER_SequenceLongOptionalExtended()); + execute(tc_OER_SequenceOfOctetString()); + execute(tc_OER_Choice()); + execute(tc_OER_Utf8()); +} + +<RESULT> + +Overall verdict: pass + +<END_TC> + diff --git a/function_test/OER_EncDec/Temp.cfg b/function_test/OER_EncDec/Temp.cfg new file mode 100644 index 0000000000000000000000000000000000000000..1462938a881fb12ed2d5baba5886dd5adc9104c3 --- /dev/null +++ b/function_test/OER_EncDec/Temp.cfg @@ -0,0 +1,20 @@ +############################################################################### +# Copyright (c) 2000-2018 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v2.0 +# which accompanies this distribution, and is available at +# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +# +# Contributors: +# Balasko, Jeno +# Hanko, Matyas +# +############################################################################### +[MODULE_PARAMETERS] +[LOGGING] +LogSourceInfo := Yes +Logfile := "Temp.log" +FileMask := LOG_ALL +ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | DEBUG_ENCDEC +[EXECUTE] +Temp diff --git a/function_test/OER_EncDec/run_test_itspki b/function_test/OER_EncDec/run_test_itspki new file mode 100755 index 0000000000000000000000000000000000000000..07fe41591b02952dfd85db1da8123890bec0f176 --- /dev/null +++ b/function_test/OER_EncDec/run_test_itspki @@ -0,0 +1,6 @@ +#!/bin/sh + +# Script parameters are coming from ../Makefile. +../Tools/SAtester $* ./OER_EncDec_ITSPKI.script +rm Temp.ttcn +rm TempA.asn diff --git a/function_test/OER_EncDec/run_test_personnel_record b/function_test/OER_EncDec/run_test_personnel_record new file mode 100755 index 0000000000000000000000000000000000000000..464f1a76f210156eaec32d8fc1eedb571d1b9a2d --- /dev/null +++ b/function_test/OER_EncDec/run_test_personnel_record @@ -0,0 +1,6 @@ +#!/bin/sh + +# Script parameters are coming from ../Makefile. +../Tools/SAtester $* ./ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script +rm Temp.ttcn +rm TempA.asn