aboutsummaryrefslogtreecommitdiffstats
path: root/agent
diff options
context:
space:
mode:
Diffstat (limited to 'agent')
-rw-r--r--agent/agent.h3
-rw-r--r--agent/call-scd.c2
-rw-r--r--agent/command.c16
-rw-r--r--agent/divert-scd.c7
4 files changed, 21 insertions, 7 deletions
diff --git a/agent/agent.h b/agent/agent.h
index e891981b2..d1192f505 100644
--- a/agent/agent.h
+++ b/agent/agent.h
@@ -769,7 +769,8 @@ int agent_card_pkdecrypt (ctrl_t ctrl,
void *getpin_cb_arg,
const char *desc_text,
const unsigned char *indata, size_t indatalen,
- char **r_buf, size_t *r_buflen, int *r_padding);
+ unsigned char **r_buf, size_t *r_buflen,
+ int *r_padding);
int agent_card_readcert (ctrl_t ctrl,
const char *id, char **r_buf, size_t *r_buflen);
diff --git a/agent/call-scd.c b/agent/call-scd.c
index 28669206c..f47deb83e 100644
--- a/agent/call-scd.c
+++ b/agent/call-scd.c
@@ -609,7 +609,7 @@ agent_card_pkdecrypt (ctrl_t ctrl,
void *getpin_cb_arg,
const char *desc_text,
const unsigned char *indata, size_t indatalen,
- char **r_buf, size_t *r_buflen, int *r_padding)
+ unsigned char **r_buf, size_t *r_buflen, int *r_padding)
{
int rc;
char line[ASSUAN_LINELENGTH];
diff --git a/agent/command.c b/agent/command.c
index a9eb0104e..dcb758e37 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -541,14 +541,26 @@ cmd_istrusted (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
int rc, n, i;
- char *p;
+ char *p, *pn;
char fpr[41];
/* Parse the fingerprint value. */
+ pn = NULL; /* Indicates that we have not reparsed. */
+ parseagain:
for (p=line,n=0; hexdigitp (p); p++, n++)
;
if (*p || !(n == 40 || n == 32))
- return set_error (GPG_ERR_ASS_PARAMETER, "invalid fingerprint");
+ {
+ if (!pn && *p && strchr (p, ':'))
+ {
+ for (pn=p=line; *p ; p++)
+ if (*p != ':')
+ *pn++ = *p;
+ *pn = 0;
+ goto parseagain;
+ }
+ return set_error (GPG_ERR_ASS_PARAMETER, "invalid fingerprint");
+ }
i = 0;
if (n==32)
{
diff --git a/agent/divert-scd.c b/agent/divert-scd.c
index 7e0d8eccb..e0b5164b5 100644
--- a/agent/divert-scd.c
+++ b/agent/divert-scd.c
@@ -394,7 +394,7 @@ divert_pkdecrypt (ctrl_t ctrl,
int depth;
const unsigned char *ciphertext;
size_t ciphertextlen;
- char *plaintext;
+ unsigned char *plaintext;
size_t plaintextlen;
bin2hex (grip, 20, hexgrip);
@@ -504,7 +504,7 @@ agent_card_ecc_kem (ctrl_t ctrl, const unsigned char *ecc_ct,
size_t ecc_point_len, unsigned char *ecc_ecdh)
{
gpg_error_t err = 0;
- char *ecdh = NULL;
+ unsigned char *ecdh = NULL;
size_t len;
int rc;
char hexgrip[KEYGRIP_LEN*2+1];
@@ -517,7 +517,8 @@ agent_card_ecc_kem (ctrl_t ctrl, const unsigned char *ecc_ct,
if (len == ecc_point_len)
memcpy (ecc_ecdh, ecdh, len);
- else if ((len - 1) * 2 == ecc_point_len - 1 && ecdh[0] == 0x02)
+ else if (len && (len - 1) * 2 == ecc_point_len - 1
+ && (ecdh[0] & ~1) == 0x02)
{
/* It's x-coordinate-only (compressed) point representation. */
memcpy (ecc_ecdh, ecdh, len);