mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-21 04:54:41 +00:00
ProcessLoginTask: properly cater for key parsing errors
This commit is contained in:
parent
bbc249ff0d
commit
161ac468f3
@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace pocketmine\network\mcpe\auth;
|
namespace pocketmine\network\mcpe\auth;
|
||||||
|
|
||||||
|
use FG\ASN1\Exception\ParserException;
|
||||||
use Mdanter\Ecc\Crypto\Key\PublicKeyInterface;
|
use Mdanter\Ecc\Crypto\Key\PublicKeyInterface;
|
||||||
use Mdanter\Ecc\Crypto\Signature\Signature;
|
use Mdanter\Ecc\Crypto\Signature\Signature;
|
||||||
use Mdanter\Ecc\Serializer\PublicKey\DerPublicKeySerializer;
|
use Mdanter\Ecc\Serializer\PublicKey\DerPublicKeySerializer;
|
||||||
@ -34,6 +35,7 @@ use pocketmine\scheduler\AsyncTask;
|
|||||||
use pocketmine\utils\AssumptionFailedError;
|
use pocketmine\utils\AssumptionFailedError;
|
||||||
use function base64_decode;
|
use function base64_decode;
|
||||||
use function bin2hex;
|
use function bin2hex;
|
||||||
|
use function count;
|
||||||
use function explode;
|
use function explode;
|
||||||
use function gmp_init;
|
use function gmp_init;
|
||||||
use function openssl_verify;
|
use function openssl_verify;
|
||||||
@ -136,13 +138,23 @@ class ProcessLoginTask extends AsyncTask{
|
|||||||
[$rString, $sString] = str_split($plainSignature, 48);
|
[$rString, $sString] = str_split($plainSignature, 48);
|
||||||
$sig = new Signature(gmp_init(bin2hex($rString), 16), gmp_init(bin2hex($sString), 16));
|
$sig = new Signature(gmp_init(bin2hex($rString), 16), gmp_init(bin2hex($sString), 16));
|
||||||
|
|
||||||
|
$derPublicKeySerializer = new DerPublicKeySerializer();
|
||||||
|
$rawPublicKey = base64_decode($currentPublicKey, true);
|
||||||
|
if($rawPublicKey === false){
|
||||||
|
throw new VerifyLoginException("Failed to decode base64'd public key");
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
$signingKey = $derPublicKeySerializer->parse($rawPublicKey);
|
||||||
|
}catch(\RuntimeException | ParserException $e){
|
||||||
|
throw new VerifyLoginException("Failed to parse DER public key: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
|
|
||||||
$rawParts = explode('.', $jwt);
|
$rawParts = explode('.', $jwt);
|
||||||
if(count($rawParts) !== 3) throw new AssumptionFailedError("Parts count should be 3 as verified by JwtUtils::parse()");
|
if(count($rawParts) !== 3) throw new AssumptionFailedError("Parts count should be 3 as verified by JwtUtils::parse()");
|
||||||
$derSerializer = new DerPublicKeySerializer();
|
|
||||||
$v = openssl_verify(
|
$v = openssl_verify(
|
||||||
$rawParts[0] . '.' . $rawParts[1],
|
$rawParts[0] . '.' . $rawParts[1],
|
||||||
(new DerSignatureSerializer())->serialize($sig),
|
(new DerSignatureSerializer())->serialize($sig),
|
||||||
(new PemPublicKeySerializer($derSerializer))->serialize($derSerializer->parse(base64_decode($currentPublicKey, true))),
|
(new PemPublicKeySerializer($derPublicKeySerializer))->serialize($signingKey),
|
||||||
OPENSSL_ALGO_SHA384
|
OPENSSL_ALGO_SHA384
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user