diff options
author | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-06-21 16:18:38 -0700 |
---|---|---|
committer | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-06-21 16:18:38 -0700 |
commit | f7916cb7c797a26140e50a7bd07a5716c25bf85c (patch) | |
tree | 1d2869051792bfa568dda706714a90d90262b999 /includes/BCypher.h | |
parent | 43f245e54a1640b149d4fa240127058e1ff38cff (diff) |
More cleanup and adding cyphers.
Diffstat (limited to 'includes/BCypher.h')
-rw-r--r-- | includes/BCypher.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/includes/BCypher.h b/includes/BCypher.h new file mode 100644 index 0000000..ffb59b0 --- /dev/null +++ b/includes/BCypher.h @@ -0,0 +1,79 @@ +#pragma once + +#include <Exceptions.h> +#include <tomcrypt.h> + +namespace Balau { + +template<const struct ltc_prng_descriptor * desc> +class PRNG { + public: + PRNG() { start(); } + ~PRNG() { done(); } + void reset() { + done(); + start(); + } + void setKey(const uint8_t * key, size_t len) { + int r = desc->add_entropy(key, len, &m_state); + IAssert(r == CRYPT_OK, "add_entropy for %s returned %i", desc->name, r); + r = desc->ready(&m_state); + IAssert(r == CRYPT_OK, "ready for %s returned %i", desc->name, r); + } + size_t generate(uint8_t * out, size_t len) { + size_t actualLen = desc->read(out, len, &m_state); + IAssert(len == actualLen, "Couldn't get enough bytes for %s", desc->name); + return actualLen; + } + + template<size_t L> + void setKey(const char (&key)[L]) { setKey((const uint8_t *) key, L - 1); } + void setKey(const String & key) { setKey((const uint8_t *) key.to_charp(), key.strlen()); } + template<size_t L> + void generate(const uint8_t (&out)[L]) { generate(out, L); } + + static const char * name() { return desc->name; } + + private: + void start() { + int r = desc->start(&m_state); + IAssert(r == CRYPT_OK, "start for %s returned %i", desc->name, r); + } + void done() { + int r = desc->done(&m_state); + IAssert(r == CRYPT_OK, "done for %s returned %i", desc->name, r); + } + prng_state m_state; +}; + +template<class PRNG> +class Cypher : public PRNG { +public: + void process(uint8_t * buf, size_t len) { + while (len) { + if (!m_len) { + m_ptr = m_buffer; + m_len = sizeof(m_buffer); + generate(m_buffer, sizeof(m_buffer)); + } + + size_t chunkLen = std::min(m_len, len); + m_len -= chunkLen; + len -= chunkLen; + + while (chunkLen--) + *buf++ ^= *m_ptr++; + } + } +private: + uint8_t m_buffer[64], * m_ptr = m_buffer; + size_t m_len = 0; +}; + +typedef PRNG<&yarrow_desc> Yarrow; +typedef PRNG<&fortuna_desc> Fortuna; +typedef PRNG<&rc4_desc> RC4; +typedef PRNG<&sprng_desc> SPRNG; +typedef PRNG<&sober128_desc> Sober128; + +} |