keyfile.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <assert.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6. #include <stdint.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include "asprintf.h"
  11. #include "b64encode.h"
  12. #include "crypto.h"
  13. #include "insecure_memzero.h"
  14. #include "passphrase_entry.h"
  15. #include "readpass.h"
  16. #include "scryptenc.h"
  17. #include "sysendian.h"
  18. #include "warnp.h"
  19. #include "keyfile.h"
  20. /**
  21. * Key file format:
  22. * keyfile == (rawkeyfile | textkeyfile)
  23. * textkeyfile == line*
  24. * line == blankline | commentline | base64line
  25. * blankline == EOL
  26. * commentline == "#" char* EOL
  27. * base64line == [a-zA-Z0-9+/=]+ EOL
  28. * EOL = "\n" | "\r" | "\r\n"
  29. *
  30. * After base-64 decoding, a base64line becomes a rawline.
  31. * rawline == rawlinedata rawlinechecksum
  32. * rawlinedata == byte+
  33. * rawlinechecksum == byte{6}
  34. * where rawlinechecksum is the first 6 bytes of SHA256(rawlinedata).
  35. *
  36. * After ignoring any blanklines and commentlines, converting base64lines to
  37. * rawlinedatas, and concatenating them together, a textkeyfile becomes a
  38. * tarsnapkeyfile.
  39. *
  40. * tarsnapkeyfile == scryptkeyfile | cookedkeyfile
  41. * scryptkeyfile == scrypt(cookedkeyfile)
  42. * cookedkeyfile == "tarsnap\0" rawkeyfile
  43. * rawkeyfile == machinenum keys
  44. * machinenum == big-endian-uint64_t
  45. * and keys are in the format used by crypto_keys_(im|ex)port.
  46. *
  47. * Put simply, there are three key formats:
  48. * 1. A raw key file (for historical reasons only).
  49. * 2. A base64-encoded key file.
  50. * 3. A base64-encoded encrypted key file.
  51. */
  52. static int read_raw(const uint8_t *, size_t,
  53. uint64_t *, const char *, int);
  54. static int read_plaintext(const uint8_t *, size_t,
  55. uint64_t *, const char *, int);
  56. static int read_encrypted(const uint8_t *, size_t,
  57. uint64_t *, const char *, int, int, enum passphrase_entry, const char *);
  58. static int read_base256(const uint8_t *, size_t,
  59. uint64_t *, const char *, int, int, enum passphrase_entry, const char *);
  60. static int read_base64(const char *, size_t,
  61. uint64_t *, const char *, int, int, enum passphrase_entry, const char *);
  62. static int
  63. read_raw(const uint8_t * keybuf, size_t keylen, uint64_t * machinenum,
  64. const char * filename, int keys)
  65. {
  66. /* Sanity-check size. */
  67. if (keylen < 8) {
  68. warn0("Key file is corrupt or truncated: %s", filename);
  69. goto err0;
  70. }
  71. /* Parse machine number from the first 8 bytes. */
  72. *machinenum = be64dec(keybuf);
  73. /* Parse keys from the remaining buffer. */
  74. if (crypto_keys_import(&keybuf[8], keylen - 8, keys))
  75. goto err0;
  76. /* Success! */
  77. return (0);
  78. err0:
  79. /* Failure! */
  80. return (-1);
  81. }
  82. static int
  83. read_plaintext(const uint8_t * keybuf, size_t keylen, uint64_t * machinenum,
  84. const char * filename, int keys)
  85. {
  86. /* Sanity-check size. */
  87. if (keylen < 8) {
  88. warn0("Key file is corrupt or truncated: %s", filename);
  89. goto err0;
  90. }
  91. /* Plaintext key files start with "tarsnap\0". */
  92. if (memcmp(keybuf, "tarsnap\0", 8)) {
  93. warn0("Key file is corrupt: %s", filename);
  94. goto err0;
  95. }
  96. /* The rest of the buffer is raw key data. */
  97. return (read_raw(&keybuf[8], keylen - 8, machinenum, filename, keys));
  98. err0:
  99. /* Failure! */
  100. return (-1);
  101. }
  102. static int
  103. read_encrypted(const uint8_t * keybuf, size_t keylen, uint64_t * machinenum,
  104. const char * filename, int keys, int force,
  105. enum passphrase_entry passphrase_entry, const char * passphrase_arg)
  106. {
  107. char * pwprompt;
  108. char * passwd;
  109. uint8_t * deckeybuf;
  110. size_t deckeylen;
  111. int rc;
  112. struct scryptenc_params params = {0, 0.5, 86400.0, 0, 0, 0};
  113. /* The caller must pass a file name to be read. */
  114. assert(filename != NULL);
  115. /* Sanity-check size. */
  116. if (keylen == 0) {
  117. warn0("Key file is corrupt or truncated: %s", filename);
  118. goto err0;
  119. }
  120. /* Prompt the user for a password. */
  121. if (asprintf(&pwprompt, "Please enter passphrase for keyfile %s",
  122. filename) == -1)
  123. goto err0;
  124. if (passphrase_entry_readpass(&passwd, passphrase_entry,
  125. passphrase_arg, pwprompt, NULL, 1)) {
  126. warnp("Error reading passphrase");
  127. goto err1;
  128. }
  129. /*
  130. * Allocate a buffer to hold the decrypted key. At the present time
  131. * (2009-06-01) this buffer only needs to be keylen-128 bytes long,
  132. * since the only encrypted format we support has 128B of overhead;
  133. * but in the future the scrypt code might support other formats with
  134. * less overhead (but never less than zero bytes).
  135. */
  136. if ((deckeybuf = malloc(keylen)) == NULL)
  137. goto err2;
  138. /* Decrypt the key file. */
  139. rc = scryptdec_buf(keybuf, keylen, deckeybuf, &deckeylen,
  140. (const uint8_t *)passwd, strlen(passwd), &params, 0,
  141. force);
  142. if (rc != SCRYPT_OK) {
  143. switch (rc) {
  144. case SCRYPT_ELIMIT:
  145. warnp("Error determining amount of available memory");
  146. break;
  147. case SCRYPT_ECLOCK:
  148. warnp("Error reading clocks");
  149. break;
  150. case SCRYPT_EKEY:
  151. warnp("Error computing derived key");
  152. break;
  153. case SCRYPT_EOPENSSL:
  154. warnp("OpenSSL error");
  155. break;
  156. case SCRYPT_ENOMEM:
  157. /* malloc failure */
  158. break;
  159. case SCRYPT_EINVAL:
  160. warn0("Input is not valid scrypt-encrypted block");
  161. break;
  162. case SCRYPT_EVERSION:
  163. warn0("Unrecognized scrypt format version");
  164. break;
  165. case SCRYPT_ETOOBIG:
  166. warn0("Decrypting file would require too much memory");
  167. break;
  168. case SCRYPT_ETOOSLOW:
  169. warn0("Decrypting file would take too much CPU time");
  170. break;
  171. case SCRYPT_EBIGSLOW:
  172. warn0("Decrypting file would take too much CPU time and memory");
  173. break;
  174. case SCRYPT_EPASS:
  175. warn0("Passphrase is incorrect");
  176. break;
  177. default:
  178. warn0("Programmer error: "
  179. "Impossible error returned by scryptdec_buf");
  180. break;
  181. }
  182. warnp("Error decrypting key file: %s", filename);
  183. goto err3;
  184. }
  185. /*
  186. * Don't need this any more. To simplify error handling, we zero
  187. * this here but free it later.
  188. */
  189. insecure_memzero(passwd, strlen(passwd));
  190. /* Process the decrypted key file. */
  191. if (read_plaintext(deckeybuf, deckeylen, machinenum, filename, keys))
  192. goto err3;
  193. /* Clean up. We only used the first deckeylen values of deckeybuf. */
  194. insecure_memzero(deckeybuf, deckeylen);
  195. free(deckeybuf);
  196. free(passwd);
  197. free(pwprompt);
  198. /* Success! */
  199. return (0);
  200. err3:
  201. /*
  202. * Depending on the error, we might not know how much data was written
  203. * to deckeybuf, so we play safe by zeroing the entire allocated array.
  204. */
  205. insecure_memzero(deckeybuf, keylen);
  206. free(deckeybuf);
  207. err2:
  208. insecure_memzero(passwd, strlen(passwd));
  209. free(passwd);
  210. err1:
  211. free(pwprompt);
  212. err0:
  213. /* Failure! */
  214. return (-1);
  215. }
  216. static int
  217. read_base256(const uint8_t * keybuf, size_t keylen, uint64_t * machinenum,
  218. const char * filename, int keys, int force,
  219. enum passphrase_entry passphrase_entry, const char * passphrase_arg)
  220. {
  221. /* Sanity-check size. */
  222. if (keylen < 6) {
  223. warn0("Key file is corrupt or truncated: %s", filename);
  224. goto err0;
  225. }
  226. /* Is this encrypted? */
  227. if (memcmp(keybuf, "scrypt", 6) == 0)
  228. return (read_encrypted(keybuf, keylen,
  229. machinenum, filename, keys, force, passphrase_entry,
  230. passphrase_arg));
  231. /* Parse this as a plaintext keyfile. */
  232. return (read_plaintext(keybuf, keylen,
  233. machinenum, filename, keys));
  234. err0:
  235. /* Failure! */
  236. return (-1);
  237. }
  238. static int
  239. read_base64(const char * keybuf, size_t keylen, uint64_t * machinenum,
  240. const char * filename, int keys, int force,
  241. enum passphrase_entry passphrase_entry, const char * passphrase_arg)
  242. {
  243. uint8_t * decbuf;
  244. size_t decbuflen;
  245. size_t decpos;
  246. size_t lnum;
  247. size_t llen;
  248. size_t len;
  249. uint8_t hbuf[32];
  250. /* Sanity-check size. */
  251. if (keylen < 4) {
  252. warn0("Key file is corrupt or truncated: %s", filename);
  253. goto err0;
  254. }
  255. /*
  256. * Allocate space for base64-decoded bytes. The most space we can
  257. * possibly require for the decoded bytes is 3/4 of the base64
  258. * encoded length.
  259. */
  260. decbuflen = (keylen / 4) * 3;
  261. if ((decbuf = malloc(decbuflen)) == NULL)
  262. goto err0;
  263. decpos = 0;
  264. /* Handle one line at once. */
  265. for (lnum = 1; keylen > 0; lnum++) {
  266. /* Look for an EOL character. */
  267. for (llen = 0; llen < keylen; llen++) {
  268. if ((keybuf[llen] == '\r') || (keybuf[llen] == '\n'))
  269. break;
  270. }
  271. /* If this isn't a comment or blank line, base-64 decode it. */
  272. if ((llen > 0) && (keybuf[0] != '#')) {
  273. if (b64decode(keybuf, llen, &decbuf[decpos], &len))
  274. goto err2;
  275. /* We should have at least 7 bytes... */
  276. if (len < 7)
  277. goto err2;
  278. /* ... because SHA256(line - last 6 bytes)... */
  279. if (crypto_hash_data(CRYPTO_KEY_HMAC_SHA256,
  280. &decbuf[decpos], len - 6, hbuf)) {
  281. warn0("Programmer error: "
  282. "SHA256 should never fail");
  283. goto err1;
  284. }
  285. /* ... should equal the last 6 bytes of the line. */
  286. if (memcmp(hbuf, &decbuf[decpos + len - 6], 6))
  287. goto err2;
  288. /* This line is good; advance the pointer. */
  289. decpos += len - 6;
  290. }
  291. /* Skip past this line. */
  292. keybuf += llen;
  293. keylen -= llen;
  294. /* Skip past the EOL if we're not at EOF. */
  295. if ((keylen > 1) &&
  296. (keybuf[0] == '\r') && (keybuf[1] == '\n')) {
  297. keybuf += 2;
  298. keylen -= 2;
  299. } else if (keylen) {
  300. keybuf += 1;
  301. keylen -= 1;
  302. }
  303. }
  304. /* Process the decoded key file. */
  305. if (read_base256(decbuf, decpos, machinenum, filename, keys, force,
  306. passphrase_entry, passphrase_arg))
  307. goto err1;
  308. /* Zero and free memory. */
  309. insecure_memzero(decbuf, decbuflen);
  310. free(decbuf);
  311. /* Success! */
  312. return (0);
  313. err2:
  314. warn0("Key file is corrupt on line %zu: %s", lnum, filename);
  315. err1:
  316. insecure_memzero(decbuf, decbuflen);
  317. free(decbuf);
  318. err0:
  319. /* Failure! */
  320. return (-1);
  321. }
  322. /**
  323. * keyfile_read(filename, machinenum, keys, force, passphrase_entry,
  324. * passphrase_arg):
  325. * Read keys from a tarsnap key file; and return the machine # via the
  326. * provided pointer. Ignore any keys not specified in the ${keys} mask.
  327. * If ${force} is 1, do not check whether decryption will exceed
  328. * the estimated available memory or time. Use the ${passphrase_entry}
  329. * method to read the passphrase, using ${passphrase_arg} if applicable.
  330. */
  331. int
  332. keyfile_read(const char * filename, uint64_t * machinenum, int keys, int force,
  333. enum passphrase_entry passphrase_entry, const char * passphrase_arg)
  334. {
  335. struct stat sb;
  336. uint8_t * keybuf;
  337. FILE * f;
  338. size_t keyfilelen;
  339. /* Open the file. */
  340. if ((f = fopen(filename, "r")) == NULL) {
  341. warnp("fopen(%s)", filename);
  342. goto err0;
  343. }
  344. /* Stat the file. */
  345. if (fstat(fileno(f), &sb)) {
  346. warnp("stat(%s)", filename);
  347. goto err1;
  348. }
  349. /* Validate keyfile size. */
  350. if ((sb.st_size == 0) || (sb.st_size > 1000000)) {
  351. warn0("Key file has unreasonable size: %s", filename);
  352. goto err1;
  353. }
  354. keyfilelen = (size_t)(sb.st_size);
  355. /* Allocate memory. */
  356. if ((keybuf = malloc(keyfilelen)) == NULL)
  357. goto err1;
  358. /* Read the file. */
  359. if (fread(keybuf, keyfilelen, 1, f) != 1) {
  360. warnp("fread(%s)", filename);
  361. goto err2;
  362. }
  363. if (fclose(f)) {
  364. warnp("fclose(%s)", filename);
  365. f = NULL;
  366. goto err2;
  367. }
  368. f = NULL;
  369. /* If this is a raw key file, process it. */
  370. if ((keybuf[0] == 0x00) || (keybuf[0] == 0xff)) {
  371. if (read_raw(keybuf, keyfilelen,
  372. machinenum, filename, keys)) {
  373. if (errno)
  374. warnp("Error parsing key file: %s", filename);
  375. goto err2;
  376. }
  377. } else {
  378. /* Otherwise, try to base64 decode it. */
  379. if (read_base64((const char *)keybuf, keyfilelen,
  380. machinenum, filename, keys, force, passphrase_entry,
  381. passphrase_arg)) {
  382. if (errno)
  383. warnp("Error parsing key file: %s", filename);
  384. goto err2;
  385. }
  386. }
  387. /* Zero and free memory. */
  388. insecure_memzero(keybuf, keyfilelen);
  389. free(keybuf);
  390. /* Success! */
  391. return (0);
  392. err2:
  393. insecure_memzero(keybuf, keyfilelen);
  394. free(keybuf);
  395. err1:
  396. if (f != NULL)
  397. fclose(f);
  398. err0:
  399. /* Failure! */
  400. return (-1);
  401. }
  402. /**
  403. * keyfile_write(filename, machinenum, keys, passphrase, maxmem, cputime):
  404. * Write a key file for the specified machine containing the specified keys.
  405. * If ${passphrase} is non-NULL, use up to ${cputime} seconds and ${maxmem}
  406. * bytes of memory to encrypt the key file.
  407. */
  408. int
  409. keyfile_write(const char * filename, uint64_t machinenum, int keys,
  410. char * passphrase, size_t maxmem, double cputime)
  411. {
  412. FILE * f;
  413. /* Create key file. */
  414. if ((f = keyfile_write_open(filename)) == NULL) {
  415. warnp("Cannot create %s", filename);
  416. goto err0;
  417. }
  418. /* Write keys. */
  419. if (keyfile_write_file(f, machinenum, keys, passphrase,
  420. maxmem, cputime))
  421. goto err2;
  422. /* Close the key file. */
  423. if (fclose(f)) {
  424. warnp("Error closing key file");
  425. goto err1;
  426. }
  427. /* Success! */
  428. return (0);
  429. err2:
  430. fclose(f);
  431. err1:
  432. unlink(filename);
  433. err0:
  434. /* Failure! */
  435. return (-1);
  436. }
  437. /**
  438. * keyfile_write_open(filename):
  439. * Open a key file for writing. Avoid race conditions. Return a FILE *.
  440. */
  441. FILE *
  442. keyfile_write_open(const char * filename)
  443. {
  444. FILE * f;
  445. int fd;
  446. int saved_errno;
  447. /* Attempt to create the file. */
  448. if ((fd = open(filename, O_WRONLY | O_CREAT | O_EXCL,
  449. S_IRUSR | S_IWUSR)) == -1) {
  450. /* Special error message for EEXIST. */
  451. if (errno == EEXIST)
  452. warn0("Key file already exists, not overwriting: %s",
  453. filename);
  454. goto err0;
  455. }
  456. /* Wrap the fd into a FILE. */
  457. if ((f = fdopen(fd, "w")) == NULL) {
  458. saved_errno = errno;
  459. goto err1;
  460. }
  461. /* Success! */
  462. return (f);
  463. err1:
  464. unlink(filename);
  465. if (close(fd))
  466. warnp("close");
  467. errno = saved_errno;
  468. err0:
  469. /* Failure! */
  470. return (NULL);
  471. }
  472. /**
  473. * keyfile_write_file(f, machinenum, keys, passphrase, maxmem, cputime):
  474. * Write a key file for the specified machine containing the specified keys.
  475. * If ${passphrase} is non-NULL, use up to ${cputime} seconds and ${maxmem}
  476. * bytes of memory to encrypt the key file.
  477. */
  478. int
  479. keyfile_write_file(FILE * f, uint64_t machinenum, int keys,
  480. char * passphrase, size_t maxmem, double cputime)
  481. {
  482. uint8_t * keybuf;
  483. size_t keybuflen;
  484. uint8_t * tskeybuf;
  485. size_t tskeylen;
  486. uint8_t * encrbuf;
  487. int rc;
  488. uint8_t linebuf256[54];
  489. char linebuf64[73];
  490. size_t writepos;
  491. size_t linelen;
  492. uint8_t hbuf[32];
  493. double maxmemfrac = (maxmem != 0) ? 0.5 : 0.125;
  494. struct scryptenc_params params = {maxmem, maxmemfrac, cputime, 0, 0, 0};
  495. /* Export keys. */
  496. if (crypto_keys_export(keys, &keybuf, &keybuflen)) {
  497. warnp("Error exporting keys");
  498. goto err0;
  499. }
  500. /* Construct "cooked" key file. */
  501. tskeylen = keybuflen + 16;
  502. if ((tskeybuf = malloc(tskeylen)) == NULL)
  503. goto err1;
  504. memcpy(tskeybuf, "tarsnap\0", 8);
  505. be64enc(&tskeybuf[8], machinenum);
  506. memcpy(&tskeybuf[16], keybuf, keybuflen);
  507. /*
  508. * Don't need this any more. To simplify error handling, we zero
  509. * this here but free it later.
  510. */
  511. insecure_memzero(keybuf, keybuflen);
  512. /* If we have a passphrase, we want to encrypt. */
  513. if (passphrase != NULL) {
  514. /* Allocate space for encrypted buffer. */
  515. if ((encrbuf = malloc(tskeylen + 128)) == NULL)
  516. goto err2;
  517. /* Encrypt. */
  518. switch ((rc = scryptenc_buf(tskeybuf, tskeylen, encrbuf,
  519. (uint8_t *)passphrase, strlen(passphrase),
  520. &params, 0, 0))) {
  521. case SCRYPT_OK:
  522. /* Success! */
  523. break;
  524. case SCRYPT_ELIMIT:
  525. warnp("Error determining amount of available memory");
  526. break;
  527. case SCRYPT_ECLOCK:
  528. warnp("Error reading clocks");
  529. break;
  530. case SCRYPT_EKEY:
  531. warnp("Error computing derived key");
  532. break;
  533. case SCRYPT_ESALT:
  534. warnp("Error reading salt");
  535. break;
  536. case SCRYPT_EOPENSSL:
  537. warnp("OpenSSL error");
  538. break;
  539. case SCRYPT_ENOMEM:
  540. warnp("Error allocating memory");
  541. break;
  542. default:
  543. warn0("Programmer error: "
  544. "Impossible error returned by scryptenc_buf");
  545. break;
  546. }
  547. /* Error out if the encryption failed. */
  548. if (rc != SCRYPT_OK) {
  549. insecure_memzero(encrbuf, tskeylen + 128);
  550. free(encrbuf);
  551. goto err2;
  552. }
  553. /* Switch key buffers. */
  554. insecure_memzero(tskeybuf, tskeylen);
  555. free(tskeybuf);
  556. tskeylen = tskeylen + 128;
  557. tskeybuf = encrbuf;
  558. }
  559. /* Base64-encode the buffer, writing it out as we go. */
  560. if (fprintf(f, "# START OF TARSNAP KEY FILE\n") < 0) {
  561. warnp("Error writing key file");
  562. goto err2;
  563. }
  564. for (writepos = 0; writepos < tskeylen; writepos += linelen) {
  565. linelen = 48;
  566. if (writepos + linelen > tskeylen)
  567. linelen = tskeylen - writepos;
  568. /* Copy bytes into line buffer. */
  569. memcpy(linebuf256, &tskeybuf[writepos], linelen);
  570. /* Append 6 bytes of SHA256 hash. */
  571. if (crypto_hash_data(CRYPTO_KEY_HMAC_SHA256,
  572. linebuf256, linelen, hbuf)) {
  573. warn0("Programmer error: "
  574. "SHA256 should never fail");
  575. goto err2;
  576. }
  577. memcpy(&linebuf256[linelen], hbuf, 6);
  578. /* Base64-encode. */
  579. b64encode(linebuf256, linebuf64, linelen + 6);
  580. /* Write out the line. */
  581. if (fprintf(f, "%s\n", linebuf64) < 0) {
  582. warnp("Error writing key file");
  583. goto err2;
  584. }
  585. }
  586. if (fprintf(f, "# END OF TARSNAP KEY FILE\n") < 0) {
  587. warnp("Error writing key file");
  588. goto err2;
  589. }
  590. /* Zero and free key buffers. */
  591. insecure_memzero(tskeybuf, tskeylen);
  592. free(tskeybuf);
  593. free(keybuf);
  594. /* Success! */
  595. return (0);
  596. err2:
  597. insecure_memzero(tskeybuf, tskeylen);
  598. free(tskeybuf);
  599. err1:
  600. insecure_memzero(keybuf, keybuflen);
  601. free(keybuf);
  602. err0:
  603. /* Failure! */
  604. return (-1);
  605. }