#include "exception.h"
#include "message.h"
+#include <regex>
+
namespace {
// Get Info response
} // namespace
+void ValidateDomain(const char *rpId)
+{
+ if (!rpId)
+ THROW_INVALID_PARAM("rpId is NULL");
+
+ if (strlen(rpId) > 253)
+ THROW_INVALID_PARAM("Relying party ID '" << rpId << "' exceeds 253 characters");
+
+ const std::regex pattern{
+ R"(^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$)"};
+ if (!std::regex_match(rpId, pattern))
+ THROW_INVALID_PARAM("Relying party ID '" << rpId << "' is not a valid domain string");
+}
+
void PostHandshakeResponse::Deserialize(BufferView &input)
{
auto helper = CborParsing::Parser::Create(input.data(), input.size());
* limitations under the License
*/
+#include "exception.h"
#include "message.h"
#include <gtest/gtest.h>
ASSERT_FALSE(msg.m_uvCountSinceLastPinEntry.has_value());
ASSERT_FALSE(msg.m_longTouchForReset.has_value());
}
+
+TEST(Messages, DomainName)
+{
+ std::string notTooLongLabel(63, 'a');
+ std::string tooLongLabel(64, 'a');
+ std::string tooLongDomain = notTooLongLabel;
+ while (tooLongDomain.size() < 254)
+ tooLongDomain += "." + notTooLongLabel;
+ tooLongDomain.resize(254);
+ assert(tooLongDomain.back() != '.');
+
+ ASSERT_NO_THROW(ValidateDomain("acme"));
+ ASSERT_NO_THROW(ValidateDomain("acme.com"));
+ ASSERT_NO_THROW(ValidateDomain("acme.acme.com"));
+ ASSERT_NO_THROW(ValidateDomain("a-cme.acme.com"));
+ ASSERT_NO_THROW(ValidateDomain("a-cme.ac-me.com"));
+ ASSERT_NO_THROW(ValidateDomain("a-cme.ac-me.c-om"));
+ ASSERT_NO_THROW(ValidateDomain("a-c5me.ac-me.c-om"));
+ ASSERT_NO_THROW(ValidateDomain("a-c5me.ac-5me.c-om"));
+ ASSERT_NO_THROW(ValidateDomain("a-c5me.ac-m5e.c-5om"));
+ ASSERT_NO_THROW(ValidateDomain("a-c5me.ac-m5e.c--5om"));
+ ASSERT_NO_THROW(ValidateDomain(notTooLongLabel.c_str()));
+ ASSERT_NO_THROW(ValidateDomain(tooLongDomain.c_str() + 1));
+ ASSERT_THROW(ValidateDomain(nullptr), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("acme."), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain(".acme"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("-acme.com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("acme..com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("acme-.com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("acme.-com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("acme.com-"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("a_cme.com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain("a?cme.com"), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain(tooLongLabel.c_str()), Exception::InvalidParam);
+ ASSERT_THROW(ValidateDomain(tooLongDomain.c_str()), Exception::InvalidParam);
+}