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 */

Reply via email to