static err_t beeReadAndCalcStamp(octet stampRead[STAMP_SIZE], octet stampCalc[STAMP_SIZE]) { err_t code = ERR_OK; char name[MAX_PATH]; HANDLE hFile, hMapping; DWORD size, offset; octet* image; void* hash_state; // имя модуля if (!GetModuleFileNameA(GetModuleHandleA("bee2.dll"), name, sizeof(name))) return ERR_SYS; // открыть файл hFile = CreateFileA(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return ERR_FILE_OPEN; // длина файла size = SetFilePointer(hFile, 0, NULL, FILE_END); if (size == INVALID_SET_FILE_POINTER) { CloseHandle(hFile); return ERR_SYS; } // проецировать файл в память hMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (hMapping == NULL) { CloseHandle(hFile); return ERR_SYS; } // отобразить файл в память image = (octet*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); if (image == NULL) { CloseHandle(hMapping), CloseHandle(hFile); return ERR_SYS; } // найти смещение контрольной характеристики offset = stampFindOffset(image, size); if (offset == (DWORD)-1) { UnmapViewOfFile(image), CloseHandle(hMapping), CloseHandle(hFile); return ERR_BAD_FORMAT; } // сохранить характеристику memCopy(stampRead, image + offset, STAMP_SIZE); // вычислить характеристику CASSERT(STAMP_SIZE >= 32); memSetZero(stampCalc, STAMP_SIZE); hash_state = blobCreate(beltHash_keep()); if (hash_state) { // хэшировать beltHashStart(hash_state); beltHashStepH(image, offset, hash_state); beltHashStepH(image + offset + STAMP_SIZE, size - offset - STAMP_SIZE, hash_state); beltHashStepG(stampCalc, hash_state); blobClose(hash_state); } else code = ERR_OUTOFMEMORY; // очистка и выход UnmapViewOfFile(image); CloseHandle(hMapping); CloseHandle(hFile); return code; }
bool_t beltTest() { octet buf[48]; octet buf1[48]; octet mac[8]; octet mac1[8]; octet hash[32]; octet hash1[32]; u32 key[8]; octet level[12]; octet state[1024]; // создать стек ASSERT(sizeof(state) >= beltECB_keep()); ASSERT(sizeof(state) >= beltCBC_keep()); ASSERT(sizeof(state) >= beltCFB_keep()); ASSERT(sizeof(state) >= beltCTR_keep()); ASSERT(sizeof(state) >= beltMAC_keep()); ASSERT(sizeof(state) >= beltDWP_keep()); ASSERT(sizeof(state) >= beltKWP_keep()); ASSERT(sizeof(state) >= beltHash_keep()); ASSERT(sizeof(state) >= beltKRP_keep()); ASSERT(sizeof(state) >= beltHMAC_keep()); // тест A.1 memCopy(buf, beltH(), 16); beltKeyExpand2(key, beltH() + 128, 32); beltBlockEncr(buf, key); if (!hexEq(buf, "69CCA1C93557C9E3D66BC3E0FA88FA6E")) return FALSE; // тест A.4 memCopy(buf, beltH() + 64, 16); beltKeyExpand2(key, beltH() + 128 + 32, 32); beltBlockDecr(buf, key); if (!hexEq(buf, "0DC5300600CAB840B38448E5E993F421")) return FALSE; // тест A.6 memCopy(buf, beltH(), 48); beltECBStart(state, beltH() + 128, 32); beltECBStepE(buf, 32, state); beltECBStepE(buf + 32, 48 - 32, state); if (!hexEq(buf, "69CCA1C93557C9E3D66BC3E0FA88FA6E" "5F23102EF109710775017F73806DA9DC" "46FB2ED2CE771F26DCB5E5D1569F9AB0")) return FALSE; beltECBEncr(buf1, beltH(), 48, beltH() + 128, 32); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.7 memCopy(buf, beltH(), 47); beltECBStart(state, beltH() + 128, 32); beltECBStepE(buf, 16, state); beltECBStepE(buf + 16, 47 - 16, state); if (!hexEq(buf, "69CCA1C93557C9E3D66BC3E0FA88FA" "6E36F00CFED6D1CA1498C12798F4BE" "B2075F23102EF109710775017F7380" "6DA9")) return FALSE; beltECBEncr(buf1, beltH(), 47, beltH() + 128, 32); if (!memEq(buf, buf1, 47)) return FALSE; // тест A.8 memCopy(buf, beltH() + 64, 48); beltECBStart(state, beltH() + 128 + 32, 32); beltECBStepD(buf, 16, state); beltECBStepD(buf + 16, 48 - 16, state); if (!hexEq(buf, "0DC5300600CAB840B38448E5E993F421" "E55A239F2AB5C5D5FDB6E81B40938E2A" "54120CA3E6E19C7AD750FC3531DAEAB7")) return FALSE; beltECBDecr(buf1, beltH() + 64, 48, beltH() + 128 + 32, 32); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.9 memCopy(buf, beltH() + 64, 36); beltECBStart(state, beltH() + 128 + 32, 32); beltECBStepD(buf, 36, state); if (!hexEq(buf, "0DC5300600CAB840B38448E5E993F421" "5780A6E2B69EAFBB258726D7B6718523" "E55A239F")) return FALSE; beltECBDecr(buf1, beltH() + 64, 36, beltH() + 128 + 32, 32); if (!memEq(buf, buf1, 36)) return FALSE; // тест A.10 memCopy(buf, beltH(), 48); beltCBCStart(state, beltH() + 128, 32, beltH() + 192); beltCBCStepE(buf, 32, state); beltCBCStepE(buf + 32, 48 - 32, state); if (!hexEq(buf, "10116EFAE6AD58EE14852E11DA1B8A74" "5CF2480E8D03F1C19492E53ED3A70F60" "657C1EE8C0E0AE5B58388BF8A68E3309")) return FALSE; beltCBCEncr(buf1, beltH(), 48, beltH() + 128, 32, beltH() + 192); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.11 memCopy(buf, beltH(), 36); beltCBCStart(state, beltH() + 128, 32, beltH() + 192); beltCBCStepE(buf, 16, state); beltCBCStepE(buf + 16, 36 - 16, state); if (!hexEq(buf, "10116EFAE6AD58EE14852E11DA1B8A74" "6A9BBADCAF73F968F875DEDC0A44F6B1" "5CF2480E")) return FALSE; beltCBCEncr(buf1, beltH(), 36, beltH() + 128, 32, beltH() + 192); if (!memEq(buf, buf1, 36)) return FALSE; // тест A.12 memCopy(buf, beltH() + 64, 48); beltCBCStart(state, beltH() + 128 + 32, 32, beltH() + 192 + 16); beltCBCStepD(buf, 16, state); beltCBCStepD(buf + 16, 48 - 16, state); if (!hexEq(buf, "730894D6158E17CC1600185A8F411CAB" "0471FF85C83792398D8924EBD57D03DB" "95B97A9B7907E4B020960455E46176F8")) return FALSE; beltCBCDecr(buf1, beltH() + 64, 48, beltH() + 128 + 32, 32, beltH() + 192 + 16); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.13 memCopy(buf, beltH() + 64, 36); beltCBCStart(state, beltH() + 128 + 32, 32, beltH() + 192 + 16); beltCBCStepD(buf, 16, state); beltCBCStepD(buf + 16, 36 - 16, state); if (!hexEq(buf, "730894D6158E17CC1600185A8F411CAB" "B6AB7AF8541CF85755B8EA27239F08D2" "166646E4")) return FALSE; beltCBCDecr(buf1, beltH() + 64, 36, beltH() + 128 + 32, 32, beltH() + 192 + 16); if (!memEq(buf, buf1, 36)) return FALSE; // тест A.14 memCopy(buf, beltH(), 48); beltCFBStart(state, beltH() + 128, 32, beltH() + 192); beltCFBStepE(buf, 16, state); beltCFBStepE(buf + 16, 3, state); beltCFBStepE(buf + 16 + 3, 48 - 16 - 3, state); if (!hexEq(buf, "C31E490A90EFA374626CC99E4B7B8540" "A6E48685464A5A06849C9CA769A1B0AE" "55C2CC5939303EC832DD2FE16C8E5A1B")) return FALSE; beltCFBEncr(buf1, beltH(), 48, beltH() + 128, 32, beltH() + 192); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.15 memCopy(buf, beltH() + 64, 48); beltCFBStart(state, beltH() + 128 + 32, 32, beltH() + 192 + 16); beltCFBStepD(buf, 15, state); beltCFBStepD(buf + 15, 7, state); beltCFBStepD(buf + 15 + 7, 48 - 15 - 7, state); if (!hexEq(buf, "FA9D107A86F375EE65CD1DB881224BD0" "16AFF814938ED39B3361ABB0BF0851B6" "52244EB06842DD4C94AA4500774E40BB")) return FALSE; beltCFBDecr(buf1, beltH() + 64, 48, beltH() + 128 + 32, 32, beltH() + 192 + 16); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.16 memCopy(buf, beltH(), 48); beltCTRStart(state, beltH() + 128, 32, beltH() + 192); beltCTRStepE(buf, 15, state); beltCTRStepE(buf + 15, 7, state); beltCTRStepE(buf + 15 + 7, 48 - 15 - 7, state); if (!hexEq(buf, "52C9AF96FF50F64435FC43DEF56BD797" "D5B5B1FF79FB41257AB9CDF6E63E81F8" "F00341473EAE409833622DE05213773A")) return FALSE; beltCTR(buf1, beltH(), 48, beltH() + 128, 32, beltH() + 192); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.17 beltMACStart(state, beltH() + 128, 32); beltMACStepA(beltH(), 13, state); hexTo(buf, "7260DA60138F96C9"); if (!beltMACStepV(buf, state)) return FALSE; beltMAC(buf1, beltH(), 13, beltH() + 128, 32); if (!memEq(buf, buf1, 8)) return FALSE; // тест A.18 [+ инкрементальность] beltMACStart(state, beltH() + 128, 32); beltMACStepA(beltH(), 27, state); beltMACStepG(buf, state); beltMACStepA(beltH() + 27, 48 - 27, state); beltMACStepG2(buf, 4, state); hexTo(buf, "2DAB59771B4B16D0"); if (!beltMACStepV(buf, state) || !beltMACStepV2(buf, 3, state)) return FALSE; beltMAC(buf1, beltH(), 48, beltH() + 128, 32); if (!memEq(buf, buf1, 8)) return FALSE; // тест A.20 beltDWPStart(state, beltH() + 128, 32, beltH() + 192); memCopy(buf, beltH(), 16); beltDWPStepE(buf, 16, state); beltDWPStepI(beltH() + 16, 32, state); beltDWPStepA(buf, 16, state); beltDWPStepG(mac, state); if (!hexEq(buf, "52C9AF96FF50F64435FC43DEF56BD797")) return FALSE; if (!hexEq(mac, "3B2E0AEB2B91854B")) return FALSE; beltDWPWrap(buf1, mac1, beltH(), 16, beltH() + 16, 32, beltH() + 128, 32, beltH() + 192); if (!memEq(buf, buf1, 16) || !memEq(mac, mac1, 8)) return FALSE; // тест A.21 beltDWPStart(state, beltH() + 128 + 32, 32, beltH() + 192 + 16); memCopy(buf, beltH() + 64, 16); beltDWPStepI(beltH() + 64 + 16, 32, state); beltDWPStepA(buf, 16, state); beltDWPStepD(buf, 16, state); beltDWPStepG(mac, state); if (!hexEq(buf, "DF181ED008A20F43DCBBB93650DAD34B")) return FALSE; if (!hexEq(mac, "6A2C2C94C4150DC0")) return FALSE; if (beltDWPUnwrap(buf1, beltH() + 64, 16, beltH() + 64 + 16, 32, mac, beltH() + 128 + 32, 32, beltH() + 192 + 16) != ERR_OK || !memEq(buf, buf1, 16)) return FALSE; // тест A.22 beltKWPStart(state, beltH() + 128, 32); memCopy(buf, beltH(), 32); memCopy(buf + 32, beltH() + 32, 16); beltKWPStepE(buf, 48, state); if (!hexEq(buf, "49A38EE108D6C742E52B774F00A6EF98" "B106CBD13EA4FB0680323051BC04DF76" "E487B055C69BCF541176169F1DC9F6C8")) return FALSE; beltKWPWrap(buf1, beltH(), 32, beltH() + 32, beltH() + 128, 32); if (!memEq(buf, buf1, 48)) return FALSE; // тест A.23 beltKWPStart(state, beltH() + 128 + 32, 32); memCopy(buf, beltH() + 64, 48); beltKWPStepD(buf, 48, state); if (!hexEq(buf, "92632EE0C21AD9E09A39343E5C07DAA4" "889B03F2E6847EB152EC99F7A4D9F154")) return FALSE; if (!hexEq(buf + 32, "B5EF68D8E4A39E567153DE13D72254EE")) return FALSE; if (beltKWPUnwrap(buf1, beltH() + 64, 48, (octet*)buf + 32, beltH() + 128 + 32, 32) != ERR_OK || !memEq(buf, buf1, 32)) return FALSE; // тест A.24 beltHashStart(state); beltHashStepH(beltH(), 13, state); beltHashStepG(hash, state); if (!hexEq(hash, "ABEF9725D4C5A83597A367D14494CC25" "42F20F659DDFECC961A3EC550CBA8C75")) return FALSE; beltHash(hash1, beltH(), 13); if (!memEq(hash, hash1, 32)) return FALSE; // тест A.25 beltHashStart(state); beltHashStepH(beltH(), 32, state); hexTo(hash, "749E4C3653AECE5E48DB4761227742EB" "6DBE13F4A80F7BEFF1A9CF8D10EE7786"); if (!beltHashStepV(hash, state) || !beltHashStepV2(hash, 13, state)) return FALSE; beltHash(hash1, beltH(), 32); if (!memEq(hash, hash1, 32)) return FALSE; // тест A.26 [+ инкрементальность] beltHashStart(state); beltHashStepH(beltH(), 11, state); beltHashStepG2(hash, 32, state); beltHashStepH(beltH() + 11, 48 - 11, state); hexTo(hash, "9D02EE446FB6A29FE5C982D4B13AF9D3" "E90861BC4CEF27CF306BFB0B174A154A"); if (!beltHashStepV2(hash, 32, state)) return FALSE; beltHash(hash1, beltH(), 48); if (!memEq(hash, hash1, 32)) return FALSE; // тест A.29 memSetZero(level, 12); level[0] = 1; beltKRPStart(state, beltH() + 128, 32, level); beltKRPStepG(buf, 16, beltH() + 32, state); if (!hexEq(buf, "6BBBC2336670D31AB83DAA90D52C0541")) return FALSE; beltKRP(buf1, 16, beltH() + 128, 32, level, beltH() + 32); if (!memEq(buf, buf1, 16)) return FALSE; // тест A.30 beltKRPStepG(buf, 24, beltH() + 32, state); if (!hexEq(buf, "9A2532A18CBAF145398D5A95FEEA6C82" "5B9C197156A00275")) return FALSE; beltKRP(buf1, 24, beltH() + 128, 32, level, beltH() + 32); if (!memEq(buf, buf1, 24)) return FALSE; // тест A.31 beltKRPStepG(buf, 32, beltH() + 32, state); if (!hexEq(buf, "76E166E6AB21256B6739397B672B8796" "14B81CF05955FC3AB09343A745C48F77")) return FALSE; beltKRP(buf1, 32, beltH() + 128, 32, level, beltH() + 32); if (!memEq(buf, buf1, 32)) return FALSE; // тест Б.1-1 beltHMACStart(state, beltH() + 128, 29); beltHMACStepA(beltH() + 128 + 64, 32, state); beltHMACStepG(hash, state); if (!hexEq(hash, "D4828E6312B08BB83C9FA6535A463554" "9E411FD11C0D8289359A1130E930676B")) return FALSE; beltHMAC(hash1, beltH() + 128 + 64, 32, beltH() + 128, 29); if (!memEq(hash, hash1, 32)) return FALSE; // тест Б.1-2 beltHMACStart(state, beltH() + 128, 32); beltHMACStepA(beltH() + 128 + 64, 32, state); hexTo(hash, "41FFE8645AEC0612E952D2CDF8DD508F" "3E4A1D9B53F6A1DB293B19FE76B1879F"); if (!beltHMACStepV(hash, state)) return FALSE; beltHMAC(hash1, beltH() + 128 + 64, 32, beltH() + 128, 32); if (!memEq(hash, hash1, 32)) return FALSE; // тест Б.1-3 [+ икрементальность] beltHMACStart(state, beltH() + 128, 42); beltHMACStepA(beltH() + 128 + 64, 17, state); beltHMACStepG(hash, state); beltHMACStepG2(hash, 17, state); beltHMACStepA(beltH() + 128 + 64 + 17, 32 - 17, state); hexTo(hash, "7D01B84D2315C332277B3653D7EC6470" "7EBA7CDFF7FF70077B1DECBD68F2A144"); if (!beltHMACStepV(hash, state) || !beltHMACStepV2(hash, 23, state)) return FALSE; beltHMAC(hash1, beltH() + 128 + 64, 32, beltH() + 128, 42); if (!memEq(hash, hash1, 32)) return FALSE; // все нормально return TRUE; }
// установить характеристику void stampSet(const char* name) { HANDLE hFile; DWORD size; HANDLE hMapping; octet* image; DWORD offset; void* hash_state; // открыть файл hFile = CreateFileA(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("File \"%s\" was not found or could not be open.\n", name); return; } // длина файла size = SetFilePointer(hFile, 0, NULL, FILE_END); if (size == INVALID_SET_FILE_POINTER) { CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // проецировать файл в память hMapping = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); if (hMapping == NULL) { CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // отобразить файл в память image = (octet*)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0); if (image == NULL) { CloseHandle(hMapping); CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // найти смещение контрольной характеристики offset = stampFindOffset(image, size); if (offset == (DWORD)-1) { UnmapViewOfFile(image); CloseHandle(hMapping); CloseHandle(hFile); printf("Control stamp of \"%s\" was not found or corrupted.\n", name); return; } // подготовить место для контрольной характеристики CASSERT(STAMP_SIZE >= 32); memSetZero(image + offset, STAMP_SIZE); // стек хэширования hash_state = blobCreate(beltHash_keep()); if (hash_state) { // хэшировать beltHashStart(hash_state); beltHashStepH(image, offset, hash_state); beltHashStepH(image + offset + STAMP_SIZE, size - offset - STAMP_SIZE, hash_state); beltHashStepG(image + offset, hash_state); blobClose(hash_state); // печать printf("Control stamp successfully added to \"%s\"\n", name); stampPrint(image + offset, "stamp"); } else printf("Insufficient memory.\n"); // очистка UnmapViewOfFile(image); CloseHandle(hMapping); CloseHandle(hFile); }
// проверить характеристику void stampCheck(const char* name) { HANDLE hFile; DWORD size; HANDLE hMapping; octet* image; DWORD offset; octet stamp[STAMP_SIZE]; void* hash_state; bool_t success; // открыть файл hFile = CreateFileA(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("File \"%s\" was not found or could not be open.\n", name); return; } // длина файла size = SetFilePointer(hFile, 0, NULL, FILE_END); if (size == INVALID_SET_FILE_POINTER) { CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // проецировать файл в память hMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (hMapping == NULL) { CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // отобразить файл в память image = (octet*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); if (image == NULL) { CloseHandle(hMapping); CloseHandle(hFile); printf("Error processing the file \"%s\".\n", name); return; } // найти смещение контрольной характеристики offset = stampFindOffset(image, size); if (offset == (DWORD)-1) { UnmapViewOfFile(image); CloseHandle(hMapping); CloseHandle(hFile); printf("Control stamp of \"%s\" was not found or corrupted.\n", name); return; } // подготовить место для контрольной характеристики CASSERT(STAMP_SIZE >= 32); memSet(stamp, 0, STAMP_SIZE); // состояние хэширования hash_state = blobCreate(beltHash_keep()); if (hash_state) { // хэшировать beltHashStart(hash_state); beltHashStepH(image, offset, hash_state); beltHashStepH(image + offset + STAMP_SIZE, size - offset - STAMP_SIZE, hash_state); beltHashStepG(stamp, hash_state); blobClose(hash_state); // сравнить success = memEq(image + offset, stamp, STAMP_SIZE); printf("Integrity of \"%s\"... %s\n", name, success ? "OK" : "Failed"); if (success) stampPrint(image + offset, "stamp"); else stampPrint(image + offset, "read_stamp"), stampPrint(stamp, "calc_stamp"); } else printf("Insufficient memory.\n"); // очистка UnmapViewOfFile(image); CloseHandle(hMapping); CloseHandle(hFile); }
bool_t beltBench() { const size_t reps = 5000; octet belt_state[512]; octet combo_state[256]; octet buf[1024]; octet theta[32]; octet iv[16]; octet hash[32]; size_t i; tm_ticks_t ticks; // псевдослучайная генерация объектов ASSERT(prngCOMBO_keep() <= sizeof(combo_state)); prngCOMBOStart(combo_state, utilNonce32()); prngCOMBOStepR(buf, sizeof(buf), combo_state); prngCOMBOStepR(theta, sizeof(theta), combo_state); prngCOMBOStepR(iv, sizeof(iv), combo_state); // cкорость belt-ecb ASSERT(beltECB_keep() <= sizeof(belt_state)); beltECBStart(belt_state, theta, 32); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltECBStepE(buf, 1024, belt_state), beltECBStepD(buf, 1024, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-ecb: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 2048 / reps), (unsigned)tmSpeed(2 * reps, ticks)); // cкорость belt-cbc ASSERT(beltCFB_keep() <= sizeof(belt_state)); beltCBCStart(belt_state, theta, 32, iv); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltCBCStepE(buf, 1024, belt_state), beltCBCStepD(buf, 1024, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-cbc: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 2048 / reps), (unsigned)tmSpeed(2 * reps, ticks)); // cкорость belt-cfb ASSERT(beltCFB_keep() <= sizeof(belt_state)); beltCFBStart(belt_state, theta, 32, iv); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltCFBStepE(buf, 1024, belt_state), beltCFBStepD(buf, 1024, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-cfb: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 2048 / reps), (unsigned)tmSpeed(2 * reps, ticks)); // cкорость belt-ctr ASSERT(beltCTR_keep() <= sizeof(belt_state)); beltCTRStart(belt_state, theta, 32, iv); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltCTRStepE(buf, 1024, belt_state), beltCTRStepD(buf, 1024, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-ctr: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 2048 / reps), (unsigned)tmSpeed(2 * reps, ticks)); // cкорость belt-mac ASSERT(beltMAC_keep() <= sizeof(belt_state)); beltMACStart(belt_state, theta, 32); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltMACStepA(buf, 1024, belt_state); beltMACStepG(hash, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-mac: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 1024 / reps), (unsigned)tmSpeed(reps, ticks)); // cкорость belt-dwp ASSERT(beltDWP_keep() <= sizeof(belt_state)); beltDWPStart(belt_state, theta, 32, iv); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltDWPStepE(buf, 1024, belt_state), beltDWPStepA(buf, 1024, belt_state); beltDWPStepG(hash, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-dwp: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 1024 / reps), (unsigned)tmSpeed(reps, ticks)); // cкорость belt-hash ASSERT(beltHash_keep() <= sizeof(belt_state)); beltHashStart(belt_state); for (i = 0, ticks = tmTicks(); i < reps; ++i) beltHashStepH(buf, 1024, belt_state); beltHashStepG(hash, belt_state); ticks = tmTicks() - ticks; printf("beltBench::belt-hash: %3u cycles / byte [%5u kBytes / sec]\n", (unsigned)(ticks / 1024 / reps), (unsigned)tmSpeed(reps, ticks)); // все нормально return TRUE; }