crypto_keys.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. #include <errno.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <openssl/crypto.h>
  5. #include <openssl/err.h>
  6. #include <openssl/rand.h>
  7. #include <openssl/rsa.h>
  8. #include "crypto_compat.h"
  9. #include "crypto_entropy.h"
  10. #include "sysendian.h"
  11. #include "warnp.h"
  12. #include "crypto.h"
  13. #include "crypto_internal.h"
  14. static struct {
  15. RSA * sign_priv;
  16. RSA * sign_pub;
  17. RSA * encr_priv;
  18. RSA * encr_pub;
  19. RSA * root_pub;
  20. struct crypto_hmac_key * hmac_file;
  21. struct crypto_hmac_key * hmac_file_write;
  22. struct crypto_hmac_key * hmac_chunk;
  23. struct crypto_hmac_key * hmac_name;
  24. struct crypto_hmac_key * hmac_cparams;
  25. struct crypto_hmac_key * auth_put;
  26. struct crypto_hmac_key * auth_get;
  27. struct crypto_hmac_key * auth_delete;
  28. } keycache;
  29. static void crypto_keys_atexit(void);
  30. /*
  31. * External key data format:
  32. * 4 byte little-endian integer = length of key data
  33. * 1 byte = key type
  34. * N bytes = key data, in key-specific format
  35. */
  36. #define KEYHEADER_OFFSET_LEN 0
  37. #define KEYHEADER_OFFSET_TYPE 4
  38. #define KEYHEADER_LEN 5
  39. /**
  40. * export_key(key, buf, buflen):
  41. * If buf != NULL, export the specified key. Return the key length in bytes.
  42. */
  43. static uint32_t
  44. export_key(int key, uint8_t * buf, size_t buflen)
  45. {
  46. uint32_t len;
  47. switch (key) {
  48. case CRYPTO_KEY_SIGN_PRIV:
  49. len = crypto_keys_subr_export_RSA_priv(keycache.sign_priv,
  50. buf, buflen);
  51. break;
  52. case CRYPTO_KEY_SIGN_PUB:
  53. len = crypto_keys_subr_export_RSA_pub(keycache.sign_pub, buf,
  54. buflen);
  55. break;
  56. case CRYPTO_KEY_ENCR_PRIV:
  57. len = crypto_keys_subr_export_RSA_priv(keycache.encr_priv,
  58. buf, buflen);
  59. break;
  60. case CRYPTO_KEY_ENCR_PUB:
  61. len = crypto_keys_subr_export_RSA_pub(keycache.encr_pub, buf,
  62. buflen);
  63. break;
  64. case CRYPTO_KEY_HMAC_FILE:
  65. len = crypto_keys_subr_export_HMAC(keycache.hmac_file, buf,
  66. buflen);
  67. break;
  68. case CRYPTO_KEY_HMAC_CHUNK:
  69. len = crypto_keys_subr_export_HMAC(keycache.hmac_chunk, buf,
  70. buflen);
  71. break;
  72. case CRYPTO_KEY_HMAC_NAME:
  73. len = crypto_keys_subr_export_HMAC(keycache.hmac_name,
  74. buf, buflen);
  75. break;
  76. case CRYPTO_KEY_HMAC_CPARAMS:
  77. len = crypto_keys_subr_export_HMAC(keycache.hmac_cparams,
  78. buf, buflen);
  79. break;
  80. case CRYPTO_KEY_AUTH_PUT:
  81. len = crypto_keys_subr_export_HMAC(keycache.auth_put, buf,
  82. buflen);
  83. break;
  84. case CRYPTO_KEY_AUTH_GET:
  85. len = crypto_keys_subr_export_HMAC(keycache.auth_get, buf,
  86. buflen);
  87. break;
  88. case CRYPTO_KEY_AUTH_DELETE:
  89. len = crypto_keys_subr_export_HMAC(keycache.auth_delete, buf,
  90. buflen);
  91. break;
  92. default:
  93. warn0("Unrecognized key type: %d", key);
  94. goto err0;
  95. }
  96. /* Did the key export fail? */
  97. if (len == (uint32_t)(-1))
  98. goto err0;
  99. /* Success! */
  100. return (len);
  101. err0:
  102. /* Failure! */
  103. return ((uint32_t)(-1));
  104. }
  105. /**
  106. * crypto_keys_init_keycache(void):
  107. * Initialize the key cache.
  108. */
  109. int
  110. crypto_keys_init_keycache(void)
  111. {
  112. /*
  113. * No keys yet. memset() is insufficient since NULL is not required
  114. * to be represented in memory by zeroes.
  115. */
  116. keycache.sign_priv = NULL;
  117. keycache.sign_pub = NULL;
  118. keycache.encr_priv = NULL;
  119. keycache.encr_pub = NULL;
  120. keycache.root_pub = NULL;
  121. keycache.hmac_file = NULL;
  122. keycache.hmac_file_write = NULL;
  123. keycache.hmac_chunk = NULL;
  124. keycache.hmac_name = NULL;
  125. keycache.hmac_cparams = NULL;
  126. keycache.auth_put = NULL;
  127. keycache.auth_get = NULL;
  128. keycache.auth_delete = NULL;
  129. /* It's now safe to call crypto_keys_atexit() upon exit. */
  130. if (atexit(crypto_keys_atexit)) {
  131. warnp("Could not initialize atexit");
  132. goto err0;
  133. }
  134. /* Success! */
  135. return (0);
  136. err0:
  137. /* Failure! */
  138. return (-1);
  139. }
  140. /**
  141. * crypto_keys_atexit(void):
  142. * Free the key cache.
  143. */
  144. static void
  145. crypto_keys_atexit(void)
  146. {
  147. /* Free all RSA keys. */
  148. RSA_free(keycache.sign_priv);
  149. RSA_free(keycache.sign_pub);
  150. RSA_free(keycache.encr_priv);
  151. RSA_free(keycache.encr_pub);
  152. RSA_free(keycache.root_pub);
  153. /* Free all HMAC keys. */
  154. crypto_keys_subr_free_HMAC(&keycache.hmac_file);
  155. crypto_keys_subr_free_HMAC(&keycache.hmac_file_write);
  156. crypto_keys_subr_free_HMAC(&keycache.hmac_chunk);
  157. crypto_keys_subr_free_HMAC(&keycache.hmac_name);
  158. crypto_keys_subr_free_HMAC(&keycache.hmac_cparams);
  159. crypto_keys_subr_free_HMAC(&keycache.auth_put);
  160. crypto_keys_subr_free_HMAC(&keycache.auth_get);
  161. crypto_keys_subr_free_HMAC(&keycache.auth_delete);
  162. /* Free shared memory allocated by OpenSSL. */
  163. crypto_compat_free();
  164. }
  165. /**
  166. * crypto_keys_import(buf, buflen, keys):
  167. * Import keys from the provided buffer into the key cache. Ignore any keys
  168. * not specified in the mask ${keys}.
  169. */
  170. int
  171. crypto_keys_import(const uint8_t * buf, size_t buflen, int keys)
  172. {
  173. const uint8_t * kh;
  174. uint32_t len;
  175. uint8_t type;
  176. /* Loop until we've processed all the provided data. */
  177. while (buflen) {
  178. /* We must have at least a key header. */
  179. if (buflen < KEYHEADER_LEN) {
  180. warn0("Unexpected EOF of key data");
  181. goto err0;
  182. }
  183. /* Parse header. */
  184. kh = buf;
  185. buf += KEYHEADER_LEN;
  186. buflen -= KEYHEADER_LEN;
  187. /* Sanity check length. */
  188. len = le32dec(&kh[KEYHEADER_OFFSET_LEN]);
  189. if (len > buflen) {
  190. warn0("Unexpected EOF of key data");
  191. goto err0;
  192. }
  193. /* Parse the key. */
  194. type = kh[KEYHEADER_OFFSET_TYPE];
  195. switch (type) {
  196. case CRYPTO_KEY_SIGN_PRIV:
  197. if ((keys & CRYPTO_KEYMASK_SIGN_PRIV) &&
  198. crypto_keys_subr_import_RSA_priv(
  199. (void**)&keycache.sign_priv, buf, len))
  200. goto err0;
  201. break;
  202. case CRYPTO_KEY_SIGN_PUB:
  203. if ((keys & CRYPTO_KEYMASK_SIGN_PUB) &&
  204. crypto_keys_subr_import_RSA_pub(
  205. (void**)&keycache.sign_pub, buf, len))
  206. goto err0;
  207. break;
  208. case CRYPTO_KEY_ENCR_PRIV:
  209. if ((keys & CRYPTO_KEYMASK_ENCR_PRIV) &&
  210. crypto_keys_subr_import_RSA_priv(
  211. (void**)&keycache.encr_priv, buf, len))
  212. goto err0;
  213. break;
  214. case CRYPTO_KEY_ENCR_PUB:
  215. if ((keys & CRYPTO_KEYMASK_ENCR_PUB) &&
  216. crypto_keys_subr_import_RSA_pub(
  217. (void**)&keycache.encr_pub, buf, len))
  218. goto err0;
  219. break;
  220. case CRYPTO_KEY_HMAC_FILE:
  221. if ((keys & CRYPTO_KEYMASK_HMAC_FILE) &&
  222. crypto_keys_subr_import_HMAC(
  223. &keycache.hmac_file, buf, len))
  224. goto err0;
  225. /*
  226. * There is normally only one "file hmac" key, used for
  227. * both signing blocks which are being written and
  228. * verifying blocks which are being read; but in
  229. * tarsnap-recrypt we download blocks from one machine
  230. * and verify them with one key before re-uploading
  231. * them signed with a different key. Consequently, the
  232. * tarsnap crypto code internally treats this as two
  233. * keys; and we set one or both to the key we're
  234. * reading from the key file depending on the flags we
  235. * were passed.
  236. */
  237. if ((keys & CRYPTO_KEYMASK_HMAC_FILE_WRITE) &&
  238. crypto_keys_subr_import_HMAC(
  239. &keycache.hmac_file_write, buf, len))
  240. goto err0;
  241. break;
  242. case CRYPTO_KEY_HMAC_CHUNK:
  243. if ((keys & CRYPTO_KEYMASK_HMAC_CHUNK) &&
  244. crypto_keys_subr_import_HMAC(
  245. &keycache.hmac_chunk, buf, len))
  246. goto err0;
  247. break;
  248. case CRYPTO_KEY_HMAC_NAME:
  249. if ((keys & CRYPTO_KEYMASK_HMAC_NAME) &&
  250. crypto_keys_subr_import_HMAC(
  251. &keycache.hmac_name, buf, len))
  252. goto err0;
  253. break;
  254. case CRYPTO_KEY_HMAC_CPARAMS:
  255. if ((keys & CRYPTO_KEYMASK_HMAC_CPARAMS) &&
  256. crypto_keys_subr_import_HMAC(
  257. &keycache.hmac_cparams, buf, len))
  258. goto err0;
  259. break;
  260. case CRYPTO_KEY_ROOT_PUB:
  261. if ((keys & CRYPTO_KEYMASK_ROOT_PUB) &&
  262. crypto_keys_subr_import_RSA_pub(
  263. (void**)&keycache.root_pub, buf, len))
  264. goto err0;
  265. break;
  266. case CRYPTO_KEY_AUTH_PUT:
  267. if ((keys & CRYPTO_KEYMASK_AUTH_PUT) &&
  268. crypto_keys_subr_import_HMAC(
  269. &keycache.auth_put, buf, len))
  270. goto err0;
  271. break;
  272. case CRYPTO_KEY_AUTH_GET:
  273. if ((keys & CRYPTO_KEYMASK_AUTH_GET) &&
  274. crypto_keys_subr_import_HMAC(
  275. &keycache.auth_get, buf, len))
  276. goto err0;
  277. break;
  278. case CRYPTO_KEY_AUTH_DELETE:
  279. if ((keys & CRYPTO_KEYMASK_AUTH_DELETE) &&
  280. crypto_keys_subr_import_HMAC(
  281. &keycache.auth_delete, buf, len))
  282. goto err0;
  283. break;
  284. default:
  285. warn0("Unrecognized key type: %d", type);
  286. goto err0;
  287. }
  288. /* Move on to the next key. */
  289. buf += len;
  290. buflen -= len;
  291. }
  292. /* Success! */
  293. return (0);
  294. err0:
  295. /* Failure! */
  296. return (-1);
  297. }
  298. /**
  299. * crypto_keys_missing(keys):
  300. * Look for the specified keys. If they are all present, return NULL; if
  301. * not, return a pointer to the name of one of the keys.
  302. */
  303. const char *
  304. crypto_keys_missing(int keys)
  305. {
  306. const char * keyname = NULL;
  307. int key;
  308. /*
  309. * Go through all the keys we know about and determine if (a) the key
  310. * is in the provided mask; and (b) if we do not have it.
  311. */
  312. for (key = 0; key < (int)(sizeof(int) * 8); key++)
  313. if ((keys >> key) & 1) {
  314. switch (key) {
  315. case CRYPTO_KEY_SIGN_PRIV:
  316. if (keycache.sign_priv == NULL)
  317. keyname = "archive signing";
  318. break;
  319. case CRYPTO_KEY_SIGN_PUB:
  320. if (keycache.sign_pub == NULL)
  321. keyname = "archive signature verification";
  322. break;
  323. case CRYPTO_KEY_ENCR_PRIV:
  324. if (keycache.encr_priv == NULL)
  325. keyname = "archive decryption";
  326. break;
  327. case CRYPTO_KEY_ENCR_PUB:
  328. if (keycache.encr_pub == NULL)
  329. keyname = "archive encryption";
  330. break;
  331. case CRYPTO_KEY_HMAC_FILE:
  332. if (keycache.hmac_file == NULL)
  333. keyname = "file HMAC";
  334. break;
  335. case CRYPTO_KEY_HMAC_FILE_WRITE:
  336. if (keycache.hmac_file_write == NULL)
  337. keyname = "file write HMAC";
  338. break;
  339. case CRYPTO_KEY_HMAC_CHUNK:
  340. if (keycache.hmac_chunk == NULL)
  341. keyname = "chunk HMAC";
  342. break;
  343. case CRYPTO_KEY_HMAC_NAME:
  344. if (keycache.hmac_name == NULL)
  345. keyname = "archive name HMAC";
  346. break;
  347. case CRYPTO_KEY_HMAC_CPARAMS:
  348. if (keycache.hmac_cparams == NULL)
  349. keyname = "chunk randomization";
  350. break;
  351. case CRYPTO_KEY_ROOT_PUB:
  352. if (keycache.root_pub == NULL)
  353. keyname = "server root";
  354. break;
  355. case CRYPTO_KEY_AUTH_PUT:
  356. if (keycache.auth_put == NULL)
  357. keyname = "write authorization";
  358. break;
  359. case CRYPTO_KEY_AUTH_GET:
  360. if (keycache.auth_get == NULL)
  361. keyname = "read authorization";
  362. break;
  363. case CRYPTO_KEY_AUTH_DELETE:
  364. if (keycache.auth_delete == NULL)
  365. keyname = "delete authorization";
  366. break;
  367. }
  368. }
  369. /* Return the key name or NULL if we have everything. */
  370. return (keyname);
  371. }
  372. /**
  373. * crypto_keys_export(keys, buf, buflen):
  374. * Export the ${keys} specified to a buffer allocated using malloc.
  375. */
  376. int
  377. crypto_keys_export(int keys, uint8_t ** buf, size_t * buflen)
  378. {
  379. uint8_t * kh;
  380. size_t bufpos;
  381. uint32_t len;
  382. int key;
  383. /* Compute the necessary buffer length. */
  384. *buflen = 0;
  385. for (key = 0; key < (int)(sizeof(int) * 8); key++)
  386. if ((keys >> key) & 1) {
  387. /* Determine the length needed for this key. */
  388. len = export_key(key, NULL, 0);
  389. if (len == (uint32_t)(-1))
  390. goto err0;
  391. /* Add to buffer length, making sure to avoid overflow. */
  392. if (*buflen > *buflen + len) {
  393. errno = ENOMEM;
  394. goto err0;
  395. }
  396. *buflen += len;
  397. if (*buflen > *buflen + KEYHEADER_LEN) {
  398. errno = ENOMEM;
  399. goto err0;
  400. }
  401. *buflen += KEYHEADER_LEN;
  402. }
  403. /* Allocate memory. */
  404. if ((*buf = malloc(*buflen)) == NULL)
  405. goto err0;
  406. /* Export keys. */
  407. bufpos = 0;
  408. for (key = 0; key < (int)(sizeof(int) * 8); key++)
  409. if ((keys >> key) & 1) {
  410. /* Sanity check remaining buffer length. */
  411. if (*buflen - bufpos < KEYHEADER_LEN) {
  412. warn0("Programmer error");
  413. goto err1;
  414. }
  415. /* Export key. */
  416. len = export_key(key,
  417. *buf + (bufpos + KEYHEADER_LEN),
  418. *buflen - (bufpos + KEYHEADER_LEN));
  419. if (len == (uint32_t)(-1))
  420. goto err1;
  421. /* Write key header. */
  422. kh = *buf + bufpos;
  423. le32enc(&kh[KEYHEADER_OFFSET_LEN], len);
  424. kh[KEYHEADER_OFFSET_TYPE] = key & 0xff;
  425. /* Advance buffer position. */
  426. bufpos += KEYHEADER_LEN + len;
  427. }
  428. /* Sanity-check -- we should have filled the buffer. */
  429. if (bufpos != *buflen) {
  430. warn0("Programmer error");
  431. goto err1;
  432. }
  433. /* Success! */
  434. return (0);
  435. err1:
  436. free(*buf);
  437. err0:
  438. /* Failure! */
  439. return (-1);
  440. }
  441. /**
  442. * crypto_keys_generate(keys):
  443. * Create the ${keys} specified.
  444. */
  445. int
  446. crypto_keys_generate(int keys)
  447. {
  448. /* Archive signing RSA key. */
  449. if (keys & CRYPTO_KEYMASK_SIGN_PRIV) {
  450. if ((keys & CRYPTO_KEYMASK_SIGN_PUB) == 0) {
  451. warn0("Cannot generate %s without %s",
  452. "private key", "public key");
  453. goto err0;
  454. }
  455. if (crypto_keys_subr_generate_RSA((void *)&keycache.sign_priv,
  456. (void *)&keycache.sign_pub))
  457. goto err0;
  458. keys &= ~CRYPTO_KEYMASK_SIGN_PRIV;
  459. keys &= ~CRYPTO_KEYMASK_SIGN_PUB;
  460. }
  461. if (keys & CRYPTO_KEYMASK_SIGN_PUB) {
  462. warn0("Cannot generate %s without %s",
  463. "public key", "private key");
  464. goto err0;
  465. }
  466. /* Encryption RSA key. */
  467. if (keys & CRYPTO_KEYMASK_ENCR_PRIV) {
  468. if ((keys & CRYPTO_KEYMASK_ENCR_PUB) == 0) {
  469. warn0("Cannot generate %s without %s",
  470. "private key", "public key");
  471. goto err0;
  472. }
  473. if (crypto_keys_subr_generate_RSA((void *)&keycache.encr_priv,
  474. (void *)&keycache.encr_pub))
  475. goto err0;
  476. keys &= ~CRYPTO_KEYMASK_ENCR_PRIV;
  477. keys &= ~CRYPTO_KEYMASK_ENCR_PUB;
  478. }
  479. if (keys & CRYPTO_KEYMASK_ENCR_PUB) {
  480. warn0("Cannot generate %s without %s",
  481. "public key", "private key");
  482. goto err0;
  483. }
  484. /* File HMAC key. */
  485. if (keys & CRYPTO_KEYMASK_HMAC_FILE) {
  486. if (crypto_keys_subr_generate_HMAC(&keycache.hmac_file))
  487. goto err0;
  488. keys &= ~CRYPTO_KEYMASK_HMAC_FILE;
  489. }
  490. /* Chunk HMAC key. */
  491. if (keys & CRYPTO_KEYMASK_HMAC_CHUNK) {
  492. if (crypto_keys_subr_generate_HMAC(&keycache.hmac_chunk))
  493. goto err0;
  494. keys &= ~CRYPTO_KEYMASK_HMAC_CHUNK;
  495. }
  496. /* Name HMAC key. */
  497. if (keys & CRYPTO_KEYMASK_HMAC_NAME) {
  498. if (crypto_keys_subr_generate_HMAC(&keycache.hmac_name))
  499. goto err0;
  500. keys &= ~CRYPTO_KEYMASK_HMAC_NAME;
  501. }
  502. /* Chunkification parameters HMAC key. */
  503. if (keys & CRYPTO_KEYMASK_HMAC_CPARAMS) {
  504. if (crypto_keys_subr_generate_HMAC(&keycache.hmac_cparams))
  505. goto err0;
  506. keys &= ~CRYPTO_KEYMASK_HMAC_CPARAMS;
  507. }
  508. /* Write transaction authorization key. */
  509. if (keys & CRYPTO_KEYMASK_AUTH_PUT) {
  510. if (crypto_keys_subr_generate_HMAC(&keycache.auth_put))
  511. goto err0;
  512. keys &= ~CRYPTO_KEYMASK_AUTH_PUT;
  513. }
  514. /* Read transaction authorization key. */
  515. if (keys & CRYPTO_KEYMASK_AUTH_GET) {
  516. if (crypto_keys_subr_generate_HMAC(&keycache.auth_get))
  517. goto err0;
  518. keys &= ~CRYPTO_KEYMASK_AUTH_GET;
  519. }
  520. /* Delete transaction authorization key. */
  521. if (keys & CRYPTO_KEYMASK_AUTH_DELETE) {
  522. if (crypto_keys_subr_generate_HMAC(&keycache.auth_delete))
  523. goto err0;
  524. keys &= ~CRYPTO_KEYMASK_AUTH_DELETE;
  525. }
  526. /* Anything left? */
  527. if (keys) {
  528. warn0("Unrecognized key types: %08x", keys);
  529. goto err0;
  530. }
  531. /* Success! */
  532. return (0);
  533. err0:
  534. /* Failure! */
  535. return (-1);
  536. }
  537. /**
  538. * crypto_keys_raw_export_auth(buf):
  539. * Write into the specified buffer the 32-byte write authorization key,
  540. * the 32-byte read authorization key, and the 32-byte delete authorization
  541. * key, in that order.
  542. */
  543. int
  544. crypto_keys_raw_export_auth(uint8_t buf[96])
  545. {
  546. uint32_t len;
  547. len = export_key(CRYPTO_KEY_AUTH_PUT, buf, 32);
  548. if (len == (uint32_t)(-1))
  549. goto err0;
  550. if (len != 32) {
  551. warn0("Programmer error: "
  552. "Incorrect HMAC key size: %u", (unsigned int)len);
  553. goto err0;
  554. }
  555. len = export_key(CRYPTO_KEY_AUTH_GET, buf + 32, 32);
  556. if (len == (uint32_t)(-1))
  557. goto err0;
  558. if (len != 32) {
  559. warn0("Programmer error: "
  560. "Incorrect HMAC key size: %u", (unsigned int)len);
  561. goto err0;
  562. }
  563. len = export_key(CRYPTO_KEY_AUTH_DELETE, buf + 64, 32);
  564. if (len == (uint32_t)(-1))
  565. goto err0;
  566. if (len != 32) {
  567. warn0("Programmer error: "
  568. "Incorrect HMAC key size: %u", (unsigned int)len);
  569. goto err0;
  570. }
  571. /* Success! */
  572. return (0);
  573. err0:
  574. /* Failure! */
  575. return (-1);
  576. }
  577. /**
  578. * crypto_keys_lookup_RSA(key):
  579. * Return the requested RSA key.
  580. */
  581. void *
  582. crypto_keys_lookup_RSA(int key)
  583. {
  584. RSA * rsa;
  585. /* Look up the key. */
  586. switch (key) {
  587. case CRYPTO_KEY_SIGN_PRIV:
  588. rsa = keycache.sign_priv;
  589. break;
  590. case CRYPTO_KEY_SIGN_PUB:
  591. rsa = keycache.sign_pub;
  592. break;
  593. case CRYPTO_KEY_ENCR_PRIV:
  594. rsa = keycache.encr_priv;
  595. break;
  596. case CRYPTO_KEY_ENCR_PUB:
  597. rsa = keycache.encr_pub;
  598. break;
  599. case CRYPTO_KEY_ROOT_PUB:
  600. rsa = keycache.root_pub;
  601. break;
  602. default:
  603. warn0("Programmer error: "
  604. "invalid key (%d) in crypto_keys_lookup_RSA", key);
  605. goto err0;
  606. }
  607. /* Make sure that we have the key. */
  608. if (rsa == NULL) {
  609. warn0("Programmer error: "
  610. "key %d not available in crypto_keys_lookup_RSA", key);
  611. goto err0;
  612. }
  613. /* Success! */
  614. return (rsa);
  615. err0:
  616. /* Failure! */
  617. return (NULL);
  618. }
  619. /**
  620. * crypto_keys_lookup_HMAC(key):
  621. * Return the requested HMAC key.
  622. */
  623. struct crypto_hmac_key *
  624. crypto_keys_lookup_HMAC(int key)
  625. {
  626. struct crypto_hmac_key * hkey;
  627. /* Look up the key. */
  628. switch (key) {
  629. case CRYPTO_KEY_HMAC_FILE:
  630. hkey = keycache.hmac_file;
  631. break;
  632. case CRYPTO_KEY_HMAC_FILE_WRITE:
  633. hkey = keycache.hmac_file_write;
  634. break;
  635. case CRYPTO_KEY_HMAC_CHUNK:
  636. hkey = keycache.hmac_chunk;
  637. break;
  638. case CRYPTO_KEY_HMAC_NAME:
  639. hkey = keycache.hmac_name;
  640. break;
  641. case CRYPTO_KEY_HMAC_CPARAMS:
  642. hkey = keycache.hmac_cparams;
  643. break;
  644. case CRYPTO_KEY_AUTH_PUT:
  645. hkey = keycache.auth_put;
  646. break;
  647. case CRYPTO_KEY_AUTH_GET:
  648. hkey = keycache.auth_get;
  649. break;
  650. case CRYPTO_KEY_AUTH_DELETE:
  651. hkey = keycache.auth_delete;
  652. break;
  653. default:
  654. warn0("Programmer error: "
  655. "invalid key (%d) in crypto_keys_lookup_HMAC", key);
  656. goto err0;
  657. }
  658. /* Make sure that we have the key. */
  659. if (hkey == NULL) {
  660. warn0("Programmer error: "
  661. "key %d not available in crypto_keys_lookup_HMAC", key);
  662. goto err0;
  663. }
  664. /* Success! */
  665. return (hkey);
  666. err0:
  667. /* Failure! */
  668. return (NULL);
  669. }