devssl.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517
  1. /*
  2. * devssl - secure sockets layer
  3. */
  4. #include "u.h"
  5. #include "lib.h"
  6. #include "dat.h"
  7. #include "fns.h"
  8. #include "error.h"
  9. #include "libsec.h"
  10. #define NOSPOOKS 1
  11. typedef struct OneWay OneWay;
  12. struct OneWay
  13. {
  14. QLock q;
  15. QLock ctlq;
  16. void *state; /* encryption state */
  17. int slen; /* hash data length */
  18. uchar *secret; /* secret */
  19. ulong mid; /* message id */
  20. };
  21. enum
  22. {
  23. /* connection states */
  24. Sincomplete= 0,
  25. Sclear= 1,
  26. Sencrypting= 2,
  27. Sdigesting= 4,
  28. Sdigenc= Sencrypting|Sdigesting,
  29. /* encryption algorithms */
  30. Noencryption= 0,
  31. DESCBC= 1,
  32. DESECB= 2,
  33. RC4= 3
  34. };
  35. typedef struct Dstate Dstate;
  36. struct Dstate
  37. {
  38. Chan *c; /* io channel */
  39. uchar state; /* state of connection */
  40. int ref; /* serialized by dslock for atomic destroy */
  41. uchar encryptalg; /* encryption algorithm */
  42. ushort blocklen; /* blocking length */
  43. ushort diglen; /* length of digest */
  44. DigestState *(*hf)(uchar*, ulong, uchar*, DigestState*); /* hash func */
  45. /* for SSL format */
  46. int max; /* maximum unpadded data per msg */
  47. int maxpad; /* maximum padded data per msg */
  48. /* input side */
  49. OneWay in;
  50. Block *processed;
  51. Block *unprocessed;
  52. /* output side */
  53. OneWay out;
  54. /* protections */
  55. char *user;
  56. int perm;
  57. };
  58. enum
  59. {
  60. Maxdmsg= 1<<16,
  61. Maxdstate= 128, /* must be a power of 2 */
  62. };
  63. Lock dslock;
  64. int dshiwat;
  65. char *dsname[Maxdstate];
  66. Dstate *dstate[Maxdstate];
  67. char *encalgs;
  68. char *hashalgs;
  69. enum{
  70. Qtopdir = 1, /* top level directory */
  71. Qprotodir,
  72. Qclonus,
  73. Qconvdir, /* directory for a conversation */
  74. Qdata,
  75. Qctl,
  76. Qsecretin,
  77. Qsecretout,
  78. Qencalgs,
  79. Qhashalgs,
  80. };
  81. #define TYPE(x) ((x).path & 0xf)
  82. #define CONV(x) (((x).path >> 5)&(Maxdstate-1))
  83. #define QID(c, y) (((c)<<5) | (y))
  84. static void ensure(Dstate*, Block**, int);
  85. static void consume(Block**, uchar*, int);
  86. static void setsecret(OneWay*, uchar*, int);
  87. static Block* encryptb(Dstate*, Block*, int);
  88. static Block* decryptb(Dstate*, Block*);
  89. static Block* digestb(Dstate*, Block*, int);
  90. static void checkdigestb(Dstate*, Block*);
  91. static Chan* buftochan(char*);
  92. static void sslhangup(Dstate*);
  93. static Dstate* dsclone(Chan *c);
  94. static void dsnew(Chan *c, Dstate **);
  95. static long sslput(Dstate *s, Block * volatile b);
  96. char *sslnames[] = {
  97. /* unused */ 0,
  98. /* topdir */ 0,
  99. /* protodir */ 0,
  100. "clone",
  101. /* convdir */ 0,
  102. "data",
  103. "ctl",
  104. "secretin",
  105. "secretout",
  106. "encalgs",
  107. "hashalgs",
  108. };
  109. static int
  110. sslgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp)
  111. {
  112. Qid q;
  113. Dstate *ds;
  114. char name[16], *p, *nm;
  115. int ft;
  116. USED(n);
  117. USED(nd);
  118. USED(d);
  119. q.type = QTFILE;
  120. q.vers = 0;
  121. ft = TYPE(c->qid);
  122. switch(ft) {
  123. case Qtopdir:
  124. if(s == DEVDOTDOT){
  125. q.path = QID(0, Qtopdir);
  126. q.type = QTDIR;
  127. devdir(c, q, "#D", 0, eve, 0555, dp);
  128. return 1;
  129. }
  130. if(s > 0)
  131. return -1;
  132. q.path = QID(0, Qprotodir);
  133. q.type = QTDIR;
  134. devdir(c, q, "ssl", 0, eve, 0555, dp);
  135. return 1;
  136. case Qprotodir:
  137. if(s == DEVDOTDOT){
  138. q.path = QID(0, Qtopdir);
  139. q.type = QTDIR;
  140. devdir(c, q, ".", 0, eve, 0555, dp);
  141. return 1;
  142. }
  143. if(s < dshiwat) {
  144. q.path = QID(s, Qconvdir);
  145. q.type = QTDIR;
  146. ds = dstate[s];
  147. if(ds != 0)
  148. nm = ds->user;
  149. else
  150. nm = eve;
  151. if(dsname[s] == nil){
  152. sprint(name, "%d", s);
  153. kstrdup(&dsname[s], name);
  154. }
  155. devdir(c, q, dsname[s], 0, nm, 0555, dp);
  156. return 1;
  157. }
  158. if(s > dshiwat)
  159. return -1;
  160. q.path = QID(0, Qclonus);
  161. devdir(c, q, "clone", 0, eve, 0555, dp);
  162. return 1;
  163. case Qconvdir:
  164. if(s == DEVDOTDOT){
  165. q.path = QID(0, Qprotodir);
  166. q.type = QTDIR;
  167. devdir(c, q, "ssl", 0, eve, 0555, dp);
  168. return 1;
  169. }
  170. ds = dstate[CONV(c->qid)];
  171. if(ds != 0)
  172. nm = ds->user;
  173. else
  174. nm = eve;
  175. switch(s) {
  176. default:
  177. return -1;
  178. case 0:
  179. q.path = QID(CONV(c->qid), Qctl);
  180. p = "ctl";
  181. break;
  182. case 1:
  183. q.path = QID(CONV(c->qid), Qdata);
  184. p = "data";
  185. break;
  186. case 2:
  187. q.path = QID(CONV(c->qid), Qsecretin);
  188. p = "secretin";
  189. break;
  190. case 3:
  191. q.path = QID(CONV(c->qid), Qsecretout);
  192. p = "secretout";
  193. break;
  194. case 4:
  195. q.path = QID(CONV(c->qid), Qencalgs);
  196. p = "encalgs";
  197. break;
  198. case 5:
  199. q.path = QID(CONV(c->qid), Qhashalgs);
  200. p = "hashalgs";
  201. break;
  202. }
  203. devdir(c, q, p, 0, nm, 0660, dp);
  204. return 1;
  205. case Qclonus:
  206. devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, eve, 0555, dp);
  207. return 1;
  208. default:
  209. ds = dstate[CONV(c->qid)];
  210. if(ds != 0)
  211. nm = ds->user;
  212. else
  213. nm = eve;
  214. devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, nm, 0660, dp);
  215. return 1;
  216. }
  217. return -1;
  218. }
  219. static Chan*
  220. sslattach(char *spec)
  221. {
  222. Chan *c;
  223. c = devattach('D', spec);
  224. c->qid.path = QID(0, Qtopdir);
  225. c->qid.vers = 0;
  226. c->qid.type = QTDIR;
  227. return c;
  228. }
  229. static Walkqid*
  230. sslwalk(Chan *c, Chan *nc, char **name, int nname)
  231. {
  232. return devwalk(c, nc, name, nname, nil, 0, sslgen);
  233. }
  234. static int
  235. sslstat(Chan *c, uchar *db, int n)
  236. {
  237. return devstat(c, db, n, nil, 0, sslgen);
  238. }
  239. static Chan*
  240. sslopen(Chan *c, int omode)
  241. {
  242. Dstate *s, **pp;
  243. int perm;
  244. int ft;
  245. perm = 0;
  246. omode &= 3;
  247. switch(omode) {
  248. case OREAD:
  249. perm = 4;
  250. break;
  251. case OWRITE:
  252. perm = 2;
  253. break;
  254. case ORDWR:
  255. perm = 6;
  256. break;
  257. }
  258. ft = TYPE(c->qid);
  259. switch(ft) {
  260. default:
  261. panic("sslopen");
  262. case Qtopdir:
  263. case Qprotodir:
  264. case Qconvdir:
  265. if(omode != OREAD)
  266. error(Eperm);
  267. break;
  268. case Qclonus:
  269. s = dsclone(c);
  270. if(s == 0)
  271. error(Enodev);
  272. break;
  273. case Qctl:
  274. case Qdata:
  275. case Qsecretin:
  276. case Qsecretout:
  277. if(waserror()) {
  278. unlock(&dslock);
  279. nexterror();
  280. }
  281. lock(&dslock);
  282. pp = &dstate[CONV(c->qid)];
  283. s = *pp;
  284. if(s == 0)
  285. dsnew(c, pp);
  286. else {
  287. if((perm & (s->perm>>6)) != perm
  288. && (strcmp(up->user, s->user) != 0
  289. || (perm & s->perm) != perm))
  290. error(Eperm);
  291. s->ref++;
  292. }
  293. unlock(&dslock);
  294. poperror();
  295. break;
  296. case Qencalgs:
  297. case Qhashalgs:
  298. if(omode != OREAD)
  299. error(Eperm);
  300. break;
  301. }
  302. c->mode = openmode(omode);
  303. c->flag |= COPEN;
  304. c->offset = 0;
  305. return c;
  306. }
  307. static int
  308. sslwstat(Chan *c, uchar *db, int n)
  309. {
  310. Dir *dir;
  311. Dstate *s;
  312. int m;
  313. s = dstate[CONV(c->qid)];
  314. if(s == 0)
  315. error(Ebadusefd);
  316. if(strcmp(s->user, up->user) != 0)
  317. error(Eperm);
  318. dir = smalloc(sizeof(Dir)+n);
  319. m = convM2D(db, n, &dir[0], (char*)&dir[1]);
  320. if(m == 0){
  321. free(dir);
  322. error(Eshortstat);
  323. }
  324. if(!emptystr(dir->uid))
  325. kstrdup(&s->user, dir->uid);
  326. if(dir->mode != ~0)
  327. s->perm = dir->mode;
  328. free(dir);
  329. return m;
  330. }
  331. static void
  332. sslclose(Chan *c)
  333. {
  334. Dstate *s;
  335. int ft;
  336. ft = TYPE(c->qid);
  337. switch(ft) {
  338. case Qctl:
  339. case Qdata:
  340. case Qsecretin:
  341. case Qsecretout:
  342. if((c->flag & COPEN) == 0)
  343. break;
  344. s = dstate[CONV(c->qid)];
  345. if(s == 0)
  346. break;
  347. lock(&dslock);
  348. if(--s->ref > 0) {
  349. unlock(&dslock);
  350. break;
  351. }
  352. dstate[CONV(c->qid)] = 0;
  353. unlock(&dslock);
  354. if(s->user != nil)
  355. free(s->user);
  356. sslhangup(s);
  357. if(s->c)
  358. cclose(s->c);
  359. if(s->in.secret)
  360. free(s->in.secret);
  361. if(s->out.secret)
  362. free(s->out.secret);
  363. if(s->in.state)
  364. free(s->in.state);
  365. if(s->out.state)
  366. free(s->out.state);
  367. free(s);
  368. }
  369. }
  370. /*
  371. * make sure we have at least 'n' bytes in list 'l'
  372. */
  373. static void
  374. ensure(Dstate *s, Block **l, int n)
  375. {
  376. int sofar, i;
  377. Block *b, *bl;
  378. sofar = 0;
  379. for(b = *l; b; b = b->next){
  380. sofar += BLEN(b);
  381. if(sofar >= n)
  382. return;
  383. l = &b->next;
  384. }
  385. while(sofar < n){
  386. bl = devtab[s->c->type]->bread(s->c, Maxdmsg, 0);
  387. if(bl == 0)
  388. nexterror();
  389. *l = bl;
  390. i = 0;
  391. for(b = bl; b; b = b->next){
  392. i += BLEN(b);
  393. l = &b->next;
  394. }
  395. if(i == 0)
  396. error(Ehungup);
  397. sofar += i;
  398. }
  399. }
  400. /*
  401. * copy 'n' bytes from 'l' into 'p' and free
  402. * the bytes in 'l'
  403. */
  404. static void
  405. consume(Block **l, uchar *p, int n)
  406. {
  407. Block *b;
  408. int i;
  409. for(; *l && n > 0; n -= i){
  410. b = *l;
  411. i = BLEN(b);
  412. if(i > n)
  413. i = n;
  414. memmove(p, b->rp, i);
  415. b->rp += i;
  416. p += i;
  417. if(BLEN(b) < 0)
  418. panic("consume");
  419. if(BLEN(b))
  420. break;
  421. *l = b->next;
  422. freeb(b);
  423. }
  424. }
  425. /*
  426. * give back n bytes
  427. static void
  428. regurgitate(Dstate *s, uchar *p, int n)
  429. {
  430. Block *b;
  431. if(n <= 0)
  432. return;
  433. b = s->unprocessed;
  434. if(s->unprocessed == nil || b->rp - b->base < n) {
  435. b = allocb(n);
  436. memmove(b->wp, p, n);
  437. b->wp += n;
  438. b->next = s->unprocessed;
  439. s->unprocessed = b;
  440. } else {
  441. b->rp -= n;
  442. memmove(b->rp, p, n);
  443. }
  444. }
  445. */
  446. /*
  447. * remove at most n bytes from the queue, if discard is set
  448. * dump the remainder
  449. */
  450. static Block*
  451. qtake(Block **l, int n, int discard)
  452. {
  453. Block *nb, *b, *first;
  454. int i;
  455. first = *l;
  456. for(b = first; b; b = b->next){
  457. i = BLEN(b);
  458. if(i == n){
  459. if(discard){
  460. freeblist(b->next);
  461. *l = 0;
  462. } else
  463. *l = b->next;
  464. b->next = 0;
  465. return first;
  466. } else if(i > n){
  467. i -= n;
  468. if(discard){
  469. freeblist(b->next);
  470. b->wp -= i;
  471. *l = 0;
  472. } else {
  473. nb = allocb(i);
  474. memmove(nb->wp, b->rp+n, i);
  475. nb->wp += i;
  476. b->wp -= i;
  477. nb->next = b->next;
  478. *l = nb;
  479. }
  480. b->next = 0;
  481. if(BLEN(b) < 0)
  482. panic("qtake");
  483. return first;
  484. } else
  485. n -= i;
  486. if(BLEN(b) < 0)
  487. panic("qtake");
  488. }
  489. *l = 0;
  490. return first;
  491. }
  492. /*
  493. * We can't let Eintr's lose data since the program
  494. * doing the read may be able to handle it. The only
  495. * places Eintr is possible is during the read's in consume.
  496. * Therefore, we make sure we can always put back the bytes
  497. * consumed before the last ensure.
  498. */
  499. static Block*
  500. sslbread(Chan *c, long n, ulong o)
  501. {
  502. Dstate * volatile s;
  503. Block *b;
  504. uchar consumed[3], *p;
  505. int toconsume;
  506. int len, pad;
  507. USED(o);
  508. s = dstate[CONV(c->qid)];
  509. if(s == 0)
  510. panic("sslbread");
  511. if(s->state == Sincomplete)
  512. error(Ebadusefd);
  513. qlock(&s->in.q);
  514. if(waserror()){
  515. qunlock(&s->in.q);
  516. nexterror();
  517. }
  518. if(s->processed == 0){
  519. /*
  520. * Read in the whole message. Until we've got it all,
  521. * it stays on s->unprocessed, so that if we get Eintr,
  522. * we'll pick up where we left off.
  523. */
  524. ensure(s, &s->unprocessed, 3);
  525. s->unprocessed = pullupblock(s->unprocessed, 2);
  526. p = s->unprocessed->rp;
  527. if(p[0] & 0x80){
  528. len = ((p[0] & 0x7f)<<8) | p[1];
  529. ensure(s, &s->unprocessed, len);
  530. pad = 0;
  531. toconsume = 2;
  532. } else {
  533. s->unprocessed = pullupblock(s->unprocessed, 3);
  534. len = ((p[0] & 0x3f)<<8) | p[1];
  535. pad = p[2];
  536. if(pad > len){
  537. print("pad %d buf len %d\n", pad, len);
  538. error("bad pad in ssl message");
  539. }
  540. toconsume = 3;
  541. }
  542. ensure(s, &s->unprocessed, toconsume+len);
  543. /* skip header */
  544. consume(&s->unprocessed, consumed, toconsume);
  545. /* grab the next message and decode/decrypt it */
  546. b = qtake(&s->unprocessed, len, 0);
  547. if(blocklen(b) != len)
  548. print("devssl: sslbread got wrong count %d != %d", blocklen(b), len);
  549. if(waserror()){
  550. qunlock(&s->in.ctlq);
  551. if(b != nil)
  552. freeb(b);
  553. nexterror();
  554. }
  555. qlock(&s->in.ctlq);
  556. switch(s->state){
  557. case Sencrypting:
  558. if(b == nil)
  559. error("ssl message too short (encrypting)");
  560. b = decryptb(s, b);
  561. break;
  562. case Sdigesting:
  563. b = pullupblock(b, s->diglen);
  564. if(b == nil)
  565. error("ssl message too short (digesting)");
  566. checkdigestb(s, b);
  567. pullblock(&b, s->diglen);
  568. len -= s->diglen;
  569. break;
  570. case Sdigenc:
  571. b = decryptb(s, b);
  572. b = pullupblock(b, s->diglen);
  573. if(b == nil)
  574. error("ssl message too short (dig+enc)");
  575. checkdigestb(s, b);
  576. pullblock(&b, s->diglen);
  577. len -= s->diglen;
  578. break;
  579. }
  580. /* remove pad */
  581. if(pad)
  582. s->processed = qtake(&b, len - pad, 1);
  583. else
  584. s->processed = b;
  585. b = nil;
  586. s->in.mid++;
  587. qunlock(&s->in.ctlq);
  588. poperror();
  589. }
  590. /* return at most what was asked for */
  591. b = qtake(&s->processed, n, 0);
  592. qunlock(&s->in.q);
  593. poperror();
  594. return b;
  595. }
  596. static long
  597. sslread(Chan *c, void *a, long n, vlong off)
  598. {
  599. Block * volatile b;
  600. Block *nb;
  601. uchar *va;
  602. int i;
  603. char buf[128];
  604. ulong offset = off;
  605. int ft;
  606. if(c->qid.type & QTDIR)
  607. return devdirread(c, a, n, 0, 0, sslgen);
  608. ft = TYPE(c->qid);
  609. switch(ft) {
  610. default:
  611. error(Ebadusefd);
  612. case Qctl:
  613. ft = CONV(c->qid);
  614. sprint(buf, "%d", ft);
  615. return readstr(offset, a, n, buf);
  616. case Qdata:
  617. b = sslbread(c, n, offset);
  618. break;
  619. case Qencalgs:
  620. return readstr(offset, a, n, encalgs);
  621. break;
  622. case Qhashalgs:
  623. return readstr(offset, a, n, hashalgs);
  624. break;
  625. }
  626. if(waserror()){
  627. freeblist(b);
  628. nexterror();
  629. }
  630. n = 0;
  631. va = a;
  632. for(nb = b; nb; nb = nb->next){
  633. i = BLEN(nb);
  634. memmove(va+n, nb->rp, i);
  635. n += i;
  636. }
  637. freeblist(b);
  638. poperror();
  639. return n;
  640. }
  641. /*
  642. * this algorithm doesn't have to be great since we're just
  643. * trying to obscure the block fill
  644. */
  645. static void
  646. randfill(uchar *buf, int len)
  647. {
  648. while(len-- > 0)
  649. *buf++ = fastrand();
  650. }
  651. static long
  652. sslbwrite(Chan *c, Block *b, ulong o)
  653. {
  654. Dstate * volatile s;
  655. long rv;
  656. USED(o);
  657. s = dstate[CONV(c->qid)];
  658. if(s == nil)
  659. panic("sslbwrite");
  660. if(s->state == Sincomplete){
  661. freeb(b);
  662. error(Ebadusefd);
  663. }
  664. /* lock so split writes won't interleave */
  665. if(waserror()){
  666. qunlock(&s->out.q);
  667. nexterror();
  668. }
  669. qlock(&s->out.q);
  670. rv = sslput(s, b);
  671. poperror();
  672. qunlock(&s->out.q);
  673. return rv;
  674. }
  675. /*
  676. * use SSL record format, add in count, digest and/or encrypt.
  677. * the write is interruptable. if it is interrupted, we'll
  678. * get out of sync with the far side. not much we can do about
  679. * it since we don't know if any bytes have been written.
  680. */
  681. static long
  682. sslput(Dstate *s, Block * volatile b)
  683. {
  684. Block *nb;
  685. int h, n, m, pad, rv;
  686. uchar *p;
  687. int offset;
  688. if(waserror()){
  689. iprint("error: %s\n", up->errstr);
  690. if(b != nil)
  691. free(b);
  692. nexterror();
  693. }
  694. rv = 0;
  695. while(b != nil){
  696. m = n = BLEN(b);
  697. h = s->diglen + 2;
  698. /* trim to maximum block size */
  699. pad = 0;
  700. if(m > s->max){
  701. m = s->max;
  702. } else if(s->blocklen != 1){
  703. pad = (m + s->diglen)%s->blocklen;
  704. if(pad){
  705. if(m > s->maxpad){
  706. pad = 0;
  707. m = s->maxpad;
  708. } else {
  709. pad = s->blocklen - pad;
  710. h++;
  711. }
  712. }
  713. }
  714. rv += m;
  715. if(m != n){
  716. nb = allocb(m + h + pad);
  717. memmove(nb->wp + h, b->rp, m);
  718. nb->wp += m + h;
  719. b->rp += m;
  720. } else {
  721. /* add header space */
  722. nb = padblock(b, h);
  723. b = 0;
  724. }
  725. m += s->diglen;
  726. /* SSL style count */
  727. if(pad){
  728. nb = padblock(nb, -pad);
  729. randfill(nb->wp, pad);
  730. nb->wp += pad;
  731. m += pad;
  732. p = nb->rp;
  733. p[0] = (m>>8);
  734. p[1] = m;
  735. p[2] = pad;
  736. offset = 3;
  737. } else {
  738. p = nb->rp;
  739. p[0] = (m>>8) | 0x80;
  740. p[1] = m;
  741. offset = 2;
  742. }
  743. switch(s->state){
  744. case Sencrypting:
  745. nb = encryptb(s, nb, offset);
  746. break;
  747. case Sdigesting:
  748. nb = digestb(s, nb, offset);
  749. break;
  750. case Sdigenc:
  751. nb = digestb(s, nb, offset);
  752. nb = encryptb(s, nb, offset);
  753. break;
  754. }
  755. s->out.mid++;
  756. m = BLEN(nb);
  757. devtab[s->c->type]->bwrite(s->c, nb, s->c->offset);
  758. s->c->offset += m;
  759. }
  760. poperror();
  761. return rv;
  762. }
  763. static void
  764. setsecret(OneWay *w, uchar *secret, int n)
  765. {
  766. if(w->secret)
  767. free(w->secret);
  768. w->secret = smalloc(n);
  769. memmove(w->secret, secret, n);
  770. w->slen = n;
  771. }
  772. static void
  773. initDESkey(OneWay *w)
  774. {
  775. if(w->state){
  776. free(w->state);
  777. w->state = 0;
  778. }
  779. w->state = smalloc(sizeof(DESstate));
  780. if(w->slen >= 16)
  781. setupDESstate(w->state, w->secret, w->secret+8);
  782. else if(w->slen >= 8)
  783. setupDESstate(w->state, w->secret, 0);
  784. else
  785. error("secret too short");
  786. }
  787. /*
  788. * 40 bit DES is the same as 56 bit DES. However,
  789. * 16 bits of the key are masked to zero.
  790. */
  791. static void
  792. initDESkey_40(OneWay *w)
  793. {
  794. uchar key[8];
  795. if(w->state){
  796. free(w->state);
  797. w->state = 0;
  798. }
  799. if(w->slen >= 8){
  800. memmove(key, w->secret, 8);
  801. key[0] &= 0x0f;
  802. key[2] &= 0x0f;
  803. key[4] &= 0x0f;
  804. key[6] &= 0x0f;
  805. }
  806. w->state = malloc(sizeof(DESstate));
  807. if(w->slen >= 16)
  808. setupDESstate(w->state, key, w->secret+8);
  809. else if(w->slen >= 8)
  810. setupDESstate(w->state, key, 0);
  811. else
  812. error("secret too short");
  813. }
  814. static void
  815. initRC4key(OneWay *w)
  816. {
  817. if(w->state){
  818. free(w->state);
  819. w->state = 0;
  820. }
  821. w->state = smalloc(sizeof(RC4state));
  822. setupRC4state(w->state, w->secret, w->slen);
  823. }
  824. /*
  825. * 40 bit RC4 is the same as n-bit RC4. However,
  826. * we ignore all but the first 40 bits of the key.
  827. */
  828. static void
  829. initRC4key_40(OneWay *w)
  830. {
  831. if(w->state){
  832. free(w->state);
  833. w->state = 0;
  834. }
  835. if(w->slen > 5)
  836. w->slen = 5;
  837. w->state = malloc(sizeof(RC4state));
  838. setupRC4state(w->state, w->secret, w->slen);
  839. }
  840. /*
  841. * 128 bit RC4 is the same as n-bit RC4. However,
  842. * we ignore all but the first 128 bits of the key.
  843. */
  844. static void
  845. initRC4key_128(OneWay *w)
  846. {
  847. if(w->state){
  848. free(w->state);
  849. w->state = 0;
  850. }
  851. if(w->slen > 16)
  852. w->slen = 16;
  853. w->state = malloc(sizeof(RC4state));
  854. setupRC4state(w->state, w->secret, w->slen);
  855. }
  856. typedef struct Hashalg Hashalg;
  857. struct Hashalg
  858. {
  859. char *name;
  860. int diglen;
  861. DigestState *(*hf)(uchar*, ulong, uchar*, DigestState*);
  862. };
  863. Hashalg hashtab[] =
  864. {
  865. { "md4", MD4dlen, md4, },
  866. { "md5", MD5dlen, md5, },
  867. { "sha1", SHA1dlen, sha1, },
  868. { "sha", SHA1dlen, sha1, },
  869. { 0 }
  870. };
  871. static int
  872. parsehashalg(char *p, Dstate *s)
  873. {
  874. Hashalg *ha;
  875. for(ha = hashtab; ha->name; ha++){
  876. if(strcmp(p, ha->name) == 0){
  877. s->hf = ha->hf;
  878. s->diglen = ha->diglen;
  879. s->state &= ~Sclear;
  880. s->state |= Sdigesting;
  881. return 0;
  882. }
  883. }
  884. return -1;
  885. }
  886. typedef struct Encalg Encalg;
  887. struct Encalg
  888. {
  889. char *name;
  890. int blocklen;
  891. int alg;
  892. void (*keyinit)(OneWay*);
  893. };
  894. #ifdef NOSPOOKS
  895. Encalg encrypttab[] =
  896. {
  897. { "descbc", 8, DESCBC, initDESkey, }, /* DEPRECATED -- use des_56_cbc */
  898. { "desecb", 8, DESECB, initDESkey, }, /* DEPRECATED -- use des_56_ecb */
  899. { "des_56_cbc", 8, DESCBC, initDESkey, },
  900. { "des_56_ecb", 8, DESECB, initDESkey, },
  901. { "des_40_cbc", 8, DESCBC, initDESkey_40, },
  902. { "des_40_ecb", 8, DESECB, initDESkey_40, },
  903. { "rc4", 1, RC4, initRC4key_40, }, /* DEPRECATED -- use rc4_X */
  904. { "rc4_256", 1, RC4, initRC4key, },
  905. { "rc4_128", 1, RC4, initRC4key_128, },
  906. { "rc4_40", 1, RC4, initRC4key_40, },
  907. { 0 }
  908. };
  909. #else
  910. Encalg encrypttab[] =
  911. {
  912. { "des_40_cbc", 8, DESCBC, initDESkey_40, },
  913. { "des_40_ecb", 8, DESECB, initDESkey_40, },
  914. { "rc4", 1, RC4, initRC4key_40, }, /* DEPRECATED -- use rc4_X */
  915. { "rc4_40", 1, RC4, initRC4key_40, },
  916. { 0 }
  917. };
  918. #endif /* NOSPOOKS */
  919. static int
  920. parseencryptalg(char *p, Dstate *s)
  921. {
  922. Encalg *ea;
  923. for(ea = encrypttab; ea->name; ea++){
  924. if(strcmp(p, ea->name) == 0){
  925. s->encryptalg = ea->alg;
  926. s->blocklen = ea->blocklen;
  927. (*ea->keyinit)(&s->in);
  928. (*ea->keyinit)(&s->out);
  929. s->state &= ~Sclear;
  930. s->state |= Sencrypting;
  931. return 0;
  932. }
  933. }
  934. return -1;
  935. }
  936. static long
  937. sslwrite(Chan *c, void *a, long n, vlong o)
  938. {
  939. Dstate * volatile s;
  940. Block * volatile b;
  941. int m, t;
  942. char *p, *np, *e, buf[128];
  943. uchar *x;
  944. USED(o);
  945. s = dstate[CONV(c->qid)];
  946. if(s == 0)
  947. panic("sslwrite");
  948. t = TYPE(c->qid);
  949. if(t == Qdata){
  950. if(s->state == Sincomplete)
  951. error(Ebadusefd);
  952. /* lock should a write gets split over multiple records */
  953. if(waserror()){
  954. qunlock(&s->out.q);
  955. nexterror();
  956. }
  957. qlock(&s->out.q);
  958. p = a;
  959. if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
  960. n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
  961. e = p + n;
  962. do {
  963. m = e - p;
  964. if(m > s->max)
  965. m = s->max;
  966. b = allocb(m);
  967. if(waserror()){
  968. freeb(b);
  969. nexterror();
  970. }
  971. memmove(b->wp, p, m);
  972. poperror();
  973. b->wp += m;
  974. sslput(s, b);
  975. p += m;
  976. } while(p < e);
  977. p = a;
  978. if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
  979. n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
  980. poperror();
  981. qunlock(&s->out.q);
  982. return n;
  983. }
  984. /* mutex with operations using what we're about to change */
  985. if(waserror()){
  986. qunlock(&s->in.ctlq);
  987. qunlock(&s->out.q);
  988. nexterror();
  989. }
  990. qlock(&s->in.ctlq);
  991. qlock(&s->out.q);
  992. switch(t){
  993. default:
  994. panic("sslwrite");
  995. case Qsecretin:
  996. setsecret(&s->in, a, n);
  997. goto out;
  998. case Qsecretout:
  999. setsecret(&s->out, a, n);
  1000. goto out;
  1001. case Qctl:
  1002. break;
  1003. }
  1004. if(n >= sizeof(buf))
  1005. error("arg too long");
  1006. strncpy(buf, a, n);
  1007. buf[n] = 0;
  1008. p = strchr(buf, '\n');
  1009. if(p)
  1010. *p = 0;
  1011. p = strchr(buf, ' ');
  1012. if(p)
  1013. *p++ = 0;
  1014. if(strcmp(buf, "fd") == 0){
  1015. s->c = buftochan(p);
  1016. /* default is clear (msg delimiters only) */
  1017. s->state = Sclear;
  1018. s->blocklen = 1;
  1019. s->diglen = 0;
  1020. s->maxpad = s->max = (1<<15) - s->diglen - 1;
  1021. s->in.mid = 0;
  1022. s->out.mid = 0;
  1023. } else if(strcmp(buf, "alg") == 0 && p != 0){
  1024. s->blocklen = 1;
  1025. s->diglen = 0;
  1026. if(s->c == 0)
  1027. error("must set fd before algorithm");
  1028. s->state = Sclear;
  1029. s->maxpad = s->max = (1<<15) - s->diglen - 1;
  1030. if(strcmp(p, "clear") == 0){
  1031. goto out;
  1032. }
  1033. if(s->in.secret && s->out.secret == 0)
  1034. setsecret(&s->out, s->in.secret, s->in.slen);
  1035. if(s->out.secret && s->in.secret == 0)
  1036. setsecret(&s->in, s->out.secret, s->out.slen);
  1037. if(s->in.secret == 0 || s->out.secret == 0)
  1038. error("algorithm but no secret");
  1039. s->hf = 0;
  1040. s->encryptalg = Noencryption;
  1041. s->blocklen = 1;
  1042. for(;;){
  1043. np = strchr(p, ' ');
  1044. if(np)
  1045. *np++ = 0;
  1046. if(parsehashalg(p, s) < 0)
  1047. if(parseencryptalg(p, s) < 0)
  1048. error("bad algorithm");
  1049. if(np == 0)
  1050. break;
  1051. p = np;
  1052. }
  1053. if(s->hf == 0 && s->encryptalg == Noencryption)
  1054. error("bad algorithm");
  1055. if(s->blocklen != 1){
  1056. s->max = (1<<15) - s->diglen - 1;
  1057. s->max -= s->max % s->blocklen;
  1058. s->maxpad = (1<<14) - s->diglen - 1;
  1059. s->maxpad -= s->maxpad % s->blocklen;
  1060. } else
  1061. s->maxpad = s->max = (1<<15) - s->diglen - 1;
  1062. } else if(strcmp(buf, "secretin") == 0 && p != 0) {
  1063. m = (strlen(p)*3)/2;
  1064. x = smalloc(m);
  1065. t = dec64(x, m, p, strlen(p));
  1066. setsecret(&s->in, x, t);
  1067. free(x);
  1068. } else if(strcmp(buf, "secretout") == 0 && p != 0) {
  1069. m = (strlen(p)*3)/2 + 1;
  1070. x = smalloc(m);
  1071. t = dec64(x, m, p, strlen(p));
  1072. setsecret(&s->out, x, t);
  1073. free(x);
  1074. } else
  1075. error(Ebadarg);
  1076. out:
  1077. qunlock(&s->in.ctlq);
  1078. qunlock(&s->out.q);
  1079. poperror();
  1080. return n;
  1081. }
  1082. static void
  1083. sslinit(void)
  1084. {
  1085. struct Encalg *e;
  1086. struct Hashalg *h;
  1087. int n;
  1088. char *cp;
  1089. n = 1;
  1090. for(e = encrypttab; e->name != nil; e++)
  1091. n += strlen(e->name) + 1;
  1092. cp = encalgs = smalloc(n);
  1093. for(e = encrypttab;;){
  1094. strcpy(cp, e->name);
  1095. cp += strlen(e->name);
  1096. e++;
  1097. if(e->name == nil)
  1098. break;
  1099. *cp++ = ' ';
  1100. }
  1101. *cp = 0;
  1102. n = 1;
  1103. for(h = hashtab; h->name != nil; h++)
  1104. n += strlen(h->name) + 1;
  1105. cp = hashalgs = smalloc(n);
  1106. for(h = hashtab;;){
  1107. strcpy(cp, h->name);
  1108. cp += strlen(h->name);
  1109. h++;
  1110. if(h->name == nil)
  1111. break;
  1112. *cp++ = ' ';
  1113. }
  1114. *cp = 0;
  1115. }
  1116. Dev ssldevtab = {
  1117. 'D',
  1118. "ssl",
  1119. devreset,
  1120. sslinit,
  1121. devshutdown,
  1122. sslattach,
  1123. sslwalk,
  1124. sslstat,
  1125. sslopen,
  1126. devcreate,
  1127. sslclose,
  1128. sslread,
  1129. sslbread,
  1130. sslwrite,
  1131. sslbwrite,
  1132. devremove,
  1133. sslwstat,
  1134. };
  1135. static Block*
  1136. encryptb(Dstate *s, Block *b, int offset)
  1137. {
  1138. uchar *p, *ep, *p2, *ip, *eip;
  1139. DESstate *ds;
  1140. switch(s->encryptalg){
  1141. case DESECB:
  1142. ds = s->out.state;
  1143. ep = b->rp + BLEN(b);
  1144. for(p = b->rp + offset; p < ep; p += 8)
  1145. block_cipher(ds->expanded, p, 0);
  1146. break;
  1147. case DESCBC:
  1148. ds = s->out.state;
  1149. ep = b->rp + BLEN(b);
  1150. for(p = b->rp + offset; p < ep; p += 8){
  1151. p2 = p;
  1152. ip = ds->ivec;
  1153. for(eip = ip+8; ip < eip; )
  1154. *p2++ ^= *ip++;
  1155. block_cipher(ds->expanded, p, 0);
  1156. memmove(ds->ivec, p, 8);
  1157. }
  1158. break;
  1159. case RC4:
  1160. rc4(s->out.state, b->rp + offset, BLEN(b) - offset);
  1161. break;
  1162. }
  1163. return b;
  1164. }
  1165. static Block*
  1166. decryptb(Dstate *s, Block *bin)
  1167. {
  1168. Block *b, **l;
  1169. uchar *p, *ep, *tp, *ip, *eip;
  1170. DESstate *ds;
  1171. uchar tmp[8];
  1172. int i;
  1173. l = &bin;
  1174. for(b = bin; b; b = b->next){
  1175. /* make sure we have a multiple of s->blocklen */
  1176. if(s->blocklen > 1){
  1177. i = BLEN(b);
  1178. if(i % s->blocklen){
  1179. *l = b = pullupblock(b, i + s->blocklen - (i%s->blocklen));
  1180. if(b == 0)
  1181. error("ssl encrypted message too short");
  1182. }
  1183. }
  1184. l = &b->next;
  1185. /* decrypt */
  1186. switch(s->encryptalg){
  1187. case DESECB:
  1188. ds = s->in.state;
  1189. ep = b->rp + BLEN(b);
  1190. for(p = b->rp; p < ep; p += 8)
  1191. block_cipher(ds->expanded, p, 1);
  1192. break;
  1193. case DESCBC:
  1194. ds = s->in.state;
  1195. ep = b->rp + BLEN(b);
  1196. for(p = b->rp; p < ep;){
  1197. memmove(tmp, p, 8);
  1198. block_cipher(ds->expanded, p, 1);
  1199. tp = tmp;
  1200. ip = ds->ivec;
  1201. for(eip = ip+8; ip < eip; ){
  1202. *p++ ^= *ip;
  1203. *ip++ = *tp++;
  1204. }
  1205. }
  1206. break;
  1207. case RC4:
  1208. rc4(s->in.state, b->rp, BLEN(b));
  1209. break;
  1210. }
  1211. }
  1212. return bin;
  1213. }
  1214. static Block*
  1215. digestb(Dstate *s, Block *b, int offset)
  1216. {
  1217. uchar *p;
  1218. DigestState ss;
  1219. uchar msgid[4];
  1220. ulong n, h;
  1221. OneWay *w;
  1222. w = &s->out;
  1223. memset(&ss, 0, sizeof(ss));
  1224. h = s->diglen + offset;
  1225. n = BLEN(b) - h;
  1226. /* hash secret + message */
  1227. (*s->hf)(w->secret, w->slen, 0, &ss);
  1228. (*s->hf)(b->rp + h, n, 0, &ss);
  1229. /* hash message id */
  1230. p = msgid;
  1231. n = w->mid;
  1232. *p++ = n>>24;
  1233. *p++ = n>>16;
  1234. *p++ = n>>8;
  1235. *p = n;
  1236. (*s->hf)(msgid, 4, b->rp + offset, &ss);
  1237. return b;
  1238. }
  1239. static void
  1240. checkdigestb(Dstate *s, Block *bin)
  1241. {
  1242. uchar *p;
  1243. DigestState ss;
  1244. uchar msgid[4];
  1245. int n, h;
  1246. OneWay *w;
  1247. uchar digest[128];
  1248. Block *b;
  1249. w = &s->in;
  1250. memset(&ss, 0, sizeof(ss));
  1251. /* hash secret */
  1252. (*s->hf)(w->secret, w->slen, 0, &ss);
  1253. /* hash message */
  1254. h = s->diglen;
  1255. for(b = bin; b; b = b->next){
  1256. n = BLEN(b) - h;
  1257. if(n < 0)
  1258. panic("checkdigestb");
  1259. (*s->hf)(b->rp + h, n, 0, &ss);
  1260. h = 0;
  1261. }
  1262. /* hash message id */
  1263. p = msgid;
  1264. n = w->mid;
  1265. *p++ = n>>24;
  1266. *p++ = n>>16;
  1267. *p++ = n>>8;
  1268. *p = n;
  1269. (*s->hf)(msgid, 4, digest, &ss);
  1270. if(memcmp(digest, bin->rp, s->diglen) != 0)
  1271. error("bad digest");
  1272. }
  1273. /* get channel associated with an fd */
  1274. static Chan*
  1275. buftochan(char *p)
  1276. {
  1277. Chan *c;
  1278. int fd;
  1279. if(p == 0)
  1280. error(Ebadarg);
  1281. fd = strtoul(p, 0, 0);
  1282. if(fd < 0)
  1283. error(Ebadarg);
  1284. c = fdtochan(fd, -1, 0, 1); /* error check and inc ref */
  1285. if(devtab[c->type] == &ssldevtab){
  1286. cclose(c);
  1287. error("cannot ssl encrypt devssl files");
  1288. }
  1289. return c;
  1290. }
  1291. /* hand up a digest connection */
  1292. static void
  1293. sslhangup(Dstate *s)
  1294. {
  1295. Block *b;
  1296. qlock(&s->in.q);
  1297. for(b = s->processed; b; b = s->processed){
  1298. s->processed = b->next;
  1299. freeb(b);
  1300. }
  1301. if(s->unprocessed){
  1302. freeb(s->unprocessed);
  1303. s->unprocessed = 0;
  1304. }
  1305. s->state = Sincomplete;
  1306. qunlock(&s->in.q);
  1307. }
  1308. static Dstate*
  1309. dsclone(Chan *ch)
  1310. {
  1311. int i;
  1312. Dstate *ret;
  1313. if(waserror()) {
  1314. unlock(&dslock);
  1315. nexterror();
  1316. }
  1317. lock(&dslock);
  1318. ret = nil;
  1319. for(i=0; i<Maxdstate; i++){
  1320. if(dstate[i] == nil){
  1321. dsnew(ch, &dstate[i]);
  1322. ret = dstate[i];
  1323. break;
  1324. }
  1325. }
  1326. unlock(&dslock);
  1327. poperror();
  1328. return ret;
  1329. }
  1330. static void
  1331. dsnew(Chan *ch, Dstate **pp)
  1332. {
  1333. Dstate *s;
  1334. int t;
  1335. *pp = s = malloc(sizeof(*s));
  1336. if(!s)
  1337. error(Enomem);
  1338. if(pp - dstate >= dshiwat)
  1339. dshiwat++;
  1340. memset(s, 0, sizeof(*s));
  1341. s->state = Sincomplete;
  1342. s->ref = 1;
  1343. kstrdup(&s->user, up->user);
  1344. s->perm = 0660;
  1345. t = TYPE(ch->qid);
  1346. if(t == Qclonus)
  1347. t = Qctl;
  1348. ch->qid.path = QID(pp - dstate, t);
  1349. ch->qid.vers = 0;
  1350. }