]> granicus.if.org Git - pdns/commitdiff
ok, I lied - rfc 4255 has chosen In All Its Wisdom to implement SSHFP as base-16...
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 3 Apr 2006 20:29:20 +0000 (20:29 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 3 Apr 2006 20:29:20 +0000 (20:29 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@650 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dnsparser.cc
pdns/dnsparser.hh
pdns/dnsrecords.cc
pdns/dnswriter.cc
pdns/dnswriter.hh
pdns/rcpgenerator.cc
pdns/rcpgenerator.hh

index 04d8f9b4c9c68304b3b48417d0122ea5c09067ab..08a367aeb19a26464254adf3cccd8431b94d14d0 100644 (file)
@@ -390,3 +390,8 @@ void PacketReader::xfrBlob(string& blob)
 
   d_pos = d_startrecordpos + d_recordlen;
 }
+
+void PacketReader::xfrHexBlob(string& blob)
+{
+  xfrBlob(blob);
+}
index b12a6023b1015acde76e252c0e720f047c702c6e..aa4a2d30abeac0d06ebb201d28f5e6c524e788f1 100644 (file)
@@ -122,6 +122,7 @@ public:
   }
 
   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);
index 5c5fe324a91e88f7079ea32899d03d87a104113b..f5724c69a59181001b3fbf11c17459404820a05e 100644 (file)
@@ -252,7 +252,7 @@ boilerplate_conv(DS, 43,
 boilerplate_conv(SSHFP, 44, 
                 conv.xfr8BitInt(d_algorithm); 
                 conv.xfr8BitInt(d_fptype); 
-                conv.xfrBlob(d_fingerprint);
+                conv.xfrHexBlob(d_fingerprint);
                 )
 
 boilerplate_conv(RRSIG, 46, 
@@ -296,6 +296,7 @@ void reportOtherTypes()
    DNSKEYRecordContent::report();
    RRSIGRecordContent::report();
    DSRecordContent::report();
+   SSHFPRecordContent::report();
    NSECRecordContent::report();
    OPTRecordContent::report();
    DNSRecordContent::regist(1,255, 0, 0, "ANY");
index b0d099737732edcd7e64047eb2b9b100bdcf3a7d..90037c413eea75c346385ee168e3b8a8b690b4ed 100644 (file)
@@ -162,6 +162,12 @@ void DNSPacketWriter::xfrBlob(const string& blob)
   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());
index d3dc8e4396e84f4e7b4c2e1db21168bd4447efc3..a21f6092cba08c94bd03d8e0e2a220c4698c4463 100644 (file)
@@ -83,6 +83,7 @@ public:
   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;
   
index b35971276f67cd94471441342ceeade3fc8d70c6..91c39be2cae1f3d08fc77624b95376ef21461dc3 100644 (file)
@@ -141,6 +141,43 @@ void RecordTextReader::xfrBlob(string& val)
   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();
@@ -279,6 +316,19 @@ void RecordTextWriter::xfrBlob(const string& val)
   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())
index a4d893652e8b0c35990130dd79d7d2e0618533d0..755f837d83564ff283c07963125c7ca30c8dffb0 100644 (file)
@@ -47,6 +47,7 @@ public:
 
   void xfrLabel(string& val, bool compress=false);
   void xfrText(string& val);
+  void xfrHexBlob(string& val);
   void xfrBlob(string& val);
 
   bool eof();
@@ -72,6 +73,7 @@ public:
   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;