LibItsSecurity_Functions.ttcn 284 KB
Newer Older
Denis Filatov's avatar
Denis Filatov committed
/**
 *  @Author   ETSI / STF481 / STF507 / STF517 / STF538 / TTF T025 / STF545
Denis Filatov's avatar
Denis Filatov committed
 *  @version  $Url$
 *            $Id$
 *  @desc     Module containing functions for Security Protocol
 *  @copyright   ETSI Copyright Notification
 *               No part may be reproduced except as authorized by written permission.
 *               The copyright and the foregoing restriction extend to reproduction in all media.
 *               All rights reserved.
 *
 */
module LibItsSecurity_Functions {
Denis Filatov's avatar
Denis Filatov committed
    // Libcommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_DataStrings all;

    // Helpers
    import from LibHelpers_Functions all;
Denis Filatov's avatar
Denis Filatov committed
    // LibIts
    import from Ieee1609Dot2BaseTypes language "ASN.1:1997" all;
    import from Ieee1609Dot2 language "ASN.1:1997" all;
    import from EtsiTs103097Module language "ASN.1:1997" all;
Denis Filatov's avatar
Denis Filatov committed
    // LibItsCommon
    import from LibItsCommon_Functions all;
    //import from LibItsCommon_TypesAndValues all;
    import from LibItsCommon_Pixits all;
Denis Filatov's avatar
Denis Filatov committed
    // LibItsSecurity
    import from LibItsSecurity_TypesAndValues all;
    import from LibItsSecurity_Templates all;
    import from LibItsSecurity_Pixits all;
    import from LibItsSecurity_Pics all;
    import from LibItsSecurity_TestSystem all;
Denis Filatov's avatar
Denis Filatov committed
    group helpersFunctions {
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a 256-bit (32-byte) hash value
         * @param   p_toBeHashedData Data to be used to calculate the hash value
         * @return  The hash value
         */
        function f_hashWithSha256(
                                  in octetstring p_toBeHashedData
        ) return Oct32 {
            return fx_hashWithSha256(p_toBeHashedData);
        } // End of function f_hashWithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a 384-bit (48-byte) hash value
         * @param   p_toBeHashedData Data to be used to calculate the hash value
         * @return  The hash value
         */
        function f_hashWithSha384(
                                  in octetstring p_toBeHashedData
        ) return Oct48 {
            return fx_hashWithSha384(p_toBeHashedData);
Yann Garcia's avatar
Yann Garcia committed
        } // End of function f_hashWithSha384
        function f_signWithEcdsa(
                                in octetstring p_toBeSignedSecuredMessage,
                                in octetstring p_certificateIssuer,
                                in octetstring p_privateKey
                                ) return octetstring {
        log(">>> f_verifyEcdsa: p_toBeSignedSecuredMessage= ", p_toBeSignedSecuredMessage);
        log(">>> f_verifyEcdsa: p_certificateIssuer= ", p_certificateIssuer);
        log(">>> f_verifyEcdsa: p_privateKey= ", p_privateKey);
        log(">>> f_verifyEcdsa: PX_VE_ALG= ", PX_VE_ALG);
        if (PX_VE_ALG == e_nist_p256) {
            return f_signWithEcdsaNistp256WithSha256(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
        } else if (PX_VE_ALG == e_brainpool_p256_r1) {
            return f_signWithEcdsaBrainpoolp256r1WithSha256(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
        } else if (PX_VE_ALG == e_sm2_p256) {
            return f_signWithEcdsaSm2WithSm3(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
        } else if (PX_VE_ALG == e_brainpool_p384_r1) {
          if (p_certificateIssuer == int2oct(0, 32)) {
            return f_signWithEcdsaBrainpoolp384r1WithSha384(p_toBeSignedSecuredMessage, int2oct(0, 48), p_privateKey);
          } else {
            return f_signWithEcdsaBrainpoolp384r1WithSha384(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
          }
        } else if (PX_VE_ALG == e_nist_p384) {
          if (p_certificateIssuer == int2oct(0, 32)) {
            return f_signWithEcdsaNistp384WithSha384(p_toBeSignedSecuredMessage, int2oct(0, 48), p_privateKey);
          } else {
            return f_signWithEcdsaNistp384WithSha384(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
          }
        return ''O;
        } // End of function f_signWithEcdsa

        function f_verifySignedMessageECDSA(
                                        in Ieee1609Dot2Data p_msg,
                                        in template (omit) EtsiTs103097Certificate p_signer := omit,
                                        in template(omit) PublicVerificationKey p_verification_key := omit
                                      ) return boolean {
            var octetstring v_signer_hash;
            var PublicVerificationKey v_verification_key;

            if(ischosen(p_msg.content.signedData.signer.self_)){
                if(not ispresent(p_verification_key)){
                    return false; // unsupported yet
                }
                v_verification_key := valueof(p_verification_key);                
                select(f_getHashAlgorithmOfVerificationKey(v_verification_key)){
                    case (sha256){
                        v_signer_hash := f_hashWithSha256(''O);
                    }
                    case (sha384){
                        v_signer_hash := f_hashWithSha384(''O);
                    }
                    case else {
                        return false;
                    }
                }
            }else{
                var EtsiTs103097Certificate v_signer;
                if(ischosen(p_msg.content.signedData.signer.certificate)){
                    var integer v_length := lengthof(p_msg.content.signedData.signer.certificate);
                    if(v_length < 1) {
                        return false;
                    }
                    v_signer := p_msg.content.signedData.signer.certificate[v_length - 1];
                }else if(ischosen(p_msg.content.signedData.signer.digest)){
                    if(ispresent(p_signer)) {
                        v_signer := valueof(p_signer);
                    }else{
                        var charstring v_certificate_id;
                        if(not f_getCertificateFromDigest(p_msg.content.signedData.signer.digest, v_signer, v_certificate_id)){
                            return false;
                        }
                    }
                }else{
                    return false;
                }
                if(not ischosen(v_signer.toBeSigned.verifyKeyIndicator.verificationKey)){
                    return false; 
                }
                v_verification_key := v_signer.toBeSigned.verifyKeyIndicator.verificationKey;
                select(f_getHashAlgorithmOfVerificationKey(v_verification_key)){
                    case (sha256){
                        v_signer_hash := f_hashWithSha256(bit2oct(encvalue(v_signer)));
                    }
                    case (sha384){
                        v_signer_hash := f_hashWithSha384(bit2oct(encvalue(v_signer)));
                    }
                    case else {
                        return false;
                    }
                }
            }

            return f_verifyEcdsa(
                                 bit2oct(encvalue(p_msg.content.signedData.tbsData)),
                                 v_signer_hash,
                                 p_msg.content.signedData.signature_,
                                 v_verification_key);
        }

        function f_verifyEcdsa(
                               in octetstring p_tbs,
                               in octetstring p_issuer,
                               in Signature p_signature_,
                               in PublicVerificationKey p_verification_key
                               ) return boolean {
        var boolean v_ret := false;
        log(">>> f_verifyEcdsa: p_tbs= ", p_tbs);
        log(">>> f_verifyEcdsa: p_issuer= ", p_issuer);
        log(">>> f_verifyEcdsa: p_signature_= ", p_signature_);
        log(">>> f_verifyEcdsa: p_verification_key= ", p_verification_key);
        if (ischosen(p_verification_key.ecdsaNistP256)) {
          if (ischosen(p_verification_key.ecdsaNistP256.compressed_y_0)) {
            v_ret := f_verifyWithEcdsaNistp256WithSha256(
                                                        p_tbs,
                                                        p_issuer,
                                                        p_signature_.ecdsaNistP256Signature.rSig.x_only & p_signature_.ecdsaNistP256Signature.sSig,
                                                        p_verification_key.ecdsaNistP256.compressed_y_0,
                                                        0);
          } else {
            v_ret := f_verifyWithEcdsaNistp256WithSha256(
                                                        p_tbs,
                                                        p_issuer,
                                                        p_signature_.ecdsaNistP256Signature.rSig.x_only & p_signature_.ecdsaNistP256Signature.sSig,
                                                        p_verification_key.ecdsaNistP256.compressed_y_1,
                                                        1);
        } else if (ischosen(p_verification_key.ecdsaBrainpoolP256r1)) {
          if (ischosen(p_verification_key.ecdsaBrainpoolP256r1.compressed_y_0)) {
            v_ret := f_verifyWithEcdsaBrainpoolp256r1WithSha256(
                                                                p_tbs,
                                                                p_issuer,
                                                                p_signature_.ecdsaBrainpoolP256r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP256r1Signature.sSig,
                                                                p_verification_key.ecdsaBrainpoolP256r1.compressed_y_0,
                                                                0);
          } else {
            v_ret := f_verifyWithEcdsaBrainpoolp256r1WithSha256(
                                                                p_tbs,
                                                                p_issuer,
                                                                p_signature_.ecdsaBrainpoolP256r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP256r1Signature.sSig,
                                                                p_verification_key.ecdsaBrainpoolP256r1.compressed_y_1,
                                                                1);
          }
        } else if (ischosen(p_verification_key.ecsigSm2)) {
          if (ischosen(p_verification_key.ecsigSm2.compressed_y_0)) {
            v_ret := f_verifyWithEcdsaSm2WithSm3(
                                                        p_tbs,
                                                        p_issuer,
                                                        p_signature_.sm2Signature.rSig & p_signature_.sm2Signature.sSig,
                                                        p_verification_key.ecsigSm2.compressed_y_0,
                                                        0);
          } else {
            v_ret := f_verifyWithEcdsaSm2WithSm3(
                                                        p_tbs,
                                                        p_issuer,
                                                        p_signature_.sm2Signature.rSig & p_signature_.sm2Signature.sSig,
                                                        p_verification_key.ecsigSm2.compressed_y_1,
                                                        1);
          }
        } else if (ischosen(p_verification_key.ecdsaBrainpoolP384r1)) {
          if (ischosen(p_verification_key.ecdsaBrainpoolP384r1.compressed_y_0)) {
            v_ret := f_verifyWithEcdsaBrainpoolp384r1WithSha384(
                                                                p_tbs,
                                                                p_issuer,
                                                                p_signature_.ecdsaBrainpoolP384r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP384r1Signature.sSig,
                                                                p_verification_key.ecdsaBrainpoolP384r1.compressed_y_0,
                                                                0);
          } else {
            v_ret := f_verifyWithEcdsaBrainpoolp384r1WithSha384(
                                                                p_tbs,
                                                                p_issuer,
                                                                p_signature_.ecdsaBrainpoolP384r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP384r1Signature.sSig,
                                                                p_verification_key.ecdsaBrainpoolP384r1.compressed_y_1,
                                                                1);
          }
        } else if (ischosen(p_verification_key.ecdsaBrainpoolP384r1)) {
          if (ischosen(p_verification_key.ecdsaBrainpoolP384r1.compressed_y_0)) {
            v_ret := f_verifyWithEcdsaNistp384WithSha384(
                                                         p_tbs,
                                                         p_issuer,
                                                         p_signature_.ecdsaBrainpoolP384r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP384r1Signature.sSig,
                                                         p_verification_key.ecdsaBrainpoolP384r1.compressed_y_0,
                                                         0);
            } else {
            v_ret := f_verifyWithEcdsaNistp384WithSha384(
                                                         p_tbs,
                                                         p_issuer,
                                                         p_signature_.ecdsaBrainpoolP384r1Signature.rSig.x_only & p_signature_.ecdsaBrainpoolP384r1Signature.sSig,
                                                         p_verification_key.ecdsaBrainpoolP384r1.compressed_y_1,
                                                         1);
          }
        return v_ret;
        } // End of function f_verifyEcdsa
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signature based on standard IEEE 1609.2
         * @param   p_toBeSignedSecuredMessage    The data to be signed
         * @param   p_certificateIssuer           The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_privateKey                  The private key for signature
         * @return  The signature value
         */
        function f_signWithEcdsaNistp256WithSha256(
                                                   in octetstring p_toBeSignedSecuredMessage,
                                                   in Oct32 p_certificateIssuer,
                                                   in Oct32 p_privateKey
        ) return octetstring {
            return fx_signWithEcdsaNistp256WithSha256(
                p_toBeSignedSecuredMessage,
                p_certificateIssuer,
                p_privateKey
            );
Denis Filatov's avatar
Denis Filatov committed
        } // End of function f_signWithEcdsaNistp256WithSha256
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signature based on standard IEEE 1609.2
         * @param   p_toBeSignedSecuredMessage    The data to be signed
         * @param   p_certificateIssuer           The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_privateKey                  The private key for signature
         * @return  The signature value
         */
        function f_signWithEcdsaSm2WithSm3(
                                                   in octetstring p_toBeSignedSecuredMessage,
                                                   in Oct32 p_certificateIssuer,
                                                   in Oct32 p_privateKey
        ) return octetstring {
            return fx_signWithEcdsaSm2WithSm3(
                p_toBeSignedSecuredMessage,
                p_certificateIssuer,
                p_privateKey
            );
        } // End of function f_signWithEcdsaNistp256WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signature based on standard IEEE 1609.2
         * @param   p_toBeSignedSecuredMessage    The data to be signed
         * @param   p_certificateIssuer           The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_privateKey                  The private key for signature
         * @return  The signature value
         */
        function f_signWithEcdsaBrainpoolp256r1WithSha256(
                                                        in octetstring p_toBeSignedSecuredMessage,
                                                        in Oct32 p_certificateIssuer,
                                                        in Oct32 p_privateKey
        ) return octetstring {
            return fx_signWithEcdsaBrainpoolp256r1WithSha256(
                p_toBeSignedSecuredMessage,
                p_certificateIssuer,
                p_privateKey
            );
Denis Filatov's avatar
Denis Filatov committed
        } // End of function f_signWithEcdsaBrainpoolp256r1WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signature based on standard IEEE 1609.2
         * @param   p_toBeSignedSecuredMessage    The data to be signed
         * @param   p_certificateIssuer           The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_privateKey                  The private key for signature
         * @return  The signature value
         */
        function f_signWithEcdsaBrainpoolp384r1WithSha384(
                                                        in octetstring p_toBeSignedSecuredMessage,
                                                        in Oct48 p_certificateIssuer,
                                                        in Oct48 p_privateKey
        ) return octetstring {
            return fx_signWithEcdsaBrainpoolp384r1WithSha384(
                p_toBeSignedSecuredMessage,
                p_certificateIssuer,
                p_privateKey
            );
Denis Filatov's avatar
Denis Filatov committed
        } // End of function f_signWithEcdsaBrainpoolp384r1WithSha384
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signature based on standard IEEE 1609.2
         * @param   p_toBeSignedSecuredMessage    The data to be signed
         * @param   p_certificateIssuer           The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_privateKey                  The private key for signature
         * @return  The signature value
         */
        function f_signWithEcdsaNistp384WithSha384(
                                                   in octetstring p_toBeSignedSecuredMessage,
                                                   in Oct48 p_certificateIssuer,
                                                   in Oct48 p_privateKey
        ) return octetstring {
            return fx_signWithEcdsaNistp384WithSha384(
                p_toBeSignedSecuredMessage,
                p_certificateIssuer,
                p_privateKey
            );
        } // End of function f_signWithEcdsaBrainpoolp384r1WithSha384
Denis Filatov's avatar
Denis Filatov committed
        function f_decrypt(
                           in octetstring         p_encryptPrivateKey,
                           in EtsiTs103097Data    p_encrypedSecuredMessage,
                           in octetstring         p_salt,
                           out EtsiTs103097Data   p_decrypedSecuredMessage,
                           out octetstring        p_aes_sym_enc_key
        ) return boolean {
            if (ischosen(p_encrypedSecuredMessage.content.encryptedData)) {
                var PKRecipientInfo v_pKRecipientInfo;
                var RecipientInfo v_recipientInfo := p_encrypedSecuredMessage.content.encryptedData.recipients[0];
            var octetstring v_decryptedSecuredMessage;
Denis Filatov's avatar
Denis Filatov committed
              log(">>> f_decrypt: p_encryptPrivateKey=", p_encryptPrivateKey);
              log(">>> f_decrypt: p_encrypedSecuredMessage=", p_encrypedSecuredMessage);
              log(">>> f_decrypt: p_salt=", p_salt);
Denis Filatov's avatar
Denis Filatov committed
                // Check the private encryption key
                if (not(isbound(p_encryptPrivateKey))) {
                  log("*** " & testcasename() & ":ERROR: Failed to load encryption private key ***");
                  return false;
                }
Denis Filatov's avatar
Denis Filatov committed
                if (ischosen(v_recipientInfo.certRecipInfo)) {
                  v_pKRecipientInfo := p_encrypedSecuredMessage.content.encryptedData.recipients[0].certRecipInfo;
                  // Read the certificate based on the recipientId
                } else if (ischosen(v_recipientInfo.signedDataRecipInfo)) {
                v_pKRecipientInfo := p_encrypedSecuredMessage.content.encryptedData.recipients[0].signedDataRecipInfo;
                  // Read the certificate based on the recipientId
                } else {
                  log("*** " & testcasename() & ":ERROR: Unsupported RecipientInfo variant ***");
                  return false;
                }
Denis Filatov's avatar
Denis Filatov committed
              log("f_decrypt: v_pKRecipientInfo=", v_pKRecipientInfo);
            if (isbound(v_pKRecipientInfo)) {
                if (ischosen(v_pKRecipientInfo.encKey.eciesNistP256)) {
                  var SymmetricCiphertext v_ciphertext := p_encrypedSecuredMessage.content.encryptedData.ciphertext;
Denis Filatov's avatar
Denis Filatov committed
                  log("f_decrypt: v_ciphertext=", v_ciphertext);
                  if (ischosen(v_pKRecipientInfo.encKey.eciesNistP256.v.compressed_y_0)) {
                      v_decryptedSecuredMessage := f_decryptWithEciesNistp256WithSha256(
                                                                                        v_ciphertext.aes128ccm.ccmCiphertext,
                                                                                        p_encryptPrivateKey,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.v.compressed_y_0,
                                                                                        0,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.c,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.t,
                                                                                        v_ciphertext.aes128ccm.nonce,
                                                                                        p_salt,
                                                                                        p_aes_sym_enc_key
                                                                                        );
                  } else if (ischosen(v_pKRecipientInfo.encKey.eciesNistP256.v.compressed_y_1)) {
                      v_decryptedSecuredMessage := f_decryptWithEciesNistp256WithSha256(
                                                                                        v_ciphertext.aes128ccm.ccmCiphertext,
                                                                                        p_encryptPrivateKey,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.v.compressed_y_1,
                                                                                        1,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.c,
                                                                                        v_pKRecipientInfo.encKey.eciesNistP256.t,
                                                                                        v_ciphertext.aes128ccm.nonce,
                                                                                        p_salt,
                                                                                        p_aes_sym_enc_key
                                                                                        );
                  } else {
                    log("*** " & testcasename() & ":ERROR: Non canonical ephemeral encryption keys ***");
                    return false;
                  }
                  if (isbound(v_decryptedSecuredMessage)) {
                    var bitstring v_decode := oct2bit(v_decryptedSecuredMessage);
                    if (decvalue(v_decode, p_decrypedSecuredMessage) == 0) {
                      return true;
                    } else {
                      log("*** " & testcasename() & ":ERROR: Faild to decode secured message ***");
                    }
                  }
                } else if (ischosen(v_pKRecipientInfo.encKey.eciesBrainpoolP256r1)) {
                  var SymmetricCiphertext v_ciphertext := p_encrypedSecuredMessage.content.encryptedData.ciphertext;
                  if (ischosen(v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.v.compressed_y_0)) {
                    v_decryptedSecuredMessage := f_decryptWithEciesBrainpoolp256r1WithSha256(
                                                                                           v_ciphertext.aes128ccm.ccmCiphertext,
                                                                                           p_encryptPrivateKey,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.v.compressed_y_0,
                                                                                           0,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.c,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.t,
                                                                                           v_ciphertext.aes128ccm.nonce,
                                                                                           p_salt,                                                                                                                                                     p_aes_sym_enc_key
                                                                                      );
                  } else if (ischosen(v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.v.compressed_y_1)) {
                    v_decryptedSecuredMessage := f_decryptWithEciesBrainpoolp256r1WithSha256(
                                                                                           v_ciphertext.aes128ccm.ccmCiphertext,
                                                                                           p_encryptPrivateKey,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.v.compressed_y_1,
                                                                                           1,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.c,
                                                                                           v_pKRecipientInfo.encKey.eciesBrainpoolP256r1.t,
                                                                                           v_ciphertext.aes128ccm.nonce,
                                                                                           p_salt,
                                                                                           p_aes_sym_enc_key
                                                                                      );
                  } else {
                    log("*** " & testcasename() & ":ERROR: Non canonical ephemeral encryption keys ***");
                    return false;
                  }
              } else {
                log("*** " & testcasename() & ":ERROR: Non canonical ephemeral encryption keys ***");
                return false;
              }
              // TODO else, other variants shall be processed here if
            } else {
              log("*** " & testcasename() & ":ERROR: Invalid recipient info ***");
              return false;
            }
                  if (isbound(v_decryptedSecuredMessage)) {
                    var bitstring v_decode := oct2bit(v_decryptedSecuredMessage);
                    if (decvalue(v_decode, p_decrypedSecuredMessage) == 0) {
                      return true;
                    } else {
                      log("*** " & testcasename() & ":ERROR: Faild to decode secured message ***");
                    }
                  }
            } else {
              log("*** " & testcasename() & ":ERROR: Message not encrypted ***");
            }
Denis Filatov's avatar
Denis Filatov committed
            return false;
        } // End of function f_decrypt

        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) encryption using Nist-P256 algorithm
         * @param   p_toBeEncryptedSecuredMessage    The data to be encrypted
         * @param   p_recipientsPublicKeyCompressed  The Recipient's compressed public key
         * @param   p_compressed_mode                 The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         * @return  The encrypted message
         */
        function f_encryptWithEciesNistp256WithSha256(
                                                      in octetstring p_toBeEncryptedSecuredMessage,
                                                      in Oct32 p_recipientsPublicKeyCompressed,
                                                      in integer p_compressed_mode,
                                                      in octetstring p_salt,
                                                      out Oct32 p_publicEphemeralKeyCompressed,
                                                      out integer p_ephemeralKeyModeCompressed,
                                                      out Oct16 p_aes_sym_key,
                                                      out Oct16 p_encrypted_sym_key,
                                                      out Oct16 p_authentication_vector,
                                                      out Oct12 p_nonce
        ) return octetstring {
          return fx_encryptWithEciesNistp256WithSha256(
                                                       p_toBeEncryptedSecuredMessage,
                                                       p_recipientsPublicKeyCompressed,
                                                       p_compressed_mode,
                                                       p_salt,
                                                       p_publicEphemeralKeyCompressed,
                                                       p_ephemeralKeyModeCompressed,
                                                       p_aes_sym_key,
                                                       p_encrypted_sym_key,
                                                       p_authentication_vector,
                                                       p_nonce
                                                       );
        } // End of function f_encryptWithEciesNistp256WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) decryption using Nist-P256 algorithm
         * @param   p_encryptedSecuredMessage    The data to be decrypted
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @return  The decrypted message
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         */
        function f_decryptWithEciesNistp256WithSha256(
                                                      in octetstring p_encryptedSecuredMessage,
                                                      in Oct32 p_privateEncKey,
                                                      in Oct32 p_publicEphemeralKeyCompressed,
                                                      in integer p_ephemeralKeyModeCompressed,
                                                      in Oct16 p_encrypted_sym_key,
                                                      in Oct16 p_authentication_vector,
                                                      in Oct12 p_nonce,
                                                      in Oct32 p_salt,
                                                      out Oct16 p_aes_sym_enc_key
        ) return octetstring {
          return fx_decryptWithEciesNistp256WithSha256(
                                                       p_encryptedSecuredMessage,
                                                       p_privateEncKey,
                                                       p_publicEphemeralKeyCompressed, 
                                                       p_ephemeralKeyModeCompressed,
                                                       p_encrypted_sym_key,
                                                       p_authentication_vector,
                                                       p_nonce,
                                                       p_salt,
                                                       p_aes_sym_enc_key
                                                       );
        } // End of function f_decryptWithEcdsaNistp256WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) encryption using Brainpool-P256 algorithm
         * @param   p_toBeEncryptedSecuredMessage    The data to be encrypted
         * @param   p_recipientsPublicKeyCompressed  The Recipient's compressed public key
         * @param   p_compressed_mode                 The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @return  The encrypted message
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         */
        function f_encryptWithEciesBrainpoolp256r1WithSha256(
                                                           in octetstring p_toBeEncryptedSecuredMessage,
                                                           in Oct32 p_recipientsPublicKeyCompressed,
                                                           in integer p_compressed_mode,
                                                           in octetstring p_salt,
                                                           out Oct32 p_publicEphemeralKeyCompressed,
                                                           out integer p_ephemeralKeyModeCompressed,
                                                           out Oct16 p_aes_sym_key,
                                                           out Oct16 p_encrypted_sym_key,
                                                           out Oct16 p_authentication_vector,
                                                           out Oct12 p_nonce
        ) return octetstring {
          return fx_encryptWithEciesBrainpoolp256r1WithSha256(
                                                            p_toBeEncryptedSecuredMessage,
                                                            p_recipientsPublicKeyCompressed,
                                                            p_compressed_mode,
                                                            p_salt,
                                                            p_publicEphemeralKeyCompressed,
                                                            p_ephemeralKeyModeCompressed,
                                                            p_aes_sym_key,
                                                            p_encrypted_sym_key,
                                                            p_authentication_vector,
                                                            p_nonce
                                                            );
        } // End of function f_encryptWithEciesBrainpoolp256r1WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) decryption using Brainpool-P256 algorithm
         * @param   p_encryptedSecuredMessage    The data to be decrypted
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @return  The decrypted message
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         */
        function f_decryptWithEciesBrainpoolp256r1WithSha256(
                                                           in octetstring p_encryptedSecuredMessage,
                                                           in Oct32 p_privateEncKey,
                                                           in Oct32 p_publicEphemeralKeyCompressed, 
                                                           in integer p_ephemeralKeyModeCompressed,
                                                           in Oct16 p_encrypted_sym_key,
                                                           in Oct16 p_authentication_vector,
                                                           in Oct12 p_nonce,
                                                           in Oct32 p_salt,
                                                           out Oct16 p_aes_sym_enc_key
        ) return octetstring {
          return fx_decryptWithEciesBrainpoolp256r1WithSha256(
                                                            p_encryptedSecuredMessage,
                                                            p_privateEncKey,
                                                            p_publicEphemeralKeyCompressed, 
                                                            p_ephemeralKeyModeCompressed,
                                                            p_encrypted_sym_key,
                                                            p_authentication_vector,
                                                            p_nonce,
                                                            p_salt,
                                                            p_aes_sym_enc_key
                                                            );
        } // End of function f_decryptWithEcdsaBrainpoolp256r1WithSha256

        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) encryption using Sm2-P256 algorithm
         * @param   p_toBeEncryptedSecuredMessage    The data to be encrypted
         * @param   p_recipientsPublicKeyCompressed  The Recipient's compressed public key
         * @param   p_compressed_mode                 The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @return  The encrypted message
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         */
        function f_encryptWithEciesSm2p256WithSha256(
                                                     in octetstring p_toBeEncryptedSecuredMessage,
                                                     in Oct32 p_recipientsPublicKeyCompressed,
                                                     in integer p_compressed_mode,
                                                     in octetstring p_salt,
                                                     out Oct32 p_publicEphemeralKeyCompressed,
                                                     out integer p_ephemeralKeyModeCompressed,
                                                     out Oct16 p_aes_sym_key,
                                                     out Oct16 p_encrypted_sym_key,
                                                     out Oct16 p_authentication_vector,
                                                     out Oct12 p_nonce
        ) return octetstring {
          return fx_encryptWithEciesSm2p256WithSha256(
                                                      p_toBeEncryptedSecuredMessage,
                                                      p_recipientsPublicKeyCompressed,
                                                      p_compressed_mode,
                                                      p_salt,
                                                      p_publicEphemeralKeyCompressed,
                                                      p_ephemeralKeyModeCompressed,
                                                      p_aes_sym_key,
                                                      p_encrypted_sym_key,
                                                      p_authentication_vector,
                                                      p_nonce
                                                      );
        } // End of function f_encryptWithEciesSm2p256WithSha256
        /**
         * @desc    Produces a Elliptic Curve Digital Encrytion Algorithm (ECIES) decryption using Brainpool-P256 algorithm
         * @param   p_encryptedSecuredMessage    The data to be decrypted
         * @param   p_publicEphemeralKeyCompressed   The generated ephemeral compressed key
         * @param   p_ephemeralKeyModeCompressed     The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @param   p_encrypted_sym_key              The encrypted AES 128 CCM symmetric key
         * @param   p_authentication_vector          The tag of the AES 128 CCM symmetric key encryption
         * @param   p_nonce                          The nonce vector of the AES 128 CCM symmetric key encryption
         * @return  The decrypted message
         * @see IEEE Std 1609.2-2017 Clause 5.3.5 Public key encryption algorithms: ECIES
         * @see https://www.nominet.uk/researchblog/how-elliptic-curve-cryptography-encryption-works/
         * @see http://digital.csic.es/bitstream/10261/32671/1/V2-I2-P7-13.pdf
         */
        function f_decryptWithEciesSm2p256WithSha256(
                                                     in octetstring p_encryptedSecuredMessage,
                                                     in Oct32 p_privateEncKey,
                                                     in Oct32 p_publicEphemeralKeyCompressed, 
                                                     in integer p_ephemeralKeyModeCompressed,
                                                     in Oct16 p_encrypted_sym_key,
                                                     in Oct16 p_authentication_vector,
                                                     in Oct12 p_nonce,
                                                     in Oct32 p_salt,
                                                     out Oct16 p_aes_sym_enc_key
        ) return octetstring {
          return fx_decryptWithEciesSm2p256WithSha256(
                                                      p_encryptedSecuredMessage,
                                                      p_privateEncKey,
                                                      p_publicEphemeralKeyCompressed, 
                                                      p_ephemeralKeyModeCompressed,
                                                      p_encrypted_sym_key,
                                                      p_authentication_vector,
                                                      p_nonce,
                                                      p_salt,
                                                      p_aes_sym_enc_key
                                                      );
        } // End of function f_decryptWithEcdsaSm2WithSm3

Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc Compute the HashedId8 value from the hash value
         * @param p_hash The hash value
         * @return The HashedId8 value
         * @verdict
         */
        function f_hashedId8FromSha256( 
                                       in Oct32 p_hash
        ) return HashedId8 {
            return substr(p_hash, lengthof(p_hash) - 8, 8);
        } // End of function f_hashedId8FromSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc Compute the HashedId8 value from the hash value
         * @param p_hash The hash value
         * @return The HashedId8 value
         * @verdict
         */
        function f_hashedId8FromSha384( 
                                       in Oct48 p_hash
        ) return HashedId8 {
            return substr(p_hash, lengthof(p_hash) - 8, 8);
        } // End of function f_hashedId8FromSha384
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc Compute the HashedId3 value from the HashedId8 value
         * @param p_hashp_hashedId8 The HashedId8 value
         * @return The HashedId3 value
         * @verdict Unchanged
         */
        function f_hashedId3FromHashedId8(
                                          in HashedId8 p_hashedId8
        ) return HashedId3 {
            return substr(p_hashedId8, lengthof(p_hashedId8) - 3, 3);
        }  // End of function f_hashedId3FromHashedId8
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaNistp256PublicKeyCompressed   The compressed public key
         * @param   p_compressed_mode The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaNistp256WithSha256(
                                                     in octetstring p_toBeVerifiedData,
                                                     in Oct32 p_certificateIssuer,
                                                     in Oct64 p_signature,
                                                     in Oct32 p_ecdsaNistp256PublicKeyCompressed,
                                                     in integer p_compressed_mode
        ) return boolean {
            return fx_verifyWithEcdsaNistp256WithSha256(
                                                        p_toBeVerifiedData,
                                                        p_certificateIssuer,
                                                        p_signature,
                                                        p_ecdsaNistp256PublicKeyCompressed,
                                                        p_compressed_mode
                                                        );
        } // End of function f_verifyWithEcdsaNistp256WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaNistp256PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaNistp256PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaNistp256WithSha256_1( // TODO To be removed
                                                       in octetstring p_toBeVerifiedData,
                                                       in Oct32 p_certificateIssuer,
                                                       in Oct64 p_signature,
                                                       in Oct32 p_ecdsaNistp256PublicKeyX,
                                                       in Oct32 p_ecdsaNistp256PublicKeyY
        ) return boolean {
            return fx_verifyWithEcdsaNistp256WithSha256_1(
                p_toBeVerifiedData,
                p_certificateIssuer,
                p_signature,
                p_ecdsaNistp256PublicKeyX,
                p_ecdsaNistp256PublicKeyY);
        } // End of function f_verifyWithEcdsaNistp256WithSha256_1
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp256PublicKeyCompressed   The compressed public key
         * @param   p_compressed_mode The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaBrainpoolp256r1WithSha256(
                                                            in octetstring p_toBeVerifiedData,
                                                            in Oct32 p_certificateIssuer,
                                                            in Oct64 p_signature,
                                                            in Oct32 p_ecdsaBrainpoolp256PublicKeyCompressed,
                                                            in integer p_compressed_mode
Denis Filatov's avatar
Denis Filatov committed
        ) return boolean {
            return fx_verifyWithEcdsaBrainpoolp256r1WithSha256(
                                                             p_toBeVerifiedData,
                                                             p_certificateIssuer,
                                                             p_signature,
                                                             p_ecdsaBrainpoolp256PublicKeyCompressed,
                                                             p_compressed_mode
                                                             );
        } // End of function f_verifyWithEcdsaBrainpoolp256r1WithSha256
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp256PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaBrainpoolp256PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaBrainpoolp256r1WithSha256_1( // TODO To be removed
                                                              in octetstring p_toBeVerifiedData,
                                                              in Oct32 p_certificateIssuer,
                                                              in Oct64 p_signature,
                                                              in Oct32 p_ecdsaBrainpoolp256PublicKeyX,
                                                              in Oct32 p_ecdsaBrainpoolp256PublicKeyY
Denis Filatov's avatar
Denis Filatov committed
        ) return boolean {
            return fx_verifyWithEcdsaBrainpoolp256r1WithSha256_1(
                p_toBeVerifiedData,
                p_certificateIssuer,
                p_signature,
                p_ecdsaBrainpoolp256PublicKeyX,
                p_ecdsaBrainpoolp256PublicKeyY);
        } // End of function f_verifyWithEcdsaBrainpoolp256r1WithSha256_1
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp384PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaBrainpoolp384PublicKeyY   The public key (y coordinate)
         * @param   p_compressed_mode The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaBrainpoolp384r1WithSha384(
                                                            in octetstring p_toBeVerifiedData,
                                                            in Oct48 p_certificateIssuer,
                                                            in Oct96 p_signature,
                                                            in Oct48 p_ecdsaBrainpoolp384PublicKeyCompressed,
                                                            in integer p_compressed_mode
Denis Filatov's avatar
Denis Filatov committed
        ) return boolean {
            return fx_verifyWithEcdsaBrainpoolp384r1WithSha384(
                                                             p_toBeVerifiedData,
                                                             p_certificateIssuer,
                                                             p_signature,
                                                             p_ecdsaBrainpoolp384PublicKeyCompressed,
                                                             p_compressed_mode
                                                             );
        } // End of function f_verifyWithEcdsaBrainpoolp384r1WithSha384
Denis Filatov's avatar
Denis Filatov committed
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp384PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaBrainpoolp384PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaBrainpoolp384r1WithSha384_1( // TODO To be removed
                                                              in octetstring p_toBeVerifiedData,
                                                              in Oct48 p_certificateIssuer,
                                                              in Oct96 p_signature,
                                                              in Oct48 p_ecdsaBrainpoolp384PublicKeyX,
                                                              in Oct48 p_ecdsaBrainpoolp384PublicKeyY
Denis Filatov's avatar
Denis Filatov committed
        ) return boolean {
            return fx_verifyWithEcdsaBrainpoolp384r1WithSha384_1(
                p_toBeVerifiedData,
                p_certificateIssuer,
                p_signature,
                p_ecdsaBrainpoolp384PublicKeyX,
                p_ecdsaBrainpoolp384PublicKeyY);
        } // End of function f_verifyWithEcdsaBrainpoolp384r1WithSha384_1
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp384PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaBrainpoolp384PublicKeyY   The public key (y coordinate)
         * @param   p_compressed_mode The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaNistp384WithSha384(
                                                     in octetstring p_toBeVerifiedData,
                                                     in Oct48 p_certificateIssuer,
                                                     in Oct96 p_signature,
                                                     in Oct48 p_ecdsaBrainpoolp384PublicKeyCompressed,
                                                     in integer p_compressed_mode
        ) return boolean {
            return fx_verifyWithEcdsaNistp384WithSha384(
                                                        p_toBeVerifiedData,
                                                        p_certificateIssuer,
                                                        p_signature,
                                                        p_ecdsaBrainpoolp384PublicKeyCompressed,
                                                        p_compressed_mode
                                                        );
        } // End of function f_verifyWithEcdsaNistp384WithSha384
        /**
         * @Desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaBrainpoolp384PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaBrainpoolp384PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaNistp384WithSha384_1( // TODO To be removed
                                                       in octetstring p_toBeVerifiedData,
                                                       in Oct48 p_certificateIssuer,
                                                       in Oct96 p_signature,
                                                       in Oct48 p_ecdsaBrainpoolp384PublicKeyX,
                                                       in Oct48 p_ecdsaBrainpoolp384PublicKeyY
        ) return boolean {
            return fx_verifyWithEcdsaNistp384WithSha384_1(
                p_toBeVerifiedData,
                p_certificateIssuer,
                p_signature,
                p_ecdsaBrainpoolp384PublicKeyX,
                p_ecdsaBrainpoolp384PublicKeyY);
        } // End of function f_verifyWithEcdsaNistp384WithSha384_1

        /**
         * @desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaNistp256PublicKeyCompressed   The compressed public key
         * @param   p_compressed_mode The compressed mode, 0 if the latest bit of Y-coordinate is 0, 1 otherwise
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaSm2WithSm3(
                                                     in octetstring p_toBeVerifiedData,
                                                     in Oct32 p_certificateIssuer,
                                                     in Oct64 p_signature,
                                                     in Oct32 p_ecdsaNistp256PublicKeyCompressed,
                                                     in integer p_compressed_mode
        ) return boolean {
            return fx_verifyWithEcdsaSm2WithSm3(
                                                        p_toBeVerifiedData,
                                                        p_certificateIssuer,
                                                        p_signature,
                                                        p_ecdsaNistp256PublicKeyCompressed,
                                                        p_compressed_mode
                                                        );
        } // End of function f_verifyWithEcdsaSm2WithSm3
        /**
         * @desc    Verify the signature of the specified data
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_certificateIssuer         The whole-hash issuer certificate or int2oct(0, 32) in case of self signed certificate
         * @param   p_signature                 The signature
         * @param   p_ecdsaNistp256PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaNistp256PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         */
        function f_verifyWithEcdsaSm2WithSm3_1( // TODO To be removed
                                                       in octetstring p_toBeVerifiedData,
                                                       in Oct32 p_certificateIssuer,
                                                       in Oct64 p_signature,
                                                       in Oct32 p_ecdsaNistp256PublicKeyX,
                                                       in Oct32 p_ecdsaNistp256PublicKeyY
        ) return boolean {
//            log("f_verifyWithEcdsaSm2WithSm3: toBeVerifiedData", p_toBeVerifiedData);
//            log("f_verifyWithEcdsaSm2WithSm3: toBeVerifiedData length", lengthof(p_toBeVerifiedData));
//            log("f_verifyWithEcdsaSm2WithSm3: signature", p_signature);