aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2018-02-23 20:55:40 -0500
committerJack Lloyd <[email protected]>2018-02-23 21:01:59 -0500
commitf75693ad4ead4b51ec96b3da42d6076cfb3edbe3 (patch)
treec6961356d0ea3f2ca7f9fc21a033139cfce70219
parentc6accf871af69b16f4b194fecc34db36367be969 (diff)
Implement decryption
-rw-r--r--src/lib/block/aes/aes.cpp6
-rw-r--r--src/lib/block/aes/aes_power8/aes_power8.cpp185
2 files changed, 148 insertions, 43 deletions
diff --git a/src/lib/block/aes/aes.cpp b/src/lib/block/aes/aes.cpp
index 04f2cc21f..c35bdabaa 100644
--- a/src/lib/block/aes/aes.cpp
+++ b/src/lib/block/aes/aes.cpp
@@ -517,7 +517,7 @@ void AES_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
}
#endif
-#if defined(BOTAN_HAS_AES_POWER8) && 0
+#if defined(BOTAN_HAS_AES_POWER8)
if(CPUID::has_ppc_crypto())
{
return power8_decrypt_n(in, out, blocks);
@@ -614,7 +614,7 @@ void AES_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
}
#endif
-#if defined(BOTAN_HAS_AES_POWER8) && 0
+#if defined(BOTAN_HAS_AES_POWER8)
if(CPUID::has_ppc_crypto())
{
return power8_decrypt_n(in, out, blocks);
@@ -711,7 +711,7 @@ void AES_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
}
#endif
-#if defined(BOTAN_HAS_AES_POWER8) && 0
+#if defined(BOTAN_HAS_AES_POWER8)
if(CPUID::has_ppc_crypto())
{
return power8_decrypt_n(in, out, blocks);
diff --git a/src/lib/block/aes/aes_power8/aes_power8.cpp b/src/lib/block/aes/aes_power8/aes_power8.cpp
index b6d42081e..98520a13c 100644
--- a/src/lib/block/aes/aes_power8/aes_power8.cpp
+++ b/src/lib/block/aes/aes_power8/aes_power8.cpp
@@ -67,16 +67,16 @@ void AES_128::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks)
{
BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
- const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
- const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
- const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
- const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
- const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
- const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
- const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
- const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
- const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
- const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
+ const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
const __vector unsigned long long K10 = LoadBlock(m_ME.data());
for(size_t i = 0; i != blocks; ++i)
@@ -105,10 +105,41 @@ void AES_128::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks)
BOTAN_FUNC_ISA("crypto")
void AES_128::power8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
{
- BOTAN_ASSERT(m_DK.empty() == false, "Key was set");
+ BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
+
+ const __vector unsigned long long K0 = LoadBlock(m_ME.data());
+ const __vector unsigned long long K1 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K10 = LoadKey(&m_EK[0]);
+
+ for(size_t i = 0; i != blocks; ++i)
+ {
+ __vector unsigned long long B = LoadBlock(in);
- BOTAN_UNUSED(in, out, blocks);
- throw Not_Implemented("FIXME");
+ B = vec_xor(B, K0);
+ B = __builtin_crypto_vncipher(B, K1);
+ B = __builtin_crypto_vncipher(B, K2);
+ B = __builtin_crypto_vncipher(B, K3);
+ B = __builtin_crypto_vncipher(B, K4);
+ B = __builtin_crypto_vncipher(B, K5);
+ B = __builtin_crypto_vncipher(B, K6);
+ B = __builtin_crypto_vncipher(B, K7);
+ B = __builtin_crypto_vncipher(B, K8);
+ B = __builtin_crypto_vncipher(B, K9);
+ B = __builtin_crypto_vncipherlast(B, K10);
+
+ StoreBlock(B, out);
+
+ out += 16;
+ in += 16;
+ }
}
BOTAN_FUNC_ISA("crypto")
@@ -116,16 +147,16 @@ void AES_192::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks)
{
BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
- const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
- const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
- const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
- const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
- const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
- const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
- const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
- const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
- const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
- const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
+ const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
const __vector unsigned long long K10 = LoadKey(&m_EK[40]);
const __vector unsigned long long K11 = LoadKey(&m_EK[44]);
const __vector unsigned long long K12 = LoadBlock(m_ME.data());
@@ -158,25 +189,61 @@ void AES_192::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks)
BOTAN_FUNC_ISA("crypto")
void AES_192::power8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
{
- BOTAN_ASSERT(m_DK.empty() == false, "Key was set");
- BOTAN_UNUSED(in, out, blocks);
- throw Not_Implemented("FIXME");
+ BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
+
+ const __vector unsigned long long K0 = LoadBlock(m_ME.data());
+ const __vector unsigned long long K1 = LoadKey(&m_EK[44]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[40]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K10 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K11 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K12 = LoadKey(&m_EK[0]);
+
+ for(size_t i = 0; i != blocks; ++i)
+ {
+ __vector unsigned long long B = LoadBlock(in);
+
+ B = vec_xor(B, K0);
+ B = __builtin_crypto_vncipher(B, K1);
+ B = __builtin_crypto_vncipher(B, K2);
+ B = __builtin_crypto_vncipher(B, K3);
+ B = __builtin_crypto_vncipher(B, K4);
+ B = __builtin_crypto_vncipher(B, K5);
+ B = __builtin_crypto_vncipher(B, K6);
+ B = __builtin_crypto_vncipher(B, K7);
+ B = __builtin_crypto_vncipher(B, K8);
+ B = __builtin_crypto_vncipher(B, K9);
+ B = __builtin_crypto_vncipher(B, K10);
+ B = __builtin_crypto_vncipher(B, K11);
+ B = __builtin_crypto_vncipherlast(B, K12);
+
+ StoreBlock(B, out);
+
+ out += 16;
+ in += 16;
+ }
}
BOTAN_FUNC_ISA("crypto")
void AES_256::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
{
BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
- const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
- const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
- const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
- const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
- const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
- const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
- const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
- const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
- const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
- const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K0 = LoadKey(&m_EK[0]);
+ const __vector unsigned long long K1 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[36]);
const __vector unsigned long long K10 = LoadKey(&m_EK[40]);
const __vector unsigned long long K11 = LoadKey(&m_EK[44]);
const __vector unsigned long long K12 = LoadKey(&m_EK[48]);
@@ -208,16 +275,54 @@ void AES_256::power8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks)
out += 16;
in += 16;
}
-
}
BOTAN_FUNC_ISA("crypto")
void AES_256::power8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const
{
- BOTAN_ASSERT(m_DK.empty() == false, "Key was set");
+ BOTAN_ASSERT(m_EK.empty() == false, "Key was set");
+
+ const __vector unsigned long long K0 = LoadBlock(m_ME.data());
+ const __vector unsigned long long K1 = LoadKey(&m_EK[52]);
+ const __vector unsigned long long K2 = LoadKey(&m_EK[48]);
+ const __vector unsigned long long K3 = LoadKey(&m_EK[44]);
+ const __vector unsigned long long K4 = LoadKey(&m_EK[40]);
+ const __vector unsigned long long K5 = LoadKey(&m_EK[36]);
+ const __vector unsigned long long K6 = LoadKey(&m_EK[32]);
+ const __vector unsigned long long K7 = LoadKey(&m_EK[28]);
+ const __vector unsigned long long K8 = LoadKey(&m_EK[24]);
+ const __vector unsigned long long K9 = LoadKey(&m_EK[20]);
+ const __vector unsigned long long K10 = LoadKey(&m_EK[16]);
+ const __vector unsigned long long K11 = LoadKey(&m_EK[12]);
+ const __vector unsigned long long K12 = LoadKey(&m_EK[8]);
+ const __vector unsigned long long K13 = LoadKey(&m_EK[4]);
+ const __vector unsigned long long K14 = LoadKey(&m_EK[0]);
+
+ for(size_t i = 0; i != blocks; ++i)
+ {
+ __vector unsigned long long B = LoadBlock(in);
+
+ B = vec_xor(B, K0);
+ B = __builtin_crypto_vncipher(B, K1);
+ B = __builtin_crypto_vncipher(B, K2);
+ B = __builtin_crypto_vncipher(B, K3);
+ B = __builtin_crypto_vncipher(B, K4);
+ B = __builtin_crypto_vncipher(B, K5);
+ B = __builtin_crypto_vncipher(B, K6);
+ B = __builtin_crypto_vncipher(B, K7);
+ B = __builtin_crypto_vncipher(B, K8);
+ B = __builtin_crypto_vncipher(B, K9);
+ B = __builtin_crypto_vncipher(B, K10);
+ B = __builtin_crypto_vncipher(B, K11);
+ B = __builtin_crypto_vncipher(B, K12);
+ B = __builtin_crypto_vncipher(B, K13);
+ B = __builtin_crypto_vncipherlast(B, K14);
- BOTAN_UNUSED(in, out, blocks);
- throw Not_Implemented("FIXME");
+ StoreBlock(B, out);
+
+ out += 16;
+ in += 16;
+ }
}
}