aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app-openpgp.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2006-08-01 12:23:34 +0000
committerWerner Koch <[email protected]>2006-08-01 12:23:34 +0000
commit8c219602515ae1dba5bc0da31077852dab61809e (patch)
tree49d596d702cfec2b8cc42ccaf8c90c82d5200ac5 /scd/app-openpgp.c
parentForgot this one. (diff)
parent2006-07-29 Marcus Brinkmann <[email protected]> (diff)
downloadgnupg-8c219602515ae1dba5bc0da31077852dab61809e.tar.gz
gnupg-8c219602515ae1dba5bc0da31077852dab61809e.zip
Moved 1.9 branch to trunk
Diffstat (limited to '')
-rw-r--r--scd/app-openpgp.c (renamed from g10/app-openpgp.c)84
1 files changed, 62 insertions, 22 deletions
diff --git a/g10/app-openpgp.c b/scd/app-openpgp.c
index 102e52329..47ff8abc2 100644
--- a/g10/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -113,8 +113,8 @@ struct app_local_s {
encoded S-expression encoding a public
key. Might be NULL if key is not
available. */
- size_t keylen; /* The length of the above S-expression. Thsi
- is usullay only required for corss checks
+ size_t keylen; /* The length of the above S-expression. This
+ is usullay only required for cross checks
because the length of an S-expression is
implicitly available. */
} pk[3];
@@ -485,7 +485,7 @@ count_bits (const unsigned char *a, size_t len)
Everything up to a LF is considered a mailbox or account name. If
the first LF is followed by DC4 (0x14) control sequence are
expected up to the next LF. Control sequences are separated by FS
- (0x28) and consist of key=value pairs. There is one key defined:
+ (0x18) and consist of key=value pairs. There is one key defined:
F=<flags>
@@ -697,6 +697,8 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
{ "PRIVATE-DO-2", 0x0102 },
{ "PRIVATE-DO-3", 0x0103 },
{ "PRIVATE-DO-4", 0x0104 },
+ { "$AUTHKEYID", 0x0000, -3 },
+ { "$DISPSERIALNO",0x0000, -4 },
{ NULL, 0 }
};
int idx, i, rc;
@@ -743,6 +745,29 @@ do_getattr (app_t app, ctrl_t ctrl, const char *name)
send_status_info (ctrl, table[idx].name, tmp, strlen (tmp), NULL, 0);
return 0;
}
+ if (table[idx].special == -3)
+ {
+ char const tmp[] = "OPENPGP.3";
+ send_status_info (ctrl, table[idx].name, tmp, strlen (tmp), NULL, 0);
+ return 0;
+ }
+ if (table[idx].special == -4)
+ {
+ char *serial;
+ time_t stamp;
+
+ if (!app_get_serial_and_stamp (app, &serial, &stamp))
+ {
+ if (strlen (serial) > 16+12)
+ {
+ send_status_info (ctrl, table[idx].name, serial+16, 12, NULL, 0);
+ xfree (serial);
+ return 0;
+ }
+ xfree (serial);
+ }
+ return gpg_error (GPG_ERR_INV_NAME);
+ }
relptr = get_one_do (app, table[idx].tag, &value, &valuelen, &rc);
if (relptr)
@@ -949,8 +974,8 @@ get_public_key (app_t app, int keyno)
size_t buflen, keydatalen, mlen, elen;
unsigned char *mbuf = NULL;
unsigned char *ebuf = NULL;
- unsigned char *keybuf = NULL;
- unsigned char *keybuf_p;
+ char *keybuf = NULL;
+ char *keybuf_p;
if (keyno < 1 || keyno > 3)
return gpg_error (GPG_ERR_INV_ID);
@@ -964,14 +989,16 @@ get_public_key (app_t app, int keyno)
app->app_local->pk[keyno].key = NULL;
app->app_local->pk[keyno].keylen = 0;
+ m = e = NULL; /* (avoid cc warning) */
+
if (app->card_version > 0x0100)
{
/* We may simply read the public key out of these cards. */
- err = iso7816_read_public_key (app->slot,
- keyno == 0? "\xB6" :
- keyno == 1? "\xB8" : "\xA4",
- 2,
- &buffer, &buflen);
+ err = iso7816_read_public_key
+ (app->slot, (const unsigned char*)(keyno == 0? "\xB6" :
+ keyno == 1? "\xB8" : "\xA4"),
+ 2,
+ &buffer, &buflen);
if (err)
{
log_error (_("reading public key failed: %s\n"), gpg_strerror (err));
@@ -1108,7 +1135,7 @@ get_public_key (app_t app, int keyno)
strcpy (keybuf_p, ")))");
keybuf_p += strlen (keybuf_p);
- app->app_local->pk[keyno].key = keybuf;
+ app->app_local->pk[keyno].key = (unsigned char*)keybuf;
app->app_local->pk[keyno].keylen = (keybuf_p - keybuf);
leave:
@@ -1229,8 +1256,15 @@ do_readkey (app_t app, const char *keyid, unsigned char **pk, size_t *pklen)
buf = app->app_local->pk[keyno-1].key;
if (!buf)
return gpg_error (GPG_ERR_NO_PUBKEY);
- *pk = buf;
*pklen = app->app_local->pk[keyno-1].keylen;;
+ *pk = xtrymalloc (*pklen);
+ if (!*pk)
+ {
+ err = gpg_error_from_errno (errno);
+ *pklen = 0;
+ return err;
+ }
+ memcpy (*pk, buf, *pklen);
return 0;
#else
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
@@ -1251,6 +1285,11 @@ verify_chv2 (app_t app,
if (!app->did_chv2)
{
char *pinvalue;
+ iso7816_pininfo_t pininfo;
+
+ memset (&pininfo, 0, sizeof pininfo);
+ pininfo.mode = 1;
+ pininfo.minlen = 6;
rc = pincb (pincb_arg, "PIN", &pinvalue);
if (rc)
@@ -1890,11 +1929,10 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, unsigned int flags,
#warning key generation temporary replaced by reading an existing key.
rc = iso7816_read_public_key
#endif
- (app->slot,
- keyno == 0? "\xB6" :
- keyno == 1? "\xB8" : "\xA4",
- 2,
- &buffer, &buflen);
+ (app->slot, (const unsigned char*)(keyno == 0? "\xB6" :
+ keyno == 1? "\xB8" : "\xA4"),
+ 2,
+ &buffer, &buflen);
if (rc)
{
rc = gpg_error (GPG_ERR_CARD);
@@ -2047,7 +2085,7 @@ check_against_given_fingerprint (app_t app, const char *fpr, int keyno)
raw message digest. For this application the KEYIDSTR consists of
the serialnumber and the fingerprint delimited by a slash.
- Note that this fucntion may return the error code
+ Note that this function may return the error code
GPG_ERR_WRONG_CARD to indicate that the card currently present does
not match the one required for the requested action (e.g. the
serial number does not match). */
@@ -2084,8 +2122,8 @@ do_sign (app_t app, const char *keyidstr, int hashalgo,
;
else
{
- log_error(_("card does not support digest algorithm %s\n"),
- digest_algo_to_string(hashalgo));
+ log_error (_("card does not support digest algorithm %s\n"),
+ gcry_md_algo_name (hashalgo));
return gpg_error (GPG_ERR_INV_VALUE);
}
@@ -2200,7 +2238,7 @@ do_sign (app_t app, const char *keyidstr, int hashalgo,
fingerprint delimited by a slash. Optionally the id OPENPGP.3 may
be given.
- Note that this fucntion may return the error code
+ Note that this function may return the error code
GPG_ERR_WRONG_CARD to indicate that the card currently present does
not match the one required for the requested action (e.g. the
serial number does not match). */
@@ -2427,7 +2465,9 @@ app_select_openpgp (app_t app)
size_t buflen;
void *relptr;
- rc = iso7816_select_application (slot, aid, sizeof aid);
+ /* Note that the card can't cope with P2=0xCO, thus we need to pass a
+ special flag value. */
+ rc = iso7816_select_application (slot, aid, sizeof aid, 0x0001);
if (!rc)
{
unsigned int manufacturer;