move aes bits to libsec from nix kernel Reference: /n/atom/patch/applied/wifisec Date: Sat May 24 03:22:39 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/wifi.c Sat May 24 03:22:38 2014 +++ /sys/src/nix/k10/wifi.c Sat May 24 03:22:38 2014 @@ -1395,128 +1395,6 @@ return memcmp(b->wp, mic, 8) != 0; } -#define putbe xputbe -static uchar* -putbe(uchar *p, int L, uint v) -{ - while(--L >= 0) - *p++ = (v >> L*8) & 0xFF; - return p; -} - -static void -xblock(int L, int M, uchar *N, uchar *a, int la, int lm, uchar t[16], AESstate *s) -{ - uchar l[8], *p, *x, *e; - - assert(M >= 4 && M <= 16); - assert(L >= 2 && L <= 4); - - t[0] = ((la > 0)<<6) | ((M-2)/2)<<3 | (L-1); /* flags */ - memmove(&t[1], N, 15-L); - putbe(&t[16-L], L, lm); - aes_encrypt(s->ekey, s->rounds, t, t); - - if(la > 0){ - assert(la < 0xFF00); - for(p = l, e = putbe(l, 2, la), x = t; p < e; x++, p++) - *x ^= *p; - for(e = a + la; a < e; x = t){ - for(; a < e && x < &t[16]; x++, a++) - *x ^= *a; - aes_encrypt(s->ekey, s->rounds, t, t); - } - } -} - -static uchar* -sblock(int L, uchar *N, uint i, uchar b[16], AESstate *s) -{ - b[0] = L-1; /* flags */ - memmove(&b[1], N, 15-L); - putbe(&b[16-L], L, i); - aes_encrypt(s->ekey, s->rounds, b, b); - return b; -}; - -static void -aesCCMencrypt(int L, int M, uchar *N /* N[15-L] */, - uchar *a /* a[la] */, int la, - uchar *m /* m[lm+M] */, int lm, - AESstate *s) -{ - uchar t[16], b[16], *p, *x; - uint i; - - xblock(L, M, N, a, la, lm, t, s); - - for(i = 1; lm >= 16; i++, m += 16, lm -= 16){ - sblock(L, N, i, b, s); - - *((u32int*)&t[0]) ^= *((u32int*)&m[0]); - *((u32int*)&m[0]) ^= *((u32int*)&b[0]); - *((u32int*)&t[4]) ^= *((u32int*)&m[4]); - *((u32int*)&m[4]) ^= *((u32int*)&b[4]); - *((u32int*)&t[8]) ^= *((u32int*)&m[8]); - *((u32int*)&m[8]) ^= *((u32int*)&b[8]); - *((u32int*)&t[12]) ^= *((u32int*)&m[12]); - *((u32int*)&m[12]) ^= *((u32int*)&b[12]); - - aes_encrypt(s->ekey, s->rounds, t, t); - } - if(lm > 0){ - for(p = sblock(L, N, i, b, s), x = t; p < &b[lm]; x++, m++, p++){ - *x ^= *m; - *m ^= *p; - } - aes_encrypt(s->ekey, s->rounds, t, t); - } - - for(p = sblock(L, N, 0, b, s), x = t; p < &b[M]; x++, p++) - *x ^= *p; - - memmove(m, t, M); -} - -static int -aesCCMdecrypt(int L, int M, uchar *N /* N[15-L] */, - uchar *a /* a[la] */, int la, - uchar *m /* m[lm+M] */, int lm, - AESstate *s) -{ - uchar t[16], b[16], *p, *x; - uint i; - - xblock(L, M, N, a, la, lm, t, s); - - for(i = 1; lm >= 16; i++, m += 16, lm -= 16){ - sblock(L, N, i, b, s); - - *((u32int*)&m[0]) ^= *((u32int*)&b[0]); - *((u32int*)&t[0]) ^= *((u32int*)&m[0]); - *((u32int*)&m[4]) ^= *((u32int*)&b[4]); - *((u32int*)&t[4]) ^= *((u32int*)&m[4]); - *((u32int*)&m[8]) ^= *((u32int*)&b[8]); - *((u32int*)&t[8]) ^= *((u32int*)&m[8]); - *((u32int*)&m[12]) ^= *((u32int*)&b[12]); - *((u32int*)&t[12]) ^= *((u32int*)&m[12]); - - aes_encrypt(s->ekey, s->rounds, t, t); - } - if(lm > 0){ - for(p = sblock(L, N, i, b, s), x = t; p < &b[lm]; x++, m++, p++){ - *m ^= *p; - *x ^= *m; - } - aes_encrypt(s->ekey, s->rounds, t, t); - } - - for(p = sblock(L, N, 0, b, s), x = t; p < &b[M]; x++, p++) - *x ^= *p; - - return memcmp(m, t, M) != 0; -} - static int setupCCMP(Wkey *k, Wifipkt *w, uvlong tsc, uchar nonce[13], uchar auth[32], AESstate *as) {