eap.c 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428
  1. /*
  2. * eap.c - Extensible Authentication Protocol for PPP (RFC 2284)
  3. *
  4. * Copyright (c) 2001 by Sun Microsystems, Inc.
  5. * All rights reserved.
  6. *
  7. * Non-exclusive rights to redistribute, modify, translate, and use
  8. * this software in source and binary forms, in whole or in part, is
  9. * hereby granted, provided that the above copyright notice is
  10. * duplicated in any source form, and that neither the name of the
  11. * copyright holder nor the author is used to endorse or promote
  12. * products derived from this software.
  13. *
  14. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  15. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  16. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17. *
  18. * Original version by James Carlson
  19. *
  20. * This implementation of EAP supports MD5-Challenge and SRP-SHA1
  21. * authentication styles. Note that support of MD5-Challenge is a
  22. * requirement of RFC 2284, and that it's essentially just a
  23. * reimplementation of regular RFC 1994 CHAP using EAP messages.
  24. *
  25. * As an authenticator ("server"), there are multiple phases for each
  26. * style. In the first phase of each style, the unauthenticated peer
  27. * name is queried using the EAP Identity request type. If the
  28. * "remotename" option is used, then this phase is skipped, because
  29. * the peer's name is presumed to be known.
  30. *
  31. * For MD5-Challenge, there are two phases, and the second phase
  32. * consists of sending the challenge itself and handling the
  33. * associated response.
  34. *
  35. * For SRP-SHA1, there are four phases. The second sends 's', 'N',
  36. * and 'g'. The reply contains 'A'. The third sends 'B', and the
  37. * reply contains 'M1'. The forth sends the 'M2' value.
  38. *
  39. * As an authenticatee ("client"), there's just a single phase --
  40. * responding to the queries generated by the peer. EAP is an
  41. * authenticator-driven protocol.
  42. *
  43. * Based on draft-ietf-pppext-eap-srp-03.txt.
  44. */
  45. #define RCSID "$Id: eap.c,v 1.4 2004/11/09 22:39:25 paulus Exp $"
  46. /*
  47. * TODO:
  48. */
  49. #include <stdio.h>
  50. #include <stdlib.h>
  51. #include <string.h>
  52. #include <unistd.h>
  53. #include <pwd.h>
  54. #include <sys/types.h>
  55. #include <sys/stat.h>
  56. #include <fcntl.h>
  57. #include <assert.h>
  58. #include <errno.h>
  59. #include "pppd.h"
  60. #include "pathnames.h"
  61. #include "md5.h"
  62. #include "eap.h"
  63. #ifdef USE_SRP
  64. #include <t_pwd.h>
  65. #include <t_server.h>
  66. #include <t_client.h>
  67. #include "pppcrypt.h"
  68. #endif /* USE_SRP */
  69. #ifndef SHA_DIGESTSIZE
  70. #define SHA_DIGESTSIZE 20
  71. #endif
  72. static const char rcsid[] = RCSID;
  73. eap_state eap_states[NUM_PPP]; /* EAP state; one for each unit */
  74. #ifdef USE_SRP
  75. static char *pn_secret = NULL; /* Pseudonym generating secret */
  76. #endif
  77. /*
  78. * Command-line options.
  79. */
  80. static option_t eap_option_list[] = {
  81. { "eap-restart", o_int, &eap_states[0].es_server.ea_timeout,
  82. "Set retransmit timeout for EAP Requests (server)" },
  83. { "eap-max-sreq", o_int, &eap_states[0].es_server.ea_maxrequests,
  84. "Set max number of EAP Requests sent (server)" },
  85. { "eap-timeout", o_int, &eap_states[0].es_client.ea_timeout,
  86. "Set time limit for peer EAP authentication" },
  87. { "eap-max-rreq", o_int, &eap_states[0].es_client.ea_maxrequests,
  88. "Set max number of EAP Requests allows (client)" },
  89. { "eap-interval", o_int, &eap_states[0].es_rechallenge,
  90. "Set interval for EAP rechallenge" },
  91. #ifdef USE_SRP
  92. { "srp-interval", o_int, &eap_states[0].es_lwrechallenge,
  93. "Set interval for SRP lightweight rechallenge" },
  94. { "srp-pn-secret", o_string, &pn_secret,
  95. "Long term pseudonym generation secret" },
  96. { "srp-use-pseudonym", o_bool, &eap_states[0].es_usepseudo,
  97. "Use pseudonym if offered one by server", 1 },
  98. #endif
  99. { NULL }
  100. };
  101. /*
  102. * Protocol entry points.
  103. */
  104. static void eap_init __P((int unit));
  105. static void eap_input __P((int unit, u_char *inp, int inlen));
  106. static void eap_protrej __P((int unit));
  107. static void eap_lowerup __P((int unit));
  108. static void eap_lowerdown __P((int unit));
  109. static int eap_printpkt __P((u_char *inp, int inlen,
  110. void (*)(void *arg, char *fmt, ...), void *arg));
  111. struct protent eap_protent = {
  112. PPP_EAP, /* protocol number */
  113. eap_init, /* initialization procedure */
  114. eap_input, /* process a received packet */
  115. eap_protrej, /* process a received protocol-reject */
  116. eap_lowerup, /* lower layer has gone up */
  117. eap_lowerdown, /* lower layer has gone down */
  118. NULL, /* open the protocol */
  119. NULL, /* close the protocol */
  120. eap_printpkt, /* print a packet in readable form */
  121. NULL, /* process a received data packet */
  122. 1, /* protocol enabled */
  123. "EAP", /* text name of protocol */
  124. NULL, /* text name of corresponding data protocol */
  125. eap_option_list, /* list of command-line options */
  126. NULL, /* check requested options; assign defaults */
  127. NULL, /* configure interface for demand-dial */
  128. NULL /* say whether to bring up link for this pkt */
  129. };
  130. /*
  131. * A well-known 2048 bit modulus.
  132. */
  133. static const u_char wkmodulus[] = {
  134. 0xAC, 0x6B, 0xDB, 0x41, 0x32, 0x4A, 0x9A, 0x9B,
  135. 0xF1, 0x66, 0xDE, 0x5E, 0x13, 0x89, 0x58, 0x2F,
  136. 0xAF, 0x72, 0xB6, 0x65, 0x19, 0x87, 0xEE, 0x07,
  137. 0xFC, 0x31, 0x92, 0x94, 0x3D, 0xB5, 0x60, 0x50,
  138. 0xA3, 0x73, 0x29, 0xCB, 0xB4, 0xA0, 0x99, 0xED,
  139. 0x81, 0x93, 0xE0, 0x75, 0x77, 0x67, 0xA1, 0x3D,
  140. 0xD5, 0x23, 0x12, 0xAB, 0x4B, 0x03, 0x31, 0x0D,
  141. 0xCD, 0x7F, 0x48, 0xA9, 0xDA, 0x04, 0xFD, 0x50,
  142. 0xE8, 0x08, 0x39, 0x69, 0xED, 0xB7, 0x67, 0xB0,
  143. 0xCF, 0x60, 0x95, 0x17, 0x9A, 0x16, 0x3A, 0xB3,
  144. 0x66, 0x1A, 0x05, 0xFB, 0xD5, 0xFA, 0xAA, 0xE8,
  145. 0x29, 0x18, 0xA9, 0x96, 0x2F, 0x0B, 0x93, 0xB8,
  146. 0x55, 0xF9, 0x79, 0x93, 0xEC, 0x97, 0x5E, 0xEA,
  147. 0xA8, 0x0D, 0x74, 0x0A, 0xDB, 0xF4, 0xFF, 0x74,
  148. 0x73, 0x59, 0xD0, 0x41, 0xD5, 0xC3, 0x3E, 0xA7,
  149. 0x1D, 0x28, 0x1E, 0x44, 0x6B, 0x14, 0x77, 0x3B,
  150. 0xCA, 0x97, 0xB4, 0x3A, 0x23, 0xFB, 0x80, 0x16,
  151. 0x76, 0xBD, 0x20, 0x7A, 0x43, 0x6C, 0x64, 0x81,
  152. 0xF1, 0xD2, 0xB9, 0x07, 0x87, 0x17, 0x46, 0x1A,
  153. 0x5B, 0x9D, 0x32, 0xE6, 0x88, 0xF8, 0x77, 0x48,
  154. 0x54, 0x45, 0x23, 0xB5, 0x24, 0xB0, 0xD5, 0x7D,
  155. 0x5E, 0xA7, 0x7A, 0x27, 0x75, 0xD2, 0xEC, 0xFA,
  156. 0x03, 0x2C, 0xFB, 0xDB, 0xF5, 0x2F, 0xB3, 0x78,
  157. 0x61, 0x60, 0x27, 0x90, 0x04, 0xE5, 0x7A, 0xE6,
  158. 0xAF, 0x87, 0x4E, 0x73, 0x03, 0xCE, 0x53, 0x29,
  159. 0x9C, 0xCC, 0x04, 0x1C, 0x7B, 0xC3, 0x08, 0xD8,
  160. 0x2A, 0x56, 0x98, 0xF3, 0xA8, 0xD0, 0xC3, 0x82,
  161. 0x71, 0xAE, 0x35, 0xF8, 0xE9, 0xDB, 0xFB, 0xB6,
  162. 0x94, 0xB5, 0xC8, 0x03, 0xD8, 0x9F, 0x7A, 0xE4,
  163. 0x35, 0xDE, 0x23, 0x6D, 0x52, 0x5F, 0x54, 0x75,
  164. 0x9B, 0x65, 0xE3, 0x72, 0xFC, 0xD6, 0x8E, 0xF2,
  165. 0x0F, 0xA7, 0x11, 0x1F, 0x9E, 0x4A, 0xFF, 0x73
  166. };
  167. /* Local forward declarations. */
  168. static void eap_server_timeout __P((void *arg));
  169. /*
  170. * Convert EAP state code to printable string for debug.
  171. */
  172. static const char *
  173. eap_state_name(esc)
  174. enum eap_state_code esc;
  175. {
  176. static const char *state_names[] = { EAP_STATES };
  177. return (state_names[(int)esc]);
  178. }
  179. /*
  180. * eap_init - Initialize state for an EAP user. This is currently
  181. * called once by main() during start-up.
  182. */
  183. static void
  184. eap_init(unit)
  185. int unit;
  186. {
  187. eap_state *esp = &eap_states[unit];
  188. BZERO(esp, sizeof (*esp));
  189. esp->es_unit = unit;
  190. esp->es_server.ea_timeout = EAP_DEFTIMEOUT;
  191. esp->es_server.ea_maxrequests = EAP_DEFTRANSMITS;
  192. esp->es_server.ea_id = (u_char)(drand48() * 0x100);
  193. esp->es_client.ea_timeout = EAP_DEFREQTIME;
  194. esp->es_client.ea_maxrequests = EAP_DEFALLOWREQ;
  195. }
  196. /*
  197. * eap_client_timeout - Give up waiting for the peer to send any
  198. * Request messages.
  199. */
  200. static void
  201. eap_client_timeout(arg)
  202. void *arg;
  203. {
  204. eap_state *esp = (eap_state *) arg;
  205. if (!eap_client_active(esp))
  206. return;
  207. error("EAP: timeout waiting for Request from peer");
  208. auth_withpeer_fail(esp->es_unit, PPP_EAP);
  209. esp->es_client.ea_state = eapBadAuth;
  210. }
  211. /*
  212. * eap_authwithpeer - Authenticate to our peer (behave as client).
  213. *
  214. * Start client state and wait for requests. This is called only
  215. * after eap_lowerup.
  216. */
  217. void
  218. eap_authwithpeer(unit, localname)
  219. int unit;
  220. char *localname;
  221. {
  222. eap_state *esp = &eap_states[unit];
  223. /* Save the peer name we're given */
  224. esp->es_client.ea_name = localname;
  225. esp->es_client.ea_namelen = strlen(localname);
  226. esp->es_client.ea_state = eapListen;
  227. /*
  228. * Start a timer so that if the other end just goes
  229. * silent, we don't sit here waiting forever.
  230. */
  231. if (esp->es_client.ea_timeout > 0)
  232. TIMEOUT(eap_client_timeout, (void *)esp,
  233. esp->es_client.ea_timeout);
  234. }
  235. /*
  236. * Format a standard EAP Failure message and send it to the peer.
  237. * (Server operation)
  238. */
  239. static void
  240. eap_send_failure(esp)
  241. eap_state *esp;
  242. {
  243. u_char *outp;
  244. outp = outpacket_buf;
  245. MAKEHEADER(outp, PPP_EAP);
  246. PUTCHAR(EAP_FAILURE, outp);
  247. esp->es_server.ea_id++;
  248. PUTCHAR(esp->es_server.ea_id, outp);
  249. PUTSHORT(EAP_HEADERLEN, outp);
  250. output(esp->es_unit, outpacket_buf, EAP_HEADERLEN + PPP_HDRLEN);
  251. esp->es_server.ea_state = eapBadAuth;
  252. auth_peer_fail(esp->es_unit, PPP_EAP);
  253. }
  254. /*
  255. * Format a standard EAP Success message and send it to the peer.
  256. * (Server operation)
  257. */
  258. static void
  259. eap_send_success(esp)
  260. eap_state *esp;
  261. {
  262. u_char *outp;
  263. outp = outpacket_buf;
  264. MAKEHEADER(outp, PPP_EAP);
  265. PUTCHAR(EAP_SUCCESS, outp);
  266. esp->es_server.ea_id++;
  267. PUTCHAR(esp->es_server.ea_id, outp);
  268. PUTSHORT(EAP_HEADERLEN, outp);
  269. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + EAP_HEADERLEN);
  270. auth_peer_success(esp->es_unit, PPP_EAP, 0,
  271. esp->es_server.ea_peer, esp->es_server.ea_peerlen);
  272. }
  273. #ifdef USE_SRP
  274. /*
  275. * Set DES key according to pseudonym-generating secret and current
  276. * date.
  277. */
  278. static bool
  279. pncrypt_setkey(int timeoffs)
  280. {
  281. struct tm *tp;
  282. char tbuf[9];
  283. SHA1_CTX ctxt;
  284. u_char dig[SHA_DIGESTSIZE];
  285. time_t reftime;
  286. if (pn_secret == NULL)
  287. return (0);
  288. reftime = time(NULL) + timeoffs;
  289. tp = localtime(&reftime);
  290. SHA1Init(&ctxt);
  291. SHA1Update(&ctxt, pn_secret, strlen(pn_secret));
  292. strftime(tbuf, sizeof (tbuf), "%Y%m%d", tp);
  293. SHA1Update(&ctxt, tbuf, strlen(tbuf));
  294. SHA1Final(dig, &ctxt);
  295. return (DesSetkey(dig));
  296. }
  297. static char base64[] =
  298. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  299. struct b64state {
  300. u_int32_t bs_bits;
  301. int bs_offs;
  302. };
  303. static int
  304. b64enc(bs, inp, inlen, outp)
  305. struct b64state *bs;
  306. u_char *inp;
  307. int inlen;
  308. u_char *outp;
  309. {
  310. int outlen = 0;
  311. while (inlen > 0) {
  312. bs->bs_bits = (bs->bs_bits << 8) | *inp++;
  313. inlen--;
  314. bs->bs_offs += 8;
  315. if (bs->bs_offs >= 24) {
  316. *outp++ = base64[(bs->bs_bits >> 18) & 0x3F];
  317. *outp++ = base64[(bs->bs_bits >> 12) & 0x3F];
  318. *outp++ = base64[(bs->bs_bits >> 6) & 0x3F];
  319. *outp++ = base64[bs->bs_bits & 0x3F];
  320. outlen += 4;
  321. bs->bs_offs = 0;
  322. bs->bs_bits = 0;
  323. }
  324. }
  325. return (outlen);
  326. }
  327. static int
  328. b64flush(bs, outp)
  329. struct b64state *bs;
  330. u_char *outp;
  331. {
  332. int outlen = 0;
  333. if (bs->bs_offs == 8) {
  334. *outp++ = base64[(bs->bs_bits >> 2) & 0x3F];
  335. *outp++ = base64[(bs->bs_bits << 4) & 0x3F];
  336. outlen = 2;
  337. } else if (bs->bs_offs == 16) {
  338. *outp++ = base64[(bs->bs_bits >> 10) & 0x3F];
  339. *outp++ = base64[(bs->bs_bits >> 4) & 0x3F];
  340. *outp++ = base64[(bs->bs_bits << 2) & 0x3F];
  341. outlen = 3;
  342. }
  343. bs->bs_offs = 0;
  344. bs->bs_bits = 0;
  345. return (outlen);
  346. }
  347. static int
  348. b64dec(bs, inp, inlen, outp)
  349. struct b64state *bs;
  350. u_char *inp;
  351. int inlen;
  352. u_char *outp;
  353. {
  354. int outlen = 0;
  355. char *cp;
  356. while (inlen > 0) {
  357. if ((cp = strchr(base64, *inp++)) == NULL)
  358. break;
  359. bs->bs_bits = (bs->bs_bits << 6) | (cp - base64);
  360. inlen--;
  361. bs->bs_offs += 6;
  362. if (bs->bs_offs >= 8) {
  363. *outp++ = bs->bs_bits >> (bs->bs_offs - 8);
  364. outlen++;
  365. bs->bs_offs -= 8;
  366. }
  367. }
  368. return (outlen);
  369. }
  370. #endif /* USE_SRP */
  371. /*
  372. * Assume that current waiting server state is complete and figure
  373. * next state to use based on available authentication data. 'status'
  374. * indicates if there was an error in handling the last query. It is
  375. * 0 for success and non-zero for failure.
  376. */
  377. static void
  378. eap_figure_next_state(esp, status)
  379. eap_state *esp;
  380. int status;
  381. {
  382. #ifdef USE_SRP
  383. unsigned char secbuf[MAXWORDLEN], clear[8], *sp, *dp;
  384. struct t_pw tpw;
  385. struct t_confent *tce, mytce;
  386. char *cp, *cp2;
  387. struct t_server *ts;
  388. int id, i, plen, toffs;
  389. u_char vals[2];
  390. struct b64state bs;
  391. #endif /* USE_SRP */
  392. esp->es_server.ea_timeout = esp->es_savedtime;
  393. switch (esp->es_server.ea_state) {
  394. case eapBadAuth:
  395. return;
  396. case eapIdentify:
  397. #ifdef USE_SRP
  398. /* Discard any previous session. */
  399. ts = (struct t_server *)esp->es_server.ea_session;
  400. if (ts != NULL) {
  401. t_serverclose(ts);
  402. esp->es_server.ea_session = NULL;
  403. esp->es_server.ea_skey = NULL;
  404. }
  405. #endif /* USE_SRP */
  406. if (status != 0) {
  407. esp->es_server.ea_state = eapBadAuth;
  408. break;
  409. }
  410. #ifdef USE_SRP
  411. /* If we've got a pseudonym, try to decode to real name. */
  412. if (esp->es_server.ea_peerlen > SRP_PSEUDO_LEN &&
  413. strncmp(esp->es_server.ea_peer, SRP_PSEUDO_ID,
  414. SRP_PSEUDO_LEN) == 0 &&
  415. (esp->es_server.ea_peerlen - SRP_PSEUDO_LEN) * 3 / 4 <
  416. sizeof (secbuf)) {
  417. BZERO(&bs, sizeof (bs));
  418. plen = b64dec(&bs,
  419. esp->es_server.ea_peer + SRP_PSEUDO_LEN,
  420. esp->es_server.ea_peerlen - SRP_PSEUDO_LEN,
  421. secbuf);
  422. toffs = 0;
  423. for (i = 0; i < 5; i++) {
  424. pncrypt_setkey(toffs);
  425. toffs -= 86400;
  426. if (!DesDecrypt(secbuf, clear)) {
  427. dbglog("no DES here; cannot decode "
  428. "pseudonym");
  429. return;
  430. }
  431. id = *(unsigned char *)clear;
  432. if (id + 1 <= plen && id + 9 > plen)
  433. break;
  434. }
  435. if (plen % 8 == 0 && i < 5) {
  436. /*
  437. * Note that this is always shorter than the
  438. * original stored string, so there's no need
  439. * to realloc.
  440. */
  441. if ((i = plen = *(unsigned char *)clear) > 7)
  442. i = 7;
  443. esp->es_server.ea_peerlen = plen;
  444. dp = (unsigned char *)esp->es_server.ea_peer;
  445. BCOPY(clear + 1, dp, i);
  446. plen -= i;
  447. dp += i;
  448. sp = secbuf + 8;
  449. while (plen > 0) {
  450. (void) DesDecrypt(sp, dp);
  451. sp += 8;
  452. dp += 8;
  453. plen -= 8;
  454. }
  455. esp->es_server.ea_peer[
  456. esp->es_server.ea_peerlen] = '\0';
  457. dbglog("decoded pseudonym to \"%.*q\"",
  458. esp->es_server.ea_peerlen,
  459. esp->es_server.ea_peer);
  460. } else {
  461. dbglog("failed to decode real name");
  462. /* Stay in eapIdentfy state; requery */
  463. break;
  464. }
  465. }
  466. /* Look up user in secrets database. */
  467. if (get_srp_secret(esp->es_unit, esp->es_server.ea_peer,
  468. esp->es_server.ea_name, (char *)secbuf, 1) != 0) {
  469. /* Set up default in case SRP entry is bad */
  470. esp->es_server.ea_state = eapMD5Chall;
  471. /* Get t_confent based on index in srp-secrets */
  472. id = strtol((char *)secbuf, &cp, 10);
  473. if (*cp++ != ':' || id < 0)
  474. break;
  475. if (id == 0) {
  476. mytce.index = 0;
  477. mytce.modulus.data = (u_char *)wkmodulus;
  478. mytce.modulus.len = sizeof (wkmodulus);
  479. mytce.generator.data = (u_char *)"\002";
  480. mytce.generator.len = 1;
  481. tce = &mytce;
  482. } else if ((tce = gettcid(id)) != NULL) {
  483. /*
  484. * Client will have to verify this modulus/
  485. * generator combination, and that will take
  486. * a while. Lengthen the timeout here.
  487. */
  488. if (esp->es_server.ea_timeout > 0 &&
  489. esp->es_server.ea_timeout < 30)
  490. esp->es_server.ea_timeout = 30;
  491. } else {
  492. break;
  493. }
  494. if ((cp2 = strchr(cp, ':')) == NULL)
  495. break;
  496. *cp2++ = '\0';
  497. tpw.pebuf.name = esp->es_server.ea_peer;
  498. tpw.pebuf.password.len = t_fromb64((char *)tpw.pwbuf,
  499. cp);
  500. tpw.pebuf.password.data = tpw.pwbuf;
  501. tpw.pebuf.salt.len = t_fromb64((char *)tpw.saltbuf,
  502. cp2);
  503. tpw.pebuf.salt.data = tpw.saltbuf;
  504. if ((ts = t_serveropenraw(&tpw.pebuf, tce)) == NULL)
  505. break;
  506. esp->es_server.ea_session = (void *)ts;
  507. esp->es_server.ea_state = eapSRP1;
  508. vals[0] = esp->es_server.ea_id + 1;
  509. vals[1] = EAPT_SRP;
  510. t_serveraddexdata(ts, vals, 2);
  511. /* Generate B; must call before t_servergetkey() */
  512. t_servergenexp(ts);
  513. break;
  514. }
  515. #endif /* USE_SRP */
  516. esp->es_server.ea_state = eapMD5Chall;
  517. break;
  518. case eapSRP1:
  519. #ifdef USE_SRP
  520. ts = (struct t_server *)esp->es_server.ea_session;
  521. if (ts != NULL && status != 0) {
  522. t_serverclose(ts);
  523. esp->es_server.ea_session = NULL;
  524. esp->es_server.ea_skey = NULL;
  525. }
  526. #endif /* USE_SRP */
  527. if (status == 1) {
  528. esp->es_server.ea_state = eapMD5Chall;
  529. } else if (status != 0 || esp->es_server.ea_session == NULL) {
  530. esp->es_server.ea_state = eapBadAuth;
  531. } else {
  532. esp->es_server.ea_state = eapSRP2;
  533. }
  534. break;
  535. case eapSRP2:
  536. #ifdef USE_SRP
  537. ts = (struct t_server *)esp->es_server.ea_session;
  538. if (ts != NULL && status != 0) {
  539. t_serverclose(ts);
  540. esp->es_server.ea_session = NULL;
  541. esp->es_server.ea_skey = NULL;
  542. }
  543. #endif /* USE_SRP */
  544. if (status != 0 || esp->es_server.ea_session == NULL) {
  545. esp->es_server.ea_state = eapBadAuth;
  546. } else {
  547. esp->es_server.ea_state = eapSRP3;
  548. }
  549. break;
  550. case eapSRP3:
  551. case eapSRP4:
  552. #ifdef USE_SRP
  553. ts = (struct t_server *)esp->es_server.ea_session;
  554. if (ts != NULL && status != 0) {
  555. t_serverclose(ts);
  556. esp->es_server.ea_session = NULL;
  557. esp->es_server.ea_skey = NULL;
  558. }
  559. #endif /* USE_SRP */
  560. if (status != 0 || esp->es_server.ea_session == NULL) {
  561. esp->es_server.ea_state = eapBadAuth;
  562. } else {
  563. esp->es_server.ea_state = eapOpen;
  564. }
  565. break;
  566. case eapMD5Chall:
  567. if (status != 0) {
  568. esp->es_server.ea_state = eapBadAuth;
  569. } else {
  570. esp->es_server.ea_state = eapOpen;
  571. }
  572. break;
  573. default:
  574. esp->es_server.ea_state = eapBadAuth;
  575. break;
  576. }
  577. if (esp->es_server.ea_state == eapBadAuth)
  578. eap_send_failure(esp);
  579. }
  580. /*
  581. * Format an EAP Request message and send it to the peer. Message
  582. * type depends on current state. (Server operation)
  583. */
  584. static void
  585. eap_send_request(esp)
  586. eap_state *esp;
  587. {
  588. u_char *outp;
  589. u_char *lenloc;
  590. u_char *ptr;
  591. int outlen;
  592. int challen;
  593. char *str;
  594. #ifdef USE_SRP
  595. struct t_server *ts;
  596. u_char clear[8], cipher[8], dig[SHA_DIGESTSIZE], *optr, *cp;
  597. int i, j;
  598. struct b64state b64;
  599. SHA1_CTX ctxt;
  600. #endif /* USE_SRP */
  601. /* Handle both initial auth and restart */
  602. if (esp->es_server.ea_state < eapIdentify &&
  603. esp->es_server.ea_state != eapInitial) {
  604. esp->es_server.ea_state = eapIdentify;
  605. if (explicit_remote) {
  606. /*
  607. * If we already know the peer's
  608. * unauthenticated name, then there's no
  609. * reason to ask. Go to next state instead.
  610. */
  611. esp->es_server.ea_peer = remote_name;
  612. esp->es_server.ea_peerlen = strlen(remote_name);
  613. eap_figure_next_state(esp, 0);
  614. }
  615. }
  616. if (esp->es_server.ea_maxrequests > 0 &&
  617. esp->es_server.ea_requests >= esp->es_server.ea_maxrequests) {
  618. if (esp->es_server.ea_responses > 0)
  619. error("EAP: too many Requests sent");
  620. else
  621. error("EAP: no response to Requests");
  622. eap_send_failure(esp);
  623. return;
  624. }
  625. outp = outpacket_buf;
  626. MAKEHEADER(outp, PPP_EAP);
  627. PUTCHAR(EAP_REQUEST, outp);
  628. PUTCHAR(esp->es_server.ea_id, outp);
  629. lenloc = outp;
  630. INCPTR(2, outp);
  631. switch (esp->es_server.ea_state) {
  632. case eapIdentify:
  633. PUTCHAR(EAPT_IDENTITY, outp);
  634. str = "Name";
  635. challen = strlen(str);
  636. BCOPY(str, outp, challen);
  637. INCPTR(challen, outp);
  638. break;
  639. case eapMD5Chall:
  640. PUTCHAR(EAPT_MD5CHAP, outp);
  641. /*
  642. * pick a random challenge length between
  643. * MIN_CHALLENGE_LENGTH and MAX_CHALLENGE_LENGTH
  644. */
  645. challen = (drand48() *
  646. (MAX_CHALLENGE_LENGTH - MIN_CHALLENGE_LENGTH)) +
  647. MIN_CHALLENGE_LENGTH;
  648. PUTCHAR(challen, outp);
  649. esp->es_challen = challen;
  650. ptr = esp->es_challenge;
  651. while (--challen >= 0)
  652. *ptr++ = (u_char) (drand48() * 0x100);
  653. BCOPY(esp->es_challenge, outp, esp->es_challen);
  654. INCPTR(esp->es_challen, outp);
  655. BCOPY(esp->es_server.ea_name, outp, esp->es_server.ea_namelen);
  656. INCPTR(esp->es_server.ea_namelen, outp);
  657. break;
  658. #ifdef USE_SRP
  659. case eapSRP1:
  660. PUTCHAR(EAPT_SRP, outp);
  661. PUTCHAR(EAPSRP_CHALLENGE, outp);
  662. PUTCHAR(esp->es_server.ea_namelen, outp);
  663. BCOPY(esp->es_server.ea_name, outp, esp->es_server.ea_namelen);
  664. INCPTR(esp->es_server.ea_namelen, outp);
  665. ts = (struct t_server *)esp->es_server.ea_session;
  666. assert(ts != NULL);
  667. PUTCHAR(ts->s.len, outp);
  668. BCOPY(ts->s.data, outp, ts->s.len);
  669. INCPTR(ts->s.len, outp);
  670. if (ts->g.len == 1 && ts->g.data[0] == 2) {
  671. PUTCHAR(0, outp);
  672. } else {
  673. PUTCHAR(ts->g.len, outp);
  674. BCOPY(ts->g.data, outp, ts->g.len);
  675. INCPTR(ts->g.len, outp);
  676. }
  677. if (ts->n.len != sizeof (wkmodulus) ||
  678. BCMP(ts->n.data, wkmodulus, sizeof (wkmodulus)) != 0) {
  679. BCOPY(ts->n.data, outp, ts->n.len);
  680. INCPTR(ts->n.len, outp);
  681. }
  682. break;
  683. case eapSRP2:
  684. PUTCHAR(EAPT_SRP, outp);
  685. PUTCHAR(EAPSRP_SKEY, outp);
  686. ts = (struct t_server *)esp->es_server.ea_session;
  687. assert(ts != NULL);
  688. BCOPY(ts->B.data, outp, ts->B.len);
  689. INCPTR(ts->B.len, outp);
  690. break;
  691. case eapSRP3:
  692. PUTCHAR(EAPT_SRP, outp);
  693. PUTCHAR(EAPSRP_SVALIDATOR, outp);
  694. PUTLONG(SRPVAL_EBIT, outp);
  695. ts = (struct t_server *)esp->es_server.ea_session;
  696. assert(ts != NULL);
  697. BCOPY(t_serverresponse(ts), outp, SHA_DIGESTSIZE);
  698. INCPTR(SHA_DIGESTSIZE, outp);
  699. if (pncrypt_setkey(0)) {
  700. /* Generate pseudonym */
  701. optr = outp;
  702. cp = (unsigned char *)esp->es_server.ea_peer;
  703. if ((j = i = esp->es_server.ea_peerlen) > 7)
  704. j = 7;
  705. clear[0] = i;
  706. BCOPY(cp, clear + 1, j);
  707. i -= j;
  708. cp += j;
  709. if (!DesEncrypt(clear, cipher)) {
  710. dbglog("no DES here; not generating pseudonym");
  711. break;
  712. }
  713. BZERO(&b64, sizeof (b64));
  714. outp++; /* space for pseudonym length */
  715. outp += b64enc(&b64, cipher, 8, outp);
  716. while (i >= 8) {
  717. (void) DesEncrypt(cp, cipher);
  718. outp += b64enc(&b64, cipher, 8, outp);
  719. cp += 8;
  720. i -= 8;
  721. }
  722. if (i > 0) {
  723. BCOPY(cp, clear, i);
  724. cp += i;
  725. while (i < 8) {
  726. *cp++ = drand48() * 0x100;
  727. i++;
  728. }
  729. (void) DesEncrypt(clear, cipher);
  730. outp += b64enc(&b64, cipher, 8, outp);
  731. }
  732. outp += b64flush(&b64, outp);
  733. /* Set length and pad out to next 20 octet boundary */
  734. i = outp - optr - 1;
  735. *optr = i;
  736. i %= SHA_DIGESTSIZE;
  737. if (i != 0) {
  738. while (i < SHA_DIGESTSIZE) {
  739. *outp++ = drand48() * 0x100;
  740. i++;
  741. }
  742. }
  743. /* Obscure the pseudonym with SHA1 hash */
  744. SHA1Init(&ctxt);
  745. SHA1Update(&ctxt, &esp->es_server.ea_id, 1);
  746. SHA1Update(&ctxt, esp->es_server.ea_skey,
  747. SESSION_KEY_LEN);
  748. SHA1Update(&ctxt, esp->es_server.ea_peer,
  749. esp->es_server.ea_peerlen);
  750. while (optr < outp) {
  751. SHA1Final(dig, &ctxt);
  752. cp = dig;
  753. while (cp < dig + SHA_DIGESTSIZE)
  754. *optr++ ^= *cp++;
  755. SHA1Init(&ctxt);
  756. SHA1Update(&ctxt, &esp->es_server.ea_id, 1);
  757. SHA1Update(&ctxt, esp->es_server.ea_skey,
  758. SESSION_KEY_LEN);
  759. SHA1Update(&ctxt, optr - SHA_DIGESTSIZE,
  760. SHA_DIGESTSIZE);
  761. }
  762. }
  763. break;
  764. case eapSRP4:
  765. PUTCHAR(EAPT_SRP, outp);
  766. PUTCHAR(EAPSRP_LWRECHALLENGE, outp);
  767. challen = MIN_CHALLENGE_LENGTH +
  768. ((MAX_CHALLENGE_LENGTH - MIN_CHALLENGE_LENGTH) * drand48());
  769. esp->es_challen = challen;
  770. ptr = esp->es_challenge;
  771. while (--challen >= 0)
  772. *ptr++ = drand48() * 0x100;
  773. BCOPY(esp->es_challenge, outp, esp->es_challen);
  774. INCPTR(esp->es_challen, outp);
  775. break;
  776. #endif /* USE_SRP */
  777. default:
  778. return;
  779. }
  780. outlen = (outp - outpacket_buf) - PPP_HDRLEN;
  781. PUTSHORT(outlen, lenloc);
  782. output(esp->es_unit, outpacket_buf, outlen + PPP_HDRLEN);
  783. esp->es_server.ea_requests++;
  784. if (esp->es_server.ea_timeout > 0)
  785. TIMEOUT(eap_server_timeout, esp, esp->es_server.ea_timeout);
  786. }
  787. /*
  788. * eap_authpeer - Authenticate our peer (behave as server).
  789. *
  790. * Start server state and send first request. This is called only
  791. * after eap_lowerup.
  792. */
  793. void
  794. eap_authpeer(unit, localname)
  795. int unit;
  796. char *localname;
  797. {
  798. eap_state *esp = &eap_states[unit];
  799. /* Save the name we're given. */
  800. esp->es_server.ea_name = localname;
  801. esp->es_server.ea_namelen = strlen(localname);
  802. esp->es_savedtime = esp->es_server.ea_timeout;
  803. /* Lower layer up yet? */
  804. if (esp->es_server.ea_state == eapInitial ||
  805. esp->es_server.ea_state == eapPending) {
  806. esp->es_server.ea_state = eapPending;
  807. return;
  808. }
  809. esp->es_server.ea_state = eapPending;
  810. /* ID number not updated here intentionally; hashed into M1 */
  811. eap_send_request(esp);
  812. }
  813. /*
  814. * eap_server_timeout - Retransmission timer for sending Requests
  815. * expired.
  816. */
  817. static void
  818. eap_server_timeout(arg)
  819. void *arg;
  820. {
  821. eap_state *esp = (eap_state *) arg;
  822. if (!eap_server_active(esp))
  823. return;
  824. /* EAP ID number must not change on timeout. */
  825. eap_send_request(esp);
  826. }
  827. /*
  828. * When it's time to send rechallenge the peer, this timeout is
  829. * called. Once the rechallenge is successful, the response handler
  830. * will restart the timer. If it fails, then the link is dropped.
  831. */
  832. static void
  833. eap_rechallenge(arg)
  834. void *arg;
  835. {
  836. eap_state *esp = (eap_state *)arg;
  837. if (esp->es_server.ea_state != eapOpen &&
  838. esp->es_server.ea_state != eapSRP4)
  839. return;
  840. esp->es_server.ea_requests = 0;
  841. esp->es_server.ea_state = eapIdentify;
  842. eap_figure_next_state(esp, 0);
  843. esp->es_server.ea_id++;
  844. eap_send_request(esp);
  845. }
  846. static void
  847. srp_lwrechallenge(arg)
  848. void *arg;
  849. {
  850. eap_state *esp = (eap_state *)arg;
  851. if (esp->es_server.ea_state != eapOpen ||
  852. esp->es_server.ea_type != EAPT_SRP)
  853. return;
  854. esp->es_server.ea_requests = 0;
  855. esp->es_server.ea_state = eapSRP4;
  856. esp->es_server.ea_id++;
  857. eap_send_request(esp);
  858. }
  859. /*
  860. * eap_lowerup - The lower layer is now up.
  861. *
  862. * This is called before either eap_authpeer or eap_authwithpeer. See
  863. * link_established() in auth.c. All that's necessary here is to
  864. * return to closed state so that those two routines will do the right
  865. * thing.
  866. */
  867. static void
  868. eap_lowerup(unit)
  869. int unit;
  870. {
  871. eap_state *esp = &eap_states[unit];
  872. /* Discard any (possibly authenticated) peer name. */
  873. if (esp->es_server.ea_peer != NULL &&
  874. esp->es_server.ea_peer != remote_name)
  875. free(esp->es_server.ea_peer);
  876. esp->es_server.ea_peer = NULL;
  877. if (esp->es_client.ea_peer != NULL)
  878. free(esp->es_client.ea_peer);
  879. esp->es_client.ea_peer = NULL;
  880. esp->es_client.ea_state = eapClosed;
  881. esp->es_server.ea_state = eapClosed;
  882. }
  883. /*
  884. * eap_lowerdown - The lower layer is now down.
  885. *
  886. * Cancel all timeouts and return to initial state.
  887. */
  888. static void
  889. eap_lowerdown(unit)
  890. int unit;
  891. {
  892. eap_state *esp = &eap_states[unit];
  893. if (eap_client_active(esp) && esp->es_client.ea_timeout > 0) {
  894. UNTIMEOUT(eap_client_timeout, (void *)esp);
  895. }
  896. if (eap_server_active(esp)) {
  897. if (esp->es_server.ea_timeout > 0) {
  898. UNTIMEOUT(eap_server_timeout, (void *)esp);
  899. }
  900. } else {
  901. if ((esp->es_server.ea_state == eapOpen ||
  902. esp->es_server.ea_state == eapSRP4) &&
  903. esp->es_rechallenge > 0) {
  904. UNTIMEOUT(eap_rechallenge, (void *)esp);
  905. }
  906. if (esp->es_server.ea_state == eapOpen &&
  907. esp->es_lwrechallenge > 0) {
  908. UNTIMEOUT(srp_lwrechallenge, (void *)esp);
  909. }
  910. }
  911. esp->es_client.ea_state = esp->es_server.ea_state = eapInitial;
  912. esp->es_client.ea_requests = esp->es_server.ea_requests = 0;
  913. }
  914. /*
  915. * eap_protrej - Peer doesn't speak this protocol.
  916. *
  917. * This shouldn't happen. If it does, it represents authentication
  918. * failure.
  919. */
  920. static void
  921. eap_protrej(unit)
  922. int unit;
  923. {
  924. eap_state *esp = &eap_states[unit];
  925. if (eap_client_active(esp)) {
  926. error("EAP authentication failed due to Protocol-Reject");
  927. auth_withpeer_fail(unit, PPP_EAP);
  928. }
  929. if (eap_server_active(esp)) {
  930. error("EAP authentication of peer failed on Protocol-Reject");
  931. auth_peer_fail(unit, PPP_EAP);
  932. }
  933. eap_lowerdown(unit);
  934. }
  935. /*
  936. * Format and send a regular EAP Response message.
  937. */
  938. static void
  939. eap_send_response(esp, id, typenum, str, lenstr)
  940. eap_state *esp;
  941. u_char id;
  942. u_char typenum;
  943. u_char *str;
  944. int lenstr;
  945. {
  946. u_char *outp;
  947. int msglen;
  948. outp = outpacket_buf;
  949. MAKEHEADER(outp, PPP_EAP);
  950. PUTCHAR(EAP_RESPONSE, outp);
  951. PUTCHAR(id, outp);
  952. esp->es_client.ea_id = id;
  953. msglen = EAP_HEADERLEN + sizeof (u_char) + lenstr;
  954. PUTSHORT(msglen, outp);
  955. PUTCHAR(typenum, outp);
  956. if (lenstr > 0) {
  957. BCOPY(str, outp, lenstr);
  958. }
  959. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
  960. }
  961. /*
  962. * Format and send an MD5-Challenge EAP Response message.
  963. */
  964. static void
  965. eap_chap_response(esp, id, hash, name, namelen)
  966. eap_state *esp;
  967. u_char id;
  968. u_char *hash;
  969. char *name;
  970. int namelen;
  971. {
  972. u_char *outp;
  973. int msglen;
  974. outp = outpacket_buf;
  975. MAKEHEADER(outp, PPP_EAP);
  976. PUTCHAR(EAP_RESPONSE, outp);
  977. PUTCHAR(id, outp);
  978. esp->es_client.ea_id = id;
  979. msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + MD5_SIGNATURE_SIZE +
  980. namelen;
  981. PUTSHORT(msglen, outp);
  982. PUTCHAR(EAPT_MD5CHAP, outp);
  983. PUTCHAR(MD5_SIGNATURE_SIZE, outp);
  984. BCOPY(hash, outp, MD5_SIGNATURE_SIZE);
  985. INCPTR(MD5_SIGNATURE_SIZE, outp);
  986. if (namelen > 0) {
  987. BCOPY(name, outp, namelen);
  988. }
  989. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
  990. }
  991. #ifdef USE_SRP
  992. /*
  993. * Format and send a SRP EAP Response message.
  994. */
  995. static void
  996. eap_srp_response(esp, id, subtypenum, str, lenstr)
  997. eap_state *esp;
  998. u_char id;
  999. u_char subtypenum;
  1000. u_char *str;
  1001. int lenstr;
  1002. {
  1003. u_char *outp;
  1004. int msglen;
  1005. outp = outpacket_buf;
  1006. MAKEHEADER(outp, PPP_EAP);
  1007. PUTCHAR(EAP_RESPONSE, outp);
  1008. PUTCHAR(id, outp);
  1009. esp->es_client.ea_id = id;
  1010. msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + lenstr;
  1011. PUTSHORT(msglen, outp);
  1012. PUTCHAR(EAPT_SRP, outp);
  1013. PUTCHAR(subtypenum, outp);
  1014. if (lenstr > 0) {
  1015. BCOPY(str, outp, lenstr);
  1016. }
  1017. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
  1018. }
  1019. /*
  1020. * Format and send a SRP EAP Client Validator Response message.
  1021. */
  1022. static void
  1023. eap_srpval_response(esp, id, flags, str)
  1024. eap_state *esp;
  1025. u_char id;
  1026. u_int32_t flags;
  1027. u_char *str;
  1028. {
  1029. u_char *outp;
  1030. int msglen;
  1031. outp = outpacket_buf;
  1032. MAKEHEADER(outp, PPP_EAP);
  1033. PUTCHAR(EAP_RESPONSE, outp);
  1034. PUTCHAR(id, outp);
  1035. esp->es_client.ea_id = id;
  1036. msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + sizeof (u_int32_t) +
  1037. SHA_DIGESTSIZE;
  1038. PUTSHORT(msglen, outp);
  1039. PUTCHAR(EAPT_SRP, outp);
  1040. PUTCHAR(EAPSRP_CVALIDATOR, outp);
  1041. PUTLONG(flags, outp);
  1042. BCOPY(str, outp, SHA_DIGESTSIZE);
  1043. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
  1044. }
  1045. #endif /* USE_SRP */
  1046. static void
  1047. eap_send_nak(esp, id, type)
  1048. eap_state *esp;
  1049. u_char id;
  1050. u_char type;
  1051. {
  1052. u_char *outp;
  1053. int msglen;
  1054. outp = outpacket_buf;
  1055. MAKEHEADER(outp, PPP_EAP);
  1056. PUTCHAR(EAP_RESPONSE, outp);
  1057. PUTCHAR(id, outp);
  1058. esp->es_client.ea_id = id;
  1059. msglen = EAP_HEADERLEN + 2 * sizeof (u_char);
  1060. PUTSHORT(msglen, outp);
  1061. PUTCHAR(EAPT_NAK, outp);
  1062. PUTCHAR(type, outp);
  1063. output(esp->es_unit, outpacket_buf, PPP_HDRLEN + msglen);
  1064. }
  1065. #ifdef USE_SRP
  1066. static char *
  1067. name_of_pn_file()
  1068. {
  1069. char *user, *path, *file;
  1070. struct passwd *pw;
  1071. size_t pl;
  1072. static bool pnlogged = 0;
  1073. pw = getpwuid(getuid());
  1074. if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0) {
  1075. errno = EINVAL;
  1076. return (NULL);
  1077. }
  1078. file = _PATH_PSEUDONYM;
  1079. pl = strlen(user) + strlen(file) + 2;
  1080. path = malloc(pl);
  1081. if (path == NULL)
  1082. return (NULL);
  1083. (void) slprintf(path, pl, "%s/%s", user, file);
  1084. if (!pnlogged) {
  1085. dbglog("pseudonym file: %s", path);
  1086. pnlogged = 1;
  1087. }
  1088. return (path);
  1089. }
  1090. static int
  1091. open_pn_file(modebits)
  1092. mode_t modebits;
  1093. {
  1094. char *path;
  1095. int fd, err;
  1096. if ((path = name_of_pn_file()) == NULL)
  1097. return (-1);
  1098. fd = open(path, modebits, S_IRUSR | S_IWUSR);
  1099. err = errno;
  1100. free(path);
  1101. errno = err;
  1102. return (fd);
  1103. }
  1104. static void
  1105. remove_pn_file()
  1106. {
  1107. char *path;
  1108. if ((path = name_of_pn_file()) != NULL) {
  1109. (void) unlink(path);
  1110. (void) free(path);
  1111. }
  1112. }
  1113. static void
  1114. write_pseudonym(esp, inp, len, id)
  1115. eap_state *esp;
  1116. u_char *inp;
  1117. int len, id;
  1118. {
  1119. u_char val;
  1120. u_char *datp, *digp;
  1121. SHA1_CTX ctxt;
  1122. u_char dig[SHA_DIGESTSIZE];
  1123. int dsize, fd, olen = len;
  1124. /*
  1125. * Do the decoding by working backwards. This eliminates the need
  1126. * to save the decoded output in a separate buffer.
  1127. */
  1128. val = id;
  1129. while (len > 0) {
  1130. if ((dsize = len % SHA_DIGESTSIZE) == 0)
  1131. dsize = SHA_DIGESTSIZE;
  1132. len -= dsize;
  1133. datp = inp + len;
  1134. SHA1Init(&ctxt);
  1135. SHA1Update(&ctxt, &val, 1);
  1136. SHA1Update(&ctxt, esp->es_client.ea_skey, SESSION_KEY_LEN);
  1137. if (len > 0) {
  1138. SHA1Update(&ctxt, datp, SHA_DIGESTSIZE);
  1139. } else {
  1140. SHA1Update(&ctxt, esp->es_client.ea_name,
  1141. esp->es_client.ea_namelen);
  1142. }
  1143. SHA1Final(dig, &ctxt);
  1144. for (digp = dig; digp < dig + SHA_DIGESTSIZE; digp++)
  1145. *datp++ ^= *digp;
  1146. }
  1147. /* Now check that the result is sane */
  1148. if (olen <= 0 || *inp + 1 > olen) {
  1149. dbglog("EAP: decoded pseudonym is unusable <%.*B>", olen, inp);
  1150. return;
  1151. }
  1152. /* Save it away */
  1153. fd = open_pn_file(O_WRONLY | O_CREAT | O_TRUNC);
  1154. if (fd < 0) {
  1155. dbglog("EAP: error saving pseudonym: %m");
  1156. return;
  1157. }
  1158. len = write(fd, inp + 1, *inp);
  1159. if (close(fd) != -1 && len == *inp) {
  1160. dbglog("EAP: saved pseudonym");
  1161. esp->es_usedpseudo = 0;
  1162. } else {
  1163. dbglog("EAP: failed to save pseudonym");
  1164. remove_pn_file();
  1165. }
  1166. }
  1167. #endif /* USE_SRP */
  1168. /*
  1169. * eap_request - Receive EAP Request message (client mode).
  1170. */
  1171. static void
  1172. eap_request(esp, inp, id, len)
  1173. eap_state *esp;
  1174. u_char *inp;
  1175. int id;
  1176. int len;
  1177. {
  1178. u_char typenum;
  1179. u_char vallen;
  1180. int secret_len;
  1181. char secret[MAXWORDLEN];
  1182. char rhostname[256];
  1183. MD5_CTX mdContext;
  1184. u_char hash[MD5_SIGNATURE_SIZE];
  1185. #ifdef USE_SRP
  1186. struct t_client *tc;
  1187. struct t_num sval, gval, Nval, *Ap, Bval;
  1188. u_char vals[2];
  1189. SHA1_CTX ctxt;
  1190. u_char dig[SHA_DIGESTSIZE];
  1191. int fd;
  1192. #endif /* USE_SRP */
  1193. /*
  1194. * Note: we update es_client.ea_id *only if* a Response
  1195. * message is being generated. Otherwise, we leave it the
  1196. * same for duplicate detection purposes.
  1197. */
  1198. esp->es_client.ea_requests++;
  1199. if (esp->es_client.ea_maxrequests != 0 &&
  1200. esp->es_client.ea_requests > esp->es_client.ea_maxrequests) {
  1201. info("EAP: received too many Request messages");
  1202. if (esp->es_client.ea_timeout > 0) {
  1203. UNTIMEOUT(eap_client_timeout, (void *)esp);
  1204. }
  1205. auth_withpeer_fail(esp->es_unit, PPP_EAP);
  1206. return;
  1207. }
  1208. if (len <= 0) {
  1209. error("EAP: empty Request message discarded");
  1210. return;
  1211. }
  1212. GETCHAR(typenum, inp);
  1213. len--;
  1214. switch (typenum) {
  1215. case EAPT_IDENTITY:
  1216. if (len > 0)
  1217. info("EAP: Identity prompt \"%.*q\"", len, inp);
  1218. #ifdef USE_SRP
  1219. if (esp->es_usepseudo &&
  1220. (esp->es_usedpseudo == 0 ||
  1221. (esp->es_usedpseudo == 1 &&
  1222. id == esp->es_client.ea_id))) {
  1223. esp->es_usedpseudo = 1;
  1224. /* Try to get a pseudonym */
  1225. if ((fd = open_pn_file(O_RDONLY)) >= 0) {
  1226. strcpy(rhostname, SRP_PSEUDO_ID);
  1227. len = read(fd, rhostname + SRP_PSEUDO_LEN,
  1228. sizeof (rhostname) - SRP_PSEUDO_LEN);
  1229. /* XXX NAI unsupported */
  1230. if (len > 0) {
  1231. eap_send_response(esp, id, typenum,
  1232. rhostname, len + SRP_PSEUDO_LEN);
  1233. }
  1234. (void) close(fd);
  1235. if (len > 0)
  1236. break;
  1237. }
  1238. }
  1239. /* Stop using pseudonym now. */
  1240. if (esp->es_usepseudo && esp->es_usedpseudo != 2) {
  1241. remove_pn_file();
  1242. esp->es_usedpseudo = 2;
  1243. }
  1244. #endif /* USE_SRP */
  1245. eap_send_response(esp, id, typenum, esp->es_client.ea_name,
  1246. esp->es_client.ea_namelen);
  1247. break;
  1248. case EAPT_NOTIFICATION:
  1249. if (len > 0)
  1250. info("EAP: Notification \"%.*q\"", len, inp);
  1251. eap_send_response(esp, id, typenum, NULL, 0);
  1252. break;
  1253. case EAPT_NAK:
  1254. /*
  1255. * Avoid the temptation to send Response Nak in reply
  1256. * to Request Nak here. It can only lead to trouble.
  1257. */
  1258. warn("EAP: unexpected Nak in Request; ignored");
  1259. /* Return because we're waiting for something real. */
  1260. return;
  1261. case EAPT_MD5CHAP:
  1262. if (len < 1) {
  1263. error("EAP: received MD5-Challenge with no data");
  1264. /* Bogus request; wait for something real. */
  1265. return;
  1266. }
  1267. GETCHAR(vallen, inp);
  1268. len--;
  1269. if (vallen < 8 || vallen > len) {
  1270. error("EAP: MD5-Challenge with bad length %d (8..%d)",
  1271. vallen, len);
  1272. /* Try something better. */
  1273. eap_send_nak(esp, id, EAPT_SRP);
  1274. break;
  1275. }
  1276. /* Not so likely to happen. */
  1277. if (vallen >= len + sizeof (rhostname)) {
  1278. dbglog("EAP: trimming really long peer name down");
  1279. BCOPY(inp + vallen, rhostname, sizeof (rhostname) - 1);
  1280. rhostname[sizeof (rhostname) - 1] = '\0';
  1281. } else {
  1282. BCOPY(inp + vallen, rhostname, len - vallen);
  1283. rhostname[len - vallen] = '\0';
  1284. }
  1285. /* In case the remote doesn't give us his name. */
  1286. if (explicit_remote ||
  1287. (remote_name[0] != '\0' && vallen == len))
  1288. strlcpy(rhostname, remote_name, sizeof (rhostname));
  1289. /*
  1290. * Get the secret for authenticating ourselves with
  1291. * the specified host.
  1292. */
  1293. if (!get_secret(esp->es_unit, esp->es_client.ea_name,
  1294. rhostname, secret, &secret_len, 0)) {
  1295. dbglog("EAP: no MD5 secret for auth to %q", rhostname);
  1296. eap_send_nak(esp, id, EAPT_SRP);
  1297. break;
  1298. }
  1299. MD5_Init(&mdContext);
  1300. typenum = id;
  1301. MD5_Update(&mdContext, &typenum, 1);
  1302. MD5_Update(&mdContext, (u_char *)secret, secret_len);
  1303. BZERO(secret, sizeof (secret));
  1304. MD5_Update(&mdContext, inp, vallen);
  1305. MD5_Final(hash, &mdContext);
  1306. eap_chap_response(esp, id, hash, esp->es_client.ea_name,
  1307. esp->es_client.ea_namelen);
  1308. break;
  1309. #ifdef USE_SRP
  1310. case EAPT_SRP:
  1311. if (len < 1) {
  1312. error("EAP: received empty SRP Request");
  1313. /* Bogus request; wait for something real. */
  1314. return;
  1315. }
  1316. /* Get subtype */
  1317. GETCHAR(vallen, inp);
  1318. len--;
  1319. switch (vallen) {
  1320. case EAPSRP_CHALLENGE:
  1321. tc = NULL;
  1322. if (esp->es_client.ea_session != NULL) {
  1323. tc = (struct t_client *)esp->es_client.
  1324. ea_session;
  1325. /*
  1326. * If this is a new challenge, then start
  1327. * over with a new client session context.
  1328. * Otherwise, just resend last response.
  1329. */
  1330. if (id != esp->es_client.ea_id) {
  1331. t_clientclose(tc);
  1332. esp->es_client.ea_session = NULL;
  1333. tc = NULL;
  1334. }
  1335. }
  1336. /* No session key just yet */
  1337. esp->es_client.ea_skey = NULL;
  1338. if (tc == NULL) {
  1339. GETCHAR(vallen, inp);
  1340. len--;
  1341. if (vallen >= len) {
  1342. error("EAP: badly-formed SRP Challenge"
  1343. " (name)");
  1344. /* Ignore badly-formed messages */
  1345. return;
  1346. }
  1347. BCOPY(inp, rhostname, vallen);
  1348. rhostname[vallen] = '\0';
  1349. INCPTR(vallen, inp);
  1350. len -= vallen;
  1351. /*
  1352. * In case the remote doesn't give us his name,
  1353. * use configured name.
  1354. */
  1355. if (explicit_remote ||
  1356. (remote_name[0] != '\0' && vallen == 0)) {
  1357. strlcpy(rhostname, remote_name,
  1358. sizeof (rhostname));
  1359. }
  1360. if (esp->es_client.ea_peer != NULL)
  1361. free(esp->es_client.ea_peer);
  1362. esp->es_client.ea_peer = strdup(rhostname);
  1363. esp->es_client.ea_peerlen = strlen(rhostname);
  1364. GETCHAR(vallen, inp);
  1365. len--;
  1366. if (vallen >= len) {
  1367. error("EAP: badly-formed SRP Challenge"
  1368. " (s)");
  1369. /* Ignore badly-formed messages */
  1370. return;
  1371. }
  1372. sval.data = inp;
  1373. sval.len = vallen;
  1374. INCPTR(vallen, inp);
  1375. len -= vallen;
  1376. GETCHAR(vallen, inp);
  1377. len--;
  1378. if (vallen > len) {
  1379. error("EAP: badly-formed SRP Challenge"
  1380. " (g)");
  1381. /* Ignore badly-formed messages */
  1382. return;
  1383. }
  1384. /* If no generator present, then use value 2 */
  1385. if (vallen == 0) {
  1386. gval.data = (u_char *)"\002";
  1387. gval.len = 1;
  1388. } else {
  1389. gval.data = inp;
  1390. gval.len = vallen;
  1391. }
  1392. INCPTR(vallen, inp);
  1393. len -= vallen;
  1394. /*
  1395. * If no modulus present, then use well-known
  1396. * value.
  1397. */
  1398. if (len == 0) {
  1399. Nval.data = (u_char *)wkmodulus;
  1400. Nval.len = sizeof (wkmodulus);
  1401. } else {
  1402. Nval.data = inp;
  1403. Nval.len = len;
  1404. }
  1405. tc = t_clientopen(esp->es_client.ea_name,
  1406. &Nval, &gval, &sval);
  1407. if (tc == NULL) {
  1408. eap_send_nak(esp, id, EAPT_MD5CHAP);
  1409. break;
  1410. }
  1411. esp->es_client.ea_session = (void *)tc;
  1412. /* Add Challenge ID & type to verifier */
  1413. vals[0] = id;
  1414. vals[1] = EAPT_SRP;
  1415. t_clientaddexdata(tc, vals, 2);
  1416. }
  1417. Ap = t_clientgenexp(tc);
  1418. eap_srp_response(esp, id, EAPSRP_CKEY, Ap->data,
  1419. Ap->len);
  1420. break;
  1421. case EAPSRP_SKEY:
  1422. tc = (struct t_client *)esp->es_client.ea_session;
  1423. if (tc == NULL) {
  1424. warn("EAP: peer sent Subtype 2 without 1");
  1425. eap_send_nak(esp, id, EAPT_MD5CHAP);
  1426. break;
  1427. }
  1428. if (esp->es_client.ea_skey != NULL) {
  1429. /*
  1430. * ID number should not change here. Warn
  1431. * if it does (but otherwise ignore).
  1432. */
  1433. if (id != esp->es_client.ea_id) {
  1434. warn("EAP: ID changed from %d to %d "
  1435. "in SRP Subtype 2 rexmit",
  1436. esp->es_client.ea_id, id);
  1437. }
  1438. } else {
  1439. if (get_srp_secret(esp->es_unit,
  1440. esp->es_client.ea_name,
  1441. esp->es_client.ea_peer, secret, 0) == 0) {
  1442. /*
  1443. * Can't work with this peer because
  1444. * the secret is missing. Just give
  1445. * up.
  1446. */
  1447. eap_send_nak(esp, id, EAPT_MD5CHAP);
  1448. break;
  1449. }
  1450. Bval.data = inp;
  1451. Bval.len = len;
  1452. t_clientpasswd(tc, secret);
  1453. BZERO(secret, sizeof (secret));
  1454. esp->es_client.ea_skey =
  1455. t_clientgetkey(tc, &Bval);
  1456. if (esp->es_client.ea_skey == NULL) {
  1457. /* Server is rogue; stop now */
  1458. error("EAP: SRP server is rogue");
  1459. goto client_failure;
  1460. }
  1461. }
  1462. eap_srpval_response(esp, id, SRPVAL_EBIT,
  1463. t_clientresponse(tc));
  1464. break;
  1465. case EAPSRP_SVALIDATOR:
  1466. tc = (struct t_client *)esp->es_client.ea_session;
  1467. if (tc == NULL || esp->es_client.ea_skey == NULL) {
  1468. warn("EAP: peer sent Subtype 3 without 1/2");
  1469. eap_send_nak(esp, id, EAPT_MD5CHAP);
  1470. break;
  1471. }
  1472. /*
  1473. * If we're already open, then this ought to be a
  1474. * duplicate. Otherwise, check that the server is
  1475. * who we think it is.
  1476. */
  1477. if (esp->es_client.ea_state == eapOpen) {
  1478. if (id != esp->es_client.ea_id) {
  1479. warn("EAP: ID changed from %d to %d "
  1480. "in SRP Subtype 3 rexmit",
  1481. esp->es_client.ea_id, id);
  1482. }
  1483. } else {
  1484. len -= sizeof (u_int32_t) + SHA_DIGESTSIZE;
  1485. if (len < 0 || t_clientverify(tc, inp +
  1486. sizeof (u_int32_t)) != 0) {
  1487. error("EAP: SRP server verification "
  1488. "failed");
  1489. goto client_failure;
  1490. }
  1491. GETLONG(esp->es_client.ea_keyflags, inp);
  1492. /* Save pseudonym if user wants it. */
  1493. if (len > 0 && esp->es_usepseudo) {
  1494. INCPTR(SHA_DIGESTSIZE, inp);
  1495. write_pseudonym(esp, inp, len, id);
  1496. }
  1497. }
  1498. /*
  1499. * We've verified our peer. We're now mostly done,
  1500. * except for waiting on the regular EAP Success
  1501. * message.
  1502. */
  1503. eap_srp_response(esp, id, EAPSRP_ACK, NULL, 0);
  1504. break;
  1505. case EAPSRP_LWRECHALLENGE:
  1506. if (len < 4) {
  1507. warn("EAP: malformed Lightweight rechallenge");
  1508. return;
  1509. }
  1510. SHA1Init(&ctxt);
  1511. vals[0] = id;
  1512. SHA1Update(&ctxt, vals, 1);
  1513. SHA1Update(&ctxt, esp->es_client.ea_skey,
  1514. SESSION_KEY_LEN);
  1515. SHA1Update(&ctxt, inp, len);
  1516. SHA1Update(&ctxt, esp->es_client.ea_name,
  1517. esp->es_client.ea_namelen);
  1518. SHA1Final(dig, &ctxt);
  1519. eap_srp_response(esp, id, EAPSRP_LWRECHALLENGE, dig,
  1520. SHA_DIGESTSIZE);
  1521. break;
  1522. default:
  1523. error("EAP: unknown SRP Subtype %d", vallen);
  1524. eap_send_nak(esp, id, EAPT_MD5CHAP);
  1525. break;
  1526. }
  1527. break;
  1528. #endif /* USE_SRP */
  1529. default:
  1530. info("EAP: unknown authentication type %d; Naking", typenum);
  1531. eap_send_nak(esp, id, EAPT_SRP);
  1532. break;
  1533. }
  1534. if (esp->es_client.ea_timeout > 0) {
  1535. UNTIMEOUT(eap_client_timeout, (void *)esp);
  1536. TIMEOUT(eap_client_timeout, (void *)esp,
  1537. esp->es_client.ea_timeout);
  1538. }
  1539. return;
  1540. #ifdef USE_SRP
  1541. client_failure:
  1542. esp->es_client.ea_state = eapBadAuth;
  1543. if (esp->es_client.ea_timeout > 0) {
  1544. UNTIMEOUT(eap_client_timeout, (void *)esp);
  1545. }
  1546. esp->es_client.ea_session = NULL;
  1547. t_clientclose(tc);
  1548. auth_withpeer_fail(esp->es_unit, PPP_EAP);
  1549. #endif /* USE_SRP */
  1550. }
  1551. /*
  1552. * eap_response - Receive EAP Response message (server mode).
  1553. */
  1554. static void
  1555. eap_response(esp, inp, id, len)
  1556. eap_state *esp;
  1557. u_char *inp;
  1558. int id;
  1559. int len;
  1560. {
  1561. u_char typenum;
  1562. u_char vallen;
  1563. int secret_len;
  1564. char secret[MAXSECRETLEN];
  1565. char rhostname[256];
  1566. MD5_CTX mdContext;
  1567. u_char hash[MD5_SIGNATURE_SIZE];
  1568. #ifdef USE_SRP
  1569. struct t_server *ts;
  1570. struct t_num A;
  1571. SHA1_CTX ctxt;
  1572. u_char dig[SHA_DIGESTSIZE];
  1573. #endif /* USE_SRP */
  1574. if (esp->es_server.ea_id != id) {
  1575. dbglog("EAP: discarding Response %d; expected ID %d", id,
  1576. esp->es_server.ea_id);
  1577. return;
  1578. }
  1579. esp->es_server.ea_responses++;
  1580. if (len <= 0) {
  1581. error("EAP: empty Response message discarded");
  1582. return;
  1583. }
  1584. GETCHAR(typenum, inp);
  1585. len--;
  1586. switch (typenum) {
  1587. case EAPT_IDENTITY:
  1588. if (esp->es_server.ea_state != eapIdentify) {
  1589. dbglog("EAP discarding unwanted Identify \"%.q\"", len,
  1590. inp);
  1591. break;
  1592. }
  1593. info("EAP: unauthenticated peer name \"%.*q\"", len, inp);
  1594. if (esp->es_server.ea_peer != NULL &&
  1595. esp->es_server.ea_peer != remote_name)
  1596. free(esp->es_server.ea_peer);
  1597. esp->es_server.ea_peer = malloc(len + 1);
  1598. if (esp->es_server.ea_peer == NULL) {
  1599. esp->es_server.ea_peerlen = 0;
  1600. eap_figure_next_state(esp, 1);
  1601. break;
  1602. }
  1603. BCOPY(inp, esp->es_server.ea_peer, len);
  1604. esp->es_server.ea_peer[len] = '\0';
  1605. esp->es_server.ea_peerlen = len;
  1606. eap_figure_next_state(esp, 0);
  1607. break;
  1608. case EAPT_NOTIFICATION:
  1609. dbglog("EAP unexpected Notification; response discarded");
  1610. break;
  1611. case EAPT_NAK:
  1612. if (len < 1) {
  1613. info("EAP: Nak Response with no suggested protocol");
  1614. eap_figure_next_state(esp, 1);
  1615. break;
  1616. }
  1617. GETCHAR(vallen, inp);
  1618. len--;
  1619. if (!explicit_remote && esp->es_server.ea_state == eapIdentify){
  1620. /* Peer cannot Nak Identify Request */
  1621. eap_figure_next_state(esp, 1);
  1622. break;
  1623. }
  1624. switch (vallen) {
  1625. case EAPT_SRP:
  1626. /* Run through SRP validator selection again. */
  1627. esp->es_server.ea_state = eapIdentify;
  1628. eap_figure_next_state(esp, 0);
  1629. break;
  1630. case EAPT_MD5CHAP:
  1631. esp->es_server.ea_state = eapMD5Chall;
  1632. break;
  1633. default:
  1634. dbglog("EAP: peer requesting unknown Type %d", vallen);
  1635. switch (esp->es_server.ea_state) {
  1636. case eapSRP1:
  1637. case eapSRP2:
  1638. case eapSRP3:
  1639. esp->es_server.ea_state = eapMD5Chall;
  1640. break;
  1641. case eapMD5Chall:
  1642. case eapSRP4:
  1643. esp->es_server.ea_state = eapIdentify;
  1644. eap_figure_next_state(esp, 0);
  1645. break;
  1646. default:
  1647. break;
  1648. }
  1649. break;
  1650. }
  1651. break;
  1652. case EAPT_MD5CHAP:
  1653. if (esp->es_server.ea_state != eapMD5Chall) {
  1654. error("EAP: unexpected MD5-Response");
  1655. eap_figure_next_state(esp, 1);
  1656. break;
  1657. }
  1658. if (len < 1) {
  1659. error("EAP: received MD5-Response with no data");
  1660. eap_figure_next_state(esp, 1);
  1661. break;
  1662. }
  1663. GETCHAR(vallen, inp);
  1664. len--;
  1665. if (vallen != 16 || vallen > len) {
  1666. error("EAP: MD5-Response with bad length %d", vallen);
  1667. eap_figure_next_state(esp, 1);
  1668. break;
  1669. }
  1670. /* Not so likely to happen. */
  1671. if (vallen >= len + sizeof (rhostname)) {
  1672. dbglog("EAP: trimming really long peer name down");
  1673. BCOPY(inp + vallen, rhostname, sizeof (rhostname) - 1);
  1674. rhostname[sizeof (rhostname) - 1] = '\0';
  1675. } else {
  1676. BCOPY(inp + vallen, rhostname, len - vallen);
  1677. rhostname[len - vallen] = '\0';
  1678. }
  1679. /* In case the remote doesn't give us his name. */
  1680. if (explicit_remote ||
  1681. (remote_name[0] != '\0' && vallen == len))
  1682. strlcpy(rhostname, remote_name, sizeof (rhostname));
  1683. /*
  1684. * Get the secret for authenticating the specified
  1685. * host.
  1686. */
  1687. if (!get_secret(esp->es_unit, rhostname,
  1688. esp->es_server.ea_name, secret, &secret_len, 1)) {
  1689. dbglog("EAP: no MD5 secret for auth of %q", rhostname);
  1690. eap_send_failure(esp);
  1691. break;
  1692. }
  1693. MD5_Init(&mdContext);
  1694. MD5_Update(&mdContext, &esp->es_server.ea_id, 1);
  1695. MD5_Update(&mdContext, (u_char *)secret, secret_len);
  1696. BZERO(secret, sizeof (secret));
  1697. MD5_Update(&mdContext, esp->es_challenge, esp->es_challen);
  1698. MD5_Final(hash, &mdContext);
  1699. if (BCMP(hash, inp, MD5_SIGNATURE_SIZE) != 0) {
  1700. eap_send_failure(esp);
  1701. break;
  1702. }
  1703. esp->es_server.ea_type = EAPT_MD5CHAP;
  1704. eap_send_success(esp);
  1705. eap_figure_next_state(esp, 0);
  1706. if (esp->es_rechallenge != 0)
  1707. TIMEOUT(eap_rechallenge, esp, esp->es_rechallenge);
  1708. break;
  1709. #ifdef USE_SRP
  1710. case EAPT_SRP:
  1711. if (len < 1) {
  1712. error("EAP: empty SRP Response");
  1713. eap_figure_next_state(esp, 1);
  1714. break;
  1715. }
  1716. GETCHAR(typenum, inp);
  1717. len--;
  1718. switch (typenum) {
  1719. case EAPSRP_CKEY:
  1720. if (esp->es_server.ea_state != eapSRP1) {
  1721. error("EAP: unexpected SRP Subtype 1 Response");
  1722. eap_figure_next_state(esp, 1);
  1723. break;
  1724. }
  1725. A.data = inp;
  1726. A.len = len;
  1727. ts = (struct t_server *)esp->es_server.ea_session;
  1728. assert(ts != NULL);
  1729. esp->es_server.ea_skey = t_servergetkey(ts, &A);
  1730. if (esp->es_server.ea_skey == NULL) {
  1731. /* Client's A value is bogus; terminate now */
  1732. error("EAP: bogus A value from client");
  1733. eap_send_failure(esp);
  1734. } else {
  1735. eap_figure_next_state(esp, 0);
  1736. }
  1737. break;
  1738. case EAPSRP_CVALIDATOR:
  1739. if (esp->es_server.ea_state != eapSRP2) {
  1740. error("EAP: unexpected SRP Subtype 2 Response");
  1741. eap_figure_next_state(esp, 1);
  1742. break;
  1743. }
  1744. if (len < sizeof (u_int32_t) + SHA_DIGESTSIZE) {
  1745. error("EAP: M1 length %d < %d", len,
  1746. sizeof (u_int32_t) + SHA_DIGESTSIZE);
  1747. eap_figure_next_state(esp, 1);
  1748. break;
  1749. }
  1750. GETLONG(esp->es_server.ea_keyflags, inp);
  1751. ts = (struct t_server *)esp->es_server.ea_session;
  1752. assert(ts != NULL);
  1753. if (t_serververify(ts, inp)) {
  1754. info("EAP: unable to validate client identity");
  1755. eap_send_failure(esp);
  1756. break;
  1757. }
  1758. eap_figure_next_state(esp, 0);
  1759. break;
  1760. case EAPSRP_ACK:
  1761. if (esp->es_server.ea_state != eapSRP3) {
  1762. error("EAP: unexpected SRP Subtype 3 Response");
  1763. eap_send_failure(esp);
  1764. break;
  1765. }
  1766. esp->es_server.ea_type = EAPT_SRP;
  1767. eap_send_success(esp);
  1768. eap_figure_next_state(esp, 0);
  1769. if (esp->es_rechallenge != 0)
  1770. TIMEOUT(eap_rechallenge, esp,
  1771. esp->es_rechallenge);
  1772. if (esp->es_lwrechallenge != 0)
  1773. TIMEOUT(srp_lwrechallenge, esp,
  1774. esp->es_lwrechallenge);
  1775. break;
  1776. case EAPSRP_LWRECHALLENGE:
  1777. if (esp->es_server.ea_state != eapSRP4) {
  1778. info("EAP: unexpected SRP Subtype 4 Response");
  1779. return;
  1780. }
  1781. if (len != SHA_DIGESTSIZE) {
  1782. error("EAP: bad Lightweight rechallenge "
  1783. "response");
  1784. return;
  1785. }
  1786. SHA1Init(&ctxt);
  1787. vallen = id;
  1788. SHA1Update(&ctxt, &vallen, 1);
  1789. SHA1Update(&ctxt, esp->es_server.ea_skey,
  1790. SESSION_KEY_LEN);
  1791. SHA1Update(&ctxt, esp->es_challenge, esp->es_challen);
  1792. SHA1Update(&ctxt, esp->es_server.ea_peer,
  1793. esp->es_server.ea_peerlen);
  1794. SHA1Final(dig, &ctxt);
  1795. if (BCMP(dig, inp, SHA_DIGESTSIZE) != 0) {
  1796. error("EAP: failed Lightweight rechallenge");
  1797. eap_send_failure(esp);
  1798. break;
  1799. }
  1800. esp->es_server.ea_state = eapOpen;
  1801. if (esp->es_lwrechallenge != 0)
  1802. TIMEOUT(srp_lwrechallenge, esp,
  1803. esp->es_lwrechallenge);
  1804. break;
  1805. }
  1806. break;
  1807. #endif /* USE_SRP */
  1808. default:
  1809. /* This can't happen. */
  1810. error("EAP: unknown Response type %d; ignored", typenum);
  1811. return;
  1812. }
  1813. if (esp->es_server.ea_timeout > 0) {
  1814. UNTIMEOUT(eap_server_timeout, (void *)esp);
  1815. }
  1816. if (esp->es_server.ea_state != eapBadAuth &&
  1817. esp->es_server.ea_state != eapOpen) {
  1818. esp->es_server.ea_id++;
  1819. eap_send_request(esp);
  1820. }
  1821. }
  1822. /*
  1823. * eap_success - Receive EAP Success message (client mode).
  1824. */
  1825. static void
  1826. eap_success(esp, inp, id, len)
  1827. eap_state *esp;
  1828. u_char *inp;
  1829. int id;
  1830. int len;
  1831. {
  1832. if (esp->es_client.ea_state != eapOpen && !eap_client_active(esp)) {
  1833. dbglog("EAP unexpected success message in state %s (%d)",
  1834. eap_state_name(esp->es_client.ea_state),
  1835. esp->es_client.ea_state);
  1836. return;
  1837. }
  1838. if (esp->es_client.ea_timeout > 0) {
  1839. UNTIMEOUT(eap_client_timeout, (void *)esp);
  1840. }
  1841. if (len > 0) {
  1842. /* This is odd. The spec doesn't allow for this. */
  1843. PRINTMSG(inp, len);
  1844. }
  1845. esp->es_client.ea_state = eapOpen;
  1846. auth_withpeer_success(esp->es_unit, PPP_EAP, 0);
  1847. }
  1848. /*
  1849. * eap_failure - Receive EAP Failure message (client mode).
  1850. */
  1851. static void
  1852. eap_failure(esp, inp, id, len)
  1853. eap_state *esp;
  1854. u_char *inp;
  1855. int id;
  1856. int len;
  1857. {
  1858. if (!eap_client_active(esp)) {
  1859. dbglog("EAP unexpected failure message in state %s (%d)",
  1860. eap_state_name(esp->es_client.ea_state),
  1861. esp->es_client.ea_state);
  1862. }
  1863. if (esp->es_client.ea_timeout > 0) {
  1864. UNTIMEOUT(eap_client_timeout, (void *)esp);
  1865. }
  1866. if (len > 0) {
  1867. /* This is odd. The spec doesn't allow for this. */
  1868. PRINTMSG(inp, len);
  1869. }
  1870. esp->es_client.ea_state = eapBadAuth;
  1871. error("EAP: peer reports authentication failure");
  1872. auth_withpeer_fail(esp->es_unit, PPP_EAP);
  1873. }
  1874. /*
  1875. * eap_input - Handle received EAP message.
  1876. */
  1877. static void
  1878. eap_input(unit, inp, inlen)
  1879. int unit;
  1880. u_char *inp;
  1881. int inlen;
  1882. {
  1883. eap_state *esp = &eap_states[unit];
  1884. u_char code, id;
  1885. int len;
  1886. /*
  1887. * Parse header (code, id and length). If packet too short,
  1888. * drop it.
  1889. */
  1890. if (inlen < EAP_HEADERLEN) {
  1891. error("EAP: packet too short: %d < %d", inlen, EAP_HEADERLEN);
  1892. return;
  1893. }
  1894. GETCHAR(code, inp);
  1895. GETCHAR(id, inp);
  1896. GETSHORT(len, inp);
  1897. if (len < EAP_HEADERLEN || len > inlen) {
  1898. error("EAP: packet has illegal length field %d (%d..%d)", len,
  1899. EAP_HEADERLEN, inlen);
  1900. return;
  1901. }
  1902. len -= EAP_HEADERLEN;
  1903. /* Dispatch based on message code */
  1904. switch (code) {
  1905. case EAP_REQUEST:
  1906. eap_request(esp, inp, id, len);
  1907. break;
  1908. case EAP_RESPONSE:
  1909. eap_response(esp, inp, id, len);
  1910. break;
  1911. case EAP_SUCCESS:
  1912. eap_success(esp, inp, id, len);
  1913. break;
  1914. case EAP_FAILURE:
  1915. eap_failure(esp, inp, id, len);
  1916. break;
  1917. default: /* XXX Need code reject */
  1918. /* Note: it's not legal to send EAP Nak here. */
  1919. warn("EAP: unknown code %d received", code);
  1920. break;
  1921. }
  1922. }
  1923. /*
  1924. * eap_printpkt - print the contents of an EAP packet.
  1925. */
  1926. static char *eap_codenames[] = {
  1927. "Request", "Response", "Success", "Failure"
  1928. };
  1929. static char *eap_typenames[] = {
  1930. "Identity", "Notification", "Nak", "MD5-Challenge",
  1931. "OTP", "Generic-Token", NULL, NULL,
  1932. "RSA", "DSS", "KEA", "KEA-Validate",
  1933. "TLS", "Defender", "Windows 2000", "Arcot",
  1934. "Cisco", "Nokia", "SRP"
  1935. };
  1936. static int
  1937. eap_printpkt(inp, inlen, printer, arg)
  1938. u_char *inp;
  1939. int inlen;
  1940. void (*printer) __P((void *, char *, ...));
  1941. void *arg;
  1942. {
  1943. int code, id, len, rtype, vallen;
  1944. u_char *pstart;
  1945. u_int32_t uval;
  1946. if (inlen < EAP_HEADERLEN)
  1947. return (0);
  1948. pstart = inp;
  1949. GETCHAR(code, inp);
  1950. GETCHAR(id, inp);
  1951. GETSHORT(len, inp);
  1952. if (len < EAP_HEADERLEN || len > inlen)
  1953. return (0);
  1954. if (code >= 1 && code <= sizeof(eap_codenames) / sizeof(char *))
  1955. printer(arg, " %s", eap_codenames[code-1]);
  1956. else
  1957. printer(arg, " code=0x%x", code);
  1958. printer(arg, " id=0x%x", id);
  1959. len -= EAP_HEADERLEN;
  1960. switch (code) {
  1961. case EAP_REQUEST:
  1962. if (len < 1) {
  1963. printer(arg, " <missing type>");
  1964. break;
  1965. }
  1966. GETCHAR(rtype, inp);
  1967. len--;
  1968. if (rtype >= 1 &&
  1969. rtype <= sizeof (eap_typenames) / sizeof (char *))
  1970. printer(arg, " %s", eap_typenames[rtype-1]);
  1971. else
  1972. printer(arg, " type=0x%x", rtype);
  1973. switch (rtype) {
  1974. case EAPT_IDENTITY:
  1975. case EAPT_NOTIFICATION:
  1976. if (len > 0) {
  1977. printer(arg, " <Message ");
  1978. print_string((char *)inp, len, printer, arg);
  1979. printer(arg, ">");
  1980. INCPTR(len, inp);
  1981. len = 0;
  1982. } else {
  1983. printer(arg, " <No message>");
  1984. }
  1985. break;
  1986. case EAPT_MD5CHAP:
  1987. if (len <= 0)
  1988. break;
  1989. GETCHAR(vallen, inp);
  1990. len--;
  1991. if (vallen > len)
  1992. goto truncated;
  1993. printer(arg, " <Value%.*B>", vallen, inp);
  1994. INCPTR(vallen, inp);
  1995. len -= vallen;
  1996. if (len > 0) {
  1997. printer(arg, " <Name ");
  1998. print_string((char *)inp, len, printer, arg);
  1999. printer(arg, ">");
  2000. INCPTR(len, inp);
  2001. len = 0;
  2002. } else {
  2003. printer(arg, " <No name>");
  2004. }
  2005. break;
  2006. case EAPT_SRP:
  2007. if (len < 3)
  2008. goto truncated;
  2009. GETCHAR(vallen, inp);
  2010. len--;
  2011. printer(arg, "-%d", vallen);
  2012. switch (vallen) {
  2013. case EAPSRP_CHALLENGE:
  2014. GETCHAR(vallen, inp);
  2015. len--;
  2016. if (vallen >= len)
  2017. goto truncated;
  2018. if (vallen > 0) {
  2019. printer(arg, " <Name ");
  2020. print_string((char *)inp, vallen, printer,
  2021. arg);
  2022. printer(arg, ">");
  2023. } else {
  2024. printer(arg, " <No name>");
  2025. }
  2026. INCPTR(vallen, inp);
  2027. len -= vallen;
  2028. GETCHAR(vallen, inp);
  2029. len--;
  2030. if (vallen >= len)
  2031. goto truncated;
  2032. printer(arg, " <s%.*B>", vallen, inp);
  2033. INCPTR(vallen, inp);
  2034. len -= vallen;
  2035. GETCHAR(vallen, inp);
  2036. len--;
  2037. if (vallen > len)
  2038. goto truncated;
  2039. if (vallen == 0) {
  2040. printer(arg, " <Default g=2>");
  2041. } else {
  2042. printer(arg, " <g%.*B>", vallen, inp);
  2043. }
  2044. INCPTR(vallen, inp);
  2045. len -= vallen;
  2046. if (len == 0) {
  2047. printer(arg, " <Default N>");
  2048. } else {
  2049. printer(arg, " <N%.*B>", len, inp);
  2050. INCPTR(len, inp);
  2051. len = 0;
  2052. }
  2053. break;
  2054. case EAPSRP_SKEY:
  2055. printer(arg, " <B%.*B>", len, inp);
  2056. INCPTR(len, inp);
  2057. len = 0;
  2058. break;
  2059. case EAPSRP_SVALIDATOR:
  2060. if (len < sizeof (u_int32_t))
  2061. break;
  2062. GETLONG(uval, inp);
  2063. len -= sizeof (u_int32_t);
  2064. if (uval & SRPVAL_EBIT) {
  2065. printer(arg, " E");
  2066. uval &= ~SRPVAL_EBIT;
  2067. }
  2068. if (uval != 0) {
  2069. printer(arg, " f<%X>", uval);
  2070. }
  2071. if ((vallen = len) > SHA_DIGESTSIZE)
  2072. vallen = SHA_DIGESTSIZE;
  2073. printer(arg, " <M2%.*B%s>", len, inp,
  2074. len < SHA_DIGESTSIZE ? "?" : "");
  2075. INCPTR(vallen, inp);
  2076. len -= vallen;
  2077. if (len > 0) {
  2078. printer(arg, " <PN%.*B>", len, inp);
  2079. INCPTR(len, inp);
  2080. len = 0;
  2081. }
  2082. break;
  2083. case EAPSRP_LWRECHALLENGE:
  2084. printer(arg, " <Challenge%.*B>", len, inp);
  2085. INCPTR(len, inp);
  2086. len = 0;
  2087. break;
  2088. }
  2089. break;
  2090. }
  2091. break;
  2092. case EAP_RESPONSE:
  2093. if (len < 1)
  2094. break;
  2095. GETCHAR(rtype, inp);
  2096. len--;
  2097. if (rtype >= 1 &&
  2098. rtype <= sizeof (eap_typenames) / sizeof (char *))
  2099. printer(arg, " %s", eap_typenames[rtype-1]);
  2100. else
  2101. printer(arg, " type=0x%x", rtype);
  2102. switch (rtype) {
  2103. case EAPT_IDENTITY:
  2104. if (len > 0) {
  2105. printer(arg, " <Name ");
  2106. print_string((char *)inp, len, printer, arg);
  2107. printer(arg, ">");
  2108. INCPTR(len, inp);
  2109. len = 0;
  2110. }
  2111. break;
  2112. case EAPT_NAK:
  2113. if (len <= 0) {
  2114. printer(arg, " <missing hint>");
  2115. break;
  2116. }
  2117. GETCHAR(rtype, inp);
  2118. len--;
  2119. printer(arg, " <Suggested-type %02X", rtype);
  2120. if (rtype >= 1 &&
  2121. rtype < sizeof (eap_typenames) / sizeof (char *))
  2122. printer(arg, " (%s)", eap_typenames[rtype-1]);
  2123. printer(arg, ">");
  2124. break;
  2125. case EAPT_MD5CHAP:
  2126. if (len <= 0) {
  2127. printer(arg, " <missing length>");
  2128. break;
  2129. }
  2130. GETCHAR(vallen, inp);
  2131. len--;
  2132. if (vallen > len)
  2133. goto truncated;
  2134. printer(arg, " <Value%.*B>", vallen, inp);
  2135. INCPTR(vallen, inp);
  2136. len -= vallen;
  2137. if (len > 0) {
  2138. printer(arg, " <Name ");
  2139. print_string((char *)inp, len, printer, arg);
  2140. printer(arg, ">");
  2141. INCPTR(len, inp);
  2142. len = 0;
  2143. } else {
  2144. printer(arg, " <No name>");
  2145. }
  2146. break;
  2147. case EAPT_SRP:
  2148. if (len < 1)
  2149. goto truncated;
  2150. GETCHAR(vallen, inp);
  2151. len--;
  2152. printer(arg, "-%d", vallen);
  2153. switch (vallen) {
  2154. case EAPSRP_CKEY:
  2155. printer(arg, " <A%.*B>", len, inp);
  2156. INCPTR(len, inp);
  2157. len = 0;
  2158. break;
  2159. case EAPSRP_CVALIDATOR:
  2160. if (len < sizeof (u_int32_t))
  2161. break;
  2162. GETLONG(uval, inp);
  2163. len -= sizeof (u_int32_t);
  2164. if (uval & SRPVAL_EBIT) {
  2165. printer(arg, " E");
  2166. uval &= ~SRPVAL_EBIT;
  2167. }
  2168. if (uval != 0) {
  2169. printer(arg, " f<%X>", uval);
  2170. }
  2171. printer(arg, " <M1%.*B%s>", len, inp,
  2172. len == SHA_DIGESTSIZE ? "" : "?");
  2173. INCPTR(len, inp);
  2174. len = 0;
  2175. break;
  2176. case EAPSRP_ACK:
  2177. break;
  2178. case EAPSRP_LWRECHALLENGE:
  2179. printer(arg, " <Response%.*B%s>", len, inp,
  2180. len == SHA_DIGESTSIZE ? "" : "?");
  2181. if ((vallen = len) > SHA_DIGESTSIZE)
  2182. vallen = SHA_DIGESTSIZE;
  2183. INCPTR(vallen, inp);
  2184. len -= vallen;
  2185. break;
  2186. }
  2187. break;
  2188. }
  2189. break;
  2190. case EAP_SUCCESS: /* No payload expected for these! */
  2191. case EAP_FAILURE:
  2192. break;
  2193. truncated:
  2194. printer(arg, " <truncated>");
  2195. break;
  2196. }
  2197. if (len > 8)
  2198. printer(arg, "%8B...", inp);
  2199. else if (len > 0)
  2200. printer(arg, "%.*B", len, inp);
  2201. INCPTR(len, inp);
  2202. return (inp - pstart);
  2203. }