aboutsummaryrefslogtreecommitdiffstats
path: root/g10/parse-packet.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2011-01-21 11:00:57 +0000
committerWerner Koch <[email protected]>2011-01-21 11:00:57 +0000
commit90b0ff23b7e51332592668e4034967c1aac1c593 (patch)
treea3ef4cbd4c679a954a2cceba218b54cc2e2e9be5 /g10/parse-packet.c
parentAdd ignore file (diff)
downloadgnupg-90b0ff23b7e51332592668e4034967c1aac1c593.tar.gz
gnupg-90b0ff23b7e51332592668e4034967c1aac1c593.zip
Editorial changes and allow building with old libgcrypts.
Changed order of some conditional to make to put the special case into the true branch. Indentation changes. Minor other changes to make the ECC code more similar to the rest of our code. It builds but many sefltests still fail. Need to fix that before using it with an ECDH enabled libgcrypt. [/] 2011-01-21 Werner Koch <[email protected]> * configure.ac: Need Libgcrypt 1.4.6 due to AESWRAP. (HAVE_GCRY_PK_ECDH): Add new test. [agent/] 2011-01-21 Werner Koch <[email protected]> * cvt-openpgp.c (GCRY_PK_ECDH) [!HAVE_GCRY_PK_ECDH]: New. [include/] 2011-01-21 Werner Koch <[email protected]> * cipher.h (GCRY_PK_USAGE_CERT): Remove compatibility macros because we now require libgcrypt 1.4.6. (GCRY_PK_ECDH): Add replacement.
Diffstat (limited to 'g10/parse-packet.c')
-rw-r--r--g10/parse-packet.c194
1 files changed, 107 insertions, 87 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index d43ab2cba..5df336e55 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -939,40 +939,47 @@ parse_pubkeyenc (IOBUF inp, int pkttype, unsigned long pktlen,
}
else
{
- if( k->pubkey_algo != PUBKEY_ALGO_ECDH ) {
- for (i = 0; i < ndata; i++)
- {
- n = pktlen;
- k->data[i] = mpi_read (inp, &n, 0);
- pktlen -= n;
- if (list_mode)
- {
- es_fprintf (listfp, "\tdata: ");
- mpi_print (listfp, k->data[i], mpi_print_mode);
- es_putc ('\n', listfp);
- }
- if (!k->data[i])
- rc = gpg_error (GPG_ERR_INV_PACKET);
- }
- }
- else
+ if (k->pubkey_algo == PUBKEY_ALGO_ECDH)
{
- byte encr_buf[255];
- assert( ndata == 2 );
- n = pktlen; k->data[0] = mpi_read(inp, &n, 0); pktlen -=n;
- rc = iobuf_read_size_body( inp, encr_buf, sizeof(encr_buf), pktlen, k->data+1 );
- if( rc )
- goto leave;
- if( list_mode ) {
- es_fprintf (listfp, "\tdata: ");
- mpi_print(listfp, k->data[0], mpi_print_mode );
- es_putc ('\n', listfp);
- es_fprintf (listfp, "\tdata: [% 3d bytes] ", encr_buf[0]+1);
- mpi_print(listfp, k->data[1], mpi_print_mode );
- es_putc ('\n', listfp);
- }
- pktlen -= (encr_buf[0]+1);
- }
+ byte encr_buf[255];
+
+ assert (ndata == 2);
+ n = pktlen;
+ k->data[0] = mpi_read (inp, &n, 0);
+ pktlen -= n;
+ rc = iobuf_read_size_body (inp, encr_buf, sizeof(encr_buf),
+ pktlen, k->data+1);
+ if (rc)
+ goto leave;
+
+ if (list_mode)
+ {
+ es_fprintf (listfp, "\tdata: ");
+ mpi_print (listfp, k->data[0], mpi_print_mode );
+ es_putc ('\n', listfp);
+ es_fprintf (listfp, "\tdata: [% 3d bytes] ", encr_buf[0]+1);
+ mpi_print (listfp, k->data[1], mpi_print_mode );
+ es_putc ('\n', listfp);
+ }
+ pktlen -= (encr_buf[0]+1);
+ }
+ else
+ {
+ for (i = 0; i < ndata; i++)
+ {
+ n = pktlen;
+ k->data[i] = mpi_read (inp, &n, 0);
+ pktlen -= n;
+ if (list_mode)
+ {
+ es_fprintf (listfp, "\tdata: ");
+ mpi_print (listfp, k->data[i], mpi_print_mode);
+ es_putc ('\n', listfp);
+ }
+ if (!k->data[i])
+ rc = gpg_error (GPG_ERR_INV_PACKET);
+ }
+ }
}
leave:
@@ -1946,61 +1953,74 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
else
{
/* Fill in public key parameters. */
- if( algorithm != PUBKEY_ALGO_ECDSA && algorithm != PUBKEY_ALGO_ECDH ) {
- for (i = 0; i < npkey; i++)
- {
- n = pktlen;
- pk->pkey[i] = mpi_read (inp, &n, 0);
- pktlen -= n;
- if (list_mode)
- {
- es_fprintf (listfp, "\tpkey[%d]: ", i);
- mpi_print (listfp, pk->pkey[i], mpi_print_mode);
- es_putc ('\n', listfp);
- }
- if (!pk->pkey[i])
- err = gpg_error (GPG_ERR_INV_PACKET);
- }
- }
- else {
- /* note that the code in this function ignores the errors */
- byte name_oid[256];
- err = iobuf_read_size_body( inp, name_oid, sizeof(name_oid), pktlen, pk->pkey+0 );
- if( err )
- goto leave;
- n = name_oid[0];
- if( list_mode )
- es_fprintf (listfp, "\tpkey[0]: curve OID [%d] ...%02x %02x\n",
- n, name_oid[1+n-2], name_oid[1+n-1] );
- pktlen -= (n+1);
- /* set item [1], which corresponds to the public key; these two fields are all we need to uniquely define the key */
- // log_debug("Parsing ecc public key in the public packet, pktlen=%lu\n", pktlen);
- n = pktlen; pk->pkey[1] = mpi_read( inp, &n, 0 ); pktlen -=n;
- if( pk->pkey[1]==NULL )
- err = gpg_error(G10ERR_INVALID_PACKET);
- else if( list_mode ) {
- es_fprintf (listfp, "\tpkey[1]: ");
- mpi_print(listfp, pk->pkey[1], mpi_print_mode);
- es_putc ('\n', listfp);
+ if (algorithm == PUBKEY_ALGO_ECDSA && algorithm == PUBKEY_ALGO_ECDH)
+ {
+ /* FIXME: The code in this function ignores the errors. */
+ byte name_oid[256];
+
+ err = iobuf_read_size_body (inp, name_oid, sizeof(name_oid),
+ pktlen, pk->pkey+0);
+ if (err)
+ goto leave;
+ n = name_oid[0];
+ if (list_mode)
+ es_fprintf (listfp, "\tpkey[0]: curve OID [%d] ...%02x %02x\n",
+ n, name_oid[1+n-2], name_oid[1+n-1]);
+ pktlen -= (n+1);
+ /* Set item [1], which corresponds to the public key; these
+ two fields are all we need to uniquely define the key/ */
+ n = pktlen;
+ pk->pkey[1] = mpi_read( inp, &n, 0 );
+ pktlen -=n;
+ if (!pk->pkey[1])
+ err = gpg_error (GPG_ERR_INV_PACKET);
+ else if (list_mode)
+ {
+ es_fprintf (listfp, "\tpkey[1]: ");
+ mpi_print (listfp, pk->pkey[1], mpi_print_mode);
+ es_putc ('\n', listfp);
}
- /* One more field for ECDH */
- if( algorithm == PUBKEY_ALGO_ECDH ) {
-#define kek_params name_oid
- err = iobuf_read_size_body( inp, kek_params, sizeof(kek_params), pktlen, pk->pkey+2 );
- if( err )
- goto leave;
- n = kek_params[0];
- if( kek_params[1] != 1 ) {
- log_error("invalid ecdh KEK parameters field type in private key: understand type 1, but found 0x%02x\n", kek_params[1]);
- err = gpg_error(G10ERR_INVALID_PACKET);
- goto leave;
- }
- if( list_mode )
- es_fprintf (listfp, "\tpkey[2]: KEK params type=01 hash:%d sym-algo:%d\n", kek_params[1+n-2], kek_params[1+n-1] );
- pktlen -= (n+1);
-#undef kek_params
- }
- }
+ /* One more field for ECDH. */
+ if (algorithm == PUBKEY_ALGO_ECDH)
+ {
+ /* (NAMEOID holds the KEK params.) */
+ err = iobuf_read_size_body (inp, name_oid, sizeof(name_oid),
+ pktlen, pk->pkey+2);
+ if (err)
+ goto leave;
+ n = name_oid[0];
+ if (name_oid[1] != 1)
+ {
+ log_error ("invalid ecdh KEK parameters field type in "
+ "private key: understand type 1, "
+ "but found 0x%02x\n", name_oid[1]);
+ err = gpg_error (GPG_ERR_INV_PACKET);
+ goto leave;
+ }
+ if (list_mode)
+ es_fprintf (listfp, "\tpkey[2]: KEK params type=01 "
+ "hash:%d sym-algo:%d\n",
+ name_oid[1+n-2], name_oid[1+n-1]);
+ pktlen -= (n+1);
+ }
+ }
+ else
+ {
+ for (i = 0; i < npkey; i++)
+ {
+ n = pktlen;
+ pk->pkey[i] = mpi_read (inp, &n, 0);
+ pktlen -= n;
+ if (list_mode)
+ {
+ es_fprintf (listfp, "\tpkey[%d]: ", i);
+ mpi_print (listfp, pk->pkey[i], mpi_print_mode);
+ es_putc ('\n', listfp);
+ }
+ if (!pk->pkey[i])
+ err = gpg_error (GPG_ERR_INV_PACKET);
+ }
+ }
if (err)
goto leave;
}