From: Mukund Sivaraman Date: Mon, 11 Mar 2013 03:58:47 +0000 (+0530) Subject: [2387] Add NSEC3 lexer constructor implementation X-Git-Tag: bind10-1.2.0beta1-release~481^2~63 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=240e5333012a0a60e9b42f8741c44450eae22ea2;p=thirdparty%2Fkea.git [2387] Add NSEC3 lexer constructor implementation --- diff --git a/src/lib/dns/gen-rdatacode.py.in b/src/lib/dns/gen-rdatacode.py.in index 5c23eba45d..fac1bb1408 100755 --- a/src/lib/dns/gen-rdatacode.py.in +++ b/src/lib/dns/gen-rdatacode.py.in @@ -43,6 +43,7 @@ new_rdata_factory_users = [('a', 'in'), ('aaaa', 'in'), ('mx', 'generic'), ('ns', 'generic'), ('nsec', 'generic'), + ('nsec3', 'generic'), ('ptr', 'generic'), ('soa', 'generic'), ('spf', 'generic'), diff --git a/src/lib/dns/rdata/generic/detail/nsec3param_common.cc b/src/lib/dns/rdata/generic/detail/nsec3param_common.cc index 6eea2c7ea6..0ce6bcad11 100644 --- a/src/lib/dns/rdata/generic/detail/nsec3param_common.cc +++ b/src/lib/dns/rdata/generic/detail/nsec3param_common.cc @@ -88,6 +88,49 @@ parseNSEC3ParamText(const char* const rrtype_name, return (ParseNSEC3ParamResult(hashalg, flags, iterations)); } +ParseNSEC3ParamResult +parseNSEC3ParamFromLexer(const char* const rrtype_name, + MasterLexer& lexer, vector& salt) +{ + const uint32_t hashalg = + lexer.getNextToken(MasterToken::NUMBER).getNumber(); + if (hashalg > 0xff) { + isc_throw(InvalidRdataText, rrtype_name << + " hash algorithm out of range: " << hashalg); + } + + const uint32_t flags = + lexer.getNextToken(MasterToken::NUMBER).getNumber(); + if (flags > 0xff) { + isc_throw(InvalidRdataText, rrtype_name << " flags out of range: " << + flags); + } + + const uint32_t iterations = + lexer.getNextToken(MasterToken::NUMBER).getNumber(); + if (iterations > 0xffff) { + isc_throw(InvalidRdataText, rrtype_name << + " iterations out of range: " << + iterations); + } + + const string salthex = + lexer.getNextToken(MasterToken::STRING).getString(); + + // Salt is up to 255 bytes, and space is not allowed in the HEX encoding, + // so the encoded string cannot be longer than the double of max length + // of the actual salt. + if (salthex.size() > 255 * 2) { + isc_throw(InvalidRdataText, rrtype_name << " salt is too long: " + << salthex.size() << " (encoded) bytes"); + } + if (salthex != "-") { // "-" means a 0-length salt + decodeHex(salthex, salt); + } + + return (ParseNSEC3ParamResult(hashalg, flags, iterations)); +} + ParseNSEC3ParamResult parseNSEC3ParamWire(const char* const rrtype_name, InputBuffer& buffer, diff --git a/src/lib/dns/rdata/generic/detail/nsec3param_common.h b/src/lib/dns/rdata/generic/detail/nsec3param_common.h index 1891faea2f..4d55adab59 100644 --- a/src/lib/dns/rdata/generic/detail/nsec3param_common.h +++ b/src/lib/dns/rdata/generic/detail/nsec3param_common.h @@ -15,6 +15,8 @@ #ifndef NSEC3PARAM_COMMON_H #define NSEC3PARAM_COMMON_H 1 +#include + #include #include @@ -90,6 +92,10 @@ ParseNSEC3ParamResult parseNSEC3ParamText(const char* const rrtype_name, std::istringstream& iss, std::vector& salt); +ParseNSEC3ParamResult parseNSEC3ParamFromLexer(const char* const rrtype_name, + isc::dns::MasterLexer& lexer, + std::vector& salt); + /// \brief Extract NSEC3 parameters from wire-format data. /// /// This function takes an input buffer that stores wire-format NSEC3 or diff --git a/src/lib/dns/rdata/generic/nsec3_50.cc b/src/lib/dns/rdata/generic/nsec3_50.cc index fb92246f8b..7fe8c868ff 100644 --- a/src/lib/dns/rdata/generic/nsec3_50.cc +++ b/src/lib/dns/rdata/generic/nsec3_50.cc @@ -104,6 +104,43 @@ NSEC3::NSEC3(const std::string& nsec3_str) : salt, next, typebits); } +NSEC3::NSEC3(MasterLexer& lexer, const Name*, MasterLoader::Options, + MasterLoaderCallbacks&) : + impl_(NULL) +{ + vector salt; + const ParseNSEC3ParamResult params = + parseNSEC3ParamFromLexer("NSEC3", lexer, salt); + + const string nexthash = lexer.getNextToken(MasterToken::STRING).getString(); + if (*nexthash.rbegin() == '=') { + isc_throw(InvalidRdataText, "NSEC3 hash has padding: " << nexthash); + } + + vector next; + decodeBase32Hex(nexthash, next); + if (next.size() > 255) { + isc_throw(InvalidRdataText, "NSEC3 hash is too long: " + << next.size() << " bytes"); + } + + // For NSEC3 empty bitmap is possible and allowed. + if (lexer.getNextToken().getType() == MasterToken::END_OF_FILE) { + impl_ = new NSEC3Impl(params.algorithm, params.flags, + params.iterations, salt, next, + vector()); + return; + } + + lexer.ungetToken(); + + vector typebits; + buildBitmapsFromLexer("NSEC3", lexer, typebits); + + impl_ = new NSEC3Impl(params.algorithm, params.flags, params.iterations, + salt, next, typebits); +} + NSEC3::NSEC3(InputBuffer& buffer, size_t rdata_len) { vector salt; const ParseNSEC3ParamResult params =