devssl.c 26 KB

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