aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/api.tex4
-rw-r--r--src/asn1/asn1_obj.h56
-rw-r--r--src/asn1/asn1_oid.cpp40
-rw-r--r--src/asn1/asn1_str.cpp6
-rw-r--r--src/asn1/asn1_str.h38
-rw-r--r--src/asn1/asn1_tm.cpp8
-rw-r--r--src/asn1/ber_dec.cpp42
-rw-r--r--src/asn1/ber_dec.h2
-rw-r--r--src/asn1/der_enc.cpp42
-rw-r--r--src/asn1/der_enc.h14
-rw-r--r--src/asn1/info.txt4
-rw-r--r--src/asn1/x509_dn.cpp (renamed from src/asn1/asn1_dn.cpp)2
-rw-r--r--src/asn1/x509_dn.h54
-rw-r--r--src/block/aes/aes.cpp10
-rw-r--r--src/block/aes/aes.h8
-rw-r--r--src/block/aes_ssse3/aes_ssse3.h15
-rw-r--r--src/block/block_cipher.h26
-rw-r--r--src/block/blowfish/blowfish.cpp8
-rw-r--r--src/block/blowfish/blowfish.h4
-rw-r--r--src/block/cascade/cascade.cpp5
-rw-r--r--src/block/cascade/cascade.h3
-rw-r--r--src/block/cast/cast128.cpp8
-rw-r--r--src/block/cast/cast128.h4
-rw-r--r--src/block/cast/cast256.cpp8
-rw-r--r--src/block/cast/cast256.h4
-rw-r--r--src/block/des/des.cpp16
-rw-r--r--src/block/des/des.h8
-rw-r--r--src/block/des/desx.cpp16
-rw-r--r--src/block/des/desx.h4
-rw-r--r--src/block/gost_28147/gost_28147.cpp10
-rw-r--r--src/block/gost_28147/gost_28147.h4
-rw-r--r--src/block/idea/idea.h4
-rw-r--r--src/block/idea_sse2/idea_sse2.cpp8
-rw-r--r--src/block/kasumi/kasumi.cpp8
-rw-r--r--src/block/kasumi/kasumi.h4
-rw-r--r--src/block/lion/lion.cpp20
-rw-r--r--src/block/lion/lion.h4
-rw-r--r--src/block/lubyrack/lubyrack.cpp11
-rw-r--r--src/block/lubyrack/lubyrack.h2
-rw-r--r--src/block/mars/mars.cpp8
-rw-r--r--src/block/mars/mars.h4
-rw-r--r--src/block/misty1/misty1.cpp12
-rw-r--r--src/block/misty1/misty1.h2
-rw-r--r--src/block/noekeon/noekeon.cpp8
-rw-r--r--src/block/noekeon/noekeon.h4
-rw-r--r--src/block/rc2/rc2.cpp8
-rw-r--r--src/block/rc2/rc2.h4
-rw-r--r--src/block/rc5/rc5.cpp12
-rw-r--r--src/block/rc5/rc5.h2
-rw-r--r--src/block/rc6/rc6.cpp8
-rw-r--r--src/block/rc6/rc6.h4
-rw-r--r--src/block/safer/safer_sk.cpp13
-rw-r--r--src/block/safer/safer_sk.h2
-rw-r--r--src/block/seed/seed.cpp8
-rw-r--r--src/block/seed/seed.h4
-rw-r--r--src/block/serpent/serpent.cpp8
-rw-r--r--src/block/serpent/serpent.h6
-rw-r--r--src/block/serpent_ia32/serp_ia32.cpp8
-rw-r--r--src/block/serpent_simd/serp_simd.cpp8
-rw-r--r--src/block/skipjack/skipjack.cpp8
-rw-r--r--src/block/skipjack/skipjack.h4
-rw-r--r--src/block/square/square.cpp8
-rw-r--r--src/block/square/square.h6
-rw-r--r--src/block/tea/tea.cpp8
-rw-r--r--src/block/tea/tea.h4
-rw-r--r--src/block/twofish/twofish.cpp8
-rw-r--r--src/block/twofish/twofish.h6
-rw-r--r--src/block/xtea/xtea.cpp16
-rw-r--r--src/block/xtea/xtea.h4
-rw-r--r--src/block/xtea_simd/xtea_simd.cpp8
-rw-r--r--src/cert/pkcs10/pkcs10.h1
-rw-r--r--src/cert/x509cert/x509cert.h1
-rw-r--r--src/constructs/fpe/fpe.cpp8
-rw-r--r--src/hash/mdx_hash/mdx_hash.cpp18
-rw-r--r--src/utils/buf_comp/buf_comp.h13
75 files changed, 432 insertions, 356 deletions
diff --git a/doc/api.tex b/doc/api.tex
index 376240e9c..6be9c6b6d 100644
--- a/doc/api.tex
+++ b/doc/api.tex
@@ -2028,8 +2028,8 @@ place the result in \arg{out}, or encrypts \arg{block} in place
member of each class, which specifies how much data a block cipher can
process at one time. Note that BLOCK\_SIZE is not a static class
member, meaning you can (given a \type{BlockCipher*} named
-\arg{cipher}), call \verb|cipher->BLOCK_SIZE| to get the block size of
-that particular object. \type{BlockCipher}s have similar functions
+\arg{cipher}), call \verb|cipher->block_size()| to get the block size
+of that particular object. \type{BlockCipher}s have similar functions
\function{decrypt}, which perform the inverse operation.
\begin{verbatim}
diff --git a/src/asn1/asn1_obj.h b/src/asn1/asn1_obj.h
index a77f55c79..967aa6d3d 100644
--- a/src/asn1/asn1_obj.h
+++ b/src/asn1/asn1_obj.h
@@ -11,6 +11,7 @@
#include <botan/asn1_int.h>
#include <botan/asn1_oid.h>
+#include <botan/asn1_str.h>
#include <botan/alg_id.h>
#include <vector>
#include <map>
@@ -63,57 +64,6 @@ class BOTAN_DLL X509_Time : public ASN1_Object
};
/**
-* Simple String
-*/
-class BOTAN_DLL ASN1_String : public ASN1_Object
- {
- public:
- void encode_into(class DER_Encoder&) const;
- void decode_from(class BER_Decoder&);
-
- std::string value() const;
- std::string iso_8859() const;
-
- ASN1_Tag tagging() const;
-
- ASN1_String(const std::string& = "");
- ASN1_String(const std::string&, ASN1_Tag);
- private:
- std::string iso_8859_str;
- ASN1_Tag tag;
- };
-
-/**
-* Distinguished Name
-*/
-class BOTAN_DLL X509_DN : public ASN1_Object
- {
- public:
- void encode_into(class DER_Encoder&) const;
- void decode_from(class BER_Decoder&);
-
- std::multimap<OID, std::string> get_attributes() const;
- std::vector<std::string> get_attribute(const std::string&) const;
-
- std::multimap<std::string, std::string> contents() const;
-
- void add_attribute(const std::string&, const std::string&);
- void add_attribute(const OID&, const std::string&);
-
- static std::string deref_info_field(const std::string&);
-
- void do_decode(const MemoryRegion<byte>&);
- MemoryVector<byte> get_bits() const;
-
- X509_DN();
- X509_DN(const std::multimap<OID, std::string>&);
- X509_DN(const std::multimap<std::string, std::string>&);
- private:
- std::multimap<OID, ASN1_String> dn_info;
- MemoryVector<byte> dn_bits;
- };
-
-/**
* Alternative Name
*/
class BOTAN_DLL AlternativeName : public ASN1_Object
@@ -149,10 +99,6 @@ bool BOTAN_DLL operator>=(const X509_Time&, const X509_Time&);
bool BOTAN_DLL operator<(const X509_Time&, const X509_Time&);
bool BOTAN_DLL operator>(const X509_Time&, const X509_Time&);
-bool BOTAN_DLL operator==(const X509_DN&, const X509_DN&);
-bool BOTAN_DLL operator!=(const X509_DN&, const X509_DN&);
-bool BOTAN_DLL operator<(const X509_DN&, const X509_DN&);
-
/*
* Helper Functions
*/
diff --git a/src/asn1/asn1_oid.cpp b/src/asn1/asn1_oid.cpp
index ffe583b90..750eb90f7 100644
--- a/src/asn1/asn1_oid.cpp
+++ b/src/asn1/asn1_oid.cpp
@@ -50,10 +50,10 @@ void OID::clear()
std::string OID::as_string() const
{
std::string oid_str;
- for(u32bit j = 0; j != id.size(); ++j)
+ for(size_t i = 0; i != id.size(); ++i)
{
- oid_str += std::to_string(id[j]);
- if(j != id.size() - 1)
+ oid_str += std::to_string(id[i]);
+ if(i != id.size() - 1)
oid_str += '.';
}
return oid_str;
@@ -66,8 +66,8 @@ bool OID::operator==(const OID& oid) const
{
if(id.size() != oid.id.size())
return false;
- for(u32bit j = 0; j != id.size(); ++j)
- if(id[j] != oid.id[j])
+ for(size_t i = 0; i != id.size(); ++i)
+ if(id[i] != oid.id[i])
return false;
return true;
}
@@ -111,11 +111,11 @@ bool operator<(const OID& a, const OID& b)
return true;
if(oid1.size() > oid2.size())
return false;
- for(u32bit j = 0; j != oid1.size(); ++j)
+ for(size_t i = 0; i != oid1.size(); ++i)
{
- if(oid1[j] < oid2[j])
+ if(oid1[i] < oid2[i])
return true;
- if(oid1[j] > oid2[j])
+ if(oid1[i] > oid2[i])
return false;
}
return false;
@@ -132,18 +132,18 @@ void OID::encode_into(DER_Encoder& der) const
MemoryVector<byte> encoding;
encoding.push_back(40 * id[0] + id[1]);
- for(u32bit j = 2; j != id.size(); ++j)
+ for(size_t i = 2; i != id.size(); ++i)
{
- if(id[j] == 0)
+ if(id[i] == 0)
encoding.push_back(0);
else
{
- u32bit blocks = high_bit(id[j]) + 6;
+ size_t blocks = high_bit(id[i]) + 6;
blocks = (blocks - (blocks % 7)) / 7;
- for(u32bit k = 0; k != blocks - 1; ++k)
- encoding.push_back(0x80 | ((id[j] >> 7*(blocks-k-1)) & 0x7F));
- encoding.push_back(id[j] & 0x7F);
+ for(size_t j = 0; j != blocks - 1; ++j)
+ encoding.push_back(0x80 | ((id[i] >> 7*(blocks-j-1)) & 0x7F));
+ encoding.push_back(id[i] & 0x7F);
}
}
der.add_object(OBJECT_ID, UNIVERSAL, encoding);
@@ -166,15 +166,15 @@ void OID::decode_from(BER_Decoder& decoder)
id.push_back(obj.value[0] / 40);
id.push_back(obj.value[0] % 40);
- u32bit j = 0;
- while(j != obj.value.size() - 1)
+ size_t i = 0;
+ while(i != obj.value.size() - 1)
{
u32bit component = 0;
- while(j != obj.value.size() - 1)
+ while(i != obj.value.size() - 1)
{
- ++j;
- component = (component << 7) + (obj.value[j] & 0x7F);
- if(!(obj.value[j] & 0x80))
+ ++i;
+ component = (component << 7) + (obj.value[i] & 0x7F);
+ if(!(obj.value[i] & 0x80))
break;
}
id.push_back(component);
diff --git a/src/asn1/asn1_str.cpp b/src/asn1/asn1_str.cpp
index 892a44472..5faf9546d 100644
--- a/src/asn1/asn1_str.cpp
+++ b/src/asn1/asn1_str.cpp
@@ -5,7 +5,7 @@
* Distributed under the terms of the Botan license
*/
-#include <botan/asn1_obj.h>
+#include <botan/asn1_str.h>
#include <botan/der_enc.h>
#include <botan/ber_dec.h>
#include <botan/charset.h>
@@ -45,9 +45,9 @@ ASN1_Tag choose_encoding(const std::string& str,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
- for(u32bit j = 0; j != str.size(); ++j)
+ for(size_t i = 0; i != str.size(); ++i)
{
- if(!IS_PRINTABLE[static_cast<byte>(str[j])])
+ if(!IS_PRINTABLE[static_cast<byte>(str[i])])
{
if(type == "utf8") return UTF8_STRING;
if(type == "latin1") return T61_STRING;
diff --git a/src/asn1/asn1_str.h b/src/asn1/asn1_str.h
new file mode 100644
index 000000000..ba43b0e94
--- /dev/null
+++ b/src/asn1/asn1_str.h
@@ -0,0 +1,38 @@
+/*
+* ASN.1 string type
+* (C) 1999-2010 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_ASN1_STRING_H__
+#define BOTAN_ASN1_STRING_H__
+
+#include <botan/asn1_int.h>
+
+namespace Botan {
+
+/**
+* Simple String
+*/
+class BOTAN_DLL ASN1_String : public ASN1_Object
+ {
+ public:
+ void encode_into(class DER_Encoder&) const;
+ void decode_from(class BER_Decoder&);
+
+ std::string value() const;
+ std::string iso_8859() const;
+
+ ASN1_Tag tagging() const;
+
+ ASN1_String(const std::string& = "");
+ ASN1_String(const std::string&, ASN1_Tag);
+ private:
+ std::string iso_8859_str;
+ ASN1_Tag tag;
+ };
+
+}
+
+#endif
diff --git a/src/asn1/asn1_tm.cpp b/src/asn1/asn1_tm.cpp
index 65eb96646..6e6868972 100644
--- a/src/asn1/asn1_tm.cpp
+++ b/src/asn1/asn1_tm.cpp
@@ -62,7 +62,7 @@ void X509_Time::set_to(const std::string& time_str)
std::vector<std::string> params;
std::string current;
- for(u32bit j = 0; j != time_str.size(); ++j)
+ for(size_t j = 0; j != time_str.size(); ++j)
{
if(Charset::is_digit(time_str[j]))
current += time_str[j];
@@ -109,17 +109,17 @@ void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag)
if(t_spec[t_spec.size()-1] != 'Z')
throw Invalid_Argument("Invalid time encoding: " + t_spec);
- const u32bit YEAR_SIZE = (spec_tag == UTC_TIME) ? 2 : 4;
+ const size_t YEAR_SIZE = (spec_tag == UTC_TIME) ? 2 : 4;
std::vector<std::string> params;
std::string current;
- for(u32bit j = 0; j != YEAR_SIZE; ++j)
+ for(size_t j = 0; j != YEAR_SIZE; ++j)
current += t_spec[j];
params.push_back(current);
current.clear();
- for(u32bit j = YEAR_SIZE; j != t_spec.size() - 1; ++j)
+ for(size_t j = YEAR_SIZE; j != t_spec.size() - 1; ++j)
{
current += t_spec[j];
if(current.size() == 2)
diff --git a/src/asn1/ber_dec.cpp b/src/asn1/ber_dec.cpp
index 7f0459e22..e98ab3b61 100644
--- a/src/asn1/ber_dec.cpp
+++ b/src/asn1/ber_dec.cpp
@@ -16,7 +16,7 @@ namespace {
/*
* BER decode an ASN.1 type tag
*/
-u32bit decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag)
+size_t decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag)
{
byte b;
if(!ber->read_byte(b))
@@ -32,10 +32,10 @@ u32bit decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag)
return 1;
}
- u32bit tag_bytes = 1;
+ size_t tag_bytes = 1;
class_tag = ASN1_Tag(b & 0xE0);
- u32bit tag_buf = 0;
+ size_t tag_buf = 0;
while(true)
{
if(!ber->read_byte(b))
@@ -53,12 +53,12 @@ u32bit decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag)
/*
* Find the EOC marker
*/
-u32bit find_eoc(DataSource*);
+size_t find_eoc(DataSource*);
/*
* BER decode an ASN.1 length field
*/
-u32bit decode_length(DataSource* ber, u32bit& field_size)
+size_t decode_length(DataSource* ber, size_t& field_size)
{
byte b;
if(!ber->read_byte(b))
@@ -72,9 +72,9 @@ u32bit decode_length(DataSource* ber, u32bit& field_size)
if(field_size > 5)
throw BER_Decoding_Error("Length field is too large");
- u32bit length = 0;
+ size_t length = 0;
- for(u32bit j = 0; j != field_size - 1; ++j)
+ for(size_t i = 0; i != field_size - 1; ++i)
{
if(get_byte(0, length) != 0)
throw BER_Decoding_Error("Field length overflow");
@@ -88,22 +88,22 @@ u32bit decode_length(DataSource* ber, u32bit& field_size)
/*
* BER decode an ASN.1 length field
*/
-u32bit decode_length(DataSource* ber)
+size_t decode_length(DataSource* ber)
{
- u32bit dummy;
+ size_t dummy;
return decode_length(ber, dummy);
}
/*
* Find the EOC marker
*/
-u32bit find_eoc(DataSource* ber)
+size_t find_eoc(DataSource* ber)
{
SecureVector<byte> buffer(DEFAULT_BUFFERSIZE), data;
while(true)
{
- const u32bit got = ber->peek(&buffer[0], buffer.size(), data.size());
+ const size_t got = ber->peek(&buffer[0], buffer.size(), data.size());
if(got == 0)
break;
@@ -113,16 +113,16 @@ u32bit find_eoc(DataSource* ber)
DataSource_Memory source(data);
data.clear();
- u32bit length = 0;
+ size_t length = 0;
while(true)
{
ASN1_Tag type_tag, class_tag;
- u32bit tag_size = decode_tag(&source, type_tag, class_tag);
+ size_t tag_size = decode_tag(&source, type_tag, class_tag);
if(type_tag == NO_OBJECT)
break;
- u32bit length_size = 0;
- u32bit item_size = decode_length(&source, length_size);
+ size_t length_size = 0;
+ size_t item_size = decode_length(&source, length_size);
source.discard_next(item_size);
length += item_size + length_size + tag_size;
@@ -205,7 +205,7 @@ BER_Object BER_Decoder::get_next_object()
if(next.type_tag == NO_OBJECT)
return next;
- u32bit length = decode_length(source);
+ size_t length = decode_length(source);
next.value.resize(length);
if(source->read(&next.value[0], length) != length)
throw BER_Decoding_Error("Value truncated");
@@ -266,7 +266,7 @@ BER_Decoder::BER_Decoder(DataSource& src)
/*
* BER_Decoder Constructor
*/
-BER_Decoder::BER_Decoder(const byte data[], u32bit length)
+BER_Decoder::BER_Decoder(const byte data[], size_t length)
{
source = new DataSource_Memory(data, length);
owns = true;
@@ -416,11 +416,11 @@ BER_Decoder& BER_Decoder::decode(BigInt& out,
if(negative)
{
- for(u32bit j = obj.value.size(); j > 0; --j)
- if(obj.value[j-1]--)
+ for(size_t i = obj.value.size(); i > 0; --i)
+ if(obj.value[i-1]--)
break;
- for(u32bit j = 0; j != obj.value.size(); ++j)
- obj.value[j] = ~obj.value[j];
+ for(size_t i = 0; i != obj.value.size(); ++i)
+ obj.value[i] = ~obj.value[i];
}
out = BigInt(&obj.value[0], obj.value.size());
diff --git a/src/asn1/ber_dec.h b/src/asn1/ber_dec.h
index 296d11037..79a15a298 100644
--- a/src/asn1/ber_dec.h
+++ b/src/asn1/ber_dec.h
@@ -77,7 +77,7 @@ class BOTAN_DLL BER_Decoder
BER_Decoder& operator=(const BER_Decoder&) = delete;
BER_Decoder(DataSource&);
- BER_Decoder(const byte[], u32bit);
+ BER_Decoder(const byte[], size_t);
BER_Decoder(const MemoryRegion<byte>&);
BER_Decoder(const BER_Decoder&);
~BER_Decoder();
diff --git a/src/asn1/der_enc.cpp b/src/asn1/der_enc.cpp
index fa53aa921..1d12ed5f6 100644
--- a/src/asn1/der_enc.cpp
+++ b/src/asn1/der_enc.cpp
@@ -31,12 +31,12 @@ SecureVector<byte> encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag)
encoded_tag.push_back(static_cast<byte>(type_tag | class_tag));
else
{
- u32bit blocks = high_bit(type_tag) + 6;
+ size_t blocks = high_bit(type_tag) + 6;
blocks = (blocks - (blocks % 7)) / 7;
encoded_tag.push_back(class_tag | 0x1F);
- for(u32bit k = 0; k != blocks - 1; ++k)
- encoded_tag.push_back(0x80 | ((type_tag >> 7*(blocks-k-1)) & 0x7F));
+ for(size_t i = 0; i != blocks - 1; ++i)
+ encoded_tag.push_back(0x80 | ((type_tag >> 7*(blocks-i-1)) & 0x7F));
encoded_tag.push_back(type_tag & 0x7F);
}
@@ -46,17 +46,19 @@ SecureVector<byte> encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag)
/*
* DER encode an ASN.1 length field
*/
-SecureVector<byte> encode_length(u32bit length)
+SecureVector<byte> encode_length(size_t length)
{
SecureVector<byte> encoded_length;
if(length <= 127)
encoded_length.push_back(static_cast<byte>(length));
else
{
- const u32bit top_byte = significant_bytes(length);
+ const size_t top_byte = significant_bytes(length);
+
encoded_length.push_back(static_cast<byte>(0x80 | top_byte));
- for(u32bit j = 4-top_byte; j != 4; ++j)
- encoded_length.push_back(get_byte(j, length));
+
+ for(size_t i = sizeof(length) - top_byte; i != sizeof(length); ++i)
+ encoded_length.push_back(get_byte(i, length));
}
return encoded_length;
}
@@ -73,8 +75,8 @@ SecureVector<byte> DER_Encoder::DER_Sequence::get_contents()
if(type_tag == SET)
{
std::sort(set_contents.begin(), set_contents.end());
- for(u32bit j = 0; j != set_contents.size(); ++j)
- contents += set_contents[j];
+ for(size_t i = 0; i != set_contents.size(); ++i)
+ contents += set_contents[i];
set_contents.clear();
}
@@ -90,7 +92,7 @@ SecureVector<byte> DER_Encoder::DER_Sequence::get_contents()
/*
* Add an encoded value to the SEQUENCE/SET
*/
-void DER_Encoder::DER_Sequence::add_bytes(const byte data[], u32bit length)
+void DER_Encoder::DER_Sequence::add_bytes(const byte data[], size_t length)
{
if(type_tag == SET)
set_contents.push_back(SecureVector<byte>(data, length));
@@ -183,7 +185,7 @@ DER_Encoder& DER_Encoder::raw_bytes(const MemoryRegion<byte>& val)
/*
* Write raw bytes into the stream
*/
-DER_Encoder& DER_Encoder::raw_bytes(const byte bytes[], u32bit length)
+DER_Encoder& DER_Encoder::raw_bytes(const byte bytes[], size_t length)
{
if(subsequences.size())
subsequences[subsequences.size()-1].add_bytes(bytes, length);
@@ -238,7 +240,7 @@ DER_Encoder& DER_Encoder::encode(const MemoryRegion<byte>& bytes,
/*
* Encode this object
*/
-DER_Encoder& DER_Encoder::encode(const byte bytes[], u32bit length,
+DER_Encoder& DER_Encoder::encode(const byte bytes[], size_t length,
ASN1_Tag real_type)
{
return encode(bytes, length, real_type, real_type, UNIVERSAL);
@@ -277,10 +279,10 @@ DER_Encoder& DER_Encoder::encode(const BigInt& n,
BigInt::encode(&contents[extra_zero], n);
if(n < 0)
{
- for(u32bit j = 0; j != contents.size(); ++j)
- contents[j] = ~contents[j];
- for(u32bit j = contents.size(); j > 0; --j)
- if(++contents[j-1])
+ for(size_t i = 0; i != contents.size(); ++i)
+ contents[i] = ~contents[i];
+ for(size_t i = contents.size(); i > 0; --i)
+ if(++contents[i-1])
break;
}
@@ -301,7 +303,7 @@ DER_Encoder& DER_Encoder::encode(const MemoryRegion<byte>& bytes,
/*
* DER encode an OCTET STRING or BIT STRING
*/
-DER_Encoder& DER_Encoder::encode(const byte bytes[], u32bit length,
+DER_Encoder& DER_Encoder::encode(const byte bytes[], size_t length,
ASN1_Tag real_type,
ASN1_Tag type_tag, ASN1_Tag class_tag)
{
@@ -342,7 +344,7 @@ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj)
* Write the encoding of the byte(s)
*/
DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag,
- const byte rep[], u32bit length)
+ const byte rep[], size_t length)
{
SecureVector<byte> buffer;
buffer += encode_tag(type_tag, class_tag);
@@ -359,7 +361,7 @@ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag,
const MemoryRegion<byte>& rep_buf)
{
const byte* rep = &rep_buf[0];
- const u32bit rep_len = rep_buf.size();
+ const size_t rep_len = rep_buf.size();
return add_object(type_tag, class_tag, rep, rep_len);
}
@@ -370,7 +372,7 @@ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag,
const std::string& rep_str)
{
const byte* rep = reinterpret_cast<const byte*>(rep_str.data());
- const u32bit rep_len = rep_str.size();
+ const size_t rep_len = rep_str.size();
return add_object(type_tag, class_tag, rep, rep_len);
}
diff --git a/src/asn1/der_enc.h b/src/asn1/der_enc.h
index ae10b4bc8..b3fce389d 100644
--- a/src/asn1/der_enc.h
+++ b/src/asn1/der_enc.h
@@ -30,7 +30,7 @@ class BOTAN_DLL DER_Encoder
DER_Encoder& start_explicit(u16bit);
DER_Encoder& end_explicit();
- DER_Encoder& raw_bytes(const byte[], u32bit);
+ DER_Encoder& raw_bytes(const byte[], size_t);
DER_Encoder& raw_bytes(const MemoryRegion<byte>&);
DER_Encoder& encode_null();
@@ -38,7 +38,7 @@ class BOTAN_DLL DER_Encoder
DER_Encoder& encode(u32bit);
DER_Encoder& encode(const BigInt&);
DER_Encoder& encode(const MemoryRegion<byte>&, ASN1_Tag);
- DER_Encoder& encode(const byte[], u32bit, ASN1_Tag);
+ DER_Encoder& encode(const byte[], size_t, ASN1_Tag);
DER_Encoder& encode(bool, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC);
DER_Encoder& encode(u32bit, ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC);
@@ -46,7 +46,7 @@ class BOTAN_DLL DER_Encoder
ASN1_Tag = CONTEXT_SPECIFIC);
DER_Encoder& encode(const MemoryRegion<byte>&, ASN1_Tag,
ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC);
- DER_Encoder& encode(const byte[], u32bit, ASN1_Tag,
+ DER_Encoder& encode(const byte[], size_t, ASN1_Tag,
ASN1_Tag, ASN1_Tag = CONTEXT_SPECIFIC);
template<typename T>
@@ -60,15 +60,15 @@ class BOTAN_DLL DER_Encoder
template<typename T>
DER_Encoder& encode_list(const std::vector<T>& values)
{
- for(u32bit j = 0; j != values.size(); ++j)
- encode(values[j]);
+ for(size_t i = 0; i != values.size(); ++i)
+ encode(values[i]);
return (*this);
}
DER_Encoder& encode(const ASN1_Object&);
DER_Encoder& encode_if(bool, DER_Encoder&);
- DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const byte[], u32bit);
+ DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const byte[], size_t);
DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const MemoryRegion<byte>&);
DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, const std::string&);
DER_Encoder& add_object(ASN1_Tag, ASN1_Tag, byte);
@@ -78,7 +78,7 @@ class BOTAN_DLL DER_Encoder
public:
ASN1_Tag tag_of() const;
SecureVector<byte> get_contents();
- void add_bytes(const byte[], u32bit);
+ void add_bytes(const byte[], size_t);
DER_Sequence(ASN1_Tag, ASN1_Tag);
private:
ASN1_Tag type_tag, class_tag;
diff --git a/src/asn1/info.txt b/src/asn1/info.txt
index 7ed025e68..e190ad9ea 100644
--- a/src/asn1/info.txt
+++ b/src/asn1/info.txt
@@ -6,13 +6,13 @@ load_on auto
alg_id.cpp
asn1_alt.cpp
asn1_att.cpp
-asn1_dn.cpp
asn1_int.cpp
asn1_oid.cpp
asn1_str.cpp
asn1_tm.cpp
ber_dec.cpp
der_enc.cpp
+x509_dn.cpp
</source>
<header:public>
@@ -20,8 +20,10 @@ alg_id.h
asn1_int.h
asn1_obj.h
asn1_oid.h
+asn1_str.h
ber_dec.h
der_enc.h
+x509_dn.h
</header:public>
<requires>
diff --git a/src/asn1/asn1_dn.cpp b/src/asn1/x509_dn.cpp
index 7d6e43bcc..0deed1a70 100644
--- a/src/asn1/asn1_dn.cpp
+++ b/src/asn1/x509_dn.cpp
@@ -5,7 +5,7 @@
* Distributed under the terms of the Botan license
*/
-#include <botan/asn1_obj.h>
+#include <botan/x509_dn.h>
#include <botan/der_enc.h>
#include <botan/ber_dec.h>
#include <botan/parsing.h>
diff --git a/src/asn1/x509_dn.h b/src/asn1/x509_dn.h
new file mode 100644
index 000000000..c4fc2d17b
--- /dev/null
+++ b/src/asn1/x509_dn.h
@@ -0,0 +1,54 @@
+/*
+* X.509 Distinguished Name
+* (C) 1999-2010 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_X509_DN_H__
+#define BOTAN_X509_DN_H__
+
+#include <botan/asn1_int.h>
+#include <botan/asn1_oid.h>
+#include <botan/asn1_str.h>
+#include <map>
+
+namespace Botan {
+
+/**
+* Distinguished Name
+*/
+class BOTAN_DLL X509_DN : public ASN1_Object
+ {
+ public:
+ void encode_into(class DER_Encoder&) const;
+ void decode_from(class BER_Decoder&);
+
+ std::multimap<OID, std::string> get_attributes() const;
+ std::vector<std::string> get_attribute(const std::string&) const;
+
+ std::multimap<std::string, std::string> contents() const;
+
+ void add_attribute(const std::string&, const std::string&);
+ void add_attribute(const OID&, const std::string&);
+
+ static std::string deref_info_field(const std::string&);
+
+ void do_decode(const MemoryRegion<byte>&);
+ MemoryVector<byte> get_bits() const;
+
+ X509_DN();
+ X509_DN(const std::multimap<OID, std::string>&);
+ X509_DN(const std::multimap<std::string, std::string>&);
+ private:
+ std::multimap<OID, ASN1_String> dn_info;
+ MemoryVector<byte> dn_bits;
+ };
+
+bool BOTAN_DLL operator==(const X509_DN&, const X509_DN&);
+bool BOTAN_DLL operator!=(const X509_DN&, const X509_DN&);
+bool BOTAN_DLL operator<(const X509_DN&, const X509_DN&);
+
+}
+
+#endif
diff --git a/src/block/aes/aes.cpp b/src/block/aes/aes.cpp
index 88439cf98..1530af965 100644
--- a/src/block/aes/aes.cpp
+++ b/src/block/aes/aes.cpp
@@ -521,8 +521,8 @@ void AES::encrypt_n(const byte in[], byte out[], size_t blocks) const
out[14] = SE[get_byte(2, B1)] ^ ME[14];
out[15] = SE[get_byte(3, B2)] ^ ME[15];
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -611,8 +611,8 @@ void AES::decrypt_n(const byte in[], byte out[], size_t blocks) const
out[14] = SD[get_byte(2, B1)] ^ MD[14];
out[15] = SD[get_byte(3, B0)] ^ MD[15];
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -681,7 +681,7 @@ u32bit AES::S(u32bit input)
/*
* AES Constructor
*/
-AES::AES(u32bit key_size) : BlockCipher(16, key_size),
+AES::AES(u32bit key_size) : BlockCipher_Fixed_Block_Size(key_size),
EK(56), ME(16), DK(56), MD(16)
{
if(key_size != 16 && key_size != 24 && key_size != 32)
diff --git a/src/block/aes/aes.h b/src/block/aes/aes.h
index d62413f5b..6fa0ccaff 100644
--- a/src/block/aes/aes.h
+++ b/src/block/aes/aes.h
@@ -15,17 +15,19 @@ namespace Botan {
/**
* Rijndael aka AES
*/
-class BOTAN_DLL AES : public BlockCipher
+class BOTAN_DLL AES : public BlockCipher_Fixed_Block_Size<16>
{
public:
+ std::string name() const { return "AES"; }
+
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
void decrypt_n(const byte in[], byte out[], size_t blocks) const;
void clear();
- std::string name() const { return "AES"; }
BlockCipher* clone() const { return new AES; }
- AES() : BlockCipher(16, 16, 32, 8), EK(56), ME(16), DK(56), MD(16)
+ AES() : BlockCipher_Fixed_Block_Size(16, 32, 8),
+ EK(56), ME(16), DK(56), MD(16)
{ ROUNDS = 14; }
/**
diff --git a/src/block/aes_ssse3/aes_ssse3.h b/src/block/aes_ssse3/aes_ssse3.h
index 0cdb5f4de..59bb85f12 100644
--- a/src/block/aes_ssse3/aes_ssse3.h
+++ b/src/block/aes_ssse3/aes_ssse3.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* AES-128 using SSSE3
*/
-class BOTAN_DLL AES_128_SSSE3 : public BlockCipher
+class BOTAN_DLL AES_128_SSSE3 : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,8 @@ class BOTAN_DLL AES_128_SSSE3 : public BlockCipher
std::string name() const { return "AES-128"; }
BlockCipher* clone() const { return new AES_128_SSSE3; }
- AES_128_SSSE3() : BlockCipher(16, 16), EK(44), DK(44) {}
+ AES_128_SSSE3() : BlockCipher_Fixed_Block_Size(16),
+ EK(44), DK(44) {}
private:
void key_schedule(const byte[], size_t);
@@ -35,7 +36,7 @@ class BOTAN_DLL AES_128_SSSE3 : public BlockCipher
/**
* AES-192 using SSSE3
*/
-class BOTAN_DLL AES_192_SSSE3 : public BlockCipher
+class BOTAN_DLL AES_192_SSSE3 : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -45,7 +46,8 @@ class BOTAN_DLL AES_192_SSSE3 : public BlockCipher
std::string name() const { return "AES-192"; }
BlockCipher* clone() const { return new AES_192_SSSE3; }
- AES_192_SSSE3() : BlockCipher(16, 24), EK(52), DK(52) {}
+ AES_192_SSSE3() : BlockCipher_Fixed_Block_Size(24),
+ EK(52), DK(52) {}
private:
void key_schedule(const byte[], size_t);
@@ -55,7 +57,7 @@ class BOTAN_DLL AES_192_SSSE3 : public BlockCipher
/**
* AES-256 using SSSE3
*/
-class BOTAN_DLL AES_256_SSSE3 : public BlockCipher
+class BOTAN_DLL AES_256_SSSE3 : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -65,7 +67,8 @@ class BOTAN_DLL AES_256_SSSE3 : public BlockCipher
std::string name() const { return "AES-256"; }
BlockCipher* clone() const { return new AES_256_SSSE3; }
- AES_256_SSSE3() : BlockCipher(16, 32), EK(60), DK(60) {}
+ AES_256_SSSE3() : BlockCipher_Fixed_Block_Size(32),
+ EK(60), DK(60) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/block_cipher.h b/src/block/block_cipher.h
index 5f5e5e530..e522005b9 100644
--- a/src/block/block_cipher.h
+++ b/src/block/block_cipher.h
@@ -25,24 +25,17 @@ class BOTAN_DLL BlockCipher : public SymmetricAlgorithm
* @param key_max the maximum key size
* @param key_mod the modulo restriction on the key size
*/
- BlockCipher(u32bit block_size,
- u32bit key_min,
+ BlockCipher(u32bit key_min,
u32bit key_max = 0,
u32bit key_mod = 1) :
- SymmetricAlgorithm(key_min, key_max, key_mod),
- BLOCK_SIZE(block_size) {}
+ SymmetricAlgorithm(key_min, key_max, key_mod) {}
virtual ~BlockCipher() {}
/**
- * The block size of this algorithm.
- */
- const u32bit BLOCK_SIZE;
-
- /**
* @return block size of this algorithm
*/
- size_t block_size() const { return BLOCK_SIZE; }
+ virtual size_t block_size() const = 0;
/**
* @return native parallelism of this cipher in blocks
@@ -122,6 +115,19 @@ class BOTAN_DLL BlockCipher : public SymmetricAlgorithm
virtual void clear() = 0;
};
+template<size_t N>
+class BlockCipher_Fixed_Block_Size : public BlockCipher
+ {
+ public:
+ BlockCipher_Fixed_Block_Size(u32bit kmin,
+ u32bit kmax = 0,
+ u32bit kmod = 1) :
+ BlockCipher(kmin, kmax, kmod) {}
+
+ enum { BLOCK_SIZE = N };
+ size_t block_size() const { return N; }
+ };
+
}
#endif
diff --git a/src/block/blowfish/blowfish.cpp b/src/block/blowfish/blowfish.cpp
index f77c65d4d..ea227e93e 100644
--- a/src/block/blowfish/blowfish.cpp
+++ b/src/block/blowfish/blowfish.cpp
@@ -40,8 +40,8 @@ void Blowfish::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, R, L);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -75,8 +75,8 @@ void Blowfish::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, R, L);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/blowfish/blowfish.h b/src/block/blowfish/blowfish.h
index 4d39e9e58..c9bf8b2e0 100644
--- a/src/block/blowfish/blowfish.h
+++ b/src/block/blowfish/blowfish.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Blowfish
*/
-class BOTAN_DLL Blowfish : public BlockCipher
+class BOTAN_DLL Blowfish : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL Blowfish : public BlockCipher
std::string name() const { return "Blowfish"; }
BlockCipher* clone() const { return new Blowfish; }
- Blowfish() : BlockCipher(8, 1, 56), S(1024), P(18) {}
+ Blowfish() : BlockCipher_Fixed_Block_Size(1, 56), S(1024), P(18) {}
private:
void key_schedule(const byte[], size_t);
void generate_sbox(MemoryRegion<u32bit>& box,
diff --git a/src/block/cascade/cascade.cpp b/src/block/cascade/cascade.cpp
index 225b7fd6e..2701c20e7 100644
--- a/src/block/cascade/cascade.cpp
+++ b/src/block/cascade/cascade.cpp
@@ -81,10 +81,11 @@ size_t block_size_for_cascade(size_t bs, size_t bs2)
}
Cascade_Cipher::Cascade_Cipher(BlockCipher* c1, BlockCipher* c2) :
- BlockCipher(block_size_for_cascade(c1->block_size(), c2->block_size()),
- c1->MAXIMUM_KEYLENGTH + c2->MAXIMUM_KEYLENGTH),
+ BlockCipher(c1->MAXIMUM_KEYLENGTH + c2->MAXIMUM_KEYLENGTH),
cipher1(c1), cipher2(c2)
{
+ block = block_size_for_cascade(c1->block_size(), c2->block_size());
+
if(block_size() % c1->block_size() || block_size() % c2->block_size())
throw Internal_Error("Failure in " + name() + " constructor");
}
diff --git a/src/block/cascade/cascade.h b/src/block/cascade/cascade.h
index 5e1989cb6..31ee3b336 100644
--- a/src/block/cascade/cascade.h
+++ b/src/block/cascade/cascade.h
@@ -21,6 +21,8 @@ class BOTAN_DLL Cascade_Cipher : public BlockCipher
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
void decrypt_n(const byte in[], byte out[], size_t blocks) const;
+ size_t block_size() const { return block; }
+
void clear();
std::string name() const;
BlockCipher* clone() const;
@@ -36,6 +38,7 @@ class BOTAN_DLL Cascade_Cipher : public BlockCipher
private:
void key_schedule(const byte[], size_t);
+ size_t block;
BlockCipher* cipher1;
BlockCipher* cipher2;
};
diff --git a/src/block/cast/cast128.cpp b/src/block/cast/cast128.cpp
index 092fc201e..24469e025 100644
--- a/src/block/cast/cast128.cpp
+++ b/src/block/cast/cast128.cpp
@@ -74,8 +74,8 @@ void CAST_128::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, R, L);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -108,8 +108,8 @@ void CAST_128::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, R, L);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/cast/cast128.h b/src/block/cast/cast128.h
index edccf04b3..3ecbcaa5a 100644
--- a/src/block/cast/cast128.h
+++ b/src/block/cast/cast128.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* CAST-128
*/
-class BOTAN_DLL CAST_128 : public BlockCipher
+class BOTAN_DLL CAST_128 : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL CAST_128 : public BlockCipher
std::string name() const { return "CAST-128"; }
BlockCipher* clone() const { return new CAST_128; }
- CAST_128() : BlockCipher(8, 11, 16), MK(16), RK(16) {}
+ CAST_128() : BlockCipher_Fixed_Block_Size(11, 16), MK(16), RK(16) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/cast/cast256.cpp b/src/block/cast/cast256.cpp
index 1b41cd2af..8be0a8dd6 100644
--- a/src/block/cast/cast256.cpp
+++ b/src/block/cast/cast256.cpp
@@ -84,8 +84,8 @@ void CAST_256::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, A, B, C, D);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -128,8 +128,8 @@ void CAST_256::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, A, B, C, D);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/cast/cast256.h b/src/block/cast/cast256.h
index 74e38face..0dda7f0d7 100644
--- a/src/block/cast/cast256.h
+++ b/src/block/cast/cast256.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* CAST-256
*/
-class BOTAN_DLL CAST_256 : public BlockCipher
+class BOTAN_DLL CAST_256 : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL CAST_256 : public BlockCipher
std::string name() const { return "CAST-256"; }
BlockCipher* clone() const { return new CAST_256; }
- CAST_256() : BlockCipher(16, 4, 32, 4), MK(48), RK(48) {}
+ CAST_256() : BlockCipher_Fixed_Block_Size(4, 32, 4), MK(48), RK(48) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/des/des.cpp b/src/block/des/des.cpp
index 7c61df3db..15c771bda 100644
--- a/src/block/des/des.cpp
+++ b/src/block/des/des.cpp
@@ -162,8 +162,8 @@ void DES::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(T, out);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -193,8 +193,8 @@ void DES::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(T, out);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -234,8 +234,8 @@ void TripleDES::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(T, out);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -267,8 +267,8 @@ void TripleDES::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(T, out);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/des/des.h b/src/block/des/des.h
index 03641ba40..d758cc4c1 100644
--- a/src/block/des/des.h
+++ b/src/block/des/des.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* DES
*/
-class BOTAN_DLL DES : public BlockCipher
+class BOTAN_DLL DES : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL DES : public BlockCipher
std::string name() const { return "DES"; }
BlockCipher* clone() const { return new DES; }
- DES() : BlockCipher(8, 8), round_key(32) {}
+ DES() : BlockCipher_Fixed_Block_Size(8), round_key(32) {}
private:
void key_schedule(const byte[], size_t);
@@ -35,7 +35,7 @@ class BOTAN_DLL DES : public BlockCipher
/**
* Triple DES
*/
-class BOTAN_DLL TripleDES : public BlockCipher
+class BOTAN_DLL TripleDES : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -45,7 +45,7 @@ class BOTAN_DLL TripleDES : public BlockCipher
std::string name() const { return "TripleDES"; }
BlockCipher* clone() const { return new TripleDES; }
- TripleDES() : BlockCipher(8, 16, 24, 8), round_key(96) {}
+ TripleDES() : BlockCipher_Fixed_Block_Size(16, 24, 8), round_key(96) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/des/desx.cpp b/src/block/des/desx.cpp
index c4dacdfdd..b92011e56 100644
--- a/src/block/des/desx.cpp
+++ b/src/block/des/desx.cpp
@@ -17,12 +17,12 @@ void DESX::encrypt_n(const byte in[], byte out[], size_t blocks) const
{
for(size_t i = 0; i != blocks; ++i)
{
- xor_buf(out, in, &K1[0], block_size());
+ xor_buf(out, in, &K1[0], BLOCK_SIZE);
des.encrypt(out);
- xor_buf(out, &K2[0], block_size());
+ xor_buf(out, &K2[0], BLOCK_SIZE);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -33,12 +33,12 @@ void DESX::decrypt_n(const byte in[], byte out[], size_t blocks) const
{
for(size_t i = 0; i != blocks; ++i)
{
- xor_buf(out, in, &K2[0], block_size());
+ xor_buf(out, in, &K2[0], BLOCK_SIZE);
des.decrypt(out);
- xor_buf(out, &K1[0], block_size());
+ xor_buf(out, &K1[0], BLOCK_SIZE);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/des/desx.h b/src/block/des/desx.h
index b61ea3cf9..962575529 100644
--- a/src/block/des/desx.h
+++ b/src/block/des/desx.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* DESX
*/
-class BOTAN_DLL DESX : public BlockCipher
+class BOTAN_DLL DESX : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL DESX : public BlockCipher
std::string name() const { return "DESX"; }
BlockCipher* clone() const { return new DESX; }
- DESX() : BlockCipher(8, 24), K1(8), K2(8) {}
+ DESX() : BlockCipher_Fixed_Block_Size(24), K1(8), K2(8) {}
private:
void key_schedule(const byte[], size_t);
SecureVector<byte> K1, K2;
diff --git a/src/block/gost_28147/gost_28147.cpp b/src/block/gost_28147/gost_28147.cpp
index ddf26b3d0..9adc0d568 100644
--- a/src/block/gost_28147/gost_28147.cpp
+++ b/src/block/gost_28147/gost_28147.cpp
@@ -52,7 +52,7 @@ GOST_28147_89_Params::GOST_28147_89_Params(const std::string& n) : name(n)
* GOST Constructor
*/
GOST_28147_89::GOST_28147_89(const GOST_28147_89_Params& param) :
- BlockCipher(8, 32), SBOX(1024), EK(8)
+ BlockCipher_Fixed_Block_Size(32), SBOX(1024), EK(8)
{
// Convert the parallel 4x4 sboxes into larger word-based sboxes
for(size_t i = 0; i != 4; ++i)
@@ -107,8 +107,8 @@ void GOST_28147_89::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, N2, N1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -136,8 +136,8 @@ void GOST_28147_89::decrypt_n(const byte in[], byte out[], size_t blocks) const
}
store_le(out, N2, N1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/gost_28147/gost_28147.h b/src/block/gost_28147/gost_28147.h
index d06b63228..adf542bbe 100644
--- a/src/block/gost_28147/gost_28147.h
+++ b/src/block/gost_28147/gost_28147.h
@@ -49,7 +49,7 @@ class BOTAN_DLL GOST_28147_89_Params
/**
* GOST 28147-89
*/
-class BOTAN_DLL GOST_28147_89 : public BlockCipher
+class BOTAN_DLL GOST_28147_89 : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -66,7 +66,7 @@ class BOTAN_DLL GOST_28147_89 : public BlockCipher
GOST_28147_89(const GOST_28147_89_Params& params);
private:
GOST_28147_89(const SecureVector<u32bit>& other_SBOX) :
- BlockCipher(8, 32), SBOX(other_SBOX), EK(8) {}
+ BlockCipher_Fixed_Block_Size(32), SBOX(other_SBOX), EK(8) {}
void key_schedule(const byte[], size_t);
diff --git a/src/block/idea/idea.h b/src/block/idea/idea.h
index c0af38ad6..3552d282f 100644
--- a/src/block/idea/idea.h
+++ b/src/block/idea/idea.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* IDEA
*/
-class BOTAN_DLL IDEA : public BlockCipher
+class BOTAN_DLL IDEA : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL IDEA : public BlockCipher
std::string name() const { return "IDEA"; }
BlockCipher* clone() const { return new IDEA; }
- IDEA() : BlockCipher(8, 16), EK(52), DK(52) {}
+ IDEA() : BlockCipher_Fixed_Block_Size(16), EK(52), DK(52) {}
protected:
/**
* @return const reference to encryption subkeys
diff --git a/src/block/idea_sse2/idea_sse2.cpp b/src/block/idea_sse2/idea_sse2.cpp
index 8c7bd2a2c..469a33943 100644
--- a/src/block/idea_sse2/idea_sse2.cpp
+++ b/src/block/idea_sse2/idea_sse2.cpp
@@ -201,8 +201,8 @@ void IDEA_SSE2::encrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 8)
{
idea_op_8(in, out, KS);
- in += 8 * block_size();
- out += 8 * block_size();
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
blocks -= 8;
}
@@ -220,8 +220,8 @@ void IDEA_SSE2::decrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 8)
{
idea_op_8(in, out, KS);
- in += 8 * block_size();
- out += 8 * block_size();
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
blocks -= 8;
}
diff --git a/src/block/kasumi/kasumi.cpp b/src/block/kasumi/kasumi.cpp
index 1a217a9c7..a57c0396a 100644
--- a/src/block/kasumi/kasumi.cpp
+++ b/src/block/kasumi/kasumi.cpp
@@ -145,8 +145,8 @@ void KASUMI::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B0, B1, B2, B3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -191,8 +191,8 @@ void KASUMI::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B0, B1, B2, B3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/kasumi/kasumi.h b/src/block/kasumi/kasumi.h
index c6b3c4351..7b416f193 100644
--- a/src/block/kasumi/kasumi.h
+++ b/src/block/kasumi/kasumi.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* KASUMI, the block cipher used in 3G telephony
*/
-class BOTAN_DLL KASUMI : public BlockCipher
+class BOTAN_DLL KASUMI : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL KASUMI : public BlockCipher
std::string name() const { return "KASUMI"; }
BlockCipher* clone() const { return new KASUMI; }
- KASUMI() : BlockCipher(8, 16), EK(64) {}
+ KASUMI() : BlockCipher_Fixed_Block_Size(16), EK(64) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/lion/lion.cpp b/src/block/lion/lion.cpp
index 9214044f6..103759e39 100644
--- a/src/block/lion/lion.cpp
+++ b/src/block/lion/lion.cpp
@@ -33,8 +33,8 @@ void Lion::encrypt_n(const byte in[], byte out[], size_t blocks) const
cipher->set_key(buffer, LEFT_SIZE);
cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -60,8 +60,8 @@ void Lion::decrypt_n(const byte in[], byte out[], size_t blocks) const
cipher->set_key(buffer, LEFT_SIZE);
cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -83,7 +83,7 @@ std::string Lion::name() const
{
return "Lion(" + hash->name() + "," +
cipher->name() + "," +
- std::to_string(block_size()) + ")";
+ std::to_string(BLOCK_SIZE) + ")";
}
/*
@@ -91,7 +91,7 @@ std::string Lion::name() const
*/
BlockCipher* Lion::clone() const
{
- return new Lion(hash->clone(), cipher->clone(), block_size());
+ return new Lion(hash->clone(), cipher->clone(), BLOCK_SIZE);
}
/*
@@ -109,14 +109,14 @@ void Lion::clear()
* Lion Constructor
*/
Lion::Lion(HashFunction* hash_in, StreamCipher* sc_in, size_t block_len) :
- BlockCipher(std::max<size_t>(2*hash_in->output_length() + 1, block_len),
- 2, 2*hash_in->output_length(), 2),
+ BlockCipher(2, 2*hash_in->output_length(), 2),
+ BLOCK_SIZE(std::max<size_t>(2*hash_in->output_length() + 1, block_len)),
LEFT_SIZE(hash_in->output_length()),
- RIGHT_SIZE(block_size() - LEFT_SIZE),
+ RIGHT_SIZE(BLOCK_SIZE - LEFT_SIZE),
hash(hash_in),
cipher(sc_in)
{
- if(2*LEFT_SIZE + 1 > block_size())
+ if(2*LEFT_SIZE + 1 > BLOCK_SIZE)
throw Invalid_Argument(name() + ": Chosen block size is too small");
if(!cipher->valid_keylength(LEFT_SIZE))
diff --git a/src/block/lion/lion.h b/src/block/lion/lion.h
index 9beb68ca6..d4eb9c327 100644
--- a/src/block/lion/lion.h
+++ b/src/block/lion/lion.h
@@ -28,6 +28,8 @@ class BOTAN_DLL Lion : public BlockCipher
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
void decrypt_n(const byte in[], byte out[], size_t blocks) const;
+ size_t block_size() const { return BLOCK_SIZE; }
+
void clear();
std::string name() const;
BlockCipher* clone() const;
@@ -45,7 +47,7 @@ class BOTAN_DLL Lion : public BlockCipher
private:
void key_schedule(const byte[], size_t);
- const size_t LEFT_SIZE, RIGHT_SIZE;
+ const size_t BLOCK_SIZE, LEFT_SIZE, RIGHT_SIZE;
HashFunction* hash;
StreamCipher* cipher;
diff --git a/src/block/lubyrack/lubyrack.cpp b/src/block/lubyrack/lubyrack.cpp
index aa33c6bc4..335570973 100644
--- a/src/block/lubyrack/lubyrack.cpp
+++ b/src/block/lubyrack/lubyrack.cpp
@@ -42,8 +42,8 @@ void LubyRackoff::encrypt_n(const byte in[], byte out[], size_t blocks) const
hash->final(buffer);
xor_buf(out, buffer, len);
- in += block_size();
- out += block_size();
+ in += 2 * len;
+ out += 2 * len;
}
}
@@ -79,8 +79,8 @@ void LubyRackoff::decrypt_n(const byte in[], byte out[], size_t blocks) const
hash->final(buffer);
xor_buf(out + len, buffer, len);
- in += block_size();
- out += block_size();
+ in += 2 * len;
+ out += 2 * len;
}
}
@@ -123,8 +123,7 @@ std::string LubyRackoff::name() const
* Luby-Rackoff Constructor
*/
LubyRackoff::LubyRackoff(HashFunction* h) :
- BlockCipher(2 * (h ? h->output_length(): 0),
- 2, 32, 2),
+ BlockCipher(2, 32, 2),
hash(h)
{
}
diff --git a/src/block/lubyrack/lubyrack.h b/src/block/lubyrack/lubyrack.h
index 4567215e1..0c267683a 100644
--- a/src/block/lubyrack/lubyrack.h
+++ b/src/block/lubyrack/lubyrack.h
@@ -22,6 +22,8 @@ class BOTAN_DLL LubyRackoff : public BlockCipher
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
void decrypt_n(const byte in[], byte out[], size_t blocks) const;
+ size_t block_size() const { return 2 * hash->output_length(); }
+
void clear();
std::string name() const;
BlockCipher* clone() const;
diff --git a/src/block/mars/mars.cpp b/src/block/mars/mars.cpp
index 5864ac49b..fa73e564f 100644
--- a/src/block/mars/mars.cpp
+++ b/src/block/mars/mars.cpp
@@ -267,8 +267,8 @@ void MARS::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, A, B, C, D);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -310,8 +310,8 @@ void MARS::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, D, C, B, A);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/mars/mars.h b/src/block/mars/mars.h
index a61f475f2..7a53d116b 100644
--- a/src/block/mars/mars.h
+++ b/src/block/mars/mars.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* MARS, IBM's candidate for AES
*/
-class BOTAN_DLL MARS : public BlockCipher
+class BOTAN_DLL MARS : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL MARS : public BlockCipher
std::string name() const { return "MARS"; }
BlockCipher* clone() const { return new MARS; }
- MARS() : BlockCipher(16, 16, 32, 4), EK(40) {}
+ MARS() : BlockCipher_Fixed_Block_Size(16, 32, 4), EK(40) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/misty1/misty1.cpp b/src/block/misty1/misty1.cpp
index b87f513a0..9ad30502c 100644
--- a/src/block/misty1/misty1.cpp
+++ b/src/block/misty1/misty1.cpp
@@ -144,8 +144,8 @@ void MISTY1::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B2, B3, B0, B1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -194,8 +194,8 @@ void MISTY1::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B0, B1, B2, B3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -251,7 +251,9 @@ void MISTY1::key_schedule(const byte key[], size_t length)
/*
* MISTY1 Constructor
*/
-MISTY1::MISTY1(size_t rounds) : BlockCipher(8, 16), EK(100), DK(100)
+MISTY1::MISTY1(size_t rounds) :
+ BlockCipher_Fixed_Block_Size(16),
+ EK(100), DK(100)
{
if(rounds != 8)
throw Invalid_Argument("MISTY1: Invalid number of rounds: "
diff --git a/src/block/misty1/misty1.h b/src/block/misty1/misty1.h
index 318e63b7d..3bd05b4c6 100644
--- a/src/block/misty1/misty1.h
+++ b/src/block/misty1/misty1.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* MISTY1
*/
-class BOTAN_DLL MISTY1 : public BlockCipher
+class BOTAN_DLL MISTY1 : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
diff --git a/src/block/noekeon/noekeon.cpp b/src/block/noekeon/noekeon.cpp
index c29fed93e..06c415be9 100644
--- a/src/block/noekeon/noekeon.cpp
+++ b/src/block/noekeon/noekeon.cpp
@@ -114,8 +114,8 @@ void Noekeon::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, A0, A1, A2, A3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -152,8 +152,8 @@ void Noekeon::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, A0, A1, A2, A3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/noekeon/noekeon.h b/src/block/noekeon/noekeon.h
index 593afa634..79c627579 100644
--- a/src/block/noekeon/noekeon.h
+++ b/src/block/noekeon/noekeon.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Noekeon
*/
-class BOTAN_DLL Noekeon : public BlockCipher
+class BOTAN_DLL Noekeon : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL Noekeon : public BlockCipher
std::string name() const { return "Noekeon"; }
BlockCipher* clone() const { return new Noekeon; }
- Noekeon() : BlockCipher(16, 16), EK(4), DK(4) {}
+ Noekeon() : BlockCipher_Fixed_Block_Size(16), EK(4), DK(4) {}
protected:
/**
* The Noekeon round constants
diff --git a/src/block/rc2/rc2.cpp b/src/block/rc2/rc2.cpp
index 5c7cb1ead..97ca5d577 100644
--- a/src/block/rc2/rc2.cpp
+++ b/src/block/rc2/rc2.cpp
@@ -48,8 +48,8 @@ void RC2::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, R0, R1, R2, R3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -90,8 +90,8 @@ void RC2::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, R0, R1, R2, R3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/rc2/rc2.h b/src/block/rc2/rc2.h
index 4addf22ed..ad4b1a308 100644
--- a/src/block/rc2/rc2.h
+++ b/src/block/rc2/rc2.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* RC2
*/
-class BOTAN_DLL RC2 : public BlockCipher
+class BOTAN_DLL RC2 : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -32,7 +32,7 @@ class BOTAN_DLL RC2 : public BlockCipher
std::string name() const { return "RC2"; }
BlockCipher* clone() const { return new RC2; }
- RC2() : BlockCipher(8, 1, 32), K(64) {}
+ RC2() : BlockCipher_Fixed_Block_Size(1, 32), K(64) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/rc5/rc5.cpp b/src/block/rc5/rc5.cpp
index 36d4cdd3a..ebcbaf69f 100644
--- a/src/block/rc5/rc5.cpp
+++ b/src/block/rc5/rc5.cpp
@@ -38,8 +38,8 @@ void RC5::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, A, B);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -68,8 +68,8 @@ void RC5::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, A, B);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -112,7 +112,9 @@ std::string RC5::name() const
/*
* RC5 Constructor
*/
-RC5::RC5(size_t r) : BlockCipher(8, 1, 32), ROUNDS(r)
+RC5::RC5(size_t r) :
+ BlockCipher_Fixed_Block_Size(1, 32),
+ ROUNDS(r)
{
if(ROUNDS < 8 || ROUNDS > 32 || (ROUNDS % 4 != 0))
throw Invalid_Argument(name() + ": Invalid number of rounds");
diff --git a/src/block/rc5/rc5.h b/src/block/rc5/rc5.h
index 11a62badb..a9f3b5b0e 100644
--- a/src/block/rc5/rc5.h
+++ b/src/block/rc5/rc5.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* RC5
*/
-class BOTAN_DLL RC5 : public BlockCipher
+class BOTAN_DLL RC5 : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
diff --git a/src/block/rc6/rc6.cpp b/src/block/rc6/rc6.cpp
index df87acbb1..53ca5a7a2 100644
--- a/src/block/rc6/rc6.cpp
+++ b/src/block/rc6/rc6.cpp
@@ -55,8 +55,8 @@ void RC6::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, A, B, C, D);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -103,8 +103,8 @@ void RC6::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, A, B, C, D);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/rc6/rc6.h b/src/block/rc6/rc6.h
index 307834a8c..8446138e0 100644
--- a/src/block/rc6/rc6.h
+++ b/src/block/rc6/rc6.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* RC6, Ron Rivest's AES candidate
*/
-class BOTAN_DLL RC6 : public BlockCipher
+class BOTAN_DLL RC6 : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL RC6 : public BlockCipher
std::string name() const { return "RC6"; }
BlockCipher* clone() const { return new RC6; }
- RC6() : BlockCipher(16, 1, 32), S(44) {}
+ RC6() : BlockCipher_Fixed_Block_Size(1, 32), S(44) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/safer/safer_sk.cpp b/src/block/safer/safer_sk.cpp
index 5edd9245b..2e6c3a1d6 100644
--- a/src/block/safer/safer_sk.cpp
+++ b/src/block/safer/safer_sk.cpp
@@ -43,8 +43,8 @@ void SAFER_SK::encrypt_n(const byte in[], byte out[], size_t blocks) const
out[4] = E ^ EK[16*ROUNDS+4]; out[5] = F + EK[16*ROUNDS+5];
out[6] = G + EK[16*ROUNDS+6]; out[7] = H ^ EK[16*ROUNDS+7];
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -81,8 +81,8 @@ void SAFER_SK::decrypt_n(const byte in[], byte out[], size_t blocks) const
out[0] = A; out[1] = B; out[2] = C; out[3] = D;
out[4] = E; out[5] = F; out[6] = G; out[7] = H;
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -127,8 +127,9 @@ BlockCipher* SAFER_SK::clone() const
/*
* SAFER-SK Constructor
*/
-SAFER_SK::SAFER_SK(size_t rounds) : BlockCipher(8, 16),
- EK(16 * rounds + 8), ROUNDS(rounds)
+SAFER_SK::SAFER_SK(size_t rounds) :
+ BlockCipher_Fixed_Block_Size(16),
+ EK(16 * rounds + 8), ROUNDS(rounds)
{
if(ROUNDS > 13 || ROUNDS == 0)
throw Invalid_Argument(name() + ": Invalid number of rounds");
diff --git a/src/block/safer/safer_sk.h b/src/block/safer/safer_sk.h
index a64d09fb7..5e8d32b0a 100644
--- a/src/block/safer/safer_sk.h
+++ b/src/block/safer/safer_sk.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* SAFER-SK
*/
-class BOTAN_DLL SAFER_SK : public BlockCipher
+class BOTAN_DLL SAFER_SK : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
diff --git a/src/block/seed/seed.cpp b/src/block/seed/seed.cpp
index 015d2d48d..408220013 100644
--- a/src/block/seed/seed.cpp
+++ b/src/block/seed/seed.cpp
@@ -54,8 +54,8 @@ void SEED::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B2, B3, B0, B1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -94,8 +94,8 @@ void SEED::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, B2, B3, B0, B1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/seed/seed.h b/src/block/seed/seed.h
index 48fefc9b0..649e28a68 100644
--- a/src/block/seed/seed.h
+++ b/src/block/seed/seed.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* SEED, a Korean block cipher
*/
-class BOTAN_DLL SEED : public BlockCipher
+class BOTAN_DLL SEED : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL SEED : public BlockCipher
std::string name() const { return "SEED"; }
BlockCipher* clone() const { return new SEED; }
- SEED() : BlockCipher(16, 16), K(32) {}
+ SEED() : BlockCipher_Fixed_Block_Size(16), K(32) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/serpent/serpent.cpp b/src/block/serpent/serpent.cpp
index ec37a9e97..1d940cf39 100644
--- a/src/block/serpent/serpent.cpp
+++ b/src/block/serpent/serpent.cpp
@@ -287,8 +287,8 @@ void Serpent::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, B0, B1, B2, B3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -339,8 +339,8 @@ void Serpent::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, B0, B1, B2, B3);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/serpent/serpent.h b/src/block/serpent/serpent.h
index 515a90407..fccdcf214 100644
--- a/src/block/serpent/serpent.h
+++ b/src/block/serpent/serpent.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Serpent, an AES finalist
*/
-class BOTAN_DLL Serpent : public BlockCipher
+class BOTAN_DLL Serpent : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -24,7 +24,9 @@ class BOTAN_DLL Serpent : public BlockCipher
void clear() { zeroise(round_key); }
std::string name() const { return "Serpent"; }
BlockCipher* clone() const { return new Serpent; }
- Serpent() : BlockCipher(16, 16, 32, 8), round_key(132) {}
+
+ Serpent() : BlockCipher_Fixed_Block_Size(16, 32, 8),
+ round_key(132) {}
protected:
/**
* For use by subclasses using SIMD, asm, etc
diff --git a/src/block/serpent_ia32/serp_ia32.cpp b/src/block/serpent_ia32/serp_ia32.cpp
index 76814647c..d2f8adb62 100644
--- a/src/block/serpent_ia32/serp_ia32.cpp
+++ b/src/block/serpent_ia32/serp_ia32.cpp
@@ -49,8 +49,8 @@ void Serpent_IA32::encrypt_n(const byte in[], byte out[], size_t blocks) const
for(size_t i = 0; i != blocks; ++i)
{
botan_serpent_ia32_encrypt(in, out, this->get_round_keys());
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -62,8 +62,8 @@ void Serpent_IA32::decrypt_n(const byte in[], byte out[], size_t blocks) const
for(size_t i = 0; i != blocks; ++i)
{
botan_serpent_ia32_decrypt(in, out, this->get_round_keys());
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/serpent_simd/serp_simd.cpp b/src/block/serpent_simd/serp_simd.cpp
index aef37cb99..babe68d40 100644
--- a/src/block/serpent_simd/serp_simd.cpp
+++ b/src/block/serpent_simd/serp_simd.cpp
@@ -185,8 +185,8 @@ void Serpent_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 4)
{
serpent_encrypt_4(in, out, KS);
- in += 4 * block_size();
- out += 4 * block_size();
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
blocks -= 4;
}
@@ -204,8 +204,8 @@ void Serpent_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 4)
{
serpent_decrypt_4(in, out, KS);
- in += 4 * block_size();
- out += 4 * block_size();
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
blocks -= 4;
}
diff --git a/src/block/skipjack/skipjack.cpp b/src/block/skipjack/skipjack.cpp
index 7f25cc90a..b73972b59 100644
--- a/src/block/skipjack/skipjack.cpp
+++ b/src/block/skipjack/skipjack.cpp
@@ -108,8 +108,8 @@ void Skipjack::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, W4, W3, W2, W1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -149,8 +149,8 @@ void Skipjack::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, W4, W3, W2, W1);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/skipjack/skipjack.h b/src/block/skipjack/skipjack.h
index dff85df6c..73ae28de2 100644
--- a/src/block/skipjack/skipjack.h
+++ b/src/block/skipjack/skipjack.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Skipjack, a NSA designed cipher used in Fortezza
*/
-class BOTAN_DLL Skipjack : public BlockCipher
+class BOTAN_DLL Skipjack : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL Skipjack : public BlockCipher
std::string name() const { return "Skipjack"; }
BlockCipher* clone() const { return new Skipjack; }
- Skipjack() : BlockCipher(8, 10), FTAB(2560) {}
+ Skipjack() : BlockCipher_Fixed_Block_Size(10), FTAB(2560) {}
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/square/square.cpp b/src/block/square/square.cpp
index ba86dd931..b1517b990 100644
--- a/src/block/square/square.cpp
+++ b/src/block/square/square.cpp
@@ -68,8 +68,8 @@ void Square::encrypt_n(const byte in[], byte out[], size_t blocks) const
out[14] = SE[get_byte(3, B2)] ^ ME[30];
out[15] = SE[get_byte(3, B3)] ^ ME[31];
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -130,8 +130,8 @@ void Square::decrypt_n(const byte in[], byte out[], size_t blocks) const
out[14] = SD[get_byte(3, B2)] ^ MD[30];
out[15] = SD[get_byte(3, B3)] ^ MD[31];
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/square/square.h b/src/block/square/square.h
index 0a134bcb5..d6df63131 100644
--- a/src/block/square/square.h
+++ b/src/block/square/square.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Square
*/
-class BOTAN_DLL Square : public BlockCipher
+class BOTAN_DLL Square : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,9 @@ class BOTAN_DLL Square : public BlockCipher
std::string name() const { return "Square"; }
BlockCipher* clone() const { return new Square; }
- Square() : BlockCipher(16, 16), EK(28), DK(28), ME(32), MD(32) {}
+ Square() : BlockCipher_Fixed_Block_Size(16),
+ EK(28), DK(28), ME(32), MD(32) {}
+
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/tea/tea.cpp b/src/block/tea/tea.cpp
index 328786a14..4ef995a7c 100644
--- a/src/block/tea/tea.cpp
+++ b/src/block/tea/tea.cpp
@@ -30,8 +30,8 @@ void TEA::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, L, R);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -55,8 +55,8 @@ void TEA::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, L, R);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/tea/tea.h b/src/block/tea/tea.h
index eeab13cbc..a7318ba5c 100644
--- a/src/block/tea/tea.h
+++ b/src/block/tea/tea.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* TEA
*/
-class BOTAN_DLL TEA : public BlockCipher
+class BOTAN_DLL TEA : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL TEA : public BlockCipher
std::string name() const { return "TEA"; }
BlockCipher* clone() const { return new TEA; }
- TEA() : BlockCipher(8, 16), K(4) {}
+ TEA() : BlockCipher_Fixed_Block_Size(16), K(4) {}
private:
void key_schedule(const byte[], size_t);
SecureVector<u32bit> K;
diff --git a/src/block/twofish/twofish.cpp b/src/block/twofish/twofish.cpp
index a573c2ec8..41bc7ca1c 100644
--- a/src/block/twofish/twofish.cpp
+++ b/src/block/twofish/twofish.cpp
@@ -57,8 +57,8 @@ void Twofish::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, C, D, A, B);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -108,8 +108,8 @@ void Twofish::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_le(out, C, D, A, B);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/twofish/twofish.h b/src/block/twofish/twofish.h
index 38263af98..a212bd285 100644
--- a/src/block/twofish/twofish.h
+++ b/src/block/twofish/twofish.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* Twofish, an AES finalist
*/
-class BOTAN_DLL Twofish : public BlockCipher
+class BOTAN_DLL Twofish : public BlockCipher_Fixed_Block_Size<16>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,9 @@ class BOTAN_DLL Twofish : public BlockCipher
std::string name() const { return "Twofish"; }
BlockCipher* clone() const { return new Twofish; }
- Twofish() : BlockCipher(16, 16, 32, 8), SB(1024), RK(40) {}
+ Twofish() : BlockCipher_Fixed_Block_Size(16, 32, 8),
+ SB(1024), RK(40) {}
+
private:
void key_schedule(const byte[], size_t);
diff --git a/src/block/xtea/xtea.cpp b/src/block/xtea/xtea.cpp
index ba07ba57c..597eedd07 100644
--- a/src/block/xtea/xtea.cpp
+++ b/src/block/xtea/xtea.cpp
@@ -64,8 +64,8 @@ void XTEA::encrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 4)
{
xtea_encrypt_4(in, out, &(this->EK[0]));
- in += 4 * block_size();
- out += 4 * block_size();
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
blocks -= 4;
}
@@ -82,8 +82,8 @@ void XTEA::encrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, L, R);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
@@ -95,8 +95,8 @@ void XTEA::decrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 4)
{
xtea_decrypt_4(in, out, &(this->EK[0]));
- in += 4 * block_size();
- out += 4 * block_size();
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
blocks -= 4;
}
@@ -113,8 +113,8 @@ void XTEA::decrypt_n(const byte in[], byte out[], size_t blocks) const
store_be(out, L, R);
- in += block_size();
- out += block_size();
+ in += BLOCK_SIZE;
+ out += BLOCK_SIZE;
}
}
diff --git a/src/block/xtea/xtea.h b/src/block/xtea/xtea.h
index c870f588a..539725be8 100644
--- a/src/block/xtea/xtea.h
+++ b/src/block/xtea/xtea.h
@@ -15,7 +15,7 @@ namespace Botan {
/**
* XTEA
*/
-class BOTAN_DLL XTEA : public BlockCipher
+class BOTAN_DLL XTEA : public BlockCipher_Fixed_Block_Size<8>
{
public:
void encrypt_n(const byte in[], byte out[], size_t blocks) const;
@@ -25,7 +25,7 @@ class BOTAN_DLL XTEA : public BlockCipher
std::string name() const { return "XTEA"; }
BlockCipher* clone() const { return new XTEA; }
- XTEA() : BlockCipher(8, 16), EK(64) {}
+ XTEA() : BlockCipher_Fixed_Block_Size(16), EK(64) {}
protected:
/**
* @return const reference to the key schedule
diff --git a/src/block/xtea_simd/xtea_simd.cpp b/src/block/xtea_simd/xtea_simd.cpp
index 5b73c7bb9..831cc0359 100644
--- a/src/block/xtea_simd/xtea_simd.cpp
+++ b/src/block/xtea_simd/xtea_simd.cpp
@@ -99,8 +99,8 @@ void XTEA_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 8)
{
xtea_encrypt_8(in, out, KS);
- in += 8 * block_size();
- out += 8 * block_size();
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
blocks -= 8;
}
@@ -118,8 +118,8 @@ void XTEA_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const
while(blocks >= 8)
{
xtea_decrypt_8(in, out, KS);
- in += 8 * block_size();
- out += 8 * block_size();
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
blocks -= 8;
}
diff --git a/src/cert/pkcs10/pkcs10.h b/src/cert/pkcs10/pkcs10.h
index d1be9e0d3..bd01fb6b5 100644
--- a/src/cert/pkcs10/pkcs10.h
+++ b/src/cert/pkcs10/pkcs10.h
@@ -9,6 +9,7 @@
#define BOTAN_PKCS10_H__
#include <botan/x509_obj.h>
+#include <botan/x509_dn.h>
#include <botan/pkcs8.h>
#include <botan/datastor.h>
#include <vector>
diff --git a/src/cert/x509cert/x509cert.h b/src/cert/x509cert/x509cert.h
index dc7ef4dbb..754553f3d 100644
--- a/src/cert/x509cert/x509cert.h
+++ b/src/cert/x509cert/x509cert.h
@@ -9,6 +9,7 @@
#define BOTAN_X509_CERTS_H__
#include <botan/x509_obj.h>
+#include <botan/x509_dn.h>
#include <botan/x509_key.h>
#include <botan/datastor.h>
#include <botan/pubkey_enums.h>
diff --git a/src/constructs/fpe/fpe.cpp b/src/constructs/fpe/fpe.cpp
index d7101c544..3747171c2 100644
--- a/src/constructs/fpe/fpe.cpp
+++ b/src/constructs/fpe/fpe.cpp
@@ -105,10 +105,10 @@ FPE_Encryptor::FPE_Encryptor(const SymmetricKey& key,
if(n_bin.size() > MAX_N_BYTES)
throw std::runtime_error("N is too large for FPE encryption");
- mac->update_be(n_bin.size(), 4);
+ mac->update_be((u32bit)n_bin.size());
mac->update(&n_bin[0], n_bin.size());
- mac->update_be(tweak.size(), 4);
+ mac->update_be((u32bit)tweak.size());
mac->update(&tweak[0], tweak.size());
mac_n_t = mac->final();
@@ -119,9 +119,9 @@ BigInt FPE_Encryptor::operator()(u32bit round_no, const BigInt& R)
SecureVector<byte> r_bin = BigInt::encode(R);
mac->update(mac_n_t);
- mac->update_be(round_no, 4);
+ mac->update_be(round_no);
- mac->update_be(r_bin.size(), 4);
+ mac->update_be((u32bit)r_bin.size());
mac->update(&r_bin[0], r_bin.size());
SecureVector<byte> X = mac->final();
diff --git a/src/hash/mdx_hash/mdx_hash.cpp b/src/hash/mdx_hash/mdx_hash.cpp
index 84b97fd7f..f82c971f8 100644
--- a/src/hash/mdx_hash/mdx_hash.cpp
+++ b/src/hash/mdx_hash/mdx_hash.cpp
@@ -50,22 +50,22 @@ void MDx_HashFunction::add_data(const byte input[], size_t length)
{
buffer.copy(position, input, length);
- if(position + length >= hash_block_size())
+ if(position + length >= buffer.size())
{
compress_n(&buffer[0], 1);
- input += (hash_block_size() - position);
- length -= (hash_block_size() - position);
+ input += (buffer.size() - position);
+ length -= (buffer.size() - position);
position = 0;
}
}
- const size_t full_blocks = length / hash_block_size();
- const size_t remaining = length % hash_block_size();
+ const size_t full_blocks = length / buffer.size();
+ const size_t remaining = length % buffer.size();
if(full_blocks)
compress_n(input, full_blocks);
- buffer.copy(position, input + full_blocks * hash_block_size(), remaining);
+ buffer.copy(position, input + full_blocks * buffer.size(), remaining);
position += remaining;
}
@@ -75,16 +75,16 @@ void MDx_HashFunction::add_data(const byte input[], size_t length)
void MDx_HashFunction::final_result(byte output[])
{
buffer[position] = (BIG_BIT_ENDIAN ? 0x80 : 0x01);
- for(size_t i = position+1; i != hash_block_size(); ++i)
+ for(size_t i = position+1; i != buffer.size(); ++i)
buffer[i] = 0;
- if(position >= hash_block_size() - COUNT_SIZE)
+ if(position >= buffer.size() - COUNT_SIZE)
{
compress_n(&buffer[0], 1);
zeroise(buffer);
}
- write_count(&buffer[hash_block_size() - COUNT_SIZE]);
+ write_count(&buffer[buffer.size() - COUNT_SIZE]);
compress_n(&buffer[0], 1);
copy_out(output);
diff --git a/src/utils/buf_comp/buf_comp.h b/src/utils/buf_comp/buf_comp.h
index a64d807dd..0b0ef6e16 100644
--- a/src/utils/buf_comp/buf_comp.h
+++ b/src/utils/buf_comp/buf_comp.h
@@ -14,9 +14,8 @@
namespace Botan {
/**
-* This class represents any kind of computation which
-* uses an internal state,
-* such as hash functions.
+* This class represents any kind of computation which uses an internal
+* state, such as hash functions or MACs
*/
class BOTAN_DLL BufferedComputation
{
@@ -48,9 +47,13 @@ class BOTAN_DLL BufferedComputation
add_data(&in[0], in.size());
}
- template<typename T> void update_be(const T in, size_t upto = sizeof(T))
+ /**
+ * Add an integer in big-endian order
+ * @param in the value
+ */
+ template<typename T> void update_be(const T in)
{
- for(size_t i = 0; i != std::min(upto, sizeof(T)); ++i)
+ for(size_t i = 0; i != sizeof(T); ++i)
{
byte b = get_byte(i, in);
add_data(&b, 1);