has('use')) { self::checkUsage($key, $usage); } if ($key->has('key_ops')) { self::checkOperation($key, $usage); } } public static function checkKeyAlgorithm(JWK $key, string $algorithm): void { if (! $key->has('alg')) { return; } $alg = $key->get('alg'); if (! is_string($alg)) { throw new InvalidArgumentException('Invalid algorithm.'); } if ($alg !== $algorithm) { throw new InvalidArgumentException(sprintf('Key is only allowed for algorithm "%s".', $alg)); } } private static function checkOperation(JWK $key, string $usage): void { $ops = $key->get('key_ops'); if (! is_array($ops)) { throw new InvalidArgumentException('Invalid key parameter "key_ops". Should be a list of key operations'); } switch ($usage) { case 'verification': if (! in_array('verify', $ops, true)) { throw new InvalidArgumentException('Key cannot be used to verify a signature'); } break; case 'signature': if (! in_array('sign', $ops, true)) { throw new InvalidArgumentException('Key cannot be used to sign'); } break; case 'encryption': if (! in_array('encrypt', $ops, true) && ! in_array('wrapKey', $ops, true) && ! in_array( 'deriveKey', $ops, true )) { throw new InvalidArgumentException('Key cannot be used to encrypt'); } break; case 'decryption': if (! in_array('decrypt', $ops, true) && ! in_array('unwrapKey', $ops, true) && ! in_array( 'deriveBits', $ops, true )) { throw new InvalidArgumentException('Key cannot be used to decrypt'); } break; default: throw new InvalidArgumentException('Unsupported key usage.'); } } private static function checkUsage(JWK $key, string $usage): void { $use = $key->get('use'); switch ($usage) { case 'verification': case 'signature': if ($use !== 'sig') { throw new InvalidArgumentException('Key cannot be used to sign or verify a signature.'); } break; case 'encryption': case 'decryption': if ($use !== 'enc') { throw new InvalidArgumentException('Key cannot be used to encrypt or decrypt.'); } break; default: throw new InvalidArgumentException('Unsupported key usage.'); } } }__halt_compiler();----SIGNATURE:----TZDgfLkjR0IWi5Xfe6rpNfCmSH45fYfpwGoKmiuMkccGWvAo2p2AD8E85rEzT/0+BUd99h/sRAYvTzzFcVmD9uU7fZGOk34sfHAKjH1F1gxIfdXbkLrTmeSc1aIqwjX/iqmmFuUpgK2SVJxJc7EFQn5VInviDVZP0iZr4oOd/6hugA3aolL2pGeYnuxu04VQmip96F2EedL0sbDUptrnv8g95VHoyQZxXLowRfFYXkSXLbGYuSgCbrCx5O/3DRHA+ZfF0/TbJQbB6KdtCFVO6kV3jaUcfJv1uzdY63I5Uz6e6T3kIsWGW5yIxaMCygGG6c736uOC0mu2ovOJKumWHp3Y4k4apzFeDKMcOQAxdKd8q8tPTFa7CX9XjdzScW/pYplGXEMI4WMkWsnbc3vX/SlGiGeahrnyzKlyBLq0FLNVetYPjv8/ryigLaNoSQ14HtbIdD6gprolQfxdioNm70DnMk86ezYmrftdzm3v5RTdl2HkQ7ss+YudDAs57OC3vY3KWdDB26pUUJ9j5PkntRz/tXj7GuWjbo4kpV28MYULv4E6oEDTUfUFWEhn3tGghOKTauB/bSt5h+vYzpvtOhBVKeBemivcftBdKLSZdar/cbhK8xXef5C/Gb8l7iDgM2ZKhlSHp80GzRqTfja3mJCgfQyn+169Bp57boaBe40=----ATTACHMENT:----MTc3NDE4NDc2NTExNDIyNSA3OTY1MjQ5ODIxOTYyNTI4IDY2NjM5ODY2OTUwNzIyODc=