ns_turn_msg.c 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593
  1. /*
  2. * Copyright (C) 2011, 2012, 2013 Citrix Systems
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * 3. Neither the name of the project nor the names of its contributors
  15. * may be used to endorse or promote products derived from this software
  16. * without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21. * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
  22. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28. * SUCH DAMAGE.
  29. */
  30. #include "ns_turn_msg.h"
  31. #include "ns_turn_msg_addr.h"
  32. ///////////// Security functions implementation from ns_turn_msg.h ///////////
  33. #include <openssl/md5.h>
  34. #include <openssl/hmac.h>
  35. #include <openssl/ssl.h>
  36. #include <openssl/err.h>
  37. #include <openssl/rand.h>
  38. ///////////
  39. #include <stdlib.h>
  40. ///////////
  41. static void generate_random_nonce(unsigned char *nonce, size_t sz);
  42. ///////////
  43. int stun_method_str(u16bits method, char *smethod)
  44. {
  45. int ret = 0;
  46. const char* s = "UNKNOWN";
  47. switch(method) {
  48. case STUN_METHOD_BINDING:
  49. s = "BINDING";
  50. break;
  51. case STUN_METHOD_ALLOCATE:
  52. s = "ALLOCATE";
  53. break;
  54. case STUN_METHOD_REFRESH:
  55. s = "REFRESH";
  56. break;
  57. case STUN_METHOD_SEND:
  58. s = "SEND";
  59. break;
  60. case STUN_METHOD_DATA:
  61. s = "DATA";
  62. break;
  63. case STUN_METHOD_CREATE_PERMISSION:
  64. s = "CREATE_PERMISSION";
  65. break;
  66. case STUN_METHOD_CHANNEL_BIND:
  67. s = "CHANNEL_BIND";
  68. break;
  69. case STUN_METHOD_CONNECT:
  70. s = "CONNECT";
  71. break;
  72. case STUN_METHOD_CONNECTION_BIND:
  73. s = "CONNECTION_BIND";
  74. break;
  75. case STUN_METHOD_CONNECTION_ATTEMPT:
  76. s = "CONNECTION_ATTEMPT";
  77. break;
  78. default:
  79. ret = -1;
  80. };
  81. if(smethod) {
  82. ns_bcopy(s,smethod,strlen(s)+1);
  83. }
  84. return ret;
  85. }
  86. long turn_random(void)
  87. {
  88. long ret = 0;
  89. if(!RAND_bytes((unsigned char *)&ret,sizeof(ret)))
  90. ret = random();
  91. return ret;
  92. }
  93. static void turn_random_tid_size(void *id)
  94. {
  95. u32bits *ar=(u32bits*)id;
  96. if(!RAND_pseudo_bytes((unsigned char *)ar,12)) {
  97. size_t i;
  98. for(i=0;i<3;++i) {
  99. ar[i] = (u32bits)random();
  100. }
  101. }
  102. }
  103. int stun_calculate_hmac(const u08bits *buf, size_t len, const u08bits *key, size_t keylen, u08bits *hmac, unsigned int *hmac_len, SHATYPE shatype)
  104. {
  105. ERR_clear_error();
  106. UNUSED_ARG(shatype);
  107. if(shatype == SHATYPE_SHA256) {
  108. #if !defined(OPENSSL_NO_SHA256) && defined(SHA256_DIGEST_LENGTH)
  109. if (!HMAC(EVP_sha256(), key, keylen, buf, len, hmac, hmac_len)) {
  110. return -1;
  111. }
  112. #else
  113. fprintf(stderr,"SHA256 is not supported\n");
  114. return -1;
  115. #endif
  116. } else if(shatype == SHATYPE_SHA384) {
  117. #if !defined(OPENSSL_NO_SHA384) && defined(SHA384_DIGEST_LENGTH)
  118. if (!HMAC(EVP_sha384(), key, keylen, buf, len, hmac, hmac_len)) {
  119. return -1;
  120. }
  121. #else
  122. fprintf(stderr,"SHA384 is not supported\n");
  123. return -1;
  124. #endif
  125. } else if(shatype == SHATYPE_SHA512) {
  126. #if !defined(OPENSSL_NO_SHA512) && defined(SHA512_DIGEST_LENGTH)
  127. if (!HMAC(EVP_sha512(), key, keylen, buf, len, hmac, hmac_len)) {
  128. return -1;
  129. }
  130. #else
  131. fprintf(stderr,"SHA512 is not supported\n");
  132. return -1;
  133. #endif
  134. } else
  135. if (!HMAC(EVP_sha1(), key, keylen, buf, len, hmac, hmac_len)) {
  136. return -1;
  137. }
  138. return 0;
  139. }
  140. int stun_produce_integrity_key_str(u08bits *uname, u08bits *realm, u08bits *upwd, hmackey_t key, SHATYPE shatype)
  141. {
  142. ERR_clear_error();
  143. UNUSED_ARG(shatype);
  144. size_t ulen = strlen((s08bits*)uname);
  145. size_t rlen = strlen((s08bits*)realm);
  146. size_t plen = strlen((s08bits*)upwd);
  147. size_t sz = ulen+1+rlen+1+plen+1+10;
  148. size_t strl = ulen+1+rlen+1+plen;
  149. u08bits *str = (u08bits*)turn_malloc(sz+1);
  150. strncpy((s08bits*)str,(s08bits*)uname,sz);
  151. str[ulen]=':';
  152. strncpy((s08bits*)str+ulen+1,(s08bits*)realm,sz-ulen-1);
  153. str[ulen+1+rlen]=':';
  154. strncpy((s08bits*)str+ulen+1+rlen+1,(s08bits*)upwd,sz-ulen-1-rlen-1);
  155. str[strl]=0;
  156. if(shatype == SHATYPE_SHA256) {
  157. #if !defined(OPENSSL_NO_SHA256) && defined(SHA256_DIGEST_LENGTH)
  158. unsigned int keylen = 0;
  159. EVP_MD_CTX ctx;
  160. EVP_DigestInit(&ctx,EVP_sha256());
  161. EVP_DigestUpdate(&ctx,str,strl);
  162. EVP_DigestFinal(&ctx,key,&keylen);
  163. EVP_MD_CTX_cleanup(&ctx);
  164. #else
  165. fprintf(stderr,"SHA256 is not supported\n");
  166. return -1;
  167. #endif
  168. } else if(shatype == SHATYPE_SHA384) {
  169. #if !defined(OPENSSL_NO_SHA384) && defined(SHA384_DIGEST_LENGTH)
  170. unsigned int keylen = 0;
  171. EVP_MD_CTX ctx;
  172. EVP_DigestInit(&ctx,EVP_sha384());
  173. EVP_DigestUpdate(&ctx,str,strl);
  174. EVP_DigestFinal(&ctx,key,&keylen);
  175. EVP_MD_CTX_cleanup(&ctx);
  176. #else
  177. fprintf(stderr,"SHA384 is not supported\n");
  178. return -1;
  179. #endif
  180. } else if(shatype == SHATYPE_SHA512) {
  181. #if !defined(OPENSSL_NO_SHA512) && defined(SHA512_DIGEST_LENGTH)
  182. unsigned int keylen = 0;
  183. EVP_MD_CTX ctx;
  184. EVP_DigestInit(&ctx,EVP_sha512());
  185. EVP_DigestUpdate(&ctx,str,strl);
  186. EVP_DigestFinal(&ctx,key,&keylen);
  187. EVP_MD_CTX_cleanup(&ctx);
  188. #else
  189. fprintf(stderr,"SHA512 is not supported\n");
  190. return -1;
  191. #endif
  192. } else {
  193. MD5_CTX ctx;
  194. MD5_Init(&ctx);
  195. MD5_Update(&ctx,str,strl);
  196. MD5_Final(key,&ctx);
  197. }
  198. turn_free(str,sz+1);
  199. return 0;
  200. }
  201. #define PWD_SALT_SIZE (8)
  202. static void readable_string(unsigned char *orig, unsigned char *out, size_t sz)
  203. {
  204. size_t i = 0;
  205. out[0]=0;
  206. for(i = 0; i < sz; ++i) {
  207. sprintf((char*)(out + (i * 2)), "%02x", (unsigned int)orig[i]);
  208. }
  209. }
  210. static void generate_enc_password(const char* pwd, char *result, const unsigned char *orig_salt)
  211. {
  212. unsigned char salt[PWD_SALT_SIZE+1];
  213. if(!orig_salt) {
  214. generate_random_nonce(salt, PWD_SALT_SIZE);
  215. } else {
  216. ns_bcopy(orig_salt,salt,PWD_SALT_SIZE);
  217. salt[PWD_SALT_SIZE]=0;
  218. }
  219. unsigned char rsalt[PWD_SALT_SIZE*2+1];
  220. readable_string(salt,rsalt,PWD_SALT_SIZE);
  221. result[0]='$';
  222. result[1]='5';
  223. result[2]='$';
  224. ns_bcopy((char*)rsalt,result+3,PWD_SALT_SIZE+PWD_SALT_SIZE);
  225. result[3+PWD_SALT_SIZE+PWD_SALT_SIZE]='$';
  226. unsigned char* out = (unsigned char*)(result+3+PWD_SALT_SIZE+PWD_SALT_SIZE+1);
  227. {
  228. EVP_MD_CTX ctx;
  229. #if !defined(OPENSSL_NO_SHA256) && defined(SHA256_DIGEST_LENGTH)
  230. EVP_DigestInit(&ctx,EVP_sha256());
  231. #else
  232. EVP_DigestInit(&ctx,EVP_sha1());
  233. #endif
  234. EVP_DigestUpdate(&ctx,salt,PWD_SALT_SIZE);
  235. EVP_DigestUpdate(&ctx,pwd,strlen(pwd));
  236. {
  237. unsigned char hash[129];
  238. unsigned int keylen = 0;
  239. EVP_DigestFinal(&ctx,hash,&keylen);
  240. readable_string(hash,out,keylen);
  241. }
  242. EVP_MD_CTX_cleanup(&ctx);
  243. }
  244. }
  245. void generate_new_enc_password(const char* pwd, char *result)
  246. {
  247. generate_enc_password(pwd, result, NULL);
  248. }
  249. static int encrypted_password(const char* pin, unsigned char* salt)
  250. {
  251. size_t min_len = 3+PWD_SALT_SIZE+PWD_SALT_SIZE+1+32;
  252. if(strlen(pin)>=min_len) {
  253. if((pin[0]=='$') && (pin[1]=='5') && (pin[2]=='$') && (pin[3+PWD_SALT_SIZE+PWD_SALT_SIZE]=='$')) {
  254. size_t i = 0;
  255. for(i=0;i<PWD_SALT_SIZE;++i) {
  256. const char* c = pin+3+i+i;
  257. char sc[3];
  258. sc[0]=c[0];
  259. sc[1]=c[1];
  260. sc[2]=0;
  261. salt[i] = (unsigned char)strtoul(sc,NULL,16);
  262. }
  263. return 1;
  264. }
  265. }
  266. return 0;
  267. }
  268. int check_password(const char* pin, const char* pwd)
  269. {
  270. unsigned char salt[PWD_SALT_SIZE];
  271. if(!encrypted_password(pwd,salt)) {
  272. return strcmp(pin,pwd);
  273. }
  274. char enc_pin[257];
  275. generate_enc_password(pin, enc_pin, salt);
  276. return strcmp(enc_pin,pwd);
  277. }
  278. /////////////////////////////////////////////////////////////////
  279. static u32bits ns_crc32(const u08bits *buffer, u32bits len);
  280. void print_hmac(const char *name, const void *s, size_t len);
  281. /////////////////////////////////////////////////////////////////
  282. int stun_get_command_message_len_str(const u08bits* buf, size_t len)
  283. {
  284. if (len < STUN_HEADER_LENGTH)
  285. return -1;
  286. return (int) (nswap16(((const u16bits*)(buf))[1]) + STUN_HEADER_LENGTH);
  287. }
  288. static int stun_set_command_message_len_str(u08bits* buf, int len) {
  289. if(len<STUN_HEADER_LENGTH) return -1;
  290. ((u16bits*)buf)[1]=nswap16((u16bits)(len-STUN_HEADER_LENGTH));
  291. return 0;
  292. }
  293. /////////// Low-level binary //////////////////////////////////////////////
  294. u16bits stun_make_type(u16bits method) {
  295. method = method & 0x0FFF;
  296. return ((method & 0x000F) | ((method & 0x0070)<<1) |
  297. ((method & 0x0380)<<2) | ((method & 0x0C00)<<2));
  298. }
  299. u16bits stun_get_method_str(const u08bits *buf, size_t len) {
  300. if(!buf || len<2) return (u16bits)-1;
  301. u16bits tt = nswap16(((const u16bits*)buf)[0]);
  302. return (tt & 0x000F) | ((tt & 0x00E0)>>1) |
  303. ((tt & 0x0E00)>>2) | ((tt & 0x3000)>>2);
  304. }
  305. u16bits stun_get_msg_type_str(const u08bits *buf, size_t len) {
  306. if(!buf || len<2) return (u16bits)-1;
  307. return ((nswap16(((const u16bits*)buf)[0])) & 0x3FFF);
  308. }
  309. int is_channel_msg_str(const u08bits* buf, size_t blen) {
  310. return (buf && blen>=4 && STUN_VALID_CHANNEL(nswap16(((const u16bits*)buf)[0])));
  311. }
  312. /////////////// message types /////////////////////////////////
  313. int stun_is_command_message_str(const u08bits* buf, size_t blen)
  314. {
  315. if (buf && blen >= STUN_HEADER_LENGTH) {
  316. if (!STUN_VALID_CHANNEL(nswap16(((const u16bits*)buf)[0]))) {
  317. if ((((u08bits) buf[0]) & ((u08bits) (0xC0))) == 0) {
  318. if (nswap32(((const u32bits*)(buf))[1])
  319. == STUN_MAGIC_COOKIE) {
  320. u16bits len = nswap16(((const u16bits*)(buf))[1]);
  321. if ((len & 0x0003) == 0) {
  322. if ((size_t) (len + STUN_HEADER_LENGTH) == blen) {
  323. return 1;
  324. }
  325. }
  326. }
  327. }
  328. }
  329. }
  330. return 0;
  331. }
  332. int old_stun_is_command_message_str(const u08bits* buf, size_t blen, u32bits *cookie)
  333. {
  334. if (buf && blen >= STUN_HEADER_LENGTH) {
  335. if (!STUN_VALID_CHANNEL(nswap16(((const u16bits*)buf)[0]))) {
  336. if ((((u08bits) buf[0]) & ((u08bits) (0xC0))) == 0) {
  337. if (nswap32(((const u32bits*)(buf))[1])
  338. != STUN_MAGIC_COOKIE) {
  339. u16bits len = nswap16(((const u16bits*)(buf))[1]);
  340. if ((len & 0x0003) == 0) {
  341. if ((size_t) (len + STUN_HEADER_LENGTH) == blen) {
  342. *cookie = nswap32(((const u32bits*)(buf))[1]);
  343. return 1;
  344. }
  345. }
  346. }
  347. }
  348. }
  349. }
  350. return 0;
  351. }
  352. int stun_is_command_message_full_check_str(const u08bits* buf, size_t blen, int must_check_fingerprint, int *fingerprint_present) {
  353. if(!stun_is_command_message_str(buf,blen))
  354. return 0;
  355. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf, blen, STUN_ATTRIBUTE_FINGERPRINT);
  356. if(!sar) {
  357. if(fingerprint_present)
  358. *fingerprint_present = 0;
  359. if(stun_get_method_str(buf,blen) == STUN_METHOD_BINDING) {
  360. return 1;
  361. }
  362. return !must_check_fingerprint;
  363. }
  364. if(stun_attr_get_len(sar) != 4)
  365. return 0;
  366. const u32bits* fingerprint = (const u32bits*)stun_attr_get_value(sar);
  367. if(!fingerprint)
  368. return !must_check_fingerprint;
  369. u32bits crc32len = (u32bits)((((const u08bits*)fingerprint)-buf)-4);
  370. int ret = (*fingerprint == nswap32(ns_crc32(buf,crc32len) ^ ((u32bits)0x5354554e)));
  371. if(ret && fingerprint_present)
  372. *fingerprint_present = ret;
  373. return ret;
  374. }
  375. int stun_is_command_message_offset_str(const u08bits* buf, size_t blen, int offset) {
  376. return stun_is_command_message_str(buf + offset, blen);
  377. }
  378. int stun_is_request_str(const u08bits* buf, size_t len) {
  379. if(is_channel_msg_str(buf,len)) return 0;
  380. return IS_STUN_REQUEST(stun_get_msg_type_str(buf,len));
  381. }
  382. int stun_is_success_response_str(const u08bits* buf, size_t len) {
  383. if(is_channel_msg_str(buf,len)) return 0;
  384. return IS_STUN_SUCCESS_RESP(stun_get_msg_type_str(buf,len));
  385. }
  386. int stun_is_error_response_str(const u08bits* buf, size_t len, int *err_code, u08bits *err_msg, size_t err_msg_size) {
  387. if(is_channel_msg_str(buf,len)) return 0;
  388. if(IS_STUN_ERR_RESP(stun_get_msg_type_str(buf,len))) {
  389. if(err_code) {
  390. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf, len, STUN_ATTRIBUTE_ERROR_CODE);
  391. if(sar) {
  392. if(stun_attr_get_len(sar)>=4) {
  393. const u08bits* val = (const u08bits*)stun_attr_get_value(sar);
  394. *err_code=(int)(val[2]*100 + val[3]);
  395. if(err_msg && err_msg_size>0) {
  396. err_msg[0]=0;
  397. if(stun_attr_get_len(sar)>4) {
  398. size_t msg_len = stun_attr_get_len(sar) - 4;
  399. if(msg_len>(err_msg_size-1))
  400. msg_len=err_msg_size - 1;
  401. ns_bcopy(val+4, err_msg, msg_len);
  402. err_msg[msg_len]=0;
  403. }
  404. }
  405. }
  406. }
  407. }
  408. return 1;
  409. }
  410. return 0;
  411. }
  412. int stun_is_challenge_response_str(const u08bits* buf, size_t len, int *err_code, u08bits *err_msg, size_t err_msg_size,
  413. u08bits *realm, u08bits *nonce, u08bits *server_name, int *oauth)
  414. {
  415. int ret = stun_is_error_response_str(buf, len, err_code, err_msg, err_msg_size);
  416. if(ret && (((*err_code) == 401) || ((*err_code) == 438) )) {
  417. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf,len,STUN_ATTRIBUTE_REALM);
  418. if(sar) {
  419. int found_oauth = 0;
  420. const u08bits *value = stun_attr_get_value(sar);
  421. if(value) {
  422. size_t vlen = (size_t)stun_attr_get_len(sar);
  423. ns_bcopy(value,realm,vlen);
  424. realm[vlen]=0;
  425. {
  426. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf,len,STUN_ATTRIBUTE_THIRD_PARTY_AUTHORIZATION);
  427. if(sar) {
  428. const u08bits *value = stun_attr_get_value(sar);
  429. if(value) {
  430. size_t vlen = (size_t)stun_attr_get_len(sar);
  431. if(vlen>0) {
  432. if(server_name) {
  433. ns_bcopy(value,server_name,vlen);
  434. }
  435. found_oauth = 1;
  436. }
  437. }
  438. }
  439. }
  440. sar = stun_attr_get_first_by_type_str(buf,len,STUN_ATTRIBUTE_NONCE);
  441. if(sar) {
  442. value = stun_attr_get_value(sar);
  443. if(value) {
  444. vlen = (size_t)stun_attr_get_len(sar);
  445. ns_bcopy(value,nonce,vlen);
  446. nonce[vlen]=0;
  447. if(oauth) {
  448. *oauth = found_oauth;
  449. }
  450. return 1;
  451. }
  452. }
  453. }
  454. }
  455. }
  456. return 0;
  457. }
  458. int stun_is_response_str(const u08bits* buf, size_t len) {
  459. if(is_channel_msg_str(buf,len)) return 0;
  460. if(IS_STUN_SUCCESS_RESP(stun_get_msg_type_str(buf,len))) return 1;
  461. if(IS_STUN_ERR_RESP(stun_get_msg_type_str(buf,len))) return 1;
  462. return 0;
  463. }
  464. int stun_is_indication_str(const u08bits* buf, size_t len) {
  465. if(is_channel_msg_str(buf,len)) return 0;
  466. return IS_STUN_INDICATION(stun_get_msg_type_str(buf,len));
  467. }
  468. u16bits stun_make_request(u16bits method) {
  469. return GET_STUN_REQUEST(stun_make_type(method));
  470. }
  471. u16bits stun_make_indication(u16bits method) {
  472. return GET_STUN_INDICATION(stun_make_type(method));
  473. }
  474. u16bits stun_make_success_response(u16bits method) {
  475. return GET_STUN_SUCCESS_RESP(stun_make_type(method));
  476. }
  477. u16bits stun_make_error_response(u16bits method) {
  478. return GET_STUN_ERR_RESP(stun_make_type(method));
  479. }
  480. //////////////// INIT ////////////////////////////////////////////
  481. void stun_init_buffer_str(u08bits *buf, size_t *len) {
  482. *len=STUN_HEADER_LENGTH;
  483. ns_bzero(buf,*len);
  484. }
  485. void stun_init_command_str(u16bits message_type, u08bits* buf, size_t *len) {
  486. stun_init_buffer_str(buf,len);
  487. message_type &= (u16bits)(0x3FFF);
  488. ((u16bits*)buf)[0]=nswap16(message_type);
  489. ((u16bits*)buf)[1]=0;
  490. ((u32bits*)buf)[1]=nswap32(STUN_MAGIC_COOKIE);
  491. stun_tid_generate_in_message_str(buf,NULL);
  492. }
  493. void old_stun_init_command_str(u16bits message_type, u08bits* buf, size_t *len, u32bits cookie) {
  494. stun_init_buffer_str(buf,len);
  495. message_type &= (u16bits)(0x3FFF);
  496. ((u16bits*)buf)[0]=nswap16(message_type);
  497. ((u16bits*)buf)[1]=0;
  498. ((u32bits*)buf)[1]=nswap32(cookie);
  499. stun_tid_generate_in_message_str(buf,NULL);
  500. }
  501. void stun_init_request_str(u16bits method, u08bits* buf, size_t *len) {
  502. stun_init_command_str(stun_make_request(method), buf, len);
  503. }
  504. void stun_init_indication_str(u16bits method, u08bits* buf, size_t *len) {
  505. stun_init_command_str(stun_make_indication(method), buf, len);
  506. }
  507. void stun_init_success_response_str(u16bits method, u08bits* buf, size_t *len, stun_tid* id) {
  508. stun_init_command_str(stun_make_success_response(method), buf, len);
  509. if(id) {
  510. stun_tid_message_cpy(buf, id);
  511. }
  512. }
  513. void old_stun_init_success_response_str(u16bits method, u08bits* buf, size_t *len, stun_tid* id, u32bits cookie) {
  514. old_stun_init_command_str(stun_make_success_response(method), buf, len, cookie);
  515. if(id) {
  516. stun_tid_message_cpy(buf, id);
  517. }
  518. }
  519. const u08bits* get_default_reason(int error_code)
  520. {
  521. const u08bits* reason = (const u08bits *) "Unknown error";
  522. switch (error_code){
  523. case 300:
  524. reason = (const u08bits *) "Try Alternate";
  525. break;
  526. case 400:
  527. reason = (const u08bits *) "Bad Request";
  528. break;
  529. case 401:
  530. reason = (const u08bits *) "Unauthorized";
  531. break;
  532. case 403:
  533. reason = (const u08bits *) "Forbidden";
  534. break;
  535. case 404:
  536. reason = (const u08bits *) "Not Found";
  537. break;
  538. case 420:
  539. reason = (const u08bits *) "Unknown Attribute";
  540. break;
  541. case 437:
  542. reason = (const u08bits *) "Allocation Mismatch";
  543. break;
  544. case 438:
  545. reason = (const u08bits *) "Stale Nonce";
  546. break;
  547. case 440:
  548. reason = (const u08bits *) "Address Family not Supported";
  549. break;
  550. case 441:
  551. reason = (const u08bits *) "Wrong Credentials";
  552. break;
  553. case 442:
  554. reason = (const u08bits *) "Unsupported Transport Protocol";
  555. break;
  556. case 443:
  557. reason = (const u08bits *) "Peer Address Family Mismatch";
  558. break;
  559. case 446:
  560. reason = (const u08bits *) "Connection Already Exists";
  561. break;
  562. case 447:
  563. reason = (const u08bits *) "Connection Timeout or Failure";
  564. break;
  565. case 486:
  566. reason = (const u08bits *) "Allocation Quota Reached";
  567. break;
  568. case 487:
  569. reason = (const u08bits *) "Role Conflict";
  570. break;
  571. case 500:
  572. reason = (const u08bits *) "Server Error";
  573. break;
  574. case 508:
  575. reason = (const u08bits *) "Insufficient Capacity";
  576. break;
  577. default:
  578. ;
  579. };
  580. return reason;
  581. }
  582. static void stun_init_error_response_common_str(u08bits* buf, size_t *len,
  583. u16bits error_code, const u08bits *reason,
  584. stun_tid* id)
  585. {
  586. if (!reason || !strcmp((const char*)reason,"Unknown error")) {
  587. reason = get_default_reason(error_code);
  588. }
  589. u08bits avalue[513];
  590. avalue[0] = 0;
  591. avalue[1] = 0;
  592. avalue[2] = (u08bits) (error_code / 100);
  593. avalue[3] = (u08bits) (error_code % 100);
  594. strncpy((s08bits*) (avalue + 4), (const s08bits*) reason, sizeof(avalue)-4);
  595. avalue[sizeof(avalue)-1]=0;
  596. int alen = 4 + strlen((const s08bits*) (avalue+4));
  597. //"Manual" padding for compatibility with classic old stun:
  598. {
  599. int rem = alen % 4;
  600. if(rem) {
  601. alen +=(4-rem);
  602. }
  603. }
  604. stun_attr_add_str(buf, len, STUN_ATTRIBUTE_ERROR_CODE, (u08bits*) avalue, alen);
  605. if (id) {
  606. stun_tid_message_cpy(buf, id);
  607. }
  608. }
  609. void old_stun_init_error_response_str(u16bits method, u08bits* buf, size_t *len,
  610. u16bits error_code, const u08bits *reason,
  611. stun_tid* id, u32bits cookie)
  612. {
  613. old_stun_init_command_str(stun_make_error_response(method), buf, len, cookie);
  614. stun_init_error_response_common_str(buf, len,
  615. error_code, reason,
  616. id);
  617. }
  618. void stun_init_error_response_str(u16bits method, u08bits* buf, size_t *len,
  619. u16bits error_code, const u08bits *reason,
  620. stun_tid* id)
  621. {
  622. stun_init_command_str(stun_make_error_response(method), buf, len);
  623. stun_init_error_response_common_str(buf, len,
  624. error_code, reason,
  625. id);
  626. }
  627. /////////// CHANNEL ////////////////////////////////////////////////
  628. int stun_init_channel_message_str(u16bits chnumber, u08bits* buf, size_t *len, int length, int do_padding)
  629. {
  630. u16bits rlen = (u16bits)length;
  631. if(length<0 || (MAX_STUN_MESSAGE_SIZE<(4+length))) return -1;
  632. ((u16bits*)(buf))[0]=nswap16(chnumber);
  633. ((u16bits*)(buf))[1]=nswap16((u16bits)length);
  634. if(do_padding && (rlen & 0x0003))
  635. rlen = ((rlen>>2)+1)<<2;
  636. *len=4+rlen;
  637. return 0;
  638. }
  639. int stun_is_channel_message_str(const u08bits *buf, size_t *blen, u16bits* chnumber, int mandatory_padding)
  640. {
  641. u16bits datalen_header;
  642. u16bits datalen_actual;
  643. if (!blen || (*blen < 4))
  644. return 0;
  645. u16bits chn = nswap16(((const u16bits*)(buf))[0]);
  646. if (!STUN_VALID_CHANNEL(chn))
  647. return 0;
  648. if(*blen>(u16bits)-1)
  649. *blen=(u16bits)-1;
  650. datalen_actual = (u16bits)(*blen) - 4;
  651. datalen_header = ((const u16bits*)buf)[1];
  652. datalen_header = nswap16(datalen_header);
  653. if (datalen_header > datalen_actual)
  654. return 0;
  655. if (datalen_header != datalen_actual) {
  656. /* maybe there are padding bytes for 32-bit alignment. Mandatory for TCP. Optional for UDP */
  657. if(datalen_actual & 0x0003) {
  658. if(mandatory_padding) {
  659. return 0;
  660. } else if ((datalen_actual < datalen_header) || (datalen_header == 0)) {
  661. return 0;
  662. } else {
  663. u16bits diff = datalen_actual - datalen_header;
  664. if (diff > 3)
  665. return 0;
  666. }
  667. }
  668. }
  669. *blen = datalen_header + 4;
  670. if (chnumber)
  671. *chnumber = chn;
  672. return 1;
  673. }
  674. ////////// STUN message ///////////////////////////////
  675. static inline int sheadof(const char *head, const char* full, int ignore_case)
  676. {
  677. while(*head) {
  678. if(*head != *full) {
  679. if(ignore_case && (tolower((int)*head)==tolower((int)*full))) {
  680. //OK
  681. } else {
  682. return 0;
  683. }
  684. }
  685. ++head;++full;
  686. }
  687. return 1;
  688. }
  689. static inline const char* findstr(const char *hay, size_t slen, const char *needle, int ignore_case)
  690. {
  691. const char *ret = NULL;
  692. if(hay && slen && needle) {
  693. size_t nlen=strlen(needle);
  694. if(nlen<=slen) {
  695. size_t smax = slen-nlen+1;
  696. size_t i;
  697. const char *sp = hay;
  698. for(i=0;i<smax;++i) {
  699. if(sheadof(needle,sp+i,ignore_case)) {
  700. ret = sp+i;
  701. break;
  702. }
  703. }
  704. }
  705. }
  706. return ret;
  707. }
  708. static inline int is_http_inline(const char *s, size_t blen) {
  709. if(s && blen>=12) {
  710. if((strstr(s,"GET ")==s) ||(strstr(s,"POST ")==s) || (strstr(s,"DELETE ")==s) || (strstr(s,"PUT ")==s)) {
  711. const char *sp=findstr(s+4,blen-4," HTTP/",0);
  712. if(sp) {
  713. sp += 6;
  714. size_t diff_blen = sp-s;
  715. if(diff_blen+4 <= blen) {
  716. sp=findstr(sp,blen-diff_blen,"\r\n\r\n",0);
  717. if(sp) {
  718. int ret_len = (int)(sp-s+4);
  719. const char* clheader = "content-length: ";
  720. const char* cl = findstr(s,sp-s,clheader,1);
  721. if(cl) {
  722. unsigned long clen = strtoul(cl+strlen(clheader),NULL,10);
  723. if(clen>0 && clen<(0x0FFFFFFF)) {
  724. ret_len += (int)clen;
  725. }
  726. }
  727. return ret_len;
  728. }
  729. }
  730. }
  731. }
  732. }
  733. return 0;
  734. }
  735. int is_http(const char *s, size_t blen) {
  736. return is_http_inline(s, blen);
  737. }
  738. int stun_get_message_len_str(u08bits *buf, size_t blen, int padding, size_t *app_len) {
  739. if (buf && blen) {
  740. /* STUN request/response ? */
  741. if (buf && blen >= STUN_HEADER_LENGTH) {
  742. if (!STUN_VALID_CHANNEL(nswap16(((const u16bits*)buf)[0]))) {
  743. if ((((u08bits) buf[0]) & ((u08bits) (0xC0))) == 0) {
  744. if (nswap32(((const u32bits*)(buf))[1])
  745. == STUN_MAGIC_COOKIE) {
  746. u16bits len = nswap16(((const u16bits*)(buf))[1]);
  747. if ((len & 0x0003) == 0) {
  748. len += STUN_HEADER_LENGTH;
  749. if ((size_t) len <= blen) {
  750. *app_len = (size_t)len;
  751. return (int)len;
  752. }
  753. }
  754. }
  755. }
  756. }
  757. }
  758. //HTTP request ?
  759. {
  760. int http_len = is_http_inline(((char*)buf), blen);
  761. if((http_len>0) && ((size_t)http_len<=blen)) {
  762. *app_len = (size_t)http_len;
  763. return http_len;
  764. }
  765. }
  766. /* STUN channel ? */
  767. if(blen>=4) {
  768. u16bits chn=nswap16(((const u16bits*)(buf))[0]);
  769. if(STUN_VALID_CHANNEL(chn)) {
  770. u16bits bret = (4+(nswap16(((const u16bits*)(buf))[1])));
  771. *app_len = bret;
  772. if(padding && (bret & 0x0003)) {
  773. bret = ((bret>>2)+1)<<2;
  774. }
  775. if(bret<=blen) {
  776. return bret;
  777. }
  778. }
  779. }
  780. }
  781. return -1;
  782. }
  783. ////////// ALLOCATE ///////////////////////////////////
  784. int stun_set_allocate_request_str(u08bits* buf, size_t *len, u32bits lifetime, int af4, int af6,
  785. u08bits transport, int mobile, const char* rt, int ep) {
  786. stun_init_request_str(STUN_METHOD_ALLOCATE, buf, len);
  787. //REQUESTED-TRANSPORT
  788. {
  789. u08bits field[4];
  790. field[0]=transport;
  791. field[1]=0;
  792. field[2]=0;
  793. field[3]=0;
  794. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_REQUESTED_TRANSPORT,field,sizeof(field))<0) return -1;
  795. }
  796. //LIFETIME
  797. {
  798. if(lifetime<1) lifetime=STUN_DEFAULT_ALLOCATE_LIFETIME;
  799. u32bits field=nswap32(lifetime);
  800. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_LIFETIME,(u08bits*)(&field),sizeof(field))<0) return -1;
  801. }
  802. //MICE
  803. if(mobile) {
  804. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_MOBILITY_TICKET,(const u08bits*)"",0)<0) return -1;
  805. }
  806. if(ep>-1) {
  807. uint8_t value = ep ? 0x80 : 0x00;
  808. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_EVEN_PORT,(const u08bits*)&value,1)<0) return -1;
  809. }
  810. //RESERVATION-TOKEN, EVEN-PORT and DUAL-ALLOCATION are mutually exclusive:
  811. if(rt) {
  812. stun_attr_add_str(buf,len, STUN_ATTRIBUTE_RESERVATION_TOKEN, (const u08bits*) rt, 8);
  813. } else {
  814. //ADRESS-FAMILY
  815. if (af4 && !af6) {
  816. u08bits field[4];
  817. field[0] = (u08bits)STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV4;
  818. field[1]=0;
  819. field[2]=0;
  820. field[3]=0;
  821. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY,field,sizeof(field))<0) return -1;
  822. }
  823. if (af6 && !af4) {
  824. u08bits field[4];
  825. field[0] = (u08bits)STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV6;
  826. field[1]=0;
  827. field[2]=0;
  828. field[3]=0;
  829. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY,field,sizeof(field))<0) return -1;
  830. }
  831. if (af4 && af6) {
  832. u08bits field[4];
  833. field[0] = (u08bits)STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV6;
  834. field[1]=0;
  835. field[2]=0;
  836. field[3]=0;
  837. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_ADDITIONAL_ADDRESS_FAMILY,field,sizeof(field))<0) return -1;
  838. }
  839. }
  840. return 0;
  841. }
  842. int stun_set_allocate_response_str(u08bits* buf, size_t *len, stun_tid* tid,
  843. const ioa_addr *relayed_addr1, const ioa_addr *relayed_addr2,
  844. const ioa_addr *reflexive_addr,
  845. u32bits lifetime, int error_code, const u08bits *reason,
  846. u64bits reservation_token, char* mobile_id) {
  847. if(!error_code) {
  848. stun_init_success_response_str(STUN_METHOD_ALLOCATE, buf, len, tid);
  849. if(relayed_addr1) {
  850. if(stun_attr_add_addr_str(buf,len,STUN_ATTRIBUTE_XOR_RELAYED_ADDRESS,relayed_addr1)<0) return -1;
  851. }
  852. if(relayed_addr2) {
  853. if(stun_attr_add_addr_str(buf,len,STUN_ATTRIBUTE_XOR_RELAYED_ADDRESS,relayed_addr2)<0) return -1;
  854. }
  855. if(reflexive_addr) {
  856. if(stun_attr_add_addr_str(buf,len,STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,reflexive_addr)<0) return -1;
  857. }
  858. if(reservation_token) {
  859. reservation_token=nswap64(reservation_token);
  860. stun_attr_add_str(buf,len,STUN_ATTRIBUTE_RESERVATION_TOKEN,(u08bits*)(&reservation_token),8);
  861. }
  862. {
  863. if(lifetime<1) lifetime=STUN_DEFAULT_ALLOCATE_LIFETIME;
  864. else if(lifetime>STUN_MAX_ALLOCATE_LIFETIME) lifetime = STUN_MAX_ALLOCATE_LIFETIME;
  865. u32bits field=nswap32(lifetime);
  866. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_LIFETIME,(u08bits*)(&field),sizeof(field))<0) return -1;
  867. }
  868. if(mobile_id && *mobile_id) {
  869. if(stun_attr_add_str(buf,len,STUN_ATTRIBUTE_MOBILITY_TICKET,(u08bits*)mobile_id,strlen(mobile_id))<0) return -1;
  870. }
  871. } else {
  872. stun_init_error_response_str(STUN_METHOD_ALLOCATE, buf, len, error_code, reason, tid);
  873. }
  874. return 0;
  875. }
  876. /////////////// CHANNEL BIND ///////////////////////////////////////
  877. u16bits stun_set_channel_bind_request_str(u08bits* buf, size_t *len,
  878. const ioa_addr* peer_addr, u16bits channel_number) {
  879. if(!STUN_VALID_CHANNEL(channel_number)) {
  880. channel_number = 0x4000 + ((u16bits)(((u32bits)turn_random())%(0x7FFF-0x4000+1)));
  881. }
  882. stun_init_request_str(STUN_METHOD_CHANNEL_BIND, buf, len);
  883. if(stun_attr_add_channel_number_str(buf, len, channel_number)<0) return 0;
  884. if(!peer_addr) {
  885. ioa_addr ca;
  886. ns_bzero(&ca,sizeof(ioa_addr));
  887. if(stun_attr_add_addr_str(buf,len,STUN_ATTRIBUTE_XOR_PEER_ADDRESS, &ca)<0) return 0;
  888. } else {
  889. if(stun_attr_add_addr_str(buf,len,STUN_ATTRIBUTE_XOR_PEER_ADDRESS, peer_addr)<0) return 0;
  890. }
  891. return channel_number;
  892. }
  893. void stun_set_channel_bind_response_str(u08bits* buf, size_t *len, stun_tid* tid, int error_code, const u08bits *reason) {
  894. if(!error_code) {
  895. stun_init_success_response_str(STUN_METHOD_CHANNEL_BIND, buf, len, tid);
  896. } else {
  897. stun_init_error_response_str(STUN_METHOD_CHANNEL_BIND, buf, len, error_code, reason, tid);
  898. }
  899. }
  900. /////////////// BINDING ///////////////////////////////////////
  901. void stun_set_binding_request_str(u08bits* buf, size_t *len) {
  902. stun_init_request_str(STUN_METHOD_BINDING, buf, len);
  903. }
  904. int stun_set_binding_response_str(u08bits* buf, size_t *len, stun_tid* tid,
  905. const ioa_addr *reflexive_addr, int error_code, const u08bits *reason,
  906. u32bits cookie, int old_stun)
  907. {
  908. if (!error_code) {
  909. if (!old_stun) {
  910. stun_init_success_response_str(STUN_METHOD_BINDING, buf, len, tid);
  911. } else {
  912. old_stun_init_success_response_str(STUN_METHOD_BINDING, buf, len, tid, cookie);
  913. }
  914. if(!old_stun && reflexive_addr) {
  915. if (stun_attr_add_addr_str(buf, len, STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS, reflexive_addr) < 0)
  916. return -1;
  917. }
  918. if(reflexive_addr) {
  919. if (stun_attr_add_addr_str(buf, len, STUN_ATTRIBUTE_MAPPED_ADDRESS, reflexive_addr) < 0)
  920. return -1;
  921. }
  922. } else if (!old_stun) {
  923. stun_init_error_response_str(STUN_METHOD_BINDING, buf, len, error_code, reason, tid);
  924. } else {
  925. old_stun_init_error_response_str(STUN_METHOD_BINDING, buf, len, error_code, reason, tid, cookie);
  926. }
  927. return 0;
  928. }
  929. int stun_is_binding_request_str(const u08bits* buf, size_t len, size_t offset)
  930. {
  931. if(offset < len) {
  932. buf += offset;
  933. len -= offset;
  934. if (stun_is_command_message_str(buf, len)) {
  935. if (stun_is_request_str(buf, len) && (stun_get_method_str(buf, len) == STUN_METHOD_BINDING)) {
  936. return 1;
  937. }
  938. }
  939. }
  940. return 0;
  941. }
  942. int stun_is_binding_response_str(const u08bits* buf, size_t len) {
  943. if(stun_is_command_message_str(buf,len) &&
  944. (stun_get_method_str(buf,len)==STUN_METHOD_BINDING)) {
  945. if(stun_is_response_str(buf,len)) {
  946. return 1;
  947. }
  948. }
  949. return 0;
  950. }
  951. /////////////////////////////// TID ///////////////////////////////
  952. int stun_tid_equals(const stun_tid *id1, const stun_tid *id2) {
  953. if(id1==id2) return 1;
  954. if(!id1) return 0;
  955. if(!id2) return 0;
  956. {
  957. unsigned int i=0;
  958. for(i=0;i<STUN_TID_SIZE;++i) {
  959. if(id1->tsx_id[i]!=id2->tsx_id[i]) return 0;
  960. }
  961. }
  962. return 1;
  963. }
  964. void stun_tid_cpy(stun_tid *id1, const stun_tid *id2) {
  965. if(!id1) return;
  966. if(!id2) return;
  967. ns_bcopy((const void*)(id2->tsx_id),(void*)(id1->tsx_id),STUN_TID_SIZE);
  968. }
  969. static void stun_tid_string_cpy(u08bits* s, const stun_tid* id) {
  970. if(s && id) {
  971. ns_bcopy((const void*)(id->tsx_id),s,STUN_TID_SIZE);
  972. }
  973. }
  974. static void stun_tid_from_string(const u08bits* s, stun_tid* id) {
  975. if(s && id) {
  976. ns_bcopy(s,(void*)(id->tsx_id),STUN_TID_SIZE);
  977. }
  978. }
  979. void stun_tid_from_message_str(const u08bits* buf, size_t len, stun_tid* id) {
  980. UNUSED_ARG(len);
  981. stun_tid_from_string(buf+8, id);
  982. }
  983. void stun_tid_message_cpy(u08bits* buf, const stun_tid* id) {
  984. if(buf && id) {
  985. stun_tid_string_cpy(buf+8, id);
  986. }
  987. }
  988. void stun_tid_generate(stun_tid* id) {
  989. if(id) {
  990. turn_random_tid_size(id->tsx_id);
  991. }
  992. }
  993. void stun_tid_generate_in_message_str(u08bits* buf, stun_tid* id) {
  994. stun_tid tmp;
  995. if(!id) id=&tmp;
  996. stun_tid_generate(id);
  997. stun_tid_message_cpy(buf, id);
  998. }
  999. /////////////////// TIME ////////////////////////////////////////////////////////
  1000. turn_time_t stun_adjust_allocate_lifetime(turn_time_t lifetime, turn_time_t max_lifetime) {
  1001. if(!lifetime) lifetime = STUN_DEFAULT_ALLOCATE_LIFETIME;
  1002. else if(lifetime<STUN_MIN_ALLOCATE_LIFETIME) lifetime = STUN_MIN_ALLOCATE_LIFETIME;
  1003. else if(lifetime>STUN_MAX_ALLOCATE_LIFETIME) lifetime = STUN_MAX_ALLOCATE_LIFETIME;
  1004. if(max_lifetime && (max_lifetime < lifetime)) {
  1005. lifetime = max_lifetime;
  1006. }
  1007. return lifetime;
  1008. }
  1009. ////////////// ATTR /////////////////////////////////////////////////////////////
  1010. int stun_attr_get_type(stun_attr_ref attr) {
  1011. if(attr)
  1012. return (int)(nswap16(((const u16bits*)attr)[0]));
  1013. return -1;
  1014. }
  1015. int stun_attr_get_len(stun_attr_ref attr) {
  1016. if(attr)
  1017. return (int)(nswap16(((const u16bits*)attr)[1]));
  1018. return -1;
  1019. }
  1020. const u08bits* stun_attr_get_value(stun_attr_ref attr) {
  1021. if(attr) {
  1022. int len = (int)(nswap16(((const u16bits*)attr)[1]));
  1023. if(len<1) return NULL;
  1024. return ((const u08bits*)attr)+4;
  1025. }
  1026. return NULL;
  1027. }
  1028. int stun_get_requested_address_family(stun_attr_ref attr)
  1029. {
  1030. if (attr) {
  1031. int len = (int) (nswap16(((const u16bits*)attr)[1]));
  1032. if (len != 4)
  1033. return STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_INVALID;
  1034. int val = ((const u08bits*) attr)[4];
  1035. switch (val){
  1036. case STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV4:
  1037. return val;
  1038. case STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV6:
  1039. return val;
  1040. default:
  1041. return STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_INVALID;
  1042. };
  1043. }
  1044. return STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_DEFAULT;
  1045. }
  1046. u16bits stun_attr_get_channel_number(stun_attr_ref attr) {
  1047. if(attr) {
  1048. const u08bits* value = stun_attr_get_value(attr);
  1049. if(value && (stun_attr_get_len(attr) >= 2)) {
  1050. u16bits cn=nswap16(((const u16bits*)value)[0]);
  1051. if(STUN_VALID_CHANNEL(cn)) return cn;
  1052. }
  1053. }
  1054. return 0;
  1055. }
  1056. band_limit_t stun_attr_get_bandwidth(stun_attr_ref attr) {
  1057. if(attr) {
  1058. const u08bits* value = stun_attr_get_value(attr);
  1059. if(value && (stun_attr_get_len(attr) >= 4)) {
  1060. u32bits bps=nswap32(((const u32bits*)value)[0]);
  1061. return (band_limit_t)(bps << 7);
  1062. }
  1063. }
  1064. return 0;
  1065. }
  1066. u64bits stun_attr_get_reservation_token_value(stun_attr_ref attr) {
  1067. if(attr) {
  1068. const u08bits* value = stun_attr_get_value(attr);
  1069. if(value && (stun_attr_get_len(attr) == 8)) {
  1070. return nswap64(((const u64bits*)value)[0]);
  1071. }
  1072. }
  1073. return 0;
  1074. }
  1075. int stun_attr_is_addr(stun_attr_ref attr) {
  1076. if(attr) {
  1077. switch(stun_attr_get_type(attr)) {
  1078. case STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS:
  1079. case STUN_ATTRIBUTE_XOR_PEER_ADDRESS:
  1080. case STUN_ATTRIBUTE_XOR_RELAYED_ADDRESS:
  1081. case STUN_ATTRIBUTE_MAPPED_ADDRESS:
  1082. case STUN_ATTRIBUTE_ALTERNATE_SERVER:
  1083. case OLD_STUN_ATTRIBUTE_RESPONSE_ADDRESS:
  1084. case OLD_STUN_ATTRIBUTE_SOURCE_ADDRESS:
  1085. case OLD_STUN_ATTRIBUTE_CHANGED_ADDRESS:
  1086. case OLD_STUN_ATTRIBUTE_REFLECTED_FROM:
  1087. case STUN_ATTRIBUTE_RESPONSE_ORIGIN:
  1088. case STUN_ATTRIBUTE_OTHER_ADDRESS:
  1089. return 1;
  1090. break;
  1091. default:
  1092. ;
  1093. };
  1094. }
  1095. return 0;
  1096. }
  1097. u08bits stun_attr_get_even_port(stun_attr_ref attr) {
  1098. if(attr) {
  1099. const u08bits* value=stun_attr_get_value(attr);
  1100. if(value) {
  1101. if((u08bits)(value[0]) > 0x7F) return 1;
  1102. }
  1103. }
  1104. return 0;
  1105. }
  1106. stun_attr_ref stun_attr_get_first_by_type_str(const u08bits* buf, size_t len, u16bits attr_type) {
  1107. stun_attr_ref attr=stun_attr_get_first_str(buf,len);
  1108. while(attr) {
  1109. if(stun_attr_get_type(attr) == attr_type) {
  1110. return attr;
  1111. }
  1112. attr=stun_attr_get_next_str(buf,len,attr);
  1113. }
  1114. return NULL;
  1115. }
  1116. stun_attr_ref stun_attr_get_first_str(const u08bits* buf, size_t len) {
  1117. if(stun_get_command_message_len_str(buf,len)>STUN_HEADER_LENGTH) {
  1118. return (stun_attr_ref)(buf+STUN_HEADER_LENGTH);
  1119. }
  1120. return NULL;
  1121. }
  1122. stun_attr_ref stun_attr_get_next_str(const u08bits* buf, size_t len, stun_attr_ref prev) {
  1123. if(!prev) return stun_attr_get_first_str(buf,len);
  1124. else {
  1125. const u08bits* end = buf + stun_get_command_message_len_str(buf,len);
  1126. int attrlen=stun_attr_get_len(prev);
  1127. u16bits rem4 = ((u16bits)attrlen) & 0x0003;
  1128. if(rem4) {
  1129. attrlen = attrlen+4-(int)rem4;
  1130. }
  1131. const u08bits* attr_end=(const u08bits*)prev+4+attrlen;
  1132. if(attr_end<end) return attr_end;
  1133. return NULL;
  1134. }
  1135. }
  1136. int stun_attr_add_str(u08bits* buf, size_t *len, u16bits attr, const u08bits* avalue, int alen) {
  1137. if(alen<0) alen=0;
  1138. u08bits tmp[1];
  1139. if(!avalue) {
  1140. alen=0;
  1141. avalue=tmp;
  1142. }
  1143. int clen = stun_get_command_message_len_str(buf,*len);
  1144. int newlen = clen + 4 + alen;
  1145. int newlenrem4=newlen & 0x00000003;
  1146. if(newlenrem4) {
  1147. newlen=newlen+(4-newlenrem4);
  1148. }
  1149. if(newlen>=MAX_STUN_MESSAGE_SIZE) return -1;
  1150. else {
  1151. u08bits* attr_start=buf+clen;
  1152. u16bits *attr_start_16t=(u16bits*)attr_start;
  1153. stun_set_command_message_len_str(buf,newlen);
  1154. *len = newlen;
  1155. attr_start_16t[0]=nswap16(attr);
  1156. attr_start_16t[1]=nswap16(alen);
  1157. if(alen>0) ns_bcopy(avalue,attr_start+4,alen);
  1158. return 0;
  1159. }
  1160. }
  1161. int stun_attr_add_addr_str(u08bits *buf, size_t *len, u16bits attr_type, const ioa_addr* ca) {
  1162. stun_tid tid;
  1163. stun_tid_from_message_str(buf, *len, &tid);
  1164. int xor_ed=0;
  1165. switch(attr_type) {
  1166. case STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS:
  1167. case STUN_ATTRIBUTE_XOR_PEER_ADDRESS:
  1168. case STUN_ATTRIBUTE_XOR_RELAYED_ADDRESS:
  1169. xor_ed=1;
  1170. break;
  1171. default:
  1172. ;
  1173. };
  1174. ioa_addr public_addr;
  1175. map_addr_from_private_to_public(ca,&public_addr);
  1176. u08bits cfield[64];
  1177. int clen=0;
  1178. if(stun_addr_encode(&public_addr, cfield, &clen, xor_ed, STUN_MAGIC_COOKIE, tid.tsx_id)<0) {
  1179. return -1;
  1180. }
  1181. if(stun_attr_add_str(buf,len,attr_type,(u08bits*)(&cfield),clen)<0) return -1;
  1182. return 0;
  1183. }
  1184. int stun_attr_get_addr_str(const u08bits *buf, size_t len, stun_attr_ref attr, ioa_addr* ca, const ioa_addr *default_addr) {
  1185. stun_tid tid;
  1186. stun_tid_from_message_str(buf, len, &tid);
  1187. ioa_addr public_addr;
  1188. ns_bzero(ca,sizeof(ioa_addr));
  1189. int attr_type = stun_attr_get_type(attr);
  1190. if(attr_type<0) return -1;
  1191. int xor_ed=0;
  1192. switch(attr_type) {
  1193. case STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS:
  1194. case STUN_ATTRIBUTE_XOR_PEER_ADDRESS:
  1195. case STUN_ATTRIBUTE_XOR_RELAYED_ADDRESS:
  1196. xor_ed=1;
  1197. break;
  1198. default:
  1199. ;
  1200. };
  1201. const u08bits *cfield=stun_attr_get_value(attr);
  1202. if(!cfield) return -1;
  1203. if(stun_addr_decode(&public_addr, cfield, stun_attr_get_len(attr), xor_ed, STUN_MAGIC_COOKIE, tid.tsx_id)<0) {
  1204. return -1;
  1205. }
  1206. map_addr_from_public_to_private(&public_addr, ca);
  1207. if(default_addr && addr_any_no_port(ca) && !addr_any_no_port(default_addr)) {
  1208. int port = addr_get_port(ca);
  1209. addr_cpy(ca,default_addr);
  1210. addr_set_port(ca,port);
  1211. }
  1212. return 0;
  1213. }
  1214. int stun_attr_get_first_addr_str(const u08bits *buf, size_t len, u16bits attr_type, ioa_addr* ca, const ioa_addr *default_addr) {
  1215. stun_attr_ref attr=stun_attr_get_first_str(buf,len);
  1216. while(attr) {
  1217. if(stun_attr_is_addr(attr) && (attr_type == stun_attr_get_type(attr))) {
  1218. if(stun_attr_get_addr_str(buf,len,attr,ca,default_addr)==0) {
  1219. return 0;
  1220. }
  1221. }
  1222. attr=stun_attr_get_next_str(buf,len,attr);
  1223. }
  1224. return -1;
  1225. }
  1226. int stun_attr_add_channel_number_str(u08bits* buf, size_t *len, u16bits chnumber) {
  1227. u16bits field[2];
  1228. field[0]=nswap16(chnumber);
  1229. field[1]=0;
  1230. return stun_attr_add_str(buf,len,STUN_ATTRIBUTE_CHANNEL_NUMBER,(u08bits*)(field),sizeof(field));
  1231. }
  1232. int stun_attr_add_bandwidth_str(u08bits* buf, size_t *len, band_limit_t bps0) {
  1233. u32bits bps = (band_limit_t)(bps0 >> 7);
  1234. u32bits field=nswap32(bps);
  1235. return stun_attr_add_str(buf,len,STUN_ATTRIBUTE_NEW_BANDWIDTH,(u08bits*)(&field),sizeof(field));
  1236. }
  1237. int stun_attr_add_address_error_code(u08bits* buf, size_t *len, int requested_address_family, int error_code)
  1238. {
  1239. const u08bits *reason = get_default_reason(error_code);
  1240. u08bits avalue[513];
  1241. avalue[0] = (u08bits)requested_address_family;
  1242. avalue[1] = 0;
  1243. avalue[2] = (u08bits) (error_code / 100);
  1244. avalue[3] = (u08bits) (error_code % 100);
  1245. strncpy((s08bits*) (avalue + 4), (const s08bits*) reason, sizeof(avalue)-4);
  1246. avalue[sizeof(avalue)-1]=0;
  1247. int alen = 4 + strlen((const s08bits*) (avalue+4));
  1248. //"Manual" padding for compatibility with classic old stun:
  1249. {
  1250. int rem = alen % 4;
  1251. if(rem) {
  1252. alen +=(4-rem);
  1253. }
  1254. }
  1255. stun_attr_add_str(buf, len, STUN_ATTRIBUTE_ADDRESS_ERROR_CODE, (u08bits*) avalue, alen);
  1256. return 0;
  1257. }
  1258. int stun_attr_get_address_error_code(u08bits* buf, size_t len, int *requested_address_family, int *error_code)
  1259. {
  1260. if(requested_address_family) {
  1261. *requested_address_family = 0;
  1262. }
  1263. if(error_code) {
  1264. *error_code = 0;
  1265. }
  1266. if(buf && len) {
  1267. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf, len, STUN_ATTRIBUTE_ADDRESS_ERROR_CODE);
  1268. if(sar) {
  1269. const u08bits* value = stun_attr_get_value(sar);
  1270. if(!value) {
  1271. return -1;
  1272. } else {
  1273. int alen = stun_attr_get_len(sar);
  1274. if(alen != 4) {
  1275. return -1;
  1276. }
  1277. if(requested_address_family) {
  1278. *requested_address_family = value[0];
  1279. }
  1280. if(error_code) {
  1281. *error_code = (int)(value[2]*100+value[3]);
  1282. }
  1283. return 0;
  1284. }
  1285. }
  1286. }
  1287. return 0;
  1288. }
  1289. u16bits stun_attr_get_first_channel_number_str(const u08bits *buf, size_t len) {
  1290. stun_attr_ref attr=stun_attr_get_first_str(buf,len);
  1291. while(attr) {
  1292. if(stun_attr_get_type(attr) == STUN_ATTRIBUTE_CHANNEL_NUMBER) {
  1293. u16bits ret = stun_attr_get_channel_number(attr);
  1294. if(STUN_VALID_CHANNEL(ret)) {
  1295. return ret;
  1296. }
  1297. }
  1298. attr=stun_attr_get_next_str(buf,len,attr);
  1299. }
  1300. return 0;
  1301. }
  1302. ////////////// FINGERPRINT ////////////////////////////
  1303. int stun_attr_add_fingerprint_str(u08bits *buf, size_t *len)
  1304. {
  1305. u32bits crc32 = 0;
  1306. stun_attr_add_str(buf, len, STUN_ATTRIBUTE_FINGERPRINT, (u08bits*)&crc32, 4);
  1307. crc32 = ns_crc32(buf,*len-8);
  1308. *((u32bits*)(buf+*len-4)) = nswap32(crc32 ^ ((u32bits)0x5354554e));
  1309. return 0;
  1310. }
  1311. ////////////// CRC ///////////////////////////////////////////////
  1312. #define CRC_MASK 0xFFFFFFFFUL
  1313. #define UPDATE_CRC(crc, c) crc = crctable[(u08bits)crc ^ (u08bits)(c)] ^ (crc >> 8)
  1314. static const u32bits crctable[256] = {
  1315. 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
  1316. 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  1317. 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
  1318. 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  1319. 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
  1320. 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  1321. 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
  1322. 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  1323. 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
  1324. 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  1325. 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
  1326. 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  1327. 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
  1328. 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  1329. 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  1330. 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  1331. 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
  1332. 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  1333. 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
  1334. 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  1335. 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
  1336. 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  1337. 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
  1338. 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  1339. 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
  1340. 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  1341. 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
  1342. 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  1343. 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
  1344. 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  1345. 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
  1346. 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  1347. 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
  1348. 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  1349. 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
  1350. 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  1351. 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
  1352. 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  1353. 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
  1354. 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  1355. 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
  1356. 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  1357. 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
  1358. 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  1359. 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  1360. 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  1361. 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
  1362. 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  1363. 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
  1364. 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  1365. 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
  1366. 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  1367. 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
  1368. 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  1369. 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
  1370. 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  1371. 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
  1372. 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  1373. 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
  1374. 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  1375. 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
  1376. 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  1377. 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
  1378. 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
  1379. };
  1380. /*
  1381. #define CRCPOLY 0xEDB88320UL
  1382. reversed 0x04C11DB7
  1383. 1110 1101 1001 1000 1000 0011 0010 0000
  1384. static void make_crctable(void)
  1385. {
  1386. uint i, j;
  1387. u32bits r;
  1388. for (i = 0; i < 256; ++i) {
  1389. r = i;
  1390. for (j = 8; j > 0; --j) {
  1391. if (r & 1)
  1392. r = (r >> 1) ^ CRCPOLY;
  1393. else
  1394. r >>= 1;
  1395. }
  1396. crctable[i] = r;
  1397. }
  1398. }
  1399. */
  1400. static u32bits ns_crc32(const u08bits *buffer, u32bits len)
  1401. {
  1402. u32bits crc = CRC_MASK;
  1403. while ( len-- ) UPDATE_CRC( crc, *buffer++ );
  1404. return (~crc);
  1405. }
  1406. //////////// SASLprep RFC 4013 /////////////////////////////////////////
  1407. /* We support only basic ASCII table */
  1408. int SASLprep(u08bits *s)
  1409. {
  1410. if(s) {
  1411. u08bits *strin = s;
  1412. u08bits *strout = s;
  1413. for(;;) {
  1414. u08bits c = *strin;
  1415. if(!c) {
  1416. *strout=0;
  1417. break;
  1418. }
  1419. switch(c) {
  1420. case 0xAD:
  1421. ++strin;
  1422. break;
  1423. case 0xA0:
  1424. case 0x20:
  1425. *strout=0x20;
  1426. ++strout;
  1427. ++strin;
  1428. break;
  1429. case 0x7F:
  1430. return -1;
  1431. default:
  1432. if(c<0x1F)
  1433. return -1;
  1434. if(c>=0x80 && c<=0x9F)
  1435. return -1;
  1436. *strout=c;
  1437. ++strout;
  1438. ++strin;
  1439. };
  1440. }
  1441. }
  1442. return 0;
  1443. }
  1444. //////////////// Message Integrity ////////////////////////////
  1445. size_t get_hmackey_size(SHATYPE shatype)
  1446. {
  1447. if(shatype == SHATYPE_SHA256)
  1448. return 32;
  1449. if(shatype == SHATYPE_SHA384)
  1450. return 48;
  1451. if(shatype == SHATYPE_SHA512)
  1452. return 64;
  1453. return 16;
  1454. }
  1455. void print_bin_func(const char *name, size_t len, const void *s, const char *func)
  1456. {
  1457. printf("<%s>:<%s>:len=%d:[",func,name,(int)len);
  1458. size_t i;
  1459. for(i=0;i<len;i++) {
  1460. printf("%02x",(int)((const u08bits*)s)[i]);
  1461. }
  1462. printf("]\n");
  1463. }
  1464. int stun_attr_add_integrity_str(turn_credential_type ct, u08bits *buf, size_t *len, hmackey_t key, password_t pwd, SHATYPE shatype)
  1465. {
  1466. u08bits hmac[MAXSHASIZE];
  1467. unsigned int shasize;
  1468. switch(shatype) {
  1469. case SHATYPE_SHA256:
  1470. shasize = SHA256SIZEBYTES;
  1471. break;
  1472. case SHATYPE_SHA384:
  1473. shasize = SHA384SIZEBYTES;
  1474. break;
  1475. case SHATYPE_SHA512:
  1476. shasize = SHA512SIZEBYTES;
  1477. break;
  1478. default:
  1479. shasize = SHA1SIZEBYTES;
  1480. };
  1481. if(stun_attr_add_str(buf, len, STUN_ATTRIBUTE_MESSAGE_INTEGRITY, hmac, shasize)<0)
  1482. return -1;
  1483. if(ct == TURN_CREDENTIALS_SHORT_TERM) {
  1484. if(stun_calculate_hmac(buf, *len-4-shasize, pwd, strlen((char*)pwd), buf+*len-shasize, &shasize, shatype)<0)
  1485. return -1;
  1486. } else {
  1487. if(stun_calculate_hmac(buf, *len-4-shasize, key, get_hmackey_size(shatype), buf+*len-shasize, &shasize, shatype)<0)
  1488. return -1;
  1489. }
  1490. return 0;
  1491. }
  1492. int stun_attr_add_integrity_by_key_str(u08bits *buf, size_t *len, u08bits *uname, u08bits *realm, hmackey_t key, u08bits *nonce, SHATYPE shatype)
  1493. {
  1494. if(stun_attr_add_str(buf, len, STUN_ATTRIBUTE_USERNAME, uname, strlen((s08bits*)uname))<0)
  1495. return -1;
  1496. if(stun_attr_add_str(buf, len, STUN_ATTRIBUTE_NONCE, nonce, strlen((s08bits*)nonce))<0)
  1497. return -1;
  1498. if(stun_attr_add_str(buf, len, STUN_ATTRIBUTE_REALM, realm, strlen((s08bits*)realm))<0)
  1499. return -1;
  1500. password_t p;
  1501. return stun_attr_add_integrity_str(TURN_CREDENTIALS_LONG_TERM, buf, len, key, p, shatype);
  1502. }
  1503. int stun_attr_add_integrity_by_user_str(u08bits *buf, size_t *len, u08bits *uname, u08bits *realm, u08bits *upwd, u08bits *nonce, SHATYPE shatype)
  1504. {
  1505. hmackey_t key;
  1506. if(stun_produce_integrity_key_str(uname, realm, upwd, key, shatype)<0)
  1507. return -1;
  1508. return stun_attr_add_integrity_by_key_str(buf, len, uname, realm, key, nonce, shatype);
  1509. }
  1510. int stun_attr_add_integrity_by_user_short_term_str(u08bits *buf, size_t *len, u08bits *uname, password_t pwd, SHATYPE shatype)
  1511. {
  1512. if(stun_attr_add_str(buf, len, STUN_ATTRIBUTE_USERNAME, uname, strlen((s08bits*)uname))<0)
  1513. return -1;
  1514. hmackey_t key;
  1515. return stun_attr_add_integrity_str(TURN_CREDENTIALS_SHORT_TERM, buf, len, key, pwd, shatype);
  1516. }
  1517. void print_hmac(const char *name, const void *s, size_t len)
  1518. {
  1519. printf("%s:len=%d:[",name,(int)len);
  1520. size_t i;
  1521. for(i=0;i<len;i++) {
  1522. printf("%02x",(int)((const u08bits*)s)[i]);
  1523. }
  1524. printf("]\n");
  1525. }
  1526. /*
  1527. * Return -1 if failure, 0 if the integrity is not correct, 1 if OK
  1528. */
  1529. int stun_check_message_integrity_by_key_str(turn_credential_type ct, u08bits *buf, size_t len, hmackey_t key, password_t pwd, SHATYPE shatype)
  1530. {
  1531. int res = 0;
  1532. u08bits new_hmac[MAXSHASIZE];
  1533. unsigned int shasize;
  1534. const u08bits *old_hmac = NULL;
  1535. stun_attr_ref sar = stun_attr_get_first_by_type_str(buf, len, STUN_ATTRIBUTE_MESSAGE_INTEGRITY);
  1536. if (!sar)
  1537. return -1;
  1538. int sarlen = stun_attr_get_len(sar);
  1539. switch(sarlen) {
  1540. case SHA256SIZEBYTES:
  1541. shasize = SHA256SIZEBYTES;
  1542. if(shatype != SHATYPE_SHA256)
  1543. return -1;
  1544. break;
  1545. case SHA384SIZEBYTES:
  1546. shasize = SHA384SIZEBYTES;
  1547. if(shatype != SHATYPE_SHA384)
  1548. return -1;
  1549. break;
  1550. case SHA512SIZEBYTES:
  1551. shasize = SHA512SIZEBYTES;
  1552. if(shatype != SHATYPE_SHA512)
  1553. return -1;
  1554. break;
  1555. case SHA1SIZEBYTES:
  1556. shasize = SHA1SIZEBYTES;
  1557. if(shatype != SHATYPE_SHA1)
  1558. return -1;
  1559. break;
  1560. default:
  1561. return -1;
  1562. };
  1563. int orig_len = stun_get_command_message_len_str(buf, len);
  1564. if (orig_len < 0)
  1565. return -1;
  1566. int new_len = ((const u08bits*) sar - buf) + 4 + shasize;
  1567. if (new_len > orig_len)
  1568. return -1;
  1569. if (stun_set_command_message_len_str(buf, new_len) < 0)
  1570. return -1;
  1571. if(ct == TURN_CREDENTIALS_SHORT_TERM) {
  1572. res = stun_calculate_hmac(buf, (size_t) new_len - 4 - shasize, pwd, strlen((char*)pwd), new_hmac, &shasize, shatype);
  1573. } else {
  1574. res = stun_calculate_hmac(buf, (size_t) new_len - 4 - shasize, key, get_hmackey_size(shatype), new_hmac, &shasize, shatype);
  1575. }
  1576. stun_set_command_message_len_str(buf, orig_len);
  1577. if(res<0)
  1578. return -1;
  1579. old_hmac = stun_attr_get_value(sar);
  1580. if(!old_hmac)
  1581. return -1;
  1582. if(bcmp(old_hmac,new_hmac,shasize))
  1583. return 0;
  1584. return +1;
  1585. }
  1586. /*
  1587. * Return -1 if failure, 0 if the integrity is not correct, 1 if OK
  1588. */
  1589. int stun_check_message_integrity_str(turn_credential_type ct, u08bits *buf, size_t len, u08bits *uname, u08bits *realm, u08bits *upwd, SHATYPE shatype)
  1590. {
  1591. hmackey_t key;
  1592. password_t pwd;
  1593. if(ct == TURN_CREDENTIALS_SHORT_TERM)
  1594. strncpy((char*)pwd,(char*)upwd,sizeof(password_t));
  1595. else if (stun_produce_integrity_key_str(uname, realm, upwd, key, shatype) < 0)
  1596. return -1;
  1597. return stun_check_message_integrity_by_key_str(ct, buf, len, key, pwd, shatype);
  1598. }
  1599. /* RFC 5780 */
  1600. int stun_attr_get_change_request_str(stun_attr_ref attr, int *change_ip, int *change_port)
  1601. {
  1602. if(stun_attr_get_len(attr) == 4) {
  1603. const u08bits* value = stun_attr_get_value(attr);
  1604. if(value) {
  1605. *change_ip = (value[3] & (u08bits)0x04);
  1606. *change_port = (value[3] & (u08bits)0x02);
  1607. return 0;
  1608. }
  1609. }
  1610. return -1;
  1611. }
  1612. int stun_attr_add_change_request_str(u08bits *buf, size_t *len, int change_ip, int change_port)
  1613. {
  1614. u08bits avalue[4]={0,0,0,0};
  1615. if(change_ip) {
  1616. if(change_port) {
  1617. avalue[3] = 0x06;
  1618. } else {
  1619. avalue[3] = 0x04;
  1620. }
  1621. } else if(change_port) {
  1622. avalue[3]=0x02;
  1623. }
  1624. return stun_attr_add_str(buf, len, STUN_ATTRIBUTE_CHANGE_REQUEST, avalue, 4);
  1625. }
  1626. int stun_attr_get_response_port_str(stun_attr_ref attr)
  1627. {
  1628. if(stun_attr_get_len(attr) >= 2) {
  1629. const u08bits* value = stun_attr_get_value(attr);
  1630. if(value) {
  1631. return nswap16(((const u16bits*)value)[0]);
  1632. }
  1633. }
  1634. return -1;
  1635. }
  1636. int stun_attr_add_response_port_str(u08bits *buf, size_t *len, u16bits port)
  1637. {
  1638. u08bits avalue[4]={0,0,0,0};
  1639. u16bits *port_ptr = (u16bits*)avalue;
  1640. *port_ptr = nswap16(port);
  1641. return stun_attr_add_str(buf, len, STUN_ATTRIBUTE_RESPONSE_PORT, avalue, 4);
  1642. }
  1643. int stun_attr_get_padding_len_str(stun_attr_ref attr) {
  1644. int len = stun_attr_get_len(attr);
  1645. if(len<0)
  1646. return -1;
  1647. return (u16bits)len;
  1648. }
  1649. int stun_attr_add_padding_str(u08bits *buf, size_t *len, u16bits padding_len)
  1650. {
  1651. u08bits avalue[0xFFFF];
  1652. ns_bzero(avalue,padding_len);
  1653. return stun_attr_add_str(buf, len, STUN_ATTRIBUTE_PADDING, avalue, padding_len);
  1654. }
  1655. /* OAUTH */
  1656. #define OAUTH_ERROR(...) fprintf(stderr,__VA_ARGS__)
  1657. static void remove_spaces(char *s)
  1658. {
  1659. char *sfns = s;
  1660. while(*sfns) {
  1661. if(*sfns != ' ')
  1662. break;
  1663. ++sfns;
  1664. }
  1665. if(*sfns) {
  1666. if(sfns != s) {
  1667. while(*sfns && (*sfns != ' ')) {
  1668. *s = *sfns;
  1669. ++s;
  1670. ++sfns;
  1671. };
  1672. *s = 0;
  1673. } else {
  1674. while(*s) {
  1675. if(*s == ' ') {
  1676. *s = 0;
  1677. break;
  1678. }
  1679. ++s;
  1680. }
  1681. }
  1682. }
  1683. }
  1684. static void normalize_algorithm(char *s)
  1685. {
  1686. char c = *s;
  1687. while(c) {
  1688. if(c=='_') *s='-';
  1689. else if((c>='a')&&(c<='z')) {
  1690. *s = c - 'a' + 'A';
  1691. }
  1692. ++s;
  1693. c = *s;
  1694. }
  1695. }
  1696. static size_t calculate_enc_key_length(ENC_ALG a)
  1697. {
  1698. switch(a) {
  1699. case A128GCMKW:
  1700. return 16;
  1701. default:
  1702. break;
  1703. };
  1704. return 32;
  1705. }
  1706. static size_t calculate_auth_key_length(ENC_ALG a)
  1707. {
  1708. switch(a) {
  1709. #if !defined(TURN_NO_GCM)
  1710. case A256GCMKW:
  1711. case A128GCMKW:
  1712. return 0;
  1713. #endif
  1714. default:
  1715. break;
  1716. };
  1717. return 0;
  1718. }
  1719. static int calculate_key(char *key, size_t key_size,
  1720. char *new_key, size_t new_key_size)
  1721. {
  1722. UNUSED_ARG(key_size);
  1723. ns_bcopy(key,new_key,new_key_size);
  1724. return 0;
  1725. }
  1726. int convert_oauth_key_data(const oauth_key_data *oakd0, oauth_key *key, char *err_msg, size_t err_msg_size)
  1727. {
  1728. if(oakd0 && key) {
  1729. oauth_key_data oakd_obj;
  1730. ns_bcopy(oakd0,&oakd_obj,sizeof(oauth_key_data));
  1731. oauth_key_data *oakd = &oakd_obj;
  1732. if(!(oakd->ikm_key_size)) {
  1733. if(!(oakd->as_rs_key_size)) {
  1734. if(err_msg) {
  1735. snprintf(err_msg,err_msg_size,"AS-RS key is not defined");
  1736. }
  1737. OAUTH_ERROR("AS-RS key is not defined\n");
  1738. return -1;
  1739. }
  1740. if(!(oakd->auth_key_size)) {
  1741. //AEAD ?
  1742. }
  1743. }
  1744. remove_spaces(oakd->kid);
  1745. remove_spaces(oakd->as_rs_alg);
  1746. normalize_algorithm(oakd->as_rs_alg);
  1747. if(!(oakd->kid[0])) {
  1748. if(err_msg) {
  1749. snprintf(err_msg,err_msg_size,"KID is not defined");
  1750. }
  1751. OAUTH_ERROR("KID is not defined\n");
  1752. return -1;
  1753. }
  1754. ns_bzero(key,sizeof(oauth_key));
  1755. STRCPY(key->kid,oakd->kid);
  1756. ns_bcopy(oakd->as_rs_key,key->as_rs_key,sizeof(key->as_rs_key));
  1757. key->as_rs_key_size = oakd->as_rs_key_size;
  1758. ns_bcopy(oakd->auth_key,key->auth_key,sizeof(key->auth_key));
  1759. key->auth_key_size = oakd->auth_key_size;
  1760. ns_bcopy(oakd->ikm_key,key->ikm_key,sizeof(key->ikm_key));
  1761. key->ikm_key_size = oakd->ikm_key_size;
  1762. key->timestamp = oakd->timestamp;
  1763. key->lifetime = oakd->lifetime;
  1764. if(!(key->timestamp)) key->timestamp = OAUTH_DEFAULT_TIMESTAMP;
  1765. if(!(key->lifetime)) key->lifetime = OAUTH_DEFAULT_LIFETIME;
  1766. key->as_rs_alg = ENC_ALG_DEFAULT;
  1767. #if !defined(TURN_NO_GCM)
  1768. if(!strcmp(oakd->as_rs_alg,"A128GCMKW")) {
  1769. key->as_rs_alg = A128GCMKW;
  1770. key->auth_key_size = 0;
  1771. key->auth_key[0] = 0;
  1772. } else if(!strcmp(oakd->as_rs_alg,"A256GCMKW")) {
  1773. key->as_rs_alg = A256GCMKW;
  1774. key->auth_key_size = 0;
  1775. key->auth_key[0] = 0;
  1776. } else if(oakd->as_rs_alg[0])
  1777. #endif
  1778. {
  1779. if(err_msg) {
  1780. snprintf(err_msg,err_msg_size,"Wrong oAuth token encryption algorithm: %s (2)\n",oakd->as_rs_alg);
  1781. }
  1782. OAUTH_ERROR("Wrong oAuth token encryption algorithm: %s (3)\n",oakd->as_rs_alg);
  1783. return -1;
  1784. }
  1785. if(!(key->auth_key_size)) {
  1786. key->auth_key_size = calculate_auth_key_length(key->as_rs_alg);
  1787. if(key->auth_key_size) {
  1788. if(calculate_key(key->ikm_key,key->ikm_key_size,key->auth_key,key->auth_key_size)<0) {
  1789. return -1;
  1790. }
  1791. }
  1792. }
  1793. if(!(key->as_rs_key_size)) {
  1794. key->as_rs_key_size = calculate_enc_key_length(key->as_rs_alg);
  1795. if(calculate_key(key->ikm_key,key->ikm_key_size,key->as_rs_key,key->as_rs_key_size)<0) {
  1796. return -1;
  1797. }
  1798. }
  1799. }
  1800. return 0;
  1801. }
  1802. static const EVP_CIPHER *get_cipher_type(ENC_ALG enc_alg)
  1803. {
  1804. switch(enc_alg) {
  1805. #if !defined(TURN_NO_GCM)
  1806. case A128GCMKW:
  1807. return EVP_aes_128_gcm();
  1808. case A256GCMKW:
  1809. return EVP_aes_256_gcm();
  1810. #endif
  1811. default:
  1812. break;
  1813. }
  1814. OAUTH_ERROR("%s: Unsupported enc algorithm: %d\n",__FUNCTION__,(int)enc_alg);
  1815. return NULL;
  1816. }
  1817. static int my_EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
  1818. int *outl, const unsigned char *in, int inl)
  1819. {
  1820. int cycle = 0;
  1821. int out_len = 0;
  1822. while((out_len<inl)&&(++cycle<128)) {
  1823. int tmp_outl=0;
  1824. unsigned char *ptr = NULL;
  1825. if(out)
  1826. ptr = out+out_len;
  1827. int ret = EVP_EncryptUpdate(ctx, ptr, &tmp_outl, in+out_len, inl-out_len);
  1828. out_len += tmp_outl;
  1829. if(ret<1)
  1830. return ret;
  1831. }
  1832. *outl = out_len;
  1833. return 1;
  1834. }
  1835. static int my_EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
  1836. int *outl, const unsigned char *in, int inl)
  1837. {
  1838. int cycle = 0;
  1839. int out_len = 0;
  1840. while((out_len<inl)&&(++cycle<128)) {
  1841. int tmp_outl=0;
  1842. unsigned char *ptr = NULL;
  1843. if(out)
  1844. ptr = out+out_len;
  1845. int ret = EVP_DecryptUpdate(ctx, ptr, &tmp_outl, in+out_len, inl-out_len);
  1846. out_len += tmp_outl;
  1847. if(ret<1)
  1848. return ret;
  1849. }
  1850. *outl = out_len;
  1851. return 1;
  1852. }
  1853. void print_field(const char* name, const unsigned char* f, size_t len);
  1854. void print_field(const char* name, const unsigned char* f, size_t len) {
  1855. printf("\nfield %s==>>\n",name);
  1856. size_t i;
  1857. for(i = 0;i<len;++i) {
  1858. printf("<0x%x>",(unsigned int)f[i]);
  1859. }
  1860. printf("\n<<==field %s\n",name);
  1861. }
  1862. int encode_oauth_token_normal(const u08bits *server_name, encoded_oauth_token *etoken, const oauth_key *key, const oauth_token *dtoken);
  1863. int encode_oauth_token_normal(const u08bits *server_name, encoded_oauth_token *etoken, const oauth_key *key, const oauth_token *dtoken)
  1864. {
  1865. UNUSED_ARG(server_name);
  1866. UNUSED_ARG(etoken);
  1867. UNUSED_ARG(key);
  1868. UNUSED_ARG(dtoken);
  1869. /*
  1870. if(server_name && etoken && key && dtoken && (dtoken->enc_block.key_length<=128)) {
  1871. unsigned char orig_field[MAX_ENCODED_OAUTH_TOKEN_SIZE];
  1872. ns_bzero(orig_field,sizeof(orig_field));
  1873. size_t len = 0;
  1874. *((uint16_t*)(orig_field+len)) = nswap16(dtoken->enc_block.key_length);
  1875. len +=2;
  1876. ns_bcopy(dtoken->enc_block.mac_key,orig_field+len,dtoken->enc_block.key_length);
  1877. len += dtoken->enc_block.key_length;
  1878. *((uint64_t*)(orig_field+len)) = nswap64(dtoken->enc_block.timestamp);
  1879. len += 8;
  1880. *((uint32_t*)(orig_field+len)) = nswap32(dtoken->enc_block.lifetime);
  1881. len += 4;
  1882. const EVP_CIPHER * cipher = get_cipher_type(key->as_rs_alg);
  1883. if(!cipher)
  1884. return -1;
  1885. unsigned char *encoded_field = (unsigned char*)etoken->token;
  1886. EVP_CIPHER_CTX ctx;
  1887. EVP_CIPHER_CTX_init(&ctx);
  1888. EVP_EncryptInit_ex(&ctx, cipher, NULL, (const unsigned char *)key->as_rs_key, NULL);
  1889. EVP_CIPHER_CTX_set_padding(&ctx,1);
  1890. int outl=0;
  1891. my_EVP_EncryptUpdate(&ctx, encoded_field, &outl, orig_field, (int)len);
  1892. if(outl % OAUTH_ENC_ALG_BLOCK_SIZE) {
  1893. int tmp_outl = 0;
  1894. EVP_EncryptFinal_ex(&ctx, encoded_field + outl, &tmp_outl);
  1895. outl += tmp_outl;
  1896. }
  1897. EVP_CIPHER_CTX_cleanup(&ctx);
  1898. size_t sn_len = strlen((const char*)server_name);
  1899. ns_bcopy(server_name,encoded_field+outl,sn_len);
  1900. outl += sn_len;
  1901. const EVP_MD *md = get_auth_type(key->auth_alg);
  1902. if(!md)
  1903. return -1;
  1904. unsigned int hmac_len = EVP_MD_size(md);
  1905. if (!HMAC(md, key->auth_key, key->auth_key_size, encoded_field, outl, encoded_field + outl, &hmac_len)) {
  1906. return -1;
  1907. }
  1908. update_hmac_len(key->auth_alg, &hmac_len);
  1909. ns_bcopy(encoded_field + outl, encoded_field + outl - sn_len, hmac_len);
  1910. outl -= sn_len;
  1911. outl += hmac_len; //encoded+hmac
  1912. etoken->size = outl;
  1913. return 0;
  1914. }
  1915. */
  1916. return -1;
  1917. }
  1918. int decode_oauth_token_normal(const u08bits *server_name, const encoded_oauth_token *etoken, const oauth_key *key, oauth_token *dtoken);
  1919. int decode_oauth_token_normal(const u08bits *server_name, const encoded_oauth_token *etoken, const oauth_key *key, oauth_token *dtoken)
  1920. {
  1921. UNUSED_ARG(server_name);
  1922. UNUSED_ARG(etoken);
  1923. UNUSED_ARG(key);
  1924. UNUSED_ARG(dtoken);
  1925. /*
  1926. if(server_name && etoken && key && dtoken) {
  1927. size_t mac_size = calculate_auth_output_length(key->auth_alg);
  1928. size_t min_encoded_field_size = 2+4+8+1;
  1929. if(etoken->size < mac_size+min_encoded_field_size) {
  1930. OAUTH_ERROR("%s: token size too small: %d, mac_size=%d, min_encoded_field_size=%d\n",__FUNCTION__,(int)etoken->size,(int)mac_size,(int)min_encoded_field_size);
  1931. return -1;
  1932. }
  1933. const unsigned char* encoded_field = (const unsigned char*)etoken->token;
  1934. unsigned int encoded_field_size = (unsigned int)etoken->size-mac_size;
  1935. const unsigned char* mac = ((const unsigned char*)etoken->token) + etoken->size - mac_size;
  1936. {
  1937. const EVP_MD *md = get_auth_type(key->auth_alg);
  1938. if(!md)
  1939. return -1;
  1940. unsigned int hmac_len = EVP_MD_size(md);
  1941. update_hmac_len(key->auth_alg,&hmac_len);
  1942. if(hmac_len != mac_size) {
  1943. OAUTH_ERROR("%s: mac size is wrong: %d, must be %d\n",__FUNCTION__,(int)mac_size,(int)hmac_len);
  1944. return -1;
  1945. }
  1946. unsigned char efield[MAX_ENCODED_OAUTH_TOKEN_SIZE];
  1947. unsigned char check_mac[MAXSHASIZE];
  1948. ns_bcopy(encoded_field,efield,encoded_field_size);
  1949. size_t sn_len = strlen((const char*)server_name);
  1950. ns_bcopy(server_name,efield+encoded_field_size,sn_len);
  1951. if (!HMAC(md, key->auth_key, key->auth_key_size, efield, encoded_field_size+sn_len, check_mac, &hmac_len)) {
  1952. return -1;
  1953. }
  1954. if(ns_bcmp(check_mac,mac,mac_size)) {
  1955. OAUTH_ERROR("%s: token integrity check failed\n",__FUNCTION__);
  1956. return -1;
  1957. }
  1958. }
  1959. unsigned char decoded_field[MAX_ENCODED_OAUTH_TOKEN_SIZE];
  1960. const EVP_CIPHER * cipher = get_cipher_type(key->as_rs_alg);
  1961. if(!cipher)
  1962. return -1;
  1963. EVP_CIPHER_CTX ctx;
  1964. EVP_CIPHER_CTX_init(&ctx);
  1965. EVP_DecryptInit_ex(&ctx, cipher, NULL, (const unsigned char *)key->as_rs_key, NULL);
  1966. EVP_CIPHER_CTX_set_padding(&ctx,1);
  1967. int outl=0;
  1968. my_EVP_DecryptUpdate(&ctx, decoded_field, &outl, encoded_field, (int)encoded_field_size);
  1969. int tmp_outl = 0;
  1970. EVP_DecryptFinal_ex(&ctx, decoded_field + outl, &tmp_outl);
  1971. outl += tmp_outl;
  1972. EVP_CIPHER_CTX_cleanup(&ctx);
  1973. size_t len = 0;
  1974. dtoken->enc_block.key_length = nswap16(*((uint16_t*)(decoded_field+len)));
  1975. len += 2;
  1976. ns_bcopy(decoded_field+len,dtoken->enc_block.mac_key,dtoken->enc_block.key_length);
  1977. len += dtoken->enc_block.key_length;
  1978. dtoken->enc_block.timestamp = nswap64(*((uint64_t*)(decoded_field+len)));
  1979. len += 8;
  1980. dtoken->enc_block.lifetime = nswap32(*((uint32_t*)(decoded_field+len)));
  1981. len += 4;
  1982. return 0;
  1983. }
  1984. */
  1985. return -1;
  1986. }
  1987. static void generate_random_nonce(unsigned char *nonce, size_t sz) {
  1988. if(!RAND_bytes(nonce, sz)) {
  1989. size_t i;
  1990. for(i=0;i<sz;++i) {
  1991. nonce[i] = (unsigned char)random();
  1992. }
  1993. }
  1994. }
  1995. #if !defined(TURN_NO_GCM)
  1996. static int encode_oauth_token_aead(const u08bits *server_name, encoded_oauth_token *etoken, const oauth_key *key, const oauth_token *dtoken, const u08bits* nonce0) {
  1997. if(server_name && etoken && key && dtoken && (dtoken->enc_block.key_length<=MAXSHASIZE)) {
  1998. unsigned char orig_field[MAX_ENCODED_OAUTH_TOKEN_SIZE];
  1999. ns_bzero(orig_field,sizeof(orig_field));
  2000. unsigned char nonce[OAUTH_AEAD_NONCE_SIZE];
  2001. if(nonce0) {
  2002. ns_bcopy(nonce0,nonce,sizeof(nonce));
  2003. } else {
  2004. generate_random_nonce(nonce, sizeof(nonce));
  2005. }
  2006. size_t len = 0;
  2007. *((uint16_t*)(orig_field+len)) = nswap16(OAUTH_AEAD_NONCE_SIZE);
  2008. len +=2;
  2009. ns_bcopy(nonce,orig_field+len,OAUTH_AEAD_NONCE_SIZE);
  2010. len += OAUTH_AEAD_NONCE_SIZE;
  2011. *((uint16_t*)(orig_field+len)) = nswap16(dtoken->enc_block.key_length);
  2012. len +=2;
  2013. ns_bcopy(dtoken->enc_block.mac_key,orig_field+len,dtoken->enc_block.key_length);
  2014. len += dtoken->enc_block.key_length;
  2015. *((uint64_t*)(orig_field+len)) = nswap64(dtoken->enc_block.timestamp);
  2016. len += 8;
  2017. *((uint32_t*)(orig_field+len)) = nswap32(dtoken->enc_block.lifetime);
  2018. len += 4;
  2019. const EVP_CIPHER * cipher = get_cipher_type(key->as_rs_alg);
  2020. if(!cipher)
  2021. return -1;
  2022. EVP_CIPHER_CTX ctx;
  2023. EVP_CIPHER_CTX_init(&ctx);
  2024. /* Initialize the encryption operation. */
  2025. if(1 != EVP_EncryptInit_ex(&ctx, cipher, NULL, NULL, NULL))
  2026. return -1;
  2027. EVP_CIPHER_CTX_set_padding(&ctx,1);
  2028. /* Set IV length if default 12 bytes (96 bits) is not appropriate */
  2029. if(1 != EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, OAUTH_AEAD_NONCE_SIZE, NULL))
  2030. return -1;
  2031. /* Initialize key and IV */
  2032. if(1 != EVP_EncryptInit_ex(&ctx, NULL, NULL, (const unsigned char *)key->as_rs_key, nonce))
  2033. return -1;
  2034. int outl=0;
  2035. size_t sn_len = strlen((const char*)server_name);
  2036. /* Provide any AAD data. This can be called zero or more times as
  2037. * required
  2038. */
  2039. if(1 != my_EVP_EncryptUpdate(&ctx, NULL, &outl, server_name, (int)sn_len))
  2040. return -1;
  2041. outl=0;
  2042. unsigned char *encoded_field = (unsigned char*)etoken->token;
  2043. ns_bcopy(orig_field,encoded_field,OAUTH_AEAD_NONCE_SIZE + 2);
  2044. encoded_field += OAUTH_AEAD_NONCE_SIZE + 2;
  2045. unsigned char *start_field = orig_field + OAUTH_AEAD_NONCE_SIZE + 2;
  2046. len -= OAUTH_AEAD_NONCE_SIZE + 2;
  2047. if(1 != my_EVP_EncryptUpdate(&ctx, encoded_field, &outl, start_field, (int)len))
  2048. return -1;
  2049. int tmp_outl = 0;
  2050. EVP_EncryptFinal_ex(&ctx, encoded_field + outl, &tmp_outl);
  2051. outl += tmp_outl;
  2052. EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, OAUTH_AEAD_TAG_SIZE, encoded_field + outl);
  2053. outl += OAUTH_AEAD_TAG_SIZE;
  2054. etoken->size = 2 + OAUTH_AEAD_NONCE_SIZE + outl;
  2055. EVP_CIPHER_CTX_cleanup(&ctx);
  2056. return 0;
  2057. }
  2058. return -1;
  2059. }
  2060. static int decode_oauth_token_aead(const u08bits *server_name, const encoded_oauth_token *etoken, const oauth_key *key, oauth_token *dtoken)
  2061. {
  2062. if(server_name && etoken && key && dtoken) {
  2063. unsigned char snl[2];
  2064. ns_bcopy((const unsigned char*)(etoken->token),snl,2);
  2065. const unsigned char *csnl = snl;
  2066. uint16_t nonce_len = nswap16(*((const uint16_t*)csnl));
  2067. size_t min_encoded_field_size = 2+4+8+nonce_len+2+OAUTH_AEAD_TAG_SIZE+1;
  2068. if(etoken->size < min_encoded_field_size) {
  2069. OAUTH_ERROR("%s: token size too small: %d\n",__FUNCTION__,(int)etoken->size);
  2070. return -1;
  2071. }
  2072. const unsigned char* encoded_field = (const unsigned char*)(etoken->token + nonce_len + 2);
  2073. unsigned int encoded_field_size = (unsigned int)etoken->size - nonce_len - 2 - OAUTH_AEAD_TAG_SIZE;
  2074. const unsigned char* nonce = ((const unsigned char*)etoken->token + 2);
  2075. unsigned char tag[OAUTH_AEAD_TAG_SIZE];
  2076. ns_bcopy(((const unsigned char*)etoken->token) + nonce_len + 2 + encoded_field_size, tag ,sizeof(tag));
  2077. unsigned char decoded_field[MAX_ENCODED_OAUTH_TOKEN_SIZE];
  2078. const EVP_CIPHER * cipher = get_cipher_type(key->as_rs_alg);
  2079. if(!cipher) {
  2080. OAUTH_ERROR("%s: Cannot find cipher for algorithm: %d\n",__FUNCTION__,(int)key->as_rs_alg);
  2081. return -1;
  2082. }
  2083. EVP_CIPHER_CTX ctx;
  2084. EVP_CIPHER_CTX_init(&ctx);
  2085. /* Initialize the decryption operation. */
  2086. if(1 != EVP_DecryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) {
  2087. OAUTH_ERROR("%s: Cannot initialize decryption\n",__FUNCTION__);
  2088. return -1;
  2089. }
  2090. //EVP_CIPHER_CTX_set_padding(&ctx,1);
  2091. /* Set IV length if default 12 bytes (96 bits) is not appropriate */
  2092. if(1 != EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, nonce_len, NULL)) {
  2093. OAUTH_ERROR("%s: Cannot set nonce length\n",__FUNCTION__);
  2094. return -1;
  2095. }
  2096. /* Initialize key and IV */
  2097. if(1 != EVP_DecryptInit_ex(&ctx, NULL, NULL, (const unsigned char *)key->as_rs_key, nonce)) {
  2098. OAUTH_ERROR("%s: Cannot set nonce\n",__FUNCTION__);
  2099. return -1;
  2100. }
  2101. /* Set expected tag value. A restriction in OpenSSL 1.0.1c and earlier
  2102. + * required the tag before any AAD or ciphertext */
  2103. EVP_CIPHER_CTX_ctrl (&ctx, EVP_CTRL_GCM_SET_TAG, OAUTH_AEAD_TAG_SIZE, tag);
  2104. int outl=0;
  2105. size_t sn_len = strlen((const char*)server_name);
  2106. /* Provide any AAD data. This can be called zero or more times as
  2107. * required
  2108. */
  2109. if(1 != my_EVP_DecryptUpdate(&ctx, NULL, &outl, server_name, (int)sn_len)) {
  2110. OAUTH_ERROR("%s: Cannot decrypt update server_name: %s, len=%d\n",__FUNCTION__,server_name,(int)sn_len);
  2111. return -1;
  2112. }
  2113. if(1 != my_EVP_DecryptUpdate(&ctx, decoded_field, &outl, encoded_field, (int)encoded_field_size)) {
  2114. OAUTH_ERROR("%s: Cannot decrypt update\n",__FUNCTION__);
  2115. return -1;
  2116. }
  2117. int tmp_outl = 0;
  2118. if(EVP_DecryptFinal_ex(&ctx, decoded_field + outl, &tmp_outl)<1) {
  2119. EVP_CIPHER_CTX_cleanup(&ctx);
  2120. OAUTH_ERROR("%s: token integrity check failed\n",__FUNCTION__);
  2121. return -1;
  2122. }
  2123. outl += tmp_outl;
  2124. EVP_CIPHER_CTX_cleanup(&ctx);
  2125. size_t len = 0;
  2126. dtoken->enc_block.key_length = nswap16(*((uint16_t*)(decoded_field+len)));
  2127. len += 2;
  2128. ns_bcopy(decoded_field+len,dtoken->enc_block.mac_key,dtoken->enc_block.key_length);
  2129. len += dtoken->enc_block.key_length;
  2130. dtoken->enc_block.timestamp = nswap64(*((uint64_t*)(decoded_field+len)));
  2131. len += 8;
  2132. dtoken->enc_block.lifetime = nswap32(*((uint32_t*)(decoded_field+len)));
  2133. len += 4;
  2134. return 0;
  2135. }
  2136. return -1;
  2137. }
  2138. #endif
  2139. int encode_oauth_token(const u08bits *server_name, encoded_oauth_token *etoken, const oauth_key *key, const oauth_token *dtoken, const u08bits *nonce)
  2140. {
  2141. UNUSED_ARG(nonce);
  2142. if(server_name && etoken && key && dtoken) {
  2143. switch(key->as_rs_alg) {
  2144. #if !defined(TURN_NO_GCM)
  2145. case A256GCMKW:
  2146. case A128GCMKW:
  2147. return encode_oauth_token_aead(server_name, etoken,key,dtoken,nonce);
  2148. #endif
  2149. default:
  2150. fprintf(stderr,"Unsupported AS_RS algorithm: %d\n",(int)key->as_rs_alg);
  2151. break;
  2152. };
  2153. }
  2154. return -1;
  2155. }
  2156. int decode_oauth_token(const u08bits *server_name, const encoded_oauth_token *etoken, const oauth_key *key, oauth_token *dtoken)
  2157. {
  2158. if(server_name && etoken && key && dtoken) {
  2159. switch(key->as_rs_alg) {
  2160. #if !defined(TURN_NO_GCM)
  2161. case A256GCMKW:
  2162. case A128GCMKW:
  2163. return decode_oauth_token_aead(server_name, etoken,key,dtoken);
  2164. #endif
  2165. default:
  2166. fprintf(stderr,"Unsupported AS_RS algorithm: %d\n",(int)key->as_rs_alg);
  2167. break;
  2168. };
  2169. }
  2170. return -1;
  2171. }
  2172. ///////////////////////////////////////////////////////////////