/* read any gpg config file */ static int conffile(netpgp_t *netpgp, char *homedir, char *userid, size_t length) { regmatch_t matchv[10]; regex_t keyre; char buf[BUFSIZ]; FILE *fp; __OPS_USED(netpgp); (void) snprintf(buf, sizeof(buf), "%s/gpg.conf", homedir); if ((fp = fopen(buf, "r")) == NULL) { return 0; } (void) memset(&keyre, 0x0, sizeof(keyre)); (void) regcomp(&keyre, "^[ \t]*default-key[ \t]+([0-9a-zA-F]+)", REG_EXTENDED); while (fgets(buf, (int)sizeof(buf), fp) != NULL) { if (regexec(&keyre, buf, 10, matchv, 0) == 0) { (void) memcpy(userid, &buf[(int)matchv[1].rm_so], MIN((unsigned)(matchv[1].rm_eo - matchv[1].rm_so), length)); if (netpgp->passfp == NULL) { (void) fprintf(stderr, "netpgp: default key set to \"%.*s\"\n", (int)(matchv[1].rm_eo - matchv[1].rm_so), &buf[(int)matchv[1].rm_so]); } } } (void) fclose(fp); regfree(&keyre); return 1; }
/* this interface isn't right - hook into callback for getting passphrase */ char * __ops_export_key(__ops_io_t *io, const __ops_key_t *keydata, uint8_t *passphrase) { __ops_output_t *output; __ops_memory_t *mem; char *cp; __OPS_USED(io); __ops_setup_memory_write(&output, &mem, 128); if (keydata->type == OPS_PTAG_CT_PUBLIC_KEY) { __ops_write_xfer_pubkey(output, keydata, 1); } else { __ops_write_xfer_seckey(output, keydata, passphrase, strlen((char *)passphrase), 1); } cp = netpgp_strdup(__ops_mem_data(mem)); __ops_teardown_memory_write(output, mem); return cp; }