dh.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <mp.h>
  4. #include <libsec.h>
  5. #include <fcall.h>
  6. #include <thread.h>
  7. #include <9p.h>
  8. #include <auth.h>
  9. #include <ip.h>
  10. #include <pool.h>
  11. #include "netssh.h"
  12. #undef VERIFYKEYS /* TODO until it's fixed */
  13. enum {
  14. Errnokey = -2, /* no key on keyring */
  15. Errnoverify, /* factotum found a key, but verification failed */
  16. Errfactotum, /* factotum failure (e.g., no key) */
  17. Errnone, /* key verified */
  18. };
  19. static int dh_server(Conn *, Packet *, mpint *, int);
  20. static void genkeys(Conn *, uchar [], mpint *);
  21. /*
  22. * Second Oakley Group from RFC 2409
  23. */
  24. static char *group1p =
  25. "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
  26. "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
  27. "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
  28. "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
  29. "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381"
  30. "FFFFFFFFFFFFFFFF";
  31. /*
  32. * 2048-bit MODP group (id 14) from RFC 3526
  33. */
  34. static char *group14p =
  35. "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
  36. "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
  37. "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
  38. "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
  39. "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
  40. "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
  41. "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
  42. "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
  43. "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
  44. "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
  45. "15728E5A8AACAA68FFFFFFFFFFFFFFFF";
  46. mpint *two, *p1, *p14;
  47. int nokeyverify;
  48. static DSApriv mydsskey;
  49. static RSApriv myrsakey;
  50. void
  51. dh_init(PKA *pkas[])
  52. {
  53. char *buf, *p, *st, *end;
  54. int fd, n, k;
  55. if(debug > 1)
  56. sshdebug(nil, "dh_init");
  57. k = 0;
  58. pkas[k] = nil;
  59. fmtinstall('M', mpfmt);
  60. two = strtomp("2", nil, 10, nil);
  61. p1 = strtomp(group1p, nil, 16, nil);
  62. p14 = strtomp(group14p, nil, 16, nil);
  63. /*
  64. * this really should be done through factotum
  65. */
  66. p = getenv("rsakey");
  67. if (p != nil) {
  68. remove("/env/rsakey");
  69. st = buf = p;
  70. end = buf + strlen(p);
  71. } else {
  72. /*
  73. * it would be better to use bio and rdline here instead of
  74. * reading all of factotum's contents into memory at once.
  75. */
  76. buf = emalloc9p(Maxfactotum);
  77. fd = open("rsakey", OREAD);
  78. if (fd < 0 && (fd = open("/mnt/factotum/ctl", OREAD)) < 0)
  79. goto norsa;
  80. n = readn(fd, buf, Maxfactotum - 1);
  81. buf[n >= 0? n: 0] = 0;
  82. close(fd);
  83. assert(n < Maxfactotum - 1);
  84. st = strstr(buf, "proto=rsa");
  85. if (st == nil) {
  86. sshlog(nil, "no proto=rsa key in factotum");
  87. goto norsa;
  88. }
  89. end = st;
  90. for (; st > buf && *st != '\n'; --st)
  91. ;
  92. for (; end < buf + Maxfactotum && *end != '\n'; ++end)
  93. ;
  94. }
  95. p = strstr(st, " n=");
  96. if (p == nil || p > end) {
  97. sshlog(nil, "no key (n) found");
  98. free(buf);
  99. return;
  100. }
  101. myrsakey.pub.n = strtomp(p+3, nil, 16, nil);
  102. if (debug > 1)
  103. sshdebug(nil, "n=%M", myrsakey.pub.n);
  104. p = strstr(st, " ek=");
  105. if (p == nil || p > end) {
  106. sshlog(nil, "no key (ek) found");
  107. free(buf);
  108. return;
  109. }
  110. pkas[k++] = &rsa_pka;
  111. pkas[k] = nil;
  112. myrsakey.pub.ek = strtomp(p+4, nil, 16, nil);
  113. if (debug > 1)
  114. sshdebug(nil, "ek=%M", myrsakey.pub.ek);
  115. p = strstr(st, " !dk=");
  116. if (p == nil) {
  117. p = strstr(st, "!dk?");
  118. if (p == nil || p > end) {
  119. // sshlog(nil, "no key (dk) found");
  120. free(buf);
  121. return;
  122. }
  123. goto norsa;
  124. }
  125. myrsakey.dk = strtomp(p+5, nil, 16, nil);
  126. if (debug > 1)
  127. sshdebug(nil, "dk=%M", myrsakey.dk);
  128. norsa:
  129. free(buf);
  130. p = getenv("dsskey");
  131. if (p != nil) {
  132. remove("/env/dsskey");
  133. buf = p;
  134. end = buf + strlen(p);
  135. } else {
  136. /*
  137. * it would be better to use bio and rdline here instead of
  138. * reading all of factotum's contents into memory at once.
  139. */
  140. buf = emalloc9p(Maxfactotum);
  141. fd = open("dsskey", OREAD);
  142. if (fd < 0 && (fd = open("/mnt/factotum/ctl", OREAD)) < 0)
  143. return;
  144. n = readn(fd, buf, Maxfactotum - 1);
  145. buf[n >= 0? n: 0] = 0;
  146. close(fd);
  147. assert(n < Maxfactotum - 1);
  148. st = strstr(buf, "proto=dsa");
  149. if (st == nil) {
  150. sshlog(nil, "no proto=dsa key in factotum");
  151. free(buf);
  152. return;
  153. }
  154. end = st;
  155. for (; st > buf && *st != '\n'; --st)
  156. ;
  157. for (; end < buf + Maxfactotum && *end != '\n'; ++end)
  158. ;
  159. }
  160. p = strstr(buf, " p=");
  161. if (p == nil || p > end) {
  162. sshlog(nil, "no key (p) found");
  163. free(buf);
  164. return;
  165. }
  166. mydsskey.pub.p = strtomp(p+3, nil, 16, nil);
  167. p = strstr(buf, " q=");
  168. if (p == nil || p > end) {
  169. sshlog(nil, "no key (q) found");
  170. free(buf);
  171. return;
  172. }
  173. mydsskey.pub.q = strtomp(p+3, nil, 16, nil);
  174. p = strstr(buf, " alpha=");
  175. if (p == nil || p > end) {
  176. sshlog(nil, "no key (g) found");
  177. free(buf);
  178. return;
  179. }
  180. mydsskey.pub.alpha = strtomp(p+7, nil, 16, nil);
  181. p = strstr(buf, " key=");
  182. if (p == nil || p > end) {
  183. sshlog(nil, "no key (y) found");
  184. free(buf);
  185. return;
  186. }
  187. mydsskey.pub.key = strtomp(p+5, nil, 16, nil);
  188. pkas[k++] = &dss_pka;
  189. pkas[k] = nil;
  190. p = strstr(buf, " !secret=");
  191. if (p == nil) {
  192. p = strstr(buf, "!secret?");
  193. if (p == nil || p > end)
  194. sshlog(nil, "no key (x) found");
  195. free(buf);
  196. return;
  197. }
  198. mydsskey.secret = strtomp(p+9, nil, 16, nil);
  199. free(buf);
  200. }
  201. static Packet *
  202. rsa_ks(Conn *c)
  203. {
  204. Packet *ks;
  205. if (myrsakey.pub.ek == nil || myrsakey.pub.n == nil) {
  206. sshlog(c, "no public RSA key info");
  207. return nil;
  208. }
  209. ks = new_packet(c);
  210. add_string(ks, "ssh-rsa");
  211. add_mp(ks, myrsakey.pub.ek);
  212. add_mp(ks, myrsakey.pub.n);
  213. return ks;
  214. }
  215. static void
  216. esma_encode(uchar *h, uchar *em, int nb)
  217. {
  218. int n, i;
  219. uchar hh[SHA1dlen];
  220. static uchar sha1der[] = {
  221. 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,
  222. 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14,
  223. };
  224. sha1(h, SHA1dlen, hh, nil);
  225. n = nb - (nelem(sha1der) + SHA1dlen) - 3;
  226. i = 0;
  227. em[i++] = 0;
  228. em[i++] = 1;
  229. memset(em + i, 0xff, n);
  230. i += n;
  231. em[i++] = 0;
  232. memmove(em + i, sha1der, sizeof sha1der);
  233. i += sizeof sha1der;
  234. memmove(em + i, hh, SHA1dlen);
  235. }
  236. static Packet *
  237. rsa_sign(Conn *c, uchar *m, int nm)
  238. {
  239. AuthRpc *ar;
  240. Packet *sig;
  241. mpint *s, *mm;
  242. int fd, n, nbit;
  243. uchar hh[SHA1dlen];
  244. uchar *sstr, *em;
  245. if (myrsakey.dk) {
  246. nbit = mpsignif (myrsakey.pub.n);
  247. n = (nbit + 7) / 8;
  248. sstr = emalloc9p(n);
  249. em = emalloc9p(n);
  250. /* Compute s: RFC 3447 */
  251. esma_encode(m, em, n);
  252. mm = betomp(em, n, nil);
  253. s = mpnew(nbit);
  254. mpexp(mm, myrsakey.dk, myrsakey.pub.n, s);
  255. mptobe(s, sstr, n, nil);
  256. mpfree(mm);
  257. mpfree(s);
  258. free(em);
  259. } else {
  260. fd = open("/mnt/factotum/rpc", ORDWR);
  261. if (fd < 0)
  262. return nil;
  263. sha1(m, nm, hh, nil);
  264. ar = auth_allocrpc(fd);
  265. if (ar == nil ||
  266. auth_rpc(ar, "start", "role=sign proto=rsa", 19) != ARok ||
  267. auth_rpc(ar, "write", hh, SHA1dlen) != ARok ||
  268. auth_rpc(ar, "read", nil, 0) != ARok ||
  269. ar->arg == nil) {
  270. sshdebug(c, "got error in factotum: %r");
  271. auth_freerpc(ar);
  272. close(fd);
  273. return nil;
  274. }
  275. sstr = emalloc9p(ar->narg);
  276. memmove(sstr, ar->arg, ar->narg);
  277. n = ar->narg;
  278. auth_freerpc(ar);
  279. close(fd);
  280. }
  281. sig = new_packet(c);
  282. add_string(sig, pkas[c->pkalg]->name);
  283. add_block(sig, sstr, n);
  284. free(sstr);
  285. return sig;
  286. }
  287. /*
  288. * 0 - If factotum failed, e.g. no key
  289. * 1 - If key is verified
  290. * -1 - If factotum found a key, but the verification fails
  291. */
  292. static int
  293. rsa_verify(Conn *c, uchar *m, int nm, char *user, char *sig, int)
  294. {
  295. int fd, n, retval, nbit;
  296. char *buf, *p, *sigblob;
  297. uchar *sstr, *em;
  298. uchar hh[SHA1dlen];
  299. mpint *s, *mm, *rsa_exponent, *host_modulus;
  300. AuthRpc *ar;
  301. sshdebug(c, "in rsa_verify for connection: %d", c->id);
  302. SET(rsa_exponent, host_modulus);
  303. USED(rsa_exponent, host_modulus);
  304. if (0 && rsa_exponent) {
  305. nbit = mpsignif(host_modulus);
  306. n = (nbit + 7) / 8;
  307. em = emalloc9p(n);
  308. /* Compute s: RFC 3447 */
  309. esma_encode(m, em, n);
  310. mm = betomp(em, n, nil);
  311. s = mpnew(1024);
  312. mpexp(mm, rsa_exponent, host_modulus, s);
  313. sstr = emalloc9p(n);
  314. mptobe(s, sstr, n, nil);
  315. free(em);
  316. mpfree(mm);
  317. mpfree(s);
  318. retval = memcmp(sig, sstr, n);
  319. free(sstr);
  320. retval = (retval == 0);
  321. } else {
  322. retval = 1;
  323. fd = open("/mnt/factotum/rpc", ORDWR);
  324. if (fd < 0) {
  325. sshdebug(c, "could not open factotum RPC: %r");
  326. return 0;
  327. }
  328. buf = emalloc9p(Blobsz / 2);
  329. sigblob = emalloc9p(Blobsz);
  330. p = (char *)get_string(nil, (uchar *)sig, buf, Blobsz / 2, nil);
  331. get_string(nil, (uchar *)p, sigblob, Blobsz, &n);
  332. sha1(m, nm, hh, nil);
  333. if (user != nil)
  334. p = smprint("role=verify proto=rsa user=%s", user);
  335. else
  336. p = smprint("role=verify proto=rsa sys=%s", c->remote);
  337. ar = auth_allocrpc(fd);
  338. if (ar == nil || auth_rpc(ar, "start", p, strlen(p)) != ARok ||
  339. auth_rpc(ar, "write", hh, SHA1dlen) != ARok ||
  340. auth_rpc(ar, "write", sigblob, n) != ARok ||
  341. auth_rpc(ar, "read", nil, 0) != ARok) {
  342. sshdebug(c, "got error in factotum: %r");
  343. retval = 0;
  344. } else {
  345. sshdebug(c, "factotum returned %s", ar->ibuf);
  346. if (strstr(ar->ibuf, "does not verify") != nil)
  347. retval = -1;
  348. }
  349. if (ar != nil)
  350. auth_freerpc(ar);
  351. free(p);
  352. close(fd);
  353. free(sigblob);
  354. free(buf);
  355. }
  356. return retval;
  357. }
  358. static Packet *
  359. dss_ks(Conn *c)
  360. {
  361. Packet *ks;
  362. if (mydsskey.pub.p == nil)
  363. return nil;
  364. ks = new_packet(c);
  365. add_string(ks, "ssh-dss");
  366. add_mp(ks, mydsskey.pub.p);
  367. add_mp(ks, mydsskey.pub.q);
  368. add_mp(ks, mydsskey.pub.alpha);
  369. add_mp(ks, mydsskey.pub.key);
  370. return ks;
  371. }
  372. static Packet *
  373. dss_sign(Conn *c, uchar *m, int nm)
  374. {
  375. AuthRpc *ar;
  376. DSAsig *s;
  377. Packet *sig;
  378. mpint *mm;
  379. int fd;
  380. uchar sstr[2*SHA1dlen];
  381. sha1(m, nm, sstr, nil);
  382. sig = new_packet(c);
  383. add_string(sig, pkas[c->pkalg]->name);
  384. if (mydsskey.secret) {
  385. mm = betomp(sstr, SHA1dlen, nil);
  386. s = dsasign(&mydsskey, mm);
  387. mptobe(s->r, sstr, SHA1dlen, nil);
  388. mptobe(s->s, sstr+SHA1dlen, SHA1dlen, nil);
  389. dsasigfree(s);
  390. mpfree(mm);
  391. } else {
  392. fd = open("/mnt/factotum/rpc", ORDWR);
  393. if (fd < 0)
  394. return nil;
  395. ar = auth_allocrpc(fd);
  396. if (ar == nil ||
  397. auth_rpc(ar, "start", "role=sign proto=dsa", 19) != ARok ||
  398. auth_rpc(ar, "write", sstr, SHA1dlen) != ARok ||
  399. auth_rpc(ar, "read", nil, 0) != ARok) {
  400. sshdebug(c, "got error in factotum: %r");
  401. auth_freerpc(ar);
  402. close(fd);
  403. return nil;
  404. }
  405. memmove(sstr, ar->arg, ar->narg);
  406. auth_freerpc(ar);
  407. close(fd);
  408. }
  409. add_block(sig, sstr, 2*SHA1dlen);
  410. return sig;
  411. }
  412. static int
  413. dss_verify(Conn *c, uchar *m, int nm, char *user, char *sig, int nsig)
  414. {
  415. sshdebug(c, "in dss_verify for connection: %d", c->id);
  416. USED(m, nm, user, sig, nsig);
  417. return 0;
  418. }
  419. static int
  420. dh_server1(Conn *c, Packet *pack1)
  421. {
  422. return dh_server(c, pack1, p1, 1024);
  423. }
  424. static int
  425. dh_server14(Conn *c, Packet *pack1)
  426. {
  427. return dh_server(c, pack1, p14, 2048);
  428. }
  429. static int
  430. dh_server(Conn *c, Packet *pack1, mpint *grp, int nbit)
  431. {
  432. Packet *pack2, *ks, *sig;
  433. mpint *y, *e, *f, *k;
  434. int n, ret;
  435. uchar h[SHA1dlen];
  436. ret = -1;
  437. qlock(&c->l);
  438. f = mpnew(nbit);
  439. k = mpnew(nbit);
  440. /* Compute f: RFC4253 */
  441. y = mprand(nbit / 8, genrandom, nil);
  442. if (debug > 1)
  443. sshdebug(c, "y=%M", y);
  444. mpexp(two, y, grp, f);
  445. if (debug > 1)
  446. sshdebug(c, "f=%M", f);
  447. /* Compute k: RFC4253 */
  448. if (debug > 1)
  449. dump_packet(pack1);
  450. e = get_mp(pack1->payload+1);
  451. if (debug > 1)
  452. sshdebug(c, "e=%M", e);
  453. mpexp(e, y, grp, k);
  454. if (debug > 1)
  455. sshdebug(c, "k=%M", k);
  456. /* Compute H: RFC 4253 */
  457. pack2 = new_packet(c);
  458. sshdebug(c, "ID strings: %s---%s", c->otherid, MYID);
  459. add_string(pack2, c->otherid);
  460. add_string(pack2, MYID);
  461. if (debug > 1) {
  462. fprint(2, "received kexinit:");
  463. dump_packet(c->rkexinit);
  464. fprint(2, "\nsent kexinit:");
  465. dump_packet(c->skexinit);
  466. }
  467. add_block(pack2, c->rkexinit->payload, c->rkexinit->rlength - 1);
  468. add_block(pack2, c->skexinit->payload,
  469. c->skexinit->rlength - c->skexinit->pad_len - 1);
  470. sig = nil;
  471. ks = pkas[c->pkalg]->ks(c);
  472. if (ks == nil)
  473. goto err;
  474. add_block(pack2, ks->payload, ks->rlength - 1);
  475. add_mp(pack2, e);
  476. add_mp(pack2, f);
  477. add_mp(pack2, k);
  478. sha1(pack2->payload, pack2->rlength - 1, h, nil);
  479. if (c->got_sessid == 0) {
  480. memmove(c->sessid, h, SHA1dlen);
  481. c->got_sessid = 1;
  482. }
  483. sig = pkas[c->pkalg]->sign(c, h, SHA1dlen);
  484. if (sig == nil) {
  485. sshlog(c, "failed to generate signature: %r");
  486. goto err;
  487. }
  488. /* Send (K_s || f || s) to client: RFC4253 */
  489. init_packet(pack2);
  490. pack2->c = c;
  491. add_byte(pack2, SSH_MSG_KEXDH_REPLY);
  492. add_block(pack2, ks->payload, ks->rlength - 1);
  493. add_mp(pack2, f);
  494. add_block(pack2, sig->payload, sig->rlength - 1);
  495. if (debug > 1)
  496. dump_packet(pack2);
  497. n = finish_packet(pack2);
  498. if (debug > 1) {
  499. sshdebug(c, "writing %d bytes: len %d", n, nhgetl(pack2->nlength));
  500. dump_packet(pack2);
  501. }
  502. iowrite(c->dio, c->datafd, pack2->nlength, n);
  503. genkeys(c, h, k);
  504. /* Send SSH_MSG_NEWKEYS */
  505. init_packet(pack2);
  506. pack2->c = c;
  507. add_byte(pack2, SSH_MSG_NEWKEYS);
  508. n = finish_packet(pack2);
  509. iowrite(c->dio, c->datafd, pack2->nlength, n);
  510. ret = 0;
  511. err:
  512. mpfree(f);
  513. mpfree(e);
  514. mpfree(k);
  515. mpfree(y);
  516. free(sig);
  517. free(ks);
  518. free(pack2);
  519. qunlock(&c->l);
  520. return ret;
  521. }
  522. static int
  523. dh_client11(Conn *c, Packet *)
  524. {
  525. Packet *p;
  526. int n;
  527. if (c->e)
  528. mpfree(c->e);
  529. c->e = mpnew(1024);
  530. /* Compute e: RFC4253 */
  531. if (c->x)
  532. mpfree(c->x);
  533. c->x = mprand(128, genrandom, nil);
  534. mpexp(two, c->x, p1, c->e);
  535. p = new_packet(c);
  536. add_byte(p, SSH_MSG_KEXDH_INIT);
  537. add_mp(p, c->e);
  538. n = finish_packet(p);
  539. iowrite(c->dio, c->datafd, p->nlength, n);
  540. free(p);
  541. return 0;
  542. }
  543. static int
  544. findkeyinuserring(Conn *c, RSApub *srvkey)
  545. {
  546. int n;
  547. char *home, *newkey, *r;
  548. home = getenv("home");
  549. if (home == nil) {
  550. newkey = "No home directory for key file";
  551. free(keymbox.msg);
  552. keymbox.msg = smprint("b%04ld%s", strlen(newkey), newkey);
  553. return -1;
  554. }
  555. r = smprint("%s/lib/keyring", home);
  556. free(home);
  557. if ((n = findkey(r, c->remote, srvkey)) != KeyOk) {
  558. newkey = smprint("ek=%M n=%M", srvkey->ek, srvkey->n);
  559. free(keymbox.msg);
  560. keymbox.msg = smprint("%c%04ld%s", n == NoKeyFile || n == NoKey?
  561. 'c': 'b', strlen(newkey), newkey);
  562. free(newkey);
  563. nbsendul(keymbox.mchan, 1);
  564. recvul(keymbox.mchan);
  565. if (keymbox.msg == nil || keymbox.msg[0] == 'n') {
  566. free(keymbox.msg);
  567. keymbox.msg = nil;
  568. newkey = "Server key reject";
  569. keymbox.msg = smprint("f%04ld%s", strlen(newkey), newkey);
  570. return -1;
  571. }
  572. sshdebug(c, "adding key");
  573. if (keymbox.msg[0] == 'y')
  574. appendkey(r, c->remote, srvkey);
  575. else if (keymbox.msg[0] == 'r')
  576. replacekey(r, c->remote, srvkey);
  577. }
  578. free(r);
  579. return 0;
  580. }
  581. static int
  582. verifyhostkey(Conn *c, RSApub *srvkey, Packet *sig)
  583. {
  584. int fd, n;
  585. char *newkey;
  586. uchar h[SHA1dlen];
  587. sshdebug(c, "verifying server signature");
  588. if (findkey("/sys/lib/ssh/keyring", c->remote, srvkey) != KeyOk &&
  589. findkeyinuserring(c, srvkey) < 0) {
  590. nbsendul(keymbox.mchan, 1);
  591. mpfree(srvkey->ek);
  592. mpfree(srvkey->n);
  593. return Errnokey;
  594. }
  595. newkey = smprint("key proto=rsa role=verify sys=%s size=%d ek=%M n=%M",
  596. c->remote, mpsignif(srvkey->n), srvkey->ek, srvkey->n);
  597. if (newkey == nil) {
  598. sshlog(c, "out of memory");
  599. threadexits("out of memory");
  600. }
  601. fd = open("/mnt/factotum/ctl", OWRITE);
  602. if (fd >= 0)
  603. write(fd, newkey, strlen(newkey));
  604. /* leave fd open */
  605. else
  606. sshdebug(c, "factotum open failed: %r");
  607. free(newkey);
  608. mpfree(srvkey->ek);
  609. mpfree(srvkey->n);
  610. free(keymbox.msg);
  611. keymbox.msg = nil;
  612. n = pkas[c->pkalg]->verify(c, h, SHA1dlen, nil, (char *)sig->payload,
  613. sig->rlength);
  614. /* fd is perhaps still open */
  615. if (fd >= 0) {
  616. /* sys here is a dotted-quad ip address */
  617. newkey = smprint("delkey proto=rsa role=verify sys=%s",
  618. c->remote);
  619. if (newkey) {
  620. seek(fd, 0, 0);
  621. write(fd, newkey, strlen(newkey));
  622. free(newkey);
  623. }
  624. close(fd);
  625. }
  626. return n;
  627. }
  628. static int
  629. dh_client12(Conn *c, Packet *p)
  630. {
  631. int n, retval;
  632. #ifdef VERIFYKEYS
  633. char *newkey;
  634. #endif
  635. char buf[10];
  636. uchar *q;
  637. uchar h[SHA1dlen];
  638. mpint *f, *k;
  639. Packet *ks, *sig, *pack2;
  640. RSApub *srvkey;
  641. ks = new_packet(c);
  642. sig = new_packet(c);
  643. pack2 = new_packet(c);
  644. q = get_string(p, p->payload+1, (char *)ks->payload, Maxpktpay, &n);
  645. ks->rlength = n + 1;
  646. f = get_mp(q);
  647. q += nhgetl(q) + 4;
  648. get_string(p, q, (char *)sig->payload, Maxpktpay, &n);
  649. sig->rlength = n;
  650. k = mpnew(1024);
  651. mpexp(f, c->x, p1, k);
  652. /* Compute H: RFC 4253 */
  653. init_packet(pack2);
  654. pack2->c = c;
  655. if (debug > 1)
  656. sshdebug(c, "ID strings: %s---%s", c->otherid, MYID);
  657. add_string(pack2, MYID);
  658. add_string(pack2, c->otherid);
  659. if (debug > 1) {
  660. fprint(2, "received kexinit:");
  661. dump_packet(c->rkexinit);
  662. fprint(2, "\nsent kexinit:");
  663. dump_packet(c->skexinit);
  664. }
  665. add_block(pack2, c->skexinit->payload,
  666. c->skexinit->rlength - c->skexinit->pad_len - 1);
  667. add_block(pack2, c->rkexinit->payload, c->rkexinit->rlength - 1);
  668. add_block(pack2, ks->payload, ks->rlength - 1);
  669. add_mp(pack2, c->e);
  670. add_mp(pack2, f);
  671. add_mp(pack2, k);
  672. sha1(pack2->payload, pack2->rlength - 1, h, nil);
  673. mpfree(f);
  674. if (c->got_sessid == 0) {
  675. memmove(c->sessid, h, SHA1dlen);
  676. c->got_sessid = 1;
  677. }
  678. q = get_string(ks, ks->payload, buf, sizeof buf, nil);
  679. srvkey = emalloc9p(sizeof (RSApub));
  680. srvkey->ek = get_mp(q);
  681. q += nhgetl(q) + 4;
  682. srvkey->n = get_mp(q);
  683. /*
  684. * key verification is really pretty pedantic and
  685. * not doing it lets us talk to ssh v1 implementations.
  686. */
  687. if (nokeyverify)
  688. n = Errnone;
  689. else
  690. n = verifyhostkey(c, srvkey, sig);
  691. retval = -1;
  692. USED(retval);
  693. switch (n) {
  694. #ifdef VERIFYKEYS
  695. case Errnokey:
  696. goto out;
  697. case Errnoverify:
  698. newkey = "signature verification failed; try netssh -v";
  699. keymbox.msg = smprint("f%04ld%s", strlen(newkey), newkey);
  700. break;
  701. case Errfactotum:
  702. newkey = "factotum dialogue failed; try netssh -v";
  703. keymbox.msg = smprint("f%04ld%s", strlen(newkey), newkey);
  704. break;
  705. case Errnone:
  706. #else
  707. default:
  708. #endif
  709. keymbox.msg = smprint("o0000");
  710. retval = 0;
  711. break;
  712. }
  713. nbsendul(keymbox.mchan, 1);
  714. if (retval == 0)
  715. genkeys(c, h, k);
  716. #ifdef VERIFYKEYS
  717. out:
  718. #endif
  719. mpfree(k);
  720. free(ks);
  721. free(sig);
  722. free(pack2);
  723. free(srvkey);
  724. return retval;
  725. }
  726. static int
  727. dh_client141(Conn *c, Packet *)
  728. {
  729. Packet *p;
  730. mpint *e, *x;
  731. int n;
  732. /* Compute e: RFC4253 */
  733. e = mpnew(2048);
  734. x = mprand(256, genrandom, nil);
  735. mpexp(two, x, p14, e);
  736. p = new_packet(c);
  737. add_byte(p, SSH_MSG_KEXDH_INIT);
  738. add_mp(p, e);
  739. n = finish_packet(p);
  740. iowrite(c->dio, c->datafd, p->nlength, n);
  741. free(p);
  742. mpfree(e);
  743. mpfree(x);
  744. return 0;
  745. }
  746. static int
  747. dh_client142(Conn *, Packet *)
  748. {
  749. return 0;
  750. }
  751. static void
  752. initsha1pkt(Packet *pack2, mpint *k, uchar *h)
  753. {
  754. init_packet(pack2);
  755. add_mp(pack2, k);
  756. add_packet(pack2, h, SHA1dlen);
  757. }
  758. static void
  759. genkeys(Conn *c, uchar h[], mpint *k)
  760. {
  761. Packet *pack2;
  762. char buf[82], *bp, *be; /* magic 82 */
  763. int n;
  764. pack2 = new_packet(c);
  765. /* Compute 40 bytes (320 bits) of keys: each alg can use what it needs */
  766. /* Client to server IV */
  767. if (debug > 1) {
  768. fprint(2, "k=%M\nh=", k);
  769. for (n = 0; n < SHA1dlen; ++n)
  770. fprint(2, "%02ux", h[n]);
  771. fprint(2, "\nsessid=");
  772. for (n = 0; n < SHA1dlen; ++n)
  773. fprint(2, "%02ux", c->sessid[n]);
  774. fprint(2, "\n");
  775. }
  776. initsha1pkt(pack2, k, h);
  777. add_byte(pack2, 'A');
  778. add_packet(pack2, c->sessid, SHA1dlen);
  779. sha1(pack2->payload, pack2->rlength - 1, c->nc2siv, nil);
  780. initsha1pkt(pack2, k, h);
  781. add_packet(pack2, c->nc2siv, SHA1dlen);
  782. sha1(pack2->payload, pack2->rlength - 1, c->nc2siv + SHA1dlen, nil);
  783. /* Server to client IV */
  784. initsha1pkt(pack2, k, h);
  785. add_byte(pack2, 'B');
  786. add_packet(pack2, c->sessid, SHA1dlen);
  787. sha1(pack2->payload, pack2->rlength - 1, c->ns2civ, nil);
  788. initsha1pkt(pack2, k, h);
  789. add_packet(pack2, c->ns2civ, SHA1dlen);
  790. sha1(pack2->payload, pack2->rlength - 1, c->ns2civ + SHA1dlen, nil);
  791. /* Client to server encryption key */
  792. initsha1pkt(pack2, k, h);
  793. add_byte(pack2, 'C');
  794. add_packet(pack2, c->sessid, SHA1dlen);
  795. sha1(pack2->payload, pack2->rlength - 1, c->nc2sek, nil);
  796. initsha1pkt(pack2, k, h);
  797. add_packet(pack2, c->nc2sek, SHA1dlen);
  798. sha1(pack2->payload, pack2->rlength - 1, c->nc2sek + SHA1dlen, nil);
  799. /* Server to client encryption key */
  800. initsha1pkt(pack2, k, h);
  801. add_byte(pack2, 'D');
  802. add_packet(pack2, c->sessid, SHA1dlen);
  803. sha1(pack2->payload, pack2->rlength - 1, c->ns2cek, nil);
  804. initsha1pkt(pack2, k, h);
  805. add_packet(pack2, c->ns2cek, SHA1dlen);
  806. sha1(pack2->payload, pack2->rlength - 1, c->ns2cek + SHA1dlen, nil);
  807. /* Client to server integrity key */
  808. initsha1pkt(pack2, k, h);
  809. add_byte(pack2, 'E');
  810. add_packet(pack2, c->sessid, SHA1dlen);
  811. sha1(pack2->payload, pack2->rlength - 1, c->nc2sik, nil);
  812. initsha1pkt(pack2, k, h);
  813. add_packet(pack2, c->nc2sik, SHA1dlen);
  814. sha1(pack2->payload, pack2->rlength - 1, c->nc2sik + SHA1dlen, nil);
  815. /* Server to client integrity key */
  816. initsha1pkt(pack2, k, h);
  817. add_byte(pack2, 'F');
  818. add_packet(pack2, c->sessid, SHA1dlen);
  819. sha1(pack2->payload, pack2->rlength - 1, c->ns2cik, nil);
  820. initsha1pkt(pack2, k, h);
  821. add_packet(pack2, c->ns2cik, SHA1dlen);
  822. sha1(pack2->payload, pack2->rlength - 1, c->ns2cik + SHA1dlen, nil);
  823. if (debug > 1) {
  824. be = buf + sizeof buf;
  825. fprint(2, "Client to server IV:\n");
  826. for (n = 0, bp = buf; n < SHA1dlen*2; ++n)
  827. bp = seprint(bp, be, "%02x", c->nc2siv[n]);
  828. fprint(2, "%s\n", buf);
  829. fprint(2, "Server to client IV:\n");
  830. for (n = 0, bp = buf; n < SHA1dlen*2; ++n)
  831. bp = seprint(bp, be, "%02x", c->ns2civ[n]);
  832. fprint(2, "%s\n", buf);
  833. fprint(2, "Client to server EK:\n");
  834. for (n = 0, bp = buf; n < SHA1dlen*2; ++n)
  835. bp = seprint(bp, be, "%02x", c->nc2sek[n]);
  836. fprint(2, "%s\n", buf);
  837. fprint(2, "Server to client EK:\n");
  838. for (n = 0, bp = buf; n < SHA1dlen*2; ++n)
  839. bp = seprint(bp, be, "%02x", c->ns2cek[n]);
  840. fprint(2, "%s\n", buf);
  841. }
  842. free(pack2);
  843. }
  844. Kex dh1sha1 = {
  845. "diffie-hellman-group1-sha1",
  846. dh_server1,
  847. dh_client11,
  848. dh_client12
  849. };
  850. Kex dh14sha1 = {
  851. "diffie-hellman-group14-sha1",
  852. dh_server14,
  853. dh_client141,
  854. dh_client142
  855. };
  856. PKA rsa_pka = {
  857. "ssh-rsa",
  858. rsa_ks,
  859. rsa_sign,
  860. rsa_verify
  861. };
  862. PKA dss_pka = {
  863. "ssh-dss",
  864. dss_ks,
  865. dss_sign,
  866. dss_verify
  867. };