devssl.c 25 KB

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