Browse Source

[2387] Allow whitespace in the DNSKEY public key

Mukund Sivaraman 12 years ago
parent
commit
8674224a8d
1 changed files with 26 additions and 5 deletions
  1. 26 5
      src/lib/dns/rdata/generic/dnskey_48.cc

+ 26 - 5
src/lib/dns/rdata/generic/dnskey_48.cc

@@ -61,9 +61,18 @@ DNSKEY::DNSKEY(const std::string& dnskey_str) :
 
         constructFromLexer(lexer);
 
-        if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) {
-             isc_throw(InvalidRdataText,
-                       "Extra input text for DNSKEY: " << dnskey_str);
+        // This elaborate check is done to allow trailing comments in
+        // the string.
+        for (MasterToken::Type token_type = lexer.getNextToken().getType();
+             token_type != MasterToken::END_OF_FILE;
+             token_type = lexer.getNextToken().getType())
+        {
+            if (token_type == MasterToken::END_OF_LINE) {
+                continue;
+            }
+
+            isc_throw(InvalidRdataText,
+                      "Extra input text for DNSKEY: " << dnskey_str);
         }
     } catch (const MasterLexer::LexerError& ex) {
         isc_throw(InvalidRdataText,
@@ -117,8 +126,20 @@ DNSKEY::constructFromLexer(MasterLexer& lexer) {
                   "DNSKEY algorithm out of range: " << algorithm);
     }
 
-    const std::string keydatastr =
-        lexer.getNextToken(MasterToken::STRING).getString();
+    std::string keydatastr;
+    while (true) {
+        const MasterToken& token = lexer.getNextToken();
+        if (token.getType() != MasterToken::STRING) {
+            break;
+        }
+        keydatastr.append(token.getString());
+    }
+
+    lexer.ungetToken();
+
+    if (keydatastr.size() == 0) {
+        isc_throw(InvalidRdataText, "Missing DNSKEY digest");
+    }
 
     vector<uint8_t> keydata;
     decodeBase64(keydatastr, keydata);