Fix the "passphrase_file" and "passphrase" configuration parameters.
[pwmd.git] / src / crypto.c
blobeb82b34c9805ff71b178092d9c2c2fcd1d3bf2ea
1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 #include <errno.h>
11 #ifdef WITH_LIBACL
12 #include <sys/acl.h>
13 #endif
15 #include "pwmd-error.h"
16 #include "util-misc.h"
17 #include "common.h"
18 #include "rcfile.h"
19 #include "pinentry.h"
20 #include "crypto.h"
21 #include "cache.h"
22 #include "mem.h"
23 #include "util-string.h"
25 static uint8_t pwmd_magic[5] = { '\177', 'P', 'W', 'M', 'D' };
27 void
28 set_header_defaults (file_header_t * hdr)
30 char *s = config_get_string (NULL, "cipher");
31 int flags = cipher_string_to_cipher (s);
33 xfree (s);
34 memset (hdr, 0, sizeof (file_header_t));
35 memcpy (hdr->magic, pwmd_magic, sizeof (hdr->magic));
36 if (flags == -1)
37 log_write (_
38 ("Invalid 'cipher' in configuration file. Using a default of aes256."));
39 hdr->flags = flags == -1 ? PWMD_CIPHER_AES256 : flags;
40 hdr->version = VERSION_HEX;
42 #ifdef WITH_AGENT
43 if (use_agent)
44 hdr->flags |= PWMD_FLAG_PKCS;
45 #endif
48 gpg_error_t
49 read_data_header (const char *filename, file_header_t * rhdr,
50 struct stat *rst, int *rfd)
52 gpg_error_t rc = 0;
53 size_t len;
54 struct stat st;
55 file_header_t hdr;
56 int fd;
58 if (lstat (filename, &st) == -1)
59 return gpg_error_from_syserror ();
61 if (!S_ISREG (st.st_mode))
62 return GPG_ERR_ENOANO;
64 fd = open (filename, O_RDONLY);
65 if (fd == -1)
66 return gpg_error_from_syserror ();
68 len = read (fd, &hdr, sizeof (file_header_t));
69 if (len != sizeof (file_header_t))
70 rc = rc == -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA;
72 if (!rc && memcmp (hdr.magic, pwmd_magic, sizeof (hdr.magic)))
73 rc = GPG_ERR_BAD_DATA;
74 else if (hdr.version < 0x030000)
75 rc = GPG_ERR_UNKNOWN_VERSION;
77 if (rc)
78 close (fd);
79 else
81 if (rhdr)
82 *rhdr = hdr;
83 if (rst)
84 *rst = st;
85 if (rfd)
86 *rfd = fd;
87 else
88 close (fd);
91 return rc;
94 gpg_error_t
95 read_data_file (const char *filename, struct crypto_s * crypto)
97 int fd;
98 gpg_error_t rc = 0;
99 size_t len, rlen;
100 char *buf = NULL;
101 struct stat st;
103 cleanup_crypto_stage1 (crypto);
104 rc = read_data_header (filename, &crypto->hdr, &st, &fd);
105 if (rc)
106 return rc;
108 crypto->ciphertext_len = crypto->hdr.datalen;
109 crypto->ciphertext = xmalloc (crypto->hdr.datalen);
110 if (!crypto->ciphertext)
112 rc = GPG_ERR_ENOMEM;
113 goto fail;
116 if (crypto->hdr.flags & PWMD_FLAG_PKCS)
118 rlen = read (fd, crypto->grip, 20);
119 if (rlen != 20)
121 rc = rc == -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA;
122 goto fail;
125 rlen = read (fd, crypto->sign_grip, 20);
126 if (rlen != 20)
128 rc = rc == -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA;
129 goto fail;
133 len = read (fd, crypto->ciphertext, crypto->hdr.datalen);
134 if (len != crypto->hdr.datalen)
136 rc = rc == -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA;
137 goto fail;
140 if (!(crypto->hdr.flags & PWMD_FLAG_PKCS))
141 goto fail;
143 #ifndef WITH_AGENT
144 rc = GPG_ERR_NOT_IMPLEMENTED;
145 goto fail;
146 #else
147 if (!use_agent)
148 return GPG_ERR_NOT_IMPLEMENTED;
150 len = st.st_size - sizeof (file_header_t) - crypto->hdr.datalen - 40;
151 buf = xmalloc (len);
152 if (!buf)
154 rc = GPG_ERR_ENOMEM;
155 goto fail;
158 rlen = read (fd, buf, len);
159 if (rlen != len)
161 rc = rc == -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA;
162 goto fail;
165 rc = gcry_sexp_new (&crypto->ciphertext_sexp, buf, rlen, 1);
166 if (rc)
167 goto fail;
169 if (crypto->pkey_sexp)
170 gcry_sexp_release (crypto->pkey_sexp);
172 if (crypto->sigpkey_sexp)
173 gcry_sexp_release (crypto->sigpkey_sexp);
175 crypto->pkey_sexp = crypto->sigpkey_sexp = NULL;
176 rc = get_pubkey_bin (crypto, crypto->grip, &crypto->pkey_sexp);
177 if (!rc)
178 rc = get_pubkey_bin (crypto, crypto->sign_grip, &crypto->sigpkey_sexp);
179 #endif
181 fail:
182 close (fd);
183 xfree (buf);
184 return rc;
187 #define CRYPTO_BLOCKSIZE(c) (blocksize * 1024)
190 * Useful for a large amount of data. Rather than doing all of the data in one
191 * iteration do it in chunks. This lets the command be cancelable rather than
192 * waiting for it to complete.
194 static gpg_error_t
195 iterate_crypto_once (gcry_cipher_hd_t h, unsigned char *inbuf,
196 size_t insize, size_t blocksize, status_msg_t which)
198 gpg_error_t rc = 0;
199 off_t len = CRYPTO_BLOCKSIZE (blocksize);
200 void *p = gcry_malloc (len);
201 off_t total = 0;
202 unsigned char *inbuf2;
204 if (!p)
205 return GPG_ERR_ENOMEM;
207 if (insize < CRYPTO_BLOCKSIZE (blocksize))
208 len = insize;
210 pthread_cleanup_push (gcry_free, p);
212 for (;;)
214 inbuf2 = inbuf + total;
215 unsigned char *tmp;
217 if (len + total > insize)
218 len = blocksize;
220 if (which == STATUS_ENCRYPT)
221 rc = gcry_cipher_encrypt (h, p, len, inbuf2, len);
222 else
223 rc = gcry_cipher_decrypt (h, p, len, inbuf2, len);
225 if (rc)
226 break;
228 tmp = inbuf + total;
229 memmove (tmp, p, len);
230 total += len;
231 if (total >= insize)
232 break;
234 #ifdef HAVE_PTHREAD_TESTCANCEL
235 pthread_testcancel ();
236 #endif
239 pthread_cleanup_pop (1);
240 return rc;
243 static void
244 cleanup_cipher (void *arg)
246 gcry_cipher_close ((gcry_cipher_hd_t) arg);
249 gpg_error_t
250 decrypt_data (assuan_context_t ctx, struct crypto_s *crypto,
251 unsigned char *salted_key, size_t skeylen)
253 gpg_error_t rc = 0;
254 unsigned char *key = salted_key;
255 size_t keylen = skeylen;
256 gcry_cipher_hd_t h = NULL;
257 size_t blocksize, keysize = 0;
258 int algo = cipher_to_gcrypt (crypto->hdr.flags);
259 void *outbuf = NULL;
260 uint64_t n = crypto->hdr.iterations;
261 long progress = 0;
262 #ifdef WITH_AGENT
263 gcry_sexp_t sig_sexp;
265 if (crypto->hdr.flags & PWMD_FLAG_PKCS)
267 rc = agent_extract_key (crypto, &key, &keylen);
268 if (rc)
269 return rc;
271 sig_sexp = gcry_sexp_find_token (crypto->ciphertext_sexp, "sig-val", 0);
272 if (!sig_sexp)
274 gcry_free (key);
275 return GPG_ERR_BAD_DATA;
278 rc = agent_verify (crypto->sigpkey_sexp, sig_sexp, crypto->ciphertext,
279 crypto->ciphertext_len);
280 gcry_sexp_release (sig_sexp);
282 #endif
284 if (!rc)
286 rc = gcry_cipher_open (&h, algo, GCRY_CIPHER_MODE_CBC, 0);
287 if (!rc)
289 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_KEYLEN, NULL,
290 &keysize);
291 if (!rc)
293 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_BLKLEN, NULL,
294 &blocksize);
295 if (!rc)
297 rc = gcry_cipher_setiv (h, crypto->hdr.iv,
298 sizeof (crypto->hdr.iv));
299 if (!rc)
301 rc = gcry_cipher_setkey (h, key, keylen);
308 pthread_cleanup_push (cleanup_cipher, rc ? NULL : h);
310 if (!rc)
312 outbuf = gcry_malloc (crypto->hdr.datalen);
313 if (!outbuf)
314 rc = GPG_ERR_ENOMEM;
317 pthread_cleanup_push (gcry_free, outbuf);
318 #ifdef WITH_AGENT
319 pthread_cleanup_push (gcry_free, key);
320 #endif
322 if (!rc)
324 memcpy (outbuf, crypto->ciphertext, crypto->hdr.datalen);
325 rc = iterate_crypto_once (h, outbuf, crypto->hdr.datalen, blocksize,
326 STATUS_DECRYPT);
327 if (!rc)
329 key[0] ^= 1;
330 rc = gcry_cipher_setkey (h, key, keylen);
334 if (!rc)
336 progress = config_get_long (NULL, "cipher_progress");
337 if (progress == -1)
338 progress = strtol (DEFAULT_ITERATION_PROGRESS, NULL, 10);
341 if (!rc && ctx && crypto->hdr.iterations)
342 rc = send_status (ctx, STATUS_DECRYPT, "%llu %llu", 0,
343 crypto->hdr.iterations);
345 for (n = 0; !rc && n < crypto->hdr.iterations; n++)
347 if (ctx && !(n % progress))
349 rc = send_status (ctx, STATUS_DECRYPT, "%llu %llu", n,
350 crypto->hdr.iterations);
351 if (rc)
352 break;
355 rc = gcry_cipher_setiv (h, crypto->hdr.iv, sizeof (crypto->hdr.iv));
356 if (rc)
357 break;
359 rc = iterate_crypto_once (h, outbuf, crypto->hdr.datalen, blocksize,
360 STATUS_DECRYPT);
363 if (!rc && ctx && crypto->hdr.iterations)
364 rc = send_status (ctx, STATUS_DECRYPT, "%llu %llu", n,
365 crypto->hdr.iterations);
367 #ifdef WITH_AGENT
368 pthread_cleanup_pop (0);
369 if (crypto->hdr.flags & PWMD_FLAG_PKCS)
370 gcry_free (key);
371 else if (key)
372 key[0] ^= 1;
373 #else
374 key[0] ^= 1;
375 #endif
376 pthread_cleanup_pop (rc ? 1 : 0); /* outbuf */
377 pthread_cleanup_pop (1); /* cipher */
378 if (!rc)
380 char buf[] = "<?xml ";
382 if (memcmp (outbuf, buf, sizeof(buf)-1))
384 gcry_free (outbuf);
385 return gpg_error (GPG_ERR_BAD_PASSPHRASE);
388 crypto->plaintext = outbuf;
389 crypto->plaintext_len = crypto->hdr.datalen;
392 return rc;
395 gpg_error_t
396 decrypt_xml (struct crypto_s * crypto, const void *data, size_t len)
398 gcry_cipher_hd_t h = NULL;
399 gpg_error_t rc;
401 rc = gcry_cipher_open (&h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0);
402 if (rc)
403 return rc;
405 gcry_free (crypto->plaintext);
406 crypto->plaintext = gcry_malloc (len);
407 if (!crypto->plaintext)
409 rc = GPG_ERR_ENOMEM;
410 goto done;
413 rc = gcry_cipher_setiv (h, cache_iv, cache_blocksize);
414 if (rc)
415 goto done;
417 rc = gcry_cipher_setkey (h, cache_key, cache_keysize);
418 if (rc)
419 goto done;
421 rc = gcry_cipher_decrypt (h, crypto->plaintext, len, data, len);
422 if (rc || strncmp (crypto->plaintext, "<?xml ", 6))
424 if (!rc)
425 rc = GPG_ERR_BAD_DATA;
427 gcry_free (crypto->plaintext);
428 crypto->plaintext = NULL;
431 crypto->plaintext_len = len;
433 done:
434 if (h)
435 gcry_cipher_close (h);
437 return rc;
440 gpg_error_t
441 encrypt_xml (assuan_context_t ctx, void *key, size_t keylen,
442 int algo, const void *xml, size_t len, void * *result,
443 size_t *result_len, unsigned char **iv, size_t * iv_len,
444 uint64_t iter)
446 gpg_error_t rc;
447 gcry_cipher_hd_t h;
448 size_t blocksize, keysize;
449 void *inbuf = NULL;
450 size_t olen = len;
451 uint64_t n = 0;
452 long progress;
453 unsigned char *tmpkey = NULL;
454 int free_iv = *(iv_len) == 0;
456 rc = gcry_cipher_open (&h, algo, GCRY_CIPHER_MODE_CBC, 0);
457 if (rc)
458 return rc;
460 pthread_cleanup_push (cleanup_cipher, h);
461 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_KEYLEN, NULL, &keysize);
462 if (!rc)
463 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_BLKLEN, NULL, &blocksize);
465 if (!rc && *(iv_len) == 0)
467 *(iv) = xmalloc (blocksize);
468 if (!*(iv))
469 rc = GPG_ERR_ENOMEM;
471 gcry_create_nonce (*(iv), blocksize);
474 pthread_cleanup_push (xfree, *(iv_len) == 0 ? *(iv) : NULL);
475 if (!rc)
477 *iv_len = blocksize;
478 tmpkey = gcry_malloc (keylen);
479 if (!tmpkey)
480 rc = GPG_ERR_ENOMEM;
483 pthread_cleanup_push (gcry_free, tmpkey);
485 if (!rc)
487 memcpy (tmpkey, key, keylen);
488 tmpkey[0] ^= 1;
489 rc = gcry_cipher_setkey (h, tmpkey, keylen);
490 if (!rc)
492 if (len % blocksize)
493 len += blocksize - (len % blocksize);
497 if (!rc)
499 inbuf = gcry_malloc (len);
500 if (!inbuf)
501 rc = GPG_ERR_ENOMEM;
504 pthread_cleanup_push (gcry_free, inbuf);
506 if (!rc)
508 memset (inbuf, 0, len);
509 memcpy (inbuf, xml, olen);
510 progress = config_get_long (NULL, "cipher_progress");
511 if (progress == -1)
512 progress = strtol (DEFAULT_ITERATION_PROGRESS, NULL, 10);
514 if (!rc && ctx && iter)
515 rc = send_status (ctx, STATUS_ENCRYPT, "%llu %llu", 0, iter);
517 for (n = 0; !rc && n < iter; n++)
519 if (ctx && !(n % progress))
521 rc = send_status (ctx, STATUS_ENCRYPT, "%llu %llu", n, iter);
522 if (rc)
523 break;
526 rc = gcry_cipher_setiv (h, *(iv), blocksize);
527 if (rc)
528 break;
530 rc = iterate_crypto_once (h, inbuf, len, blocksize, STATUS_ENCRYPT);
534 if (!rc && ctx && iter)
535 rc = send_status (ctx, STATUS_ENCRYPT, "%llu %llu", n, iter);
537 if (!rc)
539 /* Do at least one iteration. */
540 rc = gcry_cipher_setiv (h, *(iv), blocksize);
541 if (!rc)
543 rc = gcry_cipher_setkey (h, key, keylen);
544 if (!rc)
545 rc = iterate_crypto_once (h, inbuf, len, blocksize,
546 STATUS_ENCRYPT);
550 pthread_cleanup_pop (rc ? 1 : 0); /* inbuf */
551 pthread_cleanup_pop (1); /* tmpkey */
552 pthread_cleanup_pop (rc && free_iv ? 1 : 0); /* iv */
553 pthread_cleanup_pop (1); /* cipher */
554 *result = rc ? NULL : inbuf;
555 *result_len = len;
556 return rc;
559 void
560 cleanup_save (struct save_s *save)
562 if (!save)
563 return;
565 #ifdef WITH_AGENT
566 if (save->pkey)
567 gcry_sexp_release (save->pkey);
569 if (save->sigpkey)
570 gcry_sexp_release (save->sigpkey);
571 #endif
573 memset (save, 0, sizeof (struct save_s));
576 /* Keep the agent ctx to retain pinentry options which will be freed in
577 * cleanup_cb(). Also keep .pubkey since it may be needed for a SAVE. */
578 void
579 cleanup_crypto_stage1 (struct crypto_s *cr)
581 if (!cr)
582 return;
584 cleanup_save (&cr->save);
586 #ifdef WITH_AGENT
587 if (cr->ciphertext_sexp)
588 gcry_sexp_release (cr->ciphertext_sexp);
590 cr->ciphertext_sexp = NULL;
591 #endif
593 gcry_free (cr->plaintext);
594 xfree (cr->ciphertext);
595 xfree (cr->filename);
596 cr->filename = NULL;
597 cr->ciphertext = NULL;
598 cr->ciphertext_len = 0;
599 cr->plaintext = NULL;
600 cr->plaintext_len = 0;
603 void
604 cleanup_crypto_stage2 (struct crypto_s *cr)
606 if (!cr)
607 return;
609 cleanup_crypto_stage1 (cr);
610 set_header_defaults (&cr->hdr);
613 void
614 cleanup_crypto (struct crypto_s **c)
616 struct crypto_s *cr = *c;
618 if (!cr)
619 return;
621 cleanup_crypto_stage2 (cr);
623 #ifdef WITH_AGENT
624 if (cr->pkey_sexp)
625 gcry_sexp_release (cr->pkey_sexp);
627 if (cr->sigpkey_sexp)
628 gcry_sexp_release (cr->sigpkey_sexp);
630 if (cr->agent)
631 cleanup_agent (cr->agent);
632 #endif
634 xfree (cr);
635 *c = NULL;
638 gpg_error_t
639 init_client_crypto (struct crypto_s **crypto)
641 struct crypto_s *new = xcalloc (1, sizeof (struct crypto_s));
642 gpg_error_t rc;
644 if (!new)
646 rc = GPG_ERR_ENOMEM;
647 return rc;
650 #ifdef WITH_AGENT
651 if (use_agent)
653 rc = agent_init (&new->agent);
654 if (!rc)
656 rc = send_agent_common_options (new->agent);
657 if (!rc)
658 rc = agent_set_pinentry_options (new->agent);
661 if (rc)
663 xfree (new);
664 return rc;
667 #endif
669 set_header_defaults (&new->hdr);
670 *crypto = new;
671 return 0;
674 gpg_error_t
675 export_common (assuan_context_t ctx, int inquire, struct crypto_s * crypto,
676 const void *data, size_t datalen, const char *outfile,
677 const char *keyfile, void **rkey, size_t *rkeylen,
678 int use_cache, int force)
680 gpg_error_t rc = 0;
681 void *enc_xml = NULL;
682 size_t enc_xml_len = 0;
683 unsigned char *iv = NULL;
684 size_t iv_len = 0;
685 int algo = cipher_to_gcrypt (crypto->save.hdr.flags);
686 void *key = NULL, *salted_key = NULL;
687 size_t keysize, keylen;
688 int cached = 0;
690 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_KEYLEN, NULL, &keysize);
691 if (rc)
692 return rc;
694 if (keyfile)
696 int fd;
697 unsigned char *buf;
698 size_t len;
699 struct stat st;
701 if (stat (keyfile, &st) == -1)
702 return gpg_error_from_syserror ();
704 buf = gcry_malloc (st.st_size);
705 if (!buf)
706 return GPG_ERR_ENOMEM;
708 fd = open (keyfile, O_RDONLY);
709 if (fd == -1)
710 rc = gpg_error_from_syserror ();
711 else
713 len = read (fd, buf, st.st_size);
714 if (len != st.st_size)
715 rc = GPG_ERR_TOO_SHORT;
718 if (fd != -1)
719 close (fd);
721 key = buf;
722 keylen = st.st_size;
723 log_write (_("Using passphrase obtained from file '%s'"), keyfile);
725 if (!keylen)
727 char *tmp;
729 gcry_free (key);
730 tmp = gcry_malloc (1);
731 *tmp = 0;
732 key = tmp;
733 keylen++;
736 else
738 if (use_cache)
740 cache_lock ();
741 cached = cache_iscached (outfile, NULL) == 0;
742 if (cached)
744 struct cache_data_s *cdata = cache_get_data_filename (outfile);
746 salted_key = gcry_malloc (cdata->keylen);
747 if (salted_key)
749 memcpy (salted_key, cdata->key, cdata->keylen);
750 keysize = cdata->keylen;
752 else
753 rc = GPG_ERR_ENOMEM;
756 cache_unlock ();
759 if (!rc && !cached)
761 if (force) // SAVE
763 struct crypto_s *tmp = NULL;
764 gpg_error_t rc = init_client_crypto (&tmp);
766 if (!rc)
768 rc = read_data_file (outfile, tmp);
769 if (!rc)
771 rc = decrypt_common (ctx, inquire, tmp, outfile,
772 (char **)&key, &keylen);
773 if (rc)
774 gcry_free (key);
778 cleanup_crypto (&tmp);
779 if (rc && gpg_err_code (rc) == GPG_ERR_ENOENT)
780 use_cache = 0;
781 else if (rc)
782 return rc;
785 if (!use_cache) // PASSWD or new file
787 gcry_free (key);
788 if (inquire)
790 rc = inquire_passphrase (ctx, "NEW_PASSPHRASE",
791 (unsigned char **)&key, &keylen);
793 else
795 rc = getpin_common (outfile, PINENTRY_SAVE, (char **)&key,
796 &keylen);
799 if (rc)
800 return rc;
802 else
804 salted_key = key;
805 keysize = keylen;
806 cached = 1;
811 if (!rc && !cached)
813 rc = hash_key (algo, crypto->save.hdr.salt,
814 sizeof(crypto->save.hdr.salt), key, keylen, &salted_key,
815 &keysize);
816 gcry_free (key);
819 if (!rc)
820 rc = encrypt_xml (ctx, salted_key, keysize, algo, data, datalen,
821 &enc_xml, &enc_xml_len, &iv, &iv_len,
822 crypto->save.hdr.iterations);
824 if (!rc)
826 memcpy (crypto->save.hdr.iv, iv, iv_len);
827 xfree (iv);
828 crypto->save.hdr.datalen = enc_xml_len;
829 rc = write_file (crypto, outfile, enc_xml, enc_xml_len, NULL, 0, NULL,
830 NULL);
831 gcry_free (enc_xml);
832 if (!rc)
834 *rkey = salted_key;
835 *rkeylen = keysize;
836 memcpy (&crypto->hdr, &crypto->save.hdr, sizeof (file_header_t));
840 if (rc)
841 gcry_free (salted_key);
843 return rc;
846 #ifdef WITH_LIBACL
847 static void
848 cleanup_acl (void *arg)
850 acl_t acl = *(acl_t *) arg;
852 if (acl)
853 acl_free (acl);
855 #endif
857 gpg_error_t
858 write_file (struct crypto_s *crypto, const char *filename,
859 void *data, size_t data_len, void *sexp, size_t sexp_len,
860 void *pubkey, void *sigpkey)
862 char tmp[FILENAME_MAX] = { 0 };
863 mode_t mode = 0;
864 struct stat st;
865 int fd;
866 gpg_error_t rc = 0;
867 size_t len;
868 #ifdef WITH_LIBACL
869 acl_t acl = NULL;
870 #endif
872 if (filename)
874 if (lstat (filename, &st) == 0)
876 mode = st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
878 if (!(mode & S_IWUSR))
879 return GPG_ERR_EACCES;
881 else if (errno != ENOENT)
882 return gpg_error_from_syserror ();
884 snprintf (tmp, sizeof (tmp), "%s.XXXXXX", filename);
885 fd = mkstemp (tmp);
886 if (fd == -1)
888 rc = gpg_error_from_syserror ();
889 log_write ("%s: %s", tmp, pwmd_strerror (rc));
890 return rc;
893 else
895 // xml_import() or convert_file() from command line.
896 fd = STDOUT_FILENO;
899 pthread_cleanup_push (cleanup_unlink_cb, tmp);
900 crypto->save.hdr.version = VERSION_HEX;
901 len = write (fd, &crypto->save.hdr, sizeof (file_header_t));
902 if (len == sizeof (file_header_t))
904 if (crypto->save.hdr.flags & PWMD_FLAG_PKCS)
906 unsigned char grip[20];
908 gcry_pk_get_keygrip ((gcry_sexp_t) pubkey, grip);
909 len = write (fd, grip, sizeof (grip));
910 if (len == sizeof (grip))
912 gcry_pk_get_keygrip ((gcry_sexp_t) sigpkey, grip);
913 len = write (fd, grip, sizeof (grip));
914 if (len == sizeof (grip))
916 len = write (fd, data, data_len);
917 if (len == data_len)
919 len = write (fd, sexp, sexp_len);
920 if (len != sexp_len)
921 rc = gpg_error_from_syserror ();
923 else
924 rc = gpg_error_from_syserror ();
927 else
928 rc = gpg_error_from_syserror ();
930 else
932 len = write (fd, data, data_len);
933 if (len != data_len)
934 rc = gpg_error_from_syserror ();
937 else
938 rc = gpg_error_from_syserror ();
940 #ifdef WITH_LIBACL
941 pthread_cleanup_push (cleanup_acl, &acl);
942 #endif
943 if (!rc)
945 if (fsync (fd) != -1)
947 if (filename && close (fd) != -1)
949 #ifdef WITH_LIBACL
950 acl = acl_get_file (filename, ACL_TYPE_ACCESS);
951 if (!acl && errno == ENOENT)
952 acl = acl_get_file (".", ACL_TYPE_DEFAULT);
953 if (!acl)
954 log_write ("ACL: %s: %s", filename,
955 pwmd_strerror (gpg_error_from_syserror ()));
956 #endif
958 if (mode && config_get_boolean (filename, "backup"))
960 char tmp2[FILENAME_MAX];
962 snprintf (tmp2, sizeof (tmp2), "%s.backup", filename);
963 if (rename (filename, tmp2) == -1)
964 rc = gpg_error_from_syserror ();
967 else if (filename)
968 rc = gpg_error_from_syserror ();
970 else
971 rc = gpg_error_from_syserror ();
974 if (!rc)
976 if (filename && rename (tmp, filename) != -1)
978 tmp[0] = 0;
979 if (filename && mode)
980 chmod (filename, mode);
982 #ifdef WITH_LIBACL
983 if (acl && acl_set_file (filename, ACL_TYPE_ACCESS, acl))
984 log_write ("ACL: %s: %s", filename,
985 pwmd_strerror (gpg_error_from_syserror ()));
986 #endif
988 else
989 rc = gpg_error_from_syserror ();
992 #ifdef WITH_LIBACL
993 pthread_cleanup_pop (1);
994 #endif
995 pthread_cleanup_pop (rc ? 1 : 0); // unlink
996 return rc;
999 gpg_error_t
1000 hash_key (int algo, unsigned char *salt, size_t salt_len, const void *key,
1001 size_t keylen, void **result, size_t *rlen)
1003 gpg_error_t rc;
1004 void *tmp;
1006 rc = gcry_cipher_algo_info (algo, GCRYCTL_GET_KEYLEN, NULL, rlen);
1007 if (rc)
1008 return rc;
1010 tmp = xmalloc (*rlen);
1011 if (!tmp)
1012 return GPG_ERR_ENOMEM;
1014 rc = gcry_kdf_derive(key, keylen, GCRY_KDF_ITERSALTED_S2K, GCRY_MD_SHA1,
1015 salt, salt_len, DEFAULT_KDFS2K_ITERATIONS, *rlen, tmp);
1016 if (!rc)
1017 *result = tmp;
1018 else
1019 xfree (tmp);
1021 return rc;
1024 gpg_error_t
1025 change_passwd (assuan_context_t ctx, const char *filename, int inquire,
1026 struct crypto_s **rcrypto)
1028 unsigned char *key = NULL;
1029 size_t keylen = 0;
1030 struct crypto_s *crypto = NULL;
1031 gpg_error_t rc = init_client_crypto (&crypto);
1033 if (rc)
1034 return rc;
1036 crypto->client_ctx = ctx;
1037 rc = read_data_file (filename, crypto);
1038 if (rc)
1040 cleanup_crypto (&crypto);
1041 return rc;
1044 rc = decrypt_common (ctx, inquire, crypto, filename, (char **)&key, &keylen);
1045 gcry_free (key);
1046 key = NULL;
1047 if (rc)
1049 cleanup_crypto (&crypto);
1050 return rc;
1053 if (!rc)
1055 memcpy (&crypto->save.hdr, &crypto->hdr, sizeof (file_header_t));
1056 rc = export_common (ctx, inquire, crypto, crypto->plaintext,
1057 crypto->plaintext_len, crypto->filename, NULL,
1058 (void **)&key, &keylen, 0, 0);
1061 if (!rc)
1063 int cached;
1065 rc = save_common (filename, crypto, crypto->plaintext,
1066 crypto->plaintext_len, key, keylen, &cached, 1);
1067 if (!rc)
1068 *rcrypto = crypto;
1071 if (rc)
1073 gcry_free (key);
1074 cleanup_crypto (&crypto);
1077 return rc;
1080 // FIXME gcry_sexp_t is updated in cdata. make a temp var in case of failure.
1081 gpg_error_t
1082 save_common (const char *filename, struct crypto_s *crypto,
1083 const unsigned char *data, size_t datalen,
1084 const unsigned char *key, size_t keylen, int *cached, int no_agent)
1086 struct cache_data_s *cdata;
1087 gpg_error_t rc;
1089 /* This is safe since it is a fast operation. */
1090 cache_lock ();
1091 pthread_cleanup_push (cleanup_cache_mutex, NULL);
1092 cdata = cache_get_data_filename (filename);
1093 *cached = cdata != NULL;
1095 if (!cdata)
1096 cdata = xcalloc (1, sizeof (struct cache_data_s));
1098 #ifdef WITH_AGENT
1099 if (use_agent && !no_agent)
1101 /* Update in case of any --keygrip argument */
1102 if (cdata->pubkey)
1103 gcry_sexp_release (cdata->pubkey);
1105 gcry_sexp_build ((gcry_sexp_t *) & cdata->pubkey, NULL, "%S",
1106 crypto->pkey_sexp);
1108 if (cdata->sigkey)
1109 gcry_sexp_release (cdata->sigkey);
1111 gcry_sexp_build ((gcry_sexp_t *) & cdata->sigkey, NULL, "%S",
1112 crypto->sigpkey_sexp);
1114 #endif
1116 gcry_free (cdata->doc);
1117 cdata->doc = NULL;
1118 cdata->key = (unsigned char *)key;
1119 cdata->keylen = keylen;
1120 rc = encrypt_xml (NULL, cache_key, cache_keysize, GCRY_CIPHER_AES, data,
1121 datalen, &cdata->doc, &cdata->doclen, &cache_iv,
1122 &cache_blocksize, 0);
1123 if (!rc)
1125 unsigned char md5file[16];
1127 gcry_md_hash_buffer (GCRY_MD_MD5, md5file, filename, strlen (filename));
1128 rc = cache_set_data (md5file, cdata, crypto->grip);
1131 pthread_cleanup_pop (1); // mutex unlock
1132 return rc;
1135 gpg_error_t
1136 getpin_common (const char *filename, int which, char **rkey,
1137 size_t *rkeylen)
1139 gpg_error_t rc;
1140 struct pinentry_s *pin = pinentry_init (filename);
1142 rc = pinentry_getpin (pin, rkey, which);
1143 pinentry_deinit (pin);
1144 if (rc)
1145 return rc;
1147 *rkeylen = strlen (*rkey);
1148 if (!(*rkeylen))
1149 (*rkeylen)++;
1151 return rc;
1154 /* Note: 'key' is freed with gcry_free() and not xfree(). Although
1155 * both call xfree(). */
1156 gpg_error_t
1157 inquire_passphrase (assuan_context_t ctx, const char *keyword,
1158 unsigned char **result, size_t *rlen)
1160 gpg_error_t rc;
1162 assuan_begin_confidential (ctx);
1163 rc = assuan_inquire (ctx, keyword, result, rlen, 0);
1164 assuan_end_confidential (ctx);
1165 return rc;
1168 gpg_error_t
1169 decrypt_common (assuan_context_t ctx, int inquire, struct crypto_s *crypto,
1170 const char *filename, char **rkey, size_t *rkeylen)
1172 char *key = NULL;
1173 size_t keylen = 0;
1174 gpg_error_t rc = read_data_file (filename, crypto);
1175 int algo = cipher_to_gcrypt (crypto->hdr.flags);
1176 void *salted_key = NULL;
1177 size_t keysize = 0;
1179 if (rc)
1181 log_write ("ERR %i: %s", rc, pwmd_strerror (rc));
1182 return rc;
1185 key = config_get_string (filename, "passphrase");
1186 if (key)
1188 log_write (_("Trying the passphrase specified in config ..."));
1189 keylen = strlen (key);
1192 if (!key)
1194 key = config_get_string (filename, "passphrase_file");
1195 if (key)
1197 char *tmp = expand_homedir (key);
1198 int fd;
1199 struct stat st;
1201 xfree (key);
1202 key = tmp;
1203 log_write (_("Trying the passphrase using file '%s' ..."), key);
1204 fd = open (key, O_RDONLY);
1205 if (fd == -1)
1207 log_write ("%s: %s", key,
1208 pwmd_strerror (gpg_error_from_syserror ()));
1209 xfree (key);
1210 return rc;
1213 stat (key, &st);
1214 xfree (key);
1215 key = xmalloc (st.st_size);
1216 if (key)
1218 if (read (fd, key, st.st_size) != st.st_size)
1220 log_write ("short read() count");
1221 rc = GPG_ERR_TOO_SHORT;
1224 else
1225 rc = GPG_ERR_ENOMEM;
1227 close (fd);
1229 if (rc)
1231 log_write ("%s", pwmd_strerror (rc));
1232 xfree (key);
1233 return rc;
1236 keylen = st.st_size;
1237 if (!keylen)
1239 tmp = xmalloc (1);
1240 *tmp = 0;
1241 xfree (key);
1242 key = tmp;
1243 keylen++;
1248 if (!key && !IS_PKCS (crypto) && inquire)
1250 rc = inquire_passphrase (ctx, "PASSPHRASE", (unsigned char **)&key,
1251 &keylen);
1252 if (rc)
1254 log_write ("ERR %i: %s", rc, pwmd_strerror (rc));
1255 return rc;
1258 if (!keylen)
1259 keylen++;
1261 else if (!key && !IS_PKCS (crypto))
1263 struct pinentry_s *pin = pinentry_init (filename);
1265 rc = pinentry_getpin (pin, &key, PINENTRY_OPEN);
1266 pinentry_deinit (pin);
1267 if (rc)
1269 log_write ("%s", pwmd_strerror (rc));
1270 return rc;
1273 keylen = strlen (key);
1274 if (!keylen)
1275 keylen++;
1277 #ifdef WITH_AGENT
1278 else if (key && IS_PKCS (crypto))
1280 rc = set_agent_passphrase (crypto, key, keylen);
1281 if (rc)
1283 xfree (key);
1284 log_write ("ERR %i: %s", rc, pwmd_strerror (rc));
1285 return rc;
1288 #endif
1290 if (key && !IS_PKCS (crypto))
1292 rc = hash_key (algo, crypto->hdr.salt, sizeof(crypto->hdr.salt), key,
1293 keylen, &salted_key, &keysize);
1294 xfree (key);
1295 key = (char *)salted_key;
1296 keylen = keysize;
1297 if (rc)
1299 xfree (salted_key);
1300 return rc;
1304 xfree (crypto->filename);
1305 crypto->filename = str_dup (filename);
1306 rc = decrypt_data (NULL, crypto, (unsigned char *)key, keylen);
1307 if (rc)
1309 log_write ("ERR %i: %s", rc, pwmd_strerror (rc));
1310 xfree (key);
1312 else
1314 *rkey = key;
1315 *rkeylen = keylen;
1318 return rc;