aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/block/serpent/serpent.cpp
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-08-10 13:51:25 -0400
committerJack Lloyd <[email protected]>2016-11-26 12:34:15 -0500
commit3bc46d79c4509cbf871f762e39a366e95e8342ce (patch)
tree80359e3d3955412ae027393ec72db51456d5f575 /src/lib/block/serpent/serpent.cpp
parent5372d0b499ad317ab3776c9ac92df866cc6a1e84 (diff)
Add Cilk/OpenMP support
Diffstat (limited to 'src/lib/block/serpent/serpent.cpp')
-rw-r--r--src/lib/block/serpent/serpent.cpp81
1 files changed, 47 insertions, 34 deletions
diff --git a/src/lib/block/serpent/serpent.cpp b/src/lib/block/serpent/serpent.cpp
index 07088211d..a1326b888 100644
--- a/src/lib/block/serpent/serpent.cpp
+++ b/src/lib/block/serpent/serpent.cpp
@@ -70,12 +70,10 @@ void Serpent::encrypt_n(const byte in[], byte out[], size_t blocks) const
}
#endif
- for(size_t i = 0; i != blocks; ++i)
+ BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i)
{
- u32bit B0 = load_le<u32bit>(in, 0);
- u32bit B1 = load_le<u32bit>(in, 1);
- u32bit B2 = load_le<u32bit>(in, 2);
- u32bit B3 = load_le<u32bit>(in, 3);
+ u32bit B0, B1, B2, B3;
+ load_le(in + 16*i, B0, B1, B2, B3);
key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
@@ -110,10 +108,7 @@ void Serpent::encrypt_n(const byte in[], byte out[], size_t blocks) const
key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3);
- store_le(out, B0, B1, B2, B3);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
+ store_le(out + 16*i, B0, B1, B2, B3);
}
}
@@ -135,12 +130,10 @@ void Serpent::decrypt_n(const byte in[], byte out[], size_t blocks) const
}
#endif
- for(size_t i = 0; i != blocks; ++i)
+ BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i)
{
- u32bit B0 = load_le<u32bit>(in, 0);
- u32bit B1 = load_le<u32bit>(in, 1);
- u32bit B2 = load_le<u32bit>(in, 2);
- u32bit B3 = load_le<u32bit>(in, 3);
+ u32bit B0, B1, B2, B3;
+ load_le(in + 16*i, B0, B1, B2, B3);
key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3);
i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3);
@@ -175,10 +168,7 @@ void Serpent::decrypt_n(const byte in[], byte out[], size_t blocks) const
i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3);
i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3);
- store_le(out, B0, B1, B2, B3);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
+ store_le(out + 16*i, B0, B1, B2, B3);
}
}
@@ -205,24 +195,47 @@ void Serpent::key_schedule(const byte key[], size_t length)
W[i] = rotate_left(wi, 11);
}
- SBoxE4(W[ 8],W[ 9],W[ 10],W[ 11]); SBoxE3(W[ 12],W[ 13],W[ 14],W[ 15]);
- SBoxE2(W[ 16],W[ 17],W[ 18],W[ 19]); SBoxE1(W[ 20],W[ 21],W[ 22],W[ 23]);
- SBoxE8(W[ 24],W[ 25],W[ 26],W[ 27]); SBoxE7(W[ 28],W[ 29],W[ 30],W[ 31]);
- SBoxE6(W[ 32],W[ 33],W[ 34],W[ 35]); SBoxE5(W[ 36],W[ 37],W[ 38],W[ 39]);
- SBoxE4(W[ 40],W[ 41],W[ 42],W[ 43]); SBoxE3(W[ 44],W[ 45],W[ 46],W[ 47]);
- SBoxE2(W[ 48],W[ 49],W[ 50],W[ 51]); SBoxE1(W[ 52],W[ 53],W[ 54],W[ 55]);
- SBoxE8(W[ 56],W[ 57],W[ 58],W[ 59]); SBoxE7(W[ 60],W[ 61],W[ 62],W[ 63]);
- SBoxE6(W[ 64],W[ 65],W[ 66],W[ 67]); SBoxE5(W[ 68],W[ 69],W[ 70],W[ 71]);
- SBoxE4(W[ 72],W[ 73],W[ 74],W[ 75]); SBoxE3(W[ 76],W[ 77],W[ 78],W[ 79]);
- SBoxE2(W[ 80],W[ 81],W[ 82],W[ 83]); SBoxE1(W[ 84],W[ 85],W[ 86],W[ 87]);
- SBoxE8(W[ 88],W[ 89],W[ 90],W[ 91]); SBoxE7(W[ 92],W[ 93],W[ 94],W[ 95]);
- SBoxE6(W[ 96],W[ 97],W[ 98],W[ 99]); SBoxE5(W[100],W[101],W[102],W[103]);
- SBoxE4(W[104],W[105],W[106],W[107]); SBoxE3(W[108],W[109],W[110],W[111]);
- SBoxE2(W[112],W[113],W[114],W[115]); SBoxE1(W[116],W[117],W[118],W[119]);
- SBoxE8(W[120],W[121],W[122],W[123]); SBoxE7(W[124],W[125],W[126],W[127]);
- SBoxE6(W[128],W[129],W[130],W[131]); SBoxE5(W[132],W[133],W[134],W[135]);
+ SBoxE1(W[ 20],W[ 21],W[ 22],W[ 23]);
+ SBoxE1(W[ 52],W[ 53],W[ 54],W[ 55]);
+ SBoxE1(W[ 84],W[ 85],W[ 86],W[ 87]);
+ SBoxE1(W[116],W[117],W[118],W[119]);
+
+ SBoxE2(W[ 16],W[ 17],W[ 18],W[ 19]);
+ SBoxE2(W[ 48],W[ 49],W[ 50],W[ 51]);
+ SBoxE2(W[ 80],W[ 81],W[ 82],W[ 83]);
+ SBoxE2(W[112],W[113],W[114],W[115]);
+
+ SBoxE3(W[ 12],W[ 13],W[ 14],W[ 15]);
+ SBoxE3(W[ 44],W[ 45],W[ 46],W[ 47]);
+ SBoxE3(W[ 76],W[ 77],W[ 78],W[ 79]);
+ SBoxE3(W[108],W[109],W[110],W[111]);
+
+ SBoxE4(W[ 8],W[ 9],W[ 10],W[ 11]);
+ SBoxE4(W[ 40],W[ 41],W[ 42],W[ 43]);
+ SBoxE4(W[ 72],W[ 73],W[ 74],W[ 75]);
+ SBoxE4(W[104],W[105],W[106],W[107]);
SBoxE4(W[136],W[137],W[138],W[139]);
+ SBoxE5(W[ 36],W[ 37],W[ 38],W[ 39]);
+ SBoxE5(W[ 68],W[ 69],W[ 70],W[ 71]);
+ SBoxE5(W[100],W[101],W[102],W[103]);
+ SBoxE5(W[132],W[133],W[134],W[135]);
+
+ SBoxE6(W[ 32],W[ 33],W[ 34],W[ 35]);
+ SBoxE6(W[ 64],W[ 65],W[ 66],W[ 67]);
+ SBoxE6(W[ 96],W[ 97],W[ 98],W[ 99]);
+ SBoxE6(W[128],W[129],W[130],W[131]);
+
+ SBoxE7(W[ 28],W[ 29],W[ 30],W[ 31]);
+ SBoxE7(W[ 60],W[ 61],W[ 62],W[ 63]);
+ SBoxE7(W[ 92],W[ 93],W[ 94],W[ 95]);
+ SBoxE7(W[124],W[125],W[126],W[127]);
+
+ SBoxE8(W[ 24],W[ 25],W[ 26],W[ 27]);
+ SBoxE8(W[ 56],W[ 57],W[ 58],W[ 59]);
+ SBoxE8(W[ 88],W[ 89],W[ 90],W[ 91]);
+ SBoxE8(W[120],W[121],W[122],W[123]);
+
m_round_key.assign(W.begin() + 8, W.end());
}