esp.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  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. * Encapsulating Security Payload for IPsec for IPv4, rfc1827.
  11. * extended to IPv6.
  12. * rfc2104 defines hmac computation.
  13. * currently only implements tunnel mode.
  14. * TODO: verify aes algorithms;
  15. * transport mode (host-to-host)
  16. */
  17. #include "u.h"
  18. #include "../port/lib.h"
  19. #include "mem.h"
  20. #include "dat.h"
  21. #include "fns.h"
  22. #include "../port/error.h"
  23. #include "ip.h"
  24. #include "ipv6.h"
  25. #include "libsec.h"
  26. #define BITS2BYTES(bi) (((bi) + BI2BY - 1) / BI2BY)
  27. #define BYTES2BITS(by) ((by)*BI2BY)
  28. typedef struct Algorithm Algorithm;
  29. typedef struct Esp4hdr Esp4hdr;
  30. typedef struct Esp6hdr Esp6hdr;
  31. typedef struct Espcb Espcb;
  32. typedef struct Esphdr Esphdr;
  33. typedef struct Esppriv Esppriv;
  34. typedef struct Esptail Esptail;
  35. typedef struct Userhdr Userhdr;
  36. enum {
  37. Encrypt,
  38. Decrypt,
  39. IP_ESPPROTO = 50, /* IP v4 and v6 protocol number */
  40. Esp4hdrlen = IP4HDR + 8,
  41. Esp6hdrlen = IP6HDR + 8,
  42. Esptaillen = 2, /* does not include pad or auth data */
  43. Userhdrlen = 4, /* user-visible header size - if enabled */
  44. Desblk = BITS2BYTES(64),
  45. Des3keysz = BITS2BYTES(192),
  46. Aesblk = BITS2BYTES(128),
  47. Aeskeysz = BITS2BYTES(128),
  48. };
  49. struct Esphdr {
  50. u8 espspi[4]; /* Security parameter index */
  51. u8 espseq[4]; /* Sequence number */
  52. u8 payload[];
  53. };
  54. /*
  55. * tunnel-mode (network-to-network, etc.) layout is:
  56. * new IP hdrs | ESP hdr |
  57. * enc { orig IP hdrs | TCP/UDP hdr | user data | ESP trailer } | ESP ICV
  58. *
  59. * transport-mode (host-to-host) layout would be:
  60. * orig IP hdrs | ESP hdr |
  61. * enc { TCP/UDP hdr | user data | ESP trailer } | ESP ICV
  62. */
  63. struct Esp4hdr {
  64. /* ipv4 header */
  65. u8 vihl; /* Version and header length */
  66. u8 tos; /* Type of service */
  67. u8 length[2]; /* packet length */
  68. u8 id[2]; /* Identification */
  69. u8 frag[2]; /* Fragment information */
  70. u8 Unused;
  71. u8 espproto; /* Protocol */
  72. u8 espplen[2]; /* Header plus data length */
  73. u8 espsrc[4]; /* Ip source */
  74. u8 espdst[4]; /* Ip destination */
  75. Esphdr;
  76. };
  77. /* tunnel-mode layout */
  78. struct Esp6hdr {
  79. IPV6HDR;
  80. Esphdr;
  81. };
  82. struct Esptail {
  83. u8 pad;
  84. u8 nexthdr;
  85. };
  86. /* IP-version-dependent data */
  87. typedef struct Versdep Versdep;
  88. struct Versdep {
  89. u32 version;
  90. u32 iphdrlen;
  91. u32 hdrlen; /* iphdrlen + esp hdr len */
  92. u32 spi;
  93. u8 laddr[IPaddrlen];
  94. u8 raddr[IPaddrlen];
  95. };
  96. /* header as seen by the user */
  97. struct Userhdr {
  98. u8 nexthdr; /* next protocol */
  99. u8 unused[3];
  100. };
  101. struct Esppriv {
  102. u64 in;
  103. u32 inerrors;
  104. };
  105. /*
  106. * protocol specific part of Conv
  107. */
  108. struct Espcb {
  109. int incoming;
  110. int header; /* user-level header */
  111. u32 spi;
  112. u32 seq; /* last seq sent */
  113. u32 window; /* for replay attacks */
  114. char *espalg;
  115. void *espstate; /* other state for esp */
  116. int espivlen; /* in bytes */
  117. int espblklen;
  118. int (*cipher)(Espcb *, u8 *buf, int len);
  119. char *ahalg;
  120. void *ahstate; /* other state for esp */
  121. int ahlen; /* auth data length in bytes */
  122. int ahblklen;
  123. int (*auth)(Espcb *, u8 *buf, int len, u8 *hash);
  124. DigestState *ds;
  125. };
  126. struct Algorithm {
  127. char *name;
  128. int keylen; /* in bits */
  129. void (*init)(Espcb *, char *name, u8 *key, unsigned keylen);
  130. };
  131. static Conv *convlookup(Proto *esp, u32 spi);
  132. static char *setalg(Espcb *ecb, char **f, int n, Algorithm *alg);
  133. static void espkick(void *x);
  134. static void nullespinit(Espcb *, char *, u8 *key, unsigned keylen);
  135. static void des3espinit(Espcb *, char *, u8 *key, unsigned keylen);
  136. static void aescbcespinit(Espcb *, char *, u8 *key, unsigned keylen);
  137. static void aesctrespinit(Espcb *, char *, u8 *key, unsigned keylen);
  138. static void desespinit(Espcb *ecb, char *name, u8 *k, unsigned n);
  139. static void nullahinit(Espcb *, char *, u8 *key, unsigned keylen);
  140. static void shaahinit(Espcb *, char *, u8 *key, unsigned keylen);
  141. static void aesahinit(Espcb *, char *, u8 *key, unsigned keylen);
  142. static void md5ahinit(Espcb *, char *, u8 *key, unsigned keylen);
  143. static Algorithm espalg[] =
  144. {
  145. "null",
  146. 0,
  147. nullespinit,
  148. "des3_cbc",
  149. 192,
  150. des3espinit, /* new rfc2451, des-ede3 */
  151. "aes_128_cbc",
  152. 128,
  153. aescbcespinit, /* new rfc3602 */
  154. "aes_ctr",
  155. 128,
  156. aesctrespinit, /* new rfc3686 */
  157. "des_56_cbc",
  158. 64,
  159. desespinit, /* rfc2405, deprecated */
  160. /* rc4 was never required, was used in original bandt */
  161. // "rc4_128", 128, rc4espinit,
  162. nil,
  163. 0,
  164. nil,
  165. };
  166. static Algorithm ahalg[] =
  167. {
  168. "null",
  169. 0,
  170. nullahinit,
  171. "hmac_sha1_96",
  172. 128,
  173. shaahinit, /* rfc2404 */
  174. "aes_xcbc_mac_96",
  175. 128,
  176. aesahinit, /* new rfc3566 */
  177. "hmac_md5_96",
  178. 128,
  179. md5ahinit, /* rfc2403 */
  180. nil,
  181. 0,
  182. nil,
  183. };
  184. static char *
  185. espconnect(Conv *c, char **argv, int argc)
  186. {
  187. char *p, *pp, *e = nil;
  188. u32 spi;
  189. Espcb *ecb = (Espcb *)c->ptcl;
  190. switch(argc){
  191. default:
  192. e = "bad args to connect";
  193. break;
  194. case 2:
  195. p = strchr(argv[1], '!');
  196. if(p == nil){
  197. e = "malformed address";
  198. break;
  199. }
  200. *p++ = 0;
  201. if(parseip(c->raddr, argv[1]) == -1){
  202. e = Ebadip;
  203. break;
  204. }
  205. findlocalip(c->p->f, c->laddr, c->raddr);
  206. ecb->incoming = 0;
  207. ecb->seq = 0;
  208. if(strcmp(p, "*") == 0){
  209. qlock(c->p);
  210. for(;;){
  211. spi = nrand(1 << 16) + 256;
  212. if(convlookup(c->p, spi) == nil)
  213. break;
  214. }
  215. qunlock(c->p);
  216. ecb->spi = spi;
  217. ecb->incoming = 1;
  218. qhangup(c->wq, nil);
  219. } else {
  220. spi = strtoul(p, &pp, 10);
  221. if(pp == p){
  222. e = "malformed address";
  223. break;
  224. }
  225. ecb->spi = spi;
  226. qhangup(c->rq, nil);
  227. }
  228. nullespinit(ecb, "null", nil, 0);
  229. nullahinit(ecb, "null", nil, 0);
  230. }
  231. Fsconnected(c, e);
  232. return e;
  233. }
  234. static int
  235. espstate(Conv *c, char *state, int n)
  236. {
  237. return snprint(state, n, "%s", c->inuse ? "Open\n" : "Closed\n");
  238. }
  239. static void
  240. espcreate(Conv *c)
  241. {
  242. c->rq = qopen(64 * 1024, Qmsg, 0, 0);
  243. c->wq = qopen(64 * 1024, Qkick, espkick, c);
  244. }
  245. static void
  246. espclose(Conv *c)
  247. {
  248. Espcb *ecb;
  249. qclose(c->rq);
  250. qclose(c->wq);
  251. qclose(c->eq);
  252. ipmove(c->laddr, IPnoaddr);
  253. ipmove(c->raddr, IPnoaddr);
  254. ecb = (Espcb *)c->ptcl;
  255. free(ecb->espstate);
  256. free(ecb->ahstate);
  257. memset(ecb, 0, sizeof(Espcb));
  258. }
  259. static int
  260. convipvers(Conv *c)
  261. {
  262. if((memcmp(c->raddr, v4prefix, IPv4off) == 0 &&
  263. memcmp(c->laddr, v4prefix, IPv4off) == 0) ||
  264. ipcmp(c->raddr, IPnoaddr) == 0)
  265. return V4;
  266. else
  267. return V6;
  268. }
  269. static int
  270. pktipvers(Fs *f, Block **bpp)
  271. {
  272. if(*bpp == nil || BLEN(*bpp) == 0){
  273. /* get enough to identify the IP version */
  274. *bpp = pullupblock(*bpp, IP4HDR);
  275. if(*bpp == nil){
  276. netlog(f, Logesp, "esp: short packet\n");
  277. return 0;
  278. }
  279. }
  280. return (((Esp4hdr *)(*bpp)->rp)->vihl & 0xf0) == IP_VER4 ? V4 : V6;
  281. }
  282. static void
  283. getverslens(int version, Versdep *vp)
  284. {
  285. vp->version = version;
  286. switch(vp->version){
  287. case V4:
  288. vp->iphdrlen = IP4HDR;
  289. vp->hdrlen = Esp4hdrlen;
  290. break;
  291. case V6:
  292. vp->iphdrlen = IP6HDR;
  293. vp->hdrlen = Esp6hdrlen;
  294. break;
  295. default:
  296. panic("esp: getverslens version %d wrong", version);
  297. }
  298. }
  299. static void
  300. getpktspiaddrs(u8 *pkt, Versdep *vp)
  301. {
  302. Esp4hdr *eh4;
  303. Esp6hdr *eh6;
  304. switch(vp->version){
  305. case V4:
  306. eh4 = (Esp4hdr *)pkt;
  307. v4tov6(vp->raddr, eh4->espsrc);
  308. v4tov6(vp->laddr, eh4->espdst);
  309. vp->spi = nhgetl(eh4->espspi);
  310. break;
  311. case V6:
  312. eh6 = (Esp6hdr *)pkt;
  313. ipmove(vp->raddr, eh6->src);
  314. ipmove(vp->laddr, eh6->dst);
  315. vp->spi = nhgetl(eh6->espspi);
  316. break;
  317. default:
  318. panic("esp: getpktspiaddrs vp->version %ld wrong", vp->version);
  319. }
  320. }
  321. /*
  322. * encapsulate next IP packet on x's write queue in IP/ESP packet
  323. * and initiate output of the result.
  324. */
  325. static void
  326. espkick(void *x)
  327. {
  328. int nexthdr, payload, pad, align;
  329. u8 *auth;
  330. Block *bp;
  331. Conv *c = x;
  332. Esp4hdr *eh4;
  333. Esp6hdr *eh6;
  334. Espcb *ecb;
  335. Esptail *et;
  336. Userhdr *uh;
  337. Versdep vers;
  338. getverslens(convipvers(c), &vers);
  339. bp = qget(c->wq);
  340. if(bp == nil)
  341. return;
  342. qlock(&c->ql);
  343. ecb = c->ptcl;
  344. if(ecb->header){
  345. /* make sure the message has a User header */
  346. bp = pullupblock(bp, Userhdrlen);
  347. if(bp == nil){
  348. qunlock(&c->ql);
  349. return;
  350. }
  351. uh = (Userhdr *)bp->rp;
  352. nexthdr = uh->nexthdr;
  353. bp->rp += Userhdrlen;
  354. } else {
  355. nexthdr = 0; /* what should this be? */
  356. }
  357. payload = BLEN(bp) + ecb->espivlen;
  358. /* Make space to fit ip header */
  359. bp = padblock(bp, vers.hdrlen + ecb->espivlen);
  360. getpktspiaddrs(bp->rp, &vers);
  361. align = 4;
  362. if(ecb->espblklen > align)
  363. align = ecb->espblklen;
  364. if(align % ecb->ahblklen != 0)
  365. panic("espkick: ahblklen is important after all");
  366. pad = (align - 1) - (payload + Esptaillen - 1) % align;
  367. /*
  368. * Make space for tail
  369. * this is done by calling padblock with a negative size
  370. * Padblock does not change bp->wp!
  371. */
  372. bp = padblock(bp, -(pad + Esptaillen + ecb->ahlen));
  373. bp->wp += pad + Esptaillen + ecb->ahlen;
  374. et = (Esptail *)(bp->rp + vers.hdrlen + payload + pad);
  375. /* fill in tail */
  376. et->pad = pad;
  377. et->nexthdr = nexthdr;
  378. /* encrypt the payload */
  379. ecb->cipher(ecb, bp->rp + vers.hdrlen, payload + pad + Esptaillen);
  380. auth = bp->rp + vers.hdrlen + payload + pad + Esptaillen;
  381. /* fill in head; construct a new IP header and an ESP header */
  382. if(vers.version == V4){
  383. eh4 = (Esp4hdr *)bp->rp;
  384. eh4->vihl = IP_VER4;
  385. v6tov4(eh4->espsrc, c->laddr);
  386. v6tov4(eh4->espdst, c->raddr);
  387. eh4->espproto = IP_ESPPROTO;
  388. eh4->frag[0] = 0;
  389. eh4->frag[1] = 0;
  390. hnputl(eh4->espspi, ecb->spi);
  391. hnputl(eh4->espseq, ++ecb->seq);
  392. } else {
  393. eh6 = (Esp6hdr *)bp->rp;
  394. eh6->vcf[0] = IP_VER6;
  395. ipmove(eh6->src, c->laddr);
  396. ipmove(eh6->dst, c->raddr);
  397. eh6->proto = IP_ESPPROTO;
  398. hnputl(eh6->espspi, ecb->spi);
  399. hnputl(eh6->espseq, ++ecb->seq);
  400. }
  401. /* compute secure hash */
  402. ecb->auth(ecb, bp->rp + vers.iphdrlen, (vers.hdrlen - vers.iphdrlen) + payload + pad + Esptaillen, auth);
  403. qunlock(&c->ql);
  404. /* print("esp: pass down: %lu\n", BLEN(bp)); */
  405. if(vers.version == V4)
  406. ipoput4(c->p->f, bp, 0, c->ttl, c->tos, c);
  407. else
  408. ipoput6(c->p->f, bp, 0, c->ttl, c->tos, c);
  409. }
  410. /*
  411. * decapsulate IP packet from IP/ESP packet in bp and
  412. * pass the result up the spi's Conv's read queue.
  413. */
  414. void
  415. espiput(Proto *esp, Ipifc *ipifc, Block *bp)
  416. {
  417. Proc *up = externup();
  418. int payload, nexthdr;
  419. u8 *auth, *espspi;
  420. Conv *c;
  421. Espcb *ecb;
  422. Esptail *et;
  423. Fs *f;
  424. Userhdr *uh;
  425. Versdep vers;
  426. f = esp->f;
  427. getverslens(pktipvers(f, &bp), &vers);
  428. bp = pullupblock(bp, vers.hdrlen + Esptaillen);
  429. if(bp == nil){
  430. netlog(f, Logesp, "esp: short packet\n");
  431. return;
  432. }
  433. getpktspiaddrs(bp->rp, &vers);
  434. qlock(esp);
  435. /* Look for a conversation structure for this port */
  436. c = convlookup(esp, vers.spi);
  437. if(c == nil){
  438. qunlock(esp);
  439. netlog(f, Logesp, "esp: no conv %I -> %I!%lu\n", vers.raddr,
  440. vers.laddr, vers.spi);
  441. icmpnoconv(f, bp);
  442. freeblist(bp);
  443. return;
  444. }
  445. qlock(&c->ql);
  446. qunlock(esp);
  447. ecb = c->ptcl;
  448. /* too hard to do decryption/authentication on block lists */
  449. if(bp->next)
  450. bp = concatblock(bp);
  451. if(BLEN(bp) < vers.hdrlen + ecb->espivlen + Esptaillen + ecb->ahlen){
  452. qunlock(&c->ql);
  453. netlog(f, Logesp, "esp: short block %I -> %I!%lu\n", vers.raddr,
  454. vers.laddr, vers.spi);
  455. freeb(bp);
  456. return;
  457. }
  458. auth = bp->wp - ecb->ahlen;
  459. espspi = vers.version == V4 ? ((Esp4hdr *)bp->rp)->espspi : ((Esp6hdr *)bp->rp)->espspi;
  460. /* compute secure hash and authenticate */
  461. if(!ecb->auth(ecb, espspi, auth - espspi, auth)){
  462. qunlock(&c->ql);
  463. print("esp: bad auth %I -> %I!%ld\n", vers.raddr, vers.laddr, vers.spi);
  464. netlog(f, Logesp, "esp: bad auth %I -> %I!%lu\n", vers.raddr,
  465. vers.laddr, vers.spi);
  466. freeb(bp);
  467. return;
  468. }
  469. payload = BLEN(bp) - vers.hdrlen - ecb->ahlen;
  470. if(payload <= 0 || payload % 4 != 0 || payload % ecb->espblklen != 0){
  471. qunlock(&c->ql);
  472. netlog(f, Logesp, "esp: bad length %I -> %I!%lu payload=%d BLEN=%lu\n",
  473. vers.raddr, vers.laddr, vers.spi, payload, BLEN(bp));
  474. freeb(bp);
  475. return;
  476. }
  477. /* decrypt payload */
  478. if(!ecb->cipher(ecb, bp->rp + vers.hdrlen, payload)){
  479. qunlock(&c->ql);
  480. print("esp: cipher failed %I -> %I!%ld: %s\n", vers.raddr, vers.laddr, vers.spi, up->errstr);
  481. netlog(f, Logesp, "esp: cipher failed %I -> %I!%lu: %s\n",
  482. vers.raddr, vers.laddr, vers.spi, up->errstr);
  483. freeb(bp);
  484. return;
  485. }
  486. payload -= Esptaillen;
  487. et = (Esptail *)(bp->rp + vers.hdrlen + payload);
  488. payload -= et->pad + ecb->espivlen;
  489. nexthdr = et->nexthdr;
  490. if(payload <= 0){
  491. qunlock(&c->ql);
  492. netlog(f, Logesp, "esp: short packet after decrypt %I -> %I!%lu\n",
  493. vers.raddr, vers.laddr, vers.spi);
  494. freeb(bp);
  495. return;
  496. }
  497. /* trim packet */
  498. bp->rp += vers.hdrlen + ecb->espivlen; /* toss original IP & ESP hdrs */
  499. bp->wp = bp->rp + payload;
  500. if(ecb->header){
  501. /* assume Userhdrlen < Esp4hdrlen < Esp6hdrlen */
  502. bp->rp -= Userhdrlen;
  503. uh = (Userhdr *)bp->rp;
  504. memset(uh, 0, Userhdrlen);
  505. uh->nexthdr = nexthdr;
  506. }
  507. /* ingress filtering here? */
  508. if(qfull(c->rq)){
  509. netlog(f, Logesp, "esp: qfull %I -> %I.%lu\n", vers.raddr,
  510. vers.laddr, vers.spi);
  511. freeblist(bp);
  512. } else {
  513. // print("esp: pass up: %lu\n", BLEN(bp));
  514. qpass(c->rq, bp); /* pass packet up the read queue */
  515. }
  516. qunlock(&c->ql);
  517. }
  518. char *
  519. espctl(Conv *c, char **f, int n)
  520. {
  521. Espcb *ecb = c->ptcl;
  522. char *e = nil;
  523. if(strcmp(f[0], "esp") == 0)
  524. e = setalg(ecb, f, n, espalg);
  525. else if(strcmp(f[0], "ah") == 0)
  526. e = setalg(ecb, f, n, ahalg);
  527. else if(strcmp(f[0], "header") == 0)
  528. ecb->header = 1;
  529. else if(strcmp(f[0], "noheader") == 0)
  530. ecb->header = 0;
  531. else
  532. e = "unknown control request";
  533. return e;
  534. }
  535. /* called from icmp(v6) for unreachable hosts, time exceeded, etc. */
  536. void
  537. espadvise(Proto *esp, Block *bp, char *msg)
  538. {
  539. Conv *c;
  540. Versdep vers;
  541. getverslens(pktipvers(esp->f, &bp), &vers);
  542. getpktspiaddrs(bp->rp, &vers);
  543. qlock(esp);
  544. c = convlookup(esp, vers.spi);
  545. if(c != nil){
  546. qhangup(c->rq, msg);
  547. qhangup(c->wq, msg);
  548. }
  549. qunlock(esp);
  550. freeblist(bp);
  551. }
  552. int
  553. espstats(Proto *esp, char *buf, int len)
  554. {
  555. Esppriv *upriv;
  556. upriv = esp->priv;
  557. return snprint(buf, len, "%llu %lu\n",
  558. upriv->in,
  559. upriv->inerrors);
  560. }
  561. static int
  562. esplocal(Conv *c, char *buf, int len)
  563. {
  564. Espcb *ecb = c->ptcl;
  565. int n;
  566. qlock(&c->ql);
  567. if(ecb->incoming)
  568. n = snprint(buf, len, "%I!%lu\n", c->laddr, ecb->spi);
  569. else
  570. n = snprint(buf, len, "%I\n", c->laddr);
  571. qunlock(&c->ql);
  572. return n;
  573. }
  574. static int
  575. espremote(Conv *c, char *buf, int len)
  576. {
  577. Espcb *ecb = c->ptcl;
  578. int n;
  579. qlock(&c->ql);
  580. if(ecb->incoming)
  581. n = snprint(buf, len, "%I\n", c->raddr);
  582. else
  583. n = snprint(buf, len, "%I!%lu\n", c->raddr, ecb->spi);
  584. qunlock(&c->ql);
  585. return n;
  586. }
  587. static Conv *
  588. convlookup(Proto *esp, u32 spi)
  589. {
  590. Conv *c, **p;
  591. Espcb *ecb;
  592. for(p = esp->conv; *p; p++){
  593. c = *p;
  594. ecb = c->ptcl;
  595. if(ecb->incoming && ecb->spi == spi)
  596. return c;
  597. }
  598. return nil;
  599. }
  600. static char *
  601. setalg(Espcb *ecb, char **f, int n, Algorithm *alg)
  602. {
  603. u8 *key;
  604. int c, nbyte, nchar;
  605. u32 i;
  606. if(n < 2 || n > 3)
  607. return "bad format";
  608. for(; alg->name; alg++)
  609. if(strcmp(f[1], alg->name) == 0)
  610. break;
  611. if(alg->name == nil)
  612. return "unknown algorithm";
  613. nbyte = (alg->keylen + 7) >> 3;
  614. if(n == 2)
  615. nchar = 0;
  616. else
  617. nchar = strlen(f[2]);
  618. if(nchar != 2 * nbyte) /* TODO: maybe < is ok */
  619. return "key not required length";
  620. /* convert hex digits from ascii, in place */
  621. for(i = 0; i < nchar; i++){
  622. c = f[2][i];
  623. if(c >= '0' && c <= '9')
  624. f[2][i] -= '0';
  625. else if(c >= 'a' && c <= 'f')
  626. f[2][i] -= 'a' - 10;
  627. else if(c >= 'A' && c <= 'F')
  628. f[2][i] -= 'A' - 10;
  629. else
  630. return "non-hex character in key";
  631. }
  632. /* collapse hex digits into complete bytes in reverse order in key */
  633. key = smalloc(nbyte);
  634. for(i = 0; i < nchar && i / 2 < nbyte; i++){
  635. c = f[2][nchar - i - 1];
  636. if(i & 1)
  637. c <<= 4;
  638. key[i / 2] |= c;
  639. }
  640. alg->init(ecb, alg->name, key, alg->keylen);
  641. free(key);
  642. return nil;
  643. }
  644. /*
  645. * null encryption
  646. */
  647. static int
  648. nullcipher(Espcb *espcb, u8 *c, int i)
  649. {
  650. return 1;
  651. }
  652. static void
  653. nullespinit(Espcb *ecb, char *name, u8 *c, unsigned keylen)
  654. {
  655. ecb->espalg = name;
  656. ecb->espblklen = 1;
  657. ecb->espivlen = 0;
  658. ecb->cipher = nullcipher;
  659. }
  660. static int
  661. nullauth(Espcb *espcb, u8 *c, int i, u8 *d)
  662. {
  663. return 1;
  664. }
  665. static void
  666. nullahinit(Espcb *ecb, char *name, u8 *c, unsigned keylen)
  667. {
  668. ecb->ahalg = name;
  669. ecb->ahblklen = 1;
  670. ecb->ahlen = 0;
  671. ecb->auth = nullauth;
  672. }
  673. /*
  674. * sha1
  675. */
  676. static void
  677. seanq_hmac_sha1(u8 hash[SHA1dlen], u8 *t, i32 tlen, u8 *key,
  678. i32 klen)
  679. {
  680. int i;
  681. u8 ipad[Hmacblksz + 1], opad[Hmacblksz + 1], innerhash[SHA1dlen];
  682. DigestState *digest;
  683. memset(ipad, 0x36, Hmacblksz);
  684. memset(opad, 0x5c, Hmacblksz);
  685. ipad[Hmacblksz] = opad[Hmacblksz] = 0;
  686. for(i = 0; i < klen; i++){
  687. ipad[i] ^= key[i];
  688. opad[i] ^= key[i];
  689. }
  690. digest = sha1(ipad, Hmacblksz, nil, nil);
  691. sha1(t, tlen, innerhash, digest);
  692. digest = sha1(opad, Hmacblksz, nil, nil);
  693. sha1(innerhash, SHA1dlen, hash, digest);
  694. }
  695. static int
  696. shaauth(Espcb *ecb, u8 *t, int tlen, u8 *auth)
  697. {
  698. int r;
  699. u8 hash[SHA1dlen];
  700. memset(hash, 0, SHA1dlen);
  701. seanq_hmac_sha1(hash, t, tlen, (u8 *)ecb->ahstate, BITS2BYTES(128));
  702. r = memcmp(auth, hash, ecb->ahlen) == 0;
  703. memmove(auth, hash, ecb->ahlen);
  704. return r;
  705. }
  706. static void
  707. shaahinit(Espcb *ecb, char *name, u8 *key, unsigned klen)
  708. {
  709. if(klen != 128)
  710. panic("shaahinit: bad keylen");
  711. klen /= BI2BY;
  712. ecb->ahalg = name;
  713. ecb->ahblklen = 1;
  714. ecb->ahlen = BITS2BYTES(96);
  715. ecb->auth = shaauth;
  716. ecb->ahstate = smalloc(klen);
  717. memmove(ecb->ahstate, key, klen);
  718. }
  719. /*
  720. * aes
  721. */
  722. /* ah_aes_xcbc_mac_96, rfc3566 */
  723. static int
  724. aesahauth(Espcb *ecb, u8 *t, int tlen, u8 *auth)
  725. {
  726. int r;
  727. u8 hash[AESdlen];
  728. memset(hash, 0, AESdlen);
  729. ecb->ds = hmac_aes(t, tlen, (u8 *)ecb->ahstate, BITS2BYTES(96), hash,
  730. ecb->ds);
  731. r = memcmp(auth, hash, ecb->ahlen) == 0;
  732. memmove(auth, hash, ecb->ahlen);
  733. return r;
  734. }
  735. static void
  736. aesahinit(Espcb *ecb, char *name, u8 *key, unsigned klen)
  737. {
  738. if(klen != 128)
  739. panic("aesahinit: keylen not 128");
  740. klen /= BI2BY;
  741. ecb->ahalg = name;
  742. ecb->ahblklen = 1;
  743. ecb->ahlen = BITS2BYTES(96);
  744. ecb->auth = aesahauth;
  745. ecb->ahstate = smalloc(klen);
  746. memmove(ecb->ahstate, key, klen);
  747. }
  748. static int
  749. aescbccipher(Espcb *ecb, u8 *p, int n) /* 128-bit blocks */
  750. {
  751. u8 tmp[AESbsize], q[AESbsize];
  752. u8 *pp, *tp, *ip, *eip, *ep;
  753. AESstate *ds = ecb->espstate;
  754. ep = p + n;
  755. if(ecb->incoming){
  756. memmove(ds->ivec, p, AESbsize);
  757. p += AESbsize;
  758. while(p < ep){
  759. memmove(tmp, p, AESbsize);
  760. aes_decrypt(ds->dkey, ds->rounds, p, q);
  761. memmove(p, q, AESbsize);
  762. tp = tmp;
  763. ip = ds->ivec;
  764. for(eip = ip + AESbsize; ip < eip;){
  765. *p++ ^= *ip;
  766. *ip++ = *tp++;
  767. }
  768. }
  769. } else {
  770. memmove(p, ds->ivec, AESbsize);
  771. for(p += AESbsize; p < ep; p += AESbsize){
  772. pp = p;
  773. ip = ds->ivec;
  774. for(eip = ip + AESbsize; ip < eip;)
  775. *pp++ ^= *ip++;
  776. aes_encrypt(ds->ekey, ds->rounds, p, q);
  777. memmove(ds->ivec, q, AESbsize);
  778. memmove(p, q, AESbsize);
  779. }
  780. }
  781. return 1;
  782. }
  783. static void
  784. aescbcespinit(Espcb *ecb, char *name, u8 *k, unsigned n)
  785. {
  786. u8 key[Aeskeysz], ivec[Aeskeysz];
  787. int i;
  788. n = BITS2BYTES(n);
  789. if(n > Aeskeysz)
  790. n = Aeskeysz;
  791. memset(key, 0, sizeof(key));
  792. memmove(key, k, n);
  793. for(i = 0; i < Aeskeysz; i++)
  794. ivec[i] = nrand(256);
  795. ecb->espalg = name;
  796. ecb->espblklen = Aesblk;
  797. ecb->espivlen = Aesblk;
  798. ecb->cipher = aescbccipher;
  799. ecb->espstate = smalloc(sizeof(AESstate));
  800. setupAESstate(ecb->espstate, key, n /* keybytes */, ivec);
  801. }
  802. static int
  803. aesctrcipher(Espcb *ecb, u8 *p, int n) /* 128-bit blocks */
  804. {
  805. u8 tmp[AESbsize], q[AESbsize];
  806. u8 *pp, *tp, *ip, *eip, *ep;
  807. AESstate *ds = ecb->espstate;
  808. ep = p + n;
  809. if(ecb->incoming){
  810. memmove(ds->ivec, p, AESbsize);
  811. p += AESbsize;
  812. while(p < ep){
  813. memmove(tmp, p, AESbsize);
  814. aes_decrypt(ds->dkey, ds->rounds, p, q);
  815. memmove(p, q, AESbsize);
  816. tp = tmp;
  817. ip = ds->ivec;
  818. for(eip = ip + AESbsize; ip < eip;){
  819. *p++ ^= *ip;
  820. *ip++ = *tp++;
  821. }
  822. }
  823. } else {
  824. memmove(p, ds->ivec, AESbsize);
  825. for(p += AESbsize; p < ep; p += AESbsize){
  826. pp = p;
  827. ip = ds->ivec;
  828. for(eip = ip + AESbsize; ip < eip;)
  829. *pp++ ^= *ip++;
  830. aes_encrypt(ds->ekey, ds->rounds, p, q);
  831. memmove(ds->ivec, q, AESbsize);
  832. memmove(p, q, AESbsize);
  833. }
  834. }
  835. return 1;
  836. }
  837. static void
  838. aesctrespinit(Espcb *ecb, char *name, u8 *k, unsigned n)
  839. {
  840. u8 key[Aesblk], ivec[Aesblk];
  841. int i;
  842. n = BITS2BYTES(n);
  843. if(n > Aeskeysz)
  844. n = Aeskeysz;
  845. memset(key, 0, sizeof(key));
  846. memmove(key, k, n);
  847. for(i = 0; i < Aesblk; i++)
  848. ivec[i] = nrand(256);
  849. ecb->espalg = name;
  850. ecb->espblklen = Aesblk;
  851. ecb->espivlen = Aesblk;
  852. ecb->cipher = aesctrcipher;
  853. ecb->espstate = smalloc(sizeof(AESstate));
  854. setupAESstate(ecb->espstate, key, n /* keybytes */, ivec);
  855. }
  856. /*
  857. * md5
  858. */
  859. static void
  860. seanq_hmac_md5(u8 hash[MD5dlen], u8 *t, i32 tlen, u8 *key,
  861. i32 klen)
  862. {
  863. int i;
  864. u8 ipad[Hmacblksz + 1], opad[Hmacblksz + 1], innerhash[MD5dlen];
  865. DigestState *digest;
  866. memset(ipad, 0x36, Hmacblksz);
  867. memset(opad, 0x5c, Hmacblksz);
  868. ipad[Hmacblksz] = opad[Hmacblksz] = 0;
  869. for(i = 0; i < klen; i++){
  870. ipad[i] ^= key[i];
  871. opad[i] ^= key[i];
  872. }
  873. digest = md5(ipad, Hmacblksz, nil, nil);
  874. md5(t, tlen, innerhash, digest);
  875. digest = md5(opad, Hmacblksz, nil, nil);
  876. md5(innerhash, MD5dlen, hash, digest);
  877. }
  878. static int
  879. md5auth(Espcb *ecb, u8 *t, int tlen, u8 *auth)
  880. {
  881. u8 hash[MD5dlen];
  882. int r;
  883. memset(hash, 0, MD5dlen);
  884. seanq_hmac_md5(hash, t, tlen, (u8 *)ecb->ahstate, BITS2BYTES(128));
  885. r = memcmp(auth, hash, ecb->ahlen) == 0;
  886. memmove(auth, hash, ecb->ahlen);
  887. return r;
  888. }
  889. static void
  890. md5ahinit(Espcb *ecb, char *name, u8 *key, unsigned klen)
  891. {
  892. if(klen != 128)
  893. panic("md5ahinit: bad keylen");
  894. klen = BITS2BYTES(klen);
  895. ecb->ahalg = name;
  896. ecb->ahblklen = 1;
  897. ecb->ahlen = BITS2BYTES(96);
  898. ecb->auth = md5auth;
  899. ecb->ahstate = smalloc(klen);
  900. memmove(ecb->ahstate, key, klen);
  901. }
  902. /*
  903. * des, single and triple
  904. */
  905. static int
  906. descipher(Espcb *ecb, u8 *p, int n)
  907. {
  908. DESstate *ds = ecb->espstate;
  909. if(ecb->incoming){
  910. memmove(ds->ivec, p, Desblk);
  911. desCBCdecrypt(p + Desblk, n - Desblk, ds);
  912. } else {
  913. memmove(p, ds->ivec, Desblk);
  914. desCBCencrypt(p + Desblk, n - Desblk, ds);
  915. }
  916. return 1;
  917. }
  918. static int
  919. des3cipher(Espcb *ecb, u8 *p, int n)
  920. {
  921. DES3state *ds = ecb->espstate;
  922. if(ecb->incoming){
  923. memmove(ds->ivec, p, Desblk);
  924. des3CBCdecrypt(p + Desblk, n - Desblk, ds);
  925. } else {
  926. memmove(p, ds->ivec, Desblk);
  927. des3CBCencrypt(p + Desblk, n - Desblk, ds);
  928. }
  929. return 1;
  930. }
  931. static void
  932. desespinit(Espcb *ecb, char *name, u8 *k, unsigned n)
  933. {
  934. u8 key[Desblk], ivec[Desblk];
  935. int i;
  936. n = BITS2BYTES(n);
  937. if(n > Desblk)
  938. n = Desblk;
  939. memset(key, 0, sizeof(key));
  940. memmove(key, k, n);
  941. for(i = 0; i < Desblk; i++)
  942. ivec[i] = nrand(256);
  943. ecb->espalg = name;
  944. ecb->espblklen = Desblk;
  945. ecb->espivlen = Desblk;
  946. ecb->cipher = descipher;
  947. ecb->espstate = smalloc(sizeof(DESstate));
  948. setupDESstate(ecb->espstate, key, ivec);
  949. }
  950. static void
  951. des3espinit(Espcb *ecb, char *name, u8 *k, unsigned n)
  952. {
  953. u8 key[3][Desblk], ivec[Desblk];
  954. int i;
  955. n = BITS2BYTES(n);
  956. if(n > Des3keysz)
  957. n = Des3keysz;
  958. memset(key, 0, sizeof(key));
  959. memmove(key, k, n);
  960. for(i = 0; i < Desblk; i++)
  961. ivec[i] = nrand(256);
  962. ecb->espalg = name;
  963. ecb->espblklen = Desblk;
  964. ecb->espivlen = Desblk;
  965. ecb->cipher = des3cipher;
  966. ecb->espstate = smalloc(sizeof(DES3state));
  967. setupDES3state(ecb->espstate, key, ivec);
  968. }
  969. /*
  970. * interfacing to devip
  971. */
  972. void
  973. espinit(Fs *fs)
  974. {
  975. Proto *esp;
  976. esp = smalloc(sizeof(Proto));
  977. esp->priv = smalloc(sizeof(Esppriv));
  978. esp->name = "esp";
  979. esp->connect = espconnect;
  980. esp->announce = nil;
  981. esp->ctl = espctl;
  982. esp->state = espstate;
  983. esp->create = espcreate;
  984. esp->close = espclose;
  985. esp->rcv = espiput;
  986. esp->advise = espadvise;
  987. esp->stats = espstats;
  988. esp->local = esplocal;
  989. esp->remote = espremote;
  990. esp->ipproto = IP_ESPPROTO;
  991. esp->nc = Nchans;
  992. esp->ptclsize = sizeof(Espcb);
  993. Fsproto(fs, esp);
  994. }