aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app-openpgp.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2005-02-24 17:36:11 +0000
committerWerner Koch <[email protected]>2005-02-24 17:36:11 +0000
commit3af261572bdf938f0a2fdde4d9aec82153a7e0e4 (patch)
tree97ea3ee2c40c6a3288182c6e95e92377e3e7a794 /scd/app-openpgp.c
parent* command-ssh.c (get_passphrase): Removed. (diff)
downloadgnupg-3af261572bdf938f0a2fdde4d9aec82153a7e0e4.tar.gz
gnupg-3af261572bdf938f0a2fdde4d9aec82153a7e0e4.zip
* gpg-agent.c (handle_connections): Need to check for events if
select returns with -1. * tools.texi (gpg-connect-agent): New. * app-openpgp.c (get_one_do): Never try to get a non cacheable object from the cache. (get_one_do): Add new arg to return an error code. Changed all callers. (do_getattr): Let it return a proper error code. * app.c (select_application): Return an error code and the application context in an new arg. * command.c (open_card): Adjusted for that. Don't use the fallback if no card is present. Return an error if the card has been removed without a reset. (do_reset, cmd_serialno): Clear that error flag. (TEST_CARD_REMOVAL): New. Use it with all command handlers. * scdaemon.c (ticker_thread): Termintate if a shutdown is pending. * apdu.c: Added some PCSC error codes. (pcsc_error_to_sw): New. (reset_pcsc_reader, pcsc_get_status, pcsc_send_apdu) (open_pcsc_reader): Do proper error code mapping. * gpg-connect-agent.c: New. * Makefile.am: Add it.
Diffstat (limited to '')
-rw-r--r--scd/app-openpgp.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 8d146ba6a..14c802d10 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -306,23 +306,33 @@ flush_cache (app_t app)
NULL if not found or a pointer which must be used to release the
buffer holding value. */
static void *
-get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes)
+get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes,
+ int *r_rc)
{
int rc, i;
unsigned char *buffer;
size_t buflen;
unsigned char *value;
size_t valuelen;
+ int dummyrc;
+
+ if (!r_rc)
+ r_rc = &dummyrc;
*result = NULL;
*nbytes = 0;
+ *r_rc = 0;
for (i=0; data_objects[i].tag && data_objects[i].tag != tag; i++)
;
if (app->card_version > 0x0100 && data_objects[i].get_immediate_in_v11)
{
- if( iso7816_get_data (app->slot, tag, &buffer, &buflen))
- return NULL;
+ rc = iso7816_get_data (app->slot, tag, &buffer, &buflen);
+ if (rc)
+ {
+ *r_rc = rc;
+ return NULL;
+ }
*result = buffer;
*nbytes = buflen;
return buffer;
@@ -334,7 +344,8 @@ get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes)
{
rc = get_cached_data (app, data_objects[i].get_from,
&buffer, &buflen,
- data_objects[i].get_immediate_in_v11);
+ (data_objects[i].dont_cache
+ || data_objects[i].get_immediate_in_v11));
if (!rc)
{
const unsigned char *s;
@@ -356,7 +367,8 @@ get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes)
if (!value) /* Not in a constructed DO, try simple. */
{
rc = get_cached_data (app, tag, &buffer, &buflen,
- data_objects[i].get_immediate_in_v11);
+ (data_objects[i].dont_cache
+ || data_objects[i].get_immediate_in_v11));
if (!rc)
{
value = buffer;
@@ -370,6 +382,7 @@ get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes)
*result = value;
return buffer;
}
+ *r_rc = rc;
return NULL;
}
@@ -488,7 +501,7 @@ parse_login_data (app_t app)
app->app_local->flags.def_chv2 = 0;
/* Read the DO. */
- relptr = get_one_do (app, 0x005E, &buffer, &buflen);
+ relptr = get_one_do (app, 0x005E, &buffer, &buflen, NULL);
if (!relptr)
return; /* Ooops. */
for (; buflen; buflen--, buffer++)
@@ -678,7 +691,7 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
{ "PRIVATE-DO-4", 0x0104 },
{ NULL, 0 }
};
- int idx, i;
+ int idx, i, rc;
void *relptr;
unsigned char *value;
size_t valuelen;
@@ -723,7 +736,7 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
return 0;
}
- relptr = get_one_do (app, table[idx].tag, &value, &valuelen);
+ relptr = get_one_do (app, table[idx].tag, &value, &valuelen, &rc);
if (relptr)
{
if (table[idx].special == 1)
@@ -760,7 +773,7 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
xfree (relptr);
}
- return 0;
+ return rc;
}
@@ -1075,7 +1088,7 @@ verify_chv3 (app_t app,
unsigned char *value;
size_t valuelen;
- relptr = get_one_do (app, 0x00C4, &value, &valuelen);
+ relptr = get_one_do (app, 0x00C4, &value, &valuelen, NULL);
if (!relptr || valuelen < 7)
{
log_error (_("error retrieving CHV status from card\n"));
@@ -1442,7 +1455,7 @@ get_sig_counter (app_t app)
size_t valuelen;
unsigned long ul;
- relptr = get_one_do (app, 0x0093, &value, &valuelen);
+ relptr = get_one_do (app, 0x0093, &value, &valuelen, NULL);
if (!relptr)
return 0;
ul = convert_sig_counter_value (value, valuelen);
@@ -1880,7 +1893,7 @@ app_select_openpgp (app_t app)
goto leave;
}
- relptr = get_one_do (app, 0x00C4, &buffer, &buflen);
+ relptr = get_one_do (app, 0x00C4, &buffer, &buflen, NULL);
if (!relptr)
{
log_error (_("can't access %s - invalid OpenPGP card?\n"),
@@ -1890,7 +1903,7 @@ app_select_openpgp (app_t app)
app->force_chv1 = (buflen && *buffer == 0);
xfree (relptr);
- relptr = get_one_do (app, 0x00C0, &buffer, &buflen);
+ relptr = get_one_do (app, 0x00C0, &buffer, &buflen, NULL);
if (!relptr)
{
log_error (_("can't access %s - invalid OpenPGP card?\n"),
@@ -1973,7 +1986,7 @@ app_openpgp_cardinfo (app_t app,
if (disp_name)
{
*disp_name = NULL;
- relptr = get_one_do (app, 0x005B, &value, &valuelen);
+ relptr = get_one_do (app, 0x005B, &value, &valuelen, NULL);
if (relptr)
{
*disp_name = make_printable_string (value, valuelen, 0);
@@ -1984,7 +1997,7 @@ app_openpgp_cardinfo (app_t app,
if (pubkey_url)
{
*pubkey_url = NULL;
- relptr = get_one_do (app, 0x5F50, &value, &valuelen);
+ relptr = get_one_do (app, 0x5F50, &value, &valuelen, NULL);
if (relptr)
{
*pubkey_url = make_printable_string (value, valuelen, 0);
@@ -1998,7 +2011,7 @@ app_openpgp_cardinfo (app_t app,
*fpr2 = NULL;
if (fpr3)
*fpr3 = NULL;
- relptr = get_one_do (app, 0x00C5, &value, &valuelen);
+ relptr = get_one_do (app, 0x00C5, &value, &valuelen, NULL);
if (relptr && valuelen >= 60)
{
if (fpr1)