dnsruby 1.26 → 1.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (996) hide show
  1. data/DNSSEC +19 -0
  2. data/EVENTMACHINE +1 -64
  3. data/EXAMPLES +124 -0
  4. data/README +2 -6
  5. data/demo/axfr.rb +2 -2
  6. data/demo/check_soa.rb +1 -1
  7. data/demo/check_zone.rb +2 -2
  8. data/demo/digdlv.rb +65 -0
  9. data/demo/digitar.rb +62 -0
  10. data/demo/mresolv.rb +1 -1
  11. data/demo/mx.rb +1 -1
  12. data/demo/rubydig.rb +8 -1
  13. data/demo/trace_dns.rb +28 -14
  14. data/html/created.rid +1 -0
  15. data/{doc → html}/fr_class_index.html +118 -172
  16. data/{doc → html}/fr_file_index.html +81 -130
  17. data/html/fr_method_index.html +371 -0
  18. data/{doc → html}/index.html +23 -23
  19. data/lib/Dnsruby/Cache.rb +129 -22
  20. data/lib/Dnsruby/Config.rb +72 -11
  21. data/lib/Dnsruby/DNS.rb +3 -0
  22. data/lib/Dnsruby/PacketSender.rb +565 -0
  23. data/lib/Dnsruby/Recursor.rb +337 -156
  24. data/lib/Dnsruby/Resolver.rb +508 -447
  25. data/lib/Dnsruby/SingleResolver.rb +151 -629
  26. data/lib/Dnsruby/code_mapper.rb +4 -2
  27. data/lib/Dnsruby/dnssec.rb +212 -518
  28. data/lib/Dnsruby/event_machine_interface.rb +266 -265
  29. data/lib/Dnsruby/iana_ports.rb +5206 -5196
  30. data/lib/Dnsruby/key_cache.rb +85 -0
  31. data/lib/Dnsruby/message.rb +207 -72
  32. data/lib/Dnsruby/name.rb +42 -4
  33. data/lib/Dnsruby/resource/CERT.rb +1 -1
  34. data/lib/Dnsruby/resource/DNSKEY.rb +66 -25
  35. data/lib/Dnsruby/resource/DS.rb +7 -2
  36. data/lib/Dnsruby/resource/NAPTR.rb +2 -2
  37. data/lib/Dnsruby/resource/NSEC.rb +31 -2
  38. data/lib/Dnsruby/resource/NSEC3.rb +86 -8
  39. data/lib/Dnsruby/resource/OPT.rb +9 -6
  40. data/lib/Dnsruby/resource/PX.rb +1 -1
  41. data/lib/Dnsruby/resource/RT.rb +1 -1
  42. data/lib/Dnsruby/resource/SRV.rb +3 -3
  43. data/lib/Dnsruby/resource/resource.rb +30 -36
  44. data/lib/Dnsruby/select_thread.rb +160 -23
  45. data/lib/Dnsruby/single_verifier.rb +1289 -0
  46. data/lib/Dnsruby/validator_thread.rb +108 -0
  47. data/lib/Dnsruby/zone_transfer.rb +5 -2
  48. data/lib/dnsruby.rb +33 -18
  49. data/test/tc_cache.rb +88 -0
  50. data/test/tc_dlv.rb +55 -0
  51. data/test/tc_dns.rb +3 -1
  52. data/test/tc_dnskey.rb +21 -5
  53. data/test/tc_ds.rb +1 -7
  54. data/test/tc_itar.rb +76 -0
  55. data/test/tc_name.rb +21 -0
  56. data/test/tc_nsec.rb +169 -0
  57. data/test/tc_nsec3.rb +18 -1
  58. data/test/tc_packet.rb +97 -6
  59. data/test/tc_queue.rb +7 -5
  60. data/test/tc_recur.rb +6 -1
  61. data/test/tc_res_config.rb +1 -3
  62. data/test/tc_res_opt.rb +1 -5
  63. data/test/tc_resolver.rb +27 -8
  64. data/test/tc_rr-opt.rb +1 -0
  65. data/test/tc_rr.rb +6 -0
  66. data/test/tc_rrset.rb +60 -0
  67. data/test/tc_single_resolver.rb +55 -2
  68. data/test/tc_tsig.rb +29 -13
  69. data/test/tc_update.rb +6 -0
  70. data/test/tc_validator.rb +56 -0
  71. data/test/{tc_dnssec.rb → tc_verifier.rb} +106 -92
  72. data/test/ts_online.rb +19 -16
  73. metadata +27 -1053
  74. data/doc/classes/Cache.html +0 -179
  75. data/doc/classes/Cache.src/M000212.html +0 -19
  76. data/doc/classes/Cache.src/M000213.html +0 -18
  77. data/doc/classes/Cache.src/M000214.html +0 -23
  78. data/doc/classes/ConfigTable.html +0 -500
  79. data/doc/classes/ConfigTable.src/M000019.html +0 -25
  80. data/doc/classes/ConfigTable.src/M000020.html +0 -18
  81. data/doc/classes/ConfigTable.src/M000021.html +0 -18
  82. data/doc/classes/ConfigTable.src/M000022.html +0 -18
  83. data/doc/classes/ConfigTable.src/M000023.html +0 -18
  84. data/doc/classes/ConfigTable.src/M000024.html +0 -18
  85. data/doc/classes/ConfigTable.src/M000025.html +0 -18
  86. data/doc/classes/ConfigTable.src/M000026.html +0 -18
  87. data/doc/classes/ConfigTable.src/M000027.html +0 -18
  88. data/doc/classes/ConfigTable.src/M000028.html +0 -19
  89. data/doc/classes/ConfigTable.src/M000029.html +0 -21
  90. data/doc/classes/ConfigTable.src/M000030.html +0 -20
  91. data/doc/classes/ConfigTable.src/M000031.html +0 -18
  92. data/doc/classes/ConfigTable.src/M000032.html +0 -25
  93. data/doc/classes/ConfigTable.src/M000033.html +0 -23
  94. data/doc/classes/ConfigTable.src/M000034.html +0 -20
  95. data/doc/classes/ConfigTable.src/M000035.html +0 -20
  96. data/doc/classes/ConfigTable.src/M000036.html +0 -23
  97. data/doc/classes/ConfigTable.src/M000037.html +0 -19
  98. data/doc/classes/ConfigTable.src/M000038.html +0 -18
  99. data/doc/classes/ConfigTable.src/M000039.html +0 -18
  100. data/doc/classes/ConfigTable/BoolItem.html +0 -154
  101. data/doc/classes/ConfigTable/BoolItem.src/M000040.html +0 -18
  102. data/doc/classes/ConfigTable/BoolItem.src/M000041.html +0 -18
  103. data/doc/classes/ConfigTable/ExecItem.html +0 -201
  104. data/doc/classes/ConfigTable/ExecItem.src/M000059.html +0 -20
  105. data/doc/classes/ConfigTable/ExecItem.src/M000060.html +0 -18
  106. data/doc/classes/ConfigTable/ExecItem.src/M000061.html +0 -18
  107. data/doc/classes/ConfigTable/ExecItem.src/M000062.html +0 -18
  108. data/doc/classes/ConfigTable/ExecItem.src/M000063.html +0 -22
  109. data/doc/classes/ConfigTable/Item.html +0 -250
  110. data/doc/classes/ConfigTable/Item.src/M000066.html +0 -22
  111. data/doc/classes/ConfigTable/Item.src/M000067.html +0 -18
  112. data/doc/classes/ConfigTable/Item.src/M000068.html +0 -18
  113. data/doc/classes/ConfigTable/Item.src/M000069.html +0 -18
  114. data/doc/classes/ConfigTable/Item.src/M000070.html +0 -18
  115. data/doc/classes/ConfigTable/Item.src/M000071.html +0 -18
  116. data/doc/classes/ConfigTable/MetaConfigEnvironment.html +0 -325
  117. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000046.html +0 -19
  118. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000047.html +0 -18
  119. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000048.html +0 -18
  120. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000049.html +0 -18
  121. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000050.html +0 -18
  122. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000051.html +0 -18
  123. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000052.html +0 -18
  124. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000053.html +0 -18
  125. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000054.html +0 -18
  126. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000055.html +0 -18
  127. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000056.html +0 -18
  128. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000057.html +0 -19
  129. data/doc/classes/ConfigTable/MetaConfigEnvironment.src/M000058.html +0 -19
  130. data/doc/classes/ConfigTable/PackageSelectionItem.html +0 -169
  131. data/doc/classes/ConfigTable/PackageSelectionItem.src/M000044.html +0 -19
  132. data/doc/classes/ConfigTable/PackageSelectionItem.src/M000045.html +0 -18
  133. data/doc/classes/ConfigTable/PathItem.html +0 -139
  134. data/doc/classes/ConfigTable/PathItem.src/M000043.html +0 -18
  135. data/doc/classes/ConfigTable/ProgramItem.html +0 -139
  136. data/doc/classes/ConfigTable/ProgramItem.src/M000042.html +0 -18
  137. data/doc/classes/ConfigTable/SelectItem.html +0 -156
  138. data/doc/classes/ConfigTable/SelectItem.src/M000064.html +0 -19
  139. data/doc/classes/ConfigTable/SelectItem.src/M000065.html +0 -18
  140. data/doc/classes/DnskeyTest.html +0 -180
  141. data/doc/classes/DnskeyTest.src/M000016.html +0 -26
  142. data/doc/classes/DnskeyTest.src/M000017.html +0 -24
  143. data/doc/classes/DnskeyTest.src/M000018.html +0 -33
  144. data/doc/classes/Dnsruby.html +0 -504
  145. data/doc/classes/Dnsruby.src/M000351.html +0 -18
  146. data/doc/classes/Dnsruby/Algorithms.html +0 -173
  147. data/doc/classes/Dnsruby/Classes.html +0 -197
  148. data/doc/classes/Dnsruby/Classes.src/M000573.html +0 -23
  149. data/doc/classes/Dnsruby/Classes.src/M000574.html +0 -19
  150. data/doc/classes/Dnsruby/CodeMapper.html +0 -375
  151. data/doc/classes/Dnsruby/CodeMapper.src/M000550.html +0 -18
  152. data/doc/classes/Dnsruby/CodeMapper.src/M000551.html +0 -33
  153. data/doc/classes/Dnsruby/CodeMapper.src/M000552.html +0 -21
  154. data/doc/classes/Dnsruby/CodeMapper.src/M000553.html +0 -19
  155. data/doc/classes/Dnsruby/CodeMapper.src/M000554.html +0 -19
  156. data/doc/classes/Dnsruby/CodeMapper.src/M000555.html +0 -18
  157. data/doc/classes/Dnsruby/CodeMapper.src/M000556.html +0 -22
  158. data/doc/classes/Dnsruby/CodeMapper.src/M000557.html +0 -22
  159. data/doc/classes/Dnsruby/CodeMapper.src/M000558.html +0 -22
  160. data/doc/classes/Dnsruby/CodeMapper.src/M000559.html +0 -31
  161. data/doc/classes/Dnsruby/CodeMapper.src/M000560.html +0 -19
  162. data/doc/classes/Dnsruby/Config.html +0 -413
  163. data/doc/classes/Dnsruby/Config.src/M000505.html +0 -18
  164. data/doc/classes/Dnsruby/Config.src/M000506.html +0 -19
  165. data/doc/classes/Dnsruby/Config.src/M000507.html +0 -19
  166. data/doc/classes/Dnsruby/Config.src/M000508.html +0 -25
  167. data/doc/classes/Dnsruby/Config.src/M000509.html +0 -21
  168. data/doc/classes/Dnsruby/Config.src/M000510.html +0 -38
  169. data/doc/classes/Dnsruby/Config.src/M000511.html +0 -26
  170. data/doc/classes/Dnsruby/Config.src/M000512.html +0 -22
  171. data/doc/classes/Dnsruby/Config.src/M000513.html +0 -27
  172. data/doc/classes/Dnsruby/Config.src/M000514.html +0 -22
  173. data/doc/classes/Dnsruby/Config.src/M000515.html +0 -21
  174. data/doc/classes/Dnsruby/DNS.html +0 -571
  175. data/doc/classes/Dnsruby/DNS.src/M000645.html +0 -24
  176. data/doc/classes/Dnsruby/DNS.src/M000646.html +0 -18
  177. data/doc/classes/Dnsruby/DNS.src/M000647.html +0 -18
  178. data/doc/classes/Dnsruby/DNS.src/M000648.html +0 -20
  179. data/doc/classes/Dnsruby/DNS.src/M000649.html +0 -19
  180. data/doc/classes/Dnsruby/DNS.src/M000650.html +0 -20
  181. data/doc/classes/Dnsruby/DNS.src/M000651.html +0 -18
  182. data/doc/classes/Dnsruby/DNS.src/M000652.html +0 -19
  183. data/doc/classes/Dnsruby/DNS.src/M000653.html +0 -20
  184. data/doc/classes/Dnsruby/DNS.src/M000654.html +0 -30
  185. data/doc/classes/Dnsruby/DNS.src/M000655.html +0 -19
  186. data/doc/classes/Dnsruby/DNS.src/M000656.html +0 -20
  187. data/doc/classes/Dnsruby/DNS.src/M000657.html +0 -31
  188. data/doc/classes/Dnsruby/DecodeError.html +0 -120
  189. data/doc/classes/Dnsruby/Dnssec.html +0 -536
  190. data/doc/classes/Dnsruby/Dnssec.src/M000615.html +0 -21
  191. data/doc/classes/Dnsruby/Dnssec.src/M000616.html +0 -18
  192. data/doc/classes/Dnsruby/Dnssec.src/M000617.html +0 -18
  193. data/doc/classes/Dnsruby/Dnssec.src/M000618.html +0 -19
  194. data/doc/classes/Dnsruby/Dnssec.src/M000619.html +0 -18
  195. data/doc/classes/Dnsruby/Dnssec.src/M000620.html +0 -18
  196. data/doc/classes/Dnsruby/Dnssec.src/M000621.html +0 -18
  197. data/doc/classes/Dnsruby/Dnssec.src/M000622.html +0 -18
  198. data/doc/classes/Dnsruby/Dnssec.src/M000623.html +0 -19
  199. data/doc/classes/Dnsruby/Dnssec.src/M000624.html +0 -18
  200. data/doc/classes/Dnsruby/Dnssec.src/M000625.html +0 -20
  201. data/doc/classes/Dnsruby/Dnssec.src/M000626.html +0 -46
  202. data/doc/classes/Dnsruby/Dnssec.src/M000627.html +0 -23
  203. data/doc/classes/Dnsruby/Dnssec.src/M000628.html +0 -22
  204. data/doc/classes/Dnsruby/Dnssec.src/M000629.html +0 -19
  205. data/doc/classes/Dnsruby/Dnssec.src/M000630.html +0 -116
  206. data/doc/classes/Dnsruby/Dnssec.src/M000631.html +0 -33
  207. data/doc/classes/Dnsruby/Dnssec.src/M000632.html +0 -28
  208. data/doc/classes/Dnsruby/Dnssec.src/M000633.html +0 -92
  209. data/doc/classes/Dnsruby/Dnssec/ValidationPolicy.html +0 -167
  210. data/doc/classes/Dnsruby/EncodeError.html +0 -120
  211. data/doc/classes/Dnsruby/FormErr.html +0 -119
  212. data/doc/classes/Dnsruby/Header.html +0 -531
  213. data/doc/classes/Dnsruby/Header.src/M000595.html +0 -18
  214. data/doc/classes/Dnsruby/Header.src/M000596.html +0 -35
  215. data/doc/classes/Dnsruby/Header.src/M000597.html +0 -18
  216. data/doc/classes/Dnsruby/Header.src/M000598.html +0 -18
  217. data/doc/classes/Dnsruby/Header.src/M000599.html +0 -21
  218. data/doc/classes/Dnsruby/Header.src/M000600.html +0 -20
  219. data/doc/classes/Dnsruby/Header.src/M000601.html +0 -32
  220. data/doc/classes/Dnsruby/Header.src/M000602.html +0 -27
  221. data/doc/classes/Dnsruby/Header.src/M000603.html +0 -26
  222. data/doc/classes/Dnsruby/Header.src/M000604.html +0 -18
  223. data/doc/classes/Dnsruby/Header.src/M000605.html +0 -47
  224. data/doc/classes/Dnsruby/Header.src/M000606.html +0 -28
  225. data/doc/classes/Dnsruby/Header.src/M000607.html +0 -30
  226. data/doc/classes/Dnsruby/Hosts.html +0 -316
  227. data/doc/classes/Dnsruby/Hosts.src/M000561.html +0 -20
  228. data/doc/classes/Dnsruby/Hosts.src/M000562.html +0 -19
  229. data/doc/classes/Dnsruby/Hosts.src/M000563.html +0 -20
  230. data/doc/classes/Dnsruby/Hosts.src/M000564.html +0 -21
  231. data/doc/classes/Dnsruby/Hosts.src/M000565.html +0 -19
  232. data/doc/classes/Dnsruby/Hosts.src/M000566.html +0 -20
  233. data/doc/classes/Dnsruby/Hosts.src/M000567.html +0 -21
  234. data/doc/classes/Dnsruby/IPv4.html +0 -233
  235. data/doc/classes/Dnsruby/IPv4.src/M000568.html +0 -32
  236. data/doc/classes/Dnsruby/IPv4.src/M000569.html +0 -19
  237. data/doc/classes/Dnsruby/IPv4.src/M000570.html +0 -18
  238. data/doc/classes/Dnsruby/IPv4.src/M000571.html +0 -18
  239. data/doc/classes/Dnsruby/IPv4.src/M000572.html +0 -18
  240. data/doc/classes/Dnsruby/IPv6.html +0 -281
  241. data/doc/classes/Dnsruby/IPv6.src/M000608.html +0 -60
  242. data/doc/classes/Dnsruby/IPv6.src/M000609.html +0 -22
  243. data/doc/classes/Dnsruby/IPv6.src/M000610.html +0 -20
  244. data/doc/classes/Dnsruby/IPv6.src/M000611.html +0 -18
  245. data/doc/classes/Dnsruby/Message.html +0 -861
  246. data/doc/classes/Dnsruby/Message.src/M000473.html +0 -39
  247. data/doc/classes/Dnsruby/Message.src/M000474.html +0 -26
  248. data/doc/classes/Dnsruby/Message.src/M000475.html +0 -23
  249. data/doc/classes/Dnsruby/Message.src/M000476.html +0 -22
  250. data/doc/classes/Dnsruby/Message.src/M000477.html +0 -22
  251. data/doc/classes/Dnsruby/Message.src/M000478.html +0 -20
  252. data/doc/classes/Dnsruby/Message.src/M000479.html +0 -20
  253. data/doc/classes/Dnsruby/Message.src/M000480.html +0 -20
  254. data/doc/classes/Dnsruby/Message.src/M000481.html +0 -20
  255. data/doc/classes/Dnsruby/Message.src/M000482.html +0 -18
  256. data/doc/classes/Dnsruby/Message.src/M000483.html +0 -20
  257. data/doc/classes/Dnsruby/Message.src/M000484.html +0 -23
  258. data/doc/classes/Dnsruby/Message.src/M000485.html +0 -30
  259. data/doc/classes/Dnsruby/Message.src/M000486.html +0 -20
  260. data/doc/classes/Dnsruby/Message.src/M000487.html +0 -18
  261. data/doc/classes/Dnsruby/Message.src/M000488.html +0 -23
  262. data/doc/classes/Dnsruby/Message.src/M000489.html +0 -24
  263. data/doc/classes/Dnsruby/Message.src/M000490.html +0 -73
  264. data/doc/classes/Dnsruby/Message.src/M000491.html +0 -35
  265. data/doc/classes/Dnsruby/Message.src/M000492.html +0 -46
  266. data/doc/classes/Dnsruby/Message/Section.html +0 -160
  267. data/doc/classes/Dnsruby/Message/Section.src/M000498.html +0 -29
  268. data/doc/classes/Dnsruby/Message/Section.src/M000499.html +0 -30
  269. data/doc/classes/Dnsruby/MetaTypes.html +0 -136
  270. data/doc/classes/Dnsruby/Modes.html +0 -171
  271. data/doc/classes/Dnsruby/NXDomain.html +0 -119
  272. data/doc/classes/Dnsruby/Name.html +0 -330
  273. data/doc/classes/Dnsruby/Name.src/M000458.html +0 -35
  274. data/doc/classes/Dnsruby/Name.src/M000459.html +0 -20
  275. data/doc/classes/Dnsruby/Name.src/M000460.html +0 -18
  276. data/doc/classes/Dnsruby/Name.src/M000461.html +0 -21
  277. data/doc/classes/Dnsruby/Name.src/M000462.html +0 -22
  278. data/doc/classes/Dnsruby/Name.src/M000463.html +0 -18
  279. data/doc/classes/Dnsruby/Name/Label.html +0 -300
  280. data/doc/classes/Dnsruby/Name/Label.src/M000464.html +0 -21
  281. data/doc/classes/Dnsruby/Name/Label.src/M000465.html +0 -18
  282. data/doc/classes/Dnsruby/Name/Label.src/M000466.html +0 -22
  283. data/doc/classes/Dnsruby/Name/Label.src/M000467.html +0 -18
  284. data/doc/classes/Dnsruby/Name/Label.src/M000468.html +0 -18
  285. data/doc/classes/Dnsruby/Name/Label.src/M000469.html +0 -18
  286. data/doc/classes/Dnsruby/Name/Label.src/M000470.html +0 -18
  287. data/doc/classes/Dnsruby/Name/Label.src/M000471.html +0 -18
  288. data/doc/classes/Dnsruby/Name/Label.src/M000472.html +0 -18
  289. data/doc/classes/Dnsruby/NotImp.html +0 -119
  290. data/doc/classes/Dnsruby/OpCode.html +0 -146
  291. data/doc/classes/Dnsruby/OtherResolvError.html +0 -119
  292. data/doc/classes/Dnsruby/QTypes.html +0 -146
  293. data/doc/classes/Dnsruby/Question.html +0 -306
  294. data/doc/classes/Dnsruby/Question.src/M000590.html +0 -47
  295. data/doc/classes/Dnsruby/Question.src/M000591.html +0 -18
  296. data/doc/classes/Dnsruby/Question.src/M000592.html +0 -18
  297. data/doc/classes/Dnsruby/Question.src/M000593.html +0 -32
  298. data/doc/classes/Dnsruby/Question.src/M000594.html +0 -18
  299. data/doc/classes/Dnsruby/RCode.html +0 -211
  300. data/doc/classes/Dnsruby/RR.html +0 -653
  301. data/doc/classes/Dnsruby/RR.src/M000352.html +0 -18
  302. data/doc/classes/Dnsruby/RR.src/M000353.html +0 -22
  303. data/doc/classes/Dnsruby/RR.src/M000354.html +0 -18
  304. data/doc/classes/Dnsruby/RR.src/M000355.html +0 -26
  305. data/doc/classes/Dnsruby/RR.src/M000356.html +0 -26
  306. data/doc/classes/Dnsruby/RR.src/M000357.html +0 -18
  307. data/doc/classes/Dnsruby/RR.src/M000358.html +0 -36
  308. data/doc/classes/Dnsruby/RR.src/M000359.html +0 -100
  309. data/doc/classes/Dnsruby/RR.src/M000360.html +0 -18
  310. data/doc/classes/Dnsruby/RR.src/M000361.html +0 -18
  311. data/doc/classes/Dnsruby/RR.src/M000362.html +0 -22
  312. data/doc/classes/Dnsruby/RR.src/M000363.html +0 -33
  313. data/doc/classes/Dnsruby/RR.src/M000364.html +0 -24
  314. data/doc/classes/Dnsruby/RR/ANY.html +0 -133
  315. data/doc/classes/Dnsruby/RR/CERT.html +0 -180
  316. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +0 -169
  317. data/doc/classes/Dnsruby/RR/CNAME.html +0 -151
  318. data/doc/classes/Dnsruby/RR/DLV.html +0 -134
  319. data/doc/classes/Dnsruby/RR/DNAME.html +0 -150
  320. data/doc/classes/Dnsruby/RR/DNSKEY.html +0 -422
  321. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000397.html +0 -20
  322. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000398.html +0 -21
  323. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000399.html +0 -28
  324. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000400.html +0 -22
  325. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000401.html +0 -18
  326. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000402.html +0 -22
  327. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000403.html +0 -18
  328. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000404.html +0 -26
  329. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000405.html +0 -38
  330. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000406.html +0 -58
  331. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000407.html +0 -21
  332. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000408.html +0 -24
  333. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000409.html +0 -39
  334. data/doc/classes/Dnsruby/RR/DNSKEY.src/M000410.html +0 -24
  335. data/doc/classes/Dnsruby/RR/DS.html +0 -329
  336. data/doc/classes/Dnsruby/RR/DS.src/M000390.html +0 -19
  337. data/doc/classes/Dnsruby/RR/DS.src/M000391.html +0 -28
  338. data/doc/classes/Dnsruby/RR/DS.src/M000392.html +0 -28
  339. data/doc/classes/Dnsruby/RR/DS.src/M000393.html +0 -38
  340. data/doc/classes/Dnsruby/RR/DS.src/M000394.html +0 -29
  341. data/doc/classes/Dnsruby/RR/DS.src/M000395.html +0 -53
  342. data/doc/classes/Dnsruby/RR/DS.src/M000396.html +0 -40
  343. data/doc/classes/Dnsruby/RR/DS/DigestTypes.html +0 -111
  344. data/doc/classes/Dnsruby/RR/DomainName.html +0 -175
  345. data/doc/classes/Dnsruby/RR/DomainName.src/M000436.html +0 -18
  346. data/doc/classes/Dnsruby/RR/Generic.html +0 -133
  347. data/doc/classes/Dnsruby/RR/HINFO.html +0 -155
  348. data/doc/classes/Dnsruby/RR/IN.html +0 -155
  349. data/doc/classes/Dnsruby/RR/IN/A.html +0 -200
  350. data/doc/classes/Dnsruby/RR/IN/A.src/M000368.html +0 -18
  351. data/doc/classes/Dnsruby/RR/IN/A.src/M000369.html +0 -18
  352. data/doc/classes/Dnsruby/RR/IN/A.src/M000370.html +0 -18
  353. data/doc/classes/Dnsruby/RR/IN/AAAA.html +0 -139
  354. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +0 -145
  355. data/doc/classes/Dnsruby/RR/IN/PX.html +0 -143
  356. data/doc/classes/Dnsruby/RR/IN/SRV.html +0 -238
  357. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000365.html +0 -29
  358. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000366.html +0 -26
  359. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000367.html +0 -22
  360. data/doc/classes/Dnsruby/RR/IN/WKS.html +0 -166
  361. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000371.html +0 -20
  362. data/doc/classes/Dnsruby/RR/ISDN.html +0 -155
  363. data/doc/classes/Dnsruby/RR/LOC.html +0 -395
  364. data/doc/classes/Dnsruby/RR/LOC.src/M000376.html +0 -32
  365. data/doc/classes/Dnsruby/RR/LOC.src/M000377.html +0 -23
  366. data/doc/classes/Dnsruby/RR/LOC.src/M000378.html +0 -25
  367. data/doc/classes/Dnsruby/RR/LOC.src/M000379.html +0 -21
  368. data/doc/classes/Dnsruby/RR/LOC.src/M000380.html +0 -20
  369. data/doc/classes/Dnsruby/RR/LOC.src/M000381.html +0 -23
  370. data/doc/classes/Dnsruby/RR/MB.html +0 -150
  371. data/doc/classes/Dnsruby/RR/MG.html +0 -150
  372. data/doc/classes/Dnsruby/RR/MINFO.html +0 -156
  373. data/doc/classes/Dnsruby/RR/MR.html +0 -150
  374. data/doc/classes/Dnsruby/RR/MX.html +0 -155
  375. data/doc/classes/Dnsruby/RR/NAPTR.html +0 -190
  376. data/doc/classes/Dnsruby/RR/NS.html +0 -151
  377. data/doc/classes/Dnsruby/RR/NSAP.html +0 -293
  378. data/doc/classes/Dnsruby/RR/NSAP.src/M000446.html +0 -19
  379. data/doc/classes/Dnsruby/RR/NSAP.src/M000447.html +0 -19
  380. data/doc/classes/Dnsruby/RR/NSAP.src/M000448.html +0 -22
  381. data/doc/classes/Dnsruby/RR/NSAP.src/M000449.html +0 -31
  382. data/doc/classes/Dnsruby/RR/NSEC.html +0 -301
  383. data/doc/classes/Dnsruby/RR/NSEC.src/M000382.html +0 -19
  384. data/doc/classes/Dnsruby/RR/NSEC.src/M000383.html +0 -18
  385. data/doc/classes/Dnsruby/RR/NSEC.src/M000384.html +0 -34
  386. data/doc/classes/Dnsruby/RR/NSEC.src/M000385.html +0 -18
  387. data/doc/classes/Dnsruby/RR/NSEC.src/M000386.html +0 -75
  388. data/doc/classes/Dnsruby/RR/NSEC.src/M000387.html +0 -18
  389. data/doc/classes/Dnsruby/RR/NSEC.src/M000388.html +0 -92
  390. data/doc/classes/Dnsruby/RR/NSEC.src/M000389.html +0 -23
  391. data/doc/classes/Dnsruby/RR/NSEC3.html +0 -366
  392. data/doc/classes/Dnsruby/RR/NSEC3.src/M000438.html +0 -28
  393. data/doc/classes/Dnsruby/RR/NSEC3.src/M000439.html +0 -18
  394. data/doc/classes/Dnsruby/RR/NSEC3.src/M000440.html +0 -18
  395. data/doc/classes/Dnsruby/RR/NSEC3.src/M000441.html +0 -22
  396. data/doc/classes/Dnsruby/RR/NSEC3.src/M000442.html +0 -18
  397. data/doc/classes/Dnsruby/RR/NSEC3.src/M000443.html +0 -21
  398. data/doc/classes/Dnsruby/RR/NSEC3.src/M000444.html +0 -21
  399. data/doc/classes/Dnsruby/RR/NSEC3.src/M000445.html +0 -29
  400. data/doc/classes/Dnsruby/RR/NSEC3PARAM.html +0 -279
  401. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000430.html +0 -28
  402. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000431.html +0 -18
  403. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000432.html +0 -22
  404. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000433.html +0 -21
  405. data/doc/classes/Dnsruby/RR/NSEC3PARAM.src/M000434.html +0 -25
  406. data/doc/classes/Dnsruby/RR/PTR.html +0 -132
  407. data/doc/classes/Dnsruby/RR/RP.html +0 -183
  408. data/doc/classes/Dnsruby/RR/RP.src/M000435.html +0 -19
  409. data/doc/classes/Dnsruby/RR/RRSIG.html +0 -372
  410. data/doc/classes/Dnsruby/RR/RRSIG.src/M000450.html +0 -26
  411. data/doc/classes/Dnsruby/RR/RRSIG.src/M000451.html +0 -28
  412. data/doc/classes/Dnsruby/RR/RRSIG.src/M000452.html +0 -23
  413. data/doc/classes/Dnsruby/RR/RRSIG.src/M000453.html +0 -23
  414. data/doc/classes/Dnsruby/RR/RRSIG.src/M000454.html +0 -46
  415. data/doc/classes/Dnsruby/RR/RRSIG.src/M000455.html +0 -50
  416. data/doc/classes/Dnsruby/RR/RRSIG.src/M000456.html +0 -18
  417. data/doc/classes/Dnsruby/RR/RRSIG.src/M000457.html +0 -27
  418. data/doc/classes/Dnsruby/RR/RT.html +0 -155
  419. data/doc/classes/Dnsruby/RR/SOA.html +0 -233
  420. data/doc/classes/Dnsruby/RR/SOA.src/M000419.html +0 -24
  421. data/doc/classes/Dnsruby/RR/SOA.src/M000420.html +0 -27
  422. data/doc/classes/Dnsruby/RR/SPF.html +0 -138
  423. data/doc/classes/Dnsruby/RR/TKEY.html +0 -313
  424. data/doc/classes/Dnsruby/RR/TKEY.src/M000372.html +0 -19
  425. data/doc/classes/Dnsruby/RR/TKEY.src/M000373.html +0 -29
  426. data/doc/classes/Dnsruby/RR/TKEY.src/M000374.html +0 -21
  427. data/doc/classes/Dnsruby/RR/TKEY.src/M000375.html +0 -29
  428. data/doc/classes/Dnsruby/RR/TSIG.html +0 -524
  429. data/doc/classes/Dnsruby/RR/TSIG.src/M000421.html +0 -24
  430. data/doc/classes/Dnsruby/RR/TSIG.src/M000422.html +0 -32
  431. data/doc/classes/Dnsruby/RR/TSIG.src/M000423.html +0 -54
  432. data/doc/classes/Dnsruby/RR/TSIG.src/M000424.html +0 -121
  433. data/doc/classes/Dnsruby/RR/TSIG.src/M000425.html +0 -33
  434. data/doc/classes/Dnsruby/RR/TSIG.src/M000426.html +0 -25
  435. data/doc/classes/Dnsruby/RR/TSIG.src/M000427.html +0 -36
  436. data/doc/classes/Dnsruby/RR/TSIG.src/M000428.html +0 -22
  437. data/doc/classes/Dnsruby/RR/TSIG.src/M000429.html +0 -29
  438. data/doc/classes/Dnsruby/RR/TXT.html +0 -233
  439. data/doc/classes/Dnsruby/RR/TXT.src/M000414.html +0 -18
  440. data/doc/classes/Dnsruby/RR/TXT.src/M000415.html +0 -18
  441. data/doc/classes/Dnsruby/RR/TXT.src/M000416.html +0 -20
  442. data/doc/classes/Dnsruby/RR/TXT.src/M000417.html +0 -27
  443. data/doc/classes/Dnsruby/RR/TXT.src/M000418.html +0 -25
  444. data/doc/classes/Dnsruby/RR/X25.html +0 -203
  445. data/doc/classes/Dnsruby/RR/X25.src/M000411.html +0 -18
  446. data/doc/classes/Dnsruby/RR/X25.src/M000412.html +0 -18
  447. data/doc/classes/Dnsruby/RR/X25.src/M000413.html +0 -22
  448. data/doc/classes/Dnsruby/RRSet.html +0 -400
  449. data/doc/classes/Dnsruby/RRSet.src/M000575.html +0 -23
  450. data/doc/classes/Dnsruby/RRSet.src/M000576.html +0 -18
  451. data/doc/classes/Dnsruby/RRSet.src/M000577.html +0 -18
  452. data/doc/classes/Dnsruby/RRSet.src/M000578.html +0 -47
  453. data/doc/classes/Dnsruby/RRSet.src/M000579.html +0 -32
  454. data/doc/classes/Dnsruby/RRSet.src/M000580.html +0 -18
  455. data/doc/classes/Dnsruby/RRSet.src/M000581.html +0 -20
  456. data/doc/classes/Dnsruby/RRSet.src/M000582.html +0 -18
  457. data/doc/classes/Dnsruby/RRSet.src/M000583.html +0 -18
  458. data/doc/classes/Dnsruby/RRSet.src/M000584.html +0 -18
  459. data/doc/classes/Dnsruby/RRSet.src/M000585.html +0 -18
  460. data/doc/classes/Dnsruby/RRSet.src/M000586.html +0 -22
  461. data/doc/classes/Dnsruby/RRSet.src/M000587.html +0 -18
  462. data/doc/classes/Dnsruby/RRSet.src/M000588.html +0 -22
  463. data/doc/classes/Dnsruby/RRSet.src/M000589.html +0 -18
  464. data/doc/classes/Dnsruby/Recursor.html +0 -744
  465. data/doc/classes/Dnsruby/Recursor.src/M000639.html +0 -19
  466. data/doc/classes/Dnsruby/Recursor.src/M000640.html +0 -97
  467. data/doc/classes/Dnsruby/Recursor.src/M000641.html +0 -20
  468. data/doc/classes/Dnsruby/Recursor.src/M000642.html +0 -18
  469. data/doc/classes/Dnsruby/Recursor.src/M000643.html +0 -31
  470. data/doc/classes/Dnsruby/Recursor.src/M000644.html +0 -231
  471. data/doc/classes/Dnsruby/Refused.html +0 -119
  472. data/doc/classes/Dnsruby/Resolv.html +0 -401
  473. data/doc/classes/Dnsruby/Resolv.src/M000516.html +0 -18
  474. data/doc/classes/Dnsruby/Resolv.src/M000517.html +0 -18
  475. data/doc/classes/Dnsruby/Resolv.src/M000518.html +0 -18
  476. data/doc/classes/Dnsruby/Resolv.src/M000519.html +0 -18
  477. data/doc/classes/Dnsruby/Resolv.src/M000520.html +0 -18
  478. data/doc/classes/Dnsruby/Resolv.src/M000521.html +0 -18
  479. data/doc/classes/Dnsruby/Resolv.src/M000522.html +0 -18
  480. data/doc/classes/Dnsruby/Resolv.src/M000523.html +0 -19
  481. data/doc/classes/Dnsruby/Resolv.src/M000524.html +0 -20
  482. data/doc/classes/Dnsruby/Resolv.src/M000525.html +0 -29
  483. data/doc/classes/Dnsruby/Resolv.src/M000526.html +0 -19
  484. data/doc/classes/Dnsruby/Resolv.src/M000527.html +0 -20
  485. data/doc/classes/Dnsruby/Resolv.src/M000528.html +0 -25
  486. data/doc/classes/Dnsruby/ResolvError.html +0 -117
  487. data/doc/classes/Dnsruby/ResolvTimeout.html +0 -117
  488. data/doc/classes/Dnsruby/Resolver.html +0 -1114
  489. data/doc/classes/Dnsruby/Resolver.src/M000658.html +0 -24
  490. data/doc/classes/Dnsruby/Resolver.src/M000659.html +0 -27
  491. data/doc/classes/Dnsruby/Resolver.src/M000660.html +0 -28
  492. data/doc/classes/Dnsruby/Resolver.src/M000661.html +0 -18
  493. data/doc/classes/Dnsruby/Resolver.src/M000662.html +0 -51
  494. data/doc/classes/Dnsruby/Resolver.src/M000663.html +0 -25
  495. data/doc/classes/Dnsruby/Resolver.src/M000664.html +0 -22
  496. data/doc/classes/Dnsruby/Resolver.src/M000665.html +0 -18
  497. data/doc/classes/Dnsruby/Resolver.src/M000666.html +0 -20
  498. data/doc/classes/Dnsruby/Resolver.src/M000667.html +0 -19
  499. data/doc/classes/Dnsruby/Resolver.src/M000668.html +0 -21
  500. data/doc/classes/Dnsruby/Resolver.src/M000669.html +0 -21
  501. data/doc/classes/Dnsruby/Resolver.src/M000670.html +0 -27
  502. data/doc/classes/Dnsruby/Resolver.src/M000671.html +0 -19
  503. data/doc/classes/Dnsruby/Resolver.src/M000672.html +0 -19
  504. data/doc/classes/Dnsruby/Resolver.src/M000673.html +0 -19
  505. data/doc/classes/Dnsruby/Resolver.src/M000674.html +0 -19
  506. data/doc/classes/Dnsruby/Resolver.src/M000675.html +0 -19
  507. data/doc/classes/Dnsruby/Resolver.src/M000676.html +0 -19
  508. data/doc/classes/Dnsruby/Resolver.src/M000677.html +0 -19
  509. data/doc/classes/Dnsruby/Resolver.src/M000678.html +0 -19
  510. data/doc/classes/Dnsruby/Resolver.src/M000679.html +0 -19
  511. data/doc/classes/Dnsruby/Resolver.src/M000680.html +0 -19
  512. data/doc/classes/Dnsruby/Resolver.src/M000681.html +0 -26
  513. data/doc/classes/Dnsruby/Resolver.src/M000682.html +0 -18
  514. data/doc/classes/Dnsruby/Resolver.src/M000683.html +0 -23
  515. data/doc/classes/Dnsruby/Resolver.src/M000684.html +0 -18
  516. data/doc/classes/Dnsruby/ServFail.html +0 -119
  517. data/doc/classes/Dnsruby/SingleResolver.html +0 -801
  518. data/doc/classes/Dnsruby/SingleResolver.src/M000529.html +0 -18
  519. data/doc/classes/Dnsruby/SingleResolver.src/M000530.html +0 -24
  520. data/doc/classes/Dnsruby/SingleResolver.src/M000531.html +0 -36
  521. data/doc/classes/Dnsruby/SingleResolver.src/M000532.html +0 -18
  522. data/doc/classes/Dnsruby/SingleResolver.src/M000533.html +0 -19
  523. data/doc/classes/Dnsruby/SingleResolver.src/M000534.html +0 -58
  524. data/doc/classes/Dnsruby/SingleResolver.src/M000535.html +0 -19
  525. data/doc/classes/Dnsruby/SingleResolver.src/M000536.html +0 -19
  526. data/doc/classes/Dnsruby/SingleResolver.src/M000537.html +0 -25
  527. data/doc/classes/Dnsruby/SingleResolver.src/M000538.html +0 -57
  528. data/doc/classes/Dnsruby/SingleResolver.src/M000539.html +0 -21
  529. data/doc/classes/Dnsruby/SingleResolver.src/M000540.html +0 -19
  530. data/doc/classes/Dnsruby/SingleResolver.src/M000541.html +0 -26
  531. data/doc/classes/Dnsruby/SingleResolver.src/M000542.html +0 -26
  532. data/doc/classes/Dnsruby/SingleResolver.src/M000543.html +0 -36
  533. data/doc/classes/Dnsruby/SingleResolver.src/M000544.html +0 -21
  534. data/doc/classes/Dnsruby/SingleResolver.src/M000545.html +0 -31
  535. data/doc/classes/Dnsruby/SingleResolver.src/M000546.html +0 -47
  536. data/doc/classes/Dnsruby/SingleResolver.src/M000547.html +0 -35
  537. data/doc/classes/Dnsruby/SingleResolver.src/M000548.html +0 -24
  538. data/doc/classes/Dnsruby/SingleResolver.src/M000549.html +0 -21
  539. data/doc/classes/Dnsruby/TheLog.html +0 -188
  540. data/doc/classes/Dnsruby/TheLog.src/M000612.html +0 -18
  541. data/doc/classes/Dnsruby/TheLog.src/M000613.html +0 -18
  542. data/doc/classes/Dnsruby/TheLog.src/M000614.html +0 -18
  543. data/doc/classes/Dnsruby/Types.html +0 -441
  544. data/doc/classes/Dnsruby/Update.html +0 -368
  545. data/doc/classes/Dnsruby/Update.src/M000634.html +0 -32
  546. data/doc/classes/Dnsruby/Update.src/M000635.html +0 -36
  547. data/doc/classes/Dnsruby/Update.src/M000636.html +0 -32
  548. data/doc/classes/Dnsruby/Update.src/M000637.html +0 -41
  549. data/doc/classes/Dnsruby/Update.src/M000638.html +0 -34
  550. data/doc/classes/Dnsruby/VerifyError.html +0 -119
  551. data/doc/classes/Dnsruby/ZoneTransfer.html +0 -300
  552. data/doc/classes/Dnsruby/ZoneTransfer.src/M000500.html +0 -18
  553. data/doc/classes/Dnsruby/ZoneTransfer.src/M000501.html +0 -24
  554. data/doc/classes/Dnsruby/ZoneTransfer.src/M000502.html +0 -35
  555. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +0 -200
  556. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000503.html +0 -19
  557. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000504.html +0 -19
  558. data/doc/classes/DnssecTest.html +0 -242
  559. data/doc/classes/DnssecTest.src/M000235.html +0 -58
  560. data/doc/classes/DnssecTest.src/M000236.html +0 -28
  561. data/doc/classes/DnssecTest.src/M000237.html +0 -28
  562. data/doc/classes/DnssecTest.src/M000238.html +0 -28
  563. data/doc/classes/DnssecTest.src/M000239.html +0 -33
  564. data/doc/classes/DnssecTest.src/M000240.html +0 -24
  565. data/doc/classes/DnssecTest.src/M000241.html +0 -47
  566. data/doc/classes/DnssecTest.src/M000242.html +0 -30
  567. data/doc/classes/DsTest.html +0 -252
  568. data/doc/classes/DsTest.src/M000190.html +0 -25
  569. data/doc/classes/DsTest.src/M000191.html +0 -24
  570. data/doc/classes/DsTest.src/M000192.html +0 -26
  571. data/doc/classes/DsTest.src/M000193.html +0 -23
  572. data/doc/classes/DsTest.src/M000194.html +0 -31
  573. data/doc/classes/DsTest.src/M000195.html +0 -25
  574. data/doc/classes/Enumerable.html +0 -118
  575. data/doc/classes/Errno.html +0 -111
  576. data/doc/classes/Errno/ENOTEMPTY.html +0 -111
  577. data/doc/classes/EventMachineTestDeferrable.html +0 -212
  578. data/doc/classes/EventMachineTestDeferrable.src/M000100.html +0 -20
  579. data/doc/classes/EventMachineTestDeferrable.src/M000101.html +0 -19
  580. data/doc/classes/EventMachineTestDeferrable.src/M000102.html +0 -28
  581. data/doc/classes/EventMachineTestDeferrable.src/M000103.html +0 -29
  582. data/doc/classes/EventMachineTestDeferrable.src/M000104.html +0 -33
  583. data/doc/classes/EventMachineTestDeferrable.src/M000105.html +0 -32
  584. data/doc/classes/EventMachineTestResolver.html +0 -324
  585. data/doc/classes/EventMachineTestResolver.src/M000177.html +0 -21
  586. data/doc/classes/EventMachineTestResolver.src/M000178.html +0 -19
  587. data/doc/classes/EventMachineTestResolver.src/M000179.html +0 -20
  588. data/doc/classes/EventMachineTestResolver.src/M000180.html +0 -20
  589. data/doc/classes/EventMachineTestResolver.src/M000181.html +0 -24
  590. data/doc/classes/EventMachineTestResolver.src/M000182.html +0 -25
  591. data/doc/classes/EventMachineTestResolver.src/M000183.html +0 -31
  592. data/doc/classes/EventMachineTestResolver.src/M000184.html +0 -24
  593. data/doc/classes/EventMachineTestResolver.src/M000185.html +0 -39
  594. data/doc/classes/EventMachineTestResolver.src/M000186.html +0 -36
  595. data/doc/classes/EventMachineTestResolver.src/M000187.html +0 -32
  596. data/doc/classes/EventMachineTestResolver.src/M000188.html +0 -30
  597. data/doc/classes/EventMachineTestResolver.src/M000189.html +0 -22
  598. data/doc/classes/EventMachineTestSingleResolver.html +0 -227
  599. data/doc/classes/EventMachineTestSingleResolver.src/M000092.html +0 -21
  600. data/doc/classes/EventMachineTestSingleResolver.src/M000093.html +0 -19
  601. data/doc/classes/EventMachineTestSingleResolver.src/M000094.html +0 -31
  602. data/doc/classes/EventMachineTestSingleResolver.src/M000095.html +0 -33
  603. data/doc/classes/EventMachineTestSingleResolver.src/M000096.html +0 -33
  604. data/doc/classes/EventMachineTestSingleResolver.src/M000097.html +0 -32
  605. data/doc/classes/EventMachineTestSingleResolver.src/M000098.html +0 -23
  606. data/doc/classes/File.html +0 -166
  607. data/doc/classes/File.src/M000336.html +0 -20
  608. data/doc/classes/File.src/M000337.html +0 -20
  609. data/doc/classes/File.src/M000338.html +0 -18
  610. data/doc/classes/FileOperations.html +0 -375
  611. data/doc/classes/FileOperations.src/M000685.html +0 -31
  612. data/doc/classes/FileOperations.src/M000686.html +0 -20
  613. data/doc/classes/FileOperations.src/M000687.html +0 -20
  614. data/doc/classes/FileOperations.src/M000688.html +0 -24
  615. data/doc/classes/FileOperations.src/M000689.html +0 -34
  616. data/doc/classes/FileOperations.src/M000690.html +0 -27
  617. data/doc/classes/FileOperations.src/M000691.html +0 -21
  618. data/doc/classes/FileOperations.src/M000692.html +0 -19
  619. data/doc/classes/FileOperations.src/M000693.html +0 -40
  620. data/doc/classes/FileOperations.src/M000694.html +0 -19
  621. data/doc/classes/FileOperations.src/M000695.html +0 -20
  622. data/doc/classes/FileOperations.src/M000696.html +0 -18
  623. data/doc/classes/FileOperations.src/M000697.html +0 -18
  624. data/doc/classes/FileOperations.src/M000698.html +0 -18
  625. data/doc/classes/FileOperations.src/M000699.html +0 -20
  626. data/doc/classes/FileOperations.src/M000700.html +0 -20
  627. data/doc/classes/HookScriptAPI.html +0 -308
  628. data/doc/classes/HookScriptAPI.src/M000339.html +0 -18
  629. data/doc/classes/HookScriptAPI.src/M000341.html +0 -18
  630. data/doc/classes/HookScriptAPI.src/M000342.html +0 -18
  631. data/doc/classes/HookScriptAPI.src/M000343.html +0 -18
  632. data/doc/classes/HookScriptAPI.src/M000344.html +0 -18
  633. data/doc/classes/HookScriptAPI.src/M000345.html +0 -18
  634. data/doc/classes/HookScriptAPI.src/M000346.html +0 -18
  635. data/doc/classes/HookScriptAPI.src/M000347.html +0 -18
  636. data/doc/classes/HookScriptAPI.src/M000348.html +0 -20
  637. data/doc/classes/HookScriptAPI.src/M000349.html +0 -20
  638. data/doc/classes/HookScriptAPI.src/M000350.html +0 -20
  639. data/doc/classes/Installer.html +0 -1148
  640. data/doc/classes/Installer.src/M000243.html +0 -21
  641. data/doc/classes/Installer.src/M000244.html +0 -18
  642. data/doc/classes/Installer.src/M000245.html +0 -17
  643. data/doc/classes/Installer.src/M000246.html +0 -18
  644. data/doc/classes/Installer.src/M000247.html +0 -18
  645. data/doc/classes/Installer.src/M000248.html +0 -18
  646. data/doc/classes/Installer.src/M000249.html +0 -18
  647. data/doc/classes/Installer.src/M000250.html +0 -18
  648. data/doc/classes/Installer.src/M000251.html +0 -23
  649. data/doc/classes/Installer.src/M000252.html +0 -18
  650. data/doc/classes/Installer.src/M000255.html +0 -18
  651. data/doc/classes/Installer.src/M000259.html +0 -18
  652. data/doc/classes/Installer.src/M000260.html +0 -18
  653. data/doc/classes/Installer.src/M000261.html +0 -20
  654. data/doc/classes/Installer.src/M000263.html +0 -18
  655. data/doc/classes/Installer.src/M000267.html +0 -36
  656. data/doc/classes/Installer.src/M000268.html +0 -25
  657. data/doc/classes/Installer.src/M000269.html +0 -24
  658. data/doc/classes/Installer.src/M000270.html +0 -19
  659. data/doc/classes/Installer.src/M000271.html +0 -18
  660. data/doc/classes/Installer.src/M000272.html +0 -18
  661. data/doc/classes/Installer.src/M000273.html +0 -21
  662. data/doc/classes/Installer.src/M000274.html +0 -18
  663. data/doc/classes/Installer.src/M000275.html +0 -20
  664. data/doc/classes/Installer.src/M000276.html +0 -18
  665. data/doc/classes/Installer.src/M000277.html +0 -21
  666. data/doc/classes/Installer.src/M000278.html +0 -18
  667. data/doc/classes/Installer.src/M000279.html +0 -22
  668. data/doc/classes/Installer.src/M000280.html +0 -18
  669. data/doc/classes/Installer.src/M000281.html +0 -23
  670. data/doc/classes/Installer.src/M000282.html +0 -18
  671. data/doc/classes/Installer.src/M000283.html +0 -20
  672. data/doc/classes/Installer.src/M000284.html +0 -19
  673. data/doc/classes/Installer.src/M000285.html +0 -19
  674. data/doc/classes/Installer.src/M000286.html +0 -20
  675. data/doc/classes/Installer.src/M000287.html +0 -30
  676. data/doc/classes/Installer.src/M000288.html +0 -20
  677. data/doc/classes/Installer.src/M000294.html +0 -19
  678. data/doc/classes/Installer.src/M000295.html +0 -20
  679. data/doc/classes/Installer.src/M000298.html +0 -19
  680. data/doc/classes/Installer.src/M000302.html +0 -26
  681. data/doc/classes/Installer.src/M000303.html +0 -25
  682. data/doc/classes/Installer.src/M000304.html +0 -29
  683. data/doc/classes/Installer.src/M000305.html +0 -26
  684. data/doc/classes/Installer/Shebang.html +0 -202
  685. data/doc/classes/Installer/Shebang.src/M000306.html +0 -23
  686. data/doc/classes/Installer/Shebang.src/M000307.html +0 -19
  687. data/doc/classes/Installer/Shebang.src/M000308.html +0 -19
  688. data/doc/classes/Installer/Shebang.src/M000309.html +0 -18
  689. data/doc/classes/Nsec3ParamTest.html +0 -172
  690. data/doc/classes/Nsec3ParamTest.src/M000233.html +0 -26
  691. data/doc/classes/Nsec3ParamTest.src/M000234.html +0 -24
  692. data/doc/classes/Nsec3Test.html +0 -202
  693. data/doc/classes/Nsec3Test.src/M000207.html +0 -27
  694. data/doc/classes/Nsec3Test.src/M000208.html +0 -24
  695. data/doc/classes/Nsec3Test.src/M000209.html +0 -39
  696. data/doc/classes/Nsec3Test.src/M000210.html +0 -23
  697. data/doc/classes/NsecTest.html +0 -187
  698. data/doc/classes/NsecTest.src/M000333.html +0 -23
  699. data/doc/classes/NsecTest.src/M000334.html +0 -24
  700. data/doc/classes/NsecTest.src/M000335.html +0 -23
  701. data/doc/classes/RrsetTest.html +0 -137
  702. data/doc/classes/RrsetTest.src/M000310.html +0 -68
  703. data/doc/classes/RrsigTest.html +0 -150
  704. data/doc/classes/RrsigTest.src/M000099.html +0 -35
  705. data/doc/classes/SetupError.html +0 -111
  706. data/doc/classes/TestAResolverFile.html +0 -152
  707. data/doc/classes/TestAResolverFile.src/M000205.html +0 -18
  708. data/doc/classes/TestAResolverFile.src/M000206.html +0 -33
  709. data/doc/classes/TestAxfr.html +0 -137
  710. data/doc/classes/TestAxfr.src/M000106.html +0 -23
  711. data/doc/classes/TestDNS.html +0 -257
  712. data/doc/classes/TestDNS.src/M000196.html +0 -18
  713. data/doc/classes/TestDNS.src/M000197.html +0 -18
  714. data/doc/classes/TestDNS.src/M000198.html +0 -53
  715. data/doc/classes/TestDNS.src/M000199.html +0 -19
  716. data/doc/classes/TestDNS.src/M000200.html +0 -18
  717. data/doc/classes/TestDNS.src/M000201.html +0 -32
  718. data/doc/classes/TestDNS.src/M000202.html +0 -74
  719. data/doc/classes/TestDNS.src/M000203.html +0 -41
  720. data/doc/classes/TestDNS.src/M000204.html +0 -67
  721. data/doc/classes/TestDnsruby.html +0 -137
  722. data/doc/classes/TestDnsruby.src/M000211.html +0 -36
  723. data/doc/classes/TestEscapedChars.html +0 -152
  724. data/doc/classes/TestEscapedChars.src/M000014.html +0 -243
  725. data/doc/classes/TestEscapedChars.src/M000015.html +0 -248
  726. data/doc/classes/TestEventMachineSoak.html +0 -227
  727. data/doc/classes/TestEventMachineSoak.src/M000319.html +0 -19
  728. data/doc/classes/TestEventMachineSoak.src/M000320.html +0 -18
  729. data/doc/classes/TestEventMachineSoak.src/M000321.html +0 -18
  730. data/doc/classes/TestEventMachineSoak.src/M000322.html +0 -33
  731. data/doc/classes/TestEventMachineSoak.src/M000323.html +0 -34
  732. data/doc/classes/TestEventMachineSoak.src/M000324.html +0 -33
  733. data/doc/classes/TestEventMachineSoak.src/M000325.html +0 -33
  734. data/doc/classes/TestHeader.html +0 -137
  735. data/doc/classes/TestHeader.src/M000091.html +0 -98
  736. data/doc/classes/TestMisc.html +0 -167
  737. data/doc/classes/TestMisc.src/M000011.html +0 -28
  738. data/doc/classes/TestMisc.src/M000012.html +0 -50
  739. data/doc/classes/TestMisc.src/M000013.html +0 -84
  740. data/doc/classes/TestName.html +0 -182
  741. data/doc/classes/TestName.src/M000218.html +0 -24
  742. data/doc/classes/TestName.src/M000219.html +0 -23
  743. data/doc/classes/TestName.src/M000220.html +0 -21
  744. data/doc/classes/TestName.src/M000221.html +0 -21
  745. data/doc/classes/TestPacket.html +0 -182
  746. data/doc/classes/TestPacket.src/M000229.html +0 -154
  747. data/doc/classes/TestPacket.src/M000230.html +0 -25
  748. data/doc/classes/TestPacket.src/M000231.html +0 -23
  749. data/doc/classes/TestPacket.src/M000232.html +0 -32
  750. data/doc/classes/TestPacketUniquePush.html +0 -140
  751. data/doc/classes/TestPacketUniquePush.src/M000318.html +0 -81
  752. data/doc/classes/TestQuestion.html +0 -137
  753. data/doc/classes/TestQuestion.src/M000090.html +0 -45
  754. data/doc/classes/TestQueue.html +0 -137
  755. data/doc/classes/TestQueue.src/M000089.html +0 -27
  756. data/doc/classes/TestRR.html +0 -137
  757. data/doc/classes/TestRR.src/M000217.html +0 -256
  758. data/doc/classes/TestRecur.html +0 -137
  759. data/doc/classes/TestRecur.src/M000176.html +0 -20
  760. data/doc/classes/TestResOpt.html +0 -227
  761. data/doc/classes/TestResOpt.src/M000311.html +0 -37
  762. data/doc/classes/TestResOpt.src/M000312.html +0 -19
  763. data/doc/classes/TestResOpt.src/M000313.html +0 -30
  764. data/doc/classes/TestResOpt.src/M000314.html +0 -37
  765. data/doc/classes/TestResOpt.src/M000315.html +0 -45
  766. data/doc/classes/TestResOpt.src/M000316.html +0 -36
  767. data/doc/classes/TestResOpt.src/M000317.html +0 -60
  768. data/doc/classes/TestResolver.html +0 -357
  769. data/doc/classes/TestResolver.src/M000077.html +0 -18
  770. data/doc/classes/TestResolver.src/M000078.html +0 -20
  771. data/doc/classes/TestResolver.src/M000079.html +0 -20
  772. data/doc/classes/TestResolver.src/M000080.html +0 -24
  773. data/doc/classes/TestResolver.src/M000081.html +0 -25
  774. data/doc/classes/TestResolver.src/M000082.html +0 -31
  775. data/doc/classes/TestResolver.src/M000083.html +0 -24
  776. data/doc/classes/TestResolver.src/M000084.html +0 -42
  777. data/doc/classes/TestResolver.src/M000085.html +0 -38
  778. data/doc/classes/TestResolver.src/M000086.html +0 -34
  779. data/doc/classes/TestResolver.src/M000087.html +0 -30
  780. data/doc/classes/TestResolver.src/M000088.html +0 -41
  781. data/doc/classes/TestResolverConfig.html +0 -205
  782. data/doc/classes/TestResolverConfig.src/M000225.html +0 -18
  783. data/doc/classes/TestResolverConfig.src/M000226.html +0 -37
  784. data/doc/classes/TestResolverConfig.src/M000227.html +0 -23
  785. data/doc/classes/TestResolverConfig.src/M000228.html +0 -22
  786. data/doc/classes/TestResolverEnv.html +0 -141
  787. data/doc/classes/TestResolverEnv.src/M000332.html +0 -44
  788. data/doc/classes/TestRrOpt.html +0 -182
  789. data/doc/classes/TestRrOpt.src/M000007.html +0 -33
  790. data/doc/classes/TestRrOpt.src/M000008.html +0 -46
  791. data/doc/classes/TestRrOpt.src/M000009.html +0 -23
  792. data/doc/classes/TestRrOpt.src/M000010.html +0 -34
  793. data/doc/classes/TestRrTest.html +0 -155
  794. data/doc/classes/TestRrTest.src/M000224.html +0 -77
  795. data/doc/classes/TestRrUnknown.html +0 -167
  796. data/doc/classes/TestRrUnknown.src/M000074.html +0 -41
  797. data/doc/classes/TestRrUnknown.src/M000075.html +0 -39
  798. data/doc/classes/TestRrUnknown.src/M000076.html +0 -42
  799. data/doc/classes/TestSingleResolver.html +0 -293
  800. data/doc/classes/TestSingleResolver.src/M000149.html +0 -18
  801. data/doc/classes/TestSingleResolver.src/M000150.html +0 -19
  802. data/doc/classes/TestSingleResolver.src/M000151.html +0 -28
  803. data/doc/classes/TestSingleResolver.src/M000152.html +0 -30
  804. data/doc/classes/TestSingleResolver.src/M000153.html +0 -55
  805. data/doc/classes/TestSingleResolver.src/M000154.html +0 -26
  806. data/doc/classes/TestSingleResolver.src/M000155.html +0 -23
  807. data/doc/classes/TestSingleResolver.src/M000156.html +0 -27
  808. data/doc/classes/TestSingleResolver.src/M000157.html +0 -39
  809. data/doc/classes/TestSingleResolverSoak.html +0 -223
  810. data/doc/classes/TestSingleResolverSoak.src/M000326.html +0 -18
  811. data/doc/classes/TestSingleResolverSoak.src/M000327.html +0 -18
  812. data/doc/classes/TestSingleResolverSoak.src/M000328.html +0 -57
  813. data/doc/classes/TestSingleResolverSoak.src/M000329.html +0 -64
  814. data/doc/classes/TestSingleResolverSoak.src/M000330.html +0 -25
  815. data/doc/classes/TestSingleResolverSoak.src/M000331.html +0 -63
  816. data/doc/classes/TestSoakBase.html +0 -172
  817. data/doc/classes/TestSoakBase.src/M000072.html +0 -68
  818. data/doc/classes/TestSoakBase.src/M000073.html +0 -66
  819. data/doc/classes/TestTKey.html +0 -152
  820. data/doc/classes/TestTKey.src/M000215.html +0 -18
  821. data/doc/classes/TestTKey.src/M000216.html +0 -65
  822. data/doc/classes/TestTSig.html +0 -309
  823. data/doc/classes/TestTSig.src/M000138.html +0 -18
  824. data/doc/classes/TestTSig.src/M000139.html +0 -20
  825. data/doc/classes/TestTSig.src/M000140.html +0 -26
  826. data/doc/classes/TestTSig.src/M000141.html +0 -69
  827. data/doc/classes/TestTSig.src/M000142.html +0 -21
  828. data/doc/classes/TestTSig.src/M000143.html +0 -60
  829. data/doc/classes/TestTSig.src/M000144.html +0 -33
  830. data/doc/classes/TestTSig.src/M000145.html +0 -20
  831. data/doc/classes/TestTSig.src/M000146.html +0 -24
  832. data/doc/classes/TestTSig.src/M000147.html +0 -54
  833. data/doc/classes/TestTSig.src/M000148.html +0 -23
  834. data/doc/classes/TestTcp.html +0 -152
  835. data/doc/classes/TestTcp.src/M000222.html +0 -21
  836. data/doc/classes/TestTcp.src/M000223.html +0 -23
  837. data/doc/classes/TestUpdate.html +0 -152
  838. data/doc/classes/TestUpdate.src/M000174.html +0 -20
  839. data/doc/classes/TestUpdate.src/M000175.html +0 -203
  840. data/doc/classes/ToplevelInstaller.html +0 -621
  841. data/doc/classes/ToplevelInstaller.src/M000107.html +0 -23
  842. data/doc/classes/ToplevelInstaller.src/M000108.html +0 -18
  843. data/doc/classes/ToplevelInstaller.src/M000109.html +0 -25
  844. data/doc/classes/ToplevelInstaller.src/M000110.html +0 -21
  845. data/doc/classes/ToplevelInstaller.src/M000111.html +0 -18
  846. data/doc/classes/ToplevelInstaller.src/M000112.html +0 -18
  847. data/doc/classes/ToplevelInstaller.src/M000113.html +0 -38
  848. data/doc/classes/ToplevelInstaller.src/M000114.html +0 -18
  849. data/doc/classes/ToplevelInstaller.src/M000115.html +0 -18
  850. data/doc/classes/ToplevelInstaller.src/M000116.html +0 -18
  851. data/doc/classes/ToplevelInstaller.src/M000117.html +0 -18
  852. data/doc/classes/ToplevelInstaller.src/M000118.html +0 -18
  853. data/doc/classes/ToplevelInstaller.src/M000119.html +0 -40
  854. data/doc/classes/ToplevelInstaller.src/M000120.html +0 -18
  855. data/doc/classes/ToplevelInstaller.src/M000121.html +0 -18
  856. data/doc/classes/ToplevelInstaller.src/M000122.html +0 -21
  857. data/doc/classes/ToplevelInstaller.src/M000128.html +0 -40
  858. data/doc/classes/ToplevelInstaller.src/M000129.html +0 -31
  859. data/doc/classes/ToplevelInstaller.src/M000130.html +0 -52
  860. data/doc/classes/ToplevelInstaller.src/M000131.html +0 -19
  861. data/doc/classes/ToplevelInstaller.src/M000132.html +0 -18
  862. data/doc/classes/ToplevelInstaller.src/M000133.html +0 -18
  863. data/doc/classes/ToplevelInstaller.src/M000134.html +0 -18
  864. data/doc/classes/ToplevelInstaller.src/M000135.html +0 -20
  865. data/doc/classes/ToplevelInstaller.src/M000136.html +0 -18
  866. data/doc/classes/ToplevelInstaller.src/M000137.html +0 -18
  867. data/doc/classes/ToplevelInstallerMulti.html +0 -398
  868. data/doc/classes/ToplevelInstallerMulti.src/M000158.html +0 -21
  869. data/doc/classes/ToplevelInstallerMulti.src/M000159.html +0 -21
  870. data/doc/classes/ToplevelInstallerMulti.src/M000160.html +0 -23
  871. data/doc/classes/ToplevelInstallerMulti.src/M000161.html +0 -29
  872. data/doc/classes/ToplevelInstallerMulti.src/M000162.html +0 -22
  873. data/doc/classes/ToplevelInstallerMulti.src/M000163.html +0 -21
  874. data/doc/classes/ToplevelInstallerMulti.src/M000164.html +0 -21
  875. data/doc/classes/ToplevelInstallerMulti.src/M000165.html +0 -20
  876. data/doc/classes/ToplevelInstallerMulti.src/M000166.html +0 -20
  877. data/doc/classes/ToplevelInstallerMulti.src/M000167.html +0 -20
  878. data/doc/classes/ToplevelInstallerMulti.src/M000168.html +0 -21
  879. data/doc/classes/ToplevelInstallerMulti.src/M000169.html +0 -21
  880. data/doc/classes/ToplevelInstallerMulti.src/M000170.html +0 -25
  881. data/doc/classes/ToplevelInstallerMulti.src/M000171.html +0 -18
  882. data/doc/classes/ToplevelInstallerMulti.src/M000172.html +0 -18
  883. data/doc/classes/ToplevelInstallerMulti.src/M000173.html +0 -18
  884. data/doc/created.rid +0 -1
  885. data/doc/files/demo/axfr_rb.html +0 -158
  886. data/doc/files/demo/check_soa_rb.html +0 -138
  887. data/doc/files/demo/check_zone_rb.html +0 -231
  888. data/doc/files/demo/check_zone_rb.src/M000001.html +0 -81
  889. data/doc/files/demo/check_zone_rb.src/M000002.html +0 -30
  890. data/doc/files/demo/check_zone_rb.src/M000003.html +0 -23
  891. data/doc/files/demo/check_zone_rb.src/M000004.html +0 -23
  892. data/doc/files/demo/check_zone_rb.src/M000005.html +0 -23
  893. data/doc/files/demo/example_recurse_rb.html +0 -115
  894. data/doc/files/demo/mresolv_rb.html +0 -130
  895. data/doc/files/demo/mx_rb.html +0 -108
  896. data/doc/files/demo/rubydig_rb.html +0 -128
  897. data/doc/files/demo/trace_dns_rb.html +0 -108
  898. data/doc/files/lib/Dnsruby/Cache_rb.html +0 -109
  899. data/doc/files/lib/Dnsruby/Config_rb.html +0 -101
  900. data/doc/files/lib/Dnsruby/DNS_rb.html +0 -110
  901. data/doc/files/lib/Dnsruby/Hosts_rb.html +0 -108
  902. data/doc/files/lib/Dnsruby/Recursor_rb.html +0 -101
  903. data/doc/files/lib/Dnsruby/Resolver_rb.html +0 -110
  904. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +0 -109
  905. data/doc/files/lib/Dnsruby/TheLog_rb.html +0 -110
  906. data/doc/files/lib/Dnsruby/code_mapper_rb.html +0 -101
  907. data/doc/files/lib/Dnsruby/dnssec_rb.html +0 -107
  908. data/doc/files/lib/Dnsruby/event_machine_interface_rb.html +0 -108
  909. data/doc/files/lib/Dnsruby/iana_ports_rb.html +0 -127
  910. data/doc/files/lib/Dnsruby/ipv4_rb.html +0 -101
  911. data/doc/files/lib/Dnsruby/ipv6_rb.html +0 -101
  912. data/doc/files/lib/Dnsruby/message_rb.html +0 -109
  913. data/doc/files/lib/Dnsruby/name_rb.html +0 -101
  914. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +0 -101
  915. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +0 -101
  916. data/doc/files/lib/Dnsruby/resource/A_rb.html +0 -101
  917. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +0 -101
  918. data/doc/files/lib/Dnsruby/resource/DLV_rb.html +0 -101
  919. data/doc/files/lib/Dnsruby/resource/DNSKEY_rb.html +0 -101
  920. data/doc/files/lib/Dnsruby/resource/DS_rb.html +0 -108
  921. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +0 -101
  922. data/doc/files/lib/Dnsruby/resource/IN_rb.html +0 -112
  923. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +0 -101
  924. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +0 -101
  925. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +0 -101
  926. data/doc/files/lib/Dnsruby/resource/MX_rb.html +0 -101
  927. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +0 -101
  928. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +0 -101
  929. data/doc/files/lib/Dnsruby/resource/NSEC3PARAM_rb.html +0 -101
  930. data/doc/files/lib/Dnsruby/resource/NSEC3_rb.html +0 -101
  931. data/doc/files/lib/Dnsruby/resource/NSEC_rb.html +0 -101
  932. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +0 -101
  933. data/doc/files/lib/Dnsruby/resource/PX_rb.html +0 -101
  934. data/doc/files/lib/Dnsruby/resource/RP_rb.html +0 -101
  935. data/doc/files/lib/Dnsruby/resource/RRSIG_rb.html +0 -101
  936. data/doc/files/lib/Dnsruby/resource/RT_rb.html +0 -101
  937. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +0 -101
  938. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +0 -101
  939. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +0 -101
  940. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +0 -101
  941. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +0 -114
  942. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +0 -108
  943. data/doc/files/lib/Dnsruby/resource/X25_rb.html +0 -101
  944. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +0 -101
  945. data/doc/files/lib/Dnsruby/resource/generic_rb.html +0 -132
  946. data/doc/files/lib/Dnsruby/resource/resource_rb.html +0 -110
  947. data/doc/files/lib/Dnsruby/select_thread_rb.html +0 -111
  948. data/doc/files/lib/Dnsruby/update_rb.html +0 -101
  949. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +0 -101
  950. data/doc/files/lib/dnsruby_rb.html +0 -118
  951. data/doc/files/setup_rb.html +0 -148
  952. data/doc/files/setup_rb.src/M000006.html +0 -18
  953. data/doc/files/test/tc_axfr_rb.html +0 -110
  954. data/doc/files/test/tc_dns_rb.html +0 -117
  955. data/doc/files/test/tc_dnskey_rb.html +0 -109
  956. data/doc/files/test/tc_dnsruby_rb.html +0 -117
  957. data/doc/files/test/tc_dnssec_rb.html +0 -109
  958. data/doc/files/test/tc_ds_rb.html +0 -110
  959. data/doc/files/test/tc_escapedchars_rb.html +0 -117
  960. data/doc/files/test/tc_event_machine_deferrable_rb.html +0 -111
  961. data/doc/files/test/tc_event_machine_res_rb.html +0 -111
  962. data/doc/files/test/tc_event_machine_single_res_rb.html +0 -111
  963. data/doc/files/test/tc_event_machine_soak_rb.html +0 -113
  964. data/doc/files/test/tc_header_rb.html +0 -117
  965. data/doc/files/test/tc_misc_rb.html +0 -110
  966. data/doc/files/test/tc_name_rb.html +0 -117
  967. data/doc/files/test/tc_nsec3_rb.html +0 -109
  968. data/doc/files/test/tc_nsec3param_rb.html +0 -109
  969. data/doc/files/test/tc_nsec_rb.html +0 -109
  970. data/doc/files/test/tc_packet_rb.html +0 -117
  971. data/doc/files/test/tc_packet_unique_push_rb.html +0 -117
  972. data/doc/files/test/tc_question_rb.html +0 -117
  973. data/doc/files/test/tc_queue_rb.html +0 -109
  974. data/doc/files/test/tc_recur_rb.html +0 -109
  975. data/doc/files/test/tc_res_config_rb.html +0 -110
  976. data/doc/files/test/tc_res_env_rb.html +0 -117
  977. data/doc/files/test/tc_res_file_rb.html +0 -110
  978. data/doc/files/test/tc_res_opt_rb.html +0 -117
  979. data/doc/files/test/tc_resolver_rb.html +0 -117
  980. data/doc/files/test/tc_rr-opt_rb.html +0 -118
  981. data/doc/files/test/tc_rr-txt_rb.html +0 -117
  982. data/doc/files/test/tc_rr-unknown_rb.html +0 -110
  983. data/doc/files/test/tc_rr_rb.html +0 -117
  984. data/doc/files/test/tc_rrset_rb.html +0 -109
  985. data/doc/files/test/tc_rrsig_rb.html +0 -109
  986. data/doc/files/test/tc_single_resolver_rb.html +0 -117
  987. data/doc/files/test/tc_soak_base_rb.html +0 -110
  988. data/doc/files/test/tc_soak_rb.html +0 -121
  989. data/doc/files/test/tc_tcp_rb.html +0 -110
  990. data/doc/files/test/tc_tkey_rb.html +0 -111
  991. data/doc/files/test/tc_tsig_rb.html +0 -111
  992. data/doc/files/test/tc_update_rb.html +0 -117
  993. data/doc/files/test/ts_dnsruby_rb.html +0 -109
  994. data/doc/files/test/ts_offline_rb.html +0 -133
  995. data/doc/files/test/ts_online_rb.html +0 -128
  996. data/doc/fr_method_index.html +0 -726
@@ -0,0 +1,1289 @@
1
+ # This class does verification/validation from a single point - signed root,
2
+ # DLV, trust anchors. Dnssec controls a set of these to perform validation for
3
+ # the client.
4
+ # This class should only be used by Dnsruby
5
+ module Dnsruby
6
+ class SingleVerifier # :nodoc: all
7
+ class VerifierType
8
+ ROOT = 0
9
+ ANCHOR = 1
10
+ DLV = 2
11
+ end
12
+ def initialize(vtype)
13
+ @verifier_type = vtype
14
+ @added_dlv_key = false
15
+ # The DNSKEY RRs for the signed root (when it exists)
16
+ @root_anchors = KeyCache.new
17
+ # Could add methods for interacting with root anchors - see test/tc_itar.rb
18
+ # for example of how to load ITAR trust anchors into dnsruby
19
+
20
+ # The set of trust anchors.
21
+ # If the root is unsigned, then these must be initialised with at least
22
+ # one trusted key by the client application, if verification is to be performed.
23
+ @trust_anchors = KeyCache.new
24
+
25
+ @dlv_registries = []
26
+
27
+ # The set of keys which are trusted.
28
+ @trusted_keys = KeyCache.new
29
+
30
+ # The set of keys which have been indicated by a DS RRSet which has been
31
+ # signed by a trusted key. Although we have not yet located these keys, we
32
+ # have the details (tag and digest) which can identify the keys when we
33
+ # see them. At that point, they will be added to our trusted keys.
34
+ @discovered_ds_store = []
35
+ # The configured_ds_store is the set of DS records which have been configured
36
+ # by the client as trust anchors. Use Dnssec#add_trust_anchor to add these
37
+ @configured_ds_store = []
38
+ end
39
+
40
+ def get_dlv_resolver # :nodoc:
41
+ if (Dnssec.do_validation_with_recursor?)
42
+ return Recursor.new
43
+ else
44
+ if (Dnssec.default_resolver)
45
+ return Dnssec.default_resolver
46
+ else
47
+ return Resolver.new
48
+ end
49
+ end
50
+ end
51
+ def add_dlv_key(key)
52
+ # Is this a ZSK or a KSK?
53
+ # If it is a KSK, then get the ZSK from the zone
54
+ if (key.sep_key?)
55
+ get_dlv_key(key)
56
+ end
57
+ end
58
+ def get_dlv_key(ksk) # :nodoc:
59
+ # Using the KSK, get the ZSK for the DLV registry
60
+ if (!@res && (@verifier_type == VerifierType::DLV))
61
+ @res = get_dlv_resolver
62
+ end
63
+ # print "Sending query : res.dnssec = #{@res.dnssec}"
64
+ ret = nil
65
+ begin
66
+ ret = @res.query_no_validation_or_recursion("dlv.isc.org.", Types.DNSKEY)
67
+ if (!ret)
68
+ raise ResolvError.new("Couldn't get response from Recursor")
69
+ end
70
+ rescue ResolvError => e
71
+ # print "ERROR - Couldn't find the DLV key\n"
72
+ TheLog.error("Couldn't find the DLV key\n")
73
+ return
74
+ end
75
+ key_rrset = ret.answer.rrset("dlv.isc.org", Types.DNSKEY)
76
+ begin
77
+ verify(key_rrset, ksk)
78
+ add_trusted_key(key_rrset)
79
+ # print "Successfully added DLV key\n"
80
+ TheLog.info("Successfully added DLV key")
81
+ @added_dlv_key = true
82
+ rescue VerifyError => e
83
+ # print "Error verifying DLV key : #{e}\n"
84
+ TheLog.error("Error verifying DLV key : #{e}")
85
+ end
86
+ end
87
+ def add_trust_anchor(t)
88
+ add_trust_anchor_with_expiration(t, Time.utc(2035,"jan",1,20,15,1).to_i)
89
+ end
90
+ # Add the
91
+ def add_trust_anchor_with_expiration(k, expiration)
92
+ if (k.type == Types.DNSKEY)
93
+ k.flags = k.flags | RR::IN::DNSKEY::SEP_KEY
94
+ @trust_anchors.add_key_with_expiration(k, expiration)
95
+ # print "Adding trust anchor for #{k.name}\n"
96
+ TheLog.info("Adding trust anchor for #{k.name}")
97
+ elsif ((k.type == Types.DS) || ((k.type == Types.DLV) && (@verifier_type == VerifierType::DLV)))
98
+ @configured_ds_store.push(k)
99
+ end
100
+ end
101
+
102
+ def remove_trust_anchor(t)
103
+ @trust_anchors.delete(t)
104
+ end
105
+ # Wipes the cache of trusted keys
106
+ def clear_trust_anchors
107
+ @trust_anchors = KeyCache.new
108
+ end
109
+
110
+ def trust_anchors
111
+ return @trust_anchors.keys + @configured_ds_store
112
+ end
113
+
114
+ # Check that the RRSet and RRSIG record are compatible
115
+ def check_rr_data(rrset, sigrec)#:nodoc: all
116
+ #Each RR MUST have the same owner name as the RRSIG RR;
117
+ if (rrset.name.to_s.downcase != sigrec.name.to_s.downcase)
118
+ raise VerifyError.new("RRSET should have same owner name as RRSIG for verification (rrsert=#{rrset.name}, sigrec=#{sigrec.name}")
119
+ end
120
+
121
+ #Each RR MUST have the same class as the RRSIG RR;
122
+ if (rrset.klass != sigrec.klass)
123
+ raise VerifyError.new("RRSET should have same DNS class as RRSIG for verification")
124
+ end
125
+
126
+ #Each RR in the RRset MUST have the RR type listed in the
127
+ #RRSIG RR's Type Covered field;
128
+ if (rrset.type != sigrec.type_covered)
129
+ raise VerifyError.new("RRSET should have same type as RRSIG for verification")
130
+ end
131
+
132
+ #Each RR in the RRset MUST have the TTL listed in the
133
+ #RRSIG Original TTL Field;
134
+ if (rrset.ttl != sigrec.ttl)
135
+ raise VerifyError.new("RRSET should have same ttl as RRSIG for verification")
136
+ end
137
+
138
+ # Now check that we are in the validity period for the RRSIG
139
+ now = Time.now.to_i
140
+ if ((sigrec.expiration < now) || (sigrec.inception > now))
141
+ raise VerifyError.new("Signature record not in validity period")
142
+ end
143
+ end
144
+
145
+ # Add the specified keys to the trusted key cache.
146
+ # k can be a KeyCache, or an RRSet of DNSKEYs.
147
+ def add_trusted_key(k)
148
+ @trusted_keys.add(k)
149
+ end
150
+
151
+ # Wipes the cache of trusted keys
152
+ def clear_trusted_keys
153
+ @trusted_keys = KeyCache.new
154
+ @discovered_ds_store = []
155
+ @configured_ds_store = []
156
+ end
157
+
158
+ def trusted_keys
159
+ discovered_ds = []
160
+ @discovered_ds_store.each {|rrset|
161
+ rrset.rrs.each {|rr|
162
+ discovered_ds.push(rr)
163
+ }
164
+ }
165
+ return @trusted_keys.keys + @configured_ds_store + discovered_ds
166
+ end
167
+
168
+ # Check that the key fits a signed DS record key details
169
+ # If so, then add the key to the trusted keys
170
+ def check_ds(key, ds_rrset)#:nodoc: all
171
+ expiration = 0
172
+ found = false
173
+ ds_rrset.sigs.each { |sig|
174
+ if ((sig.type_covered == Types.DS) || ((sig.type_covered == Types.DLV)&& (@verifier_type==VerifierType::DLV)))
175
+ if (sig.inception <= Time.now.to_i)
176
+ # Check sig.expiration, sig.algorithm
177
+ if (sig.expiration > expiration)
178
+ expiration = sig.expiration
179
+ end
180
+ end
181
+ end
182
+ }
183
+ if (expiration > 0)
184
+ ds_rrset.rrs.each { |ds|
185
+ if ((ds.type === Types.DS) || ((ds.type == Types.DLV) && (@verifier_type == VerifierType::DLV)))
186
+ if (ds.check_key(key))
187
+ @trusted_keys.add_key_with_expiration(key, expiration)
188
+ found = true
189
+ end
190
+ end
191
+ }
192
+ end
193
+ return found
194
+ end
195
+
196
+ # Verify the specified message (or RRSet) using the set of trusted keys.
197
+ # If keys is a DNSKEY, or an Array or RRSet of DNSKEYs, then keys
198
+ # is added to the set of trusted keys before the message (or RRSet) is
199
+ # verified.
200
+ #
201
+ # If msg is a Dnsruby::Message, then any signed DNSKEY or DS RRSets are
202
+ # processed first, and any new keys are added to the trusted key set
203
+ # before the other RRSets are checked.
204
+ #
205
+ # msg can be a Dnsruby::Message or Dnsruby::RRSet.
206
+ # keys may be nil, or a KeyCache or an RRSet of Dnsruby::RR::DNSKEY
207
+ #
208
+ # Returns true if the message verifies OK, and false otherwise.
209
+ def verify(msg, keys = nil)
210
+ if (msg.kind_of?RRSet)
211
+ if (msg.type == Types.DNSKEY)
212
+ return verify_key_rrset(msg, keys)
213
+ end
214
+ if ((msg.type == Types.DS) || (msg.type == Types.DLV))
215
+ return verify_ds_rrset(msg, keys)
216
+
217
+ end
218
+ return verify_rrset(msg, keys)
219
+ end
220
+ # Use the set of trusted keys to check any RRSets we can, ideally
221
+ # those of other DNSKEY RRSets first. Then, see if we can use any of the
222
+ # new total set of keys to check the rest of the rrsets.
223
+ # Return true if we can verify the whole message.
224
+
225
+ msg.each_section do |section|
226
+ # print "Checking section : #{section}\n"
227
+ ds_rrsets = section.rrsets(Types.DS)
228
+ if ((!ds_rrsets || ds_rrsets.length == 0) && (@verifier_type == VerifierType::DLV))
229
+ ds_rrsets = section.rrsets(Types.DLV)
230
+ end
231
+ ds_rrsets.each {|ds_rrset|
232
+ if ((ds_rrset && ds_rrset.rrs.length > 0) && !verify_ds_rrset(ds_rrset, keys, msg))
233
+ raise VerifyError.new("Failed to verify DS RRSet")
234
+ # return false
235
+ end
236
+ }
237
+
238
+ key_rrsets = section.rrsets(Types.DNSKEY)
239
+ key_rrsets.each {|key_rrset|
240
+ if ((key_rrset && key_rrset.rrs.length > 0) && !verify_key_rrset(key_rrset, keys))
241
+ raise VerifyError.new("Failed to verify DNSKEY RRSet")
242
+ # return false
243
+ end
244
+ }
245
+ end
246
+
247
+ verify_nsecs(msg)
248
+
249
+ # Then, look through all the remaining RRSets, and verify them all (unless not necessary).
250
+ msg.section_rrsets.each do |section, rrsets|
251
+ rrsets.each do |rrset|
252
+ # If delegation NS or glue AAAA/A, then don't expect RRSIG.
253
+ # Otherwise, expect RRSIG and fail verification if RRSIG is not present
254
+
255
+ if ((section == "authority") && (rrset.type == Types.NS))
256
+ # Check for delegation
257
+ dsrrset = msg.authority.rrsets('DS')[0]
258
+ if ((msg.answer.size == 0) && (!dsrrset) && (rrset.type == Types.NS)) # (isDelegation)
259
+ # Now check NSEC(3) records for absence of DS and SOA
260
+ nsec = msg.authority.rrsets('NSEC')[0]
261
+ if (nsec.length == 0)
262
+ nsec = msg.authority.rrsets('NSEC3')[0]
263
+ end
264
+ if (nsec.rrs.length > 0)
265
+ if (!(nsec.rrs()[0].types.include?'DS') || !(nsec.rrs()[0].types.include?'SOA'))
266
+ next # delegation which we expect to be unsigned - so don't verify it!
267
+ end
268
+ end
269
+ end
270
+ # If NS records delegate the name to the child's nameservers, then they MUST NOT be signed
271
+ if (rrset.type == Types.NS)
272
+ # all_delegate = true
273
+ # rrset.rrs.each {|rr|
274
+ # name = Name.create(rr.nsdname)
275
+ # name.absolute = true
276
+ # if (!(name.subdomain_of?(rr.name)))
277
+ # all_delegate = false
278
+ # end
279
+ # }
280
+ # if (all_delegate && rrset.sigs.length == 0)
281
+ # next
282
+ # end
283
+ if ((rrset.name.to_s.downcase == msg.question()[0].qname.to_s.downcase) && (rrset.sigs.length == 0))
284
+ next
285
+ end
286
+ end
287
+ end
288
+
289
+ if (section == "additional")
290
+ # check for glue
291
+ # if the ownername (in the addtional section) of the glue address is the same or longer as the ownername of the NS record, it is glue
292
+ if (msg.additional.size > 0)
293
+ arec = msg.additional.rrsets('A')[0]
294
+ if (!arec || arec.rrs.length == 0)
295
+ arec = msg.additional.rrsets('AAAA')[0]
296
+ end
297
+ ns_rrsets = msg.additional.rrsets('NS')
298
+ ns_rrsets.each {|ns_rrset|
299
+ if (ns_rrset.length > 0)
300
+ nsname = ns_rrset.rrs()[0].name
301
+ if (arec && arec.rrs().length > 0)
302
+ aname = arec.rrs()[0].name
303
+ if (nsname.subdomain_of?aname)
304
+ next
305
+ end
306
+ end
307
+ end
308
+ }
309
+ end
310
+ end
311
+ # If records are in additional, and no RRSIG, that's Ok - just don't use them!
312
+ if ((section == "additional") && (rrset.sigs.length == 0))
313
+ # @TODO@ Make sure that we don't cache these records!
314
+ next
315
+ end
316
+ # else verify RRSet
317
+ # print "About to verify #{rrset.name}, #{rrset.type}\n"
318
+ if (!verify_rrset(rrset, keys))
319
+ # print "FAILED TO VERIFY RRSET #{rrset.name}, #{rrset.type}\n"
320
+ TheLog.debug("Failed to verify rrset")
321
+ return false
322
+ end
323
+ end
324
+ end
325
+ return true
326
+ end
327
+
328
+ def verify_nsecs(msg) # :nodoc:
329
+ # NSEC(3) handling. Get NSEC(3)s in four cases : (RFC 4035, section 3.1.3)
330
+ # a) No data - <SNAME, SCLASS> matches, but no <SNAME, SCLASS, STYPE) (§3.1.3.1)
331
+ # - will expect NSEC in Authority (and associated RRSIG)
332
+ # - NOERROR returned
333
+ # b) Name error - no RRSets that match <SNAME, SCLASS> either exactly or through wildcard expansion (§3.1.3.2)
334
+ # - NSEC wil prove i) no exact match for <SNAME, SCLASS>, and ii) no RRSets that could match through wildcard expansion
335
+ # - this may be proved in one or more NSECs (and associated RRSIGs)
336
+ # - NXDOMAIN returned - should ensure we verify!
337
+ # c) Wildcard answer - No <SNAME, SCLASS> direct matches, but matches <SNAME, SCLASS, STYPE> through wildcard expansion (§3.1.3.3)
338
+ # - Answer section must include wildcard-expanded answer (and associated RRSIGs)
339
+ # - label count in answer RRSIG indicates wildcard RRSet was expanded (less labels than in owner name)
340
+ # - Authority section must include NSEC (and RRSIGs) proving that zone does not contain a closer match
341
+ # - NOERROR returned
342
+ # d) Wildcard no data - No <SNAME, SCLASS> direct. <SNAME, SCLASS> yes but <SNAME, SCLASS, STYPE> no through wildcard expansion (§3.1.3.4)
343
+ # - Authority section contains NSECs (and RRSIGs) for :
344
+ # i) NSEC proving no RRSets matching STYPE at wildcard owner name that matched <SNAME, SCLASS> via wildcard expansion
345
+ # ii) NSEC proving no RRSets in zone that would have been closer match for <SNAME, SCLASS>
346
+ # - this may be proved by one or more NSECs (and associated RRSIGs)
347
+ # - NOERROR returned
348
+ #
349
+ # Otherwise no NSECs should be returned.
350
+
351
+ # So, check for NSEC records in response, and work out what type of answer we have.
352
+ # Then, if NSECs are present, make sure that we prove what they said they would.
353
+ # What if the message *should* have no NSEC records? That can only be known by the validator.
354
+ # We will assume that the validator has checked the (non)-existence of NSEC records - we should not
355
+ # get upset if there aren't any. However, if there are, then we should verify that they say the right thing
356
+ qtype = msg.question()[0].qtype
357
+ return if (msg.rcode == RCode.NOERROR && ((qtype == Types.ANY) || (qtype == Types.NSEC) || (qtype == Types.NSEC3)))
358
+ if ((msg.rrsets('NSEC').length > 0) || (msg.rrsets('NSEC3').length > 0))
359
+ if (msg.rcode == RCode.NXDOMAIN)
360
+ # print "Checking NSECs for Name Error\n"
361
+ #Name error - NSEC wil prove i) no exact match for <SNAME, SCLASS>, and ii) no RRSets that could match through wildcard expansion
362
+ # - this may be proved in one or more NSECs (and associated RRSIGs)
363
+ check_name_in_nsecs(msg)
364
+ return check_no_wildcard_expansion(msg)
365
+ elsif (msg.rcode == RCode.NOERROR)
366
+ if (msg.answer.length > 0)
367
+ # print "Checking NSECs for wildcard expansion\n"
368
+ # wildcard expansion answer - check NSECs!
369
+ # We want to make sure that the NSEC tells us that there is no closer match for this name
370
+ # @TODO@ We need to make replace the RRSIG name with the wildcard name before we can verify it correctly.
371
+ check_num_rrsig_labels(msg)
372
+ return check_name_in_nsecs(msg, msg.question()[0].qtype, true)
373
+ else
374
+ # Either no data or wildcard no data - check to see which
375
+ # Should be able to tell this by checking the number of labels in the NSEC records.
376
+ # Sort these two last cases out!
377
+ isWildcardNoData = false
378
+ [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets|
379
+ nsec_rrsets.each {|nsec_rrset|
380
+ nsec_rrset.rrs.each {|nsec|
381
+ # print "Checking nsec to see if wildcard : #{nsec}\n"
382
+ if (nsec.name.wild? ||(nsec.name.labels.length < msg.question()[0].qname.labels.length))
383
+ isWildcardNoData = true
384
+ end
385
+ }
386
+ }
387
+ }
388
+
389
+ if (isWildcardNoData)
390
+ # print "Checking NSECs for wildcard no data\n"
391
+ # Check NSECs -
392
+ # i) NSEC proving no RRSets matching STYPE at wildcard owner name that matched <SNAME, SCLASS> via wildcard expansion
393
+ check_name_not_in_wildcard_nsecs(msg)
394
+ # ii) NSEC proving no RRSets in zone that would have been closer match for <SNAME, SCLASS>
395
+ return check_name_in_and_type_not_in_nsecs(msg)
396
+ else # (isNoData)
397
+ # print "Checking NSECs for No data\n"
398
+ # Check NSEC types covered to make sure this type not present.
399
+ return check_name_in_and_type_not_in_nsecs(msg)
400
+ end
401
+ end
402
+ else
403
+ # Anything we should do here?
404
+ end
405
+ end
406
+
407
+ end
408
+
409
+ def check_num_rrsig_labels(msg) # :nodoc:
410
+ # Check that the number of labels in the RRSIG is less than the number
411
+ # of labels in the answer name
412
+ answer_rrset = msg.answer.rrset(msg.question()[0].qname, msg.question()[0].qtype)
413
+ if (answer_rrset.length == 0)
414
+ raise VerifyError.new("Expected wildcard expanded answer for #{msg.question()[0].qname}")
415
+ end
416
+ rrsig = answer_rrset.sigs()[0]
417
+ if (rrsig.labels >= msg.question()[0].qname.labels.length)
418
+ raise VerifyError.new("RRSIG does not prove wildcard expansion for #{msg.question()[0].qname}")
419
+ end
420
+ end
421
+
422
+ def check_no_wildcard_expansion(msg) # :nodoc:
423
+ proven_no_wildcards = false
424
+ name = msg.question()[0].qname
425
+ [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets|
426
+ nsec_rrsets.each {|nsecs|
427
+ nsecs.rrs.each {|nsec|
428
+ # print "Checking NSEC : #{nsec}\n"
429
+ next if (nsec.name.wild?)
430
+ if (check_record_proves_no_wildcard(msg, nsec))
431
+ proven_no_wildcards = true
432
+ end
433
+ }
434
+ }
435
+ }
436
+ if (!proven_no_wildcards)
437
+ # print "No proof that no RRSets could match through wildcard expansion\n"
438
+ raise VerifyError.new("No proof that no RRSets could match through wildcard expansion")
439
+ end
440
+
441
+ end
442
+
443
+ def check_record_proves_no_wildcard(msg, nsec) # :nodoc:
444
+ # Check that the NSEC goes from the SOA to a zone canonically after a wildcard
445
+ # print "Checking wildcard proof for #{nsec.name}\n"
446
+ soa_rrset = msg.authority.rrset(nsec.name, 'SOA')
447
+ if (soa_rrset.length > 0)
448
+ # print "Found SOA for #{nsec.name}\n"
449
+ wildcard_name = Name.create("*." + nsec.name.to_s)
450
+ # print "Checking #{wildcard_name}\n"
451
+ if (wildcard_name.canonically_before(nsec.next_domain))
452
+ return true
453
+ end
454
+ end
455
+ return false
456
+ end
457
+
458
+ def check_name_in_nsecs(msg, qtype=nil, expected_qtype = false) # :nodoc:
459
+ # Check these NSECs to make sure that this name cannot be in the zone
460
+ # and that no RRSets could match through wildcard expansion
461
+ name = msg.question()[0].qname
462
+ proven_name_in_nsecs = false
463
+ type_covered_checked = false
464
+ [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets|
465
+ nsec_rrsets.each {|nsecs|
466
+ nsecs.rrs.each {|nsec|
467
+ # print "Checking NSEC : #{nsec}\n"
468
+ next if (nsec.name.wild?)
469
+ if nsec.check_name_in_range(name)
470
+ proven_name_in_nsecs = true
471
+ qtype_present = false
472
+ if (qtype)
473
+ if (nsec.types.include?qtype)
474
+ qtype_present = true
475
+ end
476
+ if (qtype_present != expected_qtype)
477
+ # print "#{nsec.type} record #{nsec} does #{expected_qtype ? 'not ' : ''} include #{qtype} type\n"
478
+ raise VerifyError.new("#{nsec.type} record #{nsec} does #{expected_qtype ? 'not ' : ''}include #{qtype} type")
479
+ # return false
480
+ end
481
+ type_covered_checked = true
482
+ end
483
+ end
484
+ }
485
+ }
486
+ }
487
+ if (!proven_name_in_nsecs)
488
+ # print "No proof for non-existence for #{name}\n"
489
+ raise VerifyError.new("No proof for non-existence for #{name}")
490
+ end
491
+ if (qtype && !type_covered_checked)
492
+ # print "Tyes covered wrong for #{name}\n"
493
+ raise VerifyError.new("Types covered wrong for #{name}")
494
+ end
495
+ end
496
+
497
+ def check_name_in_and_type_not_in_nsecs(msg) # :nodoc:
498
+ check_name_in_nsecs(msg, msg.question()[0].qtype, false)
499
+ end
500
+
501
+ def check_name_not_in_wildcard_nsecs(msg) # :nodoc:
502
+ name = msg.question()[0].qname
503
+ qtype = msg.question()[0].qtype
504
+ done= false
505
+ [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets|
506
+ nsec_rrsets.each {|nsecs|
507
+ nsecs.rrs.each {|nsec|
508
+ # print "Checking NSEC : #{nsec}\n"
509
+ next if !nsec.name.wild?
510
+ # Check the wildcard expansion
511
+ # We want to see that the name is in the wildcard range, and that the type
512
+ # is not in the types for the NSEC
513
+ if nsec.check_name_in_wildcard_range(name)
514
+ # print "Wildcard expansion in #{nsec} includes #{name}\n"
515
+ raise VerifyError.new("Wildcard expansion in #{nsec} includes #{name}")
516
+ # return false
517
+ end
518
+ if (nsec.types.include?qtype)
519
+ # print "#{qtype} present in wildcard #{nsec}\n"
520
+ raise VerifyError.new("#{qtype} present in wildcard #{nsec}")
521
+ # return false
522
+ end
523
+ done = true
524
+ }
525
+ }
526
+ }
527
+ return if done
528
+ # print("Expected wildcard expansion in #{msg}\n")
529
+ raise VerifyError.new("Expected wildcard expansion in #{msg}")
530
+ # return false
531
+ end
532
+
533
+ def verify_ds_rrset(ds_rrset, keys = nil, msg = nil) # :nodoc:
534
+ # print "verify_ds_rrset #{ds_rrset}\n"
535
+ if (ds_rrset && ds_rrset.num_sigs > 0)
536
+ if (verify_rrset(ds_rrset, keys))
537
+ # Need to handle DS RRSets (with RRSIGs) not just DS records.
538
+ # ds_rrset.rrs.each do |ds|
539
+ # Work out which key this refers to, and add it to the trusted key store
540
+ found = false
541
+ if (msg)
542
+ msg.each_section do |section|
543
+ section.rrsets('DNSKEY').each {|rrset|
544
+ rrset.rrs.each do |rr|
545
+ if (check_ds(rr, ds_rrset))
546
+ found = true
547
+ end
548
+ end
549
+ }
550
+ end
551
+ end
552
+ get_keys_to_check().each {|key|
553
+ if (check_ds(key, ds_rrset))
554
+ found = true
555
+ end
556
+ }
557
+ # If we couldn't find the trusted key, then we should store the
558
+ # key tag and digest in a @@discovered_ds_store.
559
+ # Each time we see a new key (which has been signed) then we should
560
+ # check if it is sitting on the discovered_ds_store.
561
+ # If it is, then we should add it to the trusted_keys and remove the
562
+ # DS from the discovered_ds_store
563
+ if (!found)
564
+ @discovered_ds_store.push(ds_rrset)
565
+ end
566
+ # end
567
+ return true
568
+ else
569
+ return false
570
+ end
571
+ end
572
+ return false # no DS rrset to verify
573
+ end
574
+
575
+ def verify_key_rrset(key_rrset, keys = nil) # :nodoc:
576
+ # print "verify_key_rrset\n"
577
+ verified = false
578
+ if (key_rrset && key_rrset.num_sigs > 0)
579
+ if (verify_rrset(key_rrset, keys))
580
+ # key_rrset.rrs.each do |rr|
581
+ # print "Adding keys : "
582
+ # key_rrset.rrs.each {|rr| print "#{rr.key_tag}, "}
583
+ # print "\n"
584
+ @trusted_keys.add(key_rrset) # rr)
585
+ verified = true
586
+ end
587
+ check_ds_stores(key_rrset)
588
+ end
589
+ return verified
590
+ end
591
+
592
+ def check_ds_stores(key_rrset) # :nodoc:
593
+ # See if the keys match any of the to_be_trusted_keys
594
+ key_rrset.rrs.each do |key|
595
+ @configured_ds_store.each do |ds|
596
+ if (ds.check_key(key))
597
+ @trusted_keys.add_key_with_expiration(key, key_rrset.sigs()[0].expiration)
598
+ end
599
+ end
600
+ @discovered_ds_store.each do |tbtk|
601
+ # Check that the RRSet is still valid!!
602
+ # Should we get it out of the main cache?
603
+ if ((tbtk.sigs()[0].expiration < Time.now.to_i))
604
+ @discovered_ds_store.delete(tbtk)
605
+ else
606
+ tbtk.rrs.each {|ds|
607
+ if (ds.check_key(key))
608
+ @trusted_keys.add_key_with_expiration(key, tbtk.sigs()[0].expiration)
609
+ @discovered_ds_store.delete(tbtk)
610
+ end
611
+ }
612
+ end
613
+ end
614
+ # end
615
+ end
616
+
617
+ end
618
+
619
+ def get_keys_to_check # :nodoc:
620
+ keys_to_check = @trust_anchors.keys + @trusted_keys.keys
621
+ return keys_to_check
622
+ end
623
+
624
+ # Find the first matching DNSKEY and RRSIG record in the two sets.
625
+ def get_matching_key(keys, sigrecs)#:nodoc: all
626
+ # There can be multiple signatures in the RRSet - which one should we choose?
627
+ if ((keys == nil) || (sigrecs == nil))
628
+ return nil, nil
629
+ end
630
+ if (RR::DNSKEY === keys)
631
+ keys = [keys]
632
+ end
633
+ enumerator = keys
634
+ if (enumerator.class == RRSet)
635
+ enumerator = enumerator.rrs
636
+ end
637
+ enumerator.each {|key|
638
+ if ((key.revoked?)) # || (key.bad_flags?))
639
+ next
640
+ end
641
+
642
+ sigrecs.each {|sig|
643
+ if ((key.key_tag == sig.key_tag) && (key.algorithm == sig.algorithm))
644
+ # print "Found key #{key.key_tag}\n"
645
+ return key, sig
646
+ end
647
+ }
648
+ }
649
+ return nil, nil
650
+ end
651
+
652
+ # Verify the signature of an rrset encoded with the specified KeyCache
653
+ # or RRSet. If no signature is included, false is returned.
654
+ #
655
+ # Returns true if the RRSet verified, false otherwise.
656
+ def verify_rrset(rrset, keys = nil)
657
+ # @TODO@ Finer-grained reporting than "false".
658
+ # print "Verify_rrset #{rrset.name}, #{rrset.type}\n"
659
+ sigrecs = rrset.sigs
660
+ # return false if (rrset.num_sigs == 0)
661
+ if (rrset.rrs.length == 0)
662
+ raise VerifyError.new("No RRSet to veryify")
663
+ end
664
+ if (rrset.num_sigs == 0)
665
+ raise VerifyError.new("No signatures in the RRSet : #{rrset.name}, #{rrset.type}")
666
+ end
667
+ sigrecs.each do |sigrec|
668
+ check_rr_data(rrset, sigrec)
669
+ end
670
+
671
+ keyrec = nil
672
+ sigrec = nil
673
+ if (rrset.type == Types.DNSKEY)
674
+ if (keys && ((keys.type == Types.DS) || ((keys.type == Types.DLV) && (@verifier_type == VerifierType::DLV))))
675
+ rrset.rrs.each do |key|
676
+ keys.rrs.each do |ds|
677
+ if (ds.check_key(key))
678
+ @trusted_keys.add_key_with_expiration(key, rrset.sigs()[0].expiration)
679
+ end
680
+ end
681
+ end
682
+ else
683
+ check_ds_stores(rrset)
684
+ end
685
+ end
686
+ if ((keys.nil?) || ((keys.type == Types.DS) || ((keys.type == Types.DLV) && (@verifier_type == VerifierType::DLV))))
687
+ keyrec, sigrec = get_matching_key(get_keys_to_check, sigrecs)
688
+ else
689
+ keyrec, sigrec = get_matching_key(keys, sigrecs)
690
+ end
691
+
692
+ # return false if !keyrec
693
+ if (!keyrec)
694
+ # print "Couldn't find signing key! #{rrset.name}, #{rrset.type},\n "
695
+ raise VerifyError.new("Signing key not found")
696
+ end
697
+
698
+ # RFC 4034
699
+ #3.1.8.1. Signature Calculation
700
+
701
+ if (keyrec.sep_key? && !keyrec.zone_key?)
702
+ Dnsruby.log.error("DNSKEY with SEP flag set and Zone Key flag not set was used to verify RRSIG over RRSET - this is not allowed by RFC4034 section 2.1.1")
703
+ # return false
704
+ raise VerifyError.new("DNSKEY with SEP flag set and Zone Key flag not set")
705
+ end
706
+
707
+ #Any DNS names in the RDATA field of each RR MUST be in
708
+ #canonical form; and
709
+ #The RRset MUST be sorted in canonical order.
710
+ rrset = rrset.sort_canonical
711
+
712
+ sig_data = sigrec.sig_data
713
+
714
+ #RR(i) = owner | type | class | TTL | RDATA length | RDATA
715
+ rrset.each do |rec|
716
+ old_ttl = rec.ttl
717
+ rec.ttl = sigrec.original_ttl
718
+ data = MessageEncoder.new { |msg|
719
+ msg.put_rr(rec, true)
720
+ }.to_s # @TODO@ worry about wildcards here?
721
+ rec.ttl = old_ttl
722
+ if (RUBY_VERSION >= "1.9")
723
+ data.force_encoding("ASCII-8BIT")
724
+ end
725
+ sig_data += data
726
+ end
727
+
728
+ # Now calculate the signature
729
+ verified = false
730
+ if [Algorithms.RSASHA1,
731
+ Algorithms.RSASHA1_NSEC3_SHA1].include?(sigrec.algorithm)
732
+ verified = keyrec.public_key.verify(OpenSSL::Digest::SHA1.new, sigrec.signature, sig_data)
733
+ # elsif (sigrec.algorithm == Algorithms.RSASHA256)
734
+ # verified = keyrec.public_key.verify(Digest::SHA256.new, sigrec.signature, sig_data)
735
+ elsif [Algorithms.DSA,
736
+ Algorithms.DSA_NSEC3_SHA1].include?(sigrec.algorithm)
737
+ # we are ignoring T for now
738
+ # t = sigrec.signature[0]
739
+ # t = t.getbyte(0) if t.class == String
740
+ r = RR::get_num(sigrec.signature[1, 20])
741
+ s = RR::get_num(sigrec.signature[21, 20])
742
+ r_asn1 = OpenSSL::ASN1::Integer.new(r)
743
+ s_asn1 = OpenSSL::ASN1::Integer.new(s)
744
+
745
+ asn1 = OpenSSL::ASN1::Sequence.new([r_asn1, s_asn1]).to_der
746
+ verified = keyrec.public_key.verify(OpenSSL::Digest::DSS1.new, asn1, sig_data)
747
+ else
748
+ raise RuntimeError.new("Algorithm #{sigrec.algorithm.code} unsupported by Dnsruby")
749
+ end
750
+
751
+ if (!verified)
752
+ raise VerifyError.new("Signature failed to cryptographically verify")
753
+ end
754
+ # Sort out the TTLs - set it to the minimum valid ttl
755
+ expiration_diff = (sigrec.expiration.to_i - Time.now.to_i).abs
756
+ rrset.ttl = ([rrset.ttl, sigrec.ttl, sigrec.original_ttl,
757
+ expiration_diff].sort)[0]
758
+ # print "VERIFIED OK\n"
759
+ return true
760
+ end
761
+
762
+ def find_closest_dlv_anchor_for(name) # :nodoc:
763
+ # To find the closest anchor, query DLV.isc.org for [a.b.c.d], then [a.b.c], [a.b], etc.
764
+ # once closest anchor found, simply run follow_chain from that anchor
765
+
766
+ # @TODO@ REALLY NEED AGGRESSIVE NEGATIVE CACHING HERE!!
767
+ # i.e. don't look up zones which we *know* we don't have a DLV anchor for
768
+
769
+ n = Name.create(name)
770
+ root = Name.create(".")
771
+ while (n != root)
772
+ # Try to find name in DLV, and return it if possible
773
+ dlv_rrset = query_dlv_for(n)
774
+ if (dlv_rrset)
775
+ key_rrset = get_zone_key_from_dlv_rrset(dlv_rrset, n)
776
+ return key_rrset
777
+ end
778
+ # strip the name
779
+ n = n.strip_label
780
+ end
781
+ return false
782
+ end
783
+
784
+ def get_zone_key_from_dlv_rrset(dlv_rrset, name) # :nodoc:
785
+ # We want to return the key for the zone i.e. DS/DNSKEY for .se, NOT DLV for se.dlv.isc.org
786
+ # So, we have the DLv record. Now use it to add the zone's DNSKEYs to the trusted key set.
787
+ res = get_nameservers_for(name)
788
+ if (!res)
789
+ if (Dnssec.do_validation_with_recursor?)
790
+ res = Recursor.new
791
+ else
792
+ if(Dnssec.default_resolver)
793
+ res = Dnssec.default_resolver
794
+ else
795
+ res = Resolver.new
796
+ end
797
+ end
798
+ end
799
+ # query = Message.new(name, Types.DNSKEY)
800
+ # query.do_validation = false
801
+ ret = nil
802
+ begin
803
+ # ret = res.send_message(query)
804
+ ret = res.query_no_validation_or_recursion(name, Types.DNSKEY)
805
+ if (!ret)
806
+ raise ResolvError.new("Couldn't get DNSKEY from Recursor")
807
+ end
808
+ rescue ResolvError => e
809
+ # print "Error getting zone key from DLV RR for #{name} : #{e}\n"
810
+ TheLog.error("Error getting zone key from DLV RR for #{name} : #{e}")
811
+ return false
812
+ end
813
+ key_rrset = ret.answer.rrset(name, Types.DNSKEY)
814
+ begin
815
+ verify(key_rrset, dlv_rrset)
816
+ # Cache.add(ret)
817
+ return key_rrset
818
+ rescue VerifyError => e
819
+ # print "Can't move from DLV RR to zone DNSKEY for #{name}, error : #{e}\n"
820
+ TheLog.debug("Can't move from DLV RR to zone DNSKEY for #{name}, error : #{e}")
821
+ end
822
+ return false
823
+ end
824
+
825
+ def query_dlv_for(name) # :nodoc:
826
+ # See if there is a record for name in dlv.isc.org
827
+ if (!@res && (@verifier_type == VerifierType::DLV))
828
+ @res = get_dlv_resolver
829
+ end
830
+ begin
831
+ name_to_query = name.to_s+".dlv.isc.org"
832
+ # query = Message.new(name_to_query, Types.DLV)
833
+ # @res.single_resolvers()[0].prepare_for_dnssec(query)
834
+ # query.do_validation = false
835
+ ret = nil
836
+ begin
837
+ # ret = @res.send_message(query)
838
+ ret = @res.query_no_validation_or_recursion(name_to_query, Types.DLV)
839
+ if (!ret)
840
+ raise ResolvError.new("Couldn't get DLV record from Recursor")
841
+ end
842
+ rescue ResolvError => e
843
+ # print "Error getting DLV record for #{name} : #{e}\n"
844
+ TheLog.info("Error getting DLV record for #{name} : #{e}")
845
+ return nil
846
+ end
847
+ dlv_rrset = ret.answer.rrset(name_to_query,Types.DLV)
848
+ if (dlv_rrset.rrs.length > 0)
849
+ begin
850
+ verify(dlv_rrset)
851
+ # Cache.add(ret)
852
+ return dlv_rrset
853
+ rescue VerifyError => e
854
+ # print "Error verifying DLV records for #{name}, #{e}\n"
855
+ TheLog.info("Error verifying DLV records for #{name}, #{e}")
856
+ end
857
+ end
858
+ rescue NXDomain
859
+ # print "NXDomain for DLV lookup for #{name}\n"
860
+ return nil
861
+ end
862
+ return nil
863
+ end
864
+
865
+ def find_closest_anchor_for(name) # :nodoc:
866
+ # Check if we have an anchor for name.
867
+ # If not, strip off first label and try again
868
+ # If we get to root, then return false
869
+ n = Name.create(name)
870
+ root = Name.create(".")
871
+ while (n != root)
872
+ # Try the trusted keys first, then the DS set
873
+ (@trust_anchors.keys + @trusted_keys.keys + @configured_ds_store + @discovered_ds_store).each {|key|
874
+ return key if key.name.to_s.downcase == n.to_s.downcase
875
+ }
876
+ # strip the name
877
+ n = n.strip_label
878
+ end
879
+ return false
880
+ end
881
+
882
+ # @TODO@ Handle REVOKED keys! (RFC 5011)
883
+
884
+ def follow_chain(anchor, name) # :nodoc:
885
+ # Follow the chain from the anchor to name, returning the appropriate
886
+ # key at the end, or false.
887
+ #
888
+ # i.e. anchor = se, name = foo.example.se
889
+ # get anchor for example.se with se anchor
890
+ # get anchor for foo.example.se with example.se anchor
891
+ next_key = anchor
892
+ next_step = anchor.name
893
+ parent = next_step
894
+ # print "Follow chain from #{anchor.name} to #{name}\n"
895
+ TheLog.debug("Follow chain from #{anchor.name} to #{name}")
896
+
897
+ res = nil
898
+ # while ((next_step != name) || (next_key.type != Types.DNSKEY))
899
+ while (true)
900
+ # print "In loop for parent=#{parent}, next step = #{next_step}\n"
901
+ dont_move_on = false
902
+ if (next_key.type != Types.DNSKEY)
903
+ dont_move_on = true
904
+ end
905
+ next_key, res = get_anchor_for(next_step, parent, next_key, res)
906
+ if (next_step == name)
907
+ # print "Returning #{next_key.type} for #{next_step}, #{(next_key.type != Types.DNSKEY)}\n"
908
+ return next_key
909
+ end
910
+ return false if (!next_key)
911
+ # Add the next label on
912
+ if (!dont_move_on)
913
+ parent = next_step
914
+ next_step = Name.new(name.labels[name.labels.length-1-next_step.labels.length,1] +
915
+ next_step.labels , name.absolute?)
916
+ # print "Next parent = #{parent}, next_step = #{next_step}, next_key.type = #{next_key.type.string}\n"
917
+ end
918
+ end
919
+
920
+ # print "Returning #{next_key.type} for #{next_step}, #{(next_key.type != Types.DNSKEY)}\n"
921
+
922
+ return next_key
923
+ end
924
+
925
+ def get_anchor_for(child, parent, current_anchor, parent_res = nil) # :nodoc:
926
+ # print "Trying to discover anchor for #{child} from #{parent}\n"
927
+ TheLog.debug("Trying to discover anchor for #{child} from #{parent}")
928
+ # We wish to return a DNSKEY which the caller can use to verify name
929
+ # We are either given a key or a ds record from the parent zone
930
+ # If given a DNSKEY, then find a DS record signed by that key for the child zone
931
+ # Use the DS record to find a valid key in the child zone
932
+ # Return it
933
+
934
+ # Find NS RRSet for parent
935
+ child_res = nil
936
+ begin
937
+ if (child!=parent)
938
+ if (!parent_res)
939
+ # print "No res passed - try to get nameservers for #{parent}\n"
940
+ parent_res = get_nameservers_for(parent)
941
+ if (!parent_res)
942
+ if (Dnssec.do_validation_with_recursor?)
943
+ parent_res = Recursor.new
944
+ else
945
+ if (Dnssec.default_resolver)
946
+ parent_res = Dnssec.default_resolver
947
+ else
948
+ parent_res = Resolver.new
949
+ end
950
+ end
951
+ end
952
+ end
953
+ # Use that Resolver to query for DS record and NS for children
954
+ ds_rrset = current_anchor
955
+ if (current_anchor.type == Types.DNSKEY)
956
+ # print "Trying to find DS records for #{child} from servers for #{parent}\n"
957
+ TheLog.debug("Trying to find DS records for #{child} from servers for #{parent}")
958
+ ds_ret = nil
959
+ begin
960
+ ds_ret = parent_res.query_no_validation_or_recursion(child, Types.DS)
961
+ if (!ds_ret)
962
+ raise ResolvError.new("Couldn't get DS records from Recursor")
963
+ end
964
+ rescue ResolvError => e
965
+ # print "Error getting DS record for #{child} : #{e}\n"
966
+ TheLog.error("Error getting DS record for #{child} : #{e}")
967
+ return false, nil
968
+ end
969
+ ds_rrset = ds_ret.answer.rrset(child, Types.DS)
970
+ if (ds_rrset.rrs.length == 0)
971
+ # @TODO@ Check NSEC(3) records - still need to verify there are REALLY no ds records!
972
+ # print "NO DS RECORDS RETURNED FOR #{parent}\n"
973
+ child_res = parent_res
974
+ else
975
+ begin
976
+ if (verify(ds_rrset, current_anchor))
977
+ # Try to make the resolver from the authority/additional NS RRSets in DS response
978
+ child_res = get_nameservers_from_message(child, ds_ret)
979
+ end
980
+ rescue VerifyError => e
981
+ # print "FAILED TO VERIFY DS RRSET FOR #{child}\n"
982
+ TheLog.info("FAILED TO VERIFY DS RRSET FOR #{child}")
983
+ return false, nil
984
+ end
985
+ end
986
+ end
987
+ end
988
+ # Make Resolver using all child NSs
989
+ if (!child_res)
990
+ child_res = get_nameservers_for(child, parent_res)
991
+ end
992
+ if (!child_res)
993
+ if (Dnssec.do_validation_with_recursor?)
994
+ child_res = Recursor.new
995
+ else
996
+ if (Dnssec.default_resolver)
997
+ child_res = Dnssec.default_resolver
998
+ else
999
+ if (Dnssec.default_resolver)
1000
+ child_res = Dnssec.default_resolver
1001
+ else
1002
+ child_res = Resolver.new
1003
+ end
1004
+ end
1005
+ end
1006
+ end
1007
+ # Query for DNSKEY record, and verify against DS in parent.
1008
+ # Need to get resolver NOT to verify this message - we verify it afterwards
1009
+ # print "Trying to find DNSKEY records for #{child} from servers for #{child}\n"
1010
+ TheLog.info("Trying to find DNSKEY records for #{child} from servers for #{child}")
1011
+ # query = Message.new(child, Types.DNSKEY)
1012
+ # query.do_validation = false
1013
+ key_ret = nil
1014
+ begin
1015
+ # key_ret = child_res.send_message(query)
1016
+ key_ret = child_res.query_no_validation_or_recursion(child, Types.DNSKEY)
1017
+ if (!key_ret)
1018
+ raise ResolvError.new("Couldn't get info from Recursor")
1019
+ end
1020
+ rescue ResolvError => e
1021
+ # print "Error getting DNSKEY for #{child} : #{e}\n"
1022
+ TheLog.error("Error getting DNSKEY for #{child} : #{e}")
1023
+ return false, nil
1024
+ end
1025
+ verified = true
1026
+ key_rrset = key_ret.answer.rrset(child, Types.DNSKEY)
1027
+ if (key_rrset.rrs.length == 0)
1028
+ # @TODO@ Still need to check NSEC records to make *sure* no key rrs returned!
1029
+ # print "NO DNSKEY RECORDS RETURNED FOR #{child}\n"
1030
+ TheLog.debug("NO DNSKEY RECORDS RETURNED FOR #{child}")
1031
+ # end
1032
+ verified = false
1033
+ else
1034
+ # Should check that the matching key's zone flag is set (RFC 4035 section 5.2)
1035
+ key_rrset.rrs.each {|k|
1036
+ if (!k.zone_key?)
1037
+ # print "Discovered DNSKEY is not a zone key - ignoring\n"
1038
+ TheLog.debug("Discovered DNSKEY is not a zone key - ignoring")
1039
+ return false, new_res
1040
+ end
1041
+ }
1042
+ begin
1043
+ verify(key_rrset, ds_rrset)
1044
+ rescue VerifyError => e
1045
+ begin
1046
+ verify(key_rrset)
1047
+ rescue VerifyError =>e
1048
+ verified = false
1049
+ end
1050
+ end
1051
+ # if (!verify(key_rrset, ds_rrset))
1052
+ # if (!verify(key_rrset))
1053
+ # # if (!verify(key_ret))
1054
+ # verified = false
1055
+ # end
1056
+ # end
1057
+
1058
+ end
1059
+
1060
+ # Try to make the resolver from the authority/additional NS RRSets in DNSKEY response
1061
+ new_res = get_nameservers_from_message(child, key_ret) # @TODO@ ?
1062
+ if (!new_res)
1063
+ new_res = child_res
1064
+ end
1065
+ if (!verified)
1066
+ TheLog.info("Failed to verify DNSKEY for #{child}")
1067
+ return false, new_res
1068
+ end
1069
+ # Cache.add(key_ret)
1070
+ return key_rrset, new_res
1071
+ rescue VerifyError => e
1072
+ # print "Verification error : #{e}\n"
1073
+ TheLog.info("Verification error : #{e}\n")
1074
+ return false, new_res
1075
+ end
1076
+ end
1077
+
1078
+ def get_nameservers_for(name, res = nil) # :nodoc:
1079
+ # @TODO@ !!!
1080
+ if (Dnssec.do_validation_with_recursor?)
1081
+ return Recursor.new
1082
+ else
1083
+ if (Dnssec.default_resolver)
1084
+ return Dnssec.default_resolver
1085
+ else
1086
+ return Resolver.new
1087
+ end
1088
+ end
1089
+ end
1090
+
1091
+ def get_nameservers_from_message(name, ns_ret) # :nodoc:
1092
+ if (Dnssec.default_resolver)
1093
+ return Dnssec.default_resolver
1094
+ end
1095
+
1096
+ ns_rrset = ns_ret.answer.rrset(name, Types.NS)
1097
+ if (!ns_rrset || ns_rrset.length == 0)
1098
+ ns_rrset = ns_ret.authority.rrset(name, Types.NS) # @TOO@ Is ths OK?
1099
+ end
1100
+ if (!ns_rrset || ns_rrset.length == 0 || ns_rrset.name.to_s != name.to_s)
1101
+ return nil
1102
+ end
1103
+ if (ns_rrset.sigs.length > 0)
1104
+ # verify_rrset(ns_rrset) # @TODO@ ??
1105
+ end
1106
+ # Cache.add(ns_ret)
1107
+ ns_additional = []
1108
+ ns_ret.additional.each {|rr| ns_additional.push(rr) if (rr.type == Types.A) }
1109
+ nameservers = []
1110
+ add_nameservers(ns_rrset, ns_additional, nameservers) # if (ns_additional.length > 0)
1111
+ ns_additional = []
1112
+ ns_ret.additional.each {|rr| ns_additional.push(rr) if (rr.type == Types.AAAA) }
1113
+ add_nameservers(ns_rrset, ns_additional, nameservers) if (ns_additional.length > 0)
1114
+ # Make Resolver using all NSs
1115
+ if (nameservers.length == 0)
1116
+ # print "Can't find nameservers for #{ns_ret.question()[0].qname} from #{ns_rrset.rrs}\n"
1117
+ TheLog.info("Can't find nameservers for #{ns_ret.question()[0].qname} from #{ns_rrset.rrs}")
1118
+ return nil # @TODO@ Could return a recursor here?
1119
+ #return Recursor.new
1120
+ end
1121
+ res = Resolver.new()
1122
+ res.nameserver=(nameservers)
1123
+ # Set the retry_delay to be (at least) the number of nameservers
1124
+ # Otherwise, the queries will be sent at a rate of more than one a second!
1125
+ res.retry_delay = nameservers.length * 2
1126
+ res.dnssec = true
1127
+ return res
1128
+ end
1129
+
1130
+ def add_nameservers(ns_rrset, ns_additional, nameservers) # :nodoc:
1131
+ # Want to go through all of the ns_rrset NS records,
1132
+ # print "Checking #{ns_rrset.rrs.length} NS records against #{ns_additional.length} address records\n"
1133
+ ns_rrset.rrs.sort_by {rand}.each {|ns_rr|
1134
+ # and see if we can find any of the names in the A/AAAA records in ns_additional
1135
+ found_addr = false
1136
+ ns_additional.each {|addr_rr|
1137
+ if (ns_rr.nsdname.to_s == addr_rr.name.to_s)
1138
+ # print "Found address #{addr_rr.address} for #{ns_rr.nsdname}\n"
1139
+ nameservers.push(addr_rr.address.to_s)
1140
+ found_addr = true
1141
+ break
1142
+ # If we can, then we add the server A/AAAA address to nameservers
1143
+ end
1144
+ # If we can't, then we add the server NS name to nameservers
1145
+
1146
+ }
1147
+ if (!found_addr)
1148
+ # print "Couldn't find address - adding #{ns_rr.nsdname}\n"
1149
+ nameservers.push(ns_rr.nsdname)
1150
+ end
1151
+
1152
+ }
1153
+ end
1154
+
1155
+ def validate_no_rrsigs(msg) # :nodoc:
1156
+ # print "Validating unsigned response\n"
1157
+ # WHAT IF THERE ARE NO RRSIGS IN MSG?
1158
+ # Then we need to check that we do not expect any RRSIGs
1159
+ if (!msg.question()[0] && msg.answer.length == 0)
1160
+ # print "Returning Message insecure OK\n"
1161
+ msg.security_level = Message::SecurityLevel.INSECURE
1162
+ return true
1163
+ end
1164
+ qname = msg.question()[0].qname
1165
+ closest_anchor = find_closest_anchor_for(qname)
1166
+ # print "Found closest anchor :#{closest_anchor}\n"
1167
+ if (closest_anchor)
1168
+ actual_anchor = follow_chain(closest_anchor, qname)
1169
+ # print "Actual anchor : #{actual_anchor}\n"
1170
+ if (actual_anchor)
1171
+ # print("Anchor exists for #{qname}, but no signatures in #{msg}\n")
1172
+ TheLog.error("Anchor exists for #{qname}, but no signatures in #{msg}")
1173
+ msg.security_level = Message::SecurityLevel.BOGUS
1174
+ return false
1175
+ end
1176
+ end
1177
+ if ((@verifier_type == VerifierType::DLV) &&
1178
+ @added_dlv_key)
1179
+ # Remember to check DLV registry as well (if appropriate!)
1180
+ # print "Checking DLV for closest anchor\n"
1181
+ dlv_anchor = find_closest_dlv_anchor_for(qname)
1182
+ # print "Found DLV closest anchor :#{dlv_anchor}\n"
1183
+ if (dlv_anchor)
1184
+ actual_anchor = follow_chain(dlv_anchor, qname)
1185
+ # print "Actual anchor : #{actual_anchor}\n"
1186
+ if (actual_anchor)
1187
+ # print("DLV Anchor exists for #{qname}, but no signatures in #{msg}\n")
1188
+ TheLog.error("DLV Anchor exists for #{qname}, but no signatures in #{msg}")
1189
+ msg.security_level = Message::SecurityLevel.BOGUS
1190
+ return false
1191
+ end
1192
+
1193
+ end
1194
+ end
1195
+ # print "Returning Message insecure OK\n"
1196
+ msg.security_level = Message::SecurityLevel.INSECURE
1197
+ return true
1198
+ end
1199
+
1200
+ def validate(msg, query)
1201
+ if (msg.rrsets('RRSIG').length == 0)
1202
+ return validate_no_rrsigs(msg)
1203
+ end
1204
+
1205
+ # See if it is a child of any of our trust anchors.
1206
+ # If it is, then see if we have a trusted key for it
1207
+ # If we don't, then see if we can get to it from the closest
1208
+ # trust anchor
1209
+ # Otherwise, try DLV (if configured)
1210
+ #
1211
+ #
1212
+ # So - find closest existing trust anchor
1213
+ error = nil
1214
+ msg.security_level = Message::SecurityLevel.INDETERMINATE
1215
+ qname = msg.question()[0].qname
1216
+ closest_anchor = find_closest_anchor_for(qname)
1217
+ error = try_to_follow_from_anchor(closest_anchor, msg, qname)
1218
+
1219
+ if ((msg.security_level.code < Message::SecurityLevel::SECURE) &&
1220
+ (@verifier_type == VerifierType::DLV) &&
1221
+ @added_dlv_key)
1222
+ # If we can't find anything, and we're set to check DLV, then
1223
+ # check the DLV registry and work down from there.
1224
+ dlv_anchor = find_closest_dlv_anchor_for(qname)
1225
+ if (dlv_anchor)
1226
+ # print "Trying to follow DLV anchor from #{dlv_anchor.name} to #{qname}\n"
1227
+ TheLog.debug("Trying to follow DLV anchor from #{dlv_anchor.name} to #{qname}")
1228
+ error = try_to_follow_from_anchor(dlv_anchor, msg, qname)
1229
+ else
1230
+ # print "Couldn't find DLV anchor for #{qname}\n"
1231
+ TheLog.debug("Couldn't find DLV anchor for #{qname}")
1232
+ end
1233
+ end
1234
+ if (msg.security_level.code != Message::SecurityLevel::SECURE)
1235
+ begin
1236
+ # print "Trying to verify one last time\n"
1237
+
1238
+ if verify(msg) # Just make sure we haven't picked the keys up anywhere
1239
+ msg.security_level = Message::SecurityLevel.SECURE
1240
+ return true
1241
+ end
1242
+ rescue VerifyError => e
1243
+ # print "Verify failed : #{e}\n"
1244
+ end
1245
+ end
1246
+ if (error)
1247
+ raise error
1248
+ end
1249
+ if (msg.security_level.code > Message::SecurityLevel::UNCHECKED)
1250
+ return true
1251
+ else
1252
+ return false
1253
+ end
1254
+ end
1255
+
1256
+ def try_to_follow_from_anchor(closest_anchor, msg, qname) # :nodoc:
1257
+ error = nil
1258
+ if (closest_anchor)
1259
+ # Then try to descend to the level we're interested in
1260
+ actual_anchor = follow_chain(closest_anchor, qname)
1261
+ if (!actual_anchor)
1262
+ TheLog.debug("Unable to follow chain from anchor : #{closest_anchor.name}")
1263
+ msg.security_level = Message::SecurityLevel.INSECURE
1264
+ else
1265
+ actual_anchor_keys = ""
1266
+ actual_anchor.rrs.each {|rr| actual_anchor_keys += ", #{rr.key_tag}"}
1267
+ TheLog.debug("Found anchor #{actual_anchor.name}, #{actual_anchor.type} for #{qname} : #{actual_anchor_keys}")
1268
+ # print "Found anchor #{actual_anchor.name}, #{actual_anchor.type} for #{qname} : #{actual_anchor_keys}\n"
1269
+ begin
1270
+ if (verify(msg, actual_anchor))
1271
+ TheLog.debug("Validated #{qname}")
1272
+ msg.security_level = Message::SecurityLevel.SECURE
1273
+ end
1274
+ rescue VerifyError => e
1275
+ TheLog.info("BOGUS #{qname}! Error : #{e}")
1276
+ # print "BOGUS #{qname}! Error : #{e}\n"
1277
+ msg.security_level = Message::SecurityLevel.BOGUS
1278
+ error = e
1279
+ end
1280
+ end
1281
+ else
1282
+ # print "Unable to find an anchor for #{qname}\n"
1283
+ msg.security_level = Message::SecurityLevel.INSECURE
1284
+ end
1285
+ return error
1286
+ end
1287
+
1288
+ end
1289
+ end