+ printf("CTX '%s': CTX '%s':\n", nameA.c_str(), nameB.c_str());
+ const auto* ptrA = reinterpret_cast<const uint8_t*>(&a);
+ const auto* ptrB = reinterpret_cast<const uint8_t*>(&b);
+ size_t row = 0;
+ while (row * 16 < sizeof(a))
+ {
+ for (size_t j = 0; j < 8; ++j)
+ if (row * 16 + j < sizeof(a))
+ {
+ if (ptrA[row * 16 + j] == ptrB[row * 16 + j])
+ printf(" %02x", static_cast<unsigned>(ptrA[row * 16 + j]));
+ else
+ printf(" \033[31m%02x\033[0m", static_cast<unsigned>(ptrA[row * 16 + j]));
+ }
+ else
+ printf(" ");
+ printf(" ");
+ for (size_t j = 0; j < 8; ++j)
+ if (row * 16 + j + 8 < sizeof(a))
+ {
+ if (ptrA[row * 16 + j + 8] == ptrB[row * 16 + j + 8])
+ printf(" %02x", static_cast<unsigned>(ptrA[row * 16 + j + 8]));
+ else
+ printf(" \033[31m%02x\033[0m", static_cast<unsigned>(ptrA[row * 16 + j + 8]));
+ }
+ else
+ printf(" ");
+ printf(" | ");
+ for (size_t j = 0; j < 8; ++j)
+ if (row * 16 + j < sizeof(b))
+ {
+ if (ptrA[row * 16 + j] == ptrB[row * 16 + j])
+ printf(" %02x", static_cast<unsigned>(ptrB[row * 16 + j]));
+ else
+ printf(" \033[31m%02x\033[0m", static_cast<unsigned>(ptrB[row * 16 + j]));
+ }
+ else
+ printf(" ");
+ printf(" ");
+ for (size_t j = 0; j < 8; ++j)
+ if (row * 16 + j + 8 < sizeof(b))
+ {
+ if (ptrA[row * 16 + j + 8] == ptrB[row * 16 + j + 8])
+ printf(" %02x", static_cast<unsigned>(ptrB[row * 16 + j + 8]));
+ else
+ printf(" \033[31m%02x\033[0m", static_cast<unsigned>(ptrB[row * 16 + j + 8]));
+ }
+ else
+ printf(" ");
+ printf("\n");
+ ++row;
+ }
+ printf("\n\n");
+}
+
+bool equalCtx(const BLOWFISH_CTX& a, const BLOWFISH_CTX& b)
+{
+ for (size_t i = 0; i < 18; ++i)
+ if (a.P[i] != b.P[i])
+ {
+ printf("Failed for P at %ld: 0x%x != 0x%x\n", i, a.P[i], b.P[i]);
+ dumpCheckCtx("a", "b", a, b);