diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-07-09 02:47:51 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-07-09 02:47:51 +0200 |
commit | 8d68dec4b460ac292ce0021717160a8cd9fcc8dd (patch) | |
tree | 322b0a32d97fa288fad5d0114561047bc1c4bf08 /fitz/filt_basic.c | |
parent | 3a4c396334bc500de4c9b1e957f030835b5df65e (diff) | |
download | mupdf-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.c | 154 |
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; + } + } + } +} |