ItsSecurity_TestCases.ttcn 1.35 MB
Newer Older
filatov's avatar
filatov committed
                 *           and containing certificates
                 *             containing certificates[last-1]
                 *               containing signer_info
                 *                 containing type
                 *                   indicating 'certificate_digest_with_ecdsap256'
                 *                 and containing digest
                 *                   referencing to the trusted certificate
                 *                     containing subject_info.subject_type
                 *                       indicating 'root_ca'
                 *                       or indicating 'authorisation_authority'
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AA_04_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 6.3
                 */
                testcase TC_SEC_ITSS_SND_CERT_AA_04_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain    v_chain;
                    var Certificate         v_aa_cert, v_ca_cert;
                    var SignerInfo          v_si;
                    var HashedId8           v_ca_digest;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    v_aa_cert := v_chain[lengthof(v_chain) - 2];
                    // Process signerInfo field
                    if ( true != f_getCertificateSignerInfo(v_aa_cert, v_si)) {
                        log("*** " & testcasename() & ": FAIL: AA certificate must contain SignerInfo fields ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    if (v_si.type_ == e_certificate_digest_with_sha256) {
                        log("*** " & testcasename() & ": FAIL: AA certificate must contain SignerInfo field containing a certificate_digest_with_ecdsap256 ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    f_readCertificate(cc_taCert_CA, v_ca_cert);
                    v_ca_digest := f_calculateDigestFromCertificate(v_ca_cert); 
                    
                    if (not match(v_aa_cert, mw_aa_certificate(mw_signerInfo_digest(v_ca_digest)))) {
                        log("*** " & testcasename() & ": FAIL: AA certificate signer info doesn't reference the CA certificate from the chain ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if (not f_verifyCertificateSignatureWithIssuingCertificate(v_aa_cert, v_ca_cert)) {
                        log("*** " & testcasename() & ": FAIL: AT certificate signature verification failed ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    log("*** " & testcasename() & ": PASS: AA certificate was signed by the CA certificate from the given chain ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AA_04_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that all necessary subject attributes are present and arranged in ascending order
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate_chain'
                 *           and containing certificates
                 *             containing certificates[last-1]
                 *               containing subject_attributes [0..N]
                 *                 indicating subject_attributes[n].type
                 *                     < subject_attributes[n+1].type
                 *                 and containing subject_attributes['verification_key']
                 *                 and containing subject_attributes['assurance_level']
                 *                 and containing subject_attributes['its_aid_list']
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AA_05_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 6.1, 7.4.1 and 7.4.4
                 */
                testcase TC_SEC_ITSS_SND_CERT_AA_05_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain         v_chain;
                    var SubjectAttributes        v_attrs;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (lengthof(v_chain) < 2) {
                        log("*** " & testcasename() & ": FAIL: Certificate chain is too short ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_error);
                    }
                    if (not match(v_chain[lengthof(v_chain) - 2], 
                                 mw_aa_certificate(?,
                                        superset(mw_subject_attribute_verification_key,
                                                 mw_subject_attribute_assurance_level,
                                                 mw_subject_attribute_its_aid_list)))
                     ) {
                        log("*** " & testcasename() & ": FAIL: Required subject attribute of AA certificate is not found ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    v_attrs := v_chain[lengthof(v_chain) - 2].subject_attributes;
                    for (var integer v_counter := 1; v_counter < lengthof(v_attrs); v_counter := v_counter + 1 ) {
                        if (v_attrs[v_counter].type_ <= v_attrs[v_counter-1].type_) {
                            log("*** " & testcasename() & ": FAIL: AA certificate subject attributes are not arranged in accening order ***");
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                    }
                    
                    log("*** " & testcasename() & ": PASS: All required AA certificate subject attributes are presents ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AA_05_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that all AIDs containing in the its_aid_list in AA certificate are unique       
                 * Check that AID list contains not more than 31 items
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate_chain'
                 *           and containing certificates
                 *             containing certificates[last-1]
                 *               containing subject_attributes['its_aid_list']
                 *                 containing its_aid_list
                 *                   containing not more than 31 unique items
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AA_08_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 7.4.4
                 */
                testcase TC_SEC_ITSS_SND_CERT_AA_08_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain         v_chain;
                    var Certificate              v_aa_cert;
                    var SubjectAttribute         v_sa;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (lengthof(v_chain) < 2) {
                        log("*** " & testcasename() & ": FAIL: Certificate chain is too short ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_error);
                    }
                    v_aa_cert := v_chain[lengthof(v_chain) - 2];
                    if (f_getCertificateSubjectAttribute(v_aa_cert, e_its_aid_list, v_sa)) {
                        
                        if (lengthof(v_sa.attribute.its_aid_list) > 31) {
                            log("*** " & testcasename() & ": FAIL: ITS-AID list contains " & int2str(lengthof(v_sa.attribute.its_aid_list)) & " items (>31) ***");
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                        
                        for (var integer v_counter :=0; v_counter < lengthof(v_sa.attribute.its_aid_list); v_counter := v_counter + 1) {
                            for (var integer j :=0; j < lengthof(v_sa.attribute.its_aid_list); j := j + 1) {
                                if (v_counter != j and v_sa.attribute.its_aid_list[v_counter] == v_sa.attribute.its_aid_list[j]) {
                                    log("*** " & testcasename() & ": FAIL: ITS-AID " & int2str(v_sa.attribute.its_aid_list[j]) & " is duplicated in AA certificate ***");
                                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                                }
                            }
                        } // End of 'for' statement
                    } else {
                        log("*** " & testcasename() & ": FAIL: AA certificate does not contain its_aid_list subject attribute ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    log("*** " & testcasename() & ": PASS: Time validity restriction of the AA certificate is good ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AA_08_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that all mandatory validity restrictions are present and arranged in ascending order
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
filatov's avatar
filatov committed
                 *             indicating 'certificate_chain'
                 *           and containing certificates
filatov's avatar
filatov committed
                 *             containing certificates[last-1]
                 *               containing validity_restrictions[0..N]
                 *                 indicating validity_restrictions[n].type
                 *                     < validity_restrictions[n+1].type
                 *                 and containing validity_restrictions['time_start_and_end']
                 *                 and not containing validity_restrictions['time_end']
                 *                 and not containing validity_restrictions['time_start_and_duration']
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AA_10_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 6.1, 6.7 and 7.4.1
                 */
                testcase TC_SEC_ITSS_SND_CERT_AA_10_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    
                    // Local variables
                    var CertificateChain v_chain;
                    var Certificate v_cert;
                    var integer v_previousValidityRestrictionType;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    
                    // Test Body
                    // Process certificate[last - 1]
                    v_cert := v_chain[lengthof(v_chain) - 2];
                    if (match(
                              v_cert.validity_restrictions, 
                                  superset(
                                      mw_validity_restriction_time_end,
                                      mw_validity_restriction_time_start_and_duration
                                  )
                    )) {
                        log("*** " & testcasename() & ": FAIL: certificate[last-2] must not contain time_end and time_start_and_duration restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    for (var integer v_counter := 1; v_counter < lengthof(v_cert.validity_restrictions); v_counter := v_counter + 1) {
                        // Check forbidden header
                        if (v_cert.validity_restrictions[v_counter].type_ != e_time_start_and_end) { // FIXME To be reviewed
                            log("*** " & testcasename() & ": FAIL: Forbidden header present");
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        } 
                        
                        if (v_counter > 1 ) {
                            // Check that headers are ordered
                            if (enum2int(v_cert.validity_restrictions[v_counter].type_) <= v_previousValidityRestrictionType) {
                                // Check that header is duplicated
                                if (enum2int(v_cert.validity_restrictions[v_counter].type_) == v_previousValidityRestrictionType) {
                                    log("*** " & testcasename() & ": FAIL: multiple instances of same header");
                                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                                } else {
                                    log("*** " & testcasename() & ": FAIL: headers not in correct order");
                                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                                }
                            }
                        }
                        v_previousValidityRestrictionType := enum2int(v_cert.validity_restrictions[v_counter].type_);
                    } // End of 'for' statement
                    
                    log("*** " & testcasename() & ": PASS: Time validity restriction of the certificate[last-2] is good ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AA_10_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that time_start_and_end is included in the AA certificate validation restrictions;       
                 * Check that end_validity is greater than start_validity;       
                 * Check that validity restriction of AA certificate is inside the validity restriction of its issuing certificate
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate_chain'
                 *           containing certificates
                 *             containing certificates[last-1]
                 *               containing validity_restrictions
                 *                 containing validity_restrictions['time_start_and_end']
                 *                   containing start_validity
                 *                     indicating START_VALIDITY_AA
                 *                   containing end_validity
                 *                     indicating END_VALIDITY_AA >=START_VALIDITY_AA
                 *               and containing signer_info
                 *                 containing digest
                 *                   referencing the trusted certificate
                 *                     containing validity_restrictions['time_end']
                 *                       containing end_validity
                 *                         indicating value > END_VALIDITY_AA
                 *                     or containing validity_restrictions['time_start_and_end']
                 *                       containing start_validity
                 *                         indicating value <= START_VALIDITY_AA
                 *                       and containing end_validity
                 *                         indicating value > END_VALIDITY_AA
                 *                     or containing validity_restrictions['time_start_and_duration']
                 *                       containing start_validity
                 *                         indicating X_START_VALIDITY <= START_VALIDITY_AA
                 *                       and containing duration
                 *                         indicating value > END_VALIDITY_AA - X_START_VALIDITY
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AA_11_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 7.4.4
                 */
                testcase TC_SEC_ITSS_SND_CERT_AA_11_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain         v_chain;
                    var Certificate              v_aa_cert;
                    var ValidityRestriction      v_vr;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (lengthof(v_chain) < 2) {
                        log("*** " & testcasename() & ": FAIL: Certificate chain is too short ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_error);
                    }
                    v_aa_cert := v_chain[lengthof(v_chain) - 2];
                    if (match (v_aa_cert.validity_restrictions, superset(mw_validity_restriction_time_end,
                                                                          mw_validity_restriction_time_start_and_duration))
                    ) {
                        log("*** " & testcasename() & ": FAIL: AA certificate must not contain time_end and time_start_and_duration restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if ( true != f_getCertificateValidityRestriction(v_aa_cert, e_time_start_and_end, v_vr)) {
                        log("*** " & testcasename() & ": FAIL: AA certificate must contain time_start_and_end restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if (v_vr.validity.time_start_and_end.start_validity > v_vr.validity.time_start_and_end.end_validity ) {
                        log("*** " & testcasename() & ": FAIL: start validity mus not be greater then end validity in the validity restrictions of AA certificate ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    log("*** " & testcasename() & ": PASS: Time validity restriction of the AA certificate is good ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AA_11_01_BV
                
            } // End of group AA_Certificates 
            
            /**
             * @desc Sending behaviour test cases for AT certificate profil
             * @see ETSI TS 103 096-2 V1.2.2 (2016-01) Clause 5.2.7.8 AT certificate profile
             */
            group AT_Certificates {
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that the subject_type of the AT certificate is set to 'authorization_ticket'
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate in the next CAM
filatov's avatar
filatov committed
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate'
                 *           and containing certificate
                 *             containing subject_info.subject_type
                 *               indicating 'authorization_ticket'
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_01_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clause 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_01_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var Certificate         v_at_cert;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Waiting for the message containing certificate  ***");
                    tc_ac.start;
                    if (not f_waitForCertificate(v_at_cert)) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (not match(v_at_cert, mw_at_certificate)) {
                        log("*** " & testcasename() & ": FAIL: Message wasn't signed by AT certificate ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    log("*** " & testcasename() & ": PASS: AT certificate has the 'authorization_ticket' subject_type  ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_01_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that the subject_name variable-length vector is empty for AT certificates
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate in the next CAM
filatov's avatar
filatov committed
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate'
                 *           and containing certificate
                 *             containing subject_info.subject_name
                 *               indicating length = 0
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_02_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clause 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_02_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var Certificate         v_at_cert;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Waiting for the message containing certificate  ***");
                    tc_ac.start;
                    if (not f_waitForCertificate(v_at_cert)) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (0 != lengthof(v_at_cert.subject_info.subject_name)) {
                        log("*** " & testcasename() & ": FAIL: Subject name of the AT certificate is not empty ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    log("*** " & testcasename() & ": PASS: Subject name of the AT certificate is empty ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_02_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that signer_info type of AT certificates is set to 'certificate_digest_with_sha256'
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate in the next CAM
filatov's avatar
filatov committed
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate'
                 *           and containing certificate
                 *             containing signer_info.
                 *               containing type
                 *                 indicating 'certificate_digest_with_sha256'
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_03_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_03_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var Certificate         v_at_cert;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Waiting for the message containing certificate  ***");
                    tc_ac.start;
                    if (not f_waitForCertificate(v_at_cert)) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (
                        not match(v_at_cert, mw_certificate(mw_signerInfo_digest))
                    ) {
                        log("*** " & testcasename() & ": FAIL: AT certificate doesn't contain a digest of issuing cert ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    log("*** " & testcasename() & ": PASS: The signer info of AT certificate is a digest ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_03_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that subject attributes are present and arranged in ascending order
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate in the next CAM
filatov's avatar
filatov committed
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating 'certificate'
                 *           containing certificate
                 *             containing subject_attributes [0..N]
                 *               indicating subject_attributes[n].type
                 *                     < subject_attributes[n+1].type
                 *               containing subject_attributes['verification_key']
                 *               containing subject_attributes['assurance_level']
                 *               containing subject_attributes['its_aid_ssp_list']
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_04_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 7.4.1 and 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_04_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var Certificate         v_at_cert;
                    var SubjectAttributes   v_attrs;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Waiting for the message containing certificate  ***");
                    tc_ac.start;
                    if (not f_waitForCertificate(v_at_cert)) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (not match(
                        v_at_cert, 
                            mw_at_certificate(
                                ?,
                                superset(
                                    mw_subject_attribute_verification_key,
                                    mw_subject_attribute_assurance_level,
                                    mw_subject_attribute_its_aid_ssp_list
                     )))) {
                        log("*** " & testcasename() & ": FAIL: Required subject attribute of AT certificate is not found ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    v_attrs := v_at_cert.subject_attributes;
                    for (var integer v_counter := 1; v_counter < lengthof(v_attrs); v_counter := v_counter + 1 ) {
                        if (v_attrs[v_counter].type_ <= v_attrs[v_counter-1].type_) {
                            log("*** " & testcasename() & ": FAIL: AT certificate subject attributes are not arranged in ascending order ***");
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                    } // End of 'for' statement
                    
                    log("*** " & testcasename() & ": PASS: All required AT certificate subject attributes are presents and arranged in ascending order ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_04_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that time_start_and_end is included in the AT certificate validation restrictions;       
                 * Check that time_start_and_end is inside the AA certificate time restrictions       
                 * Check that validity restriction of AT certificate is inside the validity restriction of its issuing certificate
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating certificate_chain
                 *           containing certificates[last]
                 *             containing subject_info.subject_type
                 *               indicating 'authorization_ticket'
                 *              not containing validity_restrictions['time_end']
                 *                and not containing validity_restrictions['time_start_and_duration']
                 *             and containing validity_restrictions['time_start_and_end']
                 *               containing start_validity
                 *                 indicating START_VALIDITY_AT
                 *               containing end_validity
                 *                 indicating END_VALIDITY_AT
                 *           containing certificates[last-1]
                 *             containing validity_restrictions['time_end']
                 *               containing end_validity
                 *                 indicating value > END_VALIDITY_AT
                 *             or containing validity_restrictions['time_start_and_end']
                 *               containing start_validity
                 *                 indicating value <= START_VALIDITY_AT
                 *               and containing end_validity
                 *                 indicating value > END_VALIDITY_AT
                 *             or containing validity_restrictions['time_start_and_duration']
                 *               containing start_validity
                 *                 indicating X_START_VALIDITY <= START_VALIDITY_AT
                 *               and containing duration
                 *                 indicating value > END_VALIDITY_AT - X_START_VALIDITY
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_05_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clause 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_05_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain         v_chain;
                    var Certificate              v_aa_cert, v_at_cert;
                    var ValidityRestriction      v_vr, v_aa_vr;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (lengthof(v_chain) < 2) {
                        log("*** " & testcasename() & ": FAIL: Certificate chain is too short ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_error);
                    }
                    v_aa_cert := v_chain[lengthof(v_chain) - 2];
                    v_at_cert := v_chain[lengthof(v_chain) - 1];
                    if (match (
                        v_at_cert.validity_restrictions, 

                            superset(
                                mw_validity_restriction_time_end,
                                mw_validity_restriction_time_start_and_duration
                            )
                    )) {
                        log("*** " & testcasename() & ": FAIL: AT certificate must not contain time_end and time_start_and_duration restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if ( true != f_getCertificateValidityRestriction(v_at_cert, e_time_start_and_end, v_vr)) {
                        log("*** " & testcasename() & ": FAIL: AT certificate must contain time_start_and_end restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if (v_vr.validity.time_start_and_end.start_validity > v_vr.validity.time_start_and_end.end_validity ) {
                        log("*** " & testcasename() & ": FAIL: start validity must not be greater then end validity in the validity restrictions of AT certificate ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    
                    if (true == f_getCertificateValidityRestriction(v_aa_cert, e_time_start_and_end, v_aa_vr)) {
                        if (
                            (v_vr.validity.time_start_and_end.start_validity < v_aa_vr.validity.time_start_and_end.start_validity) or 
                            (v_vr.validity.time_start_and_end.end_validity > v_aa_vr.validity.time_start_and_end.end_validity)
                        ) {
                            log("*** " & testcasename() & ": FAIL: AT certificate time validity restriction must be inside the AA certificate time validity restriction ***"); 
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                    } else if (true == f_getCertificateValidityRestriction(v_aa_cert, e_time_end, v_aa_vr)) {
                        if (v_vr.validity.time_start_and_end.end_validity > v_aa_vr.validity.end_validity) {
                            log("*** " & testcasename() & ": FAIL: AT certificate time validity restriction must be inside the AA certificate time validity restriction ***"); 
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                    } else if (true == f_getCertificateValidityRestriction(v_aa_cert, e_time_start_and_duration, v_aa_vr)) {
                        var Time64 v_end := v_aa_vr.validity.time_start_and_duration.start_validity + f_duration2time(v_aa_vr.validity.time_start_and_duration.duration_);
                        if (
                            (v_vr.validity.time_start_and_end.start_validity < v_aa_vr.validity.time_start_and_duration.start_validity) or 
                            (v_vr.validity.time_start_and_end.end_validity > v_end)
                        ) {
                            log("*** " & testcasename() & ": FAIL: AT certificate time validity restriction must be inside the AA certificate time validity restriction ***"); 
                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                        }
                    } else {
                        log("*** " & testcasename() & ": FAIL: Wrong AA certificate time restrictions ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    log("*** " & testcasename() & ": PASS: Time validity restriction of the AT certificate is good ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_05_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that all AIDs containing in the its_aid_ssp_list in AT certificate are unique;       
                 * Check that all AIDs containing in the its_aid_ssp_list in AT certificate are also containing in the its_aid_list in the correspondent AA certificate;       
                 * Check that the length of SSP of each AID is 31 octets maximum
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01
filatov's avatar
filatov committed
                 * Initial conditions:
                 *   with
                 *     the IUT being in the 'authorized' state
                 *     the IUT being requested to include certificate chain in the next CAM
                 * Expected results:
                 *   ensure that
                 *     when
                 *       the IUT is requested to send a CAM
                 *     then
                 *       the IUT sends a SecuredMessage
                 *         containing header_fields['signer_info'].signer
                 *           containing type
                 *             indicating certificate_chain
                 *           containing certificates[last-1]
                 *             containing subject_info.subject_type
                 *               indicating 'authorization_authority'
                 *             and containing subject_attributes['its_aid_list']
                 *               containing its_aid_list[0..N]
                 *                 indicating ITS_AID_LIST_AA
                 *           and containing certificates[last]
                 *             containing subject_info.subject_type
                 *               indicating 'authorization_ticket'
                 *             and containing subject_attributes['its_aid_ssp_list']
                 *               containing its_aid_ssp_list[0..N]
                 *                 containing its_aid_ssp_list[n]
                 *                   containing its_aid
                 *                     indicating unique value containing in the  ITS_AID_LIST_AA
                 *                   and containing service_specific_permissions
                 *                     indicating length <= 31 octet
filatov's avatar
filatov committed
                 * @see         ETSI TS 103 096-2 v1.3.1 TP_SEC_ITSS_SND_CERT_AT_07_01_BV
                 * @reference   ETSI TS 103 097 v1.2.1, clauses 6.9 and 7.4.2
                 */
                testcase TC_SEC_ITSS_SND_CERT_AT_07_01_BV() runs on ItsGeoNetworking system ItsSecSystem {
                    var CertificateChain         v_chain;
                    var Certificate              v_aa_cert, v_at_cert;
                    var SubjectAttribute         v_sa;
                    var IntXs                    v_aid_list;
                    var ItsAidSsps               v_aid_ssp_list;
                    
                    // Test control
                    if (not(PICS_GN_SECURITY)) {
                        log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf01Up();
                    
                    // Test adapter configuration
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                    // Test Body
                    log("*** " & testcasename() & ": INFO: Request and waiting for the message containing certificate chain  ***");
                    tc_ac.start;
                    if (not f_askAndWaitForCertificateChain(v_chain, f_generateDefaultCam())) {
                        log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_timeout);
                    }
                    tc_ac.stop;
                    if (lengthof(v_chain) < 2) {
                        log("*** " & testcasename() & ": FAIL: Certificate chain is too short ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_tbDone, e_error);
                    }
                    v_aa_cert := v_chain[lengthof(v_chain) - 2];
                    v_at_cert := v_chain[lengthof(v_chain) - 1];
                    if (not f_getCertificateSubjectAttribute(v_aa_cert, e_its_aid_list, v_sa)) {
                        log("*** " & testcasename() & ": FAIL: AA certificate does not contain its_aid_list subject attribute ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    v_aid_list := v_sa.attribute.its_aid_list;
                    
                    if (not f_getCertificateSubjectAttribute(v_at_cert, e_its_aid_ssp_list, v_sa)) {
                        log("*** " & testcasename() & ": FAIL: AA certificate does not contain its_aid_list subject attribute ***");
                        f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                    }
                    v_aid_ssp_list := v_sa.attribute.its_aid_ssp_list;
                    
                    for (var integer v_counter :=0; v_counter < lengthof(v_aid_ssp_list); v_counter := v_counter + 1) {
                        // Check unique
                        for (var integer j :=0; j < lengthof(v_aid_ssp_list); j := j + 1) {
                            if (v_counter != j and v_aid_ssp_list[v_counter].its_aid == v_aid_ssp_list[j].its_aid) {
                                log("*** " & testcasename() & ": FAIL: ITS-AID " & int2str(v_aid_ssp_list[v_counter].its_aid) & " is duplicated in AT certificate ***");
                                f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
                            }
                        } // End of 'for' statement
//                        if (not match(v_aid_ssp_list[v_counter], (all from v_aid_list))) {
//                            log("*** " & testcasename() & ": FAIL: ITS-AID " & int2str(v_aid_ssp_list[v_counter].its_aid) & " is not exist in AA certificate ***");
//                            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
//                        }
                    } // End of 'for' statement
                    
                    log("*** " & testcasename() & ": PASS: The ITS_AID_SSP list of the AT certificate is good ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    f_cf01Down();
                } // End of testcase TC_SEC_ITSS_SND_CERT_AT_07_01_BV
                
                /**
filatov's avatar
filatov committed
                 * @desc  Check that AT certificate is signed by AA cert
                 * <pre>
                 * Pics Selection: PICS_GN_SECURITY
                 * Config Id: CF01