diff options
author | taruti <taruti@violetti.org> | 2011-05-24 22:19:33 +0000 |
---|---|---|
committer | taruti <taruti@violetti.org> | 2011-05-24 22:19:33 +0000 |
commit | 9655db255097b84cf742b7a33c74432d4eb3425a (patch) | |
tree | 81dd1509453d330ac9e94ca6f5b1a7fe7bdbba2d /sys/src/libsec | |
parent | f34231e16a9780a1aa1b9fe5dad1776dd82caa44 (diff) |
devfs crypto code - alpha version
Diffstat (limited to 'sys/src/libsec')
-rw-r--r-- | sys/src/libsec/port/aes_xts.c | 69 | ||||
-rw-r--r-- | sys/src/libsec/port/mkfile | 1 |
2 files changed, 70 insertions, 0 deletions
diff --git a/sys/src/libsec/port/aes_xts.c b/sys/src/libsec/port/aes_xts.c new file mode 100644 index 000000000..f200e4db2 --- /dev/null +++ b/sys/src/libsec/port/aes_xts.c @@ -0,0 +1,69 @@ +// Author Taru Karttunen <taruti@taruti.net> +// This file can be used as both Public Domain or Creative Commons CC0. +#include <u.h> +#include <libsec.h> + +#define AesBlockSize 16 + +static void xor128(uchar* o,uchar* i1,uchar* i2) { + ((ulong*)o)[0] = ((ulong*)i1)[0] ^ ((ulong*)i2)[0]; + ((ulong*)o)[1] = ((ulong*)i1)[1] ^ ((ulong*)i2)[1]; + ((ulong*)o)[2] = ((ulong*)i1)[2] ^ ((ulong*)i2)[2]; + ((ulong*)o)[3] = ((ulong*)i1)[3] ^ ((ulong*)i2)[3]; +} + +static void gf_mulx(uchar* x) { + ulong t = ((((ulong*)(x))[3] & 0x80000000u) ? 0x00000087u : 0);; + ((ulong*)(x))[3] = (((ulong*)(x))[3] << 1) | (((ulong*)(x))[2] & 0x80000000u ? 1 : 0); + ((ulong*)(x))[2] = (((ulong*)(x))[2] << 1) | (((ulong*)(x))[1] & 0x80000000u ? 1 : 0); + ((ulong*)(x))[1] = (((ulong*)(x))[1] << 1) | (((ulong*)(x))[0] & 0x80000000u ? 1 : 0); + ((ulong*)(x))[0] = (((ulong*)(x))[0] << 1) ^ t; + +} + +int aes_xts_encrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len) { + uchar T[16], x[16]; + int i; + + if(len % 16 != 0) + return -1; + + for(i=0; i<AesBlockSize; i++) { + T[i] = (uchar)(sectorNumber & 0xFF); + sectorNumber = sectorNumber >> 8; + } + + aes_encrypt(tweak, 10, T, T); + + for (i=0; i<len; i+=AesBlockSize) { + xor128(&x[0], &input[i], &T[0]); + aes_encrypt(ecb, 10, x, x); + xor128(&output[i], &x[0], &T[0]); + gf_mulx(&T[0]); + } + return 0; +} + +int aes_xts_decrypt(ulong tweak[], ulong ecb[], vlong sectorNumber, uchar *input, uchar *output, ulong len) { + uchar T[16], x[16]; + int i; + + if(len % 16 != 0) + return -1; + + for(i=0; i<AesBlockSize; i++) { + T[i] = (uchar)(sectorNumber & 0xFF); + sectorNumber = sectorNumber >> 8; + } + + aes_encrypt(tweak, 10, T, T); + + for (i=0; i<len; i+=AesBlockSize) { + xor128(&x[0], &input[i], &T[0]); + aes_decrypt(ecb, 10, x, x); + xor128(&output[i], &x[0], &T[0]); + gf_mulx(&T[0]); + } + return 0; +} + diff --git a/sys/src/libsec/port/mkfile b/sys/src/libsec/port/mkfile index 41d1f0c78..b14df90a4 100644 --- a/sys/src/libsec/port/mkfile +++ b/sys/src/libsec/port/mkfile @@ -17,6 +17,7 @@ CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\ egsign.c egverify.c \ dsagen.c dsaalloc.c dsaprivtopub.c dsasign.c dsaverify.c \ tlshand.c thumb.c readcert.c \ + aes_xts.c \ ALLOFILES=${CFILES:%.c=%.$O} |