Browse Source

[2386] Allow whitespace in the digest

Mukund Sivaraman 12 years ago
parent
commit
085fba33bd

+ 15 - 2
src/lib/dns/rdata/generic/detail/ds_like.h

@@ -113,8 +113,21 @@ private:
                       << digest_type);
         }
 
-        const std::string digest =
-            lexer.getNextToken(MasterToken::STRING).getString();
+        std::string digest;
+        while (true) {
+            const MasterToken& token = lexer.getNextToken();
+            if (token.getType() != MasterToken::STRING) {
+                break;
+            }
+            digest.append(token.getString());
+        }
+
+        lexer.ungetToken();
+
+        if (digest.size() == 0) {
+            isc_throw(InvalidRdataText,
+                      "Missing " << RRType(typeCode) << " digest");
+        }
 
         tag_ = tag;
         algorithm_ = algorithm;

+ 8 - 0
src/lib/dns/tests/rdata_ds_like_unittest.cc

@@ -61,6 +61,14 @@ typedef testing::Types<generic::DS, generic::DLV> Implementations;
 
 TYPED_TEST_CASE(Rdata_DS_LIKE_Test, Implementations);
 
+TYPED_TEST(Rdata_DS_LIKE_Test, createFromText) {
+    // It's valid for the digest's presentation format to contain
+    // spaces. See RFC4034 section 5.3.
+    EXPECT_EQ(0, this->rdata_ds_like.compare(
+        TypeParam("12892 5 2 F1E184C0E1D615D20EB3C223ACED3B03C773DD952D5F0EB5"
+                  "C777 586DE18  \t DA6B5")));
+}
+
 TYPED_TEST(Rdata_DS_LIKE_Test, toText_DS_LIKE) {
     EXPECT_EQ(ds_like_txt, this->rdata_ds_like.toText());
 }