diff options
Diffstat (limited to 'g10/pubkey-enc.c')
| -rw-r--r-- | g10/pubkey-enc.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index 418e4ab72..9d6193e4d 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -115,23 +115,25 @@ get_session_key (ctrl_t ctrl, struct pubkey_enc_list *list, DEK *dek) */ for (k = list; k; k = k->next) { - if (!(k->d.pubkey_algo == PUBKEY_ALGO_ELGAMAL_E - || k->d.pubkey_algo == PUBKEY_ALGO_ECDH - || k->d.pubkey_algo == PUBKEY_ALGO_KYBER - || k->d.pubkey_algo == PUBKEY_ALGO_RSA - || k->d.pubkey_algo == PUBKEY_ALGO_RSA_E - || k->d.pubkey_algo == PUBKEY_ALGO_ELGAMAL)) + if (k->u_sym) + continue; + if (!(k->u.pub.pubkey_algo == PUBKEY_ALGO_ELGAMAL_E + || k->u.pub.pubkey_algo == PUBKEY_ALGO_ECDH + || k->u.pub.pubkey_algo == PUBKEY_ALGO_KYBER + || k->u.pub.pubkey_algo == PUBKEY_ALGO_RSA + || k->u.pub.pubkey_algo == PUBKEY_ALGO_RSA_E + || k->u.pub.pubkey_algo == PUBKEY_ALGO_ELGAMAL)) continue; - if (openpgp_pk_test_algo2 (k->d.pubkey_algo, PUBKEY_USAGE_ENC)) + if (openpgp_pk_test_algo2 (k->u.pub.pubkey_algo, PUBKEY_USAGE_ENC)) continue; - if (sk->pubkey_algo != k->d.pubkey_algo) + if (sk->pubkey_algo != k->u.pub.pubkey_algo) continue; keyid_from_pk (sk, keyid); - if (!k->d.keyid[0] && !k->d.keyid[1]) + if (!k->u.pub.keyid[0] && !k->u.pub.keyid[1]) { if (opt.skip_hidden_recipients) continue; @@ -141,7 +143,8 @@ get_session_key (ctrl_t ctrl, struct pubkey_enc_list *list, DEK *dek) keystr (keyid)); } else if (opt.try_all_secrets - || (k->d.keyid[0] == keyid[0] && k->d.keyid[1] == keyid[1])) + || (k->u.pub.keyid[0] == keyid[0] + && k->u.pub.keyid[1] == keyid[1])) { if (!opt.quiet && !(sk->pubkey_usage & PUBKEY_USAGE_XENC_MASK)) log_info (_("used key is not marked for encryption use.\n")); @@ -153,7 +156,7 @@ get_session_key (ctrl_t ctrl, struct pubkey_enc_list *list, DEK *dek) k->result = err; if (!err) { - if (!opt.quiet && !k->d.keyid[0] && !k->d.keyid[1]) + if (!opt.quiet && !k->u.pub.keyid[0] && !k->u.pub.keyid[1]) { log_info (_("okay, we are the anonymous recipient.\n")); if (!(sk->pubkey_usage & PUBKEY_USAGE_XENC_MASK)) @@ -211,7 +214,7 @@ ecdh_sexp_build (gcry_sexp_t *r_s_data, struct pubkey_enc_list *enc, keywrap_cipher_algo = kdf_params_spec[3]; kdf_hash_algo = kdf_params_spec[2]; - if (!enc->d.data[0] || !enc->d.data[1]) + if (!enc->u.pub.data[0] || !enc->u.pub.data[1]) { xfree (kdf_params); return gpg_error (GPG_ERR_BAD_MPI); @@ -220,7 +223,7 @@ ecdh_sexp_build (gcry_sexp_t *r_s_data, struct pubkey_enc_list *enc, err = gcry_sexp_build (r_s_data, NULL, "(enc-val(ecc(c%d)(h%d)(e%m)(s%m)(kdf-params%b)))", keywrap_cipher_algo, kdf_hash_algo, - enc->d.data[0], enc->d.data[1], + enc->u.pub.data[0], enc->u.pub.data[1], (int)kdf_params_len, kdf_params); xfree (kdf_params); return err; @@ -244,6 +247,8 @@ get_it (ctrl_t ctrl, if (DBG_CLOCK) log_clock ("decryption start"); + log_assert (!enc->u_sym); + /* Get the keygrip. */ err = hexkeygrip_from_pk (sk, &keygrip); if (err) @@ -253,20 +258,20 @@ get_it (ctrl_t ctrl, if (sk->pubkey_algo == PUBKEY_ALGO_ELGAMAL || sk->pubkey_algo == PUBKEY_ALGO_ELGAMAL_E) { - if (!enc->d.data[0] || !enc->d.data[1]) + if (!enc->u.pub.data[0] || !enc->u.pub.data[1]) err = gpg_error (GPG_ERR_BAD_MPI); else err = gcry_sexp_build (&s_data, NULL, "(enc-val(elg(a%m)(b%m)))", - enc->d.data[0], enc->d.data[1]); + enc->u.pub.data[0], enc->u.pub.data[1]); } else if (sk->pubkey_algo == PUBKEY_ALGO_RSA || sk->pubkey_algo == PUBKEY_ALGO_RSA_E) { - if (!enc->d.data[0]) + if (!enc->u.pub.data[0]) err = gpg_error (GPG_ERR_BAD_MPI); else err = gcry_sexp_build (&s_data, NULL, "(enc-val(rsa(a%m)))", - enc->d.data[0]); + enc->u.pub.data[0]); } else if (sk->pubkey_algo == PUBKEY_ALGO_ECDH) err = ecdh_sexp_build (&s_data, enc, sk); @@ -283,18 +288,20 @@ get_it (ctrl_t ctrl, } else { - fixedinfo[0] = enc->d.seskey_algo; + fixedinfo[0] = enc->u.pub.seskey_algo; v5_fingerprint_from_pk (sk, fixedinfo+1, NULL); fixedlen = 33; } - if (!enc->d.data[0] || !enc->d.data[1] || !enc->d.data[2]) + if (!enc->u.pub.data[0] || !enc->u.pub.data[1] || !enc->u.pub.data[2]) err = gpg_error (GPG_ERR_BAD_MPI); else err = gcry_sexp_build (&s_data, NULL, "(enc-val(pqc(e%m)(k%m)(s%m)(c%d)(fixed-info%b)))", - enc->d.data[0], enc->d.data[1], enc->d.data[2], - enc->d.seskey_algo, fixedlen, fixedinfo); + enc->u.pub.data[0], + enc->u.pub.data[1], + enc->u.pub.data[2], + enc->u.pub.seskey_algo, fixedlen, fixedinfo); } else err = gpg_error (GPG_ERR_BUG); @@ -341,7 +348,7 @@ get_it (ctrl_t ctrl, log_info (_("WARNING: session key is not quantum-resistant\n")); } dek->keylen = nframe; - dek->algo = enc->d.seskey_algo; + dek->algo = enc->u.pub.seskey_algo; } else if (sk->pubkey_algo == PUBKEY_ALGO_ECDH) { |
