/*
 * @author
 *     
 * @version
 *     1.0
 * @desc
 *     
 * @remark
 *     
 * @see
 *     
 */ 
module TestCodec_SecuredFuntions {
    
    // 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;

    testcase tc_sha256_1() runs on TCType system TCType {
      var octetstring v_test := '616263'O;
      var Oct32 v_exp_hash := 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'O;
      var Oct32 v_hash;

      v_hash := f_hashWithSha256(v_test);

      if (match(v_hash, v_exp_hash) == false) {
        setverdict(fail);
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_sha256_1

    testcase tc_sha384_1() runs on TCType system TCType {
      var octetstring v_test := '616263'O;
      var Oct48 v_exp_hash := 'CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7'O;
      var Oct48 v_hash;

      v_hash := f_hashWithSha384(v_test);

      if (match(v_hash, v_exp_hash) == false) {
        setverdict(fail);
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_sha384_1

    testcase tc_f_generate_key_pair_1() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;

      if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      setverdict(pass);
    } // End of testcase tc_f_generate_key_pair_1

    testcase tc_f_generate_key_pair_2() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;

      if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      setverdict(pass);
    } // End of testcase tc_f_generate_key_pair_2

    testcase tc_f_generate_key_pair_3() runs on TCType system TCType {
      var Oct48 v_private_key;
      var Oct48 v_publicKeyX;
      var Oct48 v_publicKeyY;

      if (f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      setverdict(pass);
    } // End of testcase tc_f_generate_key_pair_3

    testcase tc_f_signWithEcdsaNistp256WithSha256_1() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaNistp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_signWithEcdsaNistp256WithSha256_1

    testcase tc_f_verifyWithEcdsaNistp256WithSha256_1() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaNistp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaNistp256WithSha256_1

    testcase tc_f_verifyWithEcdsaNistp256WithSha256_2() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var Oct32 v_private_key_wrong;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      v_private_key_wrong := v_private_key;
        
      v_sig := f_signWithEcdsaNistp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
      
      v_private_key_wrong[2] := 'AA'O;
      v_sig := f_signWithEcdsaNistp256WithSha256(v_encMsg, v_private_key_wrong);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaNistp256WithSha256_2

    testcase tc_f_verifyWithEcdsaNistp256WithSha256_3() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;
      var octetstring v_sig_wrong := ''O;
      var Oct32 v_publicKeyX_wrong;
      var Oct32 v_publicKeyY_wrong;

      if (f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaNistp256WithSha256(v_encMsg, v_private_key);  
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaNistp256WithSha256('0A0A0A0A'O, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_sig_wrong := v_sig;
      v_sig_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig_wrong, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyX_wrong := v_publicKeyX;
      v_publicKeyX_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX_wrong, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyY_wrong := v_publicKeyY;
      v_publicKeyY_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaNistp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY_wrong) == true) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_verifyWithEcdsaNistp256WithSha256_3

    testcase tc_f_signWithEcdsaBrainpoolp256WithSha256_1() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_signWithEcdsaBrainpoolp256WithSha256_1

    testcase tc_f_signWithEcdsaBrainpoolp384WithSha384_1() runs on TCType system TCType {
      var Oct48 v_private_key;
      var Oct48 v_publicKeyX;
      var Oct48 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_signWithEcdsaBrainpoolp384WithSha384_1

    testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_1() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_1

    testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_2() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var Oct32 v_private_key_wrong;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      v_private_key_wrong := v_private_key;
        
      v_sig := f_signWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
      
      v_private_key_wrong[2] := 'AA'O;
      v_sig := f_signWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_private_key_wrong);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_2

    testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_3() runs on TCType system TCType {
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;
      var octetstring v_sig_wrong := ''O;
      var Oct32 v_publicKeyX_wrong;
      var Oct32 v_publicKeyY_wrong;

      if (f_generate_key_pair_brainpoolp256(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_private_key);  
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp256WithSha256('0A0A0A0A'O, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_sig_wrong := v_sig;
      v_sig_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig_wrong, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyX_wrong := v_publicKeyX;
      v_publicKeyX_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX_wrong, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyY_wrong := v_publicKeyY;
      v_publicKeyY_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp256WithSha256(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY_wrong) == true) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp256WithSha256_3

    testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_1() runs on TCType system TCType {
      var Oct48 v_private_key;
      var Oct48 v_publicKeyX;
      var Oct48 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_1

    testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_2() runs on TCType system TCType {
      var Oct48 v_private_key;
      var Oct48 v_publicKeyX;
      var Oct48 v_publicKeyY;
      var Oct48 v_private_key_wrong;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;

      if (f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
      
      v_private_key_wrong := v_private_key;
        
      v_sig := f_signWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_private_key);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
      
      v_private_key_wrong[2] := 'AA'O;
      v_sig := f_signWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_private_key_wrong);  
      if (lengthof(v_sig) == 0) {
        setverdict(fail);
        stop;
      }
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      } else {
        setverdict(pass);
      }
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_2

    testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_3() runs on TCType system TCType {
      var Oct48 v_private_key;
      var Oct48 v_publicKeyX;
      var Oct48 v_publicKeyY;
      var octetstring v_encMsg := '0A0A0102030405060708090A0B0C0D0E0F0A0A'O; 
      var octetstring v_sig := ''O;
      var octetstring v_sig_wrong := ''O;
      var Oct48 v_publicKeyX_wrong;
      var Oct48 v_publicKeyY_wrong;

      if (f_generate_key_pair_brainpoolp384(v_private_key, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      log("v_private_key = ", v_private_key);
      log("v_public_key X= ", v_publicKeyX);
      log("v_public_key Y= ", v_publicKeyY);
        
      v_sig := f_signWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_private_key);  
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY) == false) {
        setverdict(fail);
        stop;
      }
      
      if (f_verifyWithEcdsaBrainpoolp384WithSha384('0A0A0A0A'O, v_sig, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_sig_wrong := v_sig;
      v_sig_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig_wrong, v_publicKeyX, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyX_wrong := v_publicKeyX;
      v_publicKeyX_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX_wrong, v_publicKeyY) == true) {
        setverdict(fail);
        stop;
      }
      
      v_publicKeyY_wrong := v_publicKeyY;
      v_publicKeyY_wrong[0] := 'FF'O;
      if (f_verifyWithEcdsaBrainpoolp384WithSha384(v_encMsg, v_sig, v_publicKeyX, v_publicKeyY_wrong) == true) {
        setverdict(fail);
        stop;
      }
      
      setverdict(pass);
    } // End of testcase tc_f_verifyWithEcdsaBrainpoolp384WithSha384_3
    
    control {
        execute(tc_sha256_1());
        execute(tc_sha384_1());
        execute(tc_f_generate_key_pair_1());
        execute(tc_f_generate_key_pair_2());
        execute(tc_f_generate_key_pair_3());
        execute(tc_f_signWithEcdsaNistp256WithSha256_1());
        execute(tc_f_verifyWithEcdsaNistp256WithSha256_1());
        execute(tc_f_verifyWithEcdsaNistp256WithSha256_2());
        execute(tc_f_verifyWithEcdsaNistp256WithSha256_3());
        execute(tc_f_signWithEcdsaBrainpoolp256WithSha256_1());
        execute(tc_f_signWithEcdsaBrainpoolp384WithSha384_1());
        execute(tc_f_verifyWithEcdsaBrainpoolp256WithSha256_1());
        execute(tc_f_verifyWithEcdsaBrainpoolp256WithSha256_2());
        execute(tc_f_verifyWithEcdsaBrainpoolp256WithSha256_3());
        execute(tc_f_verifyWithEcdsaBrainpoolp384WithSha384_1());
        execute(tc_f_verifyWithEcdsaBrainpoolp384WithSha384_2());
        execute(tc_f_verifyWithEcdsaBrainpoolp384WithSha384_3());
    }
    
} // End of module TestCodec_SecuredFuntions 
