if (nbits > MAX_MPI_BITS || nbits == 0)
{
_gnutls_write_log ("read_mpi: too large %d bits\n", (int) nbits);
- return CDK_MPI_Error; /* Sanity check */
+ return gnutls_assert_val(CDK_MPI_Error); /* Sanity check */
}
rc = stream_read (inp, buf + 2, nread, &nread);
{
_gnutls_write_log ("read_mpi: too short %d < %d\n", (int) nread,
(int) ((nbits + 7) / 8));
- return CDK_MPI_Error;
+ return gnutls_assert_val(CDK_MPI_Error);
}
buf[0] = nbits >> 8;
nread += 2;
err = _gnutls_mpi_scan_pgp (&m, buf, nread);
if (err < 0)
- return map_gnutls_error (err);
+ return gnutls_assert_val(map_gnutls_error (err));
*ret_m = m;
return rc;
{
cdk_error_t rc = read_mpi (inp, &pke->mpi[i], 0);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
return 0;
{
cdk_error_t rc = read_mpi (inp, &pk->mpi[i], 0);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
/* This value is just for the first run and will be
{
sk->protect.sha1chk = (sk->s2k_usage == 254);
sk->protect.algo = _pgp_cipher_to_gnutls (cdk_stream_getc (inp));
+ if (sk->protect.algo == GNUTLS_CIPHER_UNKNOWN)
+ return gnutls_assert_val(CDK_Inv_Algo);
+
sk->protect.s2k = cdk_calloc (1, sizeof *sk->protect.s2k);
if (!sk->protect.s2k)
return CDK_Out_Of_Core;
}
else
sk->protect.algo = _pgp_cipher_to_gnutls (sk->s2k_usage);
- if (sk->protect.algo == GNUTLS_CIPHER_NULL)
+ if (sk->protect.algo == GNUTLS_CIPHER_UNKNOWN)
+ return gnutls_assert_val(CDK_Inv_Algo);
+ else if (sk->protect.algo == GNUTLS_CIPHER_NULL)
{
sk->csum = 0;
nskey = cdk_pk_get_nskey (sk->pk->pubkey_algo);
{
rc = read_mpi (inp, &sk->mpi[i], 1);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
sk->csum = read_16 (inp);
sk->is_protected = 0;
{
rc = read_mpi (inp, &sk->mpi[i], 1);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
sk->csum = read_16 (inp);
sk->is_protected = 1;
read_signature (cdk_stream_t inp, size_t pktlen, cdk_pkt_signature_t sig)
{
size_t nbytes;
- size_t i, size, nsig;
+ size_t i, nsig;
+ ssize_t size;
cdk_error_t rc;
if (!inp || !sig)
- return CDK_Inv_Value;
+ return gnutls_assert_val(CDK_Inv_Value);
if (DEBUG_PKT)
_gnutls_write_log ("read_signature: %d octets\n", (int) pktlen);
if (pktlen < 16)
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
sig->version = cdk_stream_getc (inp);
if (sig->version < 2 || sig->version > 4)
- return CDK_Inv_Packet_Ver;
+ return gnutls_assert_val(CDK_Inv_Packet_Ver);
sig->flags.exportable = 1;
sig->flags.revocable = 1;
if (sig->version < 4)
{
if (cdk_stream_getc (inp) != 5)
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
sig->sig_class = cdk_stream_getc (inp);
sig->timestamp = read_32 (inp);
sig->keyid[0] = read_32 (inp);
sig->digest_start[1] = cdk_stream_getc (inp);
nsig = cdk_pk_get_nsig (sig->pubkey_algo);
if (!nsig)
- return CDK_Inv_Algo;
+ return gnutls_assert_val(CDK_Inv_Algo);
for (i = 0; i < nsig; i++)
{
rc = read_mpi (inp, &sig->mpi[i], 0);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
}
else
{
rc = read_subpkt (inp, &sig->hashed, &nbytes);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
size -= nbytes;
}
sig->unhashed_size = read_16 (inp);
{
rc = read_subpkt (inp, &sig->unhashed, &nbytes);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
size -= nbytes;
}
rc = parse_sig_subpackets (sig);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
sig->digest_start[0] = cdk_stream_getc (inp);
sig->digest_start[1] = cdk_stream_getc (inp);
nsig = cdk_pk_get_nsig (sig->pubkey_algo);
if (!nsig)
- return CDK_Inv_Algo;
+ return gnutls_assert_val(CDK_Inv_Algo);
for (i = 0; i < nsig; i++)
{
rc = read_mpi (inp, &sig->mpi[i], 0);
if (rc)
- return rc;
+ return gnutls_assert_val(rc);
}
}
if (cdk_stream_eof (inp) || ctb == EOF)
return CDK_EOF;
else if (!ctb)
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
pktsize++;
if (!(ctb & 0x80))
_cdk_log_info ("cdk_pkt_read: no openpgp data found. "
"(ctb=%02X; fpos=%02X)\n", (int) ctb,
(int) cdk_stream_tell (inp));
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
}
if (ctb & 0x40) /* RFC2440 packet format. */
if (pkttype > 63)
{
_cdk_log_info ("cdk_pkt_read: unknown type %d\n", pkttype);
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
}
if (is_newctb)
pkt->pkt.user_id = cdk_calloc (1, sizeof *pkt->pkt.user_id
+ NAME_SIZE);
if (!pkt->pkt.user_id)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
pkt->pkt.user_id->name =
(char *) pkt->pkt.user_id + sizeof (*pkt->pkt.user_id);
rc = read_attribute (inp, pktlen, pkt->pkt.user_id, NAME_SIZE);
pkt->pkttype = CDK_PKT_ATTRIBUTE;
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_USER_ID:
pkt->pkt.user_id = cdk_calloc (1, sizeof *pkt->pkt.user_id
+ pkt->pktlen + 1);
if (!pkt->pkt.user_id)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
pkt->pkt.user_id->name =
(char *) pkt->pkt.user_id + sizeof (*pkt->pkt.user_id);
rc = read_user_id (inp, pktlen, pkt->pkt.user_id);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_PUBLIC_KEY:
pkt->pkt.public_key = cdk_calloc (1, sizeof *pkt->pkt.public_key);
if (!pkt->pkt.public_key)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_public_key (inp, pktlen, pkt->pkt.public_key);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_PUBLIC_SUBKEY:
pkt->pkt.public_key = cdk_calloc (1, sizeof *pkt->pkt.public_key);
if (!pkt->pkt.public_key)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_public_subkey (inp, pktlen, pkt->pkt.public_key);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_SECRET_KEY:
pkt->pkt.secret_key = cdk_calloc (1, sizeof *pkt->pkt.secret_key);
if (!pkt->pkt.secret_key)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
pkt->pkt.secret_key->pk = cdk_calloc (1,
sizeof *pkt->pkt.secret_key->pk);
if (!pkt->pkt.secret_key->pk)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_secret_key (inp, pktlen, pkt->pkt.secret_key);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_SECRET_SUBKEY:
pkt->pkt.secret_key = cdk_calloc (1, sizeof *pkt->pkt.secret_key);
if (!pkt->pkt.secret_key)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
pkt->pkt.secret_key->pk = cdk_calloc (1,
sizeof *pkt->pkt.secret_key->pk);
if (!pkt->pkt.secret_key->pk)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_secret_subkey (inp, pktlen, pkt->pkt.secret_key);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_LITERAL:
pkt->pkt.literal = cdk_calloc (1, sizeof *pkt->pkt.literal);
if (!pkt->pkt.literal)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_literal (inp, pktlen, &pkt->pkt.literal, is_partial);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_ONEPASS_SIG:
pkt->pkt.onepass_sig = cdk_calloc (1, sizeof *pkt->pkt.onepass_sig);
if (!pkt->pkt.onepass_sig)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_onepass_sig (inp, pktlen, pkt->pkt.onepass_sig);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_SIGNATURE:
pkt->pkt.signature = cdk_calloc (1, sizeof *pkt->pkt.signature);
if (!pkt->pkt.signature)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_signature (inp, pktlen, pkt->pkt.signature);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_PUBKEY_ENC:
pkt->pkt.pubkey_enc = cdk_calloc (1, sizeof *pkt->pkt.pubkey_enc);
if (!pkt->pkt.pubkey_enc)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_pubkey_enc (inp, pktlen, pkt->pkt.pubkey_enc);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_COMPRESSED:
pkt->pkt.compressed = cdk_calloc (1, sizeof *pkt->pkt.compressed);
if (!pkt->pkt.compressed)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_compressed (inp, pktlen, pkt->pkt.compressed);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
case CDK_PKT_MDC:
pkt->pkt.mdc = cdk_calloc (1, sizeof *pkt->pkt.mdc);
if (!pkt->pkt.mdc)
- return CDK_Out_Of_Core;
+ return gnutls_assert_val(CDK_Out_Of_Core);
rc = read_mdc (inp, pkt->pkt.mdc);
+ if (rc)
+ return gnutls_assert_val(rc);
break;
default:
return CDK_Inv_Value;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("open stream `%s'\n", file);
+#endif
*ret_s = NULL;
s = cdk_calloc (1, sizeof *s);
if (!s)
gnutls_assert ();
return CDK_File_Error;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("open stream fd=%d\n", fileno (s->fp));
+#endif
s->flags.write = 0;
*ret_s = s;
return 0;
return CDK_Inv_Value;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("new stream `%s'\n", file ? file : "[temp]");
+#endif
*ret_s = NULL;
s = cdk_calloc (1, sizeof *s);
if (!s)
gnutls_assert ();
return CDK_File_Error;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("new stream fd=%d\n", fileno (s->fp));
+#endif
*ret_s = s;
return 0;
}
return CDK_Inv_Value;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("create stream `%s'\n", file);
+#endif
*ret_s = NULL;
s = cdk_calloc (1, sizeof *s);
if (!s)
gnutls_assert ();
return CDK_File_Error;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream create fd=%d\n", fileno (s->fp));
+#endif
*ret_s = s;
return 0;
}
return CDK_Out_Of_Core;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream ref fd=%d\n", fileno (fp));
+#endif
s->fp = fp;
s->fp_ref = 1;
s->flags.filtrated = 1;
return CDK_Inv_Value;
}
+#ifdef DEBUG_STREAM
_gnutls_read_log ("close stream ref=%d `%s'\n",
s->fp_ref, s->fname ? s->fname : "[temp]");
+#endif
/* In the user callback mode, we call the release cb if possible
and just free the stream. */
{
int err;
+#ifdef DEBUG_STREAM
_gnutls_read_log ("close stream fd=%d\n", fileno (s->fp));
+#endif
err = fclose (s->fp);
s->fp = NULL;
if (err)
s->cache.alloced = 0;
cdk_free (s);
- gnutls_assert ();
+
+ if (rc)
+ gnutls_assert ();
+
return rc;
}
assert (s);
+#ifdef DEBUG_STREAM
_gnutls_read_log ("replace stream fd=%d with fd=%d\n",
fileno (s->fp), fileno (*tmp));
+#endif
rc = fclose (s->fp);
if (rc)
{
if (!f->flags.enabled)
continue;
/* if there is no next filter, create the final output file */
+#ifdef DEBUG_STREAM
_gnutls_read_log ("filter [write]: last filter=%d fname=%s\n",
f->next ? 1 : 0, s->fname);
+#endif
if (!f->next && s->fname)
f->tmp = fopen (s->fname, "w+b");
else
break;
}
rc = f->fnct (f->uint8_t, f->ctl, s->fp, f->tmp);
+#ifdef DEBUG_STREAM
_gnutls_read_log ("filter [write]: type=%d rc=%d\n", f->type, rc);
+#endif
if (!rc)
rc = stream_fp_replace (s, &f->tmp);
if (!rc)
rc = cdk_stream_seek (s, 0);
if (rc)
{
+#ifdef DEBUG_STREAM
_gnutls_read_log ("filter [close]: fd=%d\n", fileno (f->tmp));
+#endif
fclose (f->tmp);
f->tmp = NULL;
break;
continue;
if (f->flags.error)
{
+#ifdef DEBUG_STREAM
_gnutls_read_log ("filter %s [read]: has the error flag; skipped\n",
s->fname ? s->fname : "[temp]");
+#endif
continue;
}
break;
}
rc = f->fnct (f->uint8_t, f->ctl, s->fp, f->tmp);
+#ifdef DEBUG_STREAM
_gnutls_read_log ("filter %s [read]: type=%d rc=%d\n",
s->fname ? s->fname : "[temp]", f->type, rc);
+#endif
if (rc)
{
f->flags.error = 1;
if (s->cache.on)
{
+#ifdef DEBUG_STREAM
+ _gnutls_read_log ("stream[ref=%u]: written %d bytes\n", s->fp_ref, (int) count);
+#endif
+
/* We need to resize the buffer if the additional data wouldn't
fit into it. We allocate more memory to avoid to resize it the
next time the function is used. */
s->cache.alloced += (count + STREAM_BUFSIZE);
memcpy (s->cache.buf, old, s->cache.size);
cdk_free (old);
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream: enlarge cache to %d octets\n",
(int) s->cache.alloced);
+#endif
}
+
memcpy (s->cache.buf + s->cache.size, buf, count);
s->cache.size += count;
return count;
}
+#ifdef DEBUG_STREAM
+ _gnutls_read_log ("stream[fd=%u]: written %d bytes\n", fileno (s->fp), (int) count);
+#endif
+
nwritten = fwrite (buf, 1, count, s->fp);
if (!nwritten)
nwritten = EOF;
struct stream_filter_s *f;
const char *orig_fname;
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream: enable literal mode.\n");
+#endif
if (!s)
{
gnutls_assert ();
return CDK_Not_Implemented;
-
-#if 0
- struct stream_filter_s *f;
-
- if (!s)
- return CDK_Inv_Value;
- f = filter_add (s, _cdk_filter_compress, fCOMPRESS);
- if (!f)
- return CDK_Out_Of_Core;
- f->ctl = stream_get_mode (s);
- f->u.zfx.algo = algo;
- f->u.zfx.level = level;
- return 0;
-#endif
}
{
s->cache.buf = cdk_calloc (1, STREAM_BUFSIZE);
s->cache.alloced = STREAM_BUFSIZE;
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream: allocate cache of %d octets\n",
STREAM_BUFSIZE);
+#endif
}
return 0;
}
/* Memory mapping is not supported on custom I/O objects. */
if (s->cbs_hd)
{
+#ifdef DEBUG_STREAM
_gnutls_read_log ("cdk_stream_mmap_part: not supported on callbacks\n");
+#endif
gnutls_assert ();
return CDK_Inv_Mode;
}
{
assert (s);
+#ifdef DEBUG_STREAM
_gnutls_read_log ("stream: activate block mode with blocksize %d\n",
(int) nbytes);
+#endif
s->blkmode = nbytes;
return 0;
}
return CDK_Inv_Value;
if (!KEY_CAN_SIGN (sig->pubkey_algo))
- return CDK_Inv_Algo;
+ return gnutls_assert_val(CDK_Inv_Algo);
if (sig->version < 2 || sig->version > 4)
- return CDK_Inv_Packet;
+ return gnutls_assert_val(CDK_Inv_Packet);
if (DEBUG_PKT)
_gnutls_write_log ("write_signature:\n");
nsig = cdk_pk_get_nsig (sig->pubkey_algo);
if (!nsig)
- return CDK_Inv_Algo;
+ return gnutls_assert_val(CDK_Inv_Algo);
if (sig->version < 4)
return write_v3_sig (out, sig, nsig);
size = 10 + calc_subpktsize (sig->hashed)
+ calc_subpktsize (sig->unhashed) + calc_mpisize (sig->mpi, nsig);
+
rc = pkt_write_head (out, 0, size, CDK_PKT_SIGNATURE);
- if (!rc)
- rc = stream_putc (out, 4);
- if (!rc)
- rc = stream_putc (out, sig->sig_class);
- if (!rc)
- rc = stream_putc (out, _cdk_pub_algo_to_pgp (sig->pubkey_algo));
- if (!rc)
- rc = stream_putc (out, _gnutls_hash_algo_to_pgp (sig->digest_algo));
- if (!rc)
- rc = write_16 (out, sig->hashed_size);
- if (!rc)
- {
- buf = _cdk_subpkt_get_array (sig->hashed, 0, &nbytes);
- if (!buf)
- return CDK_Out_Of_Core;
- rc = stream_write (out, buf, nbytes);
- cdk_free (buf);
- }
- if (!rc)
- rc = write_16 (out, sig->unhashed_size);
- if (!rc)
- {
- buf = _cdk_subpkt_get_array (sig->unhashed, 0, &nbytes);
- if (!buf)
- return CDK_Out_Of_Core;
- rc = stream_write (out, buf, nbytes);
- cdk_free (buf);
- }
- if (!rc)
- rc = stream_putc (out, sig->digest_start[0]);
- if (!rc)
- rc = stream_putc (out, sig->digest_start[1]);
- if (!rc)
- rc = write_mpibuf (out, sig->mpi, nsig);
- return rc;
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, 4);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, sig->sig_class);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, _cdk_pub_algo_to_pgp (sig->pubkey_algo));
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, _gnutls_hash_algo_to_pgp (sig->digest_algo));
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = write_16 (out, sig->hashed_size);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ buf = _cdk_subpkt_get_array (sig->hashed, 0, &nbytes);
+ if (!buf)
+ return gnutls_assert_val(CDK_Out_Of_Core);
+
+ rc = stream_write (out, buf, nbytes);
+ cdk_free (buf);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = write_16 (out, sig->unhashed_size);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ buf = _cdk_subpkt_get_array (sig->unhashed, 0, &nbytes);
+ if (!buf)
+ return gnutls_assert_val(CDK_Out_Of_Core);
+
+ rc = stream_write (out, buf, nbytes);
+ cdk_free (buf);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, sig->digest_start[0]);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = stream_putc (out, sig->digest_start[1]);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ rc = write_mpibuf (out, sig->mpi, nsig);
+ if (rc)
+ return gnutls_assert_val(rc);
+
+ return 0;
}
if (!out || !pkt)
return CDK_Inv_Value;
- _gnutls_write_log ("write packet pkttype=%d\n", pkt->pkttype);
+ if (DEBUG_PKT)
+ _gnutls_write_log ("write packet pkttype=%d\n", pkt->pkttype);
+
switch (pkt->pkttype)
{
case CDK_PKT_LITERAL: