00001
00002
00003 #include "pch.h"
00004 #include "ttmac.h"
00005 #include "misc.h"
00006
00007 NAMESPACE_BEGIN(CryptoPP)
00008
00009 void TTMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &)
00010 {
00011 AssertValidKeyLength(keylength);
00012
00013 memcpy(m_key, userKey, KEYLENGTH);
00014 CorrectEndianess(m_key, m_key, KEYLENGTH);
00015
00016 Init();
00017 }
00018
00019 void TTMAC_Base::Init()
00020 {
00021 m_digest[0] = m_digest[5] = m_key[0];
00022 m_digest[1] = m_digest[6] = m_key[1];
00023 m_digest[2] = m_digest[7] = m_key[2];
00024 m_digest[3] = m_digest[8] = m_key[3];
00025 m_digest[4] = m_digest[9] = m_key[4];
00026 }
00027
00028 void TTMAC_Base::TruncatedFinal(byte *hash, size_t size)
00029 {
00030 PadLastBlock(BlockSize() - 2*sizeof(HashWordType));
00031 CorrectEndianess(m_data, m_data, BlockSize() - 2*sizeof(HashWordType));
00032
00033 m_data[m_data.size()-2] = GetBitCountLo();
00034 m_data[m_data.size()-1] = GetBitCountHi();
00035
00036 Transform(m_digest, m_data, true);
00037
00038 word32 t2 = m_digest[2];
00039 word32 t3 = m_digest[3];
00040 if (size != DIGESTSIZE)
00041 {
00042 switch (size)
00043 {
00044 case 16:
00045 m_digest[3] += m_digest[1] + m_digest[4];
00046
00047 case 12:
00048 m_digest[2] += m_digest[0] + t3;
00049
00050 case 8:
00051 m_digest[0] += m_digest[1] + t3;
00052 m_digest[1] += m_digest[4] + t2;
00053 break;
00054
00055 case 4:
00056 m_digest[0] +=
00057 m_digest[1] +
00058 m_digest[2] +
00059 m_digest[3] +
00060 m_digest[4];
00061 break;
00062
00063 case 0:
00064
00065 break;
00066
00067 default:
00068 throw InvalidArgument("TTMAC_Base: can't truncate a Two-Track-MAC 20 byte digest to " + IntToString(size) + " bytes");
00069 break;
00070 }
00071 }
00072
00073 CorrectEndianess(m_digest, m_digest, size);
00074 memcpy(hash, m_digest, size);
00075
00076 Restart();
00077 }
00078
00079
00080
00081 #define F(x, y, z) (x ^ y ^ z)
00082 #define G(x, y, z) (z ^ (x & (y^z)))
00083 #define H(x, y, z) (z ^ (x | ~y))
00084 #define I(x, y, z) (y ^ (z & (x^y)))
00085 #define J(x, y, z) (x ^ (y | ~z))
00086
00087 #define k0 0
00088 #define k1 0x5a827999UL
00089 #define k2 0x6ed9eba1UL
00090 #define k3 0x8f1bbcdcUL
00091 #define k4 0xa953fd4eUL
00092 #define k5 0x50a28be6UL
00093 #define k6 0x5c4dd124UL
00094 #define k7 0x6d703ef3UL
00095 #define k8 0x7a6d76e9UL
00096 #define k9 0
00097
00098 void TTMAC_Base::Transform(word32 *digest, const word32 *X, bool last)
00099 {
00100 #define Subround(f, a, b, c, d, e, x, s, k) \
00101 a += f(b, c, d) + x + k;\
00102 a = rotlFixed((word32)a, s) + e;\
00103 c = rotlFixed((word32)c, 10U)
00104
00105 word32 a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
00106 word32 *trackA, *trackB;
00107
00108 if (!last)
00109 {
00110 trackA = digest;
00111 trackB = digest+5;
00112 }
00113 else
00114 {
00115 trackB = digest;
00116 trackA = digest+5;
00117 }
00118 a1 = trackA[0];
00119 b1 = trackA[1];
00120 c1 = trackA[2];
00121 d1 = trackA[3];
00122 e1 = trackA[4];
00123 a2 = trackB[0];
00124 b2 = trackB[1];
00125 c2 = trackB[2];
00126 d2 = trackB[3];
00127 e2 = trackB[4];
00128
00129 Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
00130 Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
00131 Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
00132 Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
00133 Subround(F, b1, c1, d1, e1, a1, X[ 4], 5, k0);
00134 Subround(F, a1, b1, c1, d1, e1, X[ 5], 8, k0);
00135 Subround(F, e1, a1, b1, c1, d1, X[ 6], 7, k0);
00136 Subround(F, d1, e1, a1, b1, c1, X[ 7], 9, k0);
00137 Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
00138 Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
00139 Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
00140 Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
00141 Subround(F, d1, e1, a1, b1, c1, X[12], 6, k0);
00142 Subround(F, c1, d1, e1, a1, b1, X[13], 7, k0);
00143 Subround(F, b1, c1, d1, e1, a1, X[14], 9, k0);
00144 Subround(F, a1, b1, c1, d1, e1, X[15], 8, k0);
00145
00146 Subround(G, e1, a1, b1, c1, d1, X[ 7], 7, k1);
00147 Subround(G, d1, e1, a1, b1, c1, X[ 4], 6, k1);
00148 Subround(G, c1, d1, e1, a1, b1, X[13], 8, k1);
00149 Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
00150 Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
00151 Subround(G, e1, a1, b1, c1, d1, X[ 6], 9, k1);
00152 Subround(G, d1, e1, a1, b1, c1, X[15], 7, k1);
00153 Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
00154 Subround(G, b1, c1, d1, e1, a1, X[12], 7, k1);
00155 Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
00156 Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
00157 Subround(G, d1, e1, a1, b1, c1, X[ 5], 9, k1);
00158 Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
00159 Subround(G, b1, c1, d1, e1, a1, X[14], 7, k1);
00160 Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
00161 Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
00162
00163 Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
00164 Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
00165 Subround(H, b1, c1, d1, e1, a1, X[14], 6, k2);
00166 Subround(H, a1, b1, c1, d1, e1, X[ 4], 7, k2);
00167 Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
00168 Subround(H, d1, e1, a1, b1, c1, X[15], 9, k2);
00169 Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
00170 Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
00171 Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
00172 Subround(H, e1, a1, b1, c1, d1, X[ 7], 8, k2);
00173 Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
00174 Subround(H, c1, d1, e1, a1, b1, X[ 6], 6, k2);
00175 Subround(H, b1, c1, d1, e1, a1, X[13], 5, k2);
00176 Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
00177 Subround(H, e1, a1, b1, c1, d1, X[ 5], 7, k2);
00178 Subround(H, d1, e1, a1, b1, c1, X[12], 5, k2);
00179
00180 Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
00181 Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
00182 Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
00183 Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
00184 Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
00185 Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
00186 Subround(I, b1, c1, d1, e1, a1, X[12], 9, k3);
00187 Subround(I, a1, b1, c1, d1, e1, X[ 4], 8, k3);
00188 Subround(I, e1, a1, b1, c1, d1, X[13], 9, k3);
00189 Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
00190 Subround(I, c1, d1, e1, a1, b1, X[ 7], 5, k3);
00191 Subround(I, b1, c1, d1, e1, a1, X[15], 6, k3);
00192 Subround(I, a1, b1, c1, d1, e1, X[14], 8, k3);
00193 Subround(I, e1, a1, b1, c1, d1, X[ 5], 6, k3);
00194 Subround(I, d1, e1, a1, b1, c1, X[ 6], 5, k3);
00195 Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
00196
00197 Subround(J, b1, c1, d1, e1, a1, X[ 4], 9, k4);
00198 Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
00199 Subround(J, e1, a1, b1, c1, d1, X[ 5], 5, k4);
00200 Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
00201 Subround(J, c1, d1, e1, a1, b1, X[ 7], 6, k4);
00202 Subround(J, b1, c1, d1, e1, a1, X[12], 8, k4);
00203 Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
00204 Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
00205 Subround(J, d1, e1, a1, b1, c1, X[14], 5, k4);
00206 Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
00207 Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
00208 Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
00209 Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
00210 Subround(J, d1, e1, a1, b1, c1, X[ 6], 8, k4);
00211 Subround(J, c1, d1, e1, a1, b1, X[15], 5, k4);
00212 Subround(J, b1, c1, d1, e1, a1, X[13], 6, k4);
00213
00214 Subround(J, a2, b2, c2, d2, e2, X[ 5], 8, k5);
00215 Subround(J, e2, a2, b2, c2, d2, X[14], 9, k5);
00216 Subround(J, d2, e2, a2, b2, c2, X[ 7], 9, k5);
00217 Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
00218 Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
00219 Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
00220 Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
00221 Subround(J, d2, e2, a2, b2, c2, X[ 4], 5, k5);
00222 Subround(J, c2, d2, e2, a2, b2, X[13], 7, k5);
00223 Subround(J, b2, c2, d2, e2, a2, X[ 6], 7, k5);
00224 Subround(J, a2, b2, c2, d2, e2, X[15], 8, k5);
00225 Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
00226 Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
00227 Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
00228 Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
00229 Subround(J, a2, b2, c2, d2, e2, X[12], 6, k5);
00230
00231 Subround(I, e2, a2, b2, c2, d2, X[ 6], 9, k6);
00232 Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
00233 Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
00234 Subround(I, b2, c2, d2, e2, a2, X[ 7], 7, k6);
00235 Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
00236 Subround(I, e2, a2, b2, c2, d2, X[13], 8, k6);
00237 Subround(I, d2, e2, a2, b2, c2, X[ 5], 9, k6);
00238 Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
00239 Subround(I, b2, c2, d2, e2, a2, X[14], 7, k6);
00240 Subround(I, a2, b2, c2, d2, e2, X[15], 7, k6);
00241 Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
00242 Subround(I, d2, e2, a2, b2, c2, X[12], 7, k6);
00243 Subround(I, c2, d2, e2, a2, b2, X[ 4], 6, k6);
00244 Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
00245 Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
00246 Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
00247
00248 Subround(H, d2, e2, a2, b2, c2, X[15], 9, k7);
00249 Subround(H, c2, d2, e2, a2, b2, X[ 5], 7, k7);
00250 Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
00251 Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
00252 Subround(H, e2, a2, b2, c2, d2, X[ 7], 8, k7);
00253 Subround(H, d2, e2, a2, b2, c2, X[14], 6, k7);
00254 Subround(H, c2, d2, e2, a2, b2, X[ 6], 6, k7);
00255 Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
00256 Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
00257 Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
00258 Subround(H, d2, e2, a2, b2, c2, X[12], 5, k7);
00259 Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
00260 Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
00261 Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
00262 Subround(H, e2, a2, b2, c2, d2, X[ 4], 7, k7);
00263 Subround(H, d2, e2, a2, b2, c2, X[13], 5, k7);
00264
00265 Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
00266 Subround(G, b2, c2, d2, e2, a2, X[ 6], 5, k8);
00267 Subround(G, a2, b2, c2, d2, e2, X[ 4], 8, k8);
00268 Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
00269 Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
00270 Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
00271 Subround(G, b2, c2, d2, e2, a2, X[15], 6, k8);
00272 Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
00273 Subround(G, e2, a2, b2, c2, d2, X[ 5], 6, k8);
00274 Subround(G, d2, e2, a2, b2, c2, X[12], 9, k8);
00275 Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
00276 Subround(G, b2, c2, d2, e2, a2, X[13], 9, k8);
00277 Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
00278 Subround(G, e2, a2, b2, c2, d2, X[ 7], 5, k8);
00279 Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
00280 Subround(G, c2, d2, e2, a2, b2, X[14], 8, k8);
00281
00282 Subround(F, b2, c2, d2, e2, a2, X[12], 8, k9);
00283 Subround(F, a2, b2, c2, d2, e2, X[15], 5, k9);
00284 Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
00285 Subround(F, d2, e2, a2, b2, c2, X[ 4], 9, k9);
00286 Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
00287 Subround(F, b2, c2, d2, e2, a2, X[ 5], 5, k9);
00288 Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
00289 Subround(F, e2, a2, b2, c2, d2, X[ 7], 6, k9);
00290 Subround(F, d2, e2, a2, b2, c2, X[ 6], 8, k9);
00291 Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
00292 Subround(F, b2, c2, d2, e2, a2, X[13], 6, k9);
00293 Subround(F, a2, b2, c2, d2, e2, X[14], 5, k9);
00294 Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
00295 Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
00296 Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
00297 Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
00298
00299 a1 -= trackA[0];
00300 b1 -= trackA[1];
00301 c1 -= trackA[2];
00302 d1 -= trackA[3];
00303 e1 -= trackA[4];
00304 a2 -= trackB[0];
00305 b2 -= trackB[1];
00306 c2 -= trackB[2];
00307 d2 -= trackB[3];
00308 e2 -= trackB[4];
00309
00310 if (!last)
00311 {
00312 trackA[0] = (b1 + e1) - d2;
00313 trackA[1] = c1 - e2;
00314 trackA[2] = d1 - a2;
00315 trackA[3] = e1 - b2;
00316 trackA[4] = a1 - c2;
00317 trackB[0] = d1 - e2;
00318 trackB[1] = (e1 + c1) - a2;
00319 trackB[2] = a1 - b2;
00320 trackB[3] = b1 - c2;
00321 trackB[4] = c1 - d2;
00322 }
00323 else
00324 {
00325 trackB[0] = a2 - a1;
00326 trackB[1] = b2 - b1;
00327 trackB[2] = c2 - c1;
00328 trackB[3] = d2 - d1;
00329 trackB[4] = e2 - e1;
00330 trackA[0] = 0;
00331 trackA[1] = 0;
00332 trackA[2] = 0;
00333 trackA[3] = 0;
00334 trackA[4] = 0;
00335 }
00336 }
00337
00338 NAMESPACE_END