milliseconds, sorted */ private function measure(int $rSize, int $rRounds): array { $rKeyEnc = random_bytes(32); $rKeyMac = random_bytes(32); $rCtx = str_repeat('c', 200); $rRequest = Box::box($rKeyEnc, $rCtx, random_bytes($rSize)); $rMac = Canonical::mac($rKeyMac, $rCtx, $rRequest); $rTimes = []; for ($i = 0; $i < $rRounds; $i++) { $rStart = hrtime(true); $this->assertTrue(Canonical::verifyMac($rKeyMac, $rCtx, $rRequest, $rMac)); $rPlain = Box::open($rKeyEnc, $rCtx, $rRequest); $rReply = Box::box($rKeyEnc, $rCtx, (string) $rPlain); Canonical::mac($rKeyMac, $rCtx, $rReply); $rTimes[] = (hrtime(true) - $rStart) / 1e6; } sort($rTimes); return $rTimes; } public function testSixtyFourKilobytesUnderOneMillisecondP99(): void { $rTimes = $this->measure(65536, 300); $this->assertLessThan(1.0, $rTimes[(int) (count($rTimes) * 0.99) - 1]); } public function testEightMegabytesRegressionGuard(): void { $rTimes = $this->measure(8388608, 5); $this->assertLessThan(80.0, $rTimes[2], 'median; plan target 40 ms on production hardware'); } }