summaryrefslogtreecommitdiff
path: root/fitz/filt_basic.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-07-09 02:47:51 +0200
committerTor Andersson <tor@ghostscript.com>2010-07-09 02:47:51 +0200
commit8d68dec4b460ac292ce0021717160a8cd9fcc8dd (patch)
tree322b0a32d97fa288fad5d0114561047bc1c4bf08 /fitz/filt_basic.c
parent3a4c396334bc500de4c9b1e957f030835b5df65e (diff)
downloadmupdf-8d68dec4b460ac292ce0021717160a8cd9fcc8dd.tar.xz
Rearrange and merge some files in the fitz directory.
Diffstat (limited to 'fitz/filt_basic.c')
-rw-r--r--fitz/filt_basic.c154
1 files changed, 137 insertions, 17 deletions
diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c
index b5b9f3c9..6ab80c32 100644
--- a/fitz/filt_basic.c
+++ b/fitz/filt_basic.c
@@ -1,5 +1,9 @@
#include "fitz.h"
+/*
+ * Identity filter.
+ */
+
fz_filter *
fz_newcopyfilter(void)
{
@@ -39,6 +43,10 @@ fz_processcopyfilter(fz_filter *filter, fz_buffer *in, fz_buffer *out)
}
}
+/*
+ * Null filter copies data until a specified length.
+ */
+
typedef struct fz_nullfilter_s fz_nullfilter;
struct fz_nullfilter_s
@@ -90,6 +98,10 @@ fz_processnullfilter(fz_filter *filter, fz_buffer *in, fz_buffer *out)
return fz_throw("braindead programmer trapped in nullfilter");
}
+/*
+ * ASCII Hex Decode
+ */
+
typedef struct fz_ahxd_s fz_ahxd;
struct fz_ahxd_s
@@ -181,23 +193,9 @@ fz_processahxd(fz_filter *filter, fz_buffer *in, fz_buffer *out)
}
}
-void
-fz_pushbackahxd(fz_filter *filter, fz_buffer *in, fz_buffer *out, int n)
-{
- int k;
-
- assert(filter->process == fz_processahxd);
- assert(out->wp - n >= out->rp);
-
- k = 0;
- while (k < n * 2) {
- in->rp --;
- if (ishex(*in->rp))
- k ++;
- }
-
- out->wp -= n;
-}
+/*
+ * ASCII 85 Decode
+ */
typedef struct fz_a85d_s fz_a85d;
@@ -314,6 +312,10 @@ fz_processa85d(fz_filter *filter, fz_buffer *in, fz_buffer *out)
}
}
+/*
+ * Run Length Decode
+ */
+
fz_filter *
fz_newrld(fz_obj *params)
{
@@ -384,3 +386,121 @@ fz_processrld(fz_filter *filter, fz_buffer *in, fz_buffer *out)
}
}
+/*
+ * RC4 Filter
+ */
+
+typedef struct fz_arc4c_s fz_arc4c;
+
+struct fz_arc4c_s
+{
+ fz_filter super;
+ fz_arc4 arc4;
+};
+
+fz_filter *
+fz_newarc4filter(unsigned char *key, unsigned keylen)
+{
+ FZ_NEWFILTER(fz_arc4c, f, arc4filter);
+ fz_arc4init(&f->arc4, key, keylen);
+ return (fz_filter *)f;
+}
+
+void
+fz_droparc4filter(fz_filter *f)
+{
+}
+
+fz_error
+fz_processarc4filter(fz_filter *filter, fz_buffer *in, fz_buffer *out)
+{
+ fz_arc4c *f = (fz_arc4c*)filter;
+ int n;
+
+ while (1)
+ {
+ if (in->rp + 1 > in->wp) {
+ if (in->eof)
+ return fz_iodone;
+ return fz_ioneedin;
+ }
+ if (out->wp + 1 > out->ep)
+ return fz_ioneedout;
+
+ n = MIN(in->wp - in->rp, out->ep - out->wp);
+ fz_arc4encrypt(&f->arc4, out->wp, in->rp, n);
+ in->rp += n;
+ out->wp += n;
+ }
+}
+
+/*
+ * AES Filter
+ */
+
+typedef struct fz_aesd_s fz_aesd;
+
+struct fz_aesd_s
+{
+ fz_filter super;
+ fz_aes aes;
+ unsigned char iv[16];
+ int ivcount;
+};
+
+fz_filter *
+fz_newaesdfilter(unsigned char *key, unsigned keylen)
+{
+ FZ_NEWFILTER(fz_aesd, f, aesdfilter);
+ aes_setkey_dec(&f->aes, key, keylen * 8);
+ f->ivcount = 0;
+ return (fz_filter *)f;
+}
+
+void
+fz_dropaesdfilter(fz_filter *f)
+{
+}
+
+fz_error
+fz_processaesdfilter(fz_filter *filter, fz_buffer *in, fz_buffer *out)
+{
+ fz_aesd *f = (fz_aesd*)filter;
+ int n;
+
+ while (1)
+ {
+ if (in->rp + 16 > in->wp)
+ {
+ if (in->eof)
+ return fz_iodone;
+ return fz_ioneedin;
+ }
+
+ if (f->ivcount < 16)
+ {
+ f->iv[f->ivcount++] = *in->rp++;
+ }
+ else
+ {
+ if (out->wp + 16 > out->ep)
+ return fz_ioneedout;
+
+ n = MIN(in->wp - in->rp, out->ep - out->wp);
+ n = (n / 16) * 16;
+
+ aes_crypt_cbc(&f->aes, AES_DECRYPT, n, f->iv, in->rp, out->wp);
+ in->rp += n;
+ out->wp += n;
+
+ /* Remove padding bytes */
+ if (in->eof && in->rp == in->wp)
+ {
+ int pad = out->wp[-1];
+ if (pad < 1 || pad > 16)
+ return fz_throw("aes padding out of range: %d", pad);
+ out->wp -= pad;
+ }
+ }
+ }
+}