diff --git a/src/SignatureXAdES_B.cpp b/src/SignatureXAdES_B.cpp index 24d396b60..02f473b7d 100644 --- a/src/SignatureXAdES_B.cpp +++ b/src/SignatureXAdES_B.cpp @@ -28,6 +28,7 @@ #include "crypto/X509CertStore.h" #include "crypto/X509Crypto.h" #include "util/DateTime.h" +#include "util/algorithm.h" #include "util/log.h" #include "util/File.h" @@ -364,7 +365,7 @@ string SignatureXAdES_B::policy() const { if(auto id = signedSignatureProperties()/"SignaturePolicyIdentifier"/"SignaturePolicyId"/"SigPolicyId"/"Identifier"; id && id["Qualifier"] == "OIDAsURN") - return string(id); + return string(trim_prefix(id)); return {}; } @@ -393,8 +394,8 @@ string SignatureXAdES_B::trustedSigningTime() const string SignatureXAdES_B::SPUri() const { - return string(signedSignatureProperties() - /"SignaturePolicyIdentifier"/"SignaturePolicyId"/"SigPolicyQualifiers"/"SigPolicyQualifier"/"SPURI"); + return string(trim_prefix(signedSignatureProperties() + /"SignaturePolicyIdentifier"/"SignaturePolicyId"/"SigPolicyQualifiers"/"SigPolicyQualifier"/"SPURI")); } void SignatureXAdES_B::validate() const @@ -633,7 +634,7 @@ void SignatureXAdES_B::checkSigningCertificate(bool noqscd) const { X509Cert signingCert = signingCertificate(); vector usage = signingCert.keyUsage(); - if(find(usage.cbegin(), usage.cend(), X509Cert::NonRepudiation) == usage.cend()) + if(!contains(usage, X509Cert::NonRepudiation)) THROW("Signing certificate does not contain NonRepudiation key usage flag"); if(!X509CertStore::instance()->verify(signingCert, noqscd)) THROW("Unable to verify signing certificate"); diff --git a/src/XMLDocument.h b/src/XMLDocument.h index 5ea27733f..3783767b9 100644 --- a/src/XMLDocument.h +++ b/src/XMLDocument.h @@ -173,11 +173,8 @@ struct XMLElem constexpr operator sv() const noexcept { - constexpr sv whitespace {" \n\r\f\t\v"}; auto *text = children(&value_type::children, XML_TEXT_NODE); - auto result = to_string_view(text, &std::decay_t::content); - result.remove_prefix(std::min(result.find_first_not_of(whitespace), result.size())); - return result; + return to_string_view(text, &std::decay_t::content); } pointer d{}; diff --git a/src/util/algorithm.h b/src/util/algorithm.h index 30911a357..683cd4953 100644 --- a/src/util/algorithm.h +++ b/src/util/algorithm.h @@ -54,8 +54,15 @@ constexpr bool none_of(const C &list, P pred) template [[nodiscard]] -constexpr bool starts_with(T str, T needle) { +constexpr bool starts_with(T str, std::string_view needle) { return str.size() >= needle.size() && str.compare(0, needle.size(), needle) == 0; } +[[nodiscard]] +constexpr auto trim_prefix(std::string_view src) +{ + constexpr std::string_view whitespace {" \n\r\f\t\v"}; + return src.substr(std::min(src.find_first_not_of(whitespace), src.size())); +} + }