gpg: default to AES-256.
[gnupg.git] / g10 / ecdh.c
index af1d844..6c2a56b 100644 (file)
@@ -14,7 +14,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -24,7 +24,7 @@
 #include <errno.h>
 
 #include "gpg.h"
-#include "util.h"
+#include "../common/util.h"
 #include "pkglue.h"
 #include "main.h"
 #include "options.h"
@@ -132,11 +132,29 @@ pk_ecdh_encrypt_with_shared_point (int is_encrypt, gcry_mpi_t shared_mpi,
         return err;
       }
 
+    /* Expected size of the x component */
     secret_x_size = (nbits+7)/8;
-    log_assert (nbytes >= secret_x_size);
+
+    /* Extract X from the result.  It must be in the format of:
+           04 || X || Y
+           40 || X
+           41 || X
+
+       Since it always comes with the prefix, it's larger than X.  In
+       old experimental version of libgcrypt, there is a case where it
+       returns X with no prefix of 40, so, nbytes == secret_x_size
+       is allowed.  */
+    if (nbytes < secret_x_size)
+      {
+        xfree (secret_x);
+        return gpg_error (GPG_ERR_BAD_DATA);
+      }
+
+    /* Remove the prefix.  */
     if ((nbytes & 1))
-      /* Remove the "04" prefix of non-compressed format.  */
       memmove (secret_x, secret_x+1, secret_x_size);
+
+    /* Clear the rest of data.  */
     if (nbytes - secret_x_size)
       memset (secret_x+secret_x_size, 0, nbytes-secret_x_size);
 
@@ -235,8 +253,8 @@ pk_ecdh_encrypt_with_shared_point (int is_encrypt, gcry_mpi_t shared_mpi,
         return err;
       }
     gcry_md_write(h, "\x00\x00\x00\x01", 4);      /* counter = 1 */
-    gcry_md_write(h, secret_x, secret_x_size);   /* x of the point X */
-    gcry_md_write(h, message, message_size);/* KDF parameters */
+    gcry_md_write(h, secret_x, secret_x_size);    /* x of the point X */
+    gcry_md_write(h, message, message_size);      /* KDF parameters */
 
     gcry_md_final (h);