Subversion Repositories planix.SVN

Rev

Rev 26 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#include "os.h"
2
#include <libsec.h>
3
 
4
typedef ulong u32;
5
 
6
void
7
aesCFBencrypt(uchar *p, int len, AESstate *s)
8
{
9
	u32 a, o = s->offset;
10
 
11
	while(len > 0){
12
		if(o % 16){
13
		Odd:
14
			a = (s->ivec[o++ % 16] ^= *p), *p++ = a, len--;
15
			continue;
16
		}
17
		aes_encrypt(s->ekey, s->rounds, s->ivec, s->ivec);
18
		if(len < 16 || ((p-(uchar*)0) & 3) != 0)
19
			goto Odd;
20
		((u32*)p)[0] = (((u32*)s->ivec)[0] ^= ((u32*)p)[0]);
21
		((u32*)p)[1] = (((u32*)s->ivec)[1] ^= ((u32*)p)[1]);
22
		((u32*)p)[2] = (((u32*)s->ivec)[2] ^= ((u32*)p)[2]);
23
		((u32*)p)[3] = (((u32*)s->ivec)[3] ^= ((u32*)p)[3]);
24
		o += 16, p += 16, len -= 16;
25
	}
26
	s->offset = o;
27
}
28
 
29
void
30
aesCFBdecrypt(uchar *p, int len, AESstate *s)
31
{
32
	u32 a, o = s->offset;
33
 
34
	while(len > 0){
35
		if(o % 16){
36
		Odd:
37
			a = *p, *p++ ^= s->ivec[o % 16], s->ivec[o++ % 16] = a, len--;
38
			continue;
39
		}
40
		aes_encrypt(s->ekey, s->rounds, s->ivec, s->ivec);
41
		if(len < 16 || ((p-(uchar*)0) & 3) != 0)
42
			goto Odd;
43
		a = ((u32*)p)[0], ((u32*)p)[0] ^= ((u32*)s->ivec)[0], ((u32*)s->ivec)[0] = a;
44
		a = ((u32*)p)[1], ((u32*)p)[1] ^= ((u32*)s->ivec)[1], ((u32*)s->ivec)[1] = a;
45
		a = ((u32*)p)[2], ((u32*)p)[2] ^= ((u32*)s->ivec)[2], ((u32*)s->ivec)[2] = a;
46
		a = ((u32*)p)[3], ((u32*)p)[3] ^= ((u32*)s->ivec)[3], ((u32*)s->ivec)[3] = a;
47
		o += 16, p += 16, len -= 16;
48
	}
49
	s->offset = o;
50
}