esp.c 24 KB

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