aboutsummaryrefslogtreecommitdiffstats
path: root/g10/export.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2025-11-15 16:45:12 +0000
committerWerner Koch <[email protected]>2025-11-15 16:45:12 +0000
commit5d855f76c8af280f0a2b01d64283a9efa0f5d795 (patch)
tree30f16f1053e6a37fed3aa14540c620aa502c363f /g10/export.c
parentgpg: Refactor an import function for better readability. (diff)
downloadgnupg-5d855f76c8af280f0a2b01d64283a9efa0f5d795.tar.gz
gnupg-5d855f76c8af280f0a2b01d64283a9efa0f5d795.zip
gpg: Change the mode1003 format for composite keys.
* g10/export.c (secret_key_to_mode1003): Put both parts into one container. * g10/parse-packet.c (parse_key): Revert to old version. -- Let's have a proper s-expression for composite keys. Updates-commit: e5473262e88473a101241e7b4860882ebeb1ed97
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);