aboutsummaryrefslogtreecommitdiffstats
path: root/g10/export.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/export.c')
-rw-r--r--g10/export.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/g10/export.c b/g10/export.c
index 7c7869fb8..fc2625684 100644
--- a/g10/export.c
+++ b/g10/export.c
@@ -837,6 +837,8 @@ secret_key_to_mode1003 (gcry_sexp_t s_key, PKT_public_key *pk, int is_part2)
goto leave;
if (is_part2) /* Append secret s-expr to the existing one. */
{
+ char const prefix[] = "(13:composite-key";
+ unsigned int prefixlen = strlen (prefix);
const unsigned char *oldbuf;
unsigned int oldbuflen;
unsigned char *newbuf;
@@ -845,16 +847,18 @@ secret_key_to_mode1003 (gcry_sexp_t s_key, PKT_public_key *pk, int is_part2)
gcry_mpi_get_flag (pk->pkey[npkey], GCRYMPI_FLAG_OPAQUE));
oldbuf = gcry_mpi_get_opaque (pk->pkey[npkey], &oldbuflen);
oldbuflen = (oldbuflen +7)/8; /* Fixup bits to bytes */
- newbuf = xtrymalloc_secure (oldbuflen + buflen);
+ newbuf = xtrymalloc_secure (prefixlen + oldbuflen + buflen + 1);
if (!newbuf)
{
err = gpg_error_from_syserror ();
goto leave;
}
- memcpy (newbuf, oldbuf, oldbuflen);
- memcpy (newbuf+oldbuflen, buf, buflen);
+ memcpy (newbuf, prefix, prefixlen);
+ memcpy (newbuf+prefixlen, oldbuf, oldbuflen);
+ memcpy (newbuf+prefixlen+oldbuflen, buf, buflen);
+ newbuf[prefixlen+oldbuflen+buflen] = ')'; /* close prefix */
buf = newbuf;
- buflen = oldbuflen + buflen;
+ buflen = prefixlen + oldbuflen + buflen + 1;
}
/* Note that BUF is consumed by gcry_mpi_set_opaque. */
pk->pkey[npkey] = gcry_mpi_set_opaque (NULL, buf, buflen*8);