aboutsummaryrefslogtreecommitdiffstats
path: root/scd/card.c
diff options
context:
space:
mode:
Diffstat (limited to 'scd/card.c')
-rw-r--r--scd/card.c98
1 files changed, 51 insertions, 47 deletions
diff --git a/scd/card.c b/scd/card.c
index 998413f7e..682a766f5 100644
--- a/scd/card.c
+++ b/scd/card.c
@@ -34,23 +34,25 @@
#include "card-common.h"
/* Map the SC error codes to the GNUPG ones */
-int
+gpg_error_t
map_sc_err (int rc)
{
+ gpg_err_code_t e;
+
switch (rc)
{
- case 0: rc = 0; break;
+ case 0: e = 0; break;
#ifdef HAVE_OPENSC
- case SC_ERROR_NOT_SUPPORTED: rc = GNUPG_Not_Supported; break;
- case SC_ERROR_PKCS15_APP_NOT_FOUND: rc = GNUPG_No_PKCS15_App; break;
- case SC_ERROR_OUT_OF_MEMORY: rc = GNUPG_Out_Of_Core; break;
- case SC_ERROR_CARD_NOT_PRESENT: rc = GNUPG_Card_Not_Present; break;
- case SC_ERROR_CARD_REMOVED: rc = GNUPG_Card_Removed; break;
- case SC_ERROR_INVALID_CARD: rc = GNUPG_Invalid_Card; break;
+ case SC_ERROR_NOT_SUPPORTED: e = GPG_ERR_NOT_SUPPORTED; break;
+ case SC_ERROR_PKCS15_APP_NOT_FOUND: e = GPG_ERR_NO_PKCS15_APP; break;
+ case SC_ERROR_OUT_OF_MEMORY: e = GPG_ERR_ENOMEM; break;
+ case SC_ERROR_CARD_NOT_PRESENT: e = GPG_ERR_CARD_NOT_PRESENT; break;
+ case SC_ERROR_CARD_REMOVED: e = GPG_ERR_CARD_REMOVED; break;
+ case SC_ERROR_INVALID_CARD: e = GPG_ERR_INVALID_CARD; break;
#endif
- default: rc = GNUPG_Card_Error; break;
+ default: e = GPG_ERR_CARD_ERROR; break;
}
- return rc;
+ return gpg_make_error (GPG_ERR_SOURCE_UNKNOWN, e);
}
/* Get the keygrip from CERT, return 0 on success */
@@ -89,7 +91,7 @@ card_help_get_keygrip (KsbaCert cert, unsigned char *array)
information of the card. Detects whgether a PKCS_15 application is
stored.
- Common errors: GNUPG_Card_Not_Present */
+ Common errors: GPG_ERR_CARD_NOT_PRESENT */
int
card_open (CARD *rcard)
{
@@ -99,7 +101,7 @@ card_open (CARD *rcard)
card = xtrycalloc (1, sizeof *card);
if (!card)
- return GNUPG_Out_Of_Core;
+ return out_of_core ();
card->reader = 0;
rc = sc_establish_context (&card->ctx, "scdaemon");
@@ -112,7 +114,7 @@ card_open (CARD *rcard)
if (card->reader >= card->ctx->reader_count)
{
log_error ("no card reader available\n");
- rc = GNUPG_Card_Error;
+ rc = gpg_error (GPG_ERR_CARD_ERROR);
goto leave;
}
card->ctx->error_file = log_get_stream ();
@@ -121,7 +123,7 @@ card_open (CARD *rcard)
if (sc_detect_card_presence (card->ctx->reader[card->reader], 0) != 1)
{
- rc = GNUPG_Card_Not_Present;
+ rc = gpg_error (GPG_ERR_CARD_NOT_PRESENT);
goto leave;
}
@@ -155,7 +157,7 @@ card_open (CARD *rcard)
return rc;
#else
- return GNUPG_Not_Supported;
+ return gpg_error (GPG_ERR_NOT_SUPPORTED);
#endif
}
@@ -240,7 +242,7 @@ find_iccsn (const unsigned char *buffer, size_t length, char **serial)
s = find_simple_tlv (buffer, length, 0x5A, &n);
if (!s)
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
length -= s - buffer;
if (n > length)
{
@@ -255,14 +257,16 @@ find_iccsn (const unsigned char *buffer, size_t length, char **serial)
n--;
}
else
- return GNUPG_Card_Error; /* Bad encoding; does not fit into buffer. */
+ return gpg_error (GPG_ERR_CARD_ERROR); /* Bad encoding; does
+ not fit into
+ buffer. */
}
if (!n)
- return GNUPG_Card_Error; /* Well, that is too short. */
+ return gpg_error (GPG_ERR_CARD_ERROR); /* Well, that is too short. */
*serial = p = xtrymalloc (2*n+1);
if (!*serial)
- return GNUPG_Out_Of_Core;
+ return out_of_core ();
for (; n; n--, p += 2, s++)
sprintf (p, "%02X", *s);
*p = 0;
@@ -290,7 +294,7 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
#endif
if (!card || !serial || !stamp)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
*serial = NULL;
*stamp = 0; /* not available */
@@ -328,21 +332,21 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
if (rc)
{
log_error ("sc_select_file failed: %s\n", sc_strerror (rc));
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
}
if (file->type != SC_FILE_TYPE_WORKING_EF
|| file->ef_structure != SC_FILE_EF_TRANSPARENT)
{
log_error ("wrong type or structure of GDO file\n");
sc_file_free (file);
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
}
if (!file->size || file->size >= DIM(buf) )
{ /* FIXME: Use a real parser */
log_error ("unsupported size of GDO file (%d)\n", file->size);
sc_file_free (file);
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
}
buflen = file->size;
@@ -351,16 +355,16 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
if (rc < 0)
{
log_error ("error reading GDO file: %s\n", sc_strerror (rc));
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
}
if (rc != buflen)
{
log_error ("short read on GDO file\n");
- return GNUPG_Card_Error;
+ return gpg_error (GPG_ERR_CARD_ERROR);
}
rc = find_iccsn (buf, buflen, serial);
- if (rc == GNUPG_Card_Error)
+ if (gpg_err_code (rc) == GPG_ERR_CARD_ERROR)
log_error ("invalid structure of GDO file\n");
if (!rc && card->p15card && !strcmp (*serial, "D27600000000000000000000"))
{ /* This is a German card with a silly serial number. Try to get
@@ -376,7 +380,7 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
*serial = NULL;
p = xtrymalloc (strlen (efser) + 7);
if (!p)
- rc = GNUPG_Out_Of_Core;
+ rc = out_of_core ();
else
{
strcpy (p, "FF0100");
@@ -392,7 +396,7 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
{
xfree (*serial);
*serial = NULL;
- rc = GNUPG_Out_Of_Core;
+ rc = out_of_core ();
}
else
{
@@ -404,7 +408,7 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
}
return rc;
#else
- return GNUPG_Not_Supported;
+ return gpg_error (GPG_ERR_NOT_SUPPORTED);
#endif
}
@@ -415,7 +419,7 @@ card_get_serial_and_stamp (CARD card, char **serial, time_t *stamp)
the KEYGRIP of the keypair. If KEYID is not NULL, it returns the
ID field of the key in allocated memory; this is a string without
spaces. The function returns -1 when all keys have been
- enumerated. Note that the error GNUPG_Missing_Certificate may be
+ enumerated. Note that the error GPG_ERR_MISSING_CERTIFICATE may be
returned if there is just the private key but no public key (ie.e a
certificate) available. Applications might want to continue
enumerating after this error.*/
@@ -430,13 +434,13 @@ card_enum_keypairs (CARD card, int idx,
*keyid = NULL;
if (!card || !keygrip)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
if (idx < 0)
- return GNUPG_Invalid_Index;
+ return gpg_error (GPG_ERR_INVALID_INDEX);
if (!card->fnc.initialized)
- return GNUPG_Card_Not_Initialized;
+ return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED);
if (!card->fnc.enum_keypairs)
- return GNUPG_Unsupported_Operation;
+ return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
rc = card->fnc.enum_keypairs (card, idx, keygrip, keyid);
if (opt.verbose)
log_info ("card operation enum_keypairs result: %s\n",
@@ -462,13 +466,13 @@ card_enum_certs (CARD card, int idx, char **certid, int *certtype)
*certid = NULL;
if (!card)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
if (idx < 0)
- return GNUPG_Invalid_Index;
+ return gpg_error (GPG_ERR_INVALID_INDEX);
if (!card->fnc.initialized)
- return GNUPG_Card_Not_Initialized;
+ return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED);
if (!card->fnc.enum_certs)
- return GNUPG_Unsupported_Operation;
+ return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
rc = card->fnc.enum_certs (card, idx, certid, certtype);
if (opt.verbose)
log_info ("card operation enum_certs result: %s\n",
@@ -489,11 +493,11 @@ card_read_cert (CARD card, const char *certidstr,
int rc;
if (!card || !certidstr || !cert || !ncert)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
if (!card->fnc.initialized)
- return GNUPG_Card_Not_Initialized;
+ return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED);
if (!card->fnc.read_cert)
- return GNUPG_Unsupported_Operation;
+ return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
rc = card->fnc.read_cert (card, certidstr, cert, ncert);
if (opt.verbose)
log_info ("card operation read_cert result: %s\n", gnupg_strerror (rc));
@@ -514,11 +518,11 @@ card_sign (CARD card, const char *keyidstr, int hashalgo,
int rc;
if (!card || !indata || !indatalen || !outdata || !outdatalen || !pincb)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
if (!card->fnc.initialized)
- return GNUPG_Card_Not_Initialized;
+ return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED);
if (!card->fnc.sign)
- return GNUPG_Unsupported_Operation;
+ return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
rc = card->fnc.sign (card, keyidstr, hashalgo,
pincb, pincb_arg,
indata, indatalen,
@@ -542,11 +546,11 @@ card_decipher (CARD card, const char *keyidstr,
int rc;
if (!card || !indata || !indatalen || !outdata || !outdatalen || !pincb)
- return GNUPG_Invalid_Value;
+ return gpg_error (GPG_ERR_INV_VALUE);
if (!card->fnc.initialized)
- return GNUPG_Card_Not_Initialized;
+ return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED);
if (!card->fnc.decipher)
- return GNUPG_Unsupported_Operation;
+ return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
rc = card->fnc.decipher (card, keyidstr,
pincb, pincb_arg,
indata, indatalen,