TestCodec_Certificates.ttcn 62.4 KB
Newer Older
garciay's avatar
garciay committed
/*
 * @author
 *     
 * @version
 *     1.0
 * @desc
 *     
 * @remark
 *     
 * @see
 *     
 */ 
module TestCodec_Certificates {
  // LibCommon
  import from LibCommon_BasicTypesAndValues all;
  import from LibCommon_DataStrings all;
garciay's avatar
garciay committed
  
  // LibIts
  import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
  import from IEEE1609dot2 language "ASN.1:1997" all;
  import from EtsiTs103097Module language "ASN.1:1997" all;
  
  // LibItsSecurity
  import from LibItsSecurity_EncdecDeclarations all;
  import from LibItsSecurity_TypesAndValues all;
  import from LibItsSecurity_Templates all;
  import from LibItsSecurity_Functions all;
  import from LibItsSecurity_Pixits all;
garciay's avatar
garciay committed
  // TestCodec
  import from TestCodec_TestAndSystem all;
  
garciay's avatar
garciay committed
  /**
   * @desc Root certificate / NistP256
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_root_certificate_sha256_1() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var charstring v_certId := "STF538 Root Certificate";
    var HashAlgorithm v_self := sha256; // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 1
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
    var SequenceOfPsidSspRange v_certIssuePermissions := { // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 3
      valueof(m_psidSspRange(1)) 
garciay's avatar
garciay committed
    };
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var HashedId8 v_sha256AndDigest;
    var Oct32 v_sig := int2oct(0, 32);
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
garciay's avatar
garciay committed
      
    // Generate Private/Public keys
    f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
    // Fill Certificate template with the public compressed keys (canonical form)
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_self(v_self),
                                      m_toBeSignedCertificate_ca(
                                                              { name := v_certId },
                                                              v_appPermissions,
                                                              { 
                                                                m_psidGroupPermissions(
                                                                                       m_subjectPermissions_explicit(
                                                                                                                     v_certIssuePermissions
                                                                                                                     ))
                                                                },
                                                              m_verificationKeyIndicator_verificationKey( 
                                                                                                         m_publicVerificationKey_ecdsaNistP256(
garciay's avatar
garciay committed
                                                              m_validityPeriod(
                                                                               17469212,
                                                                               m_duration_years(10)
                                                                               )
                                                              )
                                      );
    // Encode it ==> Get octetstring
garciay's avatar
garciay committed
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate using ECDSA/SHA-256 (NIST p-256)
    // IEEE Std 1609.2-20XX Clause 5.3.1 ii) If the verification type is self-signed, signer identifier input shall be the empty string, i.e., a string of length 0.
    v_sig := f_signWithEcdsaNistp256WithSha256(bit2oct(v_encMsg), int2oct(0, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaNistP256(
                                                   m_ecdsaP256Signature(
                                                                        m_eccP256CurvePoint_x_only(
                                                                                                   substr(v_sig, 0, 32)
                                                                                                   ),
                                                                        substr(v_sig, 32, 32)
                                                                        )
                                                   );
garciay's avatar
garciay committed
    // Final certificate
  v_encMsg := encvalue(v_cert);
    setverdict(pass, "Encoding passed.");
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaNistp256WithSha256(
                                            bit2oct(v_encMsg), 
                                            int2oct(0, 32),
garciay's avatar
garciay committed
                                            v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig,
                                            v_publicKeyCompressed,
                                            v_compressedMode
garciay's avatar
garciay committed
                                            ) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
    } else {
      setverdict(pass)
garciay's avatar
garciay committed
      }
    
garciay's avatar
garciay committed
  } // End of testcase tc_root_certificate_sha256_1
   
  /**
   * @desc Root certificate / BrainpoolP256
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_root_certificate_sha256_2() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var charstring v_certId := "STF538 Root Certificate";
    var HashAlgorithm v_self := sha256; // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 1
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
    var SequenceOfPsidSspRange v_certIssuePermissions := { // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 3
      valueof(m_psidSspRange(1)) 
garciay's avatar
garciay committed
    };
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var HashedId8 v_sha256AndDigest;
    var Oct32 v_sig := int2oct(0, 32);
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
garciay's avatar
garciay committed
      
    // Generate Private/Public keys
    f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
    // Fill Certificate template with the public key using canonical form
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_self(v_self),
                                      m_toBeSignedCertificate_ca(
garciay's avatar
garciay committed
                                                              { name := v_certId },
                                                              v_appPermissions,
                                                              { 
                                                                m_psidGroupPermissions(
                                                                                       m_subjectPermissions_explicit(
                                                                                                                     v_certIssuePermissions
                                                                                                                     ))
                                                                },
                                                              m_verificationKeyIndicator_verificationKey( 
                                                                                                         m_publicVerificationKey_ecdsaBrainpoolP256r1(
                                                                                                                                                      v_eccPoint
                                                                                                                                                      )),
garciay's avatar
garciay committed
                                                              m_validityPeriod(
                                                                               17469212,
                                                                               m_duration_years(10)
                                                                               )
                                                                 )
garciay's avatar
garciay committed
                                      );
    // Encode it ==> Get octetstring
garciay's avatar
garciay committed
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate using ECDSA/SHA-256 (NIST p-256)
    v_sig := f_signWithEcdsaBrainpoolp256WithSha256(bit2oct(v_encMsg), int2oct(0, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaBrainpoolP256r1(
                                                          m_ecdsaP256Signature(
                                                                               m_eccP256CurvePoint_x_only(
                                                                                                          substr(v_sig, 0, 32)
                                                                                                          ),
                                                                               substr(v_sig, 32, 32)
                                                                               )
                                                          );
garciay's avatar
garciay committed
    // Final certificate
  v_encMsg := encvalue(v_cert);
    setverdict(pass, "Encoding passed.");
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaBrainpoolp256WithSha256(
                                                 bit2oct(v_encMsg), 
                                                 int2oct(0, 32),
garciay's avatar
garciay committed
                                                 v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.rSig.x_only & v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.sSig,
                                                 v_publicKeyCompressed,
                                                 v_compressedMode
garciay's avatar
garciay committed
                                                 ) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
    } else {
      setverdict(pass)
garciay's avatar
garciay committed
      }
    
garciay's avatar
garciay committed
  } // End of testcase tc_root_certificate_sha256_2
   
  /**
   * @desc Root certificate / BrainpoolP256
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_root_certificate_sha256_3() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var charstring v_certId := "STF538 Root Certificate";
    var HashAlgorithm v_self := sha256; // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 1
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
    var SequenceOfPsidSspRange v_certIssuePermissions := { // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 3
      valueof(m_psidSspRange(1)) 
    };
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var Oct32 v_enc_private_key := int2oct(0, 32);
    var Oct32 v_enc_publicKeyX := int2oct(0, 32);
    var Oct32 v_enc_publicKeyY := int2oct(0, 32);
    var Oct32 v_enc_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
    var integer v_enc_compressedMode;
    var HashedId8 v_sha256AndDigest;
    var Oct32 v_sig := int2oct(0, 32);
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
      
    // Generate Private/Public keys for signature
    f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
    // Generate Private/Public keys for encryption
    f_generate_key_pair_brainpoolp256(v_enc_private_key, v_enc_publicKeyX, v_enc_publicKeyY, v_enc_publicKeyCompressed, v_enc_compressedMode);
    // Fill Certificate template with the public key      
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_self(v_self),
                                      m_toBeSignedCertificate_ca(
                                                                 { name := v_certId },
                                                                 v_appPermissions,
                                                                 { 
                                                                   m_psidGroupPermissions(
                                                                                          m_subjectPermissions_explicit(
                                                                                                                        v_certIssuePermissions
                                                                                                                        ))
                                                                   },
                                                                 m_verificationKeyIndicator_verificationKey( 
                                                                                                            m_publicVerificationKey_ecdsaBrainpoolP256r1(
                                                                                                                                                         v_eccPoint
                                                                                                                                                         )),
                                                                 m_validityPeriod(
                                                                                  17469212,
                                                                                  m_duration_years(10)
                                                                                  ),
                                                                 -, -, 
                                                                 m_encryptionKey(
                                                                                 aes128Ccm, 
                                                                                 m_publicEncryptionKey_eciesBrainpoolP256r1(                                                                                                                                                                       m_eccP256CurvePoint_uncompressed(
                                                                                                                                                                                                                                                                                                                                    v_enc_publicKeyX,
                                                                                                                                                                                                                                                                                                                                    v_enc_publicKeyY
                                                                                                                                                                                                                                                                                                                                    )
                                                                                                                                                                                                                                                                                                   )
                                                                                 )
                                                                 )
                                      );
    // Encode it ==> Get octetstring
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
    // Sign the certificate using ECDSA/SHA-256 (NIST p-256)
    v_sig := f_signWithEcdsaBrainpoolp256WithSha256(bit2oct(v_encMsg), int2oct(0, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaBrainpoolP256r1(
                                                          m_ecdsaP256Signature(
                                                                               m_eccP256CurvePoint_x_only(
                                                                                                          substr(v_sig, 0, 32)
                                                                                                          ),
                                                                               substr(v_sig, 32, 32)
                                                                               )
                                                          );
    // Final certificate
  v_encMsg := encvalue(v_cert);
    setverdict(pass, "Encoding passed.");
    // Decode and check signature
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_1;
    }
    if (f_verifyWithEcdsaBrainpoolp256WithSha256(
                                                 bit2oct(v_encMsg), 
                                                 int2oct(0, 32),
                                                 v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.rSig.x_only & v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.sSig,
                                                 v_publicKeyCompressed,
                                                 v_compressedMode
                                                 ) == false) {
      setverdict(fail);
    } else {
      setverdict(pass)
      }
    
  } // End of testcase tc_root_certificate_sha256_3
   
garciay's avatar
garciay committed
  /**
   * @desc Root certificate / BrainpoolP284
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_root_certificate_sha384_1() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var charstring v_certId := "STF538 Root Certificate";
    var HashAlgorithm v_self := sha384; // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 1
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
    var SequenceOfPsidSspRange v_certIssuePermissions := { // ETSI TS 103 097 V1.3.1 Clause 7.2.3 Root CA certificates Bullet 3
      valueof(m_psidSspRange(1)) 
garciay's avatar
garciay committed
    };
    var Oct48 v_private_key := int2oct(0, 48);
    var Oct48 v_publicKeyX := int2oct(0, 48);
    var Oct48 v_publicKeyY := int2oct(0, 48);
    var Oct48 v_publicKeyCompressed := int2oct(0, 48);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var HashedId8 v_sha256AndDigest;
    var Oct48 v_sig := int2oct(0, 48);
    var bitstring v_encMsg := ''B;
    var EccP384CurvePoint v_eccPoint;
garciay's avatar
garciay committed
      
    // Generate Private/Public keys
    f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP384CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP384CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
    // Fill Certificate template with the public key      
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_self(v_self),
                                      m_toBeSignedCertificate_ca(
                                                                  { name := v_certId },
                                                                  v_appPermissions,
                                                                  { 
                                                                    m_psidGroupPermissions(
                                                                                           m_subjectPermissions_explicit(
                                                                                                                         v_certIssuePermissions
                                                                                                                         ))
                                                                    },
                                                                  m_verificationKeyIndicator_verificationKey(
                                                                                                             m_publicVerificationKey_ecdsaBrainpoolP384r1(
                                                                                                                                                          v_eccPoint
                                                                                                                                                          )),
garciay's avatar
garciay committed
                                                                  m_validityPeriod(
                                                                                   17469212,
                                                                                   m_duration_years(10)
                                                                                   )
                                                                 )
    // Encode it ==> Get octetstring
garciay's avatar
garciay committed
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate
    v_sig := f_signWithEcdsaBrainpoolp384WithSha384(bit2oct(v_encMsg), int2oct(0, 48), v_private_key);
    if (lengthof(v_sig) != 96) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaBrainpoolP384r1(
                                                          m_ecdsaP384Signature(
                                                                               m_eccP384CurvePoint_x_only(
                                                                                                          substr(v_sig, 0, 48)
                                                                                                          ),
                                                                               substr(v_sig, 48, 48)
                                                                               )
                                                          );
garciay's avatar
garciay committed
    // Final certificate
  v_encMsg := encvalue(v_cert);
    setverdict(pass, "Encoding passed.");
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP384r1.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaBrainpoolp384WithSha384(
                                                 bit2oct(v_encMsg), 
                                                 int2oct(0, 48),
                                                 v_cert_dec.signature_.ecdsaBrainpoolP384r1Signature.rSig.x_only & v_cert_dec.signature_.ecdsaBrainpoolP384r1Signature.sSig,
                                                 v_publicKeyCompressed,
                                                 v_compressedMode
garciay's avatar
garciay committed
                                                 ) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
    } else {
      setverdict(pass)
    }

  } // End of testcase tc_root_certificate_sha384_1
   
  /**
   * @desc EA certificate / NistP256
garciay's avatar
garciay committed
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_ea_certificate_sha256_1() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var charstring v_certId := "STF538 EA Certificate"; // ETSI TS 103 097 V1.3.1 Clause 7.2.2 Enrolment credential #5
    var HashedId8 v_sha256AndDigest := f_HashedId8FromSha256(f_hashWithSha256('616263'O)); // ETSI TS 103 097 V1.3.1 Clause 7.2.2 Enrolment credential #2
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := 'FF0001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := 'FF0001'O })) 
    };
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var Oct32 v_sig := int2oct(0, 32);
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
garciay's avatar
garciay committed
      
    // Generate Private/Public keys
    f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
    // Fill Certificate template with the public key      
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_sha256AndDigest(v_sha256AndDigest),
                                      m_toBeSignedCertificate_ea(
                                                                 { name := v_certId },
                                                                 v_appPermissions,
                                                                 m_verificationKeyIndicator_verificationKey(
garciay's avatar
garciay committed
                                                                                                            m_publicVerificationKey_ecdsaNistP256(
                                                                 m_validityPeriod(
                                                                                  17469212,
                                                                                  m_duration_years(10)
                                                                                  ),
                                                                 m_geographicRegion_identifiedRegion(
                                                                                                     {
                                                                                                       m_identifiedRegion_country_only(12), 
                                                                                                       m_identifiedRegion_country_only(34)
                                                                                                     }
                                                                                                     )
                                                                 )
garciay's avatar
garciay committed
                                      );
    // Encode it ==> Get octetstring
    log("Encode template ", valueof(v_cert));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate using ECDSA/SHA-256 (NIST p-256)
    v_sig := f_signWithEcdsaNistp256WithSha256(bit2oct(v_encMsg), int2oct(10, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaNistP256(
                                                   m_ecdsaP256Signature(
                                                                        m_eccP256CurvePoint_x_only(
                                                                                                   substr(v_sig, 0, 32)
                                                                                                   ),
                                                                        substr(v_sig, 32, 32)
                                                                        )
                                                   );
garciay's avatar
garciay committed
    // Final certificate
  v_encMsg := encvalue(v_cert);
      
    setverdict(pass, "Encoding passed.");
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaNistp256WithSha256(
                                            bit2oct(v_encMsg), 
                                            int2oct(10, 32),
garciay's avatar
garciay committed
                                            v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig,
                                            v_publicKeyCompressed,
                                            v_compressedMode
garciay's avatar
garciay committed
                                           ) == false) {
      setverdict(fail);
    } else {
      setverdict(pass)
    }

  } // End of testcase tc_ea_certificate_sha256_1
   
garciay's avatar
garciay committed
  /**
   * @desc Authorisation Ticket certificate
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_at_certificate_sha256_1() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
garciay's avatar
garciay committed
    var EtsiTs103097Certificate v_cert_dec; 
garciay's avatar
garciay committed
    var HashedId8 v_sha256AndDigest := f_HashedId8FromSha256(f_hashWithSha256('616263'O)); // ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets #2
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
garciay's avatar
garciay committed
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var Oct32 v_sig := int2oct(0, 32);
garciay's avatar
garciay committed
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
garciay's avatar
garciay committed

    if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
      stop;
    }
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_sha256AndDigest(v_sha256AndDigest),
                                      m_toBeSignedCertificate_at(
                                                                 v_appPermissions,
                                                                 m_verificationKeyIndicator_verificationKey(
garciay's avatar
garciay committed
                                                                                                            m_publicVerificationKey_ecdsaNistP256(
garciay's avatar
garciay committed
                                                                 m_validityPeriod(
                                                                                  17469212,
                                                                                  m_duration_years(10)
                                                                                  ),
                                                                 m_geographicRegion_identifiedRegion(
                                                                                                     {
                                                                                                       m_identifiedRegion_country_only(12), 
                                                                                                       m_identifiedRegion_country_only(34)
                                                                                                       }
                                                                                                     )
garciay's avatar
garciay committed
                                                                )
                                     );
    // Encode it ==> Get octetstring
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate using ECDSA/SHA-256 (NIST p-256)
    v_sig := f_signWithEcdsaNistp256WithSha256(bit2oct(v_encMsg), int2oct(11, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaNistP256(
                                                   m_ecdsaP256Signature(
                                                                        m_eccP256CurvePoint_x_only(
                                                                                                   substr(v_sig, 0, 32)
                                                                                                   ),
                                                                        substr(v_sig, 32, 32)
                                                                        )
                                                   );
garciay's avatar
garciay committed
    // Final certificate
garciay's avatar
garciay committed
    v_encMsg := TestEtsiTs103097Certificate(v_cert, false);
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
      setverdict(fail);
      stop;
    }
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaNistp256WithSha256(
                                            bit2oct(v_encMsg), 
                                            int2oct(11, 32),
garciay's avatar
garciay committed
                                            v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig,
                                            v_publicKeyCompressed,
                                            v_compressedMode
garciay's avatar
garciay committed
                                           ) == false) {
      setverdict(fail);
    } else {
      setverdict(pass)
    }

garciay's avatar
garciay committed
  } // End of testcase tc_at_certificate_sha256_1
   
  /**
   * @desc Authorisation Ticket certificate
   * @see ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets
   */
  testcase tc_at_certificate_sha256_2() runs on TCType system TCType {
    var template (value) EtsiTs103097Certificate v_cert; // ETSI TS 103 097 V1.3.1 Clause 6 Bullet 1
    var EtsiTs103097Certificate v_cert_dec; 
    var HashedId8 v_sha256AndDigest := f_HashedId8FromSha256(f_hashWithSha256('616263'O)); // ETSI TS 103 097 V1.3.1 Clause 7.2.1 Authorization tickets #2
    var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
      valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
      valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
    };
    var SequenceOfPsidSspRange v_certRequestPermissions := { 
garciay's avatar
garciay committed
      valueof(m_psidSspRange(2)) 
    };
garciay's avatar
garciay committed
    var Oct32 v_private_key := int2oct(0, 32);
    var Oct32 v_publicKeyX := int2oct(0, 32);
    var Oct32 v_publicKeyY := int2oct(0, 32);
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var integer v_compressedMode;
garciay's avatar
garciay committed
    var Oct32 v_sig := int2oct(0, 32);
garciay's avatar
garciay committed
    var bitstring v_encMsg := ''B;
    var EccP256CurvePoint v_eccPoint;
    if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
      stop;
    }
    if (v_compressedMode == 0) {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_0(v_publicKeyCompressed));
    } else {
      v_eccPoint := valueof(m_eccP256CurvePoint_compressed_y_1(v_publicKeyCompressed));
    }
garciay's avatar
garciay committed
  v_cert := m_etsiTs103097Certificate(
                                      m_issuerIdentifier_sha256AndDigest(v_sha256AndDigest),
                                      m_toBeSignedCertificate_at(
                                                                 v_appPermissions,
                                                                 m_verificationKeyIndicator_verificationKey(
                                                                                                            m_publicVerificationKey_ecdsaBrainpoolP256r1(
                                                                                                                                                         v_eccPoint
                                                                                                                                                         )),
garciay's avatar
garciay committed
                                                                 m_validityPeriod(
                                                                                  17469212,
                                                                                  m_duration_years(10)
                                                                                  )
                                                                )
                                     );
    // Encode it ==> Get octetstring
    log("Encode template ", valueof(v_cert.toBeSigned));
    v_encMsg := encvalue(v_cert.toBeSigned);
garciay's avatar
garciay committed
    // Sign the certificate using ECDSA/SHA-256 (BP p-256)
    v_sig := f_signWithEcdsaBrainpoolp256WithSha256(bit2oct(v_encMsg), int2oct(10, 32), v_private_key);
    if (lengthof(v_sig) != 64) {
      log("Invalid signature: ", v_sig);
      setverdict(fail);
    }
    v_cert.signature_ := m_signature_ecdsaBrainpoolP256r1(
                                                          m_ecdsaP256Signature(
                                                                               m_eccP256CurvePoint_x_only(
                                                                                                          substr(v_sig, 0, 32)
                                                                                                          ),
                                                                               substr(v_sig, 32, 32)
                                                                               )
                                                          );
garciay's avatar
garciay committed
    // Final certificate
garciay's avatar
garciay committed
  v_encMsg := TestEtsiTs103097Certificate(v_cert, false);
    // Decode and check signature
garciay's avatar
garciay committed
    if (decvalue(v_encMsg, v_cert_dec) != 0) {
garciay's avatar
garciay committed
      setverdict(fail);
      stop;
    }
garciay's avatar
garciay committed
    v_encMsg := encvalue(v_cert_dec.toBeSigned);
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaBrainpoolP256r1.compressed_y_1;
    }
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaBrainpoolp256WithSha256(
garciay's avatar
garciay committed
                                                 bit2oct(v_encMsg), 
                                                 int2oct(10, 32),
garciay's avatar
garciay committed
                                                 v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.rSig.x_only & v_cert_dec.signature_.ecdsaBrainpoolP256r1Signature.sSig,
                                                 v_publicKeyCompressed,
                                                 v_compressedMode
                                                 ) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
    } else {
      setverdict(pass)
    }

  } // End of testcase tc_at_certificate_sha256_2
garciay's avatar
garciay committed
   
  testcase tc_at_certificate_sha256_3() runs on TCType system TCType {
    var octetstring v_enc_msg := '80030080EAF64113B8B74C6610810D434552545F4955545F415F415400000000005A497A008410E001038001248104038300018001258104038300018002008D8104038300018080849574CBDD2E471BA599CD99E4C350C415761B368D82BB9D9D7BE202A16E69CE41276EEC554EEBC2EFFC12B15132BD8398CB58BB7CE47B1AEB1238FA6F741C469280809BD2B881DBD1ABD7B997A1C55E7F2E55E305F7351CA7514765C900371B4D3DD1C52B8C4613FA8B54754B56B73B1B61E452A99F3B3EB7A37F7BE3FDC0F804BF96'O;
    var EtsiTs103097Certificate v_decMsg;
    var bitstring v_encMsg;
    var integer v_res;

    v_encMsg := oct2bit(v_enc_msg);
    v_res := decvalue(v_encMsg, v_decMsg);
    log("Decoded message: ", v_decMsg);
    setverdict(pass);
  } // End of testcase tc_at_certificate_sha256_3
   
garciay's avatar
garciay committed
  testcase tc_certificate_asn1c_1() runs on TCType system TCType { // CERT_IUT_A_RCA
garciay's avatar
garciay committed
    const octetstring c_cert := '8003008100288300000000001874e3808466a8c001018080010e80012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d0001600001610001620001630001640001650001660102808083a72b88b6a1adeeba7fc18772952f053a81bd18635ee5ab08ed1376c107b541398080c0290e397381bf7502a0e6a6b271d8e2f18fc8311f591f0528a673ee5169f670e224ac455b5e67eb251cc1467f6ffc6840987c8c8eb9245c22be73322b64ca54'O; // CERT_IUT_A_RCA.oer
garciay's avatar
garciay committed
    var EtsiTs103097Certificate v_cert_dec;
garciay's avatar
garciay committed
    var Oct32 v_private_key := 'd79ef1d533b0385463a5d15708e94ff4f0d281cccbef504acd3afbb82dc0499f'O; // CERT_IUT_A_RCA.vkey
garciay's avatar
garciay committed
    var bitstring v_enc_msg := oct2bit(c_cert);
garciay's avatar
garciay committed
    var integer v_compressedMode;
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
garciay's avatar
garciay committed
    var Oct32 v_sig := int2oct(0, 32);
garciay's avatar
garciay committed
    var EtsiTs103097Certificate v_cert_exp := {
    version := 3,
    type_ := explicit,
    issuer := {
      self_ := sha256
    },
    toBeSigned := {
garciay's avatar
garciay committed
      id := {
        none_ := NULL
      },
      cracaId := '000000'O,
      crlSeries := 0,
      validityPeriod := {
        start_ := 410313600,
        duration := {
          hours := 26280
        }
      },
      region := omit,
      assuranceLevel := 'C0'O,
      appPermissions := omit,
      certIssuePermissions := {
          {
          subjectPermissions := {
            explicit := {
              {
              psid := 36,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFF'O,
                  sspBitmask := '01FFFF'O
                }
              }
              },
              {
              psid := 37,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFFFF'O,
                  sspBitmask := '01FFFFFF'O
                }
              }
              },
              {
              psid := 137,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFFFF'O,
                  sspBitmask := '01FFFFFF'O
garciay's avatar
garciay committed
                }
garciay's avatar
garciay committed
              }
              },
              {
              psid := 138,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFFFF'O,
                  sspBitmask := '01FFFFFF'O
                }
              }
              },
              {
              psid := 139,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFFFF'O,
                  sspBitmask := '01FFFFFF'O
                }
              }
              },
              {
              psid := 140,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFFFF'O,
                  sspBitmask := '01FFFFFF'O
                }
              }
              },
              {
              psid := 141,
              sspRange := omit
              },
              {
              psid := 96,
              sspRange := omit
              },
              {
              psid := 97,
              sspRange := omit
              },
              {
              psid := 98,
              sspRange := omit
              },
              {
              psid := 99,
              sspRange := omit
              },
              {
              psid := 100,
              sspRange := omit
              },
              {
              psid := 101,
              sspRange := omit
              },
              {
              psid := 102,
              sspRange := omit
garciay's avatar
garciay committed
              }
garciay's avatar
garciay committed
            }
garciay's avatar
garciay committed
          },
garciay's avatar
garciay committed
          minChainLength := 2,
garciay's avatar
garciay committed
          chainLengthRange := 0,
          eeType := '00000000'B
          }
      },
      certRequestPermissions := omit,
      canRequestRollover := omit,
      encryptionKey := omit,
      verifyKeyIndicator := {
        verificationKey := {
          ecdsaNistP256 := {
garciay's avatar
garciay committed
            compressed_y_1 := 'A72B88B6A1ADEEBA7FC18772952F053A81BD18635EE5AB08ED1376C107B54139'O
garciay's avatar
garciay committed
          }
garciay's avatar
garciay committed
        }
garciay's avatar
garciay committed
      }
garciay's avatar
garciay committed
    },
    signature_ := {
garciay's avatar
garciay committed
      ecdsaNistP256Signature := {
        rSig := {
garciay's avatar
garciay committed
          x_only := 'C0290E397381BF7502A0E6A6B271D8E2F18FC8311F591F0528A673EE5169F670'O
garciay's avatar
garciay committed
        },
garciay's avatar
garciay committed
        sSig := 'E224AC455B5E67EB251CC1467F6FFC6840987C8C8EB9245C22BE73322B64CA54'O
garciay's avatar
garciay committed
      }
garciay's avatar
garciay committed
    var integer v_res := decvalue(v_enc_msg, v_cert_dec);
garciay's avatar
garciay committed
      log("Decoded message: ", v_cert_dec);
garciay's avatar
garciay committed
      setverdict(pass, "Decoded succeed");
      if (not(match(v_cert_exp, v_cert_dec))) {
        setverdict(fail, "Templates mismatch");
garciay's avatar
garciay committed
        stop;
garciay's avatar
garciay committed
      } else {
        setverdict(pass, "Templates match");
garciay's avatar
garciay committed
      }
garciay's avatar
garciay committed
        setverdict(fail, "Decoding failed");
garciay's avatar
garciay committed
    
garciay's avatar
garciay committed
    if (ischosen(v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
      v_compressedMode := 0;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0;
    } else {
      v_compressedMode := 1;
      v_publicKeyCompressed := v_cert_dec.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1;
    }
    v_enc_msg := encvalue(v_cert_dec.toBeSigned);
garciay's avatar
garciay committed
    if (f_verifyWithEcdsaNistp256WithSha256(
                                            int2oct(0, 32),
garciay's avatar
garciay committed
                                            v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig,
                                            v_publicKeyCompressed,
                                            v_compressedMode
                                            ) == false) {
garciay's avatar
garciay committed
      setverdict(fail);
    } else {
      setverdict(pass)
    }
garciay's avatar
garciay committed
  } // End of testcase tc_certificate_asn1c_1
garciay's avatar
garciay committed
  testcase tc_certificate_asn1c_2() runs on TCType system TCType { // CERT_IUT_A_RCA
    const octetstring c_cert := '8003008100698300000000001874e3808466a88101011a0645a1042d654819f89082043b1a67c001018080010780012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d0102008082192b5056fe5fa1a79adfb78ab5c447d0933fafee21f8480fe5569f96a0df648a808083ffd7a5af269b7efc295f2bcea8318e5dd91f44e630919aa627118f31dceaad6c808057c070cdd563033c3c969677876275df7a06fb8ade9d48d715e6fc0b0b8d53e2f086c3de0ffc7d9531f965f5a2d321ca802cb4b0f3552025ebcb4081ced7f473'O; // CERT_IUT_C_RCA.oer
    var EtsiTs103097Certificate v_cert_dec;
    var Oct32 v_private_key := 'e04336196816a49ac1dc7d39252ee4a90a5c0a3b243645ee84d5acd0aa161c7e'O; // CERT_IUT_C_RCA.vkey
    var Oct32 v_enc_private_key := 'f393bce9c68abbdd733e1ba9766ac11ce407a90e295d130c6cc6d8a61624be93'O; // CERT_IUT_C_RCA.ekey
    var bitstring v_enc_msg := oct2bit(c_cert);
    var integer v_compressedMode;
    var Oct32 v_publicKeyCompressed := int2oct(0, 32);
    var Oct32 v_sig := int2oct(0, 32);
    var EtsiTs103097Certificate v_cert_exp := {
    version := 3,
    type_ := explicit,
    issuer := {
      self_ := sha256
    },
    toBeSigned := {
      id := {
        none_ := NULL
      },
      cracaId := '000000'O,
      crlSeries := 0,
      validityPeriod := {
        start_ := 410313600,
        duration := {
          hours := 26280
        }
      },
      region := {
        rectangularRegion := {
          {
          northWest := {
            latitude := 436618657,
            longitude := 70083912
          },
          southEast := {
            latitude := 435720322,
            longitude := 70982247
          }
          }
        }
      },
      assuranceLevel := 'C0'O,
      appPermissions := omit,
      certIssuePermissions := {
          {
          subjectPermissions := {
            explicit := {
              {
              psid := 36,
              sspRange := {
                bitmapSspRange := {
                  sspValue := '01FFFF'O,
                  sspBitmask := '01FFFF'O
                }
              }
              },
              {
              psid := 37,
              sspRange := {
                bitmapSspRange := {