diff --git a/ccsrc/Framework/include/converter.hh b/ccsrc/Framework/include/converter.hh index 7f2adeb95c0c3b21cb2fd96f6d1c20f0199e4fc4..cdb29e94bc4cfa2d5adcff218c8198d93ce6091b 100644 --- a/ccsrc/Framework/include/converter.hh +++ b/ccsrc/Framework/include/converter.hh @@ -366,6 +366,15 @@ public: */ std::vector<std::string> split_arguments_line(const std::string& p_value); + /*! + * \brief Replace string or character into the the provided string + * \param[in] p_value The original string value + * \param[in] p_from The pattern to be replaced + * \param[in] p_to The new pattern + * \return The modified string + */ + std::string replace(const std::string& p_value, const std::string& p_from, const std::string& p_to); + /*! * \brief Convert the provided buffer into a Base64 * \param[in] p_value The buffer value diff --git a/ccsrc/Framework/src/converter.cc b/ccsrc/Framework/src/converter.cc index 0b2f376fea4df9c80abafdaec532f356cbbb1b81..9df0ad962ba26aa7ebd97530983c22be8d3ecfc5 100644 --- a/ccsrc/Framework/src/converter.cc +++ b/ccsrc/Framework/src/converter.cc @@ -187,6 +187,16 @@ static std::string insert_linebreaks(std::string str, size_t distance) { return str; } +std::string converter::replace(const std::string& p_value, const std::string& p_from, const std::string& p_to) { + size_t start_pos = 0; + std::string str(p_value); + while((start_pos = str.find(p_from, start_pos)) != std::string::npos) { + str.replace(start_pos, p_from.length(), p_to); + start_pos += p_to.length(); // Handles case where 'p_to' is a substring of 'p_from' + } + return str; +} + std::vector<unsigned char> converter::buffer_to_base64(const std::vector<unsigned char> &p_value, const bool p_is_url) { const std::string& base64_enc_map_ = converter::base64_enc_map[(p_is_url) ? 1 : 0]; const unsigned char trailing_char = (p_is_url) ? '.' : '='; diff --git a/ccsrc/security/include/certs_cache.hh b/ccsrc/security/include/certs_cache.hh index 70e24a3f6b92f332face82f492268b72ff1f6d9a..085872aada5248338fd515f195ac50aff7165fad 100644 --- a/ccsrc/security/include/certs_cache.hh +++ b/ccsrc/security/include/certs_cache.hh @@ -85,6 +85,11 @@ public: /*! \publicsection */ void dump() const; + const std::string cert_to_string(const std::string& p_certificate_id); + + int publickey_to_string(const EVP_PKEY* p_public_kep, std::vector<unsigned char>& p_buffer); + + private: /*! \privatesection */ /*! * \fn int load_certificate(const std::string& p_certificate_name, const std::string& p_private_key_name, const std::string& p_private_key_passwd, const certs_db_record** p_record); diff --git a/ccsrc/security/include/certs_db_record.hh b/ccsrc/security/include/certs_db_record.hh index 302b0f89a1e7f7c43b570d4c6bf851b6a656f916..772493ad5036dfc67b1795af403826151fa08f08 100644 --- a/ccsrc/security/include/certs_db_record.hh +++ b/ccsrc/security/include/certs_db_record.hh @@ -62,5 +62,6 @@ public: /*! \publicsection */ inline const EVP_PKEY* private_key() const { return _private_key; }; inline const EVP_PKEY* public_key() const { return ::X509_get_pubkey(_certificate); }; inline const X509_NAME* subject_name() const { return ::X509_get_subject_name(_certificate); }; + inline const X509_NAME* issuer() const { return ::X509_get_issuer_name(_certificate); }; inline const std::string& pem() const { return _pem; }; }; // End of class certs_db_record diff --git a/ccsrc/security/include/security_services.hh b/ccsrc/security/include/security_services.hh index 55befe0acc9b95566bad23b0a01248c72fce13a5..f8c7bf072b81cf98fafe5ec5f5914cc78a65525d 100644 --- a/ccsrc/security/include/security_services.hh +++ b/ccsrc/security/include/security_services.hh @@ -45,10 +45,7 @@ public: /*! \publicsection */ * \fn int do_sign(const OCTETSTRING& p_encoded_message, const CHARSTRING& p_certificate_name, const CHARSTRING& p_private_key_name, const CHARSTRING& p_private_key_passwd, OCTETSTRING& p_signature, OCTETSTRING& p_digest, CHARSTRING& p_x509_certificate_subject, CHARSTRING& p_x509_certificate_pem); * \brief Sign message * \param[in] p_encoded_message The raw message to be signed - * \param[in] p_encoded_message The raw message to be signed - * \param[in] p_encoded_message The raw message to be signed - * \param[in] p_encoded_message The raw message to be signed - * \param[in] p_encoded_message The raw message to be signed + * \param[in] TODO The raw message to be signed * \return 0 on success, -1 otherwise */ int do_sign(const OCTETSTRING& p_encoded_message, const CHARSTRING& p_certificate_name, const CHARSTRING& p_private_key_name, const CHARSTRING& p_private_key_passwd, OCTETSTRING& p_signature, OCTETSTRING& p_digest, CHARSTRING& p_x509_certificate_subject, CHARSTRING& p_x509_certificate_pem, CHARSTRING& p_pull_request_signed_canonicalized); @@ -59,5 +56,5 @@ public: /*! \publicsection */ * \param[in] TODO * \return true on success, false otherwise */ - bool do_sign_verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate); + bool do_sign_verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate, const CHARSTRING& p_debug_message); }; \ No newline at end of file diff --git a/ccsrc/security/src/certs_cache.cc b/ccsrc/security/src/certs_cache.cc index c41d7b06f6b07841525ec14d954ccce3f3517d50..761fbb0302fe1b2f9ed08a2dde3dd3a18b8b095b 100644 --- a/ccsrc/security/src/certs_cache.cc +++ b/ccsrc/security/src/certs_cache.cc @@ -72,10 +72,10 @@ int certs_cache::load_certificate(const std::string& p_certificate_name, const s *p_record = it->second.get(); // Mapping certificate id/certificate name _certificates_idx.insert(std::pair<std::string, const std::string>(certificate_id, p_certificate_name)); - std::string sn(512, (char)0x00); + std::string sn(256, (char)0x00); const X509_NAME* subject = (*p_record)->subject_name(); ::X509_NAME_oneline(subject, sn.data(), sn.length()); - loggers::get_instance().log("certs_cache::load_certificate: sn: '%s'", sn.c_str()); + loggers::get_instance().log("certs_cache::load_certificate: sn: '%s'", sn.c_str()); _certificates_subject.insert(std::pair<std::string, const std::string>(sn, certificate_id)); } else { // Certificate is on the DB, load it @@ -191,7 +191,7 @@ int certs_cache::store_certificate(const std::string& p_certificate_name, const *p_record = it->second.get(); // Mapping certificate id/certificate name _certificates_idx.insert(std::pair<std::string, const std::string>(p_certificate_id, p_certificate_name)); - std::string sn(512, (char)0x00); + std::string sn(256, (char)0x00); const X509_NAME* subject = (*p_record)->subject_name(); ::X509_NAME_oneline(subject, sn.data(), sn.length()); loggers::get_instance().log("certs_cache::store_certificate: sn: '%s'", sn.c_str()); @@ -207,3 +207,53 @@ void certs_cache::dump() const { const certs_db_record *p = it->second.get(); } // End of 'for' statement } // End of method dump + +const std::string certs_cache::cert_to_string(const std::string& p_certificate_id) { + loggers::get_instance().log(">>> certs_cache::cert_to_string: '%s'", p_certificate_id.c_str()); + + const certs_db_record* record; + if (load_certificate(p_certificate_id, &record) == -1) { + loggers::get_instance().warning("certs_cache::cert_to_string: Failed to load certificate"); + return std::string(::ERR_error_string(::ERR_get_error(), nullptr));; + } + + BIO* bio = ::BIO_new(::BIO_s_mem()); + if (bio == nullptr) { + loggers::get_instance().warning("certs_cache::cert_to_string: Failed to dunp certificate"); + return std::string(::ERR_error_string(::ERR_get_error(), nullptr)); + } + + if (::PEM_write_bio_X509(bio, (X509*)record->certificate()) == 0) { + ::BIO_free(bio); + loggers::get_instance().warning("certs_cache::cert_to_string: Failed to dunp certificate"); + return std::string(::ERR_error_string(::ERR_get_error(), nullptr)); + } + + size_t len = ::BIO_get_mem_data(bio, nullptr); + std::string s(len, 0x00); + ::BIO_read(bio, s.data(), len); + ::BIO_free(bio); + loggers::get_instance().log("certs_cache::cert_to_string: dump: '%s'", s.c_str()); + + return s; +} + +int certs_cache::publickey_to_string(const EVP_PKEY* p_public_kep, std::vector<unsigned char>& p_buffer) { + loggers::get_instance().log(">>> certs_cache::publickey_to_string: '%p'", p_public_kep); + + unsigned char buffer[512]; + unsigned char* ptr = &buffer[0]; + int ret = ::i2d_PublicKey((EVP_PKEY*)p_public_kep, &ptr); + loggers::get_instance().log("certs_cache::publickey_to_string: ret: '%d'", ret); + if (ret < 0) { + loggers::get_instance().warning("certs_cache::publickey_to_string: Failed to dunp certificate"); + p_buffer.clear(); + return -1; + } + + p_buffer.assign((unsigned char*)buffer, (unsigned char*)(buffer + ret)); + loggers::get_instance().log("certs_cache::publickey_to_string: p_buffer len: '%d'", p_buffer.size()); + loggers::get_instance().log("certs_cache::publickey_to_string: dump: '%s'", converter::get_instance().bytes_to_hexa(p_buffer).c_str()); + + return 0; +} \ No newline at end of file diff --git a/ccsrc/security/src/security_externals.cc b/ccsrc/security/src/security_externals.cc index 452ce0847508e7287e0ceab409ca3eeb8f6b2dfe..bc7446e3fc032bdeb055f0c1699ca79e13594809 100644 --- a/ccsrc/security/src/security_externals.cc +++ b/ccsrc/security/src/security_externals.cc @@ -80,10 +80,10 @@ INTEGER LibSecurity__Signature::fx__sign(const OCTETSTRING& p_encoded_message, c return 0; } -BOOLEAN LibSecurity__Signature::fx__do__sign__verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate) { +BOOLEAN LibSecurity__Signature::fx__do__sign__verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate, const CHARSTRING& p_debug_message) { loggers::get_instance().log(">>> fx__do__sign__verify"); - if (!_security_services->do_sign_verify(p_message, p_canonicalization_method, p_signature_method, p_digest_method, p_digest_value, p_signature_value, p_subject_name, p_certificate)) { + if (!_security_services->do_sign_verify(p_message, p_canonicalization_method, p_signature_method, p_digest_method, p_digest_value, p_signature_value, p_subject_name, p_certificate, p_debug_message)) { loggers::get_instance().log("fx__do__sign__verify: Failed to verify message signature"); return false; } diff --git a/ccsrc/security/src/securty_services.cc b/ccsrc/security/src/securty_services.cc index cca8948cb8e7a8aa39f4c19e1f41fa372b290ba9..aded5e9309913b7ded2a4ef676ef6f70eb0d2ef8 100644 --- a/ccsrc/security/src/securty_services.cc +++ b/ccsrc/security/src/securty_services.cc @@ -63,12 +63,12 @@ int security_services::do_sign(const OCTETSTRING& p_encoded_message, const CHARS loggers::get_instance().warning("security_services::do_sign: Failed to retrieve certificate"); return -1; } + loggers::get_instance().log("security_services::do_sign: certificate dump: '%s'", _certs_db->cert_to_string(certificate_id).c_str()); X509_NAME* sn = X509_get_subject_name((X509*)certificate); std::string subject(512, (char)0x00); ::X509_NAME_oneline(sn, (char*)subject.c_str(), subject.length()); loggers::get_instance().log("security_services::do_sign: X509_NAME_oneline: '%s'", subject.c_str()); p_x509_certificate_subject = CHARSTRING(subject.c_str()); - X509_free((X509*)certificate); std::string str; if (_certs_db->get_certificate_pem(certificate_id, str) != 0) { @@ -80,7 +80,7 @@ int security_services::do_sign(const OCTETSTRING& p_encoded_message, const CHARS // Compute the digest sha256 digest; digest.generate(char2oct(CHARSTRING(canonicalized.c_str())), p_digest); - loggers::get_instance().log_msg("security_services::do_sign: p_digest: ", p_digest); + loggers::get_instance().log_msg("security_services::do_sign: digest: ", p_digest); // Retrive the private key const EVP_PKEY* private_key; @@ -114,26 +114,53 @@ int security_services::do_sign(const OCTETSTRING& p_encoded_message, const CHARS ::EVP_MD_CTX_free(ctx); return -1; } + if (signature_length != ::EVP_PKEY_size(private_key)) { + loggers::get_instance().warning("security_services::do_sign: Wrong signature length"); + ::EVP_MD_CTX_free(ctx); + return -1; + } loggers::get_instance().log("security_services::do_sign: signature_length: %d", signature_length); std::vector<unsigned char> s(signature_length, 0x00); - unsigned char* val = s.data(); - if (::EVP_DigestSignFinal(ctx, val, &signature_length) != 1) { + if (::EVP_DigestSignFinal(ctx, s.data(), &signature_length) != 1) { loggers::get_instance().warning("security_services::do_sign: EVP_DigestSignUpdate failed, error 0x%lx", ::ERR_get_error()); ::EVP_MD_CTX_free(ctx); s.clear(); return -1; } + ::EVP_MD_CTX_free(ctx); + + // Ensure that the signature round-trips + // Retrive the public key + const EVP_PKEY* public_key; + if (_certs_db->get_private_key(certificate_id, &public_key) == 1) { + loggers::get_instance().warning("security_services::do_sign: Failed to retrieve private key"); + return -1; + } + loggers::get_instance().log("security_services::do_sign: public_key: '%p'", public_key); + std::vector<unsigned char> buffer; + _certs_db->publickey_to_string(public_key, buffer); + ctx = ::EVP_MD_CTX_new(); + if (!::EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, (EVP_PKEY*)public_key) || + !::EVP_DigestVerifyUpdate(ctx, (const unsigned char*)canonicalized.c_str(), canonicalized.length()) || + !::EVP_DigestVerifyFinal(ctx, s.data(), s.size())) { + loggers::get_instance().warning("security_services::do_sign: Failed to verify signature, error 0x%lx", ::ERR_get_error()); + ::EVP_MD_CTX_free(ctx); + s.clear(); + return -1; + } + ::EVP_MD_CTX_free(ctx); + loggers::get_instance().log("security_services::do_sign: signature was verified with public key"); p_signature = OCTETSTRING(signature_length, s.data()); - ::EVP_MD_CTX_free(ctx); loggers::get_instance().log_msg("<<< security_services::do_sign: signature: ", p_signature); return 0; } -bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate) { - loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_message: ", p_message); +bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVERSAL_CHARSTRING& p_canonicalization_method, const UNIVERSAL_CHARSTRING& p_signature_method, const UNIVERSAL_CHARSTRING& p_digest_method, const UNIVERSAL_CHARSTRING& p_digest_value, const UNIVERSAL_CHARSTRING& p_signature_value, const UNIVERSAL_CHARSTRING& p_subject_name, const UNIVERSAL_CHARSTRING& p_certificate, const CHARSTRING& p_debug_message) { + loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_message: ", p_message); + loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_debug_message: ", p_debug_message); loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_canonicalization_method: ", p_canonicalization_method); loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_subject_name: ", p_subject_name); loggers::get_instance().log_msg(">>> security_services::do_sign_verify: p_signature_method: ", p_signature_method); @@ -151,13 +178,20 @@ bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVER if (_certs_db->get_certificate_by_subject_name(sn, &certificate) != 0) { loggers::get_instance().warning("security_services::do_sign_verify: Failed to retrieve certificate"); // Use provided certificate if any - size_t i = sn.find_first_of("CN="); + loggers::get_instance().log("security_services::do_sign_verify: sn='%s'", sn.c_str()); + size_t i = sn.find("CN="); if (i == std::string::npos) { loggers::get_instance().warning("security_services::do_sign_verify: Failed to extract certificate name"); return false; } - size_t j = sn.find_first_of(","); - std::string certificate_name = sn.substr(i + 3, j - i - 3); + size_t j = sn.find(",", i + 3); + std::string certificate_name; + if (j == std::string::npos) { + certificate_name = sn.substr(i + 3); + } else { + certificate_name = sn.substr(i + 3, j - i - 3); + } + certificate_name = converter::get_instance().replace(certificate_name, "-", "_"); loggers::get_instance().log("security_services::do_sign_verify: certificate name: '%s'", certificate_name.c_str()); const certs_db_record* record; if (_certs_db->store_certificate(certificate_name, std::string(static_cast<const char*>(unichar2char(p_certificate))), certificate_id, &record) == -1) { @@ -166,6 +200,7 @@ bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVER } loggers::get_instance().log("security_services::do_sign_verify: certificate id: '%s'", record->certificate_id().c_str()); } + loggers::get_instance().log("security_services::do_sign_verify: certificate dump: '%s'", _certs_db->cert_to_string(certificate_id).c_str()); // Retrive the public key const EVP_PKEY* public_key; @@ -174,7 +209,9 @@ bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVER loggers::get_instance().warning("security_services::do_sign_verify: Failed to retrieve public key"); return false; } - loggers::get_instance().log("security_services::do_sign: public_key: '%p'", public_key); + loggers::get_instance().log("security_services::do_sign_verify: public_key: '%p'", public_key); + std::vector<unsigned char> buffer; + _certs_db->publickey_to_string(public_key, buffer); // Create signing context EVP_MD_CTX* ctx = ::EVP_MD_CTX_new(); @@ -185,46 +222,41 @@ bool security_services::do_sign_verify(const CHARSTRING& p_message, const UNIVER std::string signature_method(static_cast<const char*>(unichar2char(p_signature_method))); // E.g. http://www.w3.org/2000/09/xmldsig#rsa-sha1 const EVP_MD *md; if (signature_method.find("sha1") != std::string::npos) { - md = EVP_sha1(); + loggers::get_instance().log("security_services::do_sign_verify: signature method: sha1"); + md = EVP_sha1(); } else if (signature_method.find("sha256") != std::string::npos) { + loggers::get_instance().log("security_services::do_sign_verify: signature method: sha256"); md = EVP_sha256(); } else if (signature_method.find("sha384") != std::string::npos) { + loggers::get_instance().log("security_services::do_sign_verify: signature method: sha384"); md = EVP_sha384(); } else { + loggers::get_instance().error("security_services::do_sign_verify: Unsupported signature method"); return false; } - if (::EVP_DigestVerifyInit(ctx, NULL, md, NULL, (EVP_PKEY*)public_key) != 1) { // FIXME Add parameter to chose the digest algorithm + // Check signature + if (::EVP_DigestVerifyInit(ctx, NULL, md, NULL, (EVP_PKEY*)public_key) != 1) { loggers::get_instance().warning("security_services::do_sign_verify: EVP_DigestVerifyInit failed, error 0x%lx", ::ERR_get_error()); ::EVP_MD_CTX_free(ctx); return false; } + if(::EVP_DigestVerifyUpdate(ctx, (const char*)p_message, p_message.lengthof()) != 1) { + loggers::get_instance().warning("security_services::do_sign_verify: EVP_DigestVerifyUpdate failed, error 0x%lx - %s", ::ERR_get_error(), ::ERR_error_string(::ERR_get_error(), nullptr)); + ::EVP_MD_CTX_free(ctx); + return false; + } std::string signature_value(static_cast<const char*>(unichar2char(p_signature_value))); // Remove CR/LF if any //signature_value.erase(std::remove(signature_value.begin(), signature_value.end(), '\r'), signature_value.end()); //signature_value.erase(std::remove(signature_value.begin(), signature_value.end(), '\n'), signature_value.end()); - loggers::get_instance().warning("security_services::do_sign_verify: Before B64 decoded: '%s'", signature_value.c_str()); + loggers::get_instance().log("security_services::do_sign_verify: Before B64 decoded: '%s'", signature_value.c_str()); // Convert into bytes buffer const std::vector<unsigned char> to_decode((const unsigned char*)signature_value.c_str(), static_cast<const unsigned char*>((const unsigned char*)signature_value.c_str() + signature_value.length())); std::vector<unsigned char> b64 = converter::get_instance().base64_to_buffer(to_decode); - loggers::get_instance().warning("security_services::do_sign_verify: B64 decoded: '%s'", converter::get_instance().bytes_to_hexa(b64, true).c_str()); - - - // EVP_ENCODE_CTX *ctx_ = ::EVP_ENCODE_CTX_new(); - // ::EVP_DecodeInit(ctx_); - // std::vector<unsigned char> b64_(1024, 0x00); - // int outl1 = 0; - // int outl2 = 0; - // ::EVP_DecodeUpdate(ctx_, b64_.data(), &outl1, to_decode.data(), to_decode.size()); - // ::EVP_DecodeFinal(ctx_, b64_.data(), &outl2); - // ::EVP_ENCODE_CTX_free(ctx_); - // b64_.resize(outl1 + outl2); - // loggers::get_instance().log("security_services::do_sign_verify: B64_ decoded: '%s'", converter::get_instance().bytes_to_hexa(b64_, true).c_str()); - - - - // Check signature + loggers::get_instance().log("security_services::do_sign_verify: B64 decoded: '%s'", converter::get_instance().bytes_to_hexa(b64, true).c_str()); + loggers::get_instance().log("security_services::do_sign_verify: B64 decoded len: '%d'", b64.size()); if(::EVP_DigestVerifyFinal(ctx, b64.data(), b64.size()) != 1) { - loggers::get_instance().warning("security_services::do_sign_verify: EVP_DigestVerifyFinal failed, error 0x%lx", ::ERR_get_error()); + loggers::get_instance().warning("security_services::do_sign_verify: EVP_DigestVerifyFinal failed, error 0x%lx - %s", ::ERR_get_error(), ::ERR_error_string(::ERR_get_error(), nullptr)); ::EVP_MD_CTX_free(ctx); return false; } diff --git a/ttcn/LibSecurity/ttcn/LibSecurity_Signature.ttcn b/ttcn/LibSecurity/ttcn/LibSecurity_Signature.ttcn index 198c03c601c1ecffa76468c24775868e974af266..52bf3c57ff55471aec23141aac7c46ea11798106 100644 --- a/ttcn/LibSecurity/ttcn/LibSecurity_Signature.ttcn +++ b/ttcn/LibSecurity/ttcn/LibSecurity_Signature.ttcn @@ -42,11 +42,12 @@ module LibSecurity_Signature { in universal charstring p_digest_value, in universal charstring p_signature_value, in universal charstring p_subject_name, - in universal charstring p_certificate + in universal charstring p_certificate, + in charstring p_debug_message ) return boolean { - return fx_do_sign_verify(p_message, p_canonicalization_method, p_signature_method, p_digest_method, p_digest_value, p_signature_value, p_subject_name, p_certificate); + return fx_do_sign_verify(p_message, p_canonicalization_method, p_signature_method, p_digest_method, p_digest_value, p_signature_value, p_subject_name, p_certificate, p_debug_message); } - external function fx_do_sign_verify(in charstring p_message, in universal charstring p_canonicalization_method, in universal charstring p_signature_method, in universal charstring p_digest_method, in universal charstring p_digest_value, in universal charstring p_signature_value, in universal charstring p_subject_name, in universal charstring p_certificate) return boolean; + external function fx_do_sign_verify(in charstring p_message, in universal charstring p_canonicalization_method, in universal charstring p_signature_method, in universal charstring p_digest_method, in universal charstring p_digest_value, in universal charstring p_signature_value, in universal charstring p_subject_name, in universal charstring p_certificate, in charstring p_debug_message) return boolean; } // End of LibSecurity_Signature \ No newline at end of file