* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Minishlink\WebPush; use Jose\Component\Core\Util\Ecc\PublicKey; class Utils { /** * @param string $value * * @return int */ public static function safeStrlen(string $value): int { return mb_strlen($value, '8bit'); } /** * @param PublicKey $publicKey * * @return string */ public static function serializePublicKey(PublicKey $publicKey): string { $hexString = '04'; $hexString .= str_pad(gmp_strval($publicKey->getPoint()->getX(), 16), 64, '0', STR_PAD_LEFT); $hexString .= str_pad(gmp_strval($publicKey->getPoint()->getY(), 16), 64, '0', STR_PAD_LEFT); return $hexString; } /** * @param string $data * * @return array */ public static function unserializePublicKey(string $data): array { $data = bin2hex($data); if (mb_substr($data, 0, 2, '8bit') !== '04') { throw new \InvalidArgumentException('Invalid data: only uncompressed keys are supported.'); } $data = mb_substr($data, 2, null, '8bit'); $dataLength = self::safeStrlen($data); return [ hex2bin(mb_substr($data, 0, $dataLength / 2, '8bit')), hex2bin(mb_substr($data, $dataLength / 2, null, '8bit')), ]; } }