summaryrefslogtreecommitdiffstats
path: root/old/botan/src/block/serpent_ia32/serp_ia32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'old/botan/src/block/serpent_ia32/serp_ia32.cpp')
-rw-r--r--old/botan/src/block/serpent_ia32/serp_ia32.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/old/botan/src/block/serpent_ia32/serp_ia32.cpp b/old/botan/src/block/serpent_ia32/serp_ia32.cpp
new file mode 100644
index 0000000..37dd4e6
--- /dev/null
+++ b/old/botan/src/block/serpent_ia32/serp_ia32.cpp
@@ -0,0 +1,51 @@
+/*
+* IA-32 Serpent
+* (C) 1999-2007 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/serp_ia32.h>
+#include <botan/loadstor.h>
+
+namespace Botan {
+
+extern "C" {
+
+void botan_serpent_ia32_encrypt(const byte[16], byte[16], const u32bit[132]);
+void botan_serpent_ia32_decrypt(const byte[16], byte[16], const u32bit[132]);
+void botan_serpent_ia32_key_schedule(u32bit[140]);
+
+}
+
+/*
+* Serpent Encryption
+*/
+void Serpent_IA32::enc(const byte in[], byte out[]) const
+ {
+ botan_serpent_ia32_encrypt(in, out, round_key);
+ }
+
+/*
+* Serpent Decryption
+*/
+void Serpent_IA32::dec(const byte in[], byte out[]) const
+ {
+ botan_serpent_ia32_decrypt(in, out, round_key);
+ }
+
+/*
+* Serpent Key Schedule
+*/
+void Serpent_IA32::key_schedule(const byte key[], u32bit length)
+ {
+ SecureBuffer<u32bit, 140> W;
+ for(u32bit j = 0; j != length / 4; ++j)
+ W[j] = make_u32bit(key[4*j+3], key[4*j+2], key[4*j+1], key[4*j]);
+ W[length / 4] |= u32bit(1) << ((length%4)*8);
+
+ botan_serpent_ia32_key_schedule(W);
+ round_key.copy(W + 8, 132);
+ }
+
+}