public function compute(string $X): string
    {
        $len = strlen($X);
        if (0 != $len % 16) {
            throw new \UnexpectedValueException(
                "Input string must be a multiple of 128 bits.");
        }
        $Y = GCM::ZB_128;
        // number of 128-bit blocks
        $m = $len >> 4;
        for ($i = 0; $i < $m; ++$i) {
            $xi = substr($X, $i << 4, 16);
            $Y = $this->_mult($Y ^ $xi, $this->_subkey);
        }
        return $Y;
    }