diff options
author | lloyd <[email protected]> | 2010-10-28 19:38:09 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-10-28 19:38:09 +0000 |
commit | d1d41321c8d3d6f6273659342e93f02e865ab6bf (patch) | |
tree | 5028af1f2b9d1a985f57dec241de3b471a2a674a | |
parent | 576c5c901375d1ba5bfdfc5873562c63228abab5 (diff) |
Consolidate hex and base64 filters into a single sub-module.
Use the standalone base64 functions for most of the Base64 logic
-rw-r--r-- | src/filters/codec_filt/b64_filt.cpp (renamed from src/filters/b64_filt/b64_filt.cpp) | 79 | ||||
-rw-r--r-- | src/filters/codec_filt/b64_filt.h (renamed from src/filters/b64_filt/b64_filt.h) | 19 | ||||
-rw-r--r-- | src/filters/codec_filt/hex_filt.cpp (renamed from src/filters/hex_filt/hex_filt.cpp) | 0 | ||||
-rw-r--r-- | src/filters/codec_filt/hex_filt.h (renamed from src/filters/hex_filt/hex_filt.h) | 0 | ||||
-rw-r--r-- | src/filters/codec_filt/info.txt (renamed from src/filters/b64_filt/info.txt) | 2 | ||||
-rw-r--r-- | src/filters/filters.h | 5 | ||||
-rw-r--r-- | src/filters/hex_filt/info.txt | 5 |
7 files changed, 44 insertions, 66 deletions
diff --git a/src/filters/b64_filt/b64_filt.cpp b/src/filters/codec_filt/b64_filt.cpp index 080848d18..2db6ac3ca 100644 --- a/src/filters/b64_filt/b64_filt.cpp +++ b/src/filters/codec_filt/b64_filt.cpp @@ -6,6 +6,7 @@ */ #include <botan/b64_filt.h> +#include <botan/base64.h> #include <botan/charset.h> #include <botan/exceptn.h> #include <algorithm> @@ -13,19 +14,10 @@ namespace Botan { /* -* Base64 Encoder Lookup Table -*/ -const byte Base64_Encoder::BIN_TO_BASE64[64] = { -0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, -0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, -0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, -0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, -0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F }; - -/* * Base64 Decoder Lookup Table +* Warning: assumes ASCII encodings */ -const byte Base64_Decoder::BASE64_TO_BIN[256] = { +static const byte BASE64_TO_BIN[256] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, @@ -51,34 +43,32 @@ const byte Base64_Decoder::BASE64_TO_BIN[256] = { * Base64_Encoder Constructor */ Base64_Encoder::Base64_Encoder(bool breaks, size_t length, bool t_n) : - line_length(breaks ? length : 0), trailing_newline(t_n) - { - in.resize(48); - out.resize(4); - - counter = position = 0; - } - -/* -* Base64 Encoding Operation -*/ -void Base64_Encoder::encode(const byte in[3], byte out[4]) + line_length(breaks ? length : 0), + trailing_newline(t_n && breaks), + in(48), + out(64), + position(0), + out_position(0) { - out[0] = BIN_TO_BASE64[((in[0] & 0xFC) >> 2)]; - out[1] = BIN_TO_BASE64[((in[0] & 0x03) << 4) | (in[1] >> 4)]; - out[2] = BIN_TO_BASE64[((in[1] & 0x0F) << 2) | (in[2] >> 6)]; - out[3] = BIN_TO_BASE64[((in[2] & 0x3F) )]; } /* * Encode and send a block */ -void Base64_Encoder::encode_and_send(const byte block[], size_t length) +void Base64_Encoder::encode_and_send(const byte input[], size_t length) { - for(size_t j = 0; j != length; j += 3) + while(length) { - encode(block + j, &out[0]); - do_output(&out[0], 4); + const size_t proc = std::min(length, in.size()); + + size_t consumed = 0; + size_t produced = base64_encode(reinterpret_cast<char*>(&out[0]), input, + proc, consumed, false); + + do_output(&out[0], produced); + + input += proc; + length -= proc; } } @@ -94,15 +84,15 @@ void Base64_Encoder::do_output(const byte input[], size_t length) size_t remaining = length, offset = 0; while(remaining) { - size_t sent = std::min(line_length - counter, remaining); + size_t sent = std::min(line_length - out_position, remaining); send(input + offset, sent); - counter += sent; + out_position += sent; remaining -= sent; offset += sent; - if(counter == line_length) + if(out_position == line_length) { send('\n'); - counter = 0; + out_position = 0; } } } @@ -145,7 +135,8 @@ void Base64_Encoder::end_msg() SecureVector<byte> remainder(3); copy_mem(&remainder[0], &in[start_of_last_block], left_over); - encode(&remainder[0], &out[0]); + size_t consumed; + base64_encode(reinterpret_cast<char*>(&out[0]), &remainder[0], 3, consumed, false); size_t empty_bits = 8 * (3 - left_over), index = 4 - 1; while(empty_bits >= 8) @@ -157,10 +148,10 @@ void Base64_Encoder::end_msg() do_output(&out[0], 4); } - if(trailing_newline || (counter && line_length)) + if(trailing_newline || (out_position && line_length)) send('\n'); - counter = position = 0; + out_position = position = 0; } /* @@ -196,9 +187,9 @@ void Base64_Decoder::decode(const byte in[4], byte out[3]) */ void Base64_Decoder::decode_and_send(const byte block[], size_t length) { - for(size_t j = 0; j != length; j += 4) + for(size_t i = 0; i != length; i += 4) { - decode(block + j, &out[0]); + decode(block + i, &out[0]); send(out, 3); } } @@ -225,12 +216,12 @@ void Base64_Decoder::handle_bad_char(byte c) */ void Base64_Decoder::write(const byte input[], size_t length) { - for(size_t j = 0; j != length; ++j) + for(size_t i = 0; i != length; ++i) { - if(is_valid(input[j])) - in[position++] = input[j]; + if(is_valid(input[i])) + in[position++] = input[i]; else - handle_bad_char(input[j]); + handle_bad_char(input[i]); if(position == in.size()) { diff --git a/src/filters/b64_filt/b64_filt.h b/src/filters/codec_filt/b64_filt.h index ae5fa26ce..8918049a2 100644 --- a/src/filters/b64_filt/b64_filt.h +++ b/src/filters/codec_filt/b64_filt.h @@ -5,8 +5,8 @@ * Distributed under the terms of the Botan license */ -#ifndef BOTAN_BASE64_H__ -#define BOTAN_BASE64_H__ +#ifndef BOTAN_BASE64_FILTER_H__ +#define BOTAN_BASE64_FILTER_H__ #include <botan/filter.h> @@ -18,8 +18,6 @@ namespace Botan { class BOTAN_DLL Base64_Encoder : public Filter { public: - static void encode(const byte in[3], byte out[4]); - std::string name() const { return "Base64_Encoder"; } /** @@ -36,7 +34,7 @@ class BOTAN_DLL Base64_Encoder : public Filter /** * Create a base64 encoder. - * @param breaks whether to use line breaks in the Streamcipheroutput + * @param breaks whether to use line breaks in the output * @param length the length of the lines of the output * @param t_n whether to use a trailing newline */ @@ -45,12 +43,11 @@ class BOTAN_DLL Base64_Encoder : public Filter private: void encode_and_send(const byte[], size_t); void do_output(const byte[], size_t); - static const byte BIN_TO_BASE64[64]; const size_t line_length; const bool trailing_newline; SecureVector<byte> in, out; - size_t position, counter; + size_t position, out_position; }; /** @@ -59,10 +56,6 @@ class BOTAN_DLL Base64_Encoder : public Filter class BOTAN_DLL Base64_Decoder : public Filter { public: - static void decode(const byte input[4], byte output[3]); - - static bool is_valid(byte); - std::string name() const { return "Base64_Decoder"; } /** @@ -84,9 +77,11 @@ class BOTAN_DLL Base64_Decoder : public Filter */ Base64_Decoder(Decoder_Checking checking = NONE); private: + static void decode(const byte input[4], byte output[3]); + static bool is_valid(byte); + void decode_and_send(const byte[], size_t); void handle_bad_char(byte); - static const byte BASE64_TO_BIN[256]; const Decoder_Checking checking; SecureVector<byte> in, out; diff --git a/src/filters/hex_filt/hex_filt.cpp b/src/filters/codec_filt/hex_filt.cpp index 3d56beec4..3d56beec4 100644 --- a/src/filters/hex_filt/hex_filt.cpp +++ b/src/filters/codec_filt/hex_filt.cpp diff --git a/src/filters/hex_filt/hex_filt.h b/src/filters/codec_filt/hex_filt.h index cfbb818d3..cfbb818d3 100644 --- a/src/filters/hex_filt/hex_filt.h +++ b/src/filters/codec_filt/hex_filt.h diff --git a/src/filters/b64_filt/info.txt b/src/filters/codec_filt/info.txt index 8fff2f181..080cc8f44 100644 --- a/src/filters/b64_filt/info.txt +++ b/src/filters/codec_filt/info.txt @@ -1,4 +1,4 @@ -define BASE64_FILTER +define CODEC_FILTERS <requires> filters diff --git a/src/filters/filters.h b/src/filters/filters.h index 49c04e430..b409e78f5 100644 --- a/src/filters/filters.h +++ b/src/filters/filters.h @@ -20,11 +20,8 @@ #include <botan/scan_name.h> -#if defined(BOTAN_HAS_BASE64_FILTER) +#if defined(BOTAN_HAS_CODEC_FILTERS) #include <botan/b64_filt.h> -#endif - -#if defined(BOTAN_HAS_HEX_FILTER) #include <botan/hex_filt.h> #endif diff --git a/src/filters/hex_filt/info.txt b/src/filters/hex_filt/info.txt deleted file mode 100644 index 7f5f47fa1..000000000 --- a/src/filters/hex_filt/info.txt +++ /dev/null @@ -1,5 +0,0 @@ -define HEX_FILTER - -<requires> -filters -</requires> |