]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
read correct algorithm when decrypting data and use correct number of private parameters.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 16 Mar 2011 21:38:18 +0000 (22:38 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 16 Mar 2011 21:38:18 +0000 (22:38 +0100)
lib/openpgp/privkey.c

index 0ed4f0d7cf18b1bf417313694fb12ef81eb39fa2..3b831a2288fd50f2db8291334a83e368def39a2b 100644 (file)
@@ -759,6 +759,7 @@ _gnutls_openpgp_privkey_get_mpis (gnutls_openpgp_privkey_t pkey,
           goto error;
         }
     }
+  
   /* fixup will generate exp1 and exp2 that are not
    * available here.
    */
@@ -1324,8 +1325,8 @@ _gnutls_openpgp_privkey_decrypt_data (gnutls_openpgp_privkey_t key,
                                      gnutls_datum_t * plaintext)
 {
   int result, i;
-  bigint_t params[MAX_PUBLIC_PARAMS_SIZE];
-  int params_size = MAX_PUBLIC_PARAMS_SIZE;
+  bigint_t params[MAX_PRIV_PARAMS_SIZE];
+  int params_size = MAX_PRIV_PARAMS_SIZE;
   int pk_algorithm;
   gnutls_openpgp_keyid_t keyid;
 
@@ -1343,11 +1344,18 @@ _gnutls_openpgp_privkey_decrypt_data (gnutls_openpgp_privkey_t key,
       KEYID_IMPORT (kid, keyid);
       result = _gnutls_openpgp_privkey_get_mpis (key, kid,
                                                  params, &params_size);
+
+      i = gnutls_openpgp_privkey_get_subkey_idx (key, keyid);
+
+      pk_algorithm = gnutls_openpgp_privkey_get_subkey_pk_algorithm (key, i, NULL);
     }
   else
     {
+      pk_algorithm = gnutls_openpgp_privkey_get_pk_algorithm (key, NULL);
+
       result = _gnutls_openpgp_privkey_get_mpis (key, NULL,
                                                  params, &params_size);
+
     }
 
   if (result < 0)
@@ -1356,8 +1364,6 @@ _gnutls_openpgp_privkey_decrypt_data (gnutls_openpgp_privkey_t key,
       return result;
     }
 
-  pk_algorithm = gnutls_openpgp_privkey_get_pk_algorithm (key, NULL);
-
   if (pk_algorithm != GNUTLS_PK_RSA)
     {
       gnutls_assert ();