dns.c 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2025 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #define _GNU_SOURCE
  19. #include "dns.h"
  20. #include "stringutil.h"
  21. #include "tlog.h"
  22. #include <arpa/inet.h>
  23. #include <fcntl.h>
  24. #include <stdint.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <sys/stat.h>
  28. #include <sys/types.h>
  29. #include <unistd.h>
  30. #define QR_MASK 0x8000
  31. #define OPCODE_MASK 0x7800
  32. #define AA_MASK 0x0400
  33. #define TC_MASK 0x0200
  34. #define RD_MASK 0x0100
  35. #define RA_MASK 0x0080
  36. #define Z_MASK 0x0040
  37. #define AD_MASK 0x0020
  38. #define CD_MASK 0x0010
  39. #define RCODE_MASK 0x000F
  40. #define DNS_RR_END (0XFFFF)
  41. #define UNUSED(expr) \
  42. do { \
  43. (void)(expr); \
  44. } while (0)
  45. #define member_size(type, member) sizeof(((type *)0)->member)
  46. static int is_aligned(void *ptr, int aligment)
  47. {
  48. return ((uintptr_t)(ptr)) % aligment == 0;
  49. }
  50. /* read short and move pointer */
  51. static unsigned short _dns_read_short(unsigned char **buffer)
  52. {
  53. unsigned short value = 0;
  54. if (is_aligned(*buffer, 2)) {
  55. value = *((unsigned short *)(*buffer));
  56. } else {
  57. memcpy(&value, *buffer, 2);
  58. }
  59. *buffer += 2;
  60. return ntohs(value);
  61. }
  62. /* write char and move pointer */
  63. static __attribute__((unused)) void _dns_write_char(unsigned char **buffer, unsigned char value)
  64. {
  65. **buffer = value;
  66. *buffer += 1;
  67. }
  68. /* read char and move pointer */
  69. static unsigned char _dns_read_char(unsigned char **buffer)
  70. {
  71. unsigned char value = **buffer;
  72. *buffer += 1;
  73. return value;
  74. }
  75. /* write short and move pointer */
  76. static void _dns_write_short(unsigned char **buffer, unsigned short value)
  77. {
  78. value = htons(value);
  79. if (is_aligned(*buffer, 2)) {
  80. *((unsigned short *)(*buffer)) = value;
  81. } else {
  82. memcpy(*buffer, &value, 2);
  83. }
  84. *buffer += 2;
  85. }
  86. /* write short and move pointer */
  87. static void _dns_write_shortptr(unsigned char **buffer, void *ptrvalue)
  88. {
  89. unsigned short value;
  90. if ((uintptr_t)ptrvalue % 2 == 0) {
  91. value = *(unsigned short *)ptrvalue;
  92. } else {
  93. memcpy(&value, ptrvalue, 2);
  94. }
  95. value = htons(value);
  96. if (is_aligned(*buffer, 2)) {
  97. *((unsigned short *)(*buffer)) = value;
  98. } else {
  99. memcpy(*buffer, &value, 2);
  100. }
  101. *buffer += 2;
  102. }
  103. /* write int and move pointer */
  104. static void _dns_write_int(unsigned char **buffer, unsigned int value)
  105. {
  106. value = htonl(value);
  107. if (is_aligned(*buffer, 4)) {
  108. *((unsigned int *)(*buffer)) = value;
  109. } else {
  110. memcpy(*buffer, &value, 4);
  111. }
  112. *buffer += 4;
  113. }
  114. /* write int and move pointer */
  115. static void _dns_write_intptr(unsigned char **buffer, void *ptrvalue)
  116. {
  117. unsigned int value;
  118. if ((uintptr_t)ptrvalue % 4 == 0) {
  119. value = *(unsigned int *)ptrvalue;
  120. } else {
  121. memcpy(&value, ptrvalue, 4);
  122. }
  123. value = htonl(value);
  124. if (is_aligned(*buffer, 4)) {
  125. *((unsigned int *)(*buffer)) = value;
  126. } else {
  127. memcpy(*buffer, &value, 4);
  128. }
  129. *buffer += 4;
  130. }
  131. /* read int and move pointer */
  132. static unsigned int _dns_read_int(unsigned char **buffer)
  133. {
  134. unsigned int value = 0;
  135. if (is_aligned(*buffer, 4)) {
  136. value = *((unsigned int *)(*buffer));
  137. } else {
  138. memcpy(&value, *buffer, 4);
  139. }
  140. *buffer += 4;
  141. return ntohl(value);
  142. }
  143. static inline int _dns_left_len(struct dns_context *context)
  144. {
  145. return context->maxsize - (context->ptr - context->data);
  146. }
  147. static int _dns_get_domain_from_packet(unsigned char *packet, int packet_size, unsigned char **domain_ptr, char *output,
  148. int size)
  149. {
  150. int output_len = 0;
  151. int copy_len = 0;
  152. int len = 0;
  153. unsigned char *ptr = *domain_ptr;
  154. int is_compressed = 0;
  155. int ptr_jump = 0;
  156. /*[len]string[len]string...[0]0 */
  157. while (1) {
  158. if (ptr >= packet + packet_size || ptr < packet || output_len >= size - 1 || ptr_jump > 32) {
  159. return -1;
  160. }
  161. len = *ptr;
  162. if (len == 0) {
  163. *output = 0;
  164. ptr++;
  165. break;
  166. }
  167. /* compressed domain */
  168. if (len >= 0xC0) {
  169. if ((ptr + 2) > (packet + packet_size)) {
  170. return -1;
  171. }
  172. /*
  173. 0 1 2 3 4 5 6 7 8 9 A B C D E F
  174. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  175. | 1 1| OFFSET |
  176. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  177. */
  178. /* read offset */
  179. len = _dns_read_short(&ptr) & 0x3FFF;
  180. if (is_compressed == 0) {
  181. *domain_ptr = ptr;
  182. }
  183. ptr = packet + len;
  184. if (ptr > packet + packet_size) {
  185. tlog(TLOG_DEBUG, "length is not enough %u:%ld, %p, %p", packet_size, (long)(ptr - packet), *domain_ptr,
  186. packet);
  187. return -1;
  188. }
  189. is_compressed = 1;
  190. ptr_jump++;
  191. continue;
  192. }
  193. ptr_jump = 0;
  194. /* change [len] to '.' */
  195. if (output_len > 0) {
  196. *output = '.';
  197. output++;
  198. output_len += 1;
  199. }
  200. if (ptr > packet + packet_size) {
  201. tlog(TLOG_DEBUG, "length is not enough %u:%ld, %p, %p", packet_size, (long)(ptr - packet), *domain_ptr,
  202. packet);
  203. return -1;
  204. }
  205. ptr++;
  206. if (output_len < size - 1) {
  207. /* copy sub string */
  208. copy_len = (len < size - output_len) ? len : size - 1 - output_len;
  209. if ((ptr + copy_len) > (packet + packet_size)) {
  210. tlog(TLOG_DEBUG, "length is not enough %u:%ld, %p, %p", packet_size, (long)(ptr - packet), *domain_ptr,
  211. packet);
  212. return -1;
  213. }
  214. memcpy(output, ptr, copy_len);
  215. }
  216. ptr += len;
  217. output += len;
  218. output_len += len;
  219. }
  220. if (is_compressed == 0) {
  221. *domain_ptr = ptr;
  222. }
  223. return 0;
  224. }
  225. static int _dns_decode_domain(struct dns_context *context, char *output, int size)
  226. {
  227. return _dns_get_domain_from_packet(context->data, context->maxsize, &(context->ptr), output, size);
  228. }
  229. static unsigned int dict_hash(const char *s)
  230. {
  231. unsigned int hashval = 0;
  232. for (hashval = 0; *s != '\0'; s++) {
  233. hashval = *s + 31 * hashval;
  234. }
  235. return hashval;
  236. }
  237. static int _dns_add_domain_dict(struct dns_context *context, unsigned int hash, int pos)
  238. {
  239. struct dns_packet_dict *dict = context->namedict;
  240. if (dict->dict_count >= DNS_PACKET_DICT_SIZE) {
  241. return -1;
  242. }
  243. if (hash == 0) {
  244. return -1;
  245. }
  246. if (pos >= context->maxsize) {
  247. return -1;
  248. }
  249. int index = dict->dict_count;
  250. dict->names[index].hash = hash;
  251. dict->names[index].pos = pos;
  252. dict->dict_count++;
  253. return 0;
  254. }
  255. static int _dns_get_domain_offset(struct dns_context *context, const char *domain)
  256. {
  257. int i = 0;
  258. char domain_check[DNS_MAX_CNAME_LEN];
  259. struct dns_packet_dict *dict = context->namedict;
  260. if (*domain == '\0') {
  261. return -1;
  262. }
  263. unsigned int hash = dict_hash(domain);
  264. for (i = 0; i < dict->dict_count; i++) {
  265. if (dict->names[i].hash != hash) {
  266. continue;
  267. }
  268. unsigned char *domain_check_ptr = dict->names[i].pos + context->data;
  269. if (_dns_get_domain_from_packet(context->data, context->maxsize, &domain_check_ptr, domain_check,
  270. DNS_MAX_CNAME_LEN) != 0) {
  271. return -1;
  272. }
  273. return dict->names[i].pos;
  274. }
  275. _dns_add_domain_dict(context, hash, context->ptr - 1 - context->data);
  276. return -1;
  277. }
  278. static int _dns_encode_domain(struct dns_context *context, const char *domain)
  279. {
  280. int num = 0;
  281. int total_len = 0;
  282. unsigned char *ptr_num = context->ptr++;
  283. int dict_offset = 0;
  284. dict_offset = _dns_get_domain_offset(context, domain);
  285. total_len++;
  286. /*[len]string[len]string...[0]0 */
  287. while (_dns_left_len(context) > 1 && *domain != 0) {
  288. total_len++;
  289. if (dict_offset >= 0) {
  290. int offset = 0xc000 | dict_offset;
  291. if (_dns_left_len(context) < 2) {
  292. return -1;
  293. }
  294. _dns_write_short(&ptr_num, offset);
  295. context->ptr++;
  296. ptr_num = NULL;
  297. return total_len;
  298. }
  299. if (*domain == '.') {
  300. *ptr_num = num;
  301. num = 0;
  302. ptr_num = context->ptr;
  303. domain++;
  304. context->ptr++;
  305. dict_offset = _dns_get_domain_offset(context, domain);
  306. continue;
  307. }
  308. *context->ptr = *domain;
  309. num++;
  310. context->ptr++;
  311. domain++;
  312. }
  313. if (_dns_left_len(context) < 1) {
  314. return -1;
  315. }
  316. *ptr_num = num;
  317. if (total_len > 1) {
  318. /* if domain is '\0', [domain] is '\0' */
  319. *(context->ptr) = 0;
  320. total_len++;
  321. context->ptr++;
  322. }
  323. if (_dns_left_len(context) <= 0) {
  324. return -1;
  325. }
  326. return total_len;
  327. }
  328. /* iterator get rrs begin */
  329. struct dns_rrs *dns_get_rrs_start(struct dns_packet *packet, dns_rr_type type, int *count)
  330. {
  331. unsigned short start = 0;
  332. struct dns_head *head = &packet->head;
  333. /* get rrs count by rrs type */
  334. switch (type) {
  335. case DNS_RRS_QD:
  336. *count = head->qdcount;
  337. start = packet->questions;
  338. break;
  339. case DNS_RRS_AN:
  340. *count = head->ancount;
  341. start = packet->answers;
  342. break;
  343. case DNS_RRS_NS:
  344. *count = head->nscount;
  345. start = packet->nameservers;
  346. break;
  347. case DNS_RRS_NR:
  348. *count = head->nrcount;
  349. start = packet->additional;
  350. break;
  351. case DNS_RRS_OPT:
  352. *count = packet->optcount;
  353. start = packet->optional;
  354. break;
  355. default:
  356. return NULL;
  357. break;
  358. }
  359. /* if not resource record, return null */
  360. if (start == DNS_RR_END) {
  361. return NULL;
  362. }
  363. /* return rrs data start address */
  364. return (struct dns_rrs *)(packet->data + start);
  365. }
  366. /* iterator next rrs */
  367. struct dns_rrs *dns_get_rrs_next(struct dns_packet *packet, struct dns_rrs *rrs)
  368. {
  369. if (rrs->next == DNS_RR_END) {
  370. return NULL;
  371. }
  372. return (struct dns_rrs *)(packet->data + rrs->next);
  373. }
  374. static void _dns_init_context_by_rrs(struct dns_rrs *rrs, struct dns_context *context)
  375. {
  376. context->packet = rrs->packet;
  377. context->data = rrs->packet->data;
  378. context->ptr = rrs->data;
  379. context->namedict = &rrs->packet->namedict;
  380. context->maxsize = rrs->data - rrs->packet->data + rrs->len;
  381. }
  382. /* iterator add rrs begin */
  383. static int _dns_add_rrs_start(struct dns_packet *packet, struct dns_context *context)
  384. {
  385. struct dns_rrs *rrs = NULL;
  386. unsigned char *end = packet->data + packet->len;
  387. if ((packet->len + (int)sizeof(*rrs)) >= packet->size) {
  388. return -1;
  389. }
  390. rrs = (struct dns_rrs *)end;
  391. context->ptr = rrs->data;
  392. context->packet = packet;
  393. context->maxsize = packet->size - sizeof(*packet);
  394. context->data = packet->data;
  395. context->namedict = &packet->namedict;
  396. return 0;
  397. }
  398. /* iterator add rrs end */
  399. static int _dns_rr_add_end(struct dns_packet *packet, int type, dns_type_t rtype, int len)
  400. {
  401. struct dns_rrs *rrs = NULL;
  402. struct dns_rrs *rrs_next = NULL;
  403. struct dns_head *head = &packet->head;
  404. unsigned char *end = packet->data + packet->len;
  405. unsigned short *count = NULL;
  406. unsigned short *start = NULL;
  407. rrs = (struct dns_rrs *)end;
  408. if (packet->len + len > packet->size - (int)sizeof(*packet) - (int)sizeof(*rrs)) {
  409. return -1;
  410. }
  411. switch (type) {
  412. case DNS_RRS_QD:
  413. count = &head->qdcount;
  414. start = &packet->questions;
  415. break;
  416. case DNS_RRS_AN:
  417. count = &head->ancount;
  418. start = &packet->answers;
  419. break;
  420. case DNS_RRS_NS:
  421. count = &head->nscount;
  422. start = &packet->nameservers;
  423. break;
  424. case DNS_RRS_NR:
  425. count = &head->nrcount;
  426. start = &packet->additional;
  427. break;
  428. case DNS_RRS_OPT:
  429. count = &packet->optcount;
  430. start = &packet->optional;
  431. break;
  432. default:
  433. return -1;
  434. break;
  435. }
  436. /* add data to end of dns_packet, and set previous rrs point to this rrs */
  437. if (*start != DNS_RR_END) {
  438. rrs_next = (struct dns_rrs *)(packet->data + *start);
  439. while (rrs_next->next != DNS_RR_END) {
  440. rrs_next = (struct dns_rrs *)(packet->data + rrs_next->next);
  441. }
  442. rrs_next->next = packet->len;
  443. } else {
  444. *start = packet->len;
  445. }
  446. /* update rrs head info */
  447. rrs->packet = packet;
  448. rrs->len = len;
  449. rrs->type = rtype;
  450. rrs->next = DNS_RR_END;
  451. /* update total data length */
  452. *count += 1;
  453. packet->len += len + sizeof(*rrs);
  454. return 0;
  455. }
  456. static int _dns_add_qr_head(struct dns_context *context, const char *domain, int qtype, int qclass)
  457. {
  458. int ret = _dns_encode_domain(context, domain);
  459. if (ret < 0) {
  460. return -1;
  461. }
  462. if (_dns_left_len(context) < 4) {
  463. return -1;
  464. }
  465. _dns_write_short(&context->ptr, qtype);
  466. _dns_write_short(&context->ptr, qclass);
  467. return ret + 4;
  468. }
  469. static int _dns_get_qr_head(struct dns_context *context, char *domain, int maxsize, int *qtype, int *qclass)
  470. {
  471. int ret = 0;
  472. if (domain == NULL || context == NULL) {
  473. return -1;
  474. }
  475. ret = _dns_decode_domain(context, domain, maxsize);
  476. if (ret < 0) {
  477. return -1;
  478. }
  479. if (_dns_left_len(context) < 4) {
  480. return -1;
  481. }
  482. *qtype = _dns_read_short(&context->ptr);
  483. *qclass = _dns_read_short(&context->ptr);
  484. return 0;
  485. }
  486. static int _dns_add_rr_head(struct dns_context *context, const char *domain, int qtype, int qclass, int ttl, int rr_len)
  487. {
  488. int len = 0;
  489. /* resource record head */
  490. /* |domain |
  491. * |qtype | qclass |
  492. * | ttl |
  493. * | rrlen | rrdata |
  494. */
  495. len = _dns_add_qr_head(context, domain, qtype, qclass);
  496. if (len < 0) {
  497. return -1;
  498. }
  499. if (_dns_left_len(context) < 6) {
  500. return -1;
  501. }
  502. _dns_write_int(&context->ptr, ttl);
  503. _dns_write_short(&context->ptr, rr_len);
  504. return len + 6;
  505. }
  506. static int _dns_get_rr_head(struct dns_context *context, char *domain, int maxsize, int *qtype, int *qclass, int *ttl,
  507. int *rr_len)
  508. {
  509. int len = 0;
  510. /* resource record head */
  511. /* |domain |
  512. * |qtype | qclass |
  513. * | ttl |
  514. * | rrlen | rrdata |
  515. */
  516. len = _dns_get_qr_head(context, domain, maxsize, qtype, qclass);
  517. if (_dns_left_len(context) < 6) {
  518. return -1;
  519. }
  520. *ttl = _dns_read_int(&context->ptr);
  521. *rr_len = _dns_read_short(&context->ptr);
  522. return len;
  523. }
  524. struct dns_rr_nested *dns_add_rr_nested_start(struct dns_rr_nested *rr_nested_buffer, struct dns_packet *packet,
  525. dns_rr_type type, dns_type_t rtype, const char *domain, int ttl)
  526. {
  527. int len = 0;
  528. memset(rr_nested_buffer, 0, sizeof(*rr_nested_buffer));
  529. rr_nested_buffer->type = type;
  530. int ret = 0;
  531. /* resource record */
  532. /* |domain |
  533. * |qtype | qclass |
  534. * | ttl |
  535. * | rrlen | rrdata |
  536. */
  537. ret = _dns_add_rrs_start(packet, &rr_nested_buffer->context);
  538. if (ret < 0) {
  539. return NULL;
  540. }
  541. rr_nested_buffer->rr_start = rr_nested_buffer->context.ptr;
  542. /* add rr head */
  543. len = _dns_add_rr_head(&rr_nested_buffer->context, domain, rtype, DNS_C_IN, ttl, 0);
  544. if (len < 0) {
  545. return NULL;
  546. }
  547. rr_nested_buffer->rr_len_ptr = rr_nested_buffer->context.ptr - 2;
  548. rr_nested_buffer->rr_head_len = len;
  549. return rr_nested_buffer;
  550. }
  551. int dns_add_rr_nested_memcpy(struct dns_rr_nested *rr_nested, const void *data, int data_len)
  552. {
  553. if (rr_nested == NULL || data == NULL || data_len <= 0) {
  554. return -1;
  555. }
  556. if (_dns_left_len(&rr_nested->context) < data_len) {
  557. return -1;
  558. }
  559. if (is_aligned(rr_nested->context.ptr, 2) == 0) {
  560. return -1;
  561. }
  562. memcpy(rr_nested->context.ptr, data, data_len);
  563. rr_nested->context.ptr += data_len;
  564. if (is_aligned(rr_nested->context.ptr, 2) == 0) {
  565. if (_dns_left_len(&rr_nested->context) < 1) {
  566. return -1;
  567. }
  568. _dns_write_char(&rr_nested->context.ptr, 0);
  569. }
  570. return 0;
  571. }
  572. int dns_add_rr_nested_end(struct dns_rr_nested *rr_nested, dns_type_t rtype)
  573. {
  574. if (rr_nested == NULL || rr_nested->rr_start == NULL) {
  575. return -1;
  576. }
  577. int len = rr_nested->context.ptr - rr_nested->rr_start;
  578. unsigned char *ptr = rr_nested->rr_len_ptr;
  579. if (ptr == NULL || _dns_left_len(&rr_nested->context) < 2) {
  580. return -1;
  581. }
  582. /* NO SVC keys, reset ptr */
  583. if (len <= 14) {
  584. rr_nested->context.ptr = rr_nested->rr_start;
  585. return 0;
  586. }
  587. _dns_write_short(&ptr, len - rr_nested->rr_head_len);
  588. return _dns_rr_add_end(rr_nested->context.packet, rr_nested->type, rtype, len);
  589. }
  590. void *dns_get_rr_nested_start(struct dns_rrs *rrs, char *domain, int maxsize, int *qtype, int *ttl, int *rr_len)
  591. {
  592. struct dns_context data_context;
  593. int qclass = 0;
  594. int ret = 0;
  595. _dns_init_context_by_rrs(rrs, &data_context);
  596. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, qtype, &qclass, ttl, rr_len);
  597. if (ret < 0) {
  598. return NULL;
  599. }
  600. if (qclass != DNS_C_IN) {
  601. return NULL;
  602. }
  603. if (*rr_len < 2) {
  604. return NULL;
  605. }
  606. return data_context.ptr;
  607. }
  608. void *dns_get_rr_nested_next(struct dns_rrs *rrs, void *rr_nested, int rr_nested_len)
  609. {
  610. void *end = rrs->data + rrs->len;
  611. void *p = rr_nested + rr_nested_len;
  612. if (is_aligned(p, 2) == 0) {
  613. p++;
  614. }
  615. if (p == end) {
  616. return NULL;
  617. } else if (p > end) {
  618. return NULL;
  619. }
  620. return p;
  621. }
  622. static int _dns_add_RAW(struct dns_packet *packet, dns_rr_type rrtype, dns_type_t rtype, const char *domain, int ttl,
  623. const void *raw, int raw_len)
  624. {
  625. int len = 0;
  626. struct dns_context context;
  627. int ret = 0;
  628. if (raw_len < 0) {
  629. return -1;
  630. }
  631. /* resource record */
  632. /* |domain |
  633. * |qtype | qclass |
  634. * | ttl |
  635. * | rrlen | rrdata |
  636. */
  637. ret = _dns_add_rrs_start(packet, &context);
  638. if (ret < 0) {
  639. return -1;
  640. }
  641. /* add rr head */
  642. len = _dns_add_rr_head(&context, domain, rtype, DNS_C_IN, ttl, raw_len);
  643. if (len < 0) {
  644. return -1;
  645. }
  646. if (_dns_left_len(&context) < raw_len) {
  647. return -1;
  648. }
  649. /* add rr data */
  650. memcpy(context.ptr, raw, raw_len);
  651. context.ptr += raw_len;
  652. len += raw_len;
  653. return _dns_rr_add_end(packet, rrtype, rtype, len);
  654. }
  655. static int _dns_get_RAW(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, void *raw, int *raw_len)
  656. {
  657. int qtype = 0;
  658. int qclass = 0;
  659. int rr_len = 0;
  660. int ret = 0;
  661. struct dns_context context;
  662. /* resource record head */
  663. /* |domain |
  664. * |qtype | qclass |
  665. * | ttl |
  666. * | rrlen | rrdata |
  667. */
  668. _dns_init_context_by_rrs(rrs, &context);
  669. /* get rr head */
  670. ret = _dns_get_rr_head(&context, domain, maxsize, &qtype, &qclass, ttl, &rr_len);
  671. if (ret < 0) {
  672. return -1;
  673. }
  674. if (qtype != rrs->type || rr_len > *raw_len) {
  675. return -1;
  676. }
  677. /* get rr data */
  678. memcpy(raw, context.ptr, rr_len);
  679. context.ptr += rr_len;
  680. *raw_len = rr_len;
  681. return 0;
  682. }
  683. static int _dns_add_opt_RAW(struct dns_packet *packet, dns_opt_code_t opt_rrtype, void *raw, int raw_len)
  684. {
  685. unsigned char opt_data[DNS_MAX_OPT_LEN];
  686. struct dns_opt *opt = (struct dns_opt *)opt_data;
  687. int len = 0;
  688. opt->code = opt_rrtype;
  689. opt->length = sizeof(unsigned short);
  690. memcpy(opt->data, raw, raw_len);
  691. len += raw_len;
  692. len += sizeof(*opt);
  693. return _dns_add_RAW(packet, DNS_RRS_OPT, (dns_type_t)opt_rrtype, "", 0, opt_data, len);
  694. }
  695. static int _dns_get_opt_RAW(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, struct dns_opt *dns_opt,
  696. int *dns_optlen)
  697. {
  698. *dns_optlen = DNS_MAX_OPT_LEN;
  699. return _dns_get_RAW(rrs, domain, maxsize, ttl, dns_opt, dns_optlen);
  700. }
  701. static int __attribute__((unused)) _dns_add_OPT(struct dns_packet *packet, dns_rr_type type, unsigned short opt_code,
  702. unsigned short opt_len, struct dns_opt *opt)
  703. {
  704. int ret = 0;
  705. int len = 0;
  706. struct dns_context context;
  707. int total_len = sizeof(*opt) + opt->length;
  708. int ttl = 0;
  709. /*
  710. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  711. 0: | OPTION-CODE |
  712. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  713. 2: | OPTION-LENGTH |
  714. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  715. 4: | |
  716. / OPTION-DATA /
  717. / /
  718. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  719. */
  720. ret = _dns_add_rrs_start(packet, &context);
  721. if (ret < 0) {
  722. return -1;
  723. }
  724. if (_dns_left_len(&context) < total_len) {
  725. return -1;
  726. }
  727. ttl = (opt_code << 16) | opt_len;
  728. /* add rr head */
  729. len = _dns_add_rr_head(&context, "", type, DNS_C_IN, ttl, total_len);
  730. if (len < 0) {
  731. return -1;
  732. }
  733. /* add rr data */
  734. memcpy(context.ptr, opt, total_len);
  735. context.ptr += total_len;
  736. len = context.ptr - context.data - packet->len;
  737. return _dns_rr_add_end(packet, type, DNS_T_OPT, len);
  738. }
  739. static int __attribute__((unused)) _dns_get_OPT(struct dns_rrs *rrs, unsigned short *opt_code, unsigned short *opt_len,
  740. struct dns_opt *opt, int *opt_maxlen)
  741. {
  742. int qtype = 0;
  743. int qclass = 0;
  744. int rr_len = 0;
  745. int ret = 0;
  746. struct dns_context context;
  747. char domain[DNS_MAX_CNAME_LEN];
  748. int maxsize = DNS_MAX_CNAME_LEN;
  749. int ttl = 0;
  750. _dns_init_context_by_rrs(rrs, &context);
  751. /* get rr head */
  752. ret = _dns_get_rr_head(&context, domain, maxsize, &qtype, &qclass, &ttl, &rr_len);
  753. if (ret < 0) {
  754. return -1;
  755. }
  756. if (qtype != rrs->type || rr_len > *opt_len) {
  757. return -1;
  758. }
  759. /* get rr data */
  760. *opt_code = ttl >> 16;
  761. *opt_len = ttl & 0xFFFF;
  762. memcpy(opt, context.ptr, rr_len);
  763. context.ptr += rr_len;
  764. *opt_maxlen = rr_len;
  765. return 0;
  766. }
  767. int dns_add_CNAME(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, const char *cname)
  768. {
  769. int rr_len = strnlen(cname, DNS_MAX_CNAME_LEN) + 1;
  770. return _dns_add_RAW(packet, type, DNS_T_CNAME, domain, ttl, cname, rr_len);
  771. }
  772. int dns_get_CNAME(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, char *cname, int cname_size)
  773. {
  774. int len = cname_size;
  775. return _dns_get_RAW(rrs, domain, maxsize, ttl, cname, &len);
  776. }
  777. int dns_add_A(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl,
  778. unsigned char addr[DNS_RR_A_LEN])
  779. {
  780. return _dns_add_RAW(packet, type, DNS_T_A, domain, ttl, addr, DNS_RR_A_LEN);
  781. }
  782. int dns_get_A(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, unsigned char addr[DNS_RR_A_LEN])
  783. {
  784. int len = DNS_RR_A_LEN;
  785. return _dns_get_RAW(rrs, domain, maxsize, ttl, addr, &len);
  786. }
  787. int dns_add_PTR(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, const char *cname)
  788. {
  789. int rr_len = strnlen(cname, DNS_MAX_CNAME_LEN) + 1;
  790. return _dns_add_RAW(packet, type, DNS_T_PTR, domain, ttl, cname, rr_len);
  791. }
  792. int dns_get_PTR(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, char *cname, int cname_size)
  793. {
  794. int len = cname_size;
  795. return _dns_get_RAW(rrs, domain, maxsize, ttl, cname, &len);
  796. }
  797. int dns_add_TXT(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, const char *text)
  798. {
  799. int rr_len = strnlen(text, DNS_MAX_CNAME_LEN);
  800. char data[DNS_MAX_CNAME_LEN];
  801. if (rr_len > DNS_MAX_CNAME_LEN - 2) {
  802. return -1;
  803. }
  804. data[0] = rr_len;
  805. rr_len++;
  806. memcpy(data + 1, text, rr_len);
  807. data[rr_len] = 0;
  808. return _dns_add_RAW(packet, type, DNS_T_TXT, domain, ttl, data, rr_len);
  809. }
  810. int dns_get_TXT(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, char *text, int txt_size)
  811. {
  812. return -1;
  813. }
  814. int dns_add_NS(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, const char *cname)
  815. {
  816. int rr_len = strnlen(cname, DNS_MAX_CNAME_LEN) + 1;
  817. return _dns_add_RAW(packet, type, DNS_T_NS, domain, ttl, cname, rr_len);
  818. }
  819. int dns_get_NS(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, char *cname, int cname_size)
  820. {
  821. int len = cname_size;
  822. return _dns_get_RAW(rrs, domain, maxsize, ttl, cname, &len);
  823. }
  824. int dns_add_AAAA(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl,
  825. unsigned char addr[DNS_RR_AAAA_LEN])
  826. {
  827. return _dns_add_RAW(packet, type, DNS_T_AAAA, domain, ttl, addr, DNS_RR_AAAA_LEN);
  828. }
  829. int dns_get_AAAA(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, unsigned char addr[DNS_RR_AAAA_LEN])
  830. {
  831. int len = DNS_RR_AAAA_LEN;
  832. return _dns_get_RAW(rrs, domain, maxsize, ttl, addr, &len);
  833. }
  834. int dns_add_SOA(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, struct dns_soa *soa)
  835. {
  836. /* SOA */
  837. /*| mname |
  838. *| rname |
  839. *| serial |
  840. *| refresh |
  841. *| retry |
  842. *| expire |
  843. *| minimum |
  844. */
  845. unsigned char data[sizeof(*soa)];
  846. unsigned char *ptr = data;
  847. int len = 0;
  848. if (soa == NULL || domain == NULL || packet == NULL) {
  849. return -1;
  850. }
  851. safe_strncpy((char *)ptr, soa->mname, DNS_MAX_CNAME_LEN);
  852. ptr += strnlen(soa->mname, DNS_MAX_CNAME_LEN - 1) + 1;
  853. safe_strncpy((char *)ptr, soa->rname, DNS_MAX_CNAME_LEN);
  854. ptr += strnlen(soa->rname, DNS_MAX_CNAME_LEN - 1) + 1;
  855. memcpy(ptr, &soa->serial, sizeof(unsigned int));
  856. ptr += 4;
  857. memcpy(ptr, &soa->refresh, sizeof(unsigned int));
  858. ptr += 4;
  859. memcpy(ptr, &soa->retry, sizeof(unsigned int));
  860. ptr += 4;
  861. memcpy(ptr, &soa->expire, sizeof(unsigned int));
  862. ptr += 4;
  863. memcpy(ptr, &soa->minimum, sizeof(unsigned int));
  864. ptr += 4;
  865. len = ptr - data;
  866. return _dns_add_RAW(packet, type, DNS_T_SOA, domain, ttl, data, len);
  867. }
  868. int dns_get_SOA(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, struct dns_soa *soa)
  869. {
  870. unsigned char data[sizeof(*soa)];
  871. unsigned char *ptr = data;
  872. int len = sizeof(data);
  873. /* SOA */
  874. /*| mname |
  875. *| rname |
  876. *| serial |
  877. *| refresh |
  878. *| retry |
  879. *| expire |
  880. *| minimum |
  881. */
  882. if (_dns_get_RAW(rrs, domain, maxsize, ttl, data, &len) != 0) {
  883. return -1;
  884. }
  885. safe_strncpy(soa->mname, (char *)ptr, DNS_MAX_CNAME_LEN - 1);
  886. ptr += strnlen(soa->mname, DNS_MAX_CNAME_LEN - 1) + 1;
  887. if (ptr - data >= len) {
  888. return -1;
  889. }
  890. safe_strncpy(soa->rname, (char *)ptr, DNS_MAX_CNAME_LEN - 1);
  891. ptr += strnlen(soa->rname, DNS_MAX_CNAME_LEN - 1) + 1;
  892. if (ptr - data + 20 > len) {
  893. return -1;
  894. }
  895. memcpy(&soa->serial, ptr, 4);
  896. ptr += 4;
  897. memcpy(&soa->refresh, ptr, 4);
  898. ptr += 4;
  899. memcpy(&soa->retry, ptr, 4);
  900. ptr += 4;
  901. memcpy(&soa->expire, ptr, 4);
  902. ptr += 4;
  903. memcpy(&soa->minimum, ptr, 4);
  904. return 0;
  905. }
  906. int dns_set_OPT_payload_size(struct dns_packet *packet, int payload_size)
  907. {
  908. if (payload_size < 512) {
  909. payload_size = 512;
  910. }
  911. packet->payloadsize = payload_size;
  912. return 0;
  913. }
  914. int dns_get_OPT_payload_size(struct dns_packet *packet)
  915. {
  916. return packet->payloadsize;
  917. }
  918. int dns_set_OPT_option(struct dns_packet *packet, unsigned int option)
  919. {
  920. packet->opt_option = option;
  921. return 0;
  922. }
  923. unsigned int dns_get_OPT_option(struct dns_packet *packet)
  924. {
  925. return packet->opt_option;
  926. }
  927. int dns_add_OPT_ECS(struct dns_packet *packet, struct dns_opt_ecs *ecs)
  928. {
  929. unsigned char opt_data[DNS_MAX_OPT_LEN];
  930. struct dns_opt *opt = (struct dns_opt *)opt_data;
  931. int len = 0;
  932. /* ecs size 4 + bit of address*/
  933. len = 4;
  934. len += (ecs->source_prefix / 8);
  935. len += (ecs->source_prefix % 8 > 0) ? 1 : 0;
  936. opt->length = len;
  937. opt->code = DNS_OPT_T_ECS;
  938. memcpy(opt->data, ecs, len);
  939. len += sizeof(*opt);
  940. return _dns_add_RAW(packet, DNS_RRS_OPT, (dns_type_t)DNS_OPT_T_ECS, "", 0, opt_data, len);
  941. }
  942. int dns_get_OPT_ECS(struct dns_rrs *rrs, struct dns_opt_ecs *ecs)
  943. {
  944. unsigned char opt_data[DNS_MAX_OPT_LEN];
  945. char domain[DNS_MAX_CNAME_LEN] = {0};
  946. struct dns_opt *opt = (struct dns_opt *)opt_data;
  947. int len = DNS_MAX_OPT_LEN;
  948. int ttl = 0;
  949. if (_dns_get_RAW(rrs, domain, DNS_MAX_CNAME_LEN, &ttl, opt_data, &len) != 0) {
  950. return -1;
  951. }
  952. if (len < (int)sizeof(*opt)) {
  953. return -1;
  954. }
  955. if (opt->code != DNS_OPT_T_ECS) {
  956. return -1;
  957. }
  958. memcpy(ecs, opt->data, opt->length);
  959. return 0;
  960. }
  961. int dns_add_OPT_TCP_KEEPALIVE(struct dns_packet *packet, unsigned short timeout)
  962. {
  963. unsigned short timeout_net = htons(timeout);
  964. int data_len = 0;
  965. if (timeout > 0) {
  966. data_len = sizeof(timeout);
  967. }
  968. return _dns_add_opt_RAW(packet, DNS_OPT_T_TCP_KEEPALIVE, &timeout_net, data_len);
  969. }
  970. int dns_get_OPT_TCP_KEEPALIVE(struct dns_rrs *rrs, unsigned short *timeout)
  971. {
  972. unsigned char opt_data[DNS_MAX_OPT_LEN];
  973. char domain[DNS_MAX_CNAME_LEN] = {0};
  974. struct dns_opt *opt = (struct dns_opt *)opt_data;
  975. int len = DNS_MAX_OPT_LEN;
  976. int ttl = 0;
  977. unsigned char *data = NULL;
  978. if (_dns_get_opt_RAW(rrs, domain, DNS_MAX_CNAME_LEN, &ttl, opt, &len) != 0) {
  979. return -1;
  980. }
  981. if (len < (int)sizeof(*opt)) {
  982. return -1;
  983. }
  984. if (opt->code != DNS_OPT_T_TCP_KEEPALIVE) {
  985. return -1;
  986. }
  987. if (opt->length == 0) {
  988. *timeout = 0;
  989. return 0;
  990. }
  991. if (opt->length != sizeof(unsigned short)) {
  992. return -1;
  993. }
  994. data = opt->data;
  995. *timeout = _dns_read_short(&data);
  996. return 0;
  997. }
  998. int dns_add_SRV(struct dns_packet *packet, dns_rr_type type, const char *domain, int ttl, int priority, int weight,
  999. int port, const char *target)
  1000. {
  1001. unsigned char data[DNS_MAX_CNAME_LEN];
  1002. unsigned char *data_ptr = data;
  1003. int target_len = 0;
  1004. if (target == NULL) {
  1005. target = "";
  1006. }
  1007. target_len = strnlen(target, DNS_MAX_CNAME_LEN) + 1;
  1008. memcpy(data_ptr, &priority, sizeof(unsigned short));
  1009. data_ptr += sizeof(unsigned short);
  1010. memcpy(data_ptr, &weight, sizeof(unsigned short));
  1011. data_ptr += sizeof(unsigned short);
  1012. memcpy(data_ptr, &port, sizeof(unsigned short));
  1013. data_ptr += sizeof(unsigned short);
  1014. if (data_ptr - data + target_len >= DNS_MAX_CNAME_LEN) {
  1015. return -1;
  1016. }
  1017. safe_strncpy((char *)data_ptr, target, target_len);
  1018. data_ptr += target_len;
  1019. return _dns_add_RAW(packet, type, DNS_T_SRV, domain, ttl, data, data_ptr - data);
  1020. }
  1021. int dns_get_SRV(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, unsigned short *priority,
  1022. unsigned short *weight, unsigned short *port, char *target, int target_size)
  1023. {
  1024. unsigned char data[DNS_MAX_CNAME_LEN];
  1025. unsigned char *ptr = data;
  1026. int len = sizeof(data);
  1027. if (_dns_get_RAW(rrs, domain, maxsize, ttl, data, &len) != 0) {
  1028. return -1;
  1029. }
  1030. if (len < 6) {
  1031. return -1;
  1032. }
  1033. memcpy(priority, ptr, sizeof(unsigned short));
  1034. ptr += sizeof(unsigned short);
  1035. memcpy(weight, ptr, sizeof(unsigned short));
  1036. ptr += sizeof(unsigned short);
  1037. memcpy(port, ptr, sizeof(unsigned short));
  1038. ptr += sizeof(unsigned short);
  1039. safe_strncpy(target, (char *)ptr, target_size);
  1040. return 0;
  1041. }
  1042. int dns_add_HTTPS_start(struct dns_rr_nested *svcparam_buffer, struct dns_packet *packet, dns_rr_type type,
  1043. const char *domain, int ttl, int priority, const char *target)
  1044. {
  1045. svcparam_buffer = dns_add_rr_nested_start(svcparam_buffer, packet, type, DNS_T_HTTPS, domain, ttl);
  1046. if (svcparam_buffer == NULL) {
  1047. return -1;
  1048. }
  1049. int target_len = 0;
  1050. if (target == NULL) {
  1051. target = "";
  1052. }
  1053. target_len = strnlen(target, DNS_MAX_CNAME_LEN) + 1;
  1054. if (_dns_left_len(&svcparam_buffer->context) < 2 + target_len) {
  1055. return -1;
  1056. }
  1057. /* add rr data */
  1058. _dns_write_short(&svcparam_buffer->context.ptr, priority);
  1059. safe_strncpy((char *)svcparam_buffer->context.ptr, target, target_len);
  1060. svcparam_buffer->context.ptr += target_len;
  1061. if (is_aligned(svcparam_buffer->context.ptr, 2) != 1) {
  1062. if (_dns_left_len(&svcparam_buffer->context) < 1) {
  1063. return -1;
  1064. }
  1065. _dns_write_char(&svcparam_buffer->context.ptr, 0);
  1066. }
  1067. return 0;
  1068. }
  1069. int dns_HTTPS_add_raw(struct dns_rr_nested *svcparam, unsigned short key, unsigned char *value, unsigned short len)
  1070. {
  1071. if (_dns_left_len(&svcparam->context) < 2 + len) {
  1072. return -1;
  1073. }
  1074. if (dns_add_rr_nested_memcpy(svcparam, &key, 2) != 0) {
  1075. return -1;
  1076. }
  1077. if (dns_add_rr_nested_memcpy(svcparam, &len, 2) != 0) {
  1078. return -1;
  1079. }
  1080. if (dns_add_rr_nested_memcpy(svcparam, value, len) != 0) {
  1081. return -1;
  1082. }
  1083. return 0;
  1084. }
  1085. int dns_HTTPS_add_port(struct dns_rr_nested *svcparam, unsigned short port)
  1086. {
  1087. if (_dns_left_len(&svcparam->context) < 6) {
  1088. return -1;
  1089. }
  1090. unsigned short value = DNS_HTTPS_T_PORT;
  1091. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1092. return -1;
  1093. }
  1094. value = 2;
  1095. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1096. return -1;
  1097. }
  1098. value = htons(port);
  1099. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1100. return -1;
  1101. }
  1102. return 0;
  1103. }
  1104. int dns_HTTPS_add_alpn(struct dns_rr_nested *svcparam, const char *alpn, int alpn_len)
  1105. {
  1106. if (_dns_left_len(&svcparam->context) < 2 + 2 + alpn_len) {
  1107. return -1;
  1108. }
  1109. unsigned short value = DNS_HTTPS_T_ALPN;
  1110. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1111. return -1;
  1112. }
  1113. value = alpn_len;
  1114. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1115. return -1;
  1116. }
  1117. if (dns_add_rr_nested_memcpy(svcparam, alpn, alpn_len) != 0) {
  1118. return -1;
  1119. }
  1120. return 0;
  1121. }
  1122. int dns_HTTPS_add_ech(struct dns_rr_nested *svcparam, void *ech, int ech_len)
  1123. {
  1124. if (_dns_left_len(&svcparam->context) < 2 + 2 + ech_len) {
  1125. return -1;
  1126. }
  1127. unsigned short value = DNS_HTTPS_T_ECH;
  1128. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1129. return -1;
  1130. }
  1131. value = ech_len;
  1132. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1133. return -1;
  1134. }
  1135. if (dns_add_rr_nested_memcpy(svcparam, ech, ech_len) != 0) {
  1136. return -1;
  1137. }
  1138. return 0;
  1139. }
  1140. int dns_HTTPS_add_ipv4hint(struct dns_rr_nested *svcparam, unsigned char *addr[], int addr_num)
  1141. {
  1142. if (_dns_left_len(&svcparam->context) < 4 + addr_num * DNS_RR_A_LEN) {
  1143. return -1;
  1144. }
  1145. unsigned short value = DNS_HTTPS_T_IPV4HINT;
  1146. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1147. return -1;
  1148. }
  1149. value = addr_num * DNS_RR_A_LEN;
  1150. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1151. return -1;
  1152. }
  1153. for (int i = 0; i < addr_num; i++) {
  1154. if (dns_add_rr_nested_memcpy(svcparam, addr[i], DNS_RR_A_LEN) != 0) {
  1155. return -1;
  1156. }
  1157. }
  1158. return 0;
  1159. }
  1160. int dns_HTTPS_add_ipv6hint(struct dns_rr_nested *svcparam, unsigned char *addr[], int addr_num)
  1161. {
  1162. if (_dns_left_len(&svcparam->context) < 4 + addr_num * DNS_RR_AAAA_LEN) {
  1163. return -1;
  1164. }
  1165. unsigned short value = DNS_HTTPS_T_IPV6HINT;
  1166. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1167. return -1;
  1168. }
  1169. value = addr_num * DNS_RR_AAAA_LEN;
  1170. if (dns_add_rr_nested_memcpy(svcparam, &value, 2) != 0) {
  1171. return -1;
  1172. }
  1173. for (int i = 0; i < addr_num; i++) {
  1174. if (dns_add_rr_nested_memcpy(svcparam, addr[i], DNS_RR_AAAA_LEN) != 0) {
  1175. return -1;
  1176. }
  1177. }
  1178. return 0;
  1179. }
  1180. int dns_add_HTTPS_end(struct dns_rr_nested *svcparam)
  1181. {
  1182. return dns_add_rr_nested_end(svcparam, DNS_T_HTTPS);
  1183. }
  1184. int dns_get_HTTPS_svcparm_start(struct dns_rrs *rrs, struct dns_https_param **https_param, char *domain, int maxsize,
  1185. int *ttl, int *priority, char *target, int target_size)
  1186. {
  1187. int qtype = 0;
  1188. unsigned char *data = NULL;
  1189. int rr_len = 0;
  1190. data = dns_get_rr_nested_start(rrs, domain, maxsize, &qtype, ttl, &rr_len);
  1191. if (data == NULL) {
  1192. return -1;
  1193. }
  1194. if (qtype != DNS_T_HTTPS) {
  1195. return -1;
  1196. }
  1197. if (rr_len < 2) {
  1198. return -1;
  1199. }
  1200. *priority = _dns_read_short(&data);
  1201. rr_len -= 2;
  1202. if (rr_len <= 0) {
  1203. return -1;
  1204. }
  1205. int len = strnlen((char *)data, rr_len);
  1206. safe_strncpy(target, (char *)data, target_size);
  1207. data += len + 1;
  1208. rr_len -= len + 1;
  1209. if (rr_len < 0) {
  1210. return -1;
  1211. }
  1212. /* PADDING */
  1213. if (is_aligned(data, 2) != 1) {
  1214. data++;
  1215. rr_len--;
  1216. }
  1217. if (rr_len == 0) {
  1218. *https_param = NULL;
  1219. return 0;
  1220. }
  1221. *https_param = (struct dns_https_param *)data;
  1222. return 0;
  1223. }
  1224. struct dns_https_param *dns_get_HTTPS_svcparm_next(struct dns_rrs *rrs, struct dns_https_param *param)
  1225. {
  1226. return dns_get_rr_nested_next(rrs, param, sizeof(struct dns_https_param) + param->len);
  1227. }
  1228. /*
  1229. * Format:
  1230. * |DNS_NAME\0(string)|qtype(short)|qclass(short)|
  1231. */
  1232. int dns_add_domain(struct dns_packet *packet, const char *domain, int qtype, int qclass)
  1233. {
  1234. int len = 0;
  1235. int ret = 0;
  1236. struct dns_context context;
  1237. ret = _dns_add_rrs_start(packet, &context);
  1238. if (ret < 0) {
  1239. return -1;
  1240. }
  1241. len = _dns_add_qr_head(&context, domain, qtype, qclass);
  1242. if (len < 0) {
  1243. return -1;
  1244. }
  1245. return _dns_rr_add_end(packet, DNS_RRS_QD, DNS_T_CNAME, len);
  1246. }
  1247. int dns_get_domain(struct dns_rrs *rrs, char *domain, int maxsize, int *qtype, int *qclass)
  1248. {
  1249. struct dns_context context;
  1250. _dns_init_context_by_rrs(rrs, &context);
  1251. return _dns_get_qr_head(&context, domain, maxsize, qtype, qclass);
  1252. }
  1253. static int _dns_decode_head(struct dns_context *context)
  1254. {
  1255. unsigned int fields = 0;
  1256. int len = 12;
  1257. struct dns_head *head = &context->packet->head;
  1258. if (_dns_left_len(context) < len) {
  1259. return -1;
  1260. }
  1261. /*
  1262. 0 1 2 3 4 5 6 7 8 9 A B C D E F
  1263. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1264. | ID |
  1265. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1266. |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
  1267. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1268. | QDCOUNT |
  1269. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1270. | ANCOUNT |
  1271. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1272. | NSCOUNT |
  1273. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1274. | ARCOUNT |
  1275. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1276. */
  1277. head->id = _dns_read_short(&context->ptr);
  1278. fields = _dns_read_short(&context->ptr);
  1279. head->qr = (fields & QR_MASK) >> 15;
  1280. head->opcode = (fields & OPCODE_MASK) >> 11;
  1281. head->aa = (fields & AA_MASK) >> 10;
  1282. head->tc = (fields & TC_MASK) >> 9;
  1283. head->rd = (fields & RD_MASK) >> 8;
  1284. head->ra = (fields & RA_MASK) >> 7;
  1285. head->z = (fields & Z_MASK) >> 6;
  1286. head->ad = (fields & AD_MASK) >> 5;
  1287. head->cd = (fields & CD_MASK) >> 4;
  1288. head->rcode = (fields & RCODE_MASK) >> 0;
  1289. head->qdcount = _dns_read_short(&context->ptr);
  1290. head->ancount = _dns_read_short(&context->ptr);
  1291. head->nscount = _dns_read_short(&context->ptr);
  1292. head->nrcount = _dns_read_short(&context->ptr);
  1293. return 0;
  1294. }
  1295. static int _dns_encode_head(struct dns_context *context)
  1296. {
  1297. int len = 12;
  1298. struct dns_head *head = &context->packet->head;
  1299. if (_dns_left_len(context) < len) {
  1300. return -1;
  1301. }
  1302. _dns_write_short(&context->ptr, head->id);
  1303. int fields = 0;
  1304. fields |= (head->qr << 15) & QR_MASK;
  1305. fields |= (head->opcode << 11) & OPCODE_MASK;
  1306. fields |= (head->aa << 10) & AA_MASK;
  1307. fields |= (head->tc << 9) & TC_MASK;
  1308. fields |= (head->rd << 8) & RD_MASK;
  1309. fields |= (head->ra << 7) & RA_MASK;
  1310. fields |= (head->z << 6) & Z_MASK;
  1311. fields |= (head->ad << 5) & AD_MASK;
  1312. fields |= (head->cd << 4) & CD_MASK;
  1313. fields |= (head->rcode << 0) & RCODE_MASK;
  1314. _dns_write_short(&context->ptr, fields);
  1315. _dns_write_short(&context->ptr, head->qdcount);
  1316. _dns_write_short(&context->ptr, head->ancount);
  1317. _dns_write_short(&context->ptr, head->nscount);
  1318. _dns_write_short(&context->ptr, head->nrcount);
  1319. return len;
  1320. }
  1321. static int _dns_encode_head_count(struct dns_context *context)
  1322. {
  1323. int len = 12;
  1324. struct dns_head *head = &context->packet->head;
  1325. unsigned char *ptr = context->data;
  1326. ptr += 4;
  1327. _dns_write_short(&ptr, head->qdcount);
  1328. _dns_write_short(&ptr, head->ancount);
  1329. _dns_write_short(&ptr, head->nscount);
  1330. _dns_write_short(&ptr, head->nrcount);
  1331. return len;
  1332. }
  1333. static int _dns_decode_qr_head(struct dns_context *context, char *domain, int domain_size, int *qtype, int *qclass)
  1334. {
  1335. int ret = 0;
  1336. /*
  1337. 0 1 2 3 4 5 6 7 8 9 A B C D E F
  1338. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1339. | |
  1340. / /
  1341. / NAME /
  1342. | |
  1343. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1344. | TYPE |
  1345. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1346. | CLASS |
  1347. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1348. */
  1349. ret = _dns_decode_domain(context, domain, domain_size);
  1350. if (ret < 0) {
  1351. tlog(TLOG_DEBUG, "decode domain failed.");
  1352. return -1;
  1353. }
  1354. if (_dns_left_len(context) < 4) {
  1355. tlog(TLOG_DEBUG, "left length is not enough, %s.", domain);
  1356. return -1;
  1357. }
  1358. *qtype = _dns_read_short(&context->ptr);
  1359. *qclass = _dns_read_short(&context->ptr);
  1360. return 0;
  1361. }
  1362. static int _dns_encode_qr_head(struct dns_context *context, char *domain, int qtype, int qclass)
  1363. {
  1364. int ret = 0;
  1365. ret = _dns_encode_domain(context, domain);
  1366. if (ret < 0) {
  1367. return -1;
  1368. }
  1369. if (_dns_left_len(context) < 4) {
  1370. return -1;
  1371. }
  1372. _dns_write_short(&context->ptr, qtype);
  1373. _dns_write_short(&context->ptr, qclass);
  1374. return 0;
  1375. }
  1376. static int _dns_decode_rr_head(struct dns_context *context, char *domain, int domain_size, int *qtype, int *qclass,
  1377. int *ttl, int *rr_len)
  1378. {
  1379. int len = 0;
  1380. len = _dns_decode_qr_head(context, domain, domain_size, qtype, qclass);
  1381. if (len < 0) {
  1382. tlog(TLOG_DEBUG, "decode qr head failed.");
  1383. return -1;
  1384. }
  1385. if (_dns_left_len(context) < 6) {
  1386. tlog(TLOG_DEBUG, "left length is not enough.");
  1387. return -1;
  1388. }
  1389. *ttl = _dns_read_int(&context->ptr);
  1390. *rr_len = _dns_read_short(&context->ptr);
  1391. if (*rr_len < 0 || *ttl < 0) {
  1392. tlog(TLOG_DEBUG, "rr len or ttl is invalid.");
  1393. return -1;
  1394. }
  1395. return 0;
  1396. }
  1397. static int _dns_encode_rr_head(struct dns_context *context, char *domain, int qtype, int qclass, int ttl, int rr_len,
  1398. unsigned char **rr_len_ptr)
  1399. {
  1400. int ret = 0;
  1401. ret = _dns_encode_qr_head(context, domain, qtype, qclass);
  1402. if (ret < 0) {
  1403. return -1;
  1404. }
  1405. if (_dns_left_len(context) < 6) {
  1406. return -1;
  1407. }
  1408. _dns_write_int(&context->ptr, ttl);
  1409. if (rr_len_ptr) {
  1410. *rr_len_ptr = context->ptr;
  1411. }
  1412. _dns_write_short(&context->ptr, rr_len);
  1413. return 0;
  1414. }
  1415. static int _dns_encode_raw(struct dns_context *context, struct dns_rrs *rrs)
  1416. {
  1417. int ret = 0;
  1418. int qtype = 0;
  1419. int qclass = 0;
  1420. int ttl = 0;
  1421. char domain[DNS_MAX_CNAME_LEN];
  1422. int rr_len = 0;
  1423. unsigned char *rr_len_ptr = NULL;
  1424. struct dns_context data_context;
  1425. /*
  1426. 0 1 2 3 4 5 6 7 8 9 A B C D E F
  1427. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1428. | |
  1429. / /
  1430. / NAME /
  1431. | |
  1432. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1433. | TYPE |
  1434. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1435. | CLASS |
  1436. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1437. | TTL |
  1438. | |
  1439. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1440. | RDLENGTH |
  1441. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
  1442. / RDATA /
  1443. / /
  1444. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  1445. */
  1446. _dns_init_context_by_rrs(rrs, &data_context);
  1447. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  1448. if (ret < 0) {
  1449. return -1;
  1450. }
  1451. ret = _dns_encode_rr_head(context, domain, qtype, qclass, ttl, rr_len, &rr_len_ptr);
  1452. if (ret < 0) {
  1453. return -1;
  1454. }
  1455. if (_dns_left_len(context) < rr_len) {
  1456. return -1;
  1457. }
  1458. memcpy(context->ptr, data_context.ptr, rr_len);
  1459. context->ptr += rr_len;
  1460. data_context.ptr += rr_len;
  1461. return 0;
  1462. }
  1463. static int _dns_decode_raw(struct dns_context *context, unsigned char *raw, int len)
  1464. {
  1465. if (_dns_left_len(context) < len || len < 0) {
  1466. return -1;
  1467. }
  1468. memcpy(raw, context->ptr, len);
  1469. context->ptr += len;
  1470. return 0;
  1471. }
  1472. static int _dns_decode_CNAME(struct dns_context *context, char *cname, int cname_size)
  1473. {
  1474. int ret = 0;
  1475. ret = _dns_decode_domain(context, cname, cname_size);
  1476. if (ret < 0) {
  1477. return -1;
  1478. }
  1479. return 0;
  1480. }
  1481. static int _dns_encode_CNAME(struct dns_context *context, struct dns_rrs *rrs)
  1482. {
  1483. int ret = 0;
  1484. int qtype = 0;
  1485. int qclass = 0;
  1486. int ttl = 0;
  1487. char domain[DNS_MAX_CNAME_LEN];
  1488. int rr_len = 0;
  1489. unsigned char *rr_len_ptr = NULL;
  1490. struct dns_context data_context;
  1491. _dns_init_context_by_rrs(rrs, &data_context);
  1492. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  1493. if (ret < 0) {
  1494. return -1;
  1495. }
  1496. /* when code domain, len must plus 1, because of length at the beginning */
  1497. rr_len = 1;
  1498. ret = _dns_encode_rr_head(context, domain, qtype, qclass, ttl, rr_len, &rr_len_ptr);
  1499. if (ret < 0) {
  1500. return -1;
  1501. }
  1502. ret = _dns_encode_domain(context, (char *)data_context.ptr);
  1503. if (ret < 0) {
  1504. return -1;
  1505. }
  1506. rr_len += ret;
  1507. data_context.ptr += strnlen((char *)(data_context.ptr), DNS_MAX_CNAME_LEN) + 1;
  1508. if (rr_len > rrs->len) {
  1509. return -1;
  1510. }
  1511. _dns_write_short(&rr_len_ptr, ret);
  1512. return 0;
  1513. }
  1514. static int _dns_decode_SRV(struct dns_context *context, unsigned short *priority, unsigned short *weight,
  1515. unsigned short *port, char *target, int target_size)
  1516. {
  1517. int ret = 0;
  1518. if (_dns_left_len(context) < 6) {
  1519. return -1;
  1520. }
  1521. *priority = _dns_read_short(&context->ptr);
  1522. *weight = _dns_read_short(&context->ptr);
  1523. *port = _dns_read_short(&context->ptr);
  1524. ret = _dns_decode_domain(context, target, target_size);
  1525. if (ret < 0) {
  1526. return -1;
  1527. }
  1528. return 0;
  1529. }
  1530. static int _dns_decode_SOA(struct dns_context *context, struct dns_soa *soa)
  1531. {
  1532. int ret = 0;
  1533. ret = _dns_decode_domain(context, soa->mname, DNS_MAX_CNAME_LEN - 1);
  1534. if (ret < 0) {
  1535. return -1;
  1536. }
  1537. ret = _dns_decode_domain(context, soa->rname, DNS_MAX_CNAME_LEN - 1);
  1538. if (ret < 0) {
  1539. return -1;
  1540. }
  1541. if (_dns_left_len(context) < 20) {
  1542. return -1;
  1543. }
  1544. soa->serial = _dns_read_int(&context->ptr);
  1545. soa->refresh = _dns_read_int(&context->ptr);
  1546. soa->retry = _dns_read_int(&context->ptr);
  1547. soa->expire = _dns_read_int(&context->ptr);
  1548. soa->minimum = _dns_read_int(&context->ptr);
  1549. return 0;
  1550. }
  1551. static int _dns_encode_SOA(struct dns_context *context, struct dns_rrs *rrs)
  1552. {
  1553. int ret = 0;
  1554. int qtype = 0;
  1555. int qclass = 0;
  1556. int ttl = 0;
  1557. char domain[DNS_MAX_CNAME_LEN];
  1558. int rr_len = 0;
  1559. unsigned char *rr_len_ptr = NULL;
  1560. struct dns_context data_context;
  1561. _dns_init_context_by_rrs(rrs, &data_context);
  1562. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  1563. if (ret < 0) {
  1564. return -1;
  1565. }
  1566. ret = _dns_encode_rr_head(context, domain, qtype, qclass, ttl, rr_len, &rr_len_ptr);
  1567. if (ret < 0) {
  1568. return -1;
  1569. }
  1570. rr_len = 0;
  1571. /* mname */
  1572. ret = _dns_encode_domain(context, (char *)data_context.ptr);
  1573. if (ret < 0) {
  1574. return -1;
  1575. }
  1576. rr_len += ret;
  1577. data_context.ptr += strnlen((char *)(data_context.ptr), DNS_MAX_CNAME_LEN) + 1;
  1578. /* rname */
  1579. ret = _dns_encode_domain(context, (char *)data_context.ptr);
  1580. if (ret < 0) {
  1581. return -1;
  1582. }
  1583. rr_len += ret;
  1584. data_context.ptr += strnlen((char *)(data_context.ptr), DNS_MAX_CNAME_LEN) + 1;
  1585. if (rr_len > rrs->len) {
  1586. return -1;
  1587. }
  1588. rr_len += 20;
  1589. _dns_write_short(&rr_len_ptr, rr_len);
  1590. if (_dns_left_len(context) < 20) {
  1591. return -1;
  1592. }
  1593. _dns_write_intptr(&context->ptr, data_context.ptr);
  1594. data_context.ptr += 4;
  1595. _dns_write_intptr(&context->ptr, data_context.ptr);
  1596. data_context.ptr += 4;
  1597. _dns_write_intptr(&context->ptr, data_context.ptr);
  1598. data_context.ptr += 4;
  1599. _dns_write_intptr(&context->ptr, data_context.ptr);
  1600. data_context.ptr += 4;
  1601. _dns_write_intptr(&context->ptr, data_context.ptr);
  1602. data_context.ptr += 4;
  1603. return 0;
  1604. }
  1605. static int _dns_encode_SRV(struct dns_context *context, struct dns_rrs *rrs)
  1606. {
  1607. int ret = 0;
  1608. int qtype = 0;
  1609. int qclass = 0;
  1610. int ttl = 0;
  1611. char domain[DNS_MAX_CNAME_LEN];
  1612. int rr_len = 0;
  1613. unsigned char *rr_len_ptr = NULL;
  1614. struct dns_context data_context;
  1615. _dns_init_context_by_rrs(rrs, &data_context);
  1616. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  1617. if (ret < 0) {
  1618. return -1;
  1619. }
  1620. ret = _dns_encode_rr_head(context, domain, qtype, qclass, ttl, rr_len, &rr_len_ptr);
  1621. if (ret < 0) {
  1622. return -1;
  1623. }
  1624. rr_len = 0;
  1625. if (_dns_left_len(context) < 6) {
  1626. return -1;
  1627. }
  1628. _dns_write_shortptr(&context->ptr, data_context.ptr);
  1629. data_context.ptr += 2;
  1630. _dns_write_shortptr(&context->ptr, data_context.ptr);
  1631. data_context.ptr += 2;
  1632. _dns_write_shortptr(&context->ptr, data_context.ptr);
  1633. data_context.ptr += 2;
  1634. rr_len += 6;
  1635. ret = _dns_encode_domain(context, (char *)data_context.ptr);
  1636. if (ret < 0) {
  1637. return -1;
  1638. }
  1639. rr_len += ret;
  1640. data_context.ptr += strnlen((char *)(data_context.ptr), DNS_MAX_CNAME_LEN) + 1;
  1641. _dns_write_short(&rr_len_ptr, rr_len);
  1642. return 0;
  1643. }
  1644. static int _dns_decode_opt_ecs(struct dns_context *context, struct dns_opt_ecs *ecs, int opt_len)
  1645. {
  1646. int len = 0;
  1647. if (opt_len < 4) {
  1648. return -1;
  1649. }
  1650. ecs->family = _dns_read_short(&context->ptr);
  1651. ecs->source_prefix = _dns_read_char(&context->ptr);
  1652. ecs->scope_prefix = _dns_read_char(&context->ptr);
  1653. len = (ecs->source_prefix / 8);
  1654. len += (ecs->source_prefix % 8 > 0) ? 1 : 0;
  1655. if (_dns_left_len(context) < len || len > (int)sizeof(ecs->addr)) {
  1656. return -1;
  1657. }
  1658. memcpy(ecs->addr, context->ptr, len);
  1659. context->ptr += len;
  1660. tlog(TLOG_DEBUG, "ECS: family:%d, source_prefix:%d, scope_prefix:%d, len:%d", ecs->family, ecs->source_prefix,
  1661. ecs->scope_prefix, len);
  1662. tlog(TLOG_DEBUG, "%d.%d.%d.%d", ecs->addr[0], ecs->addr[1], ecs->addr[2], ecs->addr[3]);
  1663. return 0;
  1664. }
  1665. static int _dns_decode_opt_cookie(struct dns_context *context, struct dns_opt_cookie *cookie, int opt_len)
  1666. {
  1667. if (opt_len < (int)member_size(struct dns_opt_cookie, client_cookie)) {
  1668. return -1;
  1669. }
  1670. int len = 8;
  1671. memcpy(cookie->client_cookie, context->ptr, len);
  1672. context->ptr += len;
  1673. opt_len -= len;
  1674. if (opt_len <= 0) {
  1675. cookie->server_cookie_len = 0;
  1676. return 0;
  1677. }
  1678. if (opt_len < 8 || opt_len > (int)member_size(struct dns_opt_cookie, server_cookie)) {
  1679. return -1;
  1680. }
  1681. memcpy(cookie->server_cookie, context->ptr, opt_len);
  1682. cookie->server_cookie_len = opt_len;
  1683. context->ptr += opt_len;
  1684. tlog(TLOG_DEBUG, "OPT COOKIE");
  1685. return 0;
  1686. }
  1687. static int _dns_decode_opt_tcp_keepalive(struct dns_context *context, unsigned short *timeout, int opt_len)
  1688. {
  1689. if (opt_len == 0) {
  1690. *timeout = 0;
  1691. return 0;
  1692. }
  1693. if (opt_len < (int)sizeof(unsigned short)) {
  1694. return -1;
  1695. }
  1696. *timeout = _dns_read_short(&context->ptr);
  1697. tlog(TLOG_DEBUG, "OPT TCP KEEPALIVE %u", *timeout);
  1698. return 0;
  1699. }
  1700. static int _dns_encode_OPT(struct dns_context *context, struct dns_rrs *rrs)
  1701. {
  1702. int ret = 0;
  1703. int opt_code = 0;
  1704. int qclass = 0;
  1705. char domain[DNS_MAX_CNAME_LEN];
  1706. struct dns_context data_context;
  1707. int rr_len = 0;
  1708. int ttl = 0;
  1709. struct dns_opt *dns_opt = NULL;
  1710. _dns_init_context_by_rrs(rrs, &data_context);
  1711. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &opt_code, &qclass, &ttl, &rr_len);
  1712. if (ret < 0) {
  1713. return -1;
  1714. }
  1715. if (rr_len < (int)sizeof(*dns_opt)) {
  1716. return -1;
  1717. }
  1718. if (_dns_left_len(context) < (rr_len)) {
  1719. return -1;
  1720. }
  1721. dns_opt = (struct dns_opt *)data_context.ptr;
  1722. _dns_write_short(&context->ptr, dns_opt->code);
  1723. _dns_write_short(&context->ptr, dns_opt->length);
  1724. if (_dns_left_len(context) < dns_opt->length) {
  1725. return -1;
  1726. }
  1727. switch (dns_opt->code) {
  1728. case DNS_OPT_T_ECS: {
  1729. struct dns_opt_ecs *ecs = (struct dns_opt_ecs *)&(dns_opt->data);
  1730. _dns_write_short(&context->ptr, ecs->family);
  1731. _dns_write_char(&context->ptr, ecs->source_prefix);
  1732. _dns_write_char(&context->ptr, ecs->scope_prefix);
  1733. memcpy(context->ptr, ecs->addr, dns_opt->length - 4);
  1734. context->ptr += dns_opt->length - 4;
  1735. } break;
  1736. default:
  1737. memcpy(context->ptr, dns_opt->data, dns_opt->length);
  1738. context->ptr += dns_opt->length;
  1739. break;
  1740. }
  1741. return 0;
  1742. }
  1743. static int _dns_get_opts_data_len(struct dns_packet *packet, struct dns_rrs *rrs, int count)
  1744. {
  1745. int i = 0;
  1746. int len = 0;
  1747. int opt_code = 0;
  1748. int qclass = 0;
  1749. int ttl = 0;
  1750. int ret = 0;
  1751. char domain[DNS_MAX_CNAME_LEN];
  1752. struct dns_context data_context;
  1753. int rr_len = 0;
  1754. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  1755. _dns_init_context_by_rrs(rrs, &data_context);
  1756. ret = _dns_get_rr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &opt_code, &qclass, &ttl, &rr_len);
  1757. if (ret < 0) {
  1758. return -1;
  1759. }
  1760. len += rr_len;
  1761. }
  1762. return len;
  1763. }
  1764. static int _dns_encode_opts(struct dns_packet *packet, struct dns_context *context, struct dns_rrs *rrs, int count)
  1765. {
  1766. int i = 0;
  1767. int len = 0;
  1768. int ret = 0;
  1769. unsigned int rcode = packet->opt_option;
  1770. int rr_len = 0;
  1771. int payloadsize = packet->payloadsize;
  1772. unsigned char *rr_len_ptr = NULL;
  1773. rr_len = _dns_get_opts_data_len(packet, rrs, count);
  1774. if (rr_len < 0) {
  1775. return -1;
  1776. }
  1777. if (payloadsize < DNS_DEFAULT_PACKET_SIZE) {
  1778. payloadsize = DNS_DEFAULT_PACKET_SIZE;
  1779. }
  1780. ret = _dns_encode_rr_head(context, "", DNS_T_OPT, payloadsize, rcode, rr_len, &rr_len_ptr);
  1781. if (ret < 0) {
  1782. return -1;
  1783. }
  1784. if (_dns_left_len(context) < rr_len) {
  1785. return -1;
  1786. }
  1787. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  1788. len = _dns_encode_OPT(context, rrs);
  1789. if (len < 0) {
  1790. return -1;
  1791. }
  1792. }
  1793. return 0;
  1794. }
  1795. static int _dns_decode_opt(struct dns_context *context, dns_rr_type type, unsigned int ttl, int rr_len)
  1796. {
  1797. unsigned short opt_code = 0;
  1798. unsigned short opt_len = 0;
  1799. unsigned short errcode = (ttl >> 16) & 0xFFFF;
  1800. unsigned short ever = (ttl) & 0xFFFF;
  1801. unsigned char *start = context->ptr;
  1802. struct dns_packet *packet = context->packet;
  1803. int ret = 0;
  1804. UNUSED(ever);
  1805. /*
  1806. Field Name Field Type Description
  1807. ------------------------------------------------------
  1808. NAME domain name empty (root domain)
  1809. TYPE u_int16_t OPT
  1810. CLASS u_int16_t sender's UDP payload size
  1811. TTL u_int32_t extended RCODE and flags
  1812. RDLEN u_int16_t describes RDATA
  1813. RDATA octet stream {attribute,value} pairs
  1814. +0 (MSB) +1 (LSB)
  1815. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1816. 0: | OPTION-CODE |
  1817. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1818. 2: | OPTION-LENGTH |
  1819. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1820. 4: | |
  1821. / OPTION-DATA /
  1822. / /
  1823. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1824. TTL
  1825. +0 (MSB) +1 (LSB)
  1826. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1827. 0: | EXTENDED-RCODE | VERSION |
  1828. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1829. 2: | Z |
  1830. +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  1831. */
  1832. if (rr_len < 0) {
  1833. tlog(TLOG_DEBUG, "opt len is invalid.");
  1834. return -1;
  1835. }
  1836. if (errcode != 0) {
  1837. tlog(TLOG_DEBUG, "extend rcode invalid, %d", errcode);
  1838. return 0;
  1839. }
  1840. while (context->ptr - start < rr_len) {
  1841. if (_dns_left_len(context) < 4) {
  1842. tlog(TLOG_DEBUG, "data length is invalid, %d:%d", _dns_left_len(context),
  1843. (int)(context->ptr - context->data));
  1844. return -1;
  1845. }
  1846. opt_code = _dns_read_short(&context->ptr);
  1847. opt_len = _dns_read_short(&context->ptr);
  1848. if (_dns_left_len(context) < opt_len) {
  1849. tlog(TLOG_DEBUG, "read opt data failed, opt_code = %d, opt_len = %d", opt_code, opt_len);
  1850. return -1;
  1851. }
  1852. tlog(TLOG_DEBUG, "opt type %d", opt_code);
  1853. switch (opt_code) {
  1854. case DNS_OPT_T_ECS: {
  1855. struct dns_opt_ecs ecs;
  1856. ret = _dns_decode_opt_ecs(context, &ecs, opt_len);
  1857. if (ret != 0) {
  1858. tlog(TLOG_ERROR, "decode ecs failed.");
  1859. return -1;
  1860. }
  1861. ret = dns_add_OPT_ECS(packet, &ecs);
  1862. if (ret != 0) {
  1863. tlog(TLOG_ERROR, "add ecs failed.");
  1864. return -1;
  1865. }
  1866. } break;
  1867. case DNS_OPT_T_COOKIE: {
  1868. struct dns_opt_cookie cookie;
  1869. ret = _dns_decode_opt_cookie(context, &cookie, opt_len);
  1870. if (ret != 0) {
  1871. tlog(TLOG_ERROR, "decode cookie failed.");
  1872. return -1;
  1873. }
  1874. } break;
  1875. case DNS_OPT_T_TCP_KEEPALIVE: {
  1876. unsigned short timeout = 0;
  1877. ret = _dns_decode_opt_tcp_keepalive(context, &timeout, opt_len);
  1878. if (ret != 0) {
  1879. tlog(TLOG_ERROR, "decode tcp keepalive failed.");
  1880. return -1;
  1881. }
  1882. ret = dns_add_OPT_TCP_KEEPALIVE(packet, timeout);
  1883. if (ret != 0) {
  1884. tlog(TLOG_ERROR, "add tcp keepalive failed.");
  1885. return -1;
  1886. }
  1887. } break;
  1888. case DNS_OPT_T_PADDING:
  1889. context->ptr += opt_len;
  1890. break;
  1891. default:
  1892. context->ptr += opt_len;
  1893. tlog(TLOG_DEBUG, "DNS opt type = %d not supported", opt_code);
  1894. break;
  1895. }
  1896. }
  1897. return 0;
  1898. }
  1899. static int _dns_encode_HTTPS(struct dns_context *context, struct dns_rrs *rrs)
  1900. {
  1901. int ret = 0;
  1902. int qtype = 0;
  1903. int qclass = 0;
  1904. char domain[DNS_MAX_CNAME_LEN];
  1905. char target[DNS_MAX_CNAME_LEN] = {0};
  1906. unsigned char *rr_len_ptr = NULL;
  1907. unsigned char *start = NULL;
  1908. unsigned char *rr_start = NULL;
  1909. int ttl = 0;
  1910. int priority = 0;
  1911. struct dns_https_param *param = NULL;
  1912. ret =
  1913. dns_get_HTTPS_svcparm_start(rrs, &param, domain, DNS_MAX_CNAME_LEN, &ttl, &priority, target, DNS_MAX_CNAME_LEN);
  1914. if (ret < 0) {
  1915. tlog(TLOG_DEBUG, "get https param failed.");
  1916. return 0;
  1917. }
  1918. qtype = DNS_T_HTTPS;
  1919. qclass = DNS_C_IN;
  1920. ret = _dns_encode_rr_head(context, domain, qtype, qclass, ttl, 0, &rr_len_ptr);
  1921. if (ret < 0) {
  1922. return -1;
  1923. }
  1924. rr_start = context->ptr;
  1925. if (_dns_left_len(context) < 2) {
  1926. tlog(TLOG_ERROR, "left len is invalid.");
  1927. return -1;
  1928. }
  1929. _dns_write_short(&context->ptr, priority);
  1930. ret = _dns_encode_domain(context, target);
  1931. if (ret < 0) {
  1932. return -1;
  1933. }
  1934. start = context->ptr;
  1935. for (; param != NULL; param = dns_get_HTTPS_svcparm_next(rrs, param)) {
  1936. if (context->ptr - start > rrs->len || _dns_left_len(context) <= 0) {
  1937. return -1;
  1938. }
  1939. if (param->len + 4 > _dns_left_len(context)) {
  1940. return -1;
  1941. }
  1942. _dns_write_short(&context->ptr, param->key);
  1943. _dns_write_short(&context->ptr, param->len);
  1944. switch (param->key) {
  1945. case DNS_HTTPS_T_MANDATORY:
  1946. case DNS_HTTPS_T_NO_DEFAULT_ALPN:
  1947. case DNS_HTTPS_T_ALPN:
  1948. case DNS_HTTPS_T_PORT:
  1949. case DNS_HTTPS_T_IPV4HINT:
  1950. case DNS_HTTPS_T_ECH:
  1951. case DNS_HTTPS_T_IPV6HINT: {
  1952. memcpy(context->ptr, param->value, param->len);
  1953. context->ptr += param->len;
  1954. } break;
  1955. default:
  1956. /* skip unknown key */
  1957. context->ptr -= 4;
  1958. break;
  1959. }
  1960. }
  1961. if (_dns_left_len(context) < 2) {
  1962. return -1;
  1963. }
  1964. _dns_write_short(&rr_len_ptr, context->ptr - rr_start);
  1965. return 0;
  1966. }
  1967. static int _dns_decode_HTTPS(struct dns_context *context, const char *domain, dns_rr_type type, unsigned int ttl,
  1968. int rr_len)
  1969. {
  1970. unsigned char *start = context->ptr;
  1971. struct dns_packet *packet = context->packet;
  1972. int ret = 0;
  1973. unsigned short priority;
  1974. unsigned short key;
  1975. unsigned short value_len;
  1976. unsigned char *value = NULL;
  1977. char target[DNS_MAX_CNAME_LEN] = {0};
  1978. struct dns_rr_nested param;
  1979. if (rr_len < 2) {
  1980. tlog(TLOG_DEBUG, "https len is invalid.");
  1981. return -1;
  1982. }
  1983. priority = _dns_read_short(&context->ptr);
  1984. ret = _dns_decode_domain(context, target, sizeof(target));
  1985. if (ret < 0) {
  1986. return -1;
  1987. }
  1988. dns_add_HTTPS_start(&param, packet, DNS_RRS_AN, domain, ttl, priority, target);
  1989. while (context->ptr - start < rr_len) {
  1990. if (_dns_left_len(context) < 4) {
  1991. tlog(TLOG_WARN, "data length is invalid, %d:%d", _dns_left_len(context),
  1992. (int)(context->ptr - context->data));
  1993. return -1;
  1994. }
  1995. key = _dns_read_short(&context->ptr);
  1996. value_len = _dns_read_short(&context->ptr);
  1997. value = context->ptr;
  1998. if (_dns_left_len(context) < value_len) {
  1999. tlog(TLOG_ERROR, "read https data failed, svcParam key = %d, https_len = %d", key, value_len);
  2000. return -1;
  2001. }
  2002. switch (key) {
  2003. case DNS_HTTPS_T_MANDATORY:
  2004. case DNS_HTTPS_T_ALPN:
  2005. case DNS_HTTPS_T_NO_DEFAULT_ALPN:
  2006. case DNS_HTTPS_T_PORT:
  2007. case DNS_HTTPS_T_IPV4HINT:
  2008. case DNS_HTTPS_T_ECH:
  2009. case DNS_HTTPS_T_IPV6HINT: {
  2010. dns_HTTPS_add_raw(&param, key, value, value_len);
  2011. } break;
  2012. default:
  2013. tlog(TLOG_DEBUG, "DNS HTTPS key = %d not supported", key);
  2014. break;
  2015. }
  2016. context->ptr += value_len;
  2017. }
  2018. dns_add_HTTPS_end(&param);
  2019. return 0;
  2020. }
  2021. static int _dns_decode_qd(struct dns_context *context)
  2022. {
  2023. struct dns_packet *packet = context->packet;
  2024. int len = 0;
  2025. int qtype = 0;
  2026. int qclass = 0;
  2027. char domain[DNS_MAX_CNAME_LEN];
  2028. len = _dns_decode_qr_head(context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass);
  2029. if (len < 0) {
  2030. return -1;
  2031. }
  2032. len = dns_add_domain(packet, domain, qtype, qclass);
  2033. if (len < 0) {
  2034. return -1;
  2035. }
  2036. return 0;
  2037. }
  2038. static int _dns_decode_an(struct dns_context *context, dns_rr_type type)
  2039. {
  2040. int ret = 0;
  2041. int qtype = 0;
  2042. int qclass = 0;
  2043. int ttl = 0;
  2044. int rr_len = 0;
  2045. char domain[DNS_MAX_CNAME_LEN];
  2046. struct dns_packet *packet = context->packet;
  2047. unsigned char *start = NULL;
  2048. /* decode rr head */
  2049. ret = _dns_decode_rr_head(context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  2050. if (ret < 0 || qclass < 0) {
  2051. tlog(TLOG_DEBUG, "decode head failed.");
  2052. return -1;
  2053. }
  2054. start = context->ptr;
  2055. /* decode answer */
  2056. switch (qtype) {
  2057. case DNS_T_A: {
  2058. unsigned char addr[DNS_RR_A_LEN];
  2059. ret = _dns_decode_raw(context, addr, sizeof(addr));
  2060. if (ret < 0) {
  2061. tlog(TLOG_DEBUG, "decode A failed, %s, len: %d:%d", domain, (int)(context->ptr - context->data),
  2062. _dns_left_len(context));
  2063. return -1;
  2064. }
  2065. ret = dns_add_A(packet, type, domain, ttl, addr);
  2066. if (ret < 0) {
  2067. tlog(TLOG_DEBUG, "add A failed, %s", domain);
  2068. return -1;
  2069. }
  2070. } break;
  2071. case DNS_T_CNAME: {
  2072. char cname[DNS_MAX_CNAME_LEN];
  2073. ret = _dns_decode_CNAME(context, cname, DNS_MAX_CNAME_LEN);
  2074. if (ret < 0) {
  2075. tlog(TLOG_DEBUG, "decode CNAME failed, %s, len: %d:%d", domain, (int)(context->ptr - context->data),
  2076. _dns_left_len(context));
  2077. return -1;
  2078. }
  2079. ret = dns_add_CNAME(packet, type, domain, ttl, cname);
  2080. if (ret < 0) {
  2081. tlog(TLOG_DEBUG, "add CNAME failed, %s", domain);
  2082. return -1;
  2083. }
  2084. } break;
  2085. case DNS_T_SOA: {
  2086. struct dns_soa soa;
  2087. ret = _dns_decode_SOA(context, &soa);
  2088. if (ret < 0) {
  2089. tlog(TLOG_DEBUG, "decode SOA failed, %s", domain);
  2090. return -1;
  2091. }
  2092. ret = dns_add_SOA(packet, type, domain, ttl, &soa);
  2093. if (ret < 0) {
  2094. tlog(TLOG_DEBUG, "add SOA failed, %s", domain);
  2095. return -1;
  2096. }
  2097. } break;
  2098. case DNS_T_NS: {
  2099. char ns[DNS_MAX_CNAME_LEN];
  2100. ret = _dns_decode_CNAME(context, ns, DNS_MAX_CNAME_LEN);
  2101. if (ret < 0) {
  2102. tlog(TLOG_DEBUG, "decode NS failed, %s", domain);
  2103. return -1;
  2104. }
  2105. ret = dns_add_NS(packet, type, domain, ttl, ns);
  2106. if (ret < 0) {
  2107. tlog(TLOG_DEBUG, "add NS failed, %s", domain);
  2108. return -1;
  2109. }
  2110. } break;
  2111. case DNS_T_PTR: {
  2112. char name[DNS_MAX_CNAME_LEN];
  2113. ret = _dns_decode_CNAME(context, name, DNS_MAX_CNAME_LEN);
  2114. if (ret < 0) {
  2115. tlog(TLOG_DEBUG, "decode PTR failed, %s", domain);
  2116. return -1;
  2117. }
  2118. ret = dns_add_PTR(packet, type, domain, ttl, name);
  2119. if (ret < 0) {
  2120. tlog(TLOG_DEBUG, "add PTR failed, %s", domain);
  2121. return -1;
  2122. }
  2123. } break;
  2124. case DNS_T_AAAA: {
  2125. unsigned char addr[DNS_RR_AAAA_LEN];
  2126. ret = _dns_decode_raw(context, addr, sizeof(addr));
  2127. if (ret < 0) {
  2128. tlog(TLOG_DEBUG, "decode AAAA failed, %s", domain);
  2129. return -1;
  2130. }
  2131. ret = dns_add_AAAA(packet, type, domain, ttl, addr);
  2132. if (ret < 0) {
  2133. tlog(TLOG_DEBUG, "add AAAA failed, %s", domain);
  2134. return -1;
  2135. }
  2136. } break;
  2137. case DNS_T_SRV: {
  2138. unsigned short priority = 0;
  2139. unsigned short weight = 0;
  2140. unsigned short port = 0;
  2141. char target[DNS_MAX_CNAME_LEN];
  2142. ret = _dns_decode_SRV(context, &priority, &weight, &port, target, DNS_MAX_CNAME_LEN);
  2143. if (ret < 0) {
  2144. tlog(TLOG_DEBUG, "decode SRV failed, %s", domain);
  2145. return -1;
  2146. }
  2147. ret = dns_add_SRV(packet, type, domain, ttl, priority, weight, port, target);
  2148. if (ret < 0) {
  2149. tlog(TLOG_DEBUG, "add SRV failed, %s", domain);
  2150. return -1;
  2151. }
  2152. } break;
  2153. case DNS_T_OPT: {
  2154. unsigned char *opt_start = context->ptr;
  2155. ret = _dns_decode_opt(context, type, ttl, rr_len);
  2156. if (ret < 0) {
  2157. tlog(TLOG_DEBUG, "decode opt failed, %s", domain);
  2158. return -1;
  2159. }
  2160. if (context->ptr - opt_start != rr_len) {
  2161. tlog(TLOG_DEBUG, "opt length mismatch, %s\n", domain);
  2162. return -1;
  2163. }
  2164. dns_set_OPT_option(packet, ttl);
  2165. dns_set_OPT_payload_size(packet, qclass);
  2166. } break;
  2167. case DNS_T_HTTPS: {
  2168. unsigned char *https_start = context->ptr;
  2169. ret = _dns_decode_HTTPS(context, domain, type, ttl, rr_len);
  2170. if (ret < 0) {
  2171. tlog(TLOG_DEBUG, "decode HTTPS failed, %s", domain);
  2172. return -1;
  2173. }
  2174. if (context->ptr - https_start != rr_len) {
  2175. tlog(TLOG_DEBUG, "opt length mismatch, %s\n", domain);
  2176. return -1;
  2177. }
  2178. } break;
  2179. default: {
  2180. unsigned char raw_data[1024];
  2181. if (_dns_left_len(context) < rr_len || rr_len >= (int)sizeof(raw_data)) {
  2182. tlog(TLOG_DEBUG, "length mismatch\n");
  2183. return -1;
  2184. }
  2185. ret = _dns_decode_raw(context, raw_data, rr_len);
  2186. if (ret < 0) {
  2187. tlog(TLOG_DEBUG, "decode A failed, %s", domain);
  2188. return -1;
  2189. }
  2190. ret = _dns_add_RAW(packet, type, qtype, domain, ttl, raw_data, rr_len);
  2191. if (ret < 0) {
  2192. tlog(TLOG_DEBUG, "add raw failed, %s", domain);
  2193. return -1;
  2194. }
  2195. tlog(TLOG_DEBUG, "DNS type = %d not supported", qtype);
  2196. break;
  2197. }
  2198. }
  2199. if (context->ptr - start != rr_len) {
  2200. tlog(TLOG_DEBUG, "length mismatch, %s, %ld:%d", domain, (long)(context->ptr - start), rr_len);
  2201. return -1;
  2202. }
  2203. return 0;
  2204. }
  2205. static int _dns_encode_qd(struct dns_context *context, struct dns_rrs *rrs)
  2206. {
  2207. int ret = 0;
  2208. int qtype = 0;
  2209. int qclass = 0;
  2210. char domain[DNS_MAX_CNAME_LEN];
  2211. struct dns_context data_context;
  2212. _dns_init_context_by_rrs(rrs, &data_context);
  2213. ret = _dns_get_qr_head(&data_context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass);
  2214. if (ret < 0) {
  2215. return -1;
  2216. }
  2217. ret = _dns_encode_qr_head(context, domain, qtype, qclass);
  2218. if (ret < 0) {
  2219. return -1;
  2220. }
  2221. if (domain[0] == '-') {
  2222. /* for google and cloudflare */
  2223. unsigned char *ptr = context->ptr - 7;
  2224. memcpy(ptr, "\xC0\x12", 2);
  2225. ptr += 2;
  2226. _dns_write_short(&ptr, qtype);
  2227. _dns_write_short(&ptr, qclass);
  2228. context->ptr = ptr;
  2229. }
  2230. return 0;
  2231. }
  2232. static int _dns_encode_an(struct dns_context *context, struct dns_rrs *rrs)
  2233. {
  2234. int ret = 0;
  2235. switch (rrs->type) {
  2236. case DNS_T_A:
  2237. case DNS_T_AAAA: {
  2238. ret = _dns_encode_raw(context, rrs);
  2239. if (ret < 0) {
  2240. return -1;
  2241. }
  2242. } break;
  2243. case DNS_T_CNAME:
  2244. case DNS_T_PTR:
  2245. ret = _dns_encode_CNAME(context, rrs);
  2246. if (ret < 0) {
  2247. return -1;
  2248. }
  2249. break;
  2250. case DNS_T_SOA:
  2251. ret = _dns_encode_SOA(context, rrs);
  2252. if (ret < 0) {
  2253. return -1;
  2254. }
  2255. break;
  2256. case DNS_T_SRV:
  2257. ret = _dns_encode_SRV(context, rrs);
  2258. if (ret < 0) {
  2259. return -1;
  2260. }
  2261. break;
  2262. case DNS_T_HTTPS:
  2263. ret = _dns_encode_HTTPS(context, rrs);
  2264. if (ret < 0) {
  2265. return -1;
  2266. }
  2267. break;
  2268. default:
  2269. ret = _dns_encode_raw(context, rrs);
  2270. if (ret < 0) {
  2271. return -1;
  2272. }
  2273. break;
  2274. }
  2275. return 0;
  2276. }
  2277. static int _dns_decode_body(struct dns_context *context)
  2278. {
  2279. struct dns_packet *packet = context->packet;
  2280. struct dns_head *head = &packet->head;
  2281. int i = 0;
  2282. int ret = 0;
  2283. int count = 0;
  2284. count = head->qdcount;
  2285. head->qdcount = 0;
  2286. for (i = 0; i < count; i++) {
  2287. ret = _dns_decode_qd(context);
  2288. if (ret < 0) {
  2289. tlog(TLOG_DEBUG, "decode qd failed.");
  2290. return -1;
  2291. }
  2292. }
  2293. count = head->ancount;
  2294. head->ancount = 0;
  2295. for (i = 0; i < count; i++) {
  2296. ret = _dns_decode_an(context, DNS_RRS_AN);
  2297. if (ret < 0) {
  2298. tlog(TLOG_DEBUG, "decode an failed.");
  2299. return -1;
  2300. }
  2301. }
  2302. count = head->nscount;
  2303. head->nscount = 0;
  2304. for (i = 0; i < count; i++) {
  2305. ret = _dns_decode_an(context, DNS_RRS_NS);
  2306. if (ret < 0) {
  2307. tlog(TLOG_DEBUG, "decode ns failed.");
  2308. return -1;
  2309. }
  2310. }
  2311. count = head->nrcount;
  2312. head->nrcount = 0;
  2313. for (i = 0; i < count; i++) {
  2314. ret = _dns_decode_an(context, DNS_RRS_NR);
  2315. if (ret < 0) {
  2316. tlog(TLOG_DEBUG, "decode nr failed.");
  2317. return -1;
  2318. }
  2319. }
  2320. return 0;
  2321. }
  2322. static int _dns_encode_body(struct dns_context *context)
  2323. {
  2324. struct dns_packet *packet = context->packet;
  2325. struct dns_head *head = &packet->head;
  2326. int i = 0;
  2327. int len = 0;
  2328. struct dns_rrs *rrs = NULL;
  2329. int count = 0;
  2330. rrs = dns_get_rrs_start(packet, DNS_RRS_QD, &count);
  2331. head->qdcount = count;
  2332. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  2333. len = _dns_encode_qd(context, rrs);
  2334. if (len < 0) {
  2335. return -1;
  2336. }
  2337. }
  2338. rrs = dns_get_rrs_start(packet, DNS_RRS_AN, &count);
  2339. head->ancount = count;
  2340. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  2341. len = _dns_encode_an(context, rrs);
  2342. if (len < 0) {
  2343. return -1;
  2344. }
  2345. }
  2346. rrs = dns_get_rrs_start(packet, DNS_RRS_NS, &count);
  2347. head->nscount = count;
  2348. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  2349. len = _dns_encode_an(context, rrs);
  2350. if (len < 0) {
  2351. return -1;
  2352. }
  2353. }
  2354. rrs = dns_get_rrs_start(packet, DNS_RRS_NR, &count);
  2355. head->nrcount = count;
  2356. for (i = 0; i < count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  2357. len = _dns_encode_an(context, rrs);
  2358. if (len < 0) {
  2359. return -1;
  2360. }
  2361. }
  2362. rrs = dns_get_rrs_start(packet, DNS_RRS_OPT, &count);
  2363. if (count > 0 || packet->payloadsize > 0) {
  2364. len = _dns_encode_opts(packet, context, rrs, count);
  2365. if (len < 0) {
  2366. return -1;
  2367. }
  2368. head->nrcount++;
  2369. }
  2370. return 0;
  2371. }
  2372. int dns_packet_init(struct dns_packet *packet, int size, struct dns_head *head)
  2373. {
  2374. struct dns_head *init_head = &packet->head;
  2375. if (size < (int)sizeof(*packet)) {
  2376. return -1;
  2377. }
  2378. memset(packet, 0, size);
  2379. packet->size = size;
  2380. init_head->id = head->id;
  2381. init_head->qr = head->qr;
  2382. init_head->opcode = head->opcode;
  2383. init_head->aa = head->aa;
  2384. init_head->tc = head->tc;
  2385. init_head->rd = head->rd;
  2386. init_head->ra = head->ra;
  2387. init_head->z = head->z;
  2388. init_head->ad = head->ad;
  2389. init_head->cd = head->cd;
  2390. init_head->rcode = head->rcode;
  2391. packet->questions = DNS_RR_END;
  2392. packet->answers = DNS_RR_END;
  2393. packet->nameservers = DNS_RR_END;
  2394. packet->additional = DNS_RR_END;
  2395. packet->optional = DNS_RR_END;
  2396. packet->optcount = 0;
  2397. packet->payloadsize = 0;
  2398. return 0;
  2399. }
  2400. int dns_decode_head_only(struct dns_packet *packet, int maxsize, unsigned char *data, int size)
  2401. {
  2402. struct dns_head *head = &packet->head;
  2403. struct dns_context context;
  2404. int ret = 0;
  2405. memset(&context, 0, sizeof(context));
  2406. memset(packet, 0, sizeof(*packet));
  2407. context.data = data;
  2408. context.packet = packet;
  2409. context.ptr = data;
  2410. context.maxsize = size;
  2411. context.namedict = &packet->namedict;
  2412. ret = dns_packet_init(packet, maxsize, head);
  2413. if (ret != 0) {
  2414. return -1;
  2415. }
  2416. ret = _dns_decode_head(&context);
  2417. if (ret < 0) {
  2418. return -1;
  2419. }
  2420. packet->size = context.ptr - context.data + sizeof(*packet);
  2421. return 0;
  2422. }
  2423. int dns_decode(struct dns_packet *packet, int maxsize, unsigned char *data, int size)
  2424. {
  2425. struct dns_head *head = &packet->head;
  2426. struct dns_context context;
  2427. int ret = 0;
  2428. memset(&context, 0, sizeof(context));
  2429. memset(packet, 0, sizeof(*packet));
  2430. context.data = data;
  2431. context.packet = packet;
  2432. context.ptr = data;
  2433. context.maxsize = size;
  2434. context.namedict = &packet->namedict;
  2435. ret = dns_packet_init(packet, maxsize, head);
  2436. if (ret != 0) {
  2437. return -1;
  2438. }
  2439. ret = _dns_decode_head(&context);
  2440. if (ret < 0) {
  2441. return -1;
  2442. }
  2443. ret = _dns_decode_body(&context);
  2444. if (ret < 0) {
  2445. tlog(TLOG_DEBUG, "decode body failed.\n");
  2446. return -1;
  2447. }
  2448. packet->size = context.ptr - context.data + sizeof(*packet);
  2449. return 0;
  2450. }
  2451. int dns_encode(unsigned char *data, int size, struct dns_packet *packet)
  2452. {
  2453. int ret = 0;
  2454. struct dns_context context;
  2455. struct dns_packet_dict namedict;
  2456. memset(&context, 0, sizeof(context));
  2457. memset(&namedict, 0, sizeof(namedict));
  2458. context.data = data;
  2459. context.packet = packet;
  2460. context.ptr = data;
  2461. context.maxsize = size;
  2462. context.namedict = &namedict;
  2463. ret = _dns_encode_head(&context);
  2464. if (ret < 0) {
  2465. return -1;
  2466. }
  2467. ret = _dns_encode_body(&context);
  2468. if (ret < 0) {
  2469. return -1;
  2470. }
  2471. ret = _dns_encode_head_count(&context);
  2472. if (ret < 0) {
  2473. return -1;
  2474. }
  2475. return context.ptr - context.data;
  2476. }
  2477. static int _dns_update_an(struct dns_context *context, dns_rr_type type, struct dns_update_param *param)
  2478. {
  2479. int ret = 0;
  2480. int qtype = 0;
  2481. int qclass = 0;
  2482. int ttl = 0;
  2483. int rr_len = 0;
  2484. char domain[DNS_MAX_CNAME_LEN];
  2485. unsigned char *start = NULL;
  2486. /* decode rr head */
  2487. ret = _dns_decode_rr_head(context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass, &ttl, &rr_len);
  2488. if (ret < 0) {
  2489. tlog(TLOG_DEBUG, "decode head failed.");
  2490. return -1;
  2491. }
  2492. start = context->ptr;
  2493. switch (qtype) {
  2494. case DNS_T_OPT:
  2495. break;
  2496. default: {
  2497. unsigned char *ttl_ptr = start - sizeof(int) - sizeof(short);
  2498. if (param->ip_ttl < 0) {
  2499. break;
  2500. }
  2501. _dns_write_int(&ttl_ptr, param->ip_ttl);
  2502. } break;
  2503. }
  2504. context->ptr += rr_len;
  2505. if (context->ptr - start != rr_len) {
  2506. tlog(TLOG_ERROR, "length mismatch , %s, %ld:%d", domain, (long)(context->ptr - start), rr_len);
  2507. return -1;
  2508. }
  2509. return 0;
  2510. }
  2511. static int _dns_update_body(struct dns_context *context, struct dns_update_param *param)
  2512. {
  2513. struct dns_packet *packet = context->packet;
  2514. struct dns_head *head = &packet->head;
  2515. int i = 0;
  2516. int ret = 0;
  2517. int count = 0;
  2518. count = head->qdcount;
  2519. head->qdcount = 0;
  2520. for (i = 0; i < count; i++) {
  2521. char domain[DNS_MAX_CNAME_LEN];
  2522. int qtype = 0;
  2523. int qclass = 0;
  2524. int len = 0;
  2525. len = _dns_decode_qr_head(context, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass);
  2526. if (len < 0) {
  2527. tlog(TLOG_DEBUG, "update qd failed.");
  2528. return -1;
  2529. }
  2530. }
  2531. count = head->ancount;
  2532. head->ancount = 0;
  2533. for (i = 0; i < count; i++) {
  2534. ret = _dns_update_an(context, DNS_RRS_AN, param);
  2535. if (ret < 0) {
  2536. tlog(TLOG_DEBUG, "update an failed.");
  2537. return -1;
  2538. }
  2539. }
  2540. count = head->nscount;
  2541. head->nscount = 0;
  2542. for (i = 0; i < count; i++) {
  2543. ret = _dns_update_an(context, DNS_RRS_NS, param);
  2544. if (ret < 0) {
  2545. tlog(TLOG_DEBUG, "update ns failed.");
  2546. return -1;
  2547. }
  2548. }
  2549. count = head->nrcount;
  2550. head->nrcount = 0;
  2551. for (i = 0; i < count; i++) {
  2552. ret = _dns_update_an(context, DNS_RRS_NR, param);
  2553. if (ret < 0) {
  2554. tlog(TLOG_DEBUG, "update nr failed.");
  2555. return -1;
  2556. }
  2557. }
  2558. return 0;
  2559. }
  2560. static int _dns_update_id(unsigned char *data, int size, struct dns_update_param *param)
  2561. {
  2562. unsigned char *ptr = data;
  2563. _dns_write_short(&ptr, param->id);
  2564. return 0;
  2565. }
  2566. int dns_packet_update(unsigned char *data, int size, struct dns_update_param *param)
  2567. {
  2568. struct dns_packet packet;
  2569. int maxsize = sizeof(packet);
  2570. struct dns_head *head = &packet.head;
  2571. struct dns_context context;
  2572. int ret = 0;
  2573. memset(&context, 0, sizeof(context));
  2574. memset(&packet, 0, sizeof(packet));
  2575. context.data = data;
  2576. context.packet = &packet;
  2577. context.ptr = data;
  2578. context.maxsize = size;
  2579. ret = dns_packet_init(&packet, maxsize, head);
  2580. if (ret != 0) {
  2581. return -1;
  2582. }
  2583. ret = _dns_decode_head(&context);
  2584. if (ret < 0) {
  2585. return -1;
  2586. }
  2587. ret = _dns_update_id(data, size, param);
  2588. if (ret < 0) {
  2589. return -1;
  2590. }
  2591. ret = _dns_update_body(&context, param);
  2592. if (ret < 0) {
  2593. tlog(TLOG_DEBUG, "decode body failed.\n");
  2594. return -1;
  2595. }
  2596. return 0;
  2597. }