diff options
Diffstat (limited to 'agent')
-rw-r--r-- | agent/ChangeLog | 5 | ||||
-rw-r--r-- | agent/call-scd.c | 14 |
2 files changed, 15 insertions, 4 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog index 91aab9e6d..6630fa055 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,3 +1,8 @@ +2010-10-18 Werner Koch <[email protected]> + + * call-scd.c (agent_card_pksign): Make sure to return an unsigned + number. + 2010-10-14 Werner Koch <[email protected]> * command.c (cmd_genkey): Add option --no-protection. diff --git a/agent/call-scd.c b/agent/call-scd.c index 81e0834ab..43e01981f 100644 --- a/agent/call-scd.c +++ b/agent/call-scd.c @@ -1,5 +1,5 @@ /* call-scd.c - fork of the scdaemon to do SC operations - * Copyright (C) 2001, 2002, 2005, 2007 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002, 2005, 2007, 2010 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -812,6 +812,7 @@ agent_card_pksign (ctrl_t ctrl, size_t len; unsigned char *sigbuf; size_t sigbuflen; + int prepend_nul; *r_buf = NULL; rc = start_scd (ctrl); @@ -850,15 +851,20 @@ agent_card_pksign (ctrl_t ctrl, sigbuf = get_membuf (&data, &sigbuflen); /* Create an S-expression from it which is formatted like this: - "(7:sig-val(3:rsa(1:sSIGBUFLEN:SIGBUF)))" */ - *r_buflen = 21 + 11 + sigbuflen + 4; + "(7:sig-val(3:rsa(1:sSIGBUFLEN:SIGBUF)))". We better make sure + that this won't be interpreted as a negative number. */ + prepend_nul = (sigbuflen && (*sigbuf & 0x80)); + + *r_buflen = 21 + 11 + prepend_nul + sigbuflen + 4; p = xtrymalloc (*r_buflen); *r_buf = (unsigned char*)p; if (!p) return unlock_scd (ctrl, out_of_core ()); p = stpcpy (p, "(7:sig-val(3:rsa(1:s" ); - sprintf (p, "%u:", (unsigned int)sigbuflen); + sprintf (p, "%u:", (unsigned int)sigbuflen + prepend_nul); p += strlen (p); + if (prepend_nul) + *p++ = 0; memcpy (p, sigbuf, sigbuflen); p += sigbuflen; strcpy (p, ")))"); |