Commit 524df4ef authored by Yann Garcia's avatar Yann Garcia
Browse files

Major bugs fixed in XML Signature

parent 25b94cec
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -241,9 +241,8 @@ const std::string certs_cache::cert_to_string(const std::string& p_certificate_i
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);
  unsigned char* buffer = nullptr;
  int ret = ::i2d_PublicKey((EVP_PKEY*)p_public_kep, &buffer);
  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");
@@ -252,6 +251,7 @@ int certs_cache::publickey_to_string(const EVP_PKEY* p_public_kep, std::vector<u
  }

  p_buffer.assign((unsigned char*)buffer, (unsigned char*)(buffer + ret));
  ::OPENSSL_free(buffer);
  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());

+13 −3
Original line number Diff line number Diff line
@@ -32,6 +32,12 @@ static int transform_signature_workaround(std::string& str) {
    //loggers::get_instance().log("transform_signature_workaround: New str (3): '%s'", str.c_str());
    first = str.find("&quot;");
  } // End of 'while'statement
  first = str.find("&#13;");
  while ((first != -1) && (first < str.length())) {
    str = str.substr(0, first) + "\r" + str.substr(first + 5,  str.length() - 5);
    //loggers::get_instance().log("transform_signature_workaround: New str (4): '%s'", str.c_str());
    first = str.find("&#13;");
  } // End of 'while'statement

  std::replace(str.begin(), str.end(), '\'', '\"');

@@ -49,23 +55,26 @@ static int transform_xslt_workaround(std::string& str) {
  int first = str.find("<", start);
  while ((first != -1) && (first < stop)) {
    //loggers::get_instance().log("transform_xslt_workaround: first='%d' ", first);
    str = str.substr(0, first - 1) + "&lt;" + str.substr(first + 1,  str.length() - 1);
    str = str.substr(0, first) + "&lt;" + str.substr(first + 1,  str.length() - 1);
    //loggers::get_instance().log("transform_xslt_workaround: New str (1): '%s'", str.c_str());
    first = str.find("<", first);
    stop = str.find("</Transform>");
  } // End of 'while'statement
  first = str.find(">", start);
  while ((first != -1) && (first < stop)) {
    //loggers::get_instance().log("transform_xslt_workaround: first='%d' ", first);
    str = str.substr(0, first - 1) + "&gt;" + str.substr(first + 1,  str.length() - 1);
    str = str.substr(0, first) + "&gt;" + str.substr(first + 1,  str.length() - 1);
    //loggers::get_instance().log("transform_xslt_workaround: New str (1): '%s'", str.c_str());
    first = str.find(">", first);
    stop = str.find("</Transform>");
  } // End of 'while'statement
  first = str.find("\"", start);
  while ((first != -1) && (first < stop)) {
    //loggers::get_instance().log("transform_xslt_workaround: first='%d' ", first);
    str = str.substr(0, first - 1) + "&quot;" + str.substr(first + 1,  str.length() - 1);
    str = str.substr(0, first) + "&quot;" + str.substr(first + 1,  str.length() - 1);
    //loggers::get_instance().log("transform_xslt_workaround: New str (1): '%s'", str.c_str());
    first = str.find("\"", first);
    stop = str.find("</Transform>");
  } // End of 'while'statement

  loggers::get_instance().log("<<< transform_xslt_workaround: '%s'", str.c_str());
@@ -176,6 +185,7 @@ INTEGER LibSecurity__Signature::fx__dec__xmldsig(BITSTRING& bs, http__www__w3__o

  std::string str(static_cast<const char*>(oct2char(bit2oct(bs))));
  loggers::get_instance().log("fx__dec__xmldsig: Before str: '%s'", str.c_str());
  transform_signature_workaround(str);
  transform_xslt_workaround(str);
  loggers::get_instance().log("fx__dec__xmldsig: Afer str: '%s'", str.c_str());

+11 −1
Original line number Diff line number Diff line
@@ -318,10 +318,20 @@ bool security_services::do_sign_verify(const CHARSTRING& p_message, const OCTETS
  }
  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);
  ret = _certs_db->publickey_to_string(public_key, buffer);
  if (ret == 1) {
    loggers::get_instance().warning("security_services::do_sign_verify: Failed to convert public key into string");
    return false;  
  }

  // Update the DigestValue
  loggers::get_instance().log("security_services::do_sign_verify: canonicalized: '%s'", canonicalized.c_str());
  int i = canonicalized.find("<DigestValue>");
  if (i == std::string::npos) {
    loggers::get_instance().warning("security_services::do_sign_verify: DigestValue entry not found");
    return false;  
  } 
  loggers::get_instance().log("security_services::do_sign_verify: i='%d'", i);
  canonicalized = canonicalized.substr(0, i + 13) + std::string(to64.cbegin(), to64.cend()) + canonicalized.substr(i + 13, canonicalized.length() - i - 13);
  OCTETSTRING to_be_signed(char2oct(CHARSTRING(canonicalized.c_str())));
  loggers::get_instance().log_msg("security_services::do_sign_verify: to_be_signed: ", to_be_signed);
+37 −36
Original line number Diff line number Diff line
@@ -40,6 +40,16 @@ import from XSD all;

//import from http_www_cise_eu_sevicemodel_v1_message all;

type record Transform {
  XSD.String algorithm,
  XSD.String path
}
with {
  variant "element";
  variant (algorithm) "name as capitalized";
  variant (algorithm) "attribute";
  variant (path) "untagged";
}

type record Signature
{
@@ -52,12 +62,7 @@ type record Signature
    } signatureMethod,
    record {
      XSD.String uRI,
			record {
				record {
					XSD.String algorithm,
          XSD.String path
				} transform
			} transforms,
      record of Transform transforms,
      record {
        XSD.String algorithm
      } digestMethod,
@@ -85,10 +90,6 @@ with {
  variant (signedInfo.reference.uRI) "name as capitalized";
  variant (signedInfo.reference.uRI) "attribute";
  variant (signedInfo.reference.transforms) "name as capitalized";
  variant (signedInfo.reference.transforms.transform) "name as capitalized";
  variant (signedInfo.reference.transforms.transform.algorithm) "name as capitalized";
  variant (signedInfo.reference.transforms.transform.algorithm) "attribute";
  variant (signedInfo.reference.transforms.transform.path) "untagged";
  variant (signedInfo.reference.digestMethod) "name as capitalized";
  variant (signedInfo.reference.digestMethod.algorithm) "name as capitalized";
  variant (signedInfo.reference.digestMethod.algorithm) "attribute";