private static unsafe void DoKeccakForAllBlocks(byte *msg, long len, Keccak_abstract state, int blockLen, long skippedBlock) { byte *cur = msg; long i; long SB = 0; for (i = 0; i <= len - blockLen; SB++) { var cr = cur; var fl = false; for (int j = 0; j < blockLen; j++) { // Специально для тестирования пропускаем блоки, где нет данных if (cr[j] != 0 && cr[j] != 255) { fl = true; break; } } if (fl && SB != skippedBlock) { cryptoprime.keccak.Keccackf((ulong *)cur, state.Clong, state.Blong); } cur += blockLen; i += blockLen; if (i > len - blockLen && i != len && SB != skippedBlock) { var size = blockLen - len % blockLen; i -= size; cur -= size; } } }
private static unsafe void DoKeccakForAllBlocks(byte *msg, long len, Keccak_abstract state, int blockLen) { byte *cur = msg; long i; long SB = 0; for (i = 0; i <= len - blockLen; SB++) { cryptoprime.keccak.Keccackf((ulong *)cur, state.Clong, state.Blong); cur += blockLen; i += blockLen; if (i > len - blockLen && i != len) { var size = blockLen - len % blockLen; i -= size; cur -= size; } } }
private static unsafe void DoThreefishForAllBlocks(byte *msg, long len, ulong *tweak, Keccak_abstract state, int blockLen, ushort *table, int tableLen) { byte *cur = msg; for (int i = 0; i <= len - blockLen; i += blockLen) { var cr = cur; var fl = false; for (int j = 0; j < blockLen; j++) { // Специально для тестирования пропускаем блоки, где нет данных if (cr[j] != 0 && cr[j] != 255) { fl = true; break; } } if (fl) { var text = cur + 128; if (i == len - blockLen) { text = msg; } CodeGenerated.Cryptoprimes.Threefish_Static_Generated.Threefish1024_step((ulong *)cur, (ulong *)tweak, (ulong *)text); } cur += blockLen; } }