aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-02-02 17:02:19 +0000
committerlloyd <[email protected]>2014-02-02 17:02:19 +0000
commit5492417158c2eca5ba8c3eb3c7370749d125fac4 (patch)
tree2ac5c2ec5601b99c8caceb2f77b318ec41a37a2d
parent43b79ef586143d93a6843f8e9a34f774103f46b3 (diff)
Add the CMAC constants for 256 and 512 bit block ciphers
Also add test vectors for Threefish-512 CMAC and EAX, both generated by the library.
-rw-r--r--src/lib/mac/cmac/cmac.cpp34
-rw-r--r--src/tests/data/aead/eax.vec9
-rw-r--r--src/tests/data/mac/cmac.vec9
3 files changed, 46 insertions, 6 deletions
diff --git a/src/lib/mac/cmac/cmac.cpp b/src/lib/mac/cmac/cmac.cpp
index 16524faec..b4c9cb129 100644
--- a/src/lib/mac/cmac/cmac.cpp
+++ b/src/lib/mac/cmac/cmac.cpp
@@ -16,9 +16,7 @@ namespace Botan {
*/
secure_vector<byte> CMAC::poly_double(const secure_vector<byte>& in)
{
- const byte polynomial = (in.size() == 16) ? 0x87 : 0x1B;
-
- const byte poly_xor = (in[0] & 0x80) ? polynomial : 0;
+ const bool top_carry = (in[0] & 0x80);
secure_vector<byte> out = in;
@@ -30,7 +28,26 @@ secure_vector<byte> CMAC::poly_double(const secure_vector<byte>& in)
carry = (temp >> 7);
}
- out[out.size()-1] ^= poly_xor;
+ if(top_carry)
+ {
+ switch(in.size())
+ {
+ case 8:
+ out[out.size()-1] ^= 0x1B;
+ break;
+ case 16:
+ out[out.size()-1] ^= 0x87;
+ break;
+ case 32:
+ out[out.size()-2] ^= 0x4;
+ out[out.size()-1] ^= 0x25;
+ break;
+ case 64:
+ out[out.size()-2] ^= 0x1;
+ out[out.size()-1] ^= 0x25;
+ break;
+ }
+ }
return out;
}
@@ -133,8 +150,13 @@ MessageAuthenticationCode* CMAC::clone() const
*/
CMAC::CMAC(BlockCipher* cipher) : m_cipher(cipher)
{
- if(m_cipher->block_size() != 8 && m_cipher->block_size() != 16)
- throw Invalid_Argument("CMAC cannot use the cipher " + m_cipher->name());
+ if(m_cipher->block_size() != 8 && m_cipher->block_size() != 16 &&
+ m_cipher->block_size() != 32 && m_cipher->block_size() != 64)
+ {
+ throw Invalid_Argument("CMAC cannot use the " +
+ std::to_string(m_cipher->block_size() * 8) +
+ " bit cipher " + m_cipher->name());
+ }
m_state.resize(output_length());
m_buffer.resize(output_length());
diff --git a/src/tests/data/aead/eax.vec b/src/tests/data/aead/eax.vec
index 90b7e2903..6b6a408a7 100644
--- a/src/tests/data/aead/eax.vec
+++ b/src/tests/data/aead/eax.vec
@@ -1458,3 +1458,12 @@ Nonce = 000102030405060708090A0B0C0D0E0F
AD = 000102030405060708090A0B0C0D0E0F
In = 000102030405060708090A0B0C0D0E0F
Out = 600FA4149AF252C87B828C780AEFF8BC33D7D11DCDC19936
+
+# Threefish vectors generated by us
+
+[Threefish-512/EAX]
+Key = 2E749EE66C1E6A162E749EE66C1E6A162E749EE66C1E6A169315F0C4AF8500EB9315F0C4AF8500EB9315F0C4AF8500EBDADBCE3EE3B8FC50DADB3F8050DAEBDC
+Nonce = 000102030405060708090A0B0C0D0E0F
+AD = 000102030405060708090A0B0C0D0E0F
+In = 000102030405060708090A0B0C0D0E0F
+Out = 5E8EEADAB182F96CC0144B722F3383FBFC9F462072B9D82FE49F9AD148DA83F23CE248546FC580FAB0A01E21BCE063FF54FFB5038A3FEDD2296B535936EFDE77E51125C9F4EFC4AE073F5A98921C601F
diff --git a/src/tests/data/mac/cmac.vec b/src/tests/data/mac/cmac.vec
index 55c476294..3859d6464 100644
--- a/src/tests/data/mac/cmac.vec
+++ b/src/tests/data/mac/cmac.vec
@@ -145,3 +145,12 @@ Key = 420D2C372E496D403A9F520158FCCDA6D6BCE14E6EAD2B90918B919E5E8621A0
In = 4DD7C1974501D1E454D23C509FE2265BC375CA
Out = CB1C20084C5DACB3270F118633DB4F33
+[CMAC(Blowfish)]
+Key = 0000000000000000
+In = 0000000000000000000000000000000000000000000000000000000000000000
+Out = CE2A6A95E8C3CAB9
+
+[CMAC(Threefish-512)]
+Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+In = 0000000000000000000000000000000000000000000000000000000000000000
+Out = C07C71A284C7A63023146376F895E83543EA3547A9268861CD00B7AC405AFC34A9EC86A30622D38C7E765521B148AAB5DEDD3AE80496ED56BCCB17B2E3D18009