esp.c 23 KB

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