aboutsummaryrefslogtreecommitdiffstats
path: root/doc/examples/new_engine.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-03-24 13:51:45 +0000
committerlloyd <[email protected]>2010-03-24 13:51:45 +0000
commit24aba24f73f1717548b82f1d6bf8e4f773afa015 (patch)
tree59ec4ebae95495596ee2beb24b8eb6688e9311a6 /doc/examples/new_engine.cpp
parent5261caca2dc204b53b253b66507c81ada8cb9749 (diff)
Show as creating an engine instead
Diffstat (limited to 'doc/examples/new_engine.cpp')
-rw-r--r--doc/examples/new_engine.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/doc/examples/new_engine.cpp b/doc/examples/new_engine.cpp
new file mode 100644
index 000000000..2f412a6b9
--- /dev/null
+++ b/doc/examples/new_engine.cpp
@@ -0,0 +1,100 @@
+/*
+* Adding an application specific engine
+* (C) 2004,2008 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/stream_cipher.h>
+#include <botan/engine.h>
+
+using namespace Botan;
+
+class XOR_Cipher : public StreamCipher
+ {
+ public:
+ void clear() throw() { mask.destroy(); mask_pos = 0; }
+
+ // what we want to call this cipher
+ std::string name() const { return "XOR"; }
+
+ // return a new object of this type
+ StreamCipher* clone() const { return new XOR_Cipher; }
+
+ XOR_Cipher() : StreamCipher(1, 32) { mask_pos = 0; }
+ private:
+ void cipher(const byte in[], byte out[], u32bit length)
+ {
+ for(u32bit j = 0; j != length; j++)
+ {
+ out[j] = in[j] ^ mask[mask_pos];
+ mask_pos = (mask_pos + 1) % mask.size();
+ }
+ }
+
+ void key_schedule(const byte key[], u32bit length)
+ {
+ mask.set(key, length);
+ }
+
+ SecureVector<byte> mask;
+ u32bit mask_pos;
+ };
+
+class Application_Engine : public Engine
+ {
+ public:
+ std::string provider_name() const { return "application"; }
+
+ StreamCipher* find_stream_cipher(const SCAN_Name& request,
+ Algorithm_Factory&) const
+ {
+ if(request.algo_name() == "XOR")
+ return new XOR_Cipher;
+ return 0;
+ }
+ };
+
+#include <botan/botan.h>
+#include <iostream>
+#include <string>
+
+int main()
+ {
+
+ Botan::LibraryInitializer init;
+
+ global_state().algorithm_factory().add_engine(
+ new Application_Engine);
+
+ // a hex key value
+ SymmetricKey key("010203040506070809101112AAFF");
+
+ /*
+ Since stream ciphers are typically additive, the encryption and
+ decryption ops are the same, so this isn't terribly interesting.
+
+ If this where a block cipher you would have to add a cipher mode and
+ padding method, such as "/CBC/PKCS7".
+ */
+ Pipe enc(get_cipher("XOR", key, ENCRYPTION), new Hex_Encoder);
+ Pipe dec(new Hex_Decoder, get_cipher("XOR", key, DECRYPTION));
+
+ // I think the pigeons are actually asleep at midnight...
+ std::string secret = "The pigeon flys at midnight.";
+
+ std::cout << "The secret message is '" << secret << "'" << std::endl;
+
+ enc.process_msg(secret);
+ std::string cipher = enc.read_all_as_string();
+
+ std::cout << "The encrypted secret message is " << cipher << std::endl;
+
+ dec.process_msg(cipher);
+ secret = dec.read_all_as_string();
+
+ std::cout << "The decrypted secret message is '"
+ << secret << "'" << std::endl;
+
+ return 0;
+ }