d_pos = d_startrecordpos + d_recordlen;
}
+
+void PacketReader::xfrHexBlob(string& blob)
+{
+ xfrBlob(blob);
+}
}
void xfrBlob(string& blob);
+ void xfrHexBlob(string& blob);
static uint16_t get16BitInt(const vector<unsigned char>&content, uint16_t& pos);
static void getLabelFromContent(const vector<uint8_t>& content, uint16_t& frompos, string& ret, int recurs);
boilerplate_conv(SSHFP, 44,
conv.xfr8BitInt(d_algorithm);
conv.xfr8BitInt(d_fptype);
- conv.xfrBlob(d_fingerprint);
+ conv.xfrHexBlob(d_fingerprint);
)
boilerplate_conv(RRSIG, 46,
DNSKEYRecordContent::report();
RRSIGRecordContent::report();
DSRecordContent::report();
+ SSHFPRecordContent::report();
NSECRecordContent::report();
OPTRecordContent::report();
DNSRecordContent::regist(1,255, 0, 0, "ANY");
d_record.insert(d_record.end(), ptr, ptr+blob.size());
}
+void DNSPacketWriter::xfrHexBlob(const string& blob)
+{
+ xfrBlob(blob);
+}
+
+
void DNSPacketWriter::getRecords(string& records)
{
records.assign(d_content.begin() + d_sor, d_content.end());
void xfrLabel(const string& label, bool compress=false);
void xfrText(const string& text);
void xfrBlob(const string& blob);
+ void xfrHexBlob(const string& blob);
uint16_t d_pos;
B64Decode(tmp, val);
}
+
+static inline uint8_t hextodec(uint8_t val)
+{
+ if(val >= '0' && val<='9')
+ return val-'0';
+ else if(val >= 'A' && val<='F')
+ return 10+(val-'A');
+ else if(val >= 'a' && val<='f')
+ return 10+(val-'a');
+ else
+ throw RecordTextException("Unknown hexadecimal character '"+lexical_cast<string>(val)+"'");
+}
+
+
+void HEXDecode(const char* begin, const char* end, string& val)
+{
+ if((end - begin)%2)
+ throw RecordTextException("Hexadecimal blob with odd number of characters");
+
+ int limit=(end-begin)/2;
+ val.resize(limit);
+ for(int n=0; n < limit; ++n) {
+ val[n] = hextodec(begin[2*n])*16 + hextodec(begin[2*n+1]);
+ }
+}
+
+void RecordTextReader::xfrHexBlob(string& val)
+{
+ skipSpaces();
+ int pos=d_pos;
+ while(d_pos < d_end && !dns_isspace(d_string[d_pos]))
+ d_pos++;
+
+ HEXDecode(d_string.c_str()+pos, d_string.c_str() + d_pos, val);
+}
+
+
void RecordTextReader::xfrText(string& val)
{
skipSpaces();
d_string+=Base64Encode(val);
}
+void RecordTextWriter::xfrHexBlob(const string& val)
+{
+ if(!d_string.empty())
+ d_string.append(1,' ');
+
+ string::size_type limit=val.size();
+ char tmp[5];
+ for(string::size_type n = 0; n < limit; ++n) {
+ snprintf(tmp, sizeof(tmp)-1, "%02x", (unsigned char)val[n]);
+ d_string+=tmp;
+ }
+}
+
void RecordTextWriter::xfrText(const string& val)
{
if(!d_string.empty())
void xfrLabel(string& val, bool compress=false);
void xfrText(string& val);
+ void xfrHexBlob(string& val);
void xfrBlob(string& val);
bool eof();
void xfrLabel(const string& val, bool compress=false);
void xfrText(const string& val);
void xfrBlob(const string& val);
+ void xfrHexBlob(const string& val);
private:
string& d_string;