15 #include "pwmd-error.h"
22 #include "util-misc.h"
23 #include "util-string.h"
25 static uint8_t pwmd_magic
[5] = { '\177', 'P', 'W', 'M', 'D' };
28 set_header_defaults (file_header_t
* hdr
)
30 char *s
= config_get_string (NULL
, "cipher");
31 int flags
= cipher_string_to_cipher (s
);
34 memset (hdr
, 0, sizeof (file_header_t
));
35 memcpy (hdr
->magic
, pwmd_magic
, sizeof (hdr
->magic
));
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
;
44 hdr
->flags
|= PWMD_FLAG_PKCS
;
49 read_data_header (const char *filename
, file_header_t
* rhdr
,
50 struct stat
*rst
, int *rfd
)
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
);
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
;
95 read_data_file (const char *filename
, struct crypto_s
* crypto
)
103 cleanup_crypto_stage1 (crypto
);
104 rc
= read_data_header (filename
, &crypto
->hdr
, &st
, &fd
);
108 crypto
->ciphertext_len
= crypto
->hdr
.datalen
;
109 crypto
->ciphertext
= xmalloc (crypto
->hdr
.datalen
);
110 if (!crypto
->ciphertext
)
116 if (crypto
->hdr
.flags
& PWMD_FLAG_PKCS
)
118 rlen
= read (fd
, crypto
->grip
, 20);
121 rc
= rc
== -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA
;
125 rlen
= read (fd
, crypto
->sign_grip
, 20);
128 rc
= rc
== -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA
;
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
;
140 if (!(crypto
->hdr
.flags
& PWMD_FLAG_PKCS
))
144 rc
= GPG_ERR_NOT_IMPLEMENTED
;
148 return GPG_ERR_NOT_IMPLEMENTED
;
150 len
= st
.st_size
- sizeof (file_header_t
) - crypto
->hdr
.datalen
- 40;
158 rlen
= read (fd
, buf
, len
);
161 rc
= rc
== -1 ? gpg_error_from_syserror () : GPG_ERR_BAD_DATA
;
165 rc
= gcry_sexp_new (&crypto
->ciphertext_sexp
, buf
, rlen
, 1);
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
);
178 rc
= get_pubkey_bin (crypto
, crypto
->sign_grip
, &crypto
->sigpkey_sexp
);
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.
195 iterate_crypto_once (gcry_cipher_hd_t h
, unsigned char *inbuf
,
196 size_t insize
, size_t blocksize
, status_msg_t which
)
199 off_t len
= CRYPTO_BLOCKSIZE (blocksize
);
200 void *p
= gcry_malloc (len
);
202 unsigned char *inbuf2
;
205 return GPG_ERR_ENOMEM
;
207 if (insize
< CRYPTO_BLOCKSIZE (blocksize
))
210 pthread_cleanup_push (gcry_free
, p
);
214 inbuf2
= inbuf
+ total
;
217 if (len
+ total
> insize
)
220 if (which
== STATUS_ENCRYPT
)
221 rc
= gcry_cipher_encrypt (h
, p
, len
, inbuf2
, len
);
223 rc
= gcry_cipher_decrypt (h
, p
, len
, inbuf2
, len
);
229 memmove (tmp
, p
, len
);
234 #ifdef HAVE_PTHREAD_TESTCANCEL
235 pthread_testcancel ();
239 pthread_cleanup_pop (1);
244 cleanup_cipher (void *arg
)
246 gcry_cipher_close ((gcry_cipher_hd_t
) arg
);
250 decrypt_data (assuan_context_t ctx
, struct crypto_s
*crypto
,
251 unsigned char *salted_key
, size_t skeylen
)
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
);
260 uint64_t n
= crypto
->hdr
.iterations
;
263 gcry_sexp_t sig_sexp
;
265 if (crypto
->hdr
.flags
& PWMD_FLAG_PKCS
)
267 rc
= agent_extract_key (crypto
, &key
, &keylen
);
271 sig_sexp
= gcry_sexp_find_token (crypto
->ciphertext_sexp
, "sig-val", 0);
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
);
286 rc
= gcry_cipher_open (&h
, algo
, GCRY_CIPHER_MODE_CBC
, 0);
289 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_KEYLEN
, NULL
,
293 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_BLKLEN
, NULL
,
297 rc
= gcry_cipher_setiv (h
, crypto
->hdr
.iv
,
298 sizeof (crypto
->hdr
.iv
));
301 rc
= gcry_cipher_setkey (h
, key
, keylen
);
308 pthread_cleanup_push (cleanup_cipher
, rc
? NULL
: h
);
312 outbuf
= gcry_malloc (crypto
->hdr
.datalen
);
317 pthread_cleanup_push (gcry_free
, outbuf
);
319 pthread_cleanup_push (gcry_free
, key
);
324 memcpy (outbuf
, crypto
->ciphertext
, crypto
->hdr
.datalen
);
325 rc
= iterate_crypto_once (h
, outbuf
, crypto
->hdr
.datalen
, blocksize
,
330 rc
= gcry_cipher_setkey (h
, key
, keylen
);
336 progress
= config_get_long (NULL
, "cipher_progress");
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
);
355 rc
= gcry_cipher_setiv (h
, crypto
->hdr
.iv
, sizeof (crypto
->hdr
.iv
));
359 rc
= iterate_crypto_once (h
, outbuf
, crypto
->hdr
.datalen
, blocksize
,
363 if (!rc
&& ctx
&& crypto
->hdr
.iterations
)
364 rc
= send_status (ctx
, STATUS_DECRYPT
, "%llu %llu", n
,
365 crypto
->hdr
.iterations
);
368 pthread_cleanup_pop (0);
369 if (crypto
->hdr
.flags
& PWMD_FLAG_PKCS
)
376 pthread_cleanup_pop (rc
? 1 : 0); /* outbuf */
377 pthread_cleanup_pop (1); /* cipher */
380 char buf
[] = "<?xml ";
382 if (memcmp (outbuf
, buf
, sizeof(buf
)-1))
385 return gpg_error (GPG_ERR_BAD_PASSPHRASE
);
388 crypto
->plaintext
= outbuf
;
389 crypto
->plaintext_len
= crypto
->hdr
.datalen
;
396 decrypt_xml (struct crypto_s
* crypto
, const void *data
, size_t len
)
398 gcry_cipher_hd_t h
= NULL
;
401 rc
= gcry_cipher_open (&h
, GCRY_CIPHER_AES
, GCRY_CIPHER_MODE_CBC
, 0);
405 gcry_free (crypto
->plaintext
);
406 crypto
->plaintext
= gcry_malloc (len
);
407 if (!crypto
->plaintext
)
413 rc
= gcry_cipher_setiv (h
, cache_iv
, cache_blocksize
);
417 rc
= gcry_cipher_setkey (h
, cache_key
, cache_keysize
);
421 rc
= gcry_cipher_decrypt (h
, crypto
->plaintext
, len
, data
, len
);
422 if (rc
|| strncmp (crypto
->plaintext
, "<?xml ", 6))
425 rc
= GPG_ERR_BAD_DATA
;
427 gcry_free (crypto
->plaintext
);
428 crypto
->plaintext
= NULL
;
431 crypto
->plaintext_len
= len
;
435 gcry_cipher_close (h
);
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
,
448 size_t blocksize
, keysize
;
453 unsigned char *tmpkey
= NULL
;
454 int free_iv
= *(iv_len
) == 0;
456 rc
= gcry_cipher_open (&h
, algo
, GCRY_CIPHER_MODE_CBC
, 0);
460 pthread_cleanup_push (cleanup_cipher
, h
);
461 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_KEYLEN
, NULL
, &keysize
);
463 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_BLKLEN
, NULL
, &blocksize
);
465 if (!rc
&& *(iv_len
) == 0)
467 *(iv
) = xmalloc (blocksize
);
471 gcry_create_nonce (*(iv
), blocksize
);
474 pthread_cleanup_push (xfree
, *(iv_len
) == 0 ? *(iv
) : NULL
);
478 tmpkey
= gcry_malloc (keylen
);
483 pthread_cleanup_push (gcry_free
, tmpkey
);
487 memcpy (tmpkey
, key
, keylen
);
489 rc
= gcry_cipher_setkey (h
, tmpkey
, keylen
);
493 len
+= blocksize
- (len
% blocksize
);
499 inbuf
= gcry_malloc (len
);
504 pthread_cleanup_push (gcry_free
, inbuf
);
508 memset (inbuf
, 0, len
);
509 memcpy (inbuf
, xml
, olen
);
510 progress
= config_get_long (NULL
, "cipher_progress");
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
);
526 rc
= gcry_cipher_setiv (h
, *(iv
), blocksize
);
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
);
539 /* Do at least one iteration. */
540 rc
= gcry_cipher_setiv (h
, *(iv
), blocksize
);
543 rc
= gcry_cipher_setkey (h
, key
, keylen
);
545 rc
= iterate_crypto_once (h
, inbuf
, len
, blocksize
,
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
;
560 cleanup_save (struct save_s
*save
)
567 gcry_sexp_release (save
->pkey
);
570 gcry_sexp_release (save
->sigpkey
);
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. */
579 cleanup_crypto_stage1 (struct crypto_s
*cr
)
584 cleanup_save (&cr
->save
);
587 if (cr
->ciphertext_sexp
)
588 gcry_sexp_release (cr
->ciphertext_sexp
);
590 cr
->ciphertext_sexp
= NULL
;
593 gcry_free (cr
->plaintext
);
594 xfree (cr
->ciphertext
);
595 xfree (cr
->filename
);
597 cr
->ciphertext
= NULL
;
598 cr
->ciphertext_len
= 0;
599 cr
->plaintext
= NULL
;
600 cr
->plaintext_len
= 0;
604 cleanup_crypto_stage2 (struct crypto_s
*cr
)
609 cleanup_crypto_stage1 (cr
);
610 set_header_defaults (&cr
->hdr
);
614 cleanup_crypto (struct crypto_s
**c
)
616 struct crypto_s
*cr
= *c
;
621 cleanup_crypto_stage2 (cr
);
625 gcry_sexp_release (cr
->pkey_sexp
);
627 if (cr
->sigpkey_sexp
)
628 gcry_sexp_release (cr
->sigpkey_sexp
);
631 cleanup_agent (cr
->agent
);
639 init_client_crypto (struct crypto_s
**crypto
)
641 struct crypto_s
*new = xcalloc (1, sizeof (struct crypto_s
));
653 rc
= agent_init (&new->agent
);
656 rc
= send_agent_common_options (new->agent
);
658 rc
= agent_set_pinentry_options (new->agent
);
669 set_header_defaults (&new->hdr
);
675 export_common (assuan_context_t ctx
, struct crypto_s
* crypto
,
676 int no_passphrase
, const void *data
, size_t datalen
,
677 const char *outfile
, const char *keyfile
, void **rkey
,
678 size_t *rkeylen
, int use_cache
, int force
)
681 void *enc_xml
= NULL
;
682 size_t enc_xml_len
= 0;
683 unsigned char *iv
= NULL
;
685 int algo
= cipher_to_gcrypt (crypto
->save
.hdr
.flags
);
686 void *key
= NULL
, *salted_key
= NULL
;
687 size_t keysize
, keylen
;
690 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_KEYLEN
, NULL
, &keysize
);
701 if (stat (keyfile
, &st
) == -1)
702 return gpg_error_from_syserror ();
704 buf
= gcry_malloc (st
.st_size
);
706 return GPG_ERR_ENOMEM
;
708 fd
= open (keyfile
, O_RDONLY
);
710 rc
= gpg_error_from_syserror ();
713 len
= read (fd
, buf
, st
.st_size
);
714 if (len
!= st
.st_size
)
715 rc
= GPG_ERR_TOO_SHORT
;
723 log_write (_("Using passphrase obtained from file '%s'"), keyfile
);
730 cached
= cache_iscached (outfile
, NULL
) == 0;
733 struct cache_data_s
*cdata
= cache_get_data_filename (outfile
);
735 salted_key
= gcry_malloc (cdata
->keylen
);
738 memcpy (salted_key
, cdata
->key
, cdata
->keylen
);
739 keysize
= cdata
->keylen
;
752 struct crypto_s
*tmp
= NULL
;
753 gpg_error_t rc
= init_client_crypto (&tmp
);
757 rc
= read_data_file (outfile
, tmp
);
760 rc
= decrypt_common (tmp
, outfile
, (char **)&key
, &keylen
);
766 cleanup_crypto (&tmp
);
771 if (!use_cache
) // PASSWD
773 rc
= getpin_common (outfile
, PINENTRY_SAVE
, (char **)&key
, &keylen
);
788 salted_key
= gcry_malloc (keysize
);
792 return GPG_ERR_ENOMEM
;
795 gcry_create_nonce (crypto
->save
.hdr
.salt
, sizeof(crypto
->save
.hdr
.salt
));
796 rc
= gcry_kdf_derive(key
, keylen
, GCRY_KDF_ITERSALTED_S2K
, GCRY_MD_SHA1
,
797 crypto
->save
.hdr
.salt
, 8, DEFAULT_KDFS2K_ITERATIONS
,
798 keysize
, salted_key
);
803 rc
= encrypt_xml (ctx
, salted_key
, keysize
, algo
, data
, datalen
,
804 &enc_xml
, &enc_xml_len
, &iv
, &iv_len
,
805 crypto
->save
.hdr
.iterations
);
809 memcpy (crypto
->save
.hdr
.iv
, iv
, iv_len
);
811 crypto
->save
.hdr
.datalen
= enc_xml_len
;
812 rc
= write_file (crypto
, outfile
, enc_xml
, enc_xml_len
, NULL
, 0, NULL
,
819 memcpy (&crypto
->hdr
, &crypto
->save
.hdr
, sizeof (file_header_t
));
824 gcry_free (salted_key
);
831 cleanup_acl (void *arg
)
833 acl_t acl
= *(acl_t
*) arg
;
841 write_file (struct crypto_s
*crypto
, const char *filename
,
842 void *data
, size_t data_len
, void *sexp
, size_t sexp_len
,
843 void *pubkey
, void *sigpkey
)
845 char tmp
[FILENAME_MAX
] = { 0 };
857 if (lstat (filename
, &st
) == 0)
859 mode
= st
.st_mode
& (S_IRWXU
| S_IRWXG
| S_IRWXO
);
861 if (!(mode
& S_IWUSR
))
862 return GPG_ERR_EACCES
;
864 else if (errno
!= ENOENT
)
865 return gpg_error_from_syserror ();
867 snprintf (tmp
, sizeof (tmp
), "%s.XXXXXX", filename
);
871 rc
= gpg_error_from_syserror ();
872 log_write ("%s: %s", tmp
, pwmd_strerror (rc
));
878 // xml_import() or convert_file() from command line.
882 pthread_cleanup_push (cleanup_unlink_cb
, tmp
);
883 crypto
->save
.hdr
.version
= VERSION_HEX
;
884 len
= write (fd
, &crypto
->save
.hdr
, sizeof (file_header_t
));
885 if (len
== sizeof (file_header_t
))
887 if (crypto
->save
.hdr
.flags
& PWMD_FLAG_PKCS
)
889 unsigned char grip
[20];
891 gcry_pk_get_keygrip ((gcry_sexp_t
) pubkey
, grip
);
892 len
= write (fd
, grip
, sizeof (grip
));
893 if (len
== sizeof (grip
))
895 gcry_pk_get_keygrip ((gcry_sexp_t
) sigpkey
, grip
);
896 len
= write (fd
, grip
, sizeof (grip
));
897 if (len
== sizeof (grip
))
899 len
= write (fd
, data
, data_len
);
902 len
= write (fd
, sexp
, sexp_len
);
904 rc
= gpg_error_from_syserror ();
907 rc
= gpg_error_from_syserror ();
911 rc
= gpg_error_from_syserror ();
915 len
= write (fd
, data
, data_len
);
917 rc
= gpg_error_from_syserror ();
921 rc
= gpg_error_from_syserror ();
924 pthread_cleanup_push (cleanup_acl
, &acl
);
928 if (fsync (fd
) != -1)
930 if (filename
&& close (fd
) != -1)
933 acl
= acl_get_file (filename
, ACL_TYPE_ACCESS
);
934 if (!acl
&& errno
== ENOENT
)
935 acl
= acl_get_file (".", ACL_TYPE_DEFAULT
);
937 log_write ("ACL: %s: %s", filename
,
938 pwmd_strerror (gpg_error_from_syserror ()));
941 if (mode
&& config_get_boolean (filename
, "backup"))
943 char tmp2
[FILENAME_MAX
];
945 snprintf (tmp2
, sizeof (tmp2
), "%s.backup", filename
);
946 if (rename (filename
, tmp2
) == -1)
947 rc
= gpg_error_from_syserror ();
951 rc
= gpg_error_from_syserror ();
954 rc
= gpg_error_from_syserror ();
959 if (filename
&& rename (tmp
, filename
) != -1)
962 if (filename
&& mode
)
963 chmod (filename
, mode
);
966 if (acl
&& acl_set_file (filename
, ACL_TYPE_ACCESS
, acl
))
967 log_write ("ACL: %s: %s", filename
,
968 pwmd_strerror (gpg_error_from_syserror ()));
972 rc
= gpg_error_from_syserror ();
976 pthread_cleanup_pop (1);
978 pthread_cleanup_pop (rc
? 1 : 0); // unlink
983 change_passwd (const char *filename
, struct crypto_s
**rcrypto
)
985 unsigned char *key
= NULL
;
987 struct crypto_s
*crypto
= NULL
;
988 gpg_error_t rc
= init_client_crypto (&crypto
);
993 rc
= read_data_file (filename
, crypto
);
996 cleanup_crypto (&crypto
);
1000 rc
= decrypt_common (crypto
, filename
, (char **)&key
, &keylen
);
1005 cleanup_crypto (&crypto
);
1011 memcpy (&crypto
->save
.hdr
, &crypto
->hdr
, sizeof (file_header_t
));
1012 rc
= export_common (NULL
, crypto
, 0, crypto
->plaintext
,
1013 crypto
->plaintext_len
, crypto
->filename
, NULL
,
1014 (void **)&key
, &keylen
, 0, 0);
1021 rc
= save_common (filename
, crypto
, crypto
->plaintext
,
1022 crypto
->plaintext_len
, key
, keylen
, &cached
, 1);
1030 cleanup_crypto (&crypto
);
1036 // FIXME gcry_sexp_t is updated in cdata. make a temp var in case of failure.
1038 save_common (const char *filename
, struct crypto_s
*crypto
,
1039 const unsigned char *data
, size_t datalen
,
1040 const unsigned char *key
, size_t keylen
, int *cached
, int no_agent
)
1042 struct cache_data_s
*cdata
;
1045 /* This is safe since it is a fast operation. */
1047 pthread_cleanup_push (cleanup_cache_mutex
, NULL
);
1048 cdata
= cache_get_data_filename (filename
);
1049 *cached
= cdata
!= NULL
;
1052 cdata
= xcalloc (1, sizeof (struct cache_data_s
));
1055 if (use_agent
&& !no_agent
)
1057 /* Update in case of any --keygrip argument */
1059 gcry_sexp_release (cdata
->pubkey
);
1061 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->pubkey
, NULL
, "%S",
1065 gcry_sexp_release (cdata
->sigkey
);
1067 gcry_sexp_build ((gcry_sexp_t
*) & cdata
->sigkey
, NULL
, "%S",
1068 crypto
->sigpkey_sexp
);
1072 gcry_free (cdata
->doc
);
1074 cdata
->key
= (unsigned char *)key
;
1075 cdata
->keylen
= keylen
;
1076 rc
= encrypt_xml (NULL
, cache_key
, cache_keysize
, GCRY_CIPHER_AES
, data
,
1077 datalen
, &cdata
->doc
, &cdata
->doclen
, &cache_iv
,
1078 &cache_blocksize
, 0);
1081 unsigned char md5file
[16];
1083 gcry_md_hash_buffer (GCRY_MD_MD5
, md5file
, filename
, strlen (filename
));
1084 rc
= cache_set_data (md5file
, cdata
, crypto
->grip
);
1087 pthread_cleanup_pop (1); // mutex unlock
1092 getpin_common (const char *filename
, int which
, char **rkey
,
1096 struct pinentry_s
*pin
= pinentry_init (filename
);
1098 rc
= pinentry_getpin (pin
, rkey
, which
);
1099 pinentry_deinit (pin
);
1103 *rkeylen
= strlen (*rkey
);
1111 decrypt_common (struct crypto_s
*crypto
, const char *filename
, char **rkey
,
1116 gpg_error_t rc
= read_data_file (filename
, crypto
);
1120 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1124 key
= config_get_string (filename
, "passphrase");
1127 log_write (_("Trying the passphrase specified in config ..."));
1128 keylen
= strlen (key
);
1133 key
= config_get_string (filename
, "passphrase_file");
1136 int fd
= open ((char *) key
, O_RDONLY
);
1139 log_write (_("Trying the passphrase using file '%s' ..."), key
);
1142 log_write ("%s: %s", key
,
1143 pwmd_strerror (gpg_error_from_syserror ()));
1150 key
= xmalloc (st
.st_size
);
1153 if (read (fd
, key
, st
.st_size
) != st
.st_size
)
1155 log_write ("short read() count");
1156 rc
= GPG_ERR_TOO_SHORT
;
1160 rc
= GPG_ERR_ENOMEM
;
1166 log_write ("%s", pwmd_strerror (rc
));
1171 keylen
= st
.st_size
;
1175 if (!key
&& !IS_PKCS (crypto
))
1177 struct pinentry_s
*pin
= pinentry_init (filename
);
1178 unsigned char *salted_key
;
1180 int algo
= cipher_to_gcrypt (crypto
->hdr
.flags
);
1182 rc
= pinentry_getpin (pin
, &key
, PINENTRY_OPEN
);
1183 pinentry_deinit (pin
);
1186 log_write ("%s", pwmd_strerror (rc
));
1190 keylen
= strlen (key
);
1194 rc
= gcry_cipher_algo_info (algo
, GCRYCTL_GET_KEYLEN
, NULL
, &keysize
);
1201 salted_key
= xmalloc (keysize
);
1205 return GPG_ERR_ENOMEM
;
1208 rc
= gcry_kdf_derive(key
, keylen
, GCRY_KDF_ITERSALTED_S2K
, GCRY_MD_SHA1
,
1209 crypto
->hdr
.salt
, 8, DEFAULT_KDFS2K_ITERATIONS
,
1210 keysize
, salted_key
);
1212 key
= (char *)salted_key
;
1221 else if (key
&& IS_PKCS (crypto
))
1223 rc
= set_agent_passphrase (crypto
, key
, keylen
);
1227 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));
1233 xfree (crypto
->filename
);
1234 crypto
->filename
= str_dup (filename
);
1235 rc
= decrypt_data (NULL
, crypto
, (unsigned char *)key
, keylen
);
1238 log_write ("ERR %i: %s", rc
, pwmd_strerror (rc
));