#include #include #include #include #include using namespace std; void printer(int which, const char *label, u8 *vector, int lth) { cout << " block" << which << " " << label << " = "; int i; for (i = 0; i < lth; i++) { cout << hex << std::setw(2) << setfill('0') << (int)vector[i] << dec; } } void check(int which, u8 *exp, u8 *got) { printer(which, "exp", exp, 15); printer(which, "got", got, 15); int err = 0; int i; for (i = 0; i < 15; i++) { if (exp[i] == got[i]) continue; err = 1; break; } if (err) { cout << " ERROR" << endl; } else { cout << " ok" << endl; } } int unhex(const char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; cout << "oops" << endl; exit(1); } int seti(const char *src) { int r = 0; for ( ; *src != 0; src++) { r = (r << 4) + unhex(*src); } return r; } void setu8(u8 *dst, const char *src) { for ( ; *src != 0; src += 2) { *dst++ = (unhex(src[0]) << 4) | (unhex(src[1])); } } int main() { int i, keylth; unsigned int count; u8 key[16], exp1[15], exp2[15], got1[15], got2[15]; const char *data[52] = { "2BD6459F82C5BC00", "24F20F", "889EEAAF9ED1BA1ABBD8436232E440", "5CA3406AA244CF69CF047AADA2DF40", "952C49104881FF48", "061527", "AB7DB38A573A325DAA76E4CB800A40", "4C4B594FEA9D00FE8978B7B7BC1080", "EFA8B2229E720C2A", "33FD3F", "0E4015755A336469C3DD8680E30340", "6F10669E2B4E18B042431A28E47F80", "3451F23A43BD2C87", "0E418C", "75F7C4C51560905DFBA05E46FB54C0", "192C95353CDF979E054186DF15BF00", "CAA2639BE82435CF", "2FF229", "301437E4D4D6565D4904C631606EC0", "F0A3B8795E264D3E1A82F684353DC0", "7AE67E87400B9FA6", "2F24E5", "F794290FEF643D2EA348A7796A2100", "CB6FA6C6B8A705AF9FEFE975818500", "58AF69935540698B", "05446B", "749CA4E6B691E5A598C461D5FE4740", "31C9E444CD04677ADAA8A082ADBC40", "017F81E5F236FE62", "156B26", "2A6976761E60CC4E8F9F52160276C0", "A544D8475F2C78C35614128F1179C0", "1ACA8B448B767B39", "0BC3B5", "A4F70DC5A2C9707F5FA1C60EB10640", "7780B597B328C1400B5C74823E8500", // "5ACB1D644C0D512041A5", "1D5157", "8EFAEC49C355CCD995C2BF649FD480", "F3A2910CAEDF587E976171AAF33B80", // "9315819243A043BEBE6E", "2E196F", "AA08DB46DD3DED78A612085C529D00", "0250463DA0E3886F9BC2E3BB0D73C0", // "3D43C388C9581E337FF1F97EB5C1F85E", "35D2CF", "A2FE3034B6B22CC4E33C7090BEC340", "170D7497432FF897B91BE8AECBA880", // "A4496A64DF4F399F3B4506814A3E07A1", "212777", "89CDEE360DF9110281BCF57755A040", "33822C0C779598C9CBFC49183AF7C0", }; for (i = 32; i>=0; i-=4) { cout << "test set " << (1+i/4) << endl; setu8(key, data[i]); keylth = strlen(data[i])*4; count = seti(data[i+1]); A53_GSM(key, keylth, count, got1, got2); setu8(exp1, data[i+2]); setu8(exp2, data[i+3]); check(1, exp1, got1); check(2, exp2, got2); } cout << "time test" << endl; int n = 10000; float t = clock(); for (i = 0; i < n; i++) { A53_GSM(key, keylth, count, got1, got2); } t = (clock() - t) / (CLOCKS_PER_SEC * (float)n); cout << "GSM takes " << t << " seconds per iteration" << endl; exit(0); }