devssl.c 26 KB

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