Module Name: src Committed By: alnsn Date: Sun Dec 11 00:28:45 UTC 2016
Modified Files: src/sys/crypto/rijndael: rijndael-api-fst.c rijndael-api-fst.h Log Message: Add XTS mode. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/crypto/rijndael/rijndael-api-fst.c cvs rdiff -u -r1.8 -r1.9 src/sys/crypto/rijndael/rijndael-api-fst.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/crypto/rijndael/rijndael-api-fst.c diff -u src/sys/crypto/rijndael/rijndael-api-fst.c:1.24 src/sys/crypto/rijndael/rijndael-api-fst.c:1.25 --- src/sys/crypto/rijndael/rijndael-api-fst.c:1.24 Sat May 14 16:46:55 2011 +++ src/sys/crypto/rijndael/rijndael-api-fst.c Sun Dec 11 00:28:44 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: rijndael-api-fst.c,v 1.24 2011/05/14 16:46:55 jmmv Exp $ */ +/* $NetBSD: rijndael-api-fst.c,v 1.25 2016/12/11 00:28:44 alnsn Exp $ */ /** * rijndael-api-fst.c @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rijndael-api-fst.c,v 1.24 2011/05/14 16:46:55 jmmv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rijndael-api-fst.c,v 1.25 2016/12/11 00:28:44 alnsn Exp $"); #include <sys/param.h> #ifdef _KERNEL @@ -52,6 +52,8 @@ __KERNEL_RCSID(0, "$NetBSD: rijndael-api #include <crypto/rijndael/rijndael-alg-fst.h> #include <crypto/rijndael/rijndael-api-fst.h> +#define XTS_ALPHA 0x87 + static void xor16(uint8_t *d, const uint8_t *a, const uint8_t* b) { for (size_t i = 0; i < 4; i++) { @@ -62,6 +64,22 @@ static void xor16(uint8_t *d, const uint } } +static void +xts_exponentiate(uint8_t *iv) +{ + unsigned int carry = 0; + + for (size_t i = 0; i < 16; i++) { + unsigned int msb = iv[i] >> 7; + + iv[i] = (iv[i] << 1) | carry; + carry = msb; + } + + if (carry != 0) + iv[0] ^= XTS_ALPHA; +} + int rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen, const char *keyMaterial) @@ -102,7 +120,8 @@ rijndael_makeKey(keyInstance *key, BYTE int rijndael_cipherInit(cipherInstance *cipher, BYTE mode, const char *IV) { - if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { + if ((mode == MODE_ECB) || (mode == MODE_CBC) || + (mode == MODE_XTS) || (mode == MODE_CFB1)) { cipher->mode = mode; } else { return BAD_CIPHER_MODE; @@ -153,6 +172,18 @@ rijndael_blockEncrypt(cipherInstance *ci } break; + case MODE_XTS: + iv = (u_int8_t *)cipher->IV; + for (i = numBlocks; i > 0; i--) { + xor16(block, input, iv); + rijndaelEncrypt(key->rk, key->Nr, block, block); + xor16(outBuffer, block, iv); + xts_exponentiate(iv); + input += 16; + outBuffer += 16; + } + break; + case MODE_CFB1: iv = (u_int8_t *)cipher->IV; for (i = numBlocks; i > 0; i--) { @@ -284,7 +315,19 @@ rijndael_blockDecrypt(cipherInstance *ci } break; - case MODE_CFB1: + case MODE_XTS: + iv = (u_int8_t *)cipher->IV; + for (i = numBlocks; i > 0; i--) { + xor16(block, input, iv); + rijndaelDecrypt(key->rk, key->Nr, block, block); + xor16(outBuffer, block, iv); + xts_exponentiate(iv); + input += 16; + outBuffer += 16; + } + break; + + case MODE_CFB1: iv = (u_int8_t *)cipher->IV; for (i = numBlocks; i > 0; i--) { memcpy(outBuffer, input, 16); Index: src/sys/crypto/rijndael/rijndael-api-fst.h diff -u src/sys/crypto/rijndael/rijndael-api-fst.h:1.8 src/sys/crypto/rijndael/rijndael-api-fst.h:1.9 --- src/sys/crypto/rijndael/rijndael-api-fst.h:1.8 Sun Jan 21 23:00:08 2007 +++ src/sys/crypto/rijndael/rijndael-api-fst.h Sun Dec 11 00:28:44 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: rijndael-api-fst.h,v 1.8 2007/01/21 23:00:08 cbiere Exp $ */ +/* $NetBSD: rijndael-api-fst.h,v 1.9 2016/12/11 00:28:44 alnsn Exp $ */ /** * rijndael-api-fst.h @@ -48,6 +48,7 @@ #define MODE_ECB 1 /* Are we ciphering in ECB mode? */ #define MODE_CBC 2 /* Are we ciphering in CBC mode? */ #define MODE_CFB1 3 /* Are we ciphering in 1-bit CFB mode? */ +#define MODE_XTS 4 /* Are we ciphering in XTS mode? */ #define TRUE 1 #define FALSE 0 #define BITSPERBLOCK 128 /* Default number of bits in a cipher block */