filt_aes.c.svn-base

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 71 行

SVN-BASE
71
字号
/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info)   This code is in public domain.*/#include "fitz-base.h"#include "fitz-stream.h"typedef struct fz_aesc_s fz_aesc;struct fz_aesc_s{	fz_filter super;	fz_aes aes;	unsigned char iv[16];	int ivhas;};fz_error *fz_newaesfilter(fz_filter **fp, unsigned char *key, unsigned keylen){	FZ_NEWFILTER(fz_aesc, f, aesfilter);	fz_aesinit(&f->aes, key, keylen);	f->ivhas = 0;	return fz_okay;}voidfz_dropaesfilter(fz_filter *f){}fz_error *fz_processaesfilter(fz_filter *filter, fz_buffer *in, fz_buffer *out){	fz_aesc *f = (fz_aesc*)filter;	int n;	while (1)	{		if (in->rp + 1 > in->wp) {			if (in->eof)				return fz_iodone;			return fz_ioneedin;		}		/* first 16 bytes is iv for cbc mode of aes encryption */		if (f->ivhas < 16) 		{			int ivlen;			n = in->wp - in->rp;			ivlen = MIN(n, 16-f->ivhas);			memcpy(&f->iv[f->ivhas], in->rp, ivlen);			in->rp += ivlen;			f->ivhas += ivlen;			assert(f->ivhas <= 16);			fz_setiv(&f->aes, &f->iv[0]);		}		if (f->ivhas < 16)			continue;		if (out->wp + 1 > out->ep)			return fz_ioneedout;		n = MIN(in->wp - in->rp, out->ep - out->wp);		fz_aesdecrypt(&f->aes, out->wp, in->rp, n);		in->rp += n;		out->wp += n;	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?