aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/pkglue.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/g10/pkglue.c b/g10/pkglue.c
index a9d4d8549..1fa0fc4dd 100644
--- a/g10/pkglue.c
+++ b/g10/pkglue.c
@@ -717,6 +717,10 @@ do_encrypt_ecdh (PKT_public_key *pk, gcry_mpi_t data, gcry_mpi_t *resarr)
unsigned char ecc_ct[ECC_POINT_LEN_MAX];
unsigned char ecc_ecdh[ECC_POINT_LEN_MAX];
size_t ecc_ct_len, ecc_ecdh_len;
+ const char *shared_secret;
+ size_t shared_secretlen;
+ const char *ephemeral_pubkey;
+ size_t ephemeral_pubkeylen;
unsigned char *kek = NULL;
size_t kek_len;
@@ -808,6 +812,30 @@ do_encrypt_ecdh (PKT_public_key *pk, gcry_mpi_t data, gcry_mpi_t *resarr)
log_printhex (ecc_ecdh, ecc_ecdh_len, "ECC ecdh:");
}
+ if (ecc->is_weierstrauss)
+ {
+ shared_secret = ecc_ecdh + 1;
+ shared_secretlen = (ecc_ecdh_len - 1) / 2;
+ ephemeral_pubkey = ecc_ct;
+ ephemeral_pubkeylen = ecc_ct_len;
+ }
+ else
+ {
+ shared_secret = ecc_ecdh;
+ shared_secretlen = ecc_ecdh_len;
+
+ if (ecc->may_have_prefix)
+ {
+ ephemeral_pubkeylen = ecc_ct_len + 1;
+ memmove (ecc_ct + 1, ecc_ct, ecc_ct_len);
+ ecc_ct[0] = 0x40;
+ }
+ else
+ ephemeral_pubkeylen = ecc_ct_len;
+
+ ephemeral_pubkey = ecc_ct;
+ }
+
err = ecc_build_kdf_params (&kdf_params, &kdf_params_len,
&kdf_params_spec, pk->pkey, fp);
if (err)
@@ -852,10 +880,7 @@ do_encrypt_ecdh (PKT_public_key *pk, gcry_mpi_t data, gcry_mpi_t *resarr)
}
err = gnupg_ecc_kem_kdf (kek, kek_len, 1, kdf_hash_algo,
- ecc->is_weierstrauss ?
- ecc_ecdh + 1 : ecc_ecdh,
- ecc->is_weierstrauss ?
- (ecc_ecdh_len - 1) / 2 : ecc_ecdh_len,
+ shared_secret, shared_secretlen,
kdf_params, kdf_params_len);
xfree (kdf_params);
if (err)
@@ -902,7 +927,8 @@ do_encrypt_ecdh (PKT_public_key *pk, gcry_mpi_t data, gcry_mpi_t *resarr)
if (DBG_CRYPTO)
log_printhex (enc_seskey, enc_seskey_len, "enc_seskey:");
- resarr[0] = gcry_mpi_set_opaque_copy (NULL, ecc_ct, 8 * ecc_ct_len);
+ resarr[0] = gcry_mpi_set_opaque_copy (NULL, ephemeral_pubkey,
+ 8 * ephemeral_pubkeylen);
if (!resarr[0])
{
err = gpg_error_from_syserror ();