bio.c 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330
  1. /* bio.c
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #if defined(OPENSSL_EXTRA) && !defined(_WIN32)
  26. /* turn on GNU extensions for XVASPRINTF with wolfSSL_BIO_printf */
  27. #undef _GNU_SOURCE
  28. #define _GNU_SOURCE
  29. #endif
  30. #if !defined(WOLFSSL_BIO_INCLUDED)
  31. #ifndef WOLFSSL_IGNORE_FILE_WARN
  32. #warning bio.c does not need to be compiled separately from ssl.c
  33. #endif
  34. #else
  35. /*
  36. * WOLFSSL_BIO_RESIZE_THRESHOLD:
  37. * The amount of data to return before we attempt to resize the internal
  38. * buffers. After we have returned more than this define amount of bytes of
  39. * data, we will resize the buffers to get rid of excess memory.
  40. */
  41. /* Helper function to decode a base64 input
  42. *
  43. * returns size of resulting buffer on success
  44. */
  45. static int wolfSSL_BIO_BASE64_read(WOLFSSL_BIO* bio, void* buf, int len)
  46. {
  47. word32 frmtSz = len;
  48. WOLFSSL_ENTER("wolfSSL_BIO_BASE64_read");
  49. if (Base64_Decode((const byte*)buf, (word32)len, (byte*)buf, &frmtSz) !=0) {
  50. WOLFSSL_MSG("Err doing base64 decode");
  51. return WOLFSSL_FATAL_ERROR;
  52. }
  53. (void)bio;
  54. return (int)frmtSz;
  55. }
  56. /* Helper function to read from WOLFSSL_BIO_BIO type
  57. *
  58. * returns amount in bytes read on success
  59. */
  60. static int wolfSSL_BIO_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
  61. {
  62. int sz1;
  63. int sz2;
  64. char* pt;
  65. if (buf == NULL || len == 0)
  66. return 0;
  67. sz1 = wolfSSL_BIO_nread(bio, &pt, len);
  68. if (sz1 > 0) {
  69. XMEMCPY(buf, pt, sz1);
  70. buf = (char*)buf + sz1;
  71. len -= sz1;
  72. if (len > 0) {
  73. /* try again to see if maybe we wrapped around the ring buffer */
  74. sz2 = wolfSSL_BIO_nread(bio, &pt, len);
  75. if (sz2 > 0) {
  76. XMEMCPY(buf, pt, sz2);
  77. sz1 += sz2;
  78. }
  79. }
  80. }
  81. if (sz1 == 0)
  82. sz1 = -1;
  83. return sz1;
  84. }
  85. #ifndef WOLFSSL_BIO_RESIZE_THRESHOLD
  86. #define WOLFSSL_BIO_RESIZE_THRESHOLD 100
  87. #endif
  88. /* Handles reading from a memory type BIO and advancing the state.
  89. *
  90. * bio WOLFSSL_BIO to read from
  91. * buf buffer to put data from bio in
  92. * len amount of data to be read
  93. *
  94. * returns size read on success
  95. */
  96. static int wolfSSL_BIO_MEMORY_read(WOLFSSL_BIO* bio, void* buf, int len)
  97. {
  98. int sz;
  99. #ifndef WOLFSSL_DEBUG_OPENSSL
  100. if (len > 1)
  101. #endif
  102. {
  103. WOLFSSL_ENTER("wolfSSL_BIO_MEMORY_read");
  104. }
  105. sz = wolfSSL_BIO_pending(bio);
  106. if (sz > 0) {
  107. int memSz;
  108. if (bio->mem_buf == NULL) {
  109. WOLFSSL_MSG("bio->mem_buf is null");
  110. return WOLFSSL_BIO_ERROR;
  111. }
  112. if (sz > len) {
  113. sz = len;
  114. }
  115. memSz = (int)bio->mem_buf->length - bio->rdIdx;
  116. if (memSz < sz) {
  117. WOLFSSL_MSG("Not enough memory for reading");
  118. return WOLFSSL_BIO_ERROR;
  119. }
  120. XMEMCPY(buf, bio->mem_buf->data + bio->rdIdx, sz);
  121. bio->rdIdx += sz;
  122. if (bio->rdIdx >= bio->wrSz) {
  123. if (bio->flags & BIO_FLAGS_MEM_RDONLY) {
  124. bio->wrSz = bio->wrSzReset;
  125. }
  126. else {
  127. /* All data read resize down to WOLFSSL_BIO_RESIZE_THRESHOLD */
  128. if (bio->mem_buf->max > WOLFSSL_BIO_RESIZE_THRESHOLD &&
  129. wolfSSL_BUF_MEM_resize(bio->mem_buf, WOLFSSL_BIO_RESIZE_THRESHOLD) == 0) {
  130. WOLFSSL_MSG("wolfSSL_BUF_MEM_resize error");
  131. return WOLFSSL_BIO_ERROR;
  132. }
  133. bio->rdIdx = 0;
  134. bio->wrSz = 0;
  135. bio->mem_buf->length = 0;
  136. }
  137. bio->ptr = bio->mem_buf->data;
  138. }
  139. else if (bio->rdIdx >= WOLFSSL_BIO_RESIZE_THRESHOLD &&
  140. !(bio->flags & BIO_FLAGS_MEM_RDONLY)) {
  141. /* Resize the memory so we are not taking up more than necessary.
  142. * memmove reverts internally to memcpy if areas don't overlap */
  143. XMEMMOVE(bio->mem_buf->data, bio->mem_buf->data + bio->rdIdx,
  144. bio->wrSz - bio->rdIdx);
  145. bio->wrSz -= bio->rdIdx;
  146. bio->rdIdx = 0;
  147. /* Resize down to WOLFSSL_BIO_RESIZE_THRESHOLD for fewer
  148. * allocations. */
  149. if (wolfSSL_BUF_MEM_resize(bio->mem_buf,
  150. bio->wrSz > WOLFSSL_BIO_RESIZE_THRESHOLD ? bio->wrSz :
  151. WOLFSSL_BIO_RESIZE_THRESHOLD) == 0) {
  152. WOLFSSL_MSG("wolfSSL_BUF_MEM_resize error");
  153. return WOLFSSL_BIO_ERROR;
  154. }
  155. bio->mem_buf->length = bio->wrSz;
  156. bio->ptr = bio->mem_buf->data;
  157. }
  158. }
  159. else {
  160. if (bio->eof < 0) /* Sanity check the eof value */
  161. return bio->eof;
  162. else {
  163. WOLFSSL_MSG("Weird bio->eof value. Returning default");
  164. return WOLFSSL_BIO_ERROR;
  165. }
  166. }
  167. return sz;
  168. }
  169. int wolfSSL_BIO_method_type(const WOLFSSL_BIO *b)
  170. {
  171. return b != NULL ? b->type : (int)WOLFSSL_BIO_UNDEF;
  172. }
  173. #ifndef WOLFCRYPT_ONLY
  174. /* Helper function to read from WOLFSSL_BIO_SSL type
  175. *
  176. * returns the number of bytes read on success
  177. */
  178. static int wolfSSL_BIO_SSL_read(WOLFSSL_BIO* bio, void* buf,
  179. int len, WOLFSSL_BIO* front)
  180. {
  181. int ret;
  182. WOLFSSL_ENTER("wolfSSL_BIO_SSL_read");
  183. /* already got eof, again is error */
  184. if ((front == NULL) || front->eof)
  185. return WOLFSSL_FATAL_ERROR;
  186. bio->flags &= ~(WOLFSSL_BIO_FLAG_RETRY); /* default no retry */
  187. ret = wolfSSL_read((WOLFSSL*)bio->ptr, buf, len);
  188. if (ret == 0)
  189. front->eof = 1;
  190. else if (ret < 0) {
  191. int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
  192. if ( !(err == WOLFSSL_ERROR_WANT_READ || err == WOLFSSL_ERROR_WANT_WRITE) ) {
  193. front->eof = 1;
  194. }
  195. else {
  196. bio->flags |= WOLFSSL_BIO_FLAG_RETRY; /* should retry */
  197. }
  198. }
  199. return ret;
  200. }
  201. static int wolfSSL_BIO_MD_read(WOLFSSL_BIO* bio, void* buf, int sz)
  202. {
  203. if (wolfSSL_EVP_MD_CTX_type((WOLFSSL_EVP_MD_CTX*)bio->ptr) == NID_hmac) {
  204. if (wolfSSL_EVP_DigestSignUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf,
  205. sz) != WOLFSSL_SUCCESS)
  206. {
  207. return WOLFSSL_FATAL_ERROR;
  208. }
  209. }
  210. else {
  211. if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, sz)
  212. != WOLFSSL_SUCCESS) {
  213. return WOLFSSL_FATAL_ERROR;
  214. }
  215. }
  216. return sz;
  217. }
  218. #endif /* WOLFCRYPT_ONLY */
  219. /* Used to read data from a WOLFSSL_BIO structure
  220. *
  221. * bio structure to read data from
  222. * buf buffer to hold the result
  223. * len length of buf buffer
  224. *
  225. * returns the number of bytes read on success
  226. */
  227. int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
  228. {
  229. int ret = 0;
  230. WOLFSSL_BIO* front = bio;
  231. int sz = 0;
  232. #ifndef WOLFSSL_DEBUG_OPENSSL
  233. if (len > 1)
  234. #endif
  235. {
  236. WOLFSSL_ENTER("wolfSSL_BIO_read");
  237. }
  238. /* info cb, abort if user returns <= 0*/
  239. if (front != NULL && front->infoCb != NULL) {
  240. ret = (int)front->infoCb(front, WOLFSSL_BIO_CB_READ, (const char*)buf,
  241. len, 0, 1);
  242. if (ret <= 0) {
  243. return ret;
  244. }
  245. }
  246. /* start at end of list (or a WOLFSSL_BIO_SSL object since it takes care of
  247. * the rest of the chain) and work backwards */
  248. while (bio != NULL && bio->next != NULL && bio->type != WOLFSSL_BIO_SSL) {
  249. bio = bio->next;
  250. }
  251. while (bio != NULL && ret >= 0) {
  252. /* check for custom read */
  253. if (bio->method && bio->method->readCb) {
  254. ret = bio->method->readCb(bio, (char*)buf, len);
  255. }
  256. else {
  257. switch (bio->type) {
  258. case WOLFSSL_BIO_BASE64: /* formatting data */
  259. if (sz > 0)
  260. ret = wolfSSL_BIO_BASE64_read(bio, buf, sz);
  261. break;
  262. case WOLFSSL_BIO_BIO: /* read BIOs */
  263. ret = wolfSSL_BIO_BIO_read(bio, buf, len);
  264. break;
  265. case WOLFSSL_BIO_MEMORY:
  266. ret = wolfSSL_BIO_MEMORY_read(bio, buf, len);
  267. break;
  268. case WOLFSSL_BIO_FILE:
  269. #ifndef NO_FILESYSTEM
  270. if (bio->ptr) {
  271. ret = (int)XFREAD(buf, 1, len, (XFILE)bio->ptr);
  272. }
  273. else {
  274. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR) && \
  275. !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  276. ret = (int)XREAD(bio->num, buf, len);
  277. #else
  278. WOLFSSL_MSG("No file pointer and XREAD not enabled");
  279. ret = NOT_COMPILED_IN;
  280. #endif
  281. }
  282. #else
  283. WOLFSSL_MSG("WOLFSSL_BIO_FILE used with NO_FILESYSTEM");
  284. ret = NOT_COMPILED_IN;
  285. #endif /* !NO_FILESYSTEM */
  286. break;
  287. case WOLFSSL_BIO_SSL:
  288. #ifndef WOLFCRYPT_ONLY
  289. ret = wolfSSL_BIO_SSL_read(bio, buf, len, front);
  290. #else
  291. WOLFSSL_MSG("WOLFSSL_BIO_SSL used with WOLFCRYPT_ONLY");
  292. ret = NOT_COMPILED_IN;
  293. #endif
  294. break;
  295. case WOLFSSL_BIO_MD: /* data passing through BIO MD wrapper */
  296. #ifndef WOLFCRYPT_ONLY
  297. ret = wolfSSL_BIO_MD_read(bio, buf, ret);
  298. #else
  299. WOLFSSL_MSG("WOLFSSL_BIO_MD used with WOLFCRYPT_ONLY");
  300. ret = NOT_COMPILED_IN;
  301. #endif
  302. break;
  303. case WOLFSSL_BIO_SOCKET:
  304. #ifdef USE_WOLFSSL_IO
  305. /* BIO requires built-in socket support
  306. * (cannot be used with WOLFSSL_USER_IO) */
  307. ret = wolfIO_Recv(bio->num, (char*)buf, len, 0);
  308. #else
  309. ret = NOT_COMPILED_IN;
  310. #endif
  311. break;
  312. } /* switch */
  313. }
  314. /* case where front of list is done */
  315. if (bio == front) {
  316. break; /* at front of list so be done */
  317. }
  318. if (ret > 0) {
  319. sz = ret; /* adjust size for formatting */
  320. }
  321. /* previous WOLFSSL_BIO in list working towards head of list */
  322. bio = bio->prev;
  323. }
  324. /* info cb, user can override return value */
  325. if (front != NULL && front->infoCb != NULL) {
  326. ret = (int)front->infoCb(front,
  327. WOLFSSL_BIO_CB_READ | WOLFSSL_BIO_CB_RETURN,
  328. (const char*)buf, len, 0, ret);
  329. }
  330. return ret;
  331. }
  332. #ifdef WOLFSSL_BASE64_ENCODE
  333. /* Converts data into base64 output
  334. *
  335. * returns the resulting buffer size on success.
  336. */
  337. /**
  338. * `out` buffer is allocated here and the caller is responsible
  339. * for free'ing it
  340. * `data` and `out` can be the same in which case `data` should
  341. * always be set to `out` after this function call succeeds
  342. */
  343. static int wolfSSL_BIO_BASE64_write(WOLFSSL_BIO* bio, const void* data,
  344. word32 inLen, byte** out, word32* outLen, void* heap)
  345. {
  346. byte* tmp = NULL;
  347. word32 sz = 0;
  348. WOLFSSL_ENTER("wolfSSL_BIO_BASE64_write");
  349. if (bio == NULL || data == NULL || out == NULL || outLen == NULL) {
  350. return BAD_FUNC_ARG;
  351. }
  352. /* get the encoded length */
  353. if (bio->flags & WOLFSSL_BIO_FLAG_BASE64_NO_NL) {
  354. if (Base64_Encode_NoNl((const byte*)data, inLen, NULL,
  355. &sz) != LENGTH_ONLY_E) {
  356. WOLFSSL_MSG("Error with base64 get length");
  357. return WOLFSSL_FATAL_ERROR;
  358. }
  359. }
  360. else {
  361. if (Base64_Encode((const byte*)data, inLen, NULL, &sz) !=
  362. LENGTH_ONLY_E) {
  363. WOLFSSL_MSG("Error with base64 get length");
  364. return WOLFSSL_FATAL_ERROR;
  365. }
  366. }
  367. if (sz == 0) {
  368. *outLen = 0;
  369. return 0; /* nothing to do */
  370. }
  371. /* allocate temp buffer, since base64 encode does not allow inline */
  372. tmp = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
  373. if (tmp == NULL) {
  374. WOLFSSL_MSG("Memory error");
  375. return WOLFSSL_FATAL_ERROR;
  376. }
  377. if (bio->flags & WOLFSSL_BIO_FLAG_BASE64_NO_NL) {
  378. if (Base64_Encode_NoNl((const byte*)data, inLen,
  379. tmp, &sz) < 0) {
  380. WOLFSSL_MSG("Base64_Encode_NoNl error");
  381. XFREE(tmp, heap, DYNAMIC_TYPE_TMP_BUFFER);
  382. return WOLFSSL_FATAL_ERROR;
  383. }
  384. }
  385. else {
  386. if (Base64_Encode((const byte*)data, inLen,
  387. tmp, &sz) < 0) {
  388. WOLFSSL_MSG("Base64_Encode error");
  389. XFREE(tmp, heap, DYNAMIC_TYPE_TMP_BUFFER);
  390. return WOLFSSL_FATAL_ERROR;
  391. }
  392. }
  393. if (*out != NULL)
  394. XFREE(*out, heap, DYNAMIC_TYPE_TMP_BUFFER);
  395. *out = tmp;
  396. *outLen = sz;
  397. /* out is free'd by caller */
  398. (void)heap;
  399. return inLen;
  400. }
  401. #endif /* WOLFSSL_BASE64_ENCODE */
  402. #ifndef WOLFCRYPT_ONLY
  403. /* Helper function for writing to a WOLFSSL_BIO_SSL type
  404. *
  405. * returns the amount written in bytes on success
  406. */
  407. static int wolfSSL_BIO_SSL_write(WOLFSSL_BIO* bio, const void* data,
  408. int len, WOLFSSL_BIO* front)
  409. {
  410. int ret;
  411. WOLFSSL_ENTER("wolfSSL_BIO_SSL_write");
  412. if (bio->ptr == NULL) {
  413. return BAD_FUNC_ARG;
  414. }
  415. bio->flags &= ~(WOLFSSL_BIO_FLAG_RETRY); /* default no retry */
  416. ret = wolfSSL_write((WOLFSSL*)bio->ptr, data, len);
  417. if (ret == 0)
  418. front->eof = 1;
  419. else if (ret < 0) {
  420. int err = wolfSSL_get_error((WOLFSSL*)bio->ptr, 0);
  421. if ( !(err == WOLFSSL_ERROR_WANT_READ || err == WOLFSSL_ERROR_WANT_WRITE) ) {
  422. front->eof = 1;
  423. }
  424. else {
  425. bio->flags |= WOLFSSL_BIO_FLAG_RETRY; /* should retry */
  426. }
  427. }
  428. return ret;
  429. }
  430. #endif /* WOLFCRYPT_ONLY */
  431. /* Writes to a WOLFSSL_BIO_BIO type.
  432. *
  433. * returns the amount written on success
  434. */
  435. static int wolfSSL_BIO_BIO_write(WOLFSSL_BIO* bio, const void* data,
  436. int len)
  437. {
  438. int sz1;
  439. int sz2;
  440. char* buf;
  441. WOLFSSL_ENTER("wolfSSL_BIO_BIO_write");
  442. /* adding in sanity checks for static analysis tools */
  443. if (bio == NULL || data == NULL || len == 0)
  444. return 0;
  445. sz1 = wolfSSL_BIO_nwrite(bio, &buf, len);
  446. if (sz1 == 0) {
  447. WOLFSSL_MSG("No room left to write");
  448. return WOLFSSL_BIO_ERROR;
  449. }
  450. if (sz1 < 0) {
  451. WOLFSSL_MSG("Error in wolfSSL_BIO_nwrite");
  452. return sz1;
  453. }
  454. XMEMCPY(buf, data, sz1);
  455. data = (char*)data + sz1;
  456. len -= sz1;
  457. if (len > 0) {
  458. /* try again to see if maybe we wrapped around the ring buffer */
  459. sz2 = wolfSSL_BIO_nwrite(bio, &buf, len);
  460. if (sz2 > 0) {
  461. XMEMCPY(buf, data, sz2);
  462. sz1 += sz2;
  463. }
  464. }
  465. return sz1;
  466. }
  467. /* for complete compatibility a bio memory write allocs its own memory
  468. * until the application runs out ....
  469. *
  470. * bio structure to hold incoming data
  471. * data buffer holding the data to be written
  472. * len length of data buffer
  473. *
  474. * returns the amount of data written on success and WOLFSSL_FAILURE or
  475. * WOLFSSL_BIO_ERROR for failure cases.
  476. */
  477. static int wolfSSL_BIO_MEMORY_write(WOLFSSL_BIO* bio, const void* data,
  478. int len)
  479. {
  480. WOLFSSL_ENTER("wolfSSL_BIO_MEMORY_write");
  481. if (bio == NULL || bio->mem_buf == NULL || data == NULL) {
  482. WOLFSSL_MSG("one of input parameters is null");
  483. return WOLFSSL_FAILURE;
  484. }
  485. if (bio->flags & BIO_FLAGS_MEM_RDONLY) {
  486. return WOLFSSL_FAILURE;
  487. }
  488. if (len == 0)
  489. return WOLFSSL_SUCCESS; /* Return early to make logic simpler */
  490. if (wolfSSL_BUF_MEM_grow_ex(bio->mem_buf, bio->wrSz + len, 0)
  491. == 0) {
  492. WOLFSSL_MSG("Error growing memory area");
  493. return WOLFSSL_FAILURE;
  494. }
  495. if (bio->mem_buf->data == NULL) {
  496. WOLFSSL_MSG("Buffer data is NULL");
  497. return WOLFSSL_FAILURE;
  498. }
  499. XMEMCPY(bio->mem_buf->data + bio->wrSz, data, len);
  500. bio->ptr = bio->mem_buf->data;
  501. bio->num = (int)bio->mem_buf->max;
  502. bio->wrSz += len;
  503. bio->wrIdx += len;
  504. return len;
  505. }
  506. #ifndef WOLFCRYPT_ONLY
  507. /* Helper function for writing to a WOLFSSL_BIO_MD type
  508. *
  509. * returns the amount written in bytes on success (0)
  510. */
  511. static int wolfSSL_BIO_MD_write(WOLFSSL_BIO* bio, const void* data, int len)
  512. {
  513. int ret = 0;
  514. if (bio == NULL || data == NULL) {
  515. return BAD_FUNC_ARG;
  516. }
  517. if (wolfSSL_EVP_MD_CTX_type((WOLFSSL_EVP_MD_CTX*)bio->ptr) == NID_hmac) {
  518. if (wolfSSL_EVP_DigestSignUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, data,
  519. len) != WOLFSSL_SUCCESS) {
  520. ret = WOLFSSL_BIO_ERROR;
  521. }
  522. }
  523. else {
  524. if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, data, len)
  525. != WOLFSSL_SUCCESS) {
  526. ret = WOLFSSL_BIO_ERROR;
  527. }
  528. }
  529. return ret;
  530. }
  531. #endif /* WOLFCRYPT_ONLY */
  532. /* Writes data to a WOLFSSL_BIO structure
  533. *
  534. * bio structure to write to
  535. * data holds the data to be written
  536. * len length of data buffer
  537. *
  538. * returns the amount written in bytes on success
  539. */
  540. int wolfSSL_BIO_write(WOLFSSL_BIO* bio, const void* data, int len)
  541. {
  542. int ret = 0;
  543. #ifdef WOLFSSL_BASE64_ENCODE
  544. /* Use extra return var as we want to return how much of input we have
  545. * written, not how big the base64 encoding ended up being */
  546. int retB64 = 0;
  547. #endif
  548. WOLFSSL_BIO* front = bio;
  549. void* frmt = NULL;
  550. word32 frmtSz = 0;
  551. WOLFSSL_ENTER("wolfSSL_BIO_write");
  552. /* info cb, abort if user returns <= 0*/
  553. if (front != NULL && front->infoCb != NULL) {
  554. ret = (int)front->infoCb(front, WOLFSSL_BIO_CB_WRITE,
  555. (const char*)data, len, 0, 1);
  556. if (ret <= 0) {
  557. return ret;
  558. }
  559. }
  560. while (bio != NULL && ret >= 0) {
  561. /* check for custom write */
  562. if (bio->method && bio->method->writeCb) {
  563. ret = bio->method->writeCb(bio, (const char*)data, len);
  564. }
  565. else {
  566. switch (bio->type) {
  567. case WOLFSSL_BIO_BASE64:
  568. {
  569. #ifdef WOLFSSL_BASE64_ENCODE
  570. ret = retB64 = wolfSSL_BIO_BASE64_write(bio, data, (word32)len,
  571. (byte**)&frmt, &frmtSz, front->heap);
  572. if (ret > 0) {
  573. /* change so that data is formatted buffer */
  574. data = frmt;
  575. len = frmtSz;
  576. }
  577. #else
  578. WOLFSSL_MSG("WOLFSSL_BIO_BASE64 used without "
  579. "WOLFSSL_BASE64_ENCODE");
  580. ret = NOT_COMPILED_IN;
  581. #endif /* WOLFSSL_BASE64_ENCODE */
  582. break;
  583. }
  584. case WOLFSSL_BIO_BIO: /* write bios */
  585. ret = wolfSSL_BIO_BIO_write(bio, data, len);
  586. break;
  587. case WOLFSSL_BIO_MEMORY:
  588. ret = wolfSSL_BIO_MEMORY_write(bio, data, len);
  589. break;
  590. case WOLFSSL_BIO_FILE:
  591. #ifndef NO_FILESYSTEM
  592. if (bio->ptr) {
  593. ret = (int)XFWRITE(data, 1, len, (XFILE)bio->ptr);
  594. }
  595. else {
  596. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR) && \
  597. !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  598. ret = (int)XWRITE(bio->num, data, len);
  599. #else
  600. WOLFSSL_MSG("No file pointer and XWRITE not enabled");
  601. ret = NOT_COMPILED_IN;
  602. #endif
  603. }
  604. #else
  605. WOLFSSL_MSG("WOLFSSL_BIO_FILE used with NO_FILESYSTEM");
  606. ret = NOT_COMPILED_IN;
  607. #endif /* !NO_FILESYSTEM */
  608. break;
  609. case WOLFSSL_BIO_SSL:
  610. #ifndef WOLFCRYPT_ONLY
  611. /* already got eof, again is error */
  612. if (front->eof) {
  613. ret = WOLFSSL_FATAL_ERROR;
  614. }
  615. else {
  616. ret = wolfSSL_BIO_SSL_write(bio, data, len, front);
  617. }
  618. /* Rest of chain is taken care of inside call */
  619. goto exit_chain;
  620. #else
  621. WOLFSSL_MSG("WOLFSSL_BIO_SSL used with WOLFCRYPT_ONLY");
  622. ret = NOT_COMPILED_IN;
  623. #endif
  624. break;
  625. case WOLFSSL_BIO_MD:
  626. #ifndef WOLFCRYPT_ONLY
  627. if (bio->next != NULL) { /* data passing through MD BIO */
  628. ret = wolfSSL_BIO_MD_write(bio, data, len);
  629. }
  630. #else
  631. WOLFSSL_MSG("WOLFSSL_BIO_MD used with WOLFCRYPT_ONLY");
  632. ret = NOT_COMPILED_IN;
  633. #endif
  634. break;
  635. case WOLFSSL_BIO_SOCKET:
  636. #ifdef USE_WOLFSSL_IO
  637. /* BIO requires built-in socket support
  638. * (cannot be used with WOLFSSL_USER_IO) */
  639. ret = wolfIO_Send(bio->num, (char*)data, len, 0);
  640. #else
  641. ret = NOT_COMPILED_IN;
  642. #endif
  643. break;
  644. } /* switch */
  645. }
  646. /* advance to the next bio in list */
  647. bio = bio->next;
  648. }
  649. #ifndef WOLFCRYPT_ONLY
  650. exit_chain:
  651. #endif
  652. /* info cb, user can override return value */
  653. if (front != NULL && front->infoCb != NULL) {
  654. ret = (int)front->infoCb(front,
  655. WOLFSSL_BIO_CB_WRITE | WOLFSSL_BIO_CB_RETURN,
  656. (const char*)data, len, 0, ret);
  657. }
  658. if (frmt != NULL) {
  659. XFREE(frmt, front->heap, DYNAMIC_TYPE_TMP_BUFFER);
  660. }
  661. #ifdef WOLFSSL_BASE64_ENCODE
  662. if (retB64 > 0 && ret > 0)
  663. return retB64;
  664. else
  665. #endif
  666. return ret;
  667. }
  668. /* Wrapper for other BIO type functions, expected to grow as OpenSSL compatibility
  669. * layer grows.
  670. *
  671. * return info. specific to the cmd that is passed in.
  672. */
  673. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  674. long wolfSSL_BIO_ctrl(WOLFSSL_BIO *bio, int cmd, long larg, void *parg)
  675. {
  676. long ret;
  677. (void)larg; /* not currently used */
  678. WOLFSSL_ENTER("wolfSSL_BIO_ctrl");
  679. if (bio && bio->method && bio->method->ctrlCb) {
  680. return bio->method->ctrlCb(bio, cmd, larg, parg);
  681. }
  682. switch(cmd) {
  683. case BIO_CTRL_PENDING:
  684. case BIO_CTRL_WPENDING:
  685. ret = (long)wolfSSL_BIO_ctrl_pending(bio);
  686. break;
  687. case BIO_CTRL_INFO:
  688. ret = (long)wolfSSL_BIO_get_mem_data(bio, parg);
  689. break;
  690. case BIO_CTRL_FLUSH:
  691. ret = (long)wolfSSL_BIO_flush(bio);
  692. break;
  693. case BIO_CTRL_RESET:
  694. ret = (long)wolfSSL_BIO_reset(bio);
  695. break;
  696. default:
  697. WOLFSSL_MSG("CMD not yet implemented");
  698. ret = WOLFSSL_FAILURE;
  699. break;
  700. }
  701. return ret;
  702. }
  703. /* Increment the WOLFSSL_BIO ref count by one, prevents BIO from being
  704. * freed until ref count is back down to 1.
  705. *
  706. * bio the structure to increment ref count
  707. *
  708. * returns 1 on success, 0 on failure */
  709. int wolfSSL_BIO_up_ref(WOLFSSL_BIO* bio)
  710. {
  711. if (bio) {
  712. int ret;
  713. wolfSSL_RefInc(&bio->ref, &ret);
  714. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  715. if (ret != 0) {
  716. WOLFSSL_MSG("Failed to lock BIO mutex");
  717. }
  718. #else
  719. (void)ret;
  720. #endif
  721. return WOLFSSL_SUCCESS;
  722. }
  723. return WOLFSSL_FAILURE;
  724. }
  725. #endif
  726. /* helper function for wolfSSL_BIO_gets
  727. * size till a newline is hit
  728. * returns the number of bytes including the new line character
  729. */
  730. static int wolfSSL_getLineLength(char* in, int inSz)
  731. {
  732. int i;
  733. for (i = 0; i < inSz; i++) {
  734. if (in[i] == '\n') {
  735. return i + 1; /* includes new line character */
  736. }
  737. }
  738. return inSz; /* rest of buffer is all one line */
  739. }
  740. /* Gets the next line from bio. Goes until a new line character or end of
  741. * buffer is reached.
  742. *
  743. * bio the structure to read a new line from
  744. * buf buffer to hold the result
  745. * sz the size of "buf" buffer
  746. *
  747. * returns the size of the result placed in buf on success and a 0 or negative
  748. * value in an error case.
  749. */
  750. int wolfSSL_BIO_gets(WOLFSSL_BIO* bio, char* buf, int sz)
  751. {
  752. int ret = WOLFSSL_BIO_UNSET;
  753. WOLFSSL_ENTER("wolfSSL_BIO_gets");
  754. if (bio == NULL || buf == NULL) {
  755. return WOLFSSL_FAILURE;
  756. }
  757. /* not enough space for character plus terminator */
  758. if (sz <= 1) {
  759. return 0;
  760. }
  761. /* info cb, abort if user returns <= 0*/
  762. if (bio->infoCb != NULL) {
  763. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_GETS, buf, sz, 0, 1);
  764. if (ret <= 0) {
  765. return ret;
  766. }
  767. }
  768. /* check if is custom method */
  769. if (bio->method && bio->method->getsCb) {
  770. return bio->method->getsCb(bio, buf, sz);
  771. }
  772. switch (bio->type) {
  773. #ifndef NO_FILESYSTEM
  774. case WOLFSSL_BIO_FILE:
  775. if (((XFILE)bio->ptr) == XBADFILE) {
  776. return WOLFSSL_BIO_ERROR;
  777. }
  778. #if defined(MICRIUM) || defined(LSR_FS) || defined(EBSNET)
  779. WOLFSSL_MSG("XFGETS not ported for this system yet");
  780. ret = XFGETS(buf, sz, (XFILE)bio->ptr);
  781. #else
  782. if (XFGETS(buf, sz, (XFILE)bio->ptr) != NULL) {
  783. ret = (int)XSTRLEN(buf);
  784. }
  785. else {
  786. ret = WOLFSSL_BIO_ERROR;
  787. }
  788. #endif
  789. break;
  790. #endif /* NO_FILESYSTEM */
  791. case WOLFSSL_BIO_MEMORY:
  792. {
  793. const byte* c;
  794. int cSz;
  795. cSz = wolfSSL_BIO_pending(bio);
  796. if (cSz == 0) {
  797. ret = 0; /* Nothing to read */
  798. buf[0] = '\0';
  799. break;
  800. }
  801. if (wolfSSL_BIO_get_mem_data(bio, (void*)&c) <= 0) {
  802. ret = WOLFSSL_BIO_ERROR;
  803. break;
  804. }
  805. cSz = wolfSSL_getLineLength((char*)c, cSz);
  806. /* check case where line was bigger then buffer and buffer
  807. * needs end terminator */
  808. if (cSz >= sz) {
  809. cSz = sz - 1;
  810. buf[cSz] = '\0';
  811. }
  812. else {
  813. /* not minus 1 here because placing terminator after
  814. msg and have checked that sz is large enough */
  815. buf[cSz] = '\0';
  816. }
  817. ret = wolfSSL_BIO_MEMORY_read(bio, (void*)buf, cSz);
  818. /* ret is read after the switch statement */
  819. break;
  820. }
  821. case WOLFSSL_BIO_BIO:
  822. {
  823. char* c;
  824. int cSz;
  825. cSz = wolfSSL_BIO_nread0(bio, &c);
  826. if (cSz <= 0) {
  827. ret = 0; /* Nothing to read */
  828. buf[0] = '\0';
  829. break;
  830. }
  831. cSz = wolfSSL_getLineLength(c, cSz);
  832. /* check case where line was bigger then buffer and buffer
  833. * needs end terminator */
  834. if (cSz >= sz) {
  835. cSz = sz - 1;
  836. buf[cSz] = '\0';
  837. }
  838. else {
  839. /* not minus 1 here because placing terminator after
  840. msg and have checked that sz is large enough */
  841. buf[cSz] = '\0';
  842. }
  843. ret = wolfSSL_BIO_nread(bio, &c, cSz);
  844. if (ret > 0 && ret < sz) {
  845. XMEMCPY(buf, c, ret);
  846. }
  847. break;
  848. }
  849. #ifndef WOLFCRYPT_ONLY
  850. /* call final on hash */
  851. case WOLFSSL_BIO_MD:
  852. if (wolfSSL_EVP_MD_CTX_size((WOLFSSL_EVP_MD_CTX*)bio->ptr) > sz) {
  853. WOLFSSL_MSG("Output buffer was too small for digest");
  854. ret = WOLFSSL_FAILURE;
  855. }
  856. else {
  857. unsigned int szOut = 0;
  858. ret = wolfSSL_EVP_DigestFinal((WOLFSSL_EVP_MD_CTX*)bio->ptr,
  859. (unsigned char*)buf, &szOut);
  860. if (ret == WOLFSSL_SUCCESS) {
  861. ret = szOut;
  862. }
  863. }
  864. break;
  865. #endif /* WOLFCRYPT_ONLY */
  866. default:
  867. WOLFSSL_MSG("BIO type not supported yet with wolfSSL_BIO_gets");
  868. }
  869. /* info cb, user can override return value */
  870. if (bio->infoCb != NULL) {
  871. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_GETS | WOLFSSL_BIO_CB_RETURN,
  872. buf, sz, 0, ret);
  873. }
  874. return ret;
  875. }
  876. /* Writes a null terminated string to bio.
  877. *
  878. * bio the structure to write to
  879. * buf buffer to holding input string
  880. *
  881. * returns the size of the result placed in bio on success and a 0 or negative
  882. * value in an error case. -2 is returned if the implementation is not
  883. * supported for the BIO type.
  884. */
  885. int wolfSSL_BIO_puts(WOLFSSL_BIO* bio, const char* buf)
  886. {
  887. int sz;
  888. if (bio == NULL || buf == NULL) {
  889. return WOLFSSL_FATAL_ERROR;
  890. }
  891. /* check if is custom method */
  892. if (bio->method && bio->method->putsCb) {
  893. return bio->method->putsCb(bio, buf);
  894. }
  895. sz = (int)XSTRLEN(buf);
  896. if (sz <= 0) {
  897. return WOLFSSL_FATAL_ERROR;
  898. }
  899. return wolfSSL_BIO_write(bio, buf, sz);
  900. }
  901. /* searches through bio list for a BIO of type "type"
  902. * returns NULL on failure to find a given type */
  903. WOLFSSL_BIO* wolfSSL_BIO_find_type(WOLFSSL_BIO* bio, int type)
  904. {
  905. WOLFSSL_BIO* local = NULL;
  906. WOLFSSL_BIO* current;
  907. WOLFSSL_ENTER("wolfSSL_BIO_find_type");
  908. if (bio == NULL) {
  909. return local;
  910. }
  911. current = bio;
  912. while (current != NULL) {
  913. if (current->type == type) {
  914. WOLFSSL_MSG("Found matching WOLFSSL_BIO type");
  915. local = current;
  916. break;
  917. }
  918. current = current->next;
  919. }
  920. return local;
  921. }
  922. /* returns a pointer to the next WOLFSSL_BIO in the chain on success.
  923. * If a failure case then NULL is returned */
  924. WOLFSSL_BIO* wolfSSL_BIO_next(WOLFSSL_BIO* bio)
  925. {
  926. WOLFSSL_ENTER("wolfSSL_BIO_next");
  927. if (bio == NULL) {
  928. WOLFSSL_MSG("Bad argument passed in");
  929. return NULL;
  930. }
  931. return bio->next;
  932. }
  933. /* BIO_wpending returns the number of bytes pending to be written. */
  934. size_t wolfSSL_BIO_wpending(const WOLFSSL_BIO *bio)
  935. {
  936. WOLFSSL_ENTER("wolfSSL_BIO_wpending");
  937. if (bio == NULL)
  938. return 0;
  939. if (bio->type == WOLFSSL_BIO_MEMORY) {
  940. return bio->wrSz;
  941. }
  942. /* type BIO_BIO then check paired buffer */
  943. if (bio->type == WOLFSSL_BIO_BIO && bio->pair != NULL) {
  944. WOLFSSL_BIO* pair = bio->pair;
  945. return pair->wrIdx;
  946. }
  947. return 0;
  948. }
  949. /* Custom wolfSSL API to check if current bio object supports checking
  950. * pending state.
  951. */
  952. int wolfSSL_BIO_supports_pending(const WOLFSSL_BIO *bio)
  953. {
  954. while (bio) {
  955. if (bio->type == WOLFSSL_BIO_SSL ||
  956. bio->type == WOLFSSL_BIO_MEMORY ||
  957. bio->type == WOLFSSL_BIO_BIO)
  958. return 1;
  959. bio = bio->next;
  960. }
  961. return 0;
  962. }
  963. /* Return the number of pending bytes in read and write buffers */
  964. size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *bio)
  965. {
  966. #ifdef WOLFSSL_DEBUG_OPENSSL
  967. WOLFSSL_ENTER("wolfSSL_BIO_ctrl_pending");
  968. #endif
  969. if (bio == NULL) {
  970. return 0;
  971. }
  972. if (bio->type == WOLFSSL_BIO_MD ||
  973. bio->type == WOLFSSL_BIO_BASE64) {
  974. /* these are wrappers only, get next bio */
  975. while (bio->next != NULL) {
  976. bio = bio->next;
  977. if (bio->type == WOLFSSL_BIO_MD ||
  978. bio->type == WOLFSSL_BIO_BASE64) {
  979. break;
  980. }
  981. }
  982. }
  983. #ifndef WOLFCRYPT_ONLY
  984. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr != NULL) {
  985. return (long)wolfSSL_pending((WOLFSSL*)bio->ptr);
  986. }
  987. #endif
  988. if (bio->type == WOLFSSL_BIO_MEMORY) {
  989. return bio->wrSz - bio->rdIdx;
  990. }
  991. /* type BIO_BIO then check paired buffer */
  992. if (bio->type == WOLFSSL_BIO_BIO && bio->pair != NULL) {
  993. WOLFSSL_BIO* pair = bio->pair;
  994. if (pair->wrIdx > 0 && pair->wrIdx <= pair->rdIdx) {
  995. /* in wrap around state where beginning of buffer is being
  996. * overwritten */
  997. return pair->wrSz - pair->rdIdx + pair->wrIdx;
  998. }
  999. else {
  1000. /* simple case where has not wrapped around */
  1001. return pair->wrIdx - pair->rdIdx;
  1002. }
  1003. }
  1004. return 0;
  1005. }
  1006. long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO *bio, WOLFSSL_BUF_MEM **ptr)
  1007. {
  1008. WOLFSSL_BIO* front = bio;
  1009. long ret = WOLFSSL_FAILURE;
  1010. WOLFSSL_ENTER("wolfSSL_BIO_get_mem_ptr");
  1011. if (bio == NULL || ptr == NULL) {
  1012. return WOLFSSL_FAILURE;
  1013. }
  1014. /* start at end and work backwards to find a memory BIO in the BIO chain */
  1015. while ((bio != NULL) && (bio->next != NULL)) {
  1016. bio = bio->next;
  1017. }
  1018. while (bio != NULL) {
  1019. if (bio->type == WOLFSSL_BIO_MEMORY) {
  1020. *ptr = bio->mem_buf;
  1021. ret = WOLFSSL_SUCCESS;
  1022. }
  1023. if (bio == front) {
  1024. break;
  1025. }
  1026. bio = bio->prev;
  1027. }
  1028. return ret;
  1029. }
  1030. #ifdef OPENSSL_ALL
  1031. int wolfSSL_BIO_set_mem_buf(WOLFSSL_BIO* bio, WOLFSSL_BUF_MEM* bufMem,
  1032. int closeFlag)
  1033. {
  1034. if (!bio || !bufMem ||
  1035. (closeFlag != BIO_NOCLOSE && closeFlag != BIO_CLOSE))
  1036. return BAD_FUNC_ARG;
  1037. if (bio->mem_buf)
  1038. if (closeFlag == BIO_CLOSE)
  1039. wolfSSL_BUF_MEM_free(bio->mem_buf);
  1040. bio->mem_buf = bufMem;
  1041. bio->shutdown = closeFlag;
  1042. bio->wrSz = (int)bio->mem_buf->length;
  1043. bio->wrSzReset = bio->wrSz;
  1044. bio->num = (int)bio->mem_buf->max;
  1045. bio->ptr = bio->mem_buf->data;
  1046. bio->wrIdx = 0;
  1047. bio->rdIdx = 0;
  1048. return WOLFSSL_SUCCESS;
  1049. }
  1050. #endif
  1051. WOLFSSL_API long wolfSSL_BIO_int_ctrl(WOLFSSL_BIO *bp, int cmd, long larg, int iarg)
  1052. {
  1053. (void) bp;
  1054. (void) cmd;
  1055. (void) larg;
  1056. (void) iarg;
  1057. WOLFSSL_STUB("BIO_int_ctrl");
  1058. return 0;
  1059. }
  1060. int wolfSSL_BIO_set_write_buf_size(WOLFSSL_BIO *bio, long size)
  1061. {
  1062. WOLFSSL_ENTER("wolfSSL_BIO_set_write_buf_size");
  1063. if (bio == NULL || bio->type != WOLFSSL_BIO_BIO || (int)size < 0) {
  1064. return WOLFSSL_FAILURE;
  1065. }
  1066. /* if already in pair then do not change size */
  1067. if (bio->pair != NULL) {
  1068. WOLFSSL_MSG("WOLFSSL_BIO is paired, free from pair before changing");
  1069. return WOLFSSL_FAILURE;
  1070. }
  1071. if (bio->ptr != NULL) {
  1072. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  1073. }
  1074. bio->ptr = (byte*)XMALLOC(size, bio->heap, DYNAMIC_TYPE_OPENSSL);
  1075. if (bio->ptr == NULL) {
  1076. WOLFSSL_MSG("Memory allocation error");
  1077. bio->wrSz = 0;
  1078. bio->num = 0;
  1079. bio->wrIdx = 0;
  1080. bio->rdIdx = 0;
  1081. if (bio->mem_buf != NULL) {
  1082. bio->mem_buf->data = NULL;
  1083. bio->mem_buf->length = 0;
  1084. bio->mem_buf->max = 0;
  1085. }
  1086. return WOLFSSL_FAILURE;
  1087. }
  1088. bio->wrSz = (int)size;
  1089. bio->num = (int)size;
  1090. bio->wrIdx = 0;
  1091. bio->rdIdx = 0;
  1092. if (bio->mem_buf != NULL) {
  1093. bio->mem_buf->data = (char*)bio->ptr;
  1094. bio->mem_buf->length = bio->num;
  1095. bio->mem_buf->max = bio->num;
  1096. }
  1097. return WOLFSSL_SUCCESS;
  1098. }
  1099. /* Joins two BIO_BIO types. The write of b1 goes to the read of b2 and vice
  1100. * versa. Creating something similar to a two way pipe.
  1101. * Reading and writing between the two BIOs is not thread safe, they are
  1102. * expected to be used by the same thread. */
  1103. int wolfSSL_BIO_make_bio_pair(WOLFSSL_BIO *b1, WOLFSSL_BIO *b2)
  1104. {
  1105. WOLFSSL_ENTER("wolfSSL_BIO_make_bio_pair");
  1106. if (b1 == NULL || b2 == NULL) {
  1107. WOLFSSL_LEAVE("wolfSSL_BIO_make_bio_pair", BAD_FUNC_ARG);
  1108. return WOLFSSL_FAILURE;
  1109. }
  1110. /* both are expected to be of type BIO and not already paired */
  1111. if (b1->type != WOLFSSL_BIO_BIO || b2->type != WOLFSSL_BIO_BIO ||
  1112. b1->pair != NULL || b2->pair != NULL) {
  1113. WOLFSSL_MSG("Expected type BIO and not already paired");
  1114. return WOLFSSL_FAILURE;
  1115. }
  1116. /* set default write size if not already set */
  1117. if (b1->ptr == NULL && wolfSSL_BIO_set_write_buf_size(b1,
  1118. WOLFSSL_BIO_SIZE) != WOLFSSL_SUCCESS) {
  1119. return WOLFSSL_FAILURE;
  1120. }
  1121. if (b2->ptr == NULL && wolfSSL_BIO_set_write_buf_size(b2,
  1122. WOLFSSL_BIO_SIZE) != WOLFSSL_SUCCESS) {
  1123. return WOLFSSL_FAILURE;
  1124. }
  1125. b1->pair = b2;
  1126. b2->pair = b1;
  1127. return WOLFSSL_SUCCESS;
  1128. }
  1129. int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO *b)
  1130. {
  1131. WOLFSSL_ENTER("wolfSSL_BIO_ctrl_reset_read_request");
  1132. if (b == NULL || b->type == WOLFSSL_BIO_MEMORY) {
  1133. return WOLFSSL_FAILURE;
  1134. }
  1135. b->readRq = 0;
  1136. return WOLFSSL_SUCCESS;
  1137. }
  1138. /* Does not advance read index pointer */
  1139. int wolfSSL_BIO_nread0(WOLFSSL_BIO *bio, char **buf)
  1140. {
  1141. WOLFSSL_ENTER("wolfSSL_BIO_nread0");
  1142. if (bio == NULL || buf == NULL) {
  1143. WOLFSSL_MSG("NULL argument passed in");
  1144. return -2;
  1145. }
  1146. /* if paired read from pair */
  1147. if (bio->pair != NULL) {
  1148. WOLFSSL_BIO* pair = bio->pair;
  1149. /* case where have wrapped around write buffer */
  1150. *buf = (char*)pair->ptr + pair->rdIdx;
  1151. if (pair->wrIdx > 0 && pair->rdIdx >= pair->wrIdx) {
  1152. return pair->wrSz - pair->rdIdx;
  1153. }
  1154. else {
  1155. return pair->wrIdx - pair->rdIdx;
  1156. }
  1157. }
  1158. return -2;
  1159. }
  1160. /* similar to wolfSSL_BIO_nread0 but advances the read index */
  1161. int wolfSSL_BIO_nread(WOLFSSL_BIO *bio, char **buf, int num)
  1162. {
  1163. int sz = WOLFSSL_BIO_UNSET;
  1164. WOLFSSL_ENTER("wolfSSL_BIO_nread");
  1165. if (bio == NULL || buf == NULL) {
  1166. WOLFSSL_MSG("NULL argument passed in");
  1167. return WOLFSSL_FAILURE;
  1168. }
  1169. if (bio->type == WOLFSSL_BIO_MEMORY) {
  1170. return WOLFSSL_FAILURE;
  1171. }
  1172. if (bio->pair != NULL) {
  1173. /* special case if asking to read 0 bytes */
  1174. if (num == 0) {
  1175. *buf = (char*)bio->pair->ptr + bio->pair->rdIdx;
  1176. return 0;
  1177. }
  1178. /* get amount able to read and set buffer pointer */
  1179. sz = wolfSSL_BIO_nread0(bio, buf);
  1180. if (sz < 0) {
  1181. return WOLFSSL_BIO_ERROR;
  1182. }
  1183. if (num < sz) {
  1184. sz = num;
  1185. }
  1186. bio->pair->rdIdx += sz;
  1187. /* check if have read to the end of the buffer and need to reset */
  1188. if (bio->pair->rdIdx == bio->pair->wrSz) {
  1189. bio->pair->rdIdx = 0;
  1190. if (bio->pair->wrIdx == bio->pair->wrSz) {
  1191. bio->pair->wrIdx = 0;
  1192. }
  1193. }
  1194. /* check if read up to write index, if so then reset index */
  1195. if (bio->pair->rdIdx == bio->pair->wrIdx) {
  1196. bio->pair->rdIdx = 0;
  1197. bio->pair->wrIdx = 0;
  1198. }
  1199. }
  1200. return sz;
  1201. }
  1202. int wolfSSL_BIO_nwrite(WOLFSSL_BIO *bio, char **buf, int num)
  1203. {
  1204. int sz = WOLFSSL_BIO_UNSET;
  1205. WOLFSSL_ENTER("wolfSSL_BIO_nwrite");
  1206. if (bio == NULL || buf == NULL) {
  1207. WOLFSSL_MSG("NULL argument passed in");
  1208. return 0;
  1209. }
  1210. if (bio->type != WOLFSSL_BIO_BIO) {
  1211. return WOLFSSL_FAILURE;
  1212. }
  1213. if (bio->pair != NULL) {
  1214. if (num == 0) {
  1215. *buf = (char*)bio->ptr + bio->wrIdx;
  1216. return 0;
  1217. }
  1218. if (bio->wrIdx < bio->rdIdx) {
  1219. /* if wrapped around only write up to read index. In this case
  1220. * rdIdx is always greater then wrIdx so sz will not be negative. */
  1221. sz = bio->rdIdx - bio->wrIdx;
  1222. }
  1223. else if (bio->rdIdx > 0 && bio->wrIdx == bio->rdIdx) {
  1224. return WOLFSSL_BIO_ERROR; /* no more room to write */
  1225. }
  1226. else {
  1227. /* write index is past read index so write to end of buffer */
  1228. sz = bio->wrSz - bio->wrIdx;
  1229. if (sz <= 0) {
  1230. /* either an error has occurred with write index or it is at the
  1231. * end of the write buffer. */
  1232. if (bio->rdIdx == 0) {
  1233. /* no more room, nothing has been read */
  1234. return WOLFSSL_BIO_ERROR;
  1235. }
  1236. bio->wrIdx = 0;
  1237. /* check case where read index is not at 0 */
  1238. if (bio->rdIdx > 0) {
  1239. sz = bio->rdIdx; /* can write up to the read index */
  1240. }
  1241. else {
  1242. sz = bio->wrSz; /* no restriction other then buffer size */
  1243. }
  1244. }
  1245. }
  1246. if (num < sz) {
  1247. sz = num;
  1248. }
  1249. *buf = (char*)bio->ptr + bio->wrIdx;
  1250. bio->wrIdx += sz;
  1251. /* if at the end of the buffer and space for wrap around then set
  1252. * write index back to 0 */
  1253. if (bio->wrIdx == bio->wrSz && bio->rdIdx > 0) {
  1254. bio->wrIdx = 0;
  1255. }
  1256. }
  1257. return sz;
  1258. }
  1259. /* Reset BIO to initial state */
  1260. int wolfSSL_BIO_reset(WOLFSSL_BIO *bio)
  1261. {
  1262. WOLFSSL_ENTER("wolfSSL_BIO_reset");
  1263. if (bio == NULL) {
  1264. WOLFSSL_MSG("NULL argument passed in");
  1265. /* -1 is consistent failure even for FILE type */
  1266. return WOLFSSL_BIO_ERROR;
  1267. }
  1268. switch (bio->type) {
  1269. #ifndef NO_FILESYSTEM
  1270. case WOLFSSL_BIO_FILE:
  1271. if (XFSEEK((XFILE)bio->ptr, 0, XSEEK_SET) != 0)
  1272. return WOLFSSL_BIO_ERROR;
  1273. else
  1274. return 0;
  1275. #endif
  1276. case WOLFSSL_BIO_BIO:
  1277. bio->rdIdx = 0;
  1278. bio->wrIdx = 0;
  1279. return 0;
  1280. case WOLFSSL_BIO_MEMORY:
  1281. bio->rdIdx = 0;
  1282. if (bio->flags & BIO_FLAGS_MEM_RDONLY) {
  1283. bio->wrIdx = bio->wrSzReset;
  1284. bio->wrSz = bio->wrSzReset;
  1285. }
  1286. else {
  1287. bio->wrSz = 0;
  1288. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  1289. bio->ptr = NULL;
  1290. bio->num = 0;
  1291. if (bio->mem_buf != NULL) {
  1292. bio->mem_buf->data = NULL;
  1293. bio->mem_buf->length = 0;
  1294. bio->mem_buf->max = 0;
  1295. }
  1296. }
  1297. return 0;
  1298. #ifndef WOLFCRYPT_ONLY
  1299. case WOLFSSL_BIO_MD:
  1300. if (bio->ptr != NULL) {
  1301. const WOLFSSL_EVP_MD* md =
  1302. wolfSSL_EVP_MD_CTX_md((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  1303. wolfSSL_EVP_MD_CTX_cleanup((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  1304. wolfSSL_EVP_MD_CTX_init((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  1305. wolfSSL_EVP_DigestInit((WOLFSSL_EVP_MD_CTX*)bio->ptr, md);
  1306. }
  1307. return 0;
  1308. #endif /* WOLFCRYPT_ONLY */
  1309. default:
  1310. WOLFSSL_MSG("Unknown BIO type needs added to reset function");
  1311. }
  1312. return WOLFSSL_BIO_ERROR;
  1313. }
  1314. #ifndef NO_FILESYSTEM
  1315. /**
  1316. * Creates a new file BIO object
  1317. * @param fd file descriptor for to use for the new object
  1318. * @param close_flag BIO_NOCLOSE or BIO_CLOSE
  1319. * @return New BIO object or NULL on failure
  1320. */
  1321. WOLFSSL_BIO *wolfSSL_BIO_new_fd(int fd, int close_flag)
  1322. {
  1323. WOLFSSL_BIO* bio;
  1324. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  1325. if (!bio) {
  1326. WOLFSSL_MSG("wolfSSL_BIO_new error");
  1327. return NULL;
  1328. }
  1329. if (wolfSSL_BIO_set_fd(bio, fd, close_flag) != WOLFSSL_SUCCESS) {
  1330. wolfSSL_BIO_free(bio);
  1331. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  1332. return NULL;
  1333. }
  1334. return bio;
  1335. }
  1336. long wolfSSL_BIO_set_fp(WOLFSSL_BIO *bio, XFILE fp, int c)
  1337. {
  1338. WOLFSSL_ENTER("wolfSSL_BIO_set_fp");
  1339. if (bio == NULL || fp == XBADFILE) {
  1340. WOLFSSL_LEAVE("wolfSSL_BIO_set_fp", BAD_FUNC_ARG);
  1341. return WOLFSSL_FAILURE;
  1342. }
  1343. if (bio->type != WOLFSSL_BIO_FILE) {
  1344. return WOLFSSL_FAILURE;
  1345. }
  1346. bio->shutdown = (byte)c;
  1347. bio->ptr = (XFILE)fp;
  1348. return WOLFSSL_SUCCESS;
  1349. }
  1350. long wolfSSL_BIO_get_fp(WOLFSSL_BIO *bio, XFILE* fp)
  1351. {
  1352. WOLFSSL_ENTER("wolfSSL_BIO_get_fp");
  1353. if (bio == NULL || fp == XBADFILE) {
  1354. return WOLFSSL_FAILURE;
  1355. }
  1356. if (bio->type != WOLFSSL_BIO_FILE) {
  1357. return WOLFSSL_FAILURE;
  1358. }
  1359. *fp = (XFILE)bio->ptr;
  1360. return WOLFSSL_SUCCESS;
  1361. }
  1362. /* overwrites file */
  1363. int wolfSSL_BIO_write_filename(WOLFSSL_BIO *bio, char *name)
  1364. {
  1365. WOLFSSL_ENTER("wolfSSL_BIO_write_filename");
  1366. if (bio == NULL || name == NULL) {
  1367. return WOLFSSL_FAILURE;
  1368. }
  1369. if (bio->type == WOLFSSL_BIO_FILE) {
  1370. if (((XFILE)bio->ptr) != XBADFILE && bio->shutdown == BIO_CLOSE) {
  1371. XFCLOSE((XFILE)bio->ptr);
  1372. }
  1373. bio->ptr = XFOPEN(name, "w");
  1374. if (((XFILE)bio->ptr) == XBADFILE) {
  1375. return WOLFSSL_FAILURE;
  1376. }
  1377. bio->shutdown = BIO_CLOSE;
  1378. return WOLFSSL_SUCCESS;
  1379. }
  1380. return WOLFSSL_FAILURE;
  1381. }
  1382. int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs)
  1383. {
  1384. WOLFSSL_ENTER("wolfSSL_BIO_seek");
  1385. if (bio == NULL) {
  1386. return -1;
  1387. }
  1388. /* offset ofs from beginning of file */
  1389. if (bio->type == WOLFSSL_BIO_FILE &&
  1390. XFSEEK((XFILE)bio->ptr, ofs, SEEK_SET) < 0) {
  1391. return -1;
  1392. }
  1393. return 0;
  1394. }
  1395. /* wolfSSL_BIO_tell is provided as compatible API with
  1396. * BIO_tell which returns the current file position of a file related BIO.
  1397. * Returns the current file position on success and -1 for failure.
  1398. * Returns 0 for a BIOs except file related BIO.
  1399. */
  1400. int wolfSSL_BIO_tell(WOLFSSL_BIO* bio)
  1401. {
  1402. int pos;
  1403. WOLFSSL_ENTER("wolfSSL_BIO_tell");
  1404. if (bio == NULL) {
  1405. return -1;
  1406. }
  1407. if (bio->type != WOLFSSL_BIO_FILE) {
  1408. return 0;
  1409. }
  1410. pos = (int)XFTELL((XFILE)bio->ptr);
  1411. if (pos < 0)
  1412. return -1;
  1413. else
  1414. return pos;
  1415. }
  1416. #endif /* NO_FILESYSTEM */
  1417. long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO *bio, int v)
  1418. {
  1419. WOLFSSL_ENTER("wolfSSL_BIO_set_mem_eof_return");
  1420. if (bio != NULL && bio->type == WOLFSSL_BIO_MEMORY) {
  1421. bio->eof = v;
  1422. return WOLFSSL_SUCCESS;
  1423. }
  1424. else
  1425. return WOLFSSL_FAILURE;
  1426. }
  1427. int wolfSSL_BIO_get_len(WOLFSSL_BIO *bio)
  1428. {
  1429. int len;
  1430. #ifndef NO_FILESYSTEM
  1431. long memSz = 0;
  1432. XFILE file;
  1433. #endif
  1434. WOLFSSL_ENTER("wolfSSL_BIO_get_len");
  1435. if (bio == NULL) {
  1436. WOLFSSL_MSG("WOLFSSL_BIO was null");
  1437. len = BAD_FUNC_ARG;
  1438. }
  1439. else if ((len = wolfSSL_BIO_pending(bio)) > 0) {
  1440. }
  1441. #ifndef NO_FILESYSTEM
  1442. else if (bio->type == WOLFSSL_BIO_FILE) {
  1443. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  1444. len = BAD_FUNC_ARG;
  1445. if (len == 0) {
  1446. len = wolfssl_file_len(file, &memSz);
  1447. }
  1448. if (len == 0) {
  1449. len = (int)memSz;
  1450. }
  1451. }
  1452. #endif
  1453. return len;
  1454. }
  1455. void wolfSSL_BIO_set_callback(WOLFSSL_BIO *bio, wolf_bio_info_cb callback_func)
  1456. {
  1457. WOLFSSL_ENTER("wolfSSL_BIO_set_callback");
  1458. if (bio != NULL) {
  1459. bio->infoCb = callback_func;
  1460. }
  1461. }
  1462. wolf_bio_info_cb wolfSSL_BIO_get_callback(WOLFSSL_BIO *bio)
  1463. {
  1464. WOLFSSL_ENTER("wolfSSL_BIO_get_callback");
  1465. if (bio != NULL) {
  1466. return bio->infoCb;
  1467. }
  1468. return NULL;
  1469. }
  1470. void wolfSSL_BIO_set_callback_arg(WOLFSSL_BIO *bio, char *arg)
  1471. {
  1472. WOLFSSL_ENTER("wolfSSL_BIO_set_callback_arg");
  1473. if (bio != NULL) {
  1474. bio->infoArg = arg;
  1475. }
  1476. }
  1477. char* wolfSSL_BIO_get_callback_arg(const WOLFSSL_BIO *bio)
  1478. {
  1479. WOLFSSL_ENTER("wolfSSL_BIO_get_callback_arg");
  1480. if (bio != NULL) {
  1481. return bio->infoArg;
  1482. }
  1483. return NULL;
  1484. }
  1485. /* store a user pointer in the WOLFSSL_BIO structure */
  1486. void wolfSSL_BIO_set_data(WOLFSSL_BIO* bio, void *ptr)
  1487. {
  1488. WOLFSSL_ENTER("wolfSSL_BIO_set_data");
  1489. if (bio != NULL) {
  1490. bio->usrCtx = ptr;
  1491. }
  1492. }
  1493. void* wolfSSL_BIO_get_data(WOLFSSL_BIO* bio)
  1494. {
  1495. WOLFSSL_ENTER("wolfSSL_BIO_get_data");
  1496. if (bio != NULL)
  1497. return bio->usrCtx;
  1498. WOLFSSL_MSG("WOLFSSL_BIO was null");
  1499. return NULL;
  1500. }
  1501. /* If flag is 0 then blocking is set, if 1 then non blocking.
  1502. * Always returns WOLFSSL_SUCCESS.
  1503. */
  1504. long wolfSSL_BIO_set_nbio(WOLFSSL_BIO* bio, long on)
  1505. {
  1506. WOLFSSL_ENTER("wolfSSL_BIO_set_nbio");
  1507. if (bio) {
  1508. switch (bio->type) {
  1509. case WOLFSSL_BIO_SOCKET:
  1510. #ifdef XFCNTL
  1511. {
  1512. int ret;
  1513. int flag = XFCNTL(bio->num, F_GETFL, 0);
  1514. if (on) {
  1515. ret = XFCNTL(bio->num, F_SETFL, flag | O_NONBLOCK);
  1516. }
  1517. else {
  1518. ret = XFCNTL(bio->num, F_SETFL, flag & ~O_NONBLOCK);
  1519. }
  1520. if (ret == -1) {
  1521. WOLFSSL_MSG("Call to XFCNTL failed");
  1522. }
  1523. }
  1524. #endif
  1525. break;
  1526. case WOLFSSL_BIO_SSL:
  1527. #ifdef WOLFSSL_DTLS
  1528. wolfSSL_dtls_set_using_nonblock((WOLFSSL*)bio->ptr, (int)on);
  1529. #endif
  1530. break;
  1531. default:
  1532. WOLFSSL_MSG("Unsupported bio type for non blocking");
  1533. break;
  1534. }
  1535. }
  1536. (void)on;
  1537. return WOLFSSL_SUCCESS;
  1538. }
  1539. /* creates a new custom WOLFSSL_BIO_METHOD */
  1540. WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int type, const char *name)
  1541. {
  1542. WOLFSSL_BIO_METHOD* meth;
  1543. WOLFSSL_ENTER("wolfSSL_BIO_meth_new");
  1544. meth = (WOLFSSL_BIO_METHOD*)XMALLOC(sizeof(WOLFSSL_BIO_METHOD), NULL,
  1545. DYNAMIC_TYPE_OPENSSL);
  1546. if (meth == NULL) {
  1547. WOLFSSL_MSG("Error allocating memory for WOLFSSL_BIO_METHOD");
  1548. return NULL;
  1549. }
  1550. XMEMSET(meth, 0, sizeof(WOLFSSL_BIO_METHOD));
  1551. meth->type = (byte)type;
  1552. XSTRNCPY(meth->name, name, MAX_BIO_METHOD_NAME - 1);
  1553. return meth;
  1554. }
  1555. void wolfSSL_BIO_meth_free(WOLFSSL_BIO_METHOD *biom)
  1556. {
  1557. WOLFSSL_ENTER("wolfSSL_BIO_meth_free");
  1558. XFREE(biom, NULL, DYNAMIC_TYPE_OPENSSL);
  1559. }
  1560. int wolfSSL_BIO_meth_set_write(WOLFSSL_BIO_METHOD *biom,
  1561. wolfSSL_BIO_meth_write_cb biom_write)
  1562. {
  1563. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_write");
  1564. if (biom) {
  1565. biom->writeCb = biom_write;
  1566. return WOLFSSL_SUCCESS;
  1567. }
  1568. return WOLFSSL_FAILURE;
  1569. }
  1570. int wolfSSL_BIO_meth_set_read(WOLFSSL_BIO_METHOD *biom,
  1571. wolfSSL_BIO_meth_read_cb biom_read)
  1572. {
  1573. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_read");
  1574. if (biom) {
  1575. biom->readCb = biom_read;
  1576. return WOLFSSL_SUCCESS;
  1577. }
  1578. return WOLFSSL_FAILURE;
  1579. }
  1580. int wolfSSL_BIO_meth_set_puts(WOLFSSL_BIO_METHOD *biom,
  1581. wolfSSL_BIO_meth_puts_cb biom_puts)
  1582. {
  1583. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_puts");
  1584. if (biom) {
  1585. biom->putsCb = biom_puts;
  1586. return WOLFSSL_SUCCESS;
  1587. }
  1588. return WOLFSSL_FAILURE;
  1589. }
  1590. int wolfSSL_BIO_meth_set_gets(WOLFSSL_BIO_METHOD *biom,
  1591. wolfSSL_BIO_meth_gets_cb biom_gets)
  1592. {
  1593. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_gets");
  1594. if (biom) {
  1595. biom->getsCb = biom_gets;
  1596. return WOLFSSL_SUCCESS;
  1597. }
  1598. return WOLFSSL_FAILURE;
  1599. }
  1600. int wolfSSL_BIO_meth_set_ctrl(WOLFSSL_BIO_METHOD *biom,
  1601. wolfSSL_BIO_meth_ctrl_get_cb biom_ctrl)
  1602. {
  1603. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_ctrl");
  1604. if (biom) {
  1605. biom->ctrlCb = biom_ctrl;
  1606. return WOLFSSL_SUCCESS;
  1607. }
  1608. return WOLFSSL_FAILURE;
  1609. }
  1610. int wolfSSL_BIO_meth_set_create(WOLFSSL_BIO_METHOD *biom,
  1611. wolfSSL_BIO_meth_create_cb biom_create)
  1612. {
  1613. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_create");
  1614. if (biom) {
  1615. biom->createCb = biom_create;
  1616. return WOLFSSL_SUCCESS;
  1617. }
  1618. return WOLFSSL_FAILURE;
  1619. }
  1620. int wolfSSL_BIO_meth_set_destroy(WOLFSSL_BIO_METHOD *biom,
  1621. wolfSSL_BIO_meth_destroy_cb biom_destroy)
  1622. {
  1623. WOLFSSL_ENTER("wolfSSL_BIO_meth_set_destroy");
  1624. if (biom) {
  1625. biom->freeCb = biom_destroy;
  1626. return WOLFSSL_SUCCESS;
  1627. }
  1628. return WOLFSSL_FAILURE;
  1629. }
  1630. /* this compatibility function can be used for multiple BIO types */
  1631. int wolfSSL_BIO_get_mem_data(WOLFSSL_BIO* bio, void* p)
  1632. {
  1633. WOLFSSL_BIO* mem_bio;
  1634. #ifdef WOLFSSL_DEBUG_OPENSSL
  1635. WOLFSSL_ENTER("wolfSSL_BIO_get_mem_data");
  1636. #endif
  1637. if (bio == NULL)
  1638. return WOLFSSL_FATAL_ERROR;
  1639. mem_bio = bio;
  1640. /* Return pointer from last memory BIO in chain */
  1641. while (bio->next) {
  1642. bio = bio->next;
  1643. if (bio->type == WOLFSSL_BIO_MEMORY)
  1644. mem_bio = bio;
  1645. }
  1646. if (p) {
  1647. *(byte**)p = (byte*)mem_bio->ptr + mem_bio->rdIdx;
  1648. }
  1649. return mem_bio->wrSz - mem_bio->rdIdx;
  1650. }
  1651. int wolfSSL_BIO_pending(WOLFSSL_BIO* bio)
  1652. {
  1653. return (int)wolfSSL_BIO_ctrl_pending(bio);
  1654. }
  1655. int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
  1656. {
  1657. WOLFSSL_ENTER("wolfSSL_BIO_flush");
  1658. if (bio == NULL)
  1659. return WOLFSSL_FAILURE;
  1660. if (bio->method != NULL && bio->method->ctrlCb != NULL) {
  1661. WOLFSSL_MSG("Calling custom BIO flush callback");
  1662. return (int)bio->method->ctrlCb(bio, BIO_CTRL_FLUSH, 0, NULL);
  1663. }
  1664. else if (bio->type == WOLFSSL_BIO_FILE) {
  1665. #if !defined(NO_FILESYSTEM) && defined(XFFLUSH)
  1666. if (XFFLUSH((FILE *)bio->ptr) != 0)
  1667. return WOLFSSL_FAILURE;
  1668. #endif /* !NO_FILESYSTEM && XFFLUSH */
  1669. }
  1670. return WOLFSSL_SUCCESS;
  1671. }
  1672. #ifdef OPENSSL_EXTRA
  1673. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  1674. {
  1675. static WOLFSSL_BIO_METHOD meth =
  1676. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MD);
  1677. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  1678. return &meth;
  1679. }
  1680. /* return the context and initialize the BIO state */
  1681. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  1682. {
  1683. int ret = WOLFSSL_FAILURE;
  1684. if ((bio != NULL) && (mdcp != NULL)) {
  1685. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  1686. ret = WOLFSSL_SUCCESS;
  1687. }
  1688. return ret;
  1689. }
  1690. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  1691. {
  1692. static WOLFSSL_BIO_METHOD meth =
  1693. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BUFFER);
  1694. WOLFSSL_ENTER("wolfSSL_BIO_f_buffer");
  1695. return &meth;
  1696. }
  1697. #ifndef NO_WOLFSSL_STUB
  1698. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  1699. {
  1700. /* wolfSSL has internal buffer, compatibility only */
  1701. WOLFSSL_STUB("BIO_set_write_buffer_size");
  1702. WOLFSSL_MSG("Buffer resize failed");
  1703. (void)bio;
  1704. (void)size;
  1705. /* Even though this is only a STUB at the moment many user applications
  1706. * may attempt to use this. OpenSSL documentation specifies the return
  1707. * "return 1 if the buffer was successfully resized or 0 for failure."
  1708. * since wolfSSL does not resize the buffer will always return failure
  1709. * by default due to memory concerns until this stub is promoted to
  1710. * a non-stub function */
  1711. return WOLFSSL_FAILURE; /* 0, no resize happened */
  1712. }
  1713. #endif
  1714. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  1715. {
  1716. static WOLFSSL_BIO_METHOD bio_meth =
  1717. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BIO);
  1718. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  1719. return &bio_meth;
  1720. }
  1721. #ifndef NO_FILESYSTEM
  1722. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  1723. {
  1724. static WOLFSSL_BIO_METHOD file_meth =
  1725. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_FILE);
  1726. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  1727. return &file_meth;
  1728. }
  1729. #endif
  1730. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  1731. {
  1732. static WOLFSSL_BIO_METHOD meth =
  1733. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SSL);
  1734. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  1735. return &meth;
  1736. }
  1737. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  1738. {
  1739. static WOLFSSL_BIO_METHOD meth =
  1740. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SOCKET);
  1741. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  1742. return &meth;
  1743. }
  1744. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  1745. {
  1746. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  1747. WOLFSSL_ENTER("wolfSSL_BIO_new_socket");
  1748. if (bio) {
  1749. bio->type = WOLFSSL_BIO_SOCKET;
  1750. bio->shutdown = (byte)closeF;
  1751. bio->num = sfd;
  1752. }
  1753. return bio;
  1754. }
  1755. /**
  1756. * Create new socket BIO object. This is a pure TCP connection with
  1757. * no SSL or TLS protection.
  1758. * @param str IP address to connect to
  1759. * @return New BIO object or NULL on failure
  1760. */
  1761. WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str)
  1762. {
  1763. WOLFSSL_BIO *bio;
  1764. WOLFSSL_ENTER("wolfSSL_BIO_new_connect");
  1765. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  1766. if (bio) {
  1767. const char* port = XSTRSTR(str, ":");
  1768. if (port != NULL)
  1769. bio->port = (word16)XATOI(port + 1);
  1770. else
  1771. port = str + XSTRLEN(str); /* point to null terminator */
  1772. bio->ip = (char*)XMALLOC((port - str) + 1, /* +1 for null char */
  1773. bio->heap, DYNAMIC_TYPE_OPENSSL);
  1774. if (bio->ip != NULL) {
  1775. XMEMCPY(bio->ip, str, port - str);
  1776. bio->ip[port - str] = '\0';
  1777. bio->type = WOLFSSL_BIO_SOCKET;
  1778. }
  1779. else {
  1780. BIO_free(bio);
  1781. bio = NULL;
  1782. }
  1783. }
  1784. return bio;
  1785. }
  1786. /**
  1787. * Create new socket BIO object. This is a pure TCP connection with
  1788. * no SSL or TLS protection.
  1789. * @param port port to connect to
  1790. * @return New BIO object or NULL on failure
  1791. */
  1792. WOLFSSL_BIO *wolfSSL_BIO_new_accept(const char *port)
  1793. {
  1794. WOLFSSL_BIO *bio;
  1795. WOLFSSL_ENTER("wolfSSL_BIO_new_accept");
  1796. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  1797. if (bio) {
  1798. bio->port = (word16)XATOI(port);
  1799. bio->type = WOLFSSL_BIO_SOCKET;
  1800. }
  1801. return bio;
  1802. }
  1803. /**
  1804. * Set the port to connect to in the BIO object
  1805. * @param b BIO object
  1806. * @param port destination port
  1807. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  1808. */
  1809. long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port)
  1810. {
  1811. int p;
  1812. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port");
  1813. if (!b || !port) {
  1814. WOLFSSL_MSG("Bad parameter");
  1815. return WOLFSSL_FAILURE;
  1816. }
  1817. p = XATOI(port);
  1818. if (!p || p < 0) {
  1819. WOLFSSL_MSG("Port parsing error");
  1820. return WOLFSSL_FAILURE;
  1821. }
  1822. while (b != NULL && b->type != WOLFSSL_BIO_SOCKET) {
  1823. b = b->next;
  1824. }
  1825. if (b == NULL) {
  1826. WOLFSSL_MSG("Failed to find socket BIO in chain.");
  1827. return WOLFSSL_FAILURE;
  1828. }
  1829. b->port = (word16)p;
  1830. return WOLFSSL_SUCCESS;
  1831. }
  1832. #ifdef HAVE_HTTP_CLIENT
  1833. /**
  1834. * Attempt to connect to the destination address and port
  1835. * @param b BIO object
  1836. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  1837. */
  1838. long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b)
  1839. {
  1840. SOCKET_T sfd = SOCKET_INVALID;
  1841. WOLFSSL_ENTER("wolfSSL_BIO_do_connect");
  1842. if (!b) {
  1843. WOLFSSL_MSG("Bad parameter");
  1844. return WOLFSSL_FAILURE;
  1845. }
  1846. while (b && b->type != WOLFSSL_BIO_SOCKET)
  1847. b = b->next;
  1848. if (!b) {
  1849. WOLFSSL_MSG("No socket BIO in chain");
  1850. return WOLFSSL_FAILURE;
  1851. }
  1852. if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) {
  1853. WOLFSSL_MSG("wolfIO_TcpConnect error");
  1854. return WOLFSSL_FAILURE;
  1855. }
  1856. b->num = (int)sfd;
  1857. b->shutdown = BIO_CLOSE;
  1858. return WOLFSSL_SUCCESS;
  1859. }
  1860. #ifdef HAVE_SOCKADDR
  1861. int wolfSSL_BIO_do_accept(WOLFSSL_BIO *b)
  1862. {
  1863. SOCKET_T sfd = SOCKET_INVALID;
  1864. WOLFSSL_ENTER("wolfSSL_BIO_do_accept");
  1865. if (!b) {
  1866. WOLFSSL_MSG("Bad parameter");
  1867. return WOLFSSL_FAILURE;
  1868. }
  1869. while (b && b->type != WOLFSSL_BIO_SOCKET)
  1870. b = b->next;
  1871. if (!b) {
  1872. WOLFSSL_MSG("No socket BIO in chain");
  1873. return WOLFSSL_FAILURE;
  1874. }
  1875. if (b->num == WOLFSSL_BIO_ERROR) {
  1876. if (wolfIO_TcpBind(&sfd, b->port) < 0) {
  1877. WOLFSSL_MSG("wolfIO_TcpBind error");
  1878. return WOLFSSL_FAILURE;
  1879. }
  1880. b->num = (int)sfd;
  1881. b->shutdown = BIO_CLOSE;
  1882. }
  1883. else {
  1884. WOLFSSL_BIO* new_bio;
  1885. int newfd = wolfIO_TcpAccept(b->num, NULL, NULL);
  1886. if (newfd < 0) {
  1887. WOLFSSL_MSG("wolfIO_TcpBind error");
  1888. return WOLFSSL_FAILURE;
  1889. }
  1890. /* Create a socket BIO for using the accept'ed connection */
  1891. new_bio = wolfSSL_BIO_new_socket(newfd, BIO_CLOSE);
  1892. if (new_bio == NULL) {
  1893. WOLFSSL_MSG("wolfSSL_BIO_new_socket error");
  1894. CloseSocket(newfd);
  1895. return WOLFSSL_FAILURE;
  1896. }
  1897. wolfSSL_BIO_set_callback(new_bio,
  1898. wolfSSL_BIO_get_callback(b));
  1899. wolfSSL_BIO_set_callback_arg(new_bio,
  1900. wolfSSL_BIO_get_callback_arg(b));
  1901. /* Push onto bio chain for user retrieval */
  1902. if (wolfSSL_BIO_push(b, new_bio) == NULL) {
  1903. WOLFSSL_MSG("wolfSSL_BIO_push error");
  1904. /* newfd is closed when bio is free'd */
  1905. wolfSSL_BIO_free(new_bio);
  1906. return WOLFSSL_FAILURE;
  1907. }
  1908. }
  1909. return WOLFSSL_SUCCESS;
  1910. }
  1911. #endif /* HAVE_SOCKADDR */
  1912. #endif /* HAVE_HTTP_CLIENT */
  1913. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  1914. {
  1915. int ret = 0;
  1916. WOLFSSL_ENTER("wolfSSL_BIO_eof");
  1917. if (b == NULL)
  1918. return 1; /* Undefined in OpenSSL. Let's signal we're done. */
  1919. switch (b->type) {
  1920. case WOLFSSL_BIO_SSL:
  1921. ret = b->eof;
  1922. break;
  1923. default:
  1924. ret = wolfSSL_BIO_get_len(b) == 0;
  1925. break;
  1926. }
  1927. return ret;
  1928. }
  1929. long wolfSSL_BIO_do_handshake(WOLFSSL_BIO *b)
  1930. {
  1931. WOLFSSL_ENTER("wolfSSL_BIO_do_handshake");
  1932. if (b == NULL) {
  1933. WOLFSSL_MSG("Bad parameter");
  1934. return WOLFSSL_FAILURE;
  1935. }
  1936. if (b->type == WOLFSSL_BIO_SSL && b->ptr != NULL) {
  1937. return wolfSSL_negotiate((WOLFSSL*)b->ptr);
  1938. }
  1939. else {
  1940. WOLFSSL_MSG("Not SSL BIO or no SSL object set");
  1941. return WOLFSSL_FAILURE;
  1942. }
  1943. }
  1944. void wolfSSL_BIO_ssl_shutdown(WOLFSSL_BIO* b)
  1945. {
  1946. WOLFSSL_ENTER("wolfSSL_BIO_ssl_shutdown");
  1947. if (b == NULL) {
  1948. WOLFSSL_MSG("BIO is null.");
  1949. return;
  1950. }
  1951. while (b != NULL && b->type != WOLFSSL_BIO_SSL) {
  1952. b = b->next;
  1953. }
  1954. if (b == NULL) {
  1955. WOLFSSL_MSG("Failed to find SSL BIO in chain.");
  1956. return;
  1957. }
  1958. if (b->ptr != NULL) {
  1959. int rc = wolfSSL_shutdown((WOLFSSL*)b->ptr);
  1960. if (rc == SSL_SHUTDOWN_NOT_DONE) {
  1961. /* In this case, call again to give us a chance to read the
  1962. * close notify alert from the other end. */
  1963. wolfSSL_shutdown((WOLFSSL*)b->ptr);
  1964. }
  1965. }
  1966. else {
  1967. WOLFSSL_MSG("BIO has no SSL pointer set.");
  1968. }
  1969. }
  1970. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  1971. {
  1972. long ret = WOLFSSL_FAILURE;
  1973. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  1974. if (b != NULL) {
  1975. b->ptr = ssl;
  1976. b->shutdown = (byte)closeF;
  1977. if (b->next != NULL)
  1978. wolfSSL_set_bio(ssl, b->next, b->next);
  1979. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  1980. ret = WOLFSSL_SUCCESS;
  1981. }
  1982. return ret;
  1983. }
  1984. long wolfSSL_BIO_get_ssl(WOLFSSL_BIO* bio, WOLFSSL** ssl)
  1985. {
  1986. WOLFSSL_ENTER("wolfSSL_BIO_get_ssl");
  1987. if (bio == NULL) {
  1988. WOLFSSL_MSG("bio is null.");
  1989. return WOLFSSL_FAILURE;
  1990. }
  1991. if (ssl == NULL) {
  1992. WOLFSSL_MSG("ssl is null.");
  1993. return WOLFSSL_FAILURE;
  1994. }
  1995. if (bio->type != WOLFSSL_BIO_SSL) {
  1996. WOLFSSL_MSG("bio type is not WOLFSSL_BIO_SSL.");
  1997. return WOLFSSL_FAILURE;
  1998. }
  1999. *ssl = (WOLFSSL*)bio->ptr;
  2000. return WOLFSSL_SUCCESS;
  2001. }
  2002. WOLFSSL_BIO* wolfSSL_BIO_new_ssl(WOLFSSL_CTX* ctx, int client)
  2003. {
  2004. WOLFSSL* ssl = NULL;
  2005. WOLFSSL_BIO* sslBio = NULL;
  2006. int err = 0;
  2007. WOLFSSL_ENTER("wolfSSL_BIO_new_ssl");
  2008. if (ctx == NULL) {
  2009. WOLFSSL_MSG("ctx is NULL.");
  2010. err = 1;
  2011. }
  2012. if (err == 0) {
  2013. ssl = wolfSSL_new(ctx);
  2014. if (ssl == NULL) {
  2015. WOLFSSL_MSG("Failed to create SSL object from ctx.");
  2016. err = 1;
  2017. }
  2018. }
  2019. if (err == 0) {
  2020. sslBio = wolfSSL_BIO_new(wolfSSL_BIO_f_ssl());
  2021. if (sslBio == NULL) {
  2022. WOLFSSL_MSG("Failed to create SSL BIO.");
  2023. err = 1;
  2024. }
  2025. }
  2026. if (err == 0) {
  2027. if (!client)
  2028. wolfSSL_set_accept_state(ssl);
  2029. else
  2030. wolfSSL_set_connect_state(ssl);
  2031. }
  2032. if (err == 0 && wolfSSL_BIO_set_ssl(sslBio, ssl, BIO_CLOSE) !=
  2033. WOLFSSL_SUCCESS) {
  2034. WOLFSSL_MSG("Failed to set SSL pointer in BIO.");
  2035. err = 1;
  2036. }
  2037. if (err) {
  2038. wolfSSL_free(ssl);
  2039. wolfSSL_BIO_free(sslBio);
  2040. }
  2041. return sslBio;
  2042. }
  2043. WOLFSSL_BIO* wolfSSL_BIO_new_ssl_connect(WOLFSSL_CTX* ctx)
  2044. {
  2045. WOLFSSL_BIO* sslBio = NULL;
  2046. WOLFSSL_BIO* connBio = NULL;
  2047. int err = 0;
  2048. WOLFSSL_ENTER("wolfSSL_BIO_new_ssl_connect");
  2049. if (ctx == NULL) {
  2050. WOLFSSL_MSG("ctx is NULL.");
  2051. err = 1;
  2052. }
  2053. if (err == 0) {
  2054. sslBio = wolfSSL_BIO_new_ssl(ctx, 1);
  2055. if (sslBio == NULL) {
  2056. WOLFSSL_MSG("Failed to create SSL BIO.");
  2057. err = 1;
  2058. }
  2059. }
  2060. if (err == 0) {
  2061. connBio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  2062. if (connBio == NULL) {
  2063. WOLFSSL_MSG("Failed to create connect BIO.");
  2064. err = 1;
  2065. }
  2066. else {
  2067. wolfSSL_BIO_push(sslBio, connBio);
  2068. }
  2069. }
  2070. if (err == 1) {
  2071. wolfSSL_BIO_free(sslBio);
  2072. sslBio = NULL;
  2073. wolfSSL_BIO_free(connBio);
  2074. }
  2075. return sslBio;
  2076. }
  2077. long wolfSSL_BIO_set_conn_hostname(WOLFSSL_BIO* b, char* name)
  2078. {
  2079. size_t newLen = 0;
  2080. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_hostname");
  2081. if (name == NULL) {
  2082. WOLFSSL_MSG("Hostname is NULL.");
  2083. return WOLFSSL_FAILURE;
  2084. }
  2085. while (b != NULL && b->type != WOLFSSL_BIO_SOCKET) {
  2086. b = b->next;
  2087. }
  2088. if (b == NULL) {
  2089. WOLFSSL_MSG("Failed to find socket BIO in chain.");
  2090. return WOLFSSL_FAILURE;
  2091. }
  2092. newLen = XSTRLEN(name);
  2093. if (b->ip == NULL) {
  2094. /* +1 for null char */
  2095. b->ip = (char*)XMALLOC(newLen + 1, b->heap, DYNAMIC_TYPE_OPENSSL);
  2096. if (b->ip == NULL) {
  2097. WOLFSSL_MSG("Hostname malloc failed.");
  2098. return WOLFSSL_FAILURE;
  2099. }
  2100. }
  2101. else {
  2102. size_t currLen = XSTRLEN(b->ip);
  2103. if (currLen != newLen) {
  2104. b->ip = (char*)XREALLOC(b->ip, newLen + 1, b->heap,
  2105. DYNAMIC_TYPE_OPENSSL);
  2106. if (b->ip == NULL) {
  2107. WOLFSSL_MSG("Hostname realloc failed.");
  2108. return WOLFSSL_FAILURE;
  2109. }
  2110. }
  2111. }
  2112. XMEMCPY(b->ip, name, newLen);
  2113. b->ip[newLen] = '\0';
  2114. return WOLFSSL_SUCCESS;
  2115. }
  2116. #ifndef NO_FILESYSTEM
  2117. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  2118. {
  2119. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  2120. if (b != NULL) {
  2121. b->num = fd;
  2122. b->shutdown = (byte)closeF;
  2123. }
  2124. return WOLFSSL_SUCCESS;
  2125. }
  2126. #endif
  2127. /* Sets the close flag */
  2128. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  2129. {
  2130. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  2131. if (b != NULL) {
  2132. b->shutdown = (byte)flag;
  2133. }
  2134. return WOLFSSL_SUCCESS;
  2135. }
  2136. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  2137. WOLFSSL_BIO* wolfSSL_BIO_new(const WOLFSSL_BIO_METHOD* method)
  2138. #else
  2139. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  2140. #endif
  2141. {
  2142. WOLFSSL_BIO* bio;
  2143. WOLFSSL_ENTER("wolfSSL_BIO_new");
  2144. if (method == NULL) {
  2145. WOLFSSL_MSG("Bad method pointer passed in");
  2146. return NULL;
  2147. }
  2148. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  2149. DYNAMIC_TYPE_OPENSSL);
  2150. if (bio) {
  2151. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  2152. bio->type = (byte)method->type;
  2153. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  2154. bio->method = (WOLFSSL_BIO_METHOD*)method;
  2155. #else
  2156. bio->method = method;
  2157. #endif
  2158. bio->shutdown = BIO_CLOSE; /* default to close things */
  2159. bio->num = WOLFSSL_BIO_ERROR;
  2160. bio->init = 1;
  2161. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  2162. {
  2163. int ret;
  2164. wolfSSL_RefInit(&bio->ref, &ret);
  2165. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  2166. if (ret != 0) {
  2167. wolfSSL_BIO_free(bio);
  2168. WOLFSSL_MSG("wc_InitMutex failed for WOLFSSL_BIO");
  2169. return NULL;
  2170. }
  2171. #else
  2172. (void)ret;
  2173. #endif
  2174. }
  2175. #endif
  2176. if (method->type == WOLFSSL_BIO_MEMORY)
  2177. bio->eof = WOLFSSL_BIO_ERROR; /* Return value for empty buffer */
  2178. if (method->type == WOLFSSL_BIO_MEMORY ||
  2179. method->type == WOLFSSL_BIO_BIO) {
  2180. bio->mem_buf = wolfSSL_BUF_MEM_new();
  2181. if (bio->mem_buf == NULL) {
  2182. WOLFSSL_MSG("Memory error");
  2183. wolfSSL_BIO_free(bio);
  2184. return NULL;
  2185. }
  2186. }
  2187. if (method->type == WOLFSSL_BIO_MD) {
  2188. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  2189. if (bio->ptr == NULL) {
  2190. WOLFSSL_MSG("Memory error");
  2191. wolfSSL_BIO_free(bio);
  2192. return NULL;
  2193. }
  2194. }
  2195. /* check if is custom method */
  2196. if (method->createCb) {
  2197. method->createCb(bio);
  2198. }
  2199. }
  2200. return bio;
  2201. }
  2202. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  2203. {
  2204. WOLFSSL_BIO* bio = NULL;
  2205. if (buf == NULL) {
  2206. return bio;
  2207. }
  2208. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  2209. if (bio == NULL) {
  2210. return bio;
  2211. }
  2212. if (len < 0) {
  2213. /* The length of the string including terminating null. */
  2214. len = (int)XSTRLEN((const char*)buf) + 1;
  2215. }
  2216. if (len > 0 && wolfSSL_BUF_MEM_resize(bio->mem_buf, len) == 0) {
  2217. wolfSSL_BIO_free(bio);
  2218. return NULL;
  2219. }
  2220. bio->num = (int)bio->mem_buf->max;
  2221. bio->wrSz = len;
  2222. bio->ptr = bio->mem_buf->data;
  2223. if (len > 0 && bio->ptr != NULL) {
  2224. XMEMCPY(bio->ptr, buf, len);
  2225. bio->flags |= BIO_FLAGS_MEM_RDONLY;
  2226. bio->wrSzReset = bio->wrSz;
  2227. }
  2228. return bio;
  2229. }
  2230. /*
  2231. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  2232. * to the application.
  2233. * Returns 1 on success, 0 on failure
  2234. */
  2235. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  2236. {
  2237. int ret;
  2238. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  2239. int doFree = 0;
  2240. #endif
  2241. /* unchain?, doesn't matter in goahead since from free all */
  2242. WOLFSSL_ENTER("wolfSSL_BIO_free");
  2243. if (bio) {
  2244. if (bio->infoCb) {
  2245. /* info callback is called before free */
  2246. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  2247. if (ret <= 0) {
  2248. return ret;
  2249. }
  2250. }
  2251. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  2252. wolfSSL_RefDec(&bio->ref, &doFree, &ret);
  2253. if (!doFree) {
  2254. /* return success if BIO ref count is not 1 yet */
  2255. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  2256. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE ;
  2257. #else
  2258. (void)ret;
  2259. return WOLFSSL_SUCCESS;
  2260. #endif
  2261. }
  2262. #ifndef SINGLE_THREADED
  2263. wolfSSL_RefFree(&bio->ref);
  2264. #endif
  2265. #endif
  2266. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2267. wolfSSL_CRYPTO_cleanup_ex_data(&bio->ex_data);
  2268. #endif
  2269. /* call custom set free callback */
  2270. if (bio->method && bio->method->freeCb) {
  2271. bio->method->freeCb(bio);
  2272. }
  2273. /* remove from pair by setting the paired bios pair to NULL */
  2274. if (bio->pair != NULL) {
  2275. bio->pair->pair = NULL;
  2276. }
  2277. if (bio->ip != NULL) {
  2278. XFREE(bio->ip, bio->heap, DYNAMIC_TYPE_OPENSSL);
  2279. }
  2280. if (bio->shutdown) {
  2281. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  2282. wolfSSL_free((WOLFSSL*)bio->ptr);
  2283. #ifdef CloseSocket
  2284. if ((bio->type == WOLFSSL_BIO_SOCKET) && (bio->num > 0))
  2285. CloseSocket(bio->num);
  2286. #endif
  2287. }
  2288. #ifndef NO_FILESYSTEM
  2289. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  2290. if (bio->ptr) {
  2291. XFCLOSE((XFILE)bio->ptr);
  2292. }
  2293. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
  2294. && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  2295. else if (bio->num != WOLFSSL_BIO_ERROR) {
  2296. XCLOSE(bio->num);
  2297. }
  2298. #endif
  2299. }
  2300. #endif
  2301. if (bio->shutdown != BIO_NOCLOSE) {
  2302. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  2303. if (bio->mem_buf != NULL) {
  2304. if (bio->mem_buf->data != (char*)bio->ptr) {
  2305. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  2306. bio->ptr = NULL;
  2307. }
  2308. }
  2309. else {
  2310. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  2311. bio->ptr = NULL;
  2312. }
  2313. }
  2314. if (bio->mem_buf != NULL) {
  2315. wolfSSL_BUF_MEM_free(bio->mem_buf);
  2316. bio->mem_buf = NULL;
  2317. }
  2318. }
  2319. if (bio->type == WOLFSSL_BIO_MD) {
  2320. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  2321. }
  2322. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  2323. return WOLFSSL_SUCCESS;
  2324. }
  2325. return WOLFSSL_FAILURE;
  2326. }
  2327. /* like BIO_free, but no return value */
  2328. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  2329. {
  2330. wolfSSL_BIO_free(bio);
  2331. }
  2332. void wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  2333. {
  2334. WOLFSSL_ENTER("wolfSSL_BIO_free_all");
  2335. while (bio) {
  2336. WOLFSSL_BIO* next = bio->next;
  2337. wolfSSL_BIO_free(bio);
  2338. bio = next;
  2339. }
  2340. }
  2341. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  2342. {
  2343. WOLFSSL_ENTER("wolfSSL_BIO_push");
  2344. if (top == NULL) {
  2345. return append;
  2346. }
  2347. top->next = append;
  2348. if (append != NULL) {
  2349. append->prev = top;
  2350. }
  2351. /* SSL BIO's should use the next object in the chain for IO */
  2352. if (top->type == WOLFSSL_BIO_SSL && top->ptr)
  2353. wolfSSL_set_bio((WOLFSSL*)top->ptr, append, append);
  2354. return top;
  2355. }
  2356. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  2357. *
  2358. * bio is the WOLFSSL_BIO struct in the list and removed.
  2359. *
  2360. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  2361. * there is none.
  2362. */
  2363. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  2364. {
  2365. if (bio == NULL) {
  2366. WOLFSSL_MSG("Bad argument passed in");
  2367. return NULL;
  2368. }
  2369. if (bio->prev != NULL) {
  2370. bio->prev->next = bio->next;
  2371. }
  2372. if (bio->next != NULL) {
  2373. bio->next->prev = bio->prev;
  2374. }
  2375. return bio->next;
  2376. }
  2377. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  2378. {
  2379. static WOLFSSL_BIO_METHOD meth =
  2380. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MEMORY);
  2381. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  2382. return &meth;
  2383. }
  2384. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  2385. {
  2386. static WOLFSSL_BIO_METHOD meth =
  2387. WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BASE64);
  2388. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  2389. return &meth;
  2390. }
  2391. /* Set the flag for the bio.
  2392. *
  2393. * bio the structure to set the flag in
  2394. * flags the flag to use
  2395. */
  2396. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  2397. {
  2398. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  2399. if (bio != NULL) {
  2400. bio->flags |= flags;
  2401. }
  2402. }
  2403. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  2404. {
  2405. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  2406. if (bio != NULL) {
  2407. bio->flags &= ~flags;
  2408. }
  2409. }
  2410. /* Set ex_data for WOLFSSL_BIO
  2411. *
  2412. * bio : BIO structure to set ex_data in
  2413. * idx : Index of ex_data to set
  2414. * data : Data to set in ex_data
  2415. *
  2416. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  2417. */
  2418. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  2419. {
  2420. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  2421. #ifdef HAVE_EX_DATA
  2422. if (bio != NULL && idx < MAX_EX_DATA) {
  2423. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  2424. }
  2425. #else
  2426. (void)bio;
  2427. (void)idx;
  2428. (void)data;
  2429. #endif
  2430. return WOLFSSL_FAILURE;
  2431. }
  2432. int wolfSSL_BIO_get_fd(WOLFSSL_BIO *bio, int* fd)
  2433. {
  2434. WOLFSSL_ENTER("wolfSSL_BIO_get_fd");
  2435. if (bio != NULL) {
  2436. if (fd != NULL)
  2437. *fd = bio->num;
  2438. return bio->num;
  2439. }
  2440. return WOLFSSL_BIO_ERROR;
  2441. }
  2442. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2443. /* Set ex_data for WOLFSSL_BIO
  2444. *
  2445. * bio : BIO structure to set ex_data in
  2446. * idx : Index of ex_data to set
  2447. * data : Data to set in ex_data
  2448. * cleanup_routine : Function pointer to clean up data
  2449. *
  2450. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  2451. */
  2452. int wolfSSL_BIO_set_ex_data_with_cleanup(
  2453. WOLFSSL_BIO *bio,
  2454. int idx,
  2455. void *data,
  2456. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  2457. {
  2458. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data_with_cleanup");
  2459. if (bio != NULL && idx < MAX_EX_DATA) {
  2460. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&bio->ex_data, idx, data,
  2461. cleanup_routine);
  2462. }
  2463. return WOLFSSL_FAILURE;
  2464. }
  2465. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2466. /* Get ex_data in WOLFSSL_BIO at given index
  2467. *
  2468. * bio : BIO structure to get ex_data from
  2469. * idx : Index of ex_data to get data from
  2470. *
  2471. * Returns void pointer to ex_data on success or NULL on failure
  2472. */
  2473. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  2474. {
  2475. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  2476. #ifdef HAVE_EX_DATA
  2477. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  2478. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  2479. }
  2480. #else
  2481. (void)bio;
  2482. (void)idx;
  2483. #endif
  2484. return NULL;
  2485. }
  2486. #endif /* OPENSSL_EXTRA */
  2487. #ifndef NO_FILESYSTEM
  2488. PRAGMA_CLANG_DIAG_PUSH
  2489. PRAGMA_CLANG("clang diagnostic ignored \"-Wformat-nonliteral\"")
  2490. #endif
  2491. #if defined(OPENSSL_EXTRA)
  2492. /* returns amount printed on success, negative in fail case */
  2493. #ifdef __clang__
  2494. /* tell clang argument 2 is format */
  2495. __attribute__((__format__ (__printf__, 2, 0)))
  2496. #endif
  2497. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  2498. {
  2499. int ret = -1;
  2500. if (bio == NULL)
  2501. return WOLFSSL_FATAL_ERROR;
  2502. switch (bio->type) {
  2503. #if !defined(NO_FILESYSTEM)
  2504. case WOLFSSL_BIO_FILE:
  2505. if (bio->ptr == NULL) {
  2506. return -1;
  2507. }
  2508. ret = XVFPRINTF((XFILE)bio->ptr, format, args);
  2509. break;
  2510. #endif
  2511. case WOLFSSL_BIO_MEMORY:
  2512. /* In Visual Studio versions prior to Visual Studio 2013, the va_* symbols
  2513. aren't defined. If using Visual Studio 2013 or later, define
  2514. HAVE_VA_COPY. */
  2515. #if !defined(_WIN32) || defined(HAVE_VA_COPY)
  2516. case WOLFSSL_BIO_SSL:
  2517. {
  2518. int count;
  2519. char* pt = NULL;
  2520. va_list copy;
  2521. #ifdef FUSION_RTOS
  2522. copy = args; /* hack, depends on internal implementation
  2523. * of va_list in VisualDSP++ */
  2524. #else
  2525. va_copy(copy, args);
  2526. #endif
  2527. count = XVSNPRINTF(NULL, 0, format, args);
  2528. if (count >= 0)
  2529. {
  2530. pt = (char*)XMALLOC(count + 1, bio->heap,
  2531. DYNAMIC_TYPE_TMP_BUFFER);
  2532. if (pt != NULL)
  2533. {
  2534. count = XVSNPRINTF(pt, count + 1, format, copy);
  2535. if (count >= 0)
  2536. {
  2537. ret = wolfSSL_BIO_write(bio, pt, count);
  2538. }
  2539. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2540. }
  2541. }
  2542. va_end(copy);
  2543. }
  2544. break;
  2545. #endif /* !_WIN32 || HAVE_VA_COPY */
  2546. default:
  2547. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  2548. break;
  2549. }
  2550. return ret;
  2551. }
  2552. /* returns amount printed on success, negative in fail case */
  2553. #ifdef __clang__
  2554. /* tell clang argument 2 is format */
  2555. __attribute__((__format__ (__printf__, 2, 0)))
  2556. #endif
  2557. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  2558. {
  2559. int ret;
  2560. va_list args;
  2561. va_start(args, format);
  2562. ret = wolfSSL_BIO_vprintf(bio, format, args);
  2563. va_end(args);
  2564. return ret;
  2565. }
  2566. #ifndef NO_FILESYSTEM
  2567. PRAGMA_CLANG_DIAG_POP
  2568. #endif
  2569. #undef BIO_DUMP_LINE_LEN
  2570. #define BIO_DUMP_LINE_LEN 16
  2571. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  2572. {
  2573. int ret = 0;
  2574. #ifndef NO_FILESYSTEM
  2575. int lineOffset = 0;
  2576. #endif
  2577. if (bio == NULL)
  2578. return 0;
  2579. #ifndef NO_FILESYSTEM
  2580. do
  2581. {
  2582. int i;
  2583. char line[80];
  2584. int o;
  2585. if (!buf) {
  2586. return wolfSSL_BIO_write(bio, "\tNULL", 5);
  2587. }
  2588. XSPRINTF(line, "%04x - ", lineOffset);
  2589. o = 7;
  2590. for (i = 0; i < BIO_DUMP_LINE_LEN; i++) {
  2591. if (i < length)
  2592. XSPRINTF(line + o,"%02x ", (unsigned char)buf[i]);
  2593. else
  2594. XSPRINTF(line + o, " ");
  2595. if (i == 7)
  2596. XSPRINTF(line + o + 2, "-");
  2597. o += 3;
  2598. }
  2599. XSPRINTF(line + o, " ");
  2600. o += 2;
  2601. for (i = 0; (i < BIO_DUMP_LINE_LEN) && (i < length); i++) {
  2602. XSPRINTF(line + o, "%c",
  2603. ((31 < buf[i]) && (buf[i] < 127)) ? buf[i] : '.');
  2604. o++;
  2605. }
  2606. line[o++] = '\n';
  2607. ret += wolfSSL_BIO_write(bio, line, o);
  2608. buf += BIO_DUMP_LINE_LEN;
  2609. length -= BIO_DUMP_LINE_LEN;
  2610. lineOffset += BIO_DUMP_LINE_LEN;
  2611. }
  2612. while (length > 0);
  2613. #else
  2614. (void)buf;
  2615. (void)length;
  2616. #endif
  2617. return ret;
  2618. }
  2619. #endif /* OPENSSL_EXTRA */
  2620. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  2621. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  2622. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  2623. defined(WOLFSSL_HAPROXY)
  2624. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  2625. #ifndef NO_FILESYSTEM
  2626. XFILE fp;
  2627. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  2628. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  2629. {
  2630. XFCLOSE(fp);
  2631. }
  2632. fp = XFOPEN(name, "rb");
  2633. if (fp == XBADFILE)
  2634. return WOLFSSL_BAD_FILE;
  2635. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  2636. XFCLOSE(fp);
  2637. return WOLFSSL_BAD_FILE;
  2638. }
  2639. /* file is closed when bio is free'd */
  2640. return WOLFSSL_SUCCESS;
  2641. #else
  2642. (void)name;
  2643. (void)b;
  2644. return WOLFSSL_NOT_IMPLEMENTED;
  2645. #endif
  2646. }
  2647. #endif
  2648. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  2649. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  2650. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  2651. {
  2652. #ifndef NO_FILESYSTEM
  2653. WOLFSSL_BIO* bio;
  2654. XFILE fp;
  2655. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  2656. fp = XFOPEN(filename, mode);
  2657. if (fp == XBADFILE)
  2658. return NULL;
  2659. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  2660. if (bio == NULL) {
  2661. XFCLOSE(fp);
  2662. return bio;
  2663. }
  2664. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  2665. XFCLOSE(fp);
  2666. wolfSSL_BIO_free(bio);
  2667. bio = NULL;
  2668. }
  2669. /* file is closed when BIO is free'd */
  2670. return bio;
  2671. #else
  2672. (void)filename;
  2673. (void)mode;
  2674. return NULL;
  2675. #endif /* NO_FILESYSTEM */
  2676. }
  2677. #ifndef NO_FILESYSTEM
  2678. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  2679. {
  2680. WOLFSSL_BIO* bio;
  2681. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  2682. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  2683. if (bio == NULL) {
  2684. return bio;
  2685. }
  2686. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  2687. wolfSSL_BIO_free(bio);
  2688. bio = NULL;
  2689. }
  2690. /* file is closed when BIO is free'd or by user depending on flag */
  2691. return bio;
  2692. }
  2693. #endif
  2694. #endif
  2695. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  2696. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  2697. /* Creates a new bio pair.
  2698. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  2699. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  2700. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  2701. {
  2702. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  2703. int ret = 1;
  2704. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair");
  2705. if (bio1_p == NULL || bio2_p == NULL) {
  2706. WOLFSSL_MSG("Bad Function Argument");
  2707. return BAD_FUNC_ARG;
  2708. }
  2709. /* set up the new bio structures and write buf sizes */
  2710. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  2711. WOLFSSL_MSG("Bio allocation failed");
  2712. ret = WOLFSSL_FAILURE;
  2713. }
  2714. if (ret) {
  2715. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  2716. WOLFSSL_MSG("Bio allocation failed");
  2717. ret = WOLFSSL_FAILURE;
  2718. }
  2719. }
  2720. if (ret && writebuf1) {
  2721. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, (long)writebuf1))) {
  2722. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  2723. }
  2724. }
  2725. if (ret && writebuf2) {
  2726. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, (long)writebuf2))) {
  2727. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  2728. }
  2729. }
  2730. if (ret) {
  2731. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  2732. *bio1_p = bio1;
  2733. *bio2_p = bio2;
  2734. }
  2735. }
  2736. if (!ret) {
  2737. wolfSSL_BIO_free(bio1);
  2738. bio1 = NULL;
  2739. wolfSSL_BIO_free(bio2);
  2740. bio2 = NULL;
  2741. }
  2742. return ret;
  2743. }
  2744. #endif
  2745. #ifdef OPENSSL_ALL
  2746. #ifndef NO_WOLFSSL_STUB
  2747. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  2748. {
  2749. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  2750. (void)bio;
  2751. (void)init;
  2752. }
  2753. #endif /* NO_WOLFSSL_STUB */
  2754. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  2755. {
  2756. WOLFSSL_ENTER("wolfSSL_BIO_set_shutdown");
  2757. if (bio != NULL)
  2758. bio->shutdown = (byte)shut;
  2759. }
  2760. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  2761. {
  2762. WOLFSSL_ENTER("wolfSSL_BIO_get_shutdown");
  2763. return bio != NULL && bio->shutdown;
  2764. }
  2765. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  2766. {
  2767. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  2768. if (bio)
  2769. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ | WOLFSSL_BIO_FLAG_WRITE |
  2770. WOLFSSL_BIO_FLAG_RETRY);
  2771. }
  2772. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  2773. {
  2774. int ret = 0;
  2775. if (bio != NULL) {
  2776. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  2777. }
  2778. return ret;
  2779. }
  2780. int wolfSSL_BIO_should_read(WOLFSSL_BIO *bio)
  2781. {
  2782. int ret = 0;
  2783. if (bio != NULL) {
  2784. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_READ);
  2785. }
  2786. return ret;
  2787. }
  2788. int wolfSSL_BIO_should_write(WOLFSSL_BIO *bio)
  2789. {
  2790. int ret = 0;
  2791. if (bio != NULL) {
  2792. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_WRITE);
  2793. }
  2794. return ret;
  2795. }
  2796. #endif /* OPENSSL_ALL */
  2797. #endif /* WOLFSSL_BIO_INCLUDED */