/* * @author * * @version * 1.0 * @desc * * @remark * * @see * */ module TestCodec_Certificates { // LibCommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; // 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; // TestCodec import from TestCodec_TestAndSystem all; /** * @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)) }; 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; var HashedId8 v_sha256AndDigest; var Oct32 v_sig := int2oct(0, 32); var bitstring v_encMsg := ''B; var EccP256CurvePoint v_eccPoint; // 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)); } 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( v_eccPoint )), m_validityPeriod( 17469212, m_duration_years(10) ) ) ); // 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) // 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) ) ); // 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.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; } if (f_verifyWithEcdsaNistp256WithSha256( bit2oct(v_encMsg), int2oct(0, 32), v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig, v_publicKeyCompressed, v_compressedMode ) == false) { setverdict(fail); } else { setverdict(pass) } } // 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)) }; 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; var HashedId8 v_sha256AndDigest; var Oct32 v_sig := int2oct(0, 32); var bitstring v_encMsg := ''B; var EccP256CurvePoint v_eccPoint; // 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)); } 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) ) ) ); // 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_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 /** * @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)) }; 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; var HashedId8 v_sha256AndDigest; var Oct48 v_sig := int2oct(0, 48); var bitstring v_encMsg := ''B; var EccP384CurvePoint v_eccPoint; // 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)); } // 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 )), m_validityPeriod( 17469212, m_duration_years(10) ) ) ); // Encode it ==> Get octetstring log("Encode template ", valueof(v_cert.toBeSigned)); v_encMsg := encvalue(v_cert.toBeSigned); // 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) ) ); // 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.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; } 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 ) == false) { setverdict(fail); } else { setverdict(pass) } } // End of testcase tc_root_certificate_sha384_1 /** * @desc EA certificate / NistP256 * @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; var Oct32 v_sig := int2oct(0, 32); var bitstring v_encMsg := ''B; var EccP256CurvePoint v_eccPoint; // 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)); } // 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( m_publicVerificationKey_ecdsaNistP256( v_eccPoint )), m_validityPeriod( 17469212, m_duration_years(10) ), m_geographicRegion_identifiedRegion( { m_identifiedRegion_country_only(12), m_identifiedRegion_country_only(34) } ) ) ); // Encode it ==> Get octetstring log("Encode template ", valueof(v_cert)); v_encMsg := encvalue(v_cert.toBeSigned); // 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) ) ); // 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.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; } if (f_verifyWithEcdsaNistp256WithSha256( bit2oct(v_encMsg), int2oct(10, 32), v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig, v_publicKeyCompressed, v_compressedMode ) == false) { setverdict(fail); } else { setverdict(pass) } } // End of testcase tc_ea_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_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 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 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; var Oct32 v_sig := int2oct(0, 32); var bitstring v_encMsg := ''B; var EccP256CurvePoint v_eccPoint; if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode) == false) { 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)); } v_cert := m_etsiTs103097Certificate( m_issuerIdentifier_sha256AndDigest(v_sha256AndDigest), m_toBeSignedCertificate_at( v_appPermissions, m_verificationKeyIndicator_verificationKey( m_publicVerificationKey_ecdsaNistP256( v_eccPoint )), m_validityPeriod( 17469212, m_duration_years(10) ), m_geographicRegion_identifiedRegion( { m_identifiedRegion_country_only(12), m_identifiedRegion_country_only(34) } ) ) ); // 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_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) ) ); // Final certificate v_encMsg := TestEtsiTs103097Certificate(v_cert, false); // 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.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; } if (f_verifyWithEcdsaNistp256WithSha256( bit2oct(v_encMsg), int2oct(11, 32), v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig, v_publicKeyCompressed, v_compressedMode ) == false) { setverdict(fail); } else { setverdict(pass) } } // 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 := { valueof(m_psidSspRange(2)) }; 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; var Oct32 v_sig := int2oct(0, 32); 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) { 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)); } v_cert := m_etsiTs103097Certificate( m_issuerIdentifier_sha256AndDigest(v_sha256AndDigest), m_toBeSignedCertificate_at( v_appPermissions, m_verificationKeyIndicator_verificationKey( m_publicVerificationKey_ecdsaBrainpoolP256r1( v_eccPoint )), m_validityPeriod( 17469212, m_duration_years(10) ) ) ); // Encode it ==> Get octetstring log("Encode template ", valueof(v_cert.toBeSigned)); v_encMsg := encvalue(v_cert.toBeSigned); // 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) ) ); // Final certificate v_encMsg := TestEtsiTs103097Certificate(v_cert, false); // 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(10, 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_at_certificate_sha256_2 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 testcase tc_certificate_asn1c_1() runs on TCType system TCType { // CERT_IUT_A_RCA const octetstring c_cert := '8003008100288300000000001874e3808466a8c001018080010e80012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d0001600001610001620001630001640001650001660102808083a72b88b6a1adeeba7fc18772952f053a81bd18635ee5ab08ed1376c107b541398080c0290e397381bf7502a0e6a6b271d8e2f18fc8311f591f0528a673ee5169f670e224ac455b5e67eb251cc1467f6ffc6840987c8c8eb9245c22be73322b64ca54'O; // CERT_IUT_A_RCA.oer var EtsiTs103097Certificate v_cert_dec; var Oct32 v_private_key := 'd79ef1d533b0385463a5d15708e94ff4f0d281cccbef504acd3afbb82dc0499f'O; // CERT_IUT_A_RCA.vkey 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 := 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 } } }, { 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 } } }, minChainLength := 2, chainLengthRange := 0, eeType := '00000000'B } }, certRequestPermissions := omit, canRequestRollover := omit, encryptionKey := omit, verifyKeyIndicator := { verificationKey := { ecdsaNistP256 := { compressed_y_1 := 'A72B88B6A1ADEEBA7FC18772952F053A81BD18635EE5AB08ED1376C107B54139'O } } } }, signature_ := { ecdsaNistP256Signature := { rSig := { x_only := 'C0290E397381BF7502A0E6A6B271D8E2F18FC8311F591F0528A673EE5169F670'O }, sSig := 'E224AC455B5E67EB251CC1467F6FFC6840987C8C8EB9245C22BE73322B64CA54'O } } }; var integer v_res := decvalue(v_enc_msg, v_cert_dec); if (v_res == 0) { log("Decoded message: ", v_cert_dec); setverdict(pass, "Decoded succeed"); if (not(match(v_cert_exp, v_cert_dec))) { setverdict(fail, "Templates mismatch"); stop; } else { setverdict(pass, "Templates match"); } } else { setverdict(fail, "Decoding failed"); } 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); if (f_verifyWithEcdsaNistp256WithSha256( bit2oct(v_enc_msg), int2oct(0, 32), v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig, v_publicKeyCompressed, v_compressedMode ) == false) { setverdict(fail); } else { setverdict(pass) } } // End of testcase tc_certificate_asn1c_1 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 := { sspValue := '01FFFFFF'O, sspBitmask := '01FFFFFF'O } } }, { psid := 137, sspRange := { bitmapSspRange := { sspValue := '01FFFFFF'O, sspBitmask := '01FFFFFF'O } } }, { 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 } } }, minChainLength := 2, chainLengthRange := 0, eeType := '00000000'B } }, certRequestPermissions := omit, canRequestRollover := omit, encryptionKey := { supportedSymmAlg := aes128Ccm, publicKey := { eciesNistP256 := { compressed_y_0 := '192B5056FE5FA1A79ADFB78AB5C447D0933FAFEE21F8480FE5569F96A0DF648A'O } } }, verifyKeyIndicator := { verificationKey := { ecdsaNistP256 := { compressed_y_1 := 'FFD7A5AF269B7EFC295F2BCEA8318E5DD91F44E630919AA627118F31DCEAAD6C'O } } } }, signature_ := { ecdsaNistP256Signature := { rSig := { x_only := '57C070CDD563033C3C969677876275DF7A06FB8ADE9D48D715E6FC0B0B8D53E2'O }, sSig := 'F086C3DE0FFC7D9531F965F5A2D321CA802CB4B0F3552025EBCB4081CED7F473'O } } }; var integer v_res := decvalue(v_enc_msg, v_cert_dec); if (v_res == 0) { log("Decoded message: ", v_cert_dec); setverdict(pass, "Decoded succeed"); log(match(v_cert_exp, v_cert_dec)); if (not(match(v_cert_exp, v_cert_dec))) { setverdict(fail, "Templates mismatch"); stop; } else { setverdict(pass, "Templates match"); } } else { setverdict(fail, "Decoding failed"); } 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); if (f_verifyWithEcdsaNistp256WithSha256( bit2oct(v_enc_msg), int2oct(0, 32), v_cert_dec.signature_.ecdsaNistP256Signature.rSig.x_only & v_cert_dec.signature_.ecdsaNistP256Signature.sSig, v_publicKeyCompressed, v_compressedMode ) == false) { setverdict(fail); } else { setverdict(pass) } } // End of testcase tc_certificate_asn1c_2 testcase tc_certificate_gemalto_1() runs on TCType system TCType { const octetstring c_cert := '80030080e3c6bb16548f178d298300000000001874e3808466a88001012080010780012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d800080830698dbc4ee30ec06bec42913daf024c5ecd415f49c8a72d87aee01c4b6b61ad58080831c965d29f2d3837052f2bdb45f6b4d9961e370cab50284372c5bd6285c16702280807c368781a209f2e7428f550f0032041c0c1c9d00fcd9aa4e58dede56998543b7fc84cbade97904bff78ff95ce22829386a97b6b2c4e8c564c5d159b8da28cf8d'O; var bitstring v_enc_msg := oct2bit(c_cert); var EtsiTs103097Certificate v_cert_dec; var integer v_res := decvalue(v_enc_msg, v_cert_dec); if (v_res == 0) { log("Decoded message: ", v_cert_dec); setverdict(pass, "Decoded succeed"); } else { setverdict(fail, "Decoding failed"); } } // End of testcase tc_certificate_gemalto_1 group encdec_functions { function TestEtsiTs103097Certificate( in template (value) EtsiTs103097Certificate p_cert, in boolean p_decode := true, in template (omit) bitstring p_expEncMsg := omit ) runs on TCType return bitstring { var bitstring v_encMsg; var template (omit) TestRecord v_tr := { bs := p_expEncMsg }; var EtsiTs103097Certificate v_decMsg; var integer v_res := 0; // Encode template log("Encode template ", valueof(p_cert)); v_encMsg := encvalue(p_cert); log("Encoded message: ", bit2oct(v_encMsg)); // Check result if (not isbound(v_encMsg)) { setverdict(fail, "Encoding failed!"); stop; } if (ispresent(v_tr.bs)) { if (not match(v_encMsg, p_expEncMsg)) { log("Expected message: ", bit2oct(valueof(p_expEncMsg))); setverdict(fail, "Encoding failed, not the expected result!"); stop; } } setverdict(pass, "Encoding passed."); // Check decoding if (p_decode == true) { v_res := decvalue(v_encMsg, v_decMsg); log("Decoded message: ", v_decMsg); select (v_res) { case (0) { if(match(v_decMsg, p_cert)) { setverdict(pass); } else { setverdict(fail); } } case (1) { setverdict(fail, "Decoding failed."); } case (2) { setverdict(fail, "Not enough bits."); } } } return v_encMsg; } } // End of group encdec_functions control { execute(tc_root_certificate_sha256_1()); execute(tc_root_certificate_sha256_2()); execute(tc_root_certificate_sha384_1()); execute(tc_ea_certificate_sha256_1()); execute(tc_at_certificate_sha256_1()); execute(tc_at_certificate_sha256_2()); execute(tc_at_certificate_sha256_3()); execute(tc_certificate_asn1c_1()); } } // End of module TestCodec_Certificates