aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cert/cvc/cvc_self.cpp4
-rw-r--r--src/cert/cvc/eac_obj.h2
-rw-r--r--src/filters/modes/xts/xts.cpp40
3 files changed, 33 insertions, 13 deletions
diff --git a/src/cert/cvc/cvc_self.cpp b/src/cert/cvc/cvc_self.cpp
index 0052651c9..dae8f1804 100644
--- a/src/cert/cvc/cvc_self.cpp
+++ b/src/cert/cvc/cvc_self.cpp
@@ -80,7 +80,7 @@ EAC1_1_CVC create_self_signed_cert(Private_Key const& key,
ASN1_Chr chr(opt.car.value());
AlgorithmIdentifier sig_algo;
- std::string padding_and_hash(eac_cvc_emsa + "(" + opt.hash_alg + ")");
+ std::string padding_and_hash("EMSA1_BSI(" + opt.hash_alg + ")");
sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash);
sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM);
@@ -111,7 +111,7 @@ EAC1_1_Req create_cvc_req(Private_Key const& key,
throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type");
}
AlgorithmIdentifier sig_algo;
- std::string padding_and_hash(eac_cvc_emsa + "(" + hash_alg + ")");
+ std::string padding_and_hash("EMSA1_BSI(" + hash_alg + ")");
sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash);
sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM);
diff --git a/src/cert/cvc/eac_obj.h b/src/cert/cvc/eac_obj.h
index f822442bc..74d7460dd 100644
--- a/src/cert/cvc/eac_obj.h
+++ b/src/cert/cvc/eac_obj.h
@@ -23,8 +23,6 @@
namespace Botan {
-const std::string eac_cvc_emsa("EMSA1_BSI");
-
/*
* TR03110 v1.1 EAC CV Certificate
*/
diff --git a/src/filters/modes/xts/xts.cpp b/src/filters/modes/xts/xts.cpp
index cfea0b34b..68eb0c482 100644
--- a/src/filters/modes/xts/xts.cpp
+++ b/src/filters/modes/xts/xts.cpp
@@ -176,6 +176,18 @@ void XTS_Encryption::buffered_final(const byte input[], u32bit length)
}
else
{ // steal ciphertext
+
+ u32bit leftover_blocks =
+ ((length / cipher->BLOCK_SIZE) - 1) * cipher->BLOCK_SIZE;
+
+ buffered_block(input, leftover_blocks);
+
+ input += leftover_blocks;
+ length -= leftover_blocks;
+
+ if(length >= 2*cipher->BLOCK_SIZE)
+ throw std::runtime_error("Die vampire die");
+
SecureVector<byte> temp(input, length);
xor_buf(temp, tweak, cipher->BLOCK_SIZE);
@@ -201,7 +213,8 @@ void XTS_Encryption::buffered_final(const byte input[], u32bit length)
* XTS_Decryption constructor
*/
XTS_Decryption::XTS_Decryption(BlockCipher* ciph) :
- Buffered_Filter(BOTAN_PARALLEL_BLOCKS_XTS * ciph->BLOCK_SIZE, 1)
+ Buffered_Filter(BOTAN_PARALLEL_BLOCKS_XTS * ciph->BLOCK_SIZE,
+ ciph->BLOCK_SIZE + 1)
{
cipher = ciph;
cipher2 = ciph->clone();
@@ -214,7 +227,8 @@ XTS_Decryption::XTS_Decryption(BlockCipher* ciph) :
XTS_Decryption::XTS_Decryption(BlockCipher* ciph,
const SymmetricKey& key,
const InitializationVector& iv) :
- Buffered_Filter(BOTAN_PARALLEL_BLOCKS_XTS * ciph->BLOCK_SIZE, 1)
+ Buffered_Filter(BOTAN_PARALLEL_BLOCKS_XTS * ciph->BLOCK_SIZE,
+ ciph->BLOCK_SIZE + 1)
{
cipher = ciph;
cipher2 = ciph->clone();
@@ -320,18 +334,26 @@ void XTS_Decryption::buffered_block(const byte input[], u32bit input_length)
}
}
-void XTS_Decryption::buffered_final(const byte input[], u32bit input_length)
+void XTS_Decryption::buffered_final(const byte input[], u32bit length)
{
- if(input_length <= cipher->BLOCK_SIZE)
+ if(length <= cipher->BLOCK_SIZE)
throw Decoding_Error("XTS_Decryption: insufficient data to decrypt");
- if(input_length % cipher->BLOCK_SIZE == 0)
+ if(length % cipher->BLOCK_SIZE == 0)
{
- buffered_block(input, input_length);
+ buffered_block(input, length);
}
else
{
- SecureVector<byte> temp(input, input_length);
+ u32bit leftover_blocks =
+ ((length / cipher->BLOCK_SIZE) - 1) * cipher->BLOCK_SIZE;
+
+ buffered_block(input, leftover_blocks);
+
+ input += leftover_blocks;
+ length -= leftover_blocks;
+
+ SecureVector<byte> temp(input, length);
SecureVector<byte> tweak_copy(&tweak[0], cipher->BLOCK_SIZE);
poly_double(tweak_copy, cipher->BLOCK_SIZE);
@@ -340,14 +362,14 @@ void XTS_Decryption::buffered_final(const byte input[], u32bit input_length)
cipher->decrypt(temp);
xor_buf(temp, tweak_copy, cipher->BLOCK_SIZE);
- for(u32bit i = 0; i != input_length - cipher->BLOCK_SIZE; ++i)
+ for(u32bit i = 0; i != length - cipher->BLOCK_SIZE; ++i)
std::swap(temp[i], temp[i + cipher->BLOCK_SIZE]);
xor_buf(temp, tweak, cipher->BLOCK_SIZE);
cipher->decrypt(temp);
xor_buf(temp, tweak, cipher->BLOCK_SIZE);
- send(temp, input_length);
+ send(temp, length);
}
buffer_reset();