devssl.c 25 KB

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